copilot-api-node20 0.46.0 → 0.47.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/main.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{defineCommand as e,runMain as t}from"citty";import r,{LogLevels as o,consola as n}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{AsyncLocalStorage as l}from"node:async_hooks";import{ROOT_CONTEXT as c,SpanKind as u,SpanStatusCode as p,context as d,metrics as m,trace as f}from"@opentelemetry/api";import h from"clipboardy";import{execFile as g,execSync as y}from"node:child_process";import _ from"node:process";import{SeverityNumber as w,logs as b}from"@opentelemetry/api-logs";import{OTLPLogExporter as v}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as x}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as T}from"@opentelemetry/resources";import{BatchLogRecordProcessor as A}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as S}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as E,ATTR_SERVICE_NAME as O,ATTR_SERVICE_VERSION as C}from"@opentelemetry/semantic-conventions";import{Client as I,request as R}from"undici";import{Buffer as P}from"node:buffer";import{createHash as q,randomBytes as M,randomUUID as N}from"node:crypto";import{promisify as j,stripVTControlCharacters as D}from"node:util";import{Context as L,Hono as B}from"hono";import{cors as F}from"hono/cors";import{getHeapStatistics as U}from"node:v8";import H,{accessSync as z,readFileSync as J}from"node:fs";import{streamSSE as G}from"hono/streaming";import{events as K}from"fetch-event-stream";import{Readable as W}from"node:stream";import{Tokenizer as Y,models as V}from"ai-tokenizer";import*as X from"ai-tokenizer/encoding/claude";import{serve as Z}from"srvx";import{isIP as Q}from"node:net";import{generate as ee}from"selfsigned";const te=s.join(i.homedir(),".local","share","copilot-api"),re={APP_DIR:te,GITHUB_TOKEN_PATH:s.join(te,"github_token"),MACHINE_ID_PATH:s.join(te,"machine_id"),SESSION_ID_PATH:s.join(te,"session_id")};async function oe(){await a.mkdir(re.APP_DIR,{recursive:!0}),await ne(re.GITHUB_TOKEN_PATH),await ne(re.SESSION_ID_PATH)}async function ne(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const ae=new l;function ie(e,t){return ae.run(e,t)}const se=()=>!0===ae.getStore()?.rerun,le=()=>!0===ae.getStore()?.inStream,ce=new l;let ue;const pe=()=>void 0!==ce.getStore(),de=()=>ce.getStore();function me(){let e=ce.getStore();e&&(e.start??=performance.now(),ue?.(e))}const fe=6e5,he={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:fe,webSearchProviders:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}};async function ge(e,t,r=process.versions){if(!r.bun||"string"==typeof e||e instanceof Uint8Array)return e;if(t?.aborted)throw e.destroy(),t.reason;let o=()=>e.destroy(t?.reason);t?.addEventListener("abort",o,{once:!0});try{let t=[];for await(let r of e)t.push(r);return P.concat(t)}catch(e){throw t?.aborted?t.reason:e}finally{t?.removeEventListener("abort",o)}}function ye(e){let[t="",r=""]=e.trim().split(/\s+/,2),o=r&&"undefined"!==r&&"null"!==r?/^(?:ghu|gho|ghp|ghs|ghr|github_pat)_/.exec(r)?.[0]??"opaque":"missing";return`${t.toLowerCase()} ${o}`}!function(e){let t=e.provider,r=e.models;Object.defineProperties(e,{provider:{get:()=>ae.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=ae.getStore();return e?e.models:r},set:e=>{r=e},enumerable:!0,configurable:!0}})}(he);const _e=" │ ",we=e=>{if(e>=1e6){let t=e/1e6;return Number.isInteger(t)?`${t}M`:`${t.toFixed(1)}M`}return e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString()},be=(e,t)=>e.padEnd(t),ve=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ke=(e,t,r)=>` --\x3e ${be(e,4)} ${be(t,21)} ${be(r,3)}`,xe=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return be(t,22)})(e.model??"—")+be(t,8)},Te=e=>{let t=e?.inputTokens??0,r=e?.cachedTokens??0,o=e?we(Math.max(t-r,0)):"—",n=e?we(e.outputTokens??0):"—",a=r?we(r):"—";return`↑${o.padStart(5)} ⚡${a.padStart(5)} ↓${n.padStart(5)}`},Ae=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${be("—",10)}`;let r=Math.round(e.inputTokens/t*100),o=we(e.inputTokens).padStart(5),n=`${r}%`;return`ctx ${o}${n.padStart(Math.max(10-o.length,n.length+1))}`},Se=e=>{if(void 0===e.ttfbMs)return`e2e ${ve(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${ve(e.ttfbMs)} → e2e ${ve(e.e2eMs)} ${t}`},$e=e=>e?he.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,Ee=e=>({...e?.inputTokens&&{"copilot_api.input_tokens":e.inputTokens},...e?.inputTokens&&{"copilot_api.fresh_input_tokens":Math.max(e.inputTokens-(e.cachedTokens??0),0)},...e?.outputTokens&&{"copilot_api.output_tokens":e.outputTokens},...e?.cachedTokens&&{"copilot_api.cached_tokens":e.cachedTokens}}),Oe={completionCallbacks:new Map,registerCompletion(e,t,r){this.completionCallbacks.set(e,{context:t,startTime:r,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(e){let{context:t,startTime:o}=e,n=Math.round(performance.now()-o),a=t.get("requestData"),i=a?.upstreamTotalMs??a?._d1,s=(e=>[ke(e.method,e.path,e.status),xe(e),Te(e.tokenUsage),Ae(e.tokenUsage,e.maxContextTokens),Se({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(_e))({method:t.req.method,path:t.req.path,status:t.res.status.toString(),model:a?.model,reasoningEffort:a?.reasoningEffort,effortClamped:a?.effortClamped,tokenUsage:a?.tokenUsage,maxContextTokens:$e(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:n});r.info(s),ft(w.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:r,duration:o,upstreamTotal:n}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":o,...r?.model&&{"copilot_api.model":r.model},...r?.reasoningEffort&&{"copilot_api.reasoning_effort":r.reasoningEffort},...r?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==r?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(r.upstreamTtfbMs)},...void 0!==n&&{"copilot_api.upstream_total_ms":Math.round(n),"copilot_api.copilot_duration_ms":Math.round(n)},...Ee(r?.tokenUsage)}})({c:t,requestData:a,duration:n,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:o,startTime:n}=e,a=Math.round(performance.now()-n),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=o.get("requestData");r.error((e=>[ke(e.method,e.path,"429"),xe(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${ve(e.e2eMs)}`].join(_e))({method:o.req.method,path:o.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},logError(e,t,o){let{context:n,startTime:a}=e,i=Math.round(performance.now()-a),s=n.get("requestData");r.error((e=>{let t=ke(e.method,e.path,e.status.toString()),r=xe(e),o=e.message.replaceAll(/\s+/g," ").trim();return[t,r,(o.length>37?`${o.slice(0,36)}…`:o).padEnd(37),`e2e ${ve(e.e2eMs)}`].join(_e)})({method:n.req.method,path:n.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:o,e2eMs:i}))},cleanup(){let e=performance.now()-12e5;for(let[t,r]of this.completionCallbacks)r.startTime<e&&this.completionCallbacks.delete(t);if(this.completionCallbacks.size>1e3){let e=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),t=e.slice(0,e.length-1e3);for(let[e]of t)this.completionCallbacks.delete(e)}}};setInterval(()=>Oe.cleanup(),6e4);let Ce,Ie,Re=Date.now();const Pe={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function qe(){let e=process.env.OTEL_EXPORTER_OTLP_ENDPOINT??"https://api.honeycomb.io",t=process.env.OTEL_EXPORTER_OTLP_HEADERS?function(e){return e?Object.fromEntries(e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf("=");return-1===t?[e,""]:[decodeURIComponent(e.slice(0,t)),decodeURIComponent(e.slice(t+1))]})):{}}(process.env.OTEL_EXPORTER_OTLP_HEADERS):Pe;return{endpoint:e.replace(/\/$/,""),headers:t}}async function Me(){if(!Ce)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([Ce.shutdown(),t])&&r.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){r.warn("OTel SDK shutdown failed; continuing exit",e)}}const Ne=f.getTracer("copilot-api"),je=m.getMeter("copilot-api"),De=b.getLogger("copilot-api"),Le=je.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),Be=je.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),Fe=je.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Ue=je.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),He=je.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),ze=je.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Je=je.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ge=je.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Ke=je.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),We=je.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ye=je.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Ve=je.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Xe=je.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Ze=je.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Qe=je.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),et=je.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),tt=je.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),rt=je.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),ot=je.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),nt=je.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),at=je.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),it=je.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),st=je.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),lt=je.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),ct=je.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),ut=je.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),pt=je.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),dt=je.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),mt=je.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function ft(e,t,r,o,n){let a=f.getActiveSpan()?.spanContext()??n;De.emit({severityNumber:e,severityText:t,body:r,attributes:{...o,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function ht(e,t,r){let o=t instanceof Error?t:Error(String(t));e.setStatus({code:p.ERROR,message:r??o.message}),e.recordException(o)}function gt(e,t,r){ht(e,r),t&&t!==e&&ht(t,r)}function yt(e,t=""){let r={};if(null==e)return r;if("object"!=typeof e)return("string"==typeof e||"number"==typeof e||"boolean"==typeof e)&&t&&(r[t]=e),r;if(Array.isArray(e))return t&&(r[t]=JSON.stringify(e)),r;for(let[o,n]of Object.entries(e)){let e=t?`${t}.${o}`:o;void 0!==n&&"function"!=typeof n&&(null===n?r[e]="null":"object"!=typeof n||Array.isArray(n)?Array.isArray(n)?r[e]=JSON.stringify(n):("string"==typeof n||"number"==typeof n||"boolean"==typeof n)&&(r[e]=n):Object.assign(r,yt(n,e)))}return r}je.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!kt.getConnectivityStats().isOnline)}),je.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(kt.getConnectivityStats().consecutiveFailures)}),je.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(he.models?.data.length??0)}),je.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(Oe.completionCallbacks.size)}),je.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-Re)/1e3)});const _t=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function wt(e,t,r){for(let[o,n]of Object.entries(r)){let r=o.toLowerCase();"authorization"===r&&e.setAttribute(`http.${t}.header.authorization.shape`,ye(n)),_t.has(r)||e.setAttribute(`http.${t}.header.${r}`,n)}}async function bt(e){let{spanName:t,url:r,target:o,method:n="GET",headers:a,body:i,signal:s,extraAttributes:l}=e,c=Ne.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":n,"url.full":r,"copilot_api.target":o,...l}});a&&wt(c,"request",a);try{let e=await fetch(r,{method:n,headers:a,body:i,signal:s});return c.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,r)=>{let o=r.toLowerCase();_t.has(o)||e.setAttribute(`http.response.header.${o}`,t)})}(c,e),Xe.add(1,{target:o,status_code:String(e.status)}),e.ok||c.setStatus({code:p.ERROR,message:`HTTP ${e.status}`}),{response:e,span:c}}catch(e){throw ht(c,e),c.end(),e}}async function vt(e){let{spanName:t,url:r,target:o,method:n="POST",headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,extraAttributes:d,dispatcher:m}=e,f=Ne.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":n,"url.full":r,"copilot_api.target":o,"copilot_api.h2.enabled":void 0!==m,...d}});wt(f,"request",a);try{let{statusCode:e,headers:t,body:u}=await R(r,{method:n,headers:a,body:await ge(i,s),signal:s,headersTimeout:l,bodyTimeout:c,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,r]of Object.entries(t)){let t=e.toLowerCase();void 0!==r&&!_t.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(r)?r.join(", "):r)}return Xe.add(1,{target:o,status_code:String(e)}),e>=400&&f.setStatus({code:p.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:u,span:f}}catch(e){throw ht(f,e),f.end(),e}}const kt=new class extends EventTarget{isOnline=!0;lastChecked=(new Date).toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){r.debug("Starting connectivity monitor",{probeEndpoints:he.connectivity.probeEndpoints,fastInterval:he.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){r.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?he.connectivity.slowProbeInterval:he.connectivity.fastProbeInterval)+Math.random()*he.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{r.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=Ne.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),he.connectivity.timeoutMs);try{let o=!1;for(let e of he.connectivity.probeEndpoints)try{let t=performance.now(),r=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...he.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),n=performance.now()-t;if(r.ok){o=!0,this.lastSuccessfulEndpoint=e,ct.record(n,{endpoint:e,result:"success"});break}ct.record(n,{endpoint:e,result:"failed"})}catch(t){this.endpointFailureStats[e]=(this.endpointFailureStats[e]||0)+1,r.debug(`Probe failed for ${e}:`,t)}this.updateConnectivityState(o);let n=o?"online":"offline";e.setAttribute("copilot_api.connectivity.result",n),e.setAttribute("copilot_api.connectivity.consecutive_failures",this.consecutiveFailures),this.lastSuccessfulEndpoint&&e.setAttribute("copilot_api.connectivity.successful_endpoint",this.lastSuccessfulEndpoint),Ye.add(1,{result:o?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&r.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),Ve.add(1,{from:"offline",to:"online"}),ft(w.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(r.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),Ve.add(1,{from:"online",to:"offline"}),ft(w.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,r.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?he.connectivity.slowProbeInterval:he.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*he.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:he.connectivity.jitterMaxMs>0,connectionPooling:he.connectivity.connectionPooling,dnsCache:he.connectivity.dnsCache}}},xt=()=>({"content-type":"application/json",accept:"application/json"}),Tt="0.48.1",At=`copilot-chat/${Tt}`,St=`GitHubCopilotChat/${Tt}`,$t=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${re.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let r=(e=>{let t=q("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(M(16)),t.digest("hex")})(e);return await a.writeFile(t,r),await a.chmod(t,384),r},Et=async(e,t)=>{e.machineId||=await $t(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(re.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=N();return await a.writeFile(re.SESSION_ID_PATH,e),await a.chmod(re.SESSION_ID_PATH,384),e})()},Ot=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,Ct=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let r=N(),o={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":At,"User-Agent":St,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":r,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":N(),"X-Request-Id":r};return t&&(o["copilot-vision-request"]="true"),o},It=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const Rt=(e,t,r)=>{let o=Ct(e);delete o["Copilot-Integration-Id"],o["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let n=new Set,a=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&It.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta):void 0;if(a)for(let e of a.split(","))n.add(e);if(r)for(let e of r)n.add(e);return n.size>0&&(o["anthropic-beta"]=[...n].join(",")),o},Pt="https://api.github.com",qt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":At,"user-agent":St,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),Mt="https://github.com",Nt="01ab8ac9400c4e429b23",jt=new WeakMap;function Dt(e){let t=e.req.raw,r=jt.get(t);if(!r){let e=new AbortController;t.signal.aborted?e.abort(t.signal.reason):t.signal.addEventListener("abort",()=>e.abort(t.signal.reason),{once:!0}),jt.set(t,e),r=e}return r}const Lt=e=>Dt(e).signal;function Bt(e){Dt(e).abort()}function Ft(e){return!!Dt(e).signal.aborted&&(e.get("requestSpan")?.setAttribute("copilot_api.client_aborted",!0),!0)}function Ut(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/images/")?"images":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const Ht=32768,zt=[{regex:/Bearer\s+[\w.-]{20,}/g,mask:"Bearer ***"},{regex:/\bghu_[A-Za-z0-9]{20,}/g,mask:"ghu_***"},{regex:/\bghp_[A-Za-z0-9]{20,}/g,mask:"ghp_***"},{regex:/\bgho_[A-Za-z0-9]{20,}/g,mask:"gho_***"},{regex:/\bghs_[A-Za-z0-9]{20,}/g,mask:"ghs_***"},{regex:/\bghr_[A-Za-z0-9]{20,}/g,mask:"ghr_***"},{regex:/\bsk-[A-Za-z0-9-]{20,}/g,mask:"sk-***"},{regex:/\bhcaik_[A-Za-z0-9]{20,}/g,mask:"hcaik_***"},{regex:/\bapi-key[\x22\x27]?\s*[:=]\s*[\x22\x27]?[\w-]{20,}/gi,mask:"api-key: ***"}],Jt=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Gt(e){let t=e;for(let{regex:e,mask:r}of zt)t=t.replace(e,r);return t}const Kt=/[\w.%+#!$&*=?^~\x27-]+@[\w-]+(?:\.[\w-]+)+/g;function Wt(e){return Gt(e).replaceAll(Kt,"<redacted-email>")}const Yt=new Map;function Vt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),r=e.upstreamErrorType??"unknown",o=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${r}:${o}:${t}`}function Xt(e,t,r){let o=Gt(r),n=8*Ht,a=o.length>n,i=a?o.slice(0,n):o,s=q("sha256").update(o).digest("hex");if(i.length<=Ht)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let r=0;r<i.length;r+=Ht)e.setAttribute(`${t}.part_${r/Ht}`,i.slice(r,r+Ht));e.setAttribute(`${t}.parts`,Math.ceil(i.length/Ht))}e.setAttribute(`${t}.bytes`,o.length),e.setAttribute(`${t}.sha256`,s),a&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,o.length-i.length))}function Zt(e,t){let r=function(e){if(Yt.size>=1e3&&!Yt.has(e)){let e=Yt.keys().next().value;void 0!==e&&Yt.delete(e)}let t,r=(Yt.get(e)??0)+1;return Yt.set(e,r),t=r<=2?"full":3===r?"suppressed":"drop",rt.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",r),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===r)return{decision:r};if("suppressed"===r)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:r};let o=t.c.get("rawBody");o&&Xt(e,"copilot_api.incoming_request_body",o);let n=Qt(t.c.req.header());return n&&Xt(e,"copilot_api.incoming_headers",n),void 0!==t.outgoingBody&&Xt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Xt(e,"copilot_api.outgoing_headers",Qt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Xt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:r}}function Qt(e){let t={};for(let[r,o]of Object.entries(e))Jt.has(r.toLowerCase())||(t[r]=o);return JSON.stringify(t)}async function er(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await a.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function tr(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:i.platform(),arch:i.arch()}}async function rr(){try{return!!(await a.stat(re.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(re.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function or(e){let t=await async function(){let[e,t]=await Promise.all([er(),rr()]);return{version:e,runtime:tr(),paths:{APP_DIR:re.APP_DIR,GITHUB_TOKEN_PATH:re.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){r.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const nr=e({meta:{name:"debug",description:"Print debug information about the application"},args:{json:{type:"boolean",default:!1,description:"Output debug information as JSON"}},run:({args:e})=>or({json:e.json})}),ar=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",ir=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",sr=new Set;let lr;function cr(e){if(he.errorReporting&&!(e.statusCode<500)&&!sr.has(e.signature)){if(sr.size>=1e3){let e=sr.values().next().value;void 0!==e&&sr.delete(e)}sr.add(e.signature),async function(e){lr??=er();let t=await lr,r=tr(),o=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(Wt(e.upstreamErrorMessage)).slice(0,600),n={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:o,endpointType:Ut(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${r.platform}/${r.arch}`,runtime:`${r.name}/${r.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(ar,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":ir},body:JSON.stringify(n),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{r.debug("Error report submission failed:",e)})}}function ur(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const pr=new WeakSet;async function dr(e,{attempt:t,maxRetries:o,operation:n}){return!pe()&&(ur(e)&&t<o?(r.warn(`HTTP/2 connection error during ${n}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&pr.add(e)}(e),!1))}var mr=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,r){super(e),this.response=t,this.outgoingBody=r?.outgoingBody,this.outgoingHeaders=r?.outgoingHeaders}},fr=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function hr(e,t){return setTimeout(()=>e.abort(new fr(t)),t)}function gr(e){return e instanceof fr||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof fr}const yr=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),_r=RegExp(`\\b(?:${[...yr].join("|")})\\b`);function wr(e){let{cause:t,errors:r}=e;return t instanceof Error?t:Array.isArray(r)&&r[0]instanceof Error?r[0]:void 0}function br(e){let t=e,r=new Set([t]);for(let e=0;e<4;e++){let e=wr(t);if(!e||r.has(e))break;r.add(e),t=e}return t}function vr(e){let t=e.code;return"string"==typeof t?t:void 0}function kr(e){if(void 0===e.cause)return"";let t=br(e);if(t===e)return"";let r=vr(t);return` (cause: ${r?`${r}: `:""}${t.message})`}function xr(e){if(!(e instanceof Error))return!1;let{codes:t,messages:r}=function(e){let t=[],r=[],o=new Set,n=(e,a)=>{if(a>4||!(e instanceof Error)||o.has(e))return;o.add(e);let{code:i,errors:s,cause:l}=e;if("string"==typeof i&&t.push(i),r.push(e.message),Array.isArray(s))for(let e of s)n(e,a+1);n(l,a+1)};return n(e,0),{codes:t,messages:r}}(e);return!!t.some(e=>yr.has(e))||!(t.length>0)&&(!!r.some(e=>_r.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Tr(e){return e.req.path.startsWith("/v1/messages")}function Ar(e,t){if(Tr(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}const Sr=/maximum context length|exceeds the context window/i;function $r(e){let t=e.error,r={};return t&&"object"==typeof t&&("string"==typeof t.type?r.type=t.type:"string"==typeof t.code&&(r.type=t.code),"string"==typeof t.message&&(r.message=t.message)),!r.message&&"string"==typeof e.message&&(r.message=e.message),r}function Er(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",Wt(t.message)))}function Or(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=Wt(e.message)),t}function Cr(e){let{c:t,error:r,errorText:o,upstream:n}=e,a=f.getActiveSpan();if(!a)return;let i=Vt({endpointType:Ut(t.req.path),statusCode:r.response.status,upstreamErrorType:n.type,model:t.get("requestData")?.model});Zt(a,{c:t,outgoingBody:r.outgoingBody,outgoingHeaders:r.outgoingHeaders,upstreamResponseBody:o,signatureKey:i})}function Ir(e,t,r){let o=e.get("requestId"),n=Oe.completionCallbacks.get(o);n&&(Oe.logError(n,t,r),Oe.completionCallbacks.delete(o))}async function Rr(e,t){let r=f.getActiveSpan(),o=e.get("requestId"),n=Oe.completionCallbacks.get(o);n&&(Oe.logRateLimit(n,t.response),Oe.completionCallbacks.delete(o)),ze.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=Ar(a,e),s=$r(i);return r?.setStatus({code:p.ERROR,message:"Rate limited by upstream"}),r?.setAttribute("copilot_api.error_type","rate_limit_upstream"),Er(r,s),ft(w.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...Or(s)}),Cr({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,r)=>{Pr.test(r)&&e.header(r,t)})}(e,t.response),e.json(i,429)}const Pr=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;async function qr(e,t){let r=f.getActiveSpan(),o=await t.response.text(),n=Ar(o,e),a=$r(n);Ir(e,t.response.status,a.message??t.message),r?.setStatus({code:p.ERROR,message:t.message}),r?.recordException(t),r?.setAttribute("copilot_api.error_type","HTTPError"),Er(r,a),ft(w.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...Or(a)}),Cr({c:e,error:t,errorText:o,upstream:a}),t.response.status>=500&&cr({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Vt({endpointType:Ut(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message});let i=Tr(e)?function(e){let t;try{let r=JSON.parse(e);t=r.error&&"object"==typeof r.error?r.error:r}catch{return}let r="string"==typeof t.message?t.message:"";if("context_length_exceeded"!==t.code&&"context_length_exceeded"!==t.type&&!Sr.test(r))return;let o=/maximum context length is (\d+)/i.exec(r)?.[1],n=/(?:resulted in|requested) (\d+) tokens/i.exec(r)?.[1];return{type:"error",error:{type:"invalid_request_error",message:o&&n?`prompt is too long: ${n} tokens > ${o} maximum`:`prompt is too long: ${r||"context_length_exceeded"}`}}}(o):void 0;return i?e.json(i,400):e.json(n,t.response.status)}function Mr(e,t){(function(e){return"object"==typeof e&&!!e&&pr.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",he.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function Nr(e){return xr(e)||function(e){return ur(e)||e instanceof Error&&ur(e.cause)}(e)}async function jr(e,t){return Ft(e)?(Oe.completionCallbacks.delete(e.get("requestId")),new Response(null,{status:499})):async function(e,t){if(Mr(f.getActiveSpan(),t),t instanceof mr&&429===t.response.status)return Rr(e,t);if(t instanceof SyntaxError){f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),ft(w.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let r=Tr(e)?{type:"error",error:{type:"invalid_request_error",message:"Invalid JSON in request body"}}:{error:{message:"Invalid JSON in request body",type:"invalid_request_error"}};return Ir(e,400,"Invalid JSON in request body"),e.json(r,400)}if(t instanceof mr)return qr(e,t);if(gr(t))return function(e,t){let r=f.getActiveSpan();r?.setStatus({code:p.ERROR,message:"Upstream request timed out"}),t instanceof Error&&r?.recordException(t),r?.setAttribute("copilot_api.error_type","request_timeout");let o="Upstream request timed out (gateway timeout). Increase the timeout or retry.";ft(w.ERROR,"ERROR",o,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let n=Tr(e)?{type:"error",error:{type:"api_error",message:o}}:{error:{message:o,type:"timeout_error"}};return Ir(e,504,t instanceof Error?t.message:o),e.json(n,504)}(e,t);if(Nr(t))return function(e,t){let r=f.getActiveSpan();r?.setStatus({code:p.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&r?.recordException(t),r?.setAttribute("copilot_api.error_type","transient_transport");let o=t instanceof Error?br(t):void 0,n=(o&&vr(o))??"none",a=o?.message??String(t);r?.setAttribute("copilot_api.transport_cause_code",n),r?.setAttribute("copilot_api.transport_cause_message",a);let i="Temporary upstream connection failure. Please retry.";ft(w.WARN,"WARN",i,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":n,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=Tr(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return Ir(e,503,t instanceof Error?`${t.message}${kr(t)}`:i),e.json(s,503)}(e,t);let o=f.getActiveSpan(),n=t instanceof Error?t:Error(String(t));o?.setStatus({code:p.ERROR,message:n.message}),o?.recordException(n),o?.setAttribute("copilot_api.error_type",n.name),ft(w.ERROR,"ERROR",`Unhandled error: ${n.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":n.name}),cr({route:e.req.path,statusCode:500,errorClass:n.name,signature:Vt({endpointType:Ut(e.req.path),statusCode:500,upstreamErrorType:n.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:n.name,upstreamErrorMessage:`${n.message}${kr(n)}`}),Ir(e,500,n.message),r.error(n);let a=Tr(e)?{type:"error",error:{type:"api_error",message:n.message}}:{error:{message:n.message,type:"error"}};return e.json(a,500)}(e,t)}const Dr=async()=>{let e=`${Pt}/copilot_internal/v2/token`,t=he.timeoutMs,r=new AbortController,o=setTimeout(()=>r.abort(),t);try{let{response:t,span:o}=await bt({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:qt(he),signal:r.signal});try{if(!t.ok)throw new mr("Failed to get Service token",t);return await t.json()}catch(e){throw ht(o,e),e}finally{o.end()}}finally{clearTimeout(o)}};async function Lr(){let e=`${Pt}/user`,t=he.timeoutMs,r=new AbortController,o=setTimeout(()=>r.abort(),t);try{let{response:t,span:o}=await bt({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${he._t2}`,"content-type":"application/json",accept:"application/json"},signal:r.signal});try{if(!t.ok)throw new mr("Failed to get GitHub user",t);return await t.json()}catch(e){throw ht(o,e),e}finally{o.end()}}finally{clearTimeout(o)}}const Br=3e5,Fr=12e4;let Ur,Hr,zr,Jr=null,Gr=0;function Kr(e){zr&&clearTimeout(zr),zr=setTimeout(()=>{Vr("scheduled").catch(e=>{r.warn("Foundry Entra token renewal failed; retrying:",e),Kr(3e4)})},e),zr.unref()}async function Wr(e){let t=Hr;if(!Ur||!t?.tokenScope)throw Error("Foundry Entra auth is not initialised");let r=Ne.startSpan("copilot_api.foundry.entra_token",{kind:u.INTERNAL,attributes:{"copilot_api.foundry.token.trigger":e}},"upstream_401"===e?d.active():c);try{let e=await async function(e,t){let r=AbortSignal.timeout(Fr),o=new Promise((e,t)=>{r.addEventListener("abort",()=>{t(Error("Entra token request timed out after 120s"))},{once:!0})});return Promise.race([e.getToken(t,{abortSignal:r}),o])}(Ur,t.tokenScope);if(!e)throw Error(`No Entra token for scope ${t.tokenScope}`);r.setAttribute("copilot_api.foundry.token.expires_in_s",Math.round((e.expiresOnTimestamp-Date.now())/1e3)),t.bearerToken=e.token,t.bearerExpiresAt=e.expiresOnTimestamp,Gr=Date.now(),Kr(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-Br;return Math.max(t-Date.now(),3e4)}(e))}catch(e){throw ht(r,function(e){let t=e instanceof Error?e:Error(String(e)),r=D(t.message),o=`… (truncated from ${r.length} chars)`,n=Error(r.length>2e3?r.slice(0,2e3-o.length)+o:r);return n.name=t.name,n}(e)),e}finally{r.end()}}async function Yr(e,t){Hr=e,Ur=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await Wr("startup")}catch(e){throw Error("Foundry Entra ID auth: could not get a token. Run `az login` (or set FOUNDRY_API_KEY for key auth). The identity needs the 'Cognitive Services OpenAI User' role (GPT) or 'Azure AI User' (Claude) on the resource.",{cause:e})}}function Vr(e="upstream_401"){return Jr??=Wr(e).finally(()=>{Jr=null}),Jr}let Xr=null;async function Zr(e){if("foundry"===he.provider){if("entra"!==he.foundry?.auth)return!1;let t=e?.outgoingHeaders?.Authorization;return async function(e=!1,t){let o=Hr?.bearerToken;if(void 0!==t&&t!==o)return!0;let n=Hr?.bearerExpiresAt,a=void 0!==n&&n-Date.now()>Br;if(e&&a)return!1;if(Date.now()-Gr<3e4)return!0;try{return await Vr(),!0}catch(e){return r.warn("Foundry Entra token renewal after a 401 failed:",e),!1}}(await async function(e){if(!e)return!1;let t=await e.response.clone().text().catch(()=>"");return/"code"\s*:\s*"PermissionDenied"/.test(t)}(e),t?.replace(/^Bearer /,""))}return Xr||=Dr().then(({token:e})=>{he._t1=e,r.debug("Service token refreshed on upstream 401")}).finally(()=>{Xr=null}),await Xr,!0}function Qr(e,t="FOUNDRY_ENDPOINT"){let r,o=e.trim();try{r=new URL(o)}catch{throw Error(`${t} is not a valid URL: "${o}"`)}if("https:"!==r.protocol)throw Error(`${t} must use https, got: "${o}"`);let n=r.pathname.replace(/\/+$/,"").replace(/\/(?:openai|_an1)(?:\/v1)?$/i,"");return`${r.origin}${n}`}const eo=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function to(e){let t=new URL(e),r=eo.exec(t.hostname)?.[1];return r?`https://${r}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function ro(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,r]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:r||t}});return t.length>0?t:void 0}function oo(e){let t=e.FOUNDRY_ENDPOINT,r=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");let o=function(e,t){let r=e?.trim().toLowerCase();if(!r)return t?"key":"entra";if("key"!==r&&"entra"!==r)throw Error(`FOUNDRY_AUTH must be "key" or "entra", got: "${r}"`);if("key"===r&&!t)throw Error("FOUNDRY_AUTH=key requires FOUNDRY_API_KEY");return r}(e.FOUNDRY_AUTH,r),n=Qr(t),a=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:n,anthropicEndpoint:a?Qr(a,"FOUNDRY_ANTHROPIC_ENDPOINT"):to(n),auth:o,..."key"===o?{apiKey:r}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:ro(e.FOUNDRY_DEPLOYMENTS)}}const no=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},ao=e=>({...no(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),io=e=>`${e.anthropicEndpoint}/anthropic`,so=(e,t)=>({...no(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),lo=e=>"foundry"===e.provider;function co(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const uo=e=>lo(e)?(e=>`${e.endpoint}/openai/v1`)(co(e)):Ot(e),po=(e,t=!1)=>lo(e)?ao(co(e)):Ct(e,t),mo=e=>lo(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const fo=[{pattern:/^gpt-6/,context:105e4,output:128e3},{pattern:/^gpt-5/,context:4e5,output:128e3},{pattern:/^gpt-4\.1/,context:1047576,output:32768},{pattern:/^o\d/,context:2e5,output:1e5}],ho={context:128e3,output:16384};function go(e){return fo.find(({pattern:t})=>t.test(e))??ho}const yo=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,_o=e=>/^claude/i.test(e),wo=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function bo(e,t){return{id:e.id,name:e.id,object:"model",vendor:t.vendor,version:e.model,preview:!1,model_picker_enabled:!0,supported_endpoints:t.supported_endpoints,capabilities:{family:e.model,object:"model_capabilities",type:"chat",tokenizer:"o200k_base",limits:t.limits&&{max_context_window_tokens:t.limits.context,max_output_tokens:t.limits.output},supports:{tool_calls:!0,parallel_tool_calls:!0}}}}async function vo(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,r=new AbortController,o=hr(r,he.timeoutMs);try{let{response:o,span:n}=await bt({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:ao(e),signal:r.signal});try{if(!o.ok)throw new mr("Failed to list Foundry deployments",o);let e=(await o.json()).data.filter(e=>!e.status||"succeeded"===e.status).map(e=>({id:e.id,model:e.model}));return n.setAttribute("copilot_api.models_count",e.length),e}catch(e){throw ht(n,e),e}finally{n.end()}}finally{clearTimeout(o)}}async function ko(e){return{object:"list",data:(e.deployments??await vo(e)).map(e=>function(e){let{model:t}=e;if(!yo.test(t))return(e=>/embedding/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/embeddings"],capabilities:{family:t,object:"model_capabilities",type:"embeddings",tokenizer:"cl100k_base",supports:{}}}:_o(t)?bo(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):wo(t)?bo(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:go(t)}):bo(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:go(t)})}(e)).filter(e=>void 0!==e)}}const xo=()=>lo(he)&&he.foundry?ko(he.foundry):Ao(),To=async()=>{try{return await xo()}catch(e){if(e instanceof mr&&401===e.response.status){if(!await Zr(e))throw e;return xo()}throw e}},Ao=async()=>{let e=`${uo(he)}/models`,t=po(he),r=he.timeoutMs,o=new AbortController,n=hr(o,r);try{let{response:r,span:n}=await bt({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:o.signal});try{if(!r.ok)throw new mr("Failed to get models",r);let e=await r.json();return n.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw ht(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},So=e=>"embeddings"!==e.capabilities.type&&"image"!==e.capabilities.type,$o=e=>So(e)&&(e.supported_endpoints?.includes("/responses")??!0);const Eo=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],Oo="claude-haiku-4.5",Co={haiku:Oo,"sonnet-4.6":"claude-sonnet-4.6","sonnet-4.5":"claude-sonnet-4.5","sonnet-4":"claude-sonnet-4","opus-4.7":"claude-opus-4.7","opus-4.6":"claude-opus-4.6","opus-4.5":"claude-opus-4.5",opus:"claude-opus-4.5"};const Io=/^claude-/i;function Ro(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function Po(e,t){if("string"!=typeof e)return null;let r=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[o,n]=function(e){let t=e.lastIndexOf("["),r=e.lastIndexOf("]");return-1!==t&&r===e.length-1&&r>t?[e.slice(0,t),e.slice(t+1,r)]:[e,null]}(r);if(t.includes(r))return r;if(n){let e=`${o}-${n}`.replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of Eo)if(t.pattern.test(e))return t.family;return null}(o),i=Io.test(o),s=o.replace(/-\d{8}(?::.*)?$/,""),l=n?`-${n}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let r=Ro(e);for(let e of t)if(Ro(e.replace(/-\d{8}(?::.*)?$/,""))===r)return e}return a?function(e,t,r=null){let o=Co[e];if(!o)return null;if(r){let e=`${o}-${r}`;if(t.includes(e))return e}if(t.includes(o))return o;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let o=r?`${e}-${r}`:e;if(t.includes(o))return o}return null}(a,t,n):null}const qo=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Mo(e,t){if(!e||!t||0===t.length)return null;let r=function(e){return"max"===e?"xhigh":e}(e);if(t.includes(r))return r;let o=qo.get(r);if(void 0===o)return t[0]??null;let n=null,a=1/0;for(let e of t){let t=qo.get(e);if(void 0===t)continue;let r=Math.abs(t-o);r<a&&(a=r,n=e)}return n}const No={messages:So,responses:$o,chat:e=>So(e)&&(e.supported_endpoints?.some(e=>"/chat/completions"===e||"/responses"===e)??!0)};let jo;const Do=new Map,Lo=new Map;function Bo(e,t,r){let o=(e??t??"").trim().toLowerCase();if(""!==o&&"none"!==o){if("copilot"!==o)throw Error(`--fallback must be "copilot", got: "${o}"`);if("foundry"!==r)throw Error("--fallback copilot requires --provider foundry");return o}}async function Fo(){jo=await ie({provider:"copilot"},To)}const Uo=()=>void 0!==jo;function Ho(e,t=Date.now()){let r=Do.get(e);return void 0!==r&&(t<r||(Do.delete(e),!1))}function zo(e,t=Date.now()){return{id:Lo.get(e)?.id??0,lapsed:!Ho(e,t)}}function Jo(e,t,r={}){let o=r.now??Date.now(),n=r.sent??zo(e,o),a=Lo.get(e)??{id:0,appliedMs:0},i=Math.max(function(e,t=Date.now()){let r=e.get("retry-after-ms");if(null!==r&&Number.isFinite(Number(r))&&Number(r)>=0)return Number(r);let o=e.get("retry-after");if(null!==o){let e=Number(o);if(""!==o.trim()&&Number.isFinite(e)&&e>=0)return 1e3*e;let r=Date.parse(o);if(!Number.isNaN(r))return Math.max(0,r-t)}return 1e4}(t,o),5e3),s=n.lapsed?n.id+1:n.id;if(s>a.id){let t=Math.min(2*a.appliedMs,6e4);i=Math.max(i,t),Lo.set(e,{id:s,appliedMs:i})}else s===a.id&&a.appliedMs>0&&i>a.appliedMs&&Lo.set(e,{id:a.id,appliedMs:i});let l=Math.max(Do.get(e)??0,o+i);return Do.set(e,l),l-o}function Go(e,t){let r=Lo.get(e);r&&t.lapsed&&t.id===r.id&&Lo.set(e,{id:r.id,appliedMs:0})}function Ko(e){if(!Uo()||!lo(he)||!e.ok)return;let{headers:t}=e;return t.has("retry-after")||t.has("retry-after-ms")?Response.json({error:{message:"Foundry rate-limited this request (HTTP 200 stream with retry-after).",type:"too_many_requests",code:"rate_limit_exceeded"}},{status:429,headers:t}):void 0}const Wo=new Set([429,408,500,502,503,504]);function Yo(e,t){let r=hr(e,t),o=pe()||le()?hr(e,9e4):void 0;return{headersArrived:()=>clearTimeout(o),clear:()=>{clearTimeout(r),clearTimeout(o)}}}function Vo(e,t){if(e instanceof mr){let{status:t}=e.response;return Wo.has(t)&&void 0!==e.outgoingBody?`foundry_${t}`:void 0}if(t){if(gr(e))return"foundry_timeout";if(Nr(e))return"foundry_transport"}}const Xo={foundry_429:"rate-limited",foundry_timeout:"timed out on",foundry_transport:"could not be reached for",foundry_stream_failed:"failed the stream for",foundry_stream_idle:"went silent on"};function Zo(e,t,o){let n=Xo[t]??`returned ${t.slice(8)} for`;r.info(`Foundry ${n} ${e}; serving it from Copilot for ${Math.ceil(o/1e3)}s`)}function Qo(e,t,r){let{model:o,reason:n}=r,a=f.getActiveSpan();return a?.setAttribute("copilot_api.fallback.upstream","copilot"),a?.setAttribute("copilot_api.fallback.reason",n),a?.setAttribute("copilot_api.fallback.foundry_model",o),ie({provider:"copilot",models:jo,rerun:"breaker_open"!==n,inStream:r.inStream},()=>t(e))}const en=()=>de();!function(e){ue=e}(e=>{let t=e;t.sent=zo(t.model)});const tn=new WeakMap;async function rn(e,t,r){let o=t instanceof mr?t.response:void 0,n=Jo(e,o?.headers??new Headers,{sent:r});return await(o?.body?.cancel()),n}function on(e,t,r){let{windowMs:o,attemptStart:n}=r,a=f.getActiveSpan();a?.setAttribute("copilot_api.fallback.retry_after_ms",o),void 0!==n&&a?.setAttribute("copilot_api.fallback.foundry_attempt_ms",Math.round(performance.now()-n)),Zo(e,t,o)}function nn(e){let t=de();return void 0!==t&&tn.has(t)&&!Ft(e)}function an(){let e=de(),t=e&&tn.get(e);t&&(t.deferReset=!0)}function sn(){let e=en();e?.sent&&tn.has(e)&&Go(e.model,e.sent)}async function ln(e,t,r){let o=en(),n=o&&tn.get(o);if(!o||!n)throw Error("Not in a Foundry attempt the fallback stands behind");tn.delete(o);let{model:a}=o;return on(a,t,{windowMs:await rn(a,r,o.sent??zo(a)),attemptStart:o.start}),function(e){return ce.exit(e)}(()=>Qo(e,n.handler,{model:a,reason:t,inStream:!0}))}async function cn(e,t,r){if(!Uo()||!lo(he))return r(e);let o=await async function(e){try{let t=await e.req.json();return"string"==typeof t.model?t.model:void 0}catch{return}}(e);if(!o||!function(e,t){let r=jo?.data??[],o=r.map(e=>e.id),n=o.includes(e)?e:Po(e,o),a=r.find(e=>e.id===n);return a&&No[t](a)?a.id:void 0}(o,t))return r(e);if(Ho(o))return Qo(e,r,{model:o,reason:"breaker_open"});let n=zo(o),a={model:o};tn.set(a,{handler:r});try{let t=await function(e,t){return ce.run(e,t)}(a,()=>r(e)),n=a.sent,i=!0===tn.get(a)?.deferReset;return t.ok&&n&&!i&&Go(o,n),t}catch(t){let i=a.sent,s=Vo(t,void 0!==i);if(!s||(on(o,s,{windowMs:await rn(o,t,i??n),attemptStart:a.start}),Ft(e)))throw t;return Qo(e,r,{model:o,reason:s})}}const un=e=>new Promise(t=>{setTimeout(t,e)}),pn=e=>null==e;async function dn({refreshFallback:e=!0}={}){let t=await To();he.models=t,e&&Uo()&&await Fo().catch(e=>{r.warn("Failed to refresh the Copilot fallback models:",e)})}const mn=()=>{he._v1="1.140.0-insider"};var fn=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let hn,gn,yn,_n,wn,bn=!1,vn=!1,kn=!1;function xn(){return Tn()?wn:void 0}function Tn(){return void 0!==wn&&Date.now()-wn.at<6e4}function An(){return kn?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const Sn=()=>a.readFile(re.GITHUB_TOKEN_PATH,"utf8");function $n(e){let{span:t,error:o,reason:n,refreshStart:a,attempt:i}=e,s=o.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";he._t1=void 0,wn={status:s,message:l,at:Date.now()},clearInterval(hn),hn=void 0,r.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Ke.add(1,{reason:n,success:"false"}),We.add(1,{reason:n}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:p.ERROR,message:o.message}),t.recordException(o),lt.record(performance.now()-a,{reason:n}),ft(w.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i,"copilot_api.token_refresh.terminal_status":s})}function En(e){let{span:t,error:o,reason:n,refreshStart:a,maxRetries:i}=e;he._t1=void 0,r.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=o instanceof Error?o:Error(String(o));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:p.ERROR,message:s.message}),t.recordException(s),We.add(1,{reason:n}),lt.record(performance.now()-a,{reason:n}),ft(w.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempts":i})}const On=async(e=5,t=1e3,o="scheduled")=>bn?(r.debug("Token refresh already in progress, coalescing"),gn):(bn=!0,gn=Ne.startActiveSpan("copilot_api.token.refresh",async n=>{let a=performance.now();n.setAttribute("copilot_api.token_refresh.reason",o),n.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let i=1;i<=e;i++)try{n.setAttribute("copilot_api.token_refresh.attempt",i),r.debug(`Refreshing Service token (${o}, attempt ${i}/${e})`);let{token:t,refresh_in:s}=await Dr();return he._t1=t,wn=void 0,vn&&void 0===hn&&(r.info("Token refresh recovered, resuming scheduled refresh"),In(s)),r.debug("Service token refreshed successfully"),he.showToken&&r.info("Refreshed Service token:",t),n.setAttribute("copilot_api.token_refresh.success",!0),Ke.add(1,{reason:o,success:"true"}),lt.record(performance.now()-a,{reason:o}),void ft(w.INFO,"INFO",`Token refreshed successfully (${o})`,{"copilot_api.token_refresh.reason":o,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof mr&&(401===s.response.status||403===s.response.status))return void $n({span:n,error:s,reason:o,refreshStart:a,attempt:i});let l=i===e;if(r.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),Ke.add(1,{reason:o,success:"false"}),l)return void En({span:n,error:s,reason:o,refreshStart:a,maxRetries:e});let c=t*2**(i-1);r.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{n.end(),bn=!1,gn=void 0}}),gn);async function Cn(){return!!he._t1||!Tn()&&(void 0!==wn&&kn&&await async function(){if(gn)return;let e=(await Sn().catch(()=>{}))?.trim();e&&e!==he._t2?.trim()&&(he._t2=e,r.info("Picked up re-authenticated Auth token from disk"),he.showToken&&r.info("Auth token:",e))}(),await On(3,250,"on-demand"),!!he._t1)}function In(e){hn&&clearInterval(hn);let t=Math.max(1e3*(e-60),6e4);hn=setInterval(()=>{On(5,1e3,"scheduled").catch(e=>{r.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Rn(e){try{let t=await Sn();if(t&&!e?.force)return he._t2=t,kn=!0,he.showToken&&r.info("Auth token:",t),void await Pn();r.info("Authentication required");let o=await async function(){let e=new AbortController,t=he.timeoutMs,r=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${Mt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:Nt,scope:"user:email"}),signal:e.signal});if(!t.ok)throw new mr("Failed to get device code",t);return await t.json()}finally{clearTimeout(r)}}();r.debug("Device code response:",o),r.info(`Please enter the code "${o.user_code}" at ${o.verification_uri}`);try{h.writeSync(o.user_code),r.success("Code copied to clipboard — opening browser...")}catch{r.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,r=_.platform;t="darwin"===r?"open":"win32"===r?"start":"xdg-open",g(t,[e],()=>{})}catch{}}(o.verification_uri);let n=await async function(e){let t=1e3*(e.interval+1);r.debug(`Polling access token with interval of ${t}ms`),r.start("Waiting for authorization...");let o=Date.now(),n=1e3*e.expires_in;for(;;){if(Date.now()-o>=n)throw new fn("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=he.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let o=await fetch(`${Mt}/login/oauth/access_token`,{method:"POST",headers:xt(),body:JSON.stringify({client_id:Nt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!o.ok){await un(t),r.error("Failed to poll access token:",await o.text());continue}let n=await o.json();if(r.debug("Polling access token response:",n),n.error){if("expired_token"===n.error)throw new fn("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===n.error)throw new fn("Authorization was denied. Please run the command again and approve the request.");"authorization_pending"!==n.error&&"slow_down"!==n.error&&r.warn(`Unexpected auth error: ${n.error}`),await un(t);continue}if(n.access_token)return n.access_token;await un(t)}catch(e){if(e instanceof fn)throw e;if(e instanceof Error&&"AbortError"===e.name){r.error("Access token polling timed out"),await un(t);continue}throw e}finally{clearTimeout(s)}}}(o);await(e=>a.writeFile(re.GITHUB_TOKEN_PATH,e,{mode:384}))(n),he._t2=n,kn=!0,he.showToken&&r.info("Auth token:",n),await Pn()}catch(e){throw e instanceof mr?(r.error("Failed to get Auth token:",await e.response.json()),e):(r.error("Failed to get Auth token:",e),e)}}async function Pn(){let e=await Lr();r.success(`Authenticated as ${e.login}`)}async function qn(e){e.verbose&&(r.level=5,r.info("Verbose logging enabled")),he.showToken=e.showToken,await oe(),await Rn({force:!0}),console.log("\n Get started:\n\n $ npx copilot-api-node20@latest start --claude-code\n $ npx copilot-api-node20@latest start --codex\n\n Full docs: https://www.npmjs.com/package/copilot-api-node20\n"),process.exit(0)}const Mn=e({meta:{name:"auth",description:"Run authentication flow"},args:{verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"show-token":{type:"boolean",default:!1,description:"Show token on auth"}},run:({args:e})=>qn({verbose:e.verbose,showToken:e["show-token"]})}),Nn=.01,jn=864e5,Dn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Ln=new Intl.NumberFormat("en-US"),Bn=e=>Dn.format(e*Nn),Fn=e=>e.credits_used??e.entitlement-e.remaining,Un=(e,t,r)=>{let o=(e=>{let t=new Date(`${e}T00:00:00Z`);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-1,1))})(t),n=(r.getTime()-o.getTime())/jn;if(n<.5)return;let a=Fn(e),i=a*Nn/n,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Nn,c=new Date(o.getTime()+l/i*jn);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Hn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Ln.format(Fn(e))} of ${Ln.format(e.entitlement)} used`:"n/a",zn=e=>e.padEnd(14),Jn=(e,t=new Date)=>{let r=e.quota_snapshots.premium_interactions,o=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(r.unlimited)o.push(`${zn("AI credits")}unlimited`);else{let e=Fn(r),t=r.percent_remaining;o.push(`${zn("AI credits")}${Bn(e)} / ${Bn(r.entitlement)} ${t.toFixed(1)}% left`,`${zn("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${zn("")}${Ln.format(e)} of ${Ln.format(r.entitlement)} credits`)}if(o.push("",`${zn("Chat")}${Hn(e.quota_snapshots.chat)}`,`${zn("Completions")}${Hn(e.quota_snapshots.completions)}`,"",`${zn("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/jn)))(e.quota_reset_date,t)} days)`),!r.unlimited){let n=Un(r,e.quota_reset_date,t);n&&o.push(`${zn("Burn rate")}~${Dn.format(n.usdPerDay)}/day${(e=>e.exhausted?" — allowance already exhausted":e.exhaustsOn?` — on track to exhaust ${(e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}))(e.exhaustsOn)}`:" — within allowance")(n)}`);let a=r.overage_permitted?"permitted, "+(r.overage_count>0?`${Ln.format(r.overage_count)} used`:"none used"):"not permitted";o.push(`${zn("Overage")}${a}`)}return o.join("\n")},Gn=async()=>{let e=`${Pt}/copilot_internal/user`,t=he.timeoutMs,r=new AbortController,o=setTimeout(()=>r.abort(),t);try{let{response:t,span:o}=await bt({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:qt(he),signal:r.signal});try{if(!t.ok)throw new mr("Failed to get usage",t);return await t.json()}catch(e){throw ht(o,e),e}finally{o.end()}}finally{clearTimeout(o)}},Kn=()=>_.stdout.write(""),Wn=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Yn=async()=>{let e=await Gn();return Jn(e)},Vn=e({meta:{name:"check-usage",description:"Show current usage/quota information"},args:{watch:{alias:"w",type:"boolean",default:!1,description:"Keep running and refresh the report on an interval"},interval:{alias:"i",type:"string",default:"60",description:"Seconds between refreshes in --watch mode (min 10)"}},async run({args:e}){if(await oe(),await Rn(),!e.watch){try{r.box(await Yn())}catch(e){r.error("Failed to fetch usage:",e),_.exit(1)}_.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?r.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&r.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),o=_.stdout.isTTY,n=()=>_.exit(0);for(_.on("SIGINT",n),_.on("SIGTERM",n);;){try{let e=await Yn();o&&Kn(),r.box(e),r.log(Wn(new Date,t))}catch(e){r.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Xn=j(g);async function Zn(){let e="win32"===_.platform?"where.exe":"which";try{return await Xn(e,["tailscale"]),!0}catch{return!1}}async function Qn(){try{let{stdout:e}=await Xn("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function ea(e){return e.replace(/\.$/,"")}async function ta(){let e=await Qn();if(e?.Online)return ea(e.DNSName)}const ra=j(g),oa=e=>`${e}`,na=e=>`${e}`,aa=e=>`${e}`,ia=e=>`${e}`,sa=e=>`${e}`,la=e=>`${e}`,ca=na(" ─────────────────────────────────────────────────────────────"),ua=s.join(re.APP_DIR,"certs","tailscale"),pa=s.join(ua,"cert.pem"),da=s.join(ua,"key.pem"),ma={certDir:ua,certPath:pa,keyPath:da};function fa(){switch(_.platform){case"darwin":return[` ${na("Install Tailscale for macOS:")}`,` ${aa("https://tailscale.com/download/mac")}`,` ${na("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${na("After installing, open the Tailscale app and sign in.")}`,` ${na("Then re-run this command.")}`].join("\n");case"linux":return[` ${na("Install Tailscale for Linux:")}`,` ${aa("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${aa("sudo tailscale up")}`,` ${na("or")} ${aa("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${na("Install Tailscale for Windows:")}`,` ${aa("https://tailscale.com/download/windows")}`,"",` ${na("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${na("Install Tailscale:")} ${aa("https://tailscale.com/download")}`}}function ha(){let e=[` ${sa("Tailscale is not running.")}`];return"darwin"===_.platform?e.push(` ${na("Open the Tailscale app from Applications and sign in.")}`,` ${na("Download:")} ${aa("https://tailscale.com/download/mac")}`):"win32"===_.platform?e.push(` ${na("Open the Tailscale app and sign in.")}`,` ${na("Download:")} ${aa("https://tailscale.com/download/windows")}`):e.push(` ${na("Connect with:")} ${aa("sudo tailscale up")}`),e.push("",` ${na("Then re-run this command.")}`),e.join("\n")}async function ga(){try{return await a.access(pa),await a.access(da),!0}catch{return!1}}function ya(e){console.log(""),console.log(ca),console.log(` ${oa("Claude Cowork Setup")} ${na("— Diagnostic")}`),console.log(ca),console.log("");for(let t of function(e){let t=[];for(let[r,o]of Object.entries(e)){let e;e="ok"===o.status?ia("✅"):"missing"===o.status?sa("❌"):la("❓");let n=o.detail?na(` ${o.detail}`):"";t.push(` ${e} ${r}${n}`)}return t}(e))console.log(t);console.log("");let t=Object.values(e).filter(e=>"missing"===e.status);0===t.length?console.log(` ${ia("All checks passed.")}`):console.log(` ${sa(`${t.length} issue(s).`)} Run ${aa("copilot-api cowork-setup install")} to fix.`),console.log("")}const _a={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},wa=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Zn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return ya(e),console.log(""),console.log(fa()),void console.log("");let r=await Qn();if(!r||!r.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},ya(e),console.log(ha()),void console.log("");let o=ea(r.DNSName);e["tailscale-running"]={status:"ok",detail:o};let n=await ga();e["tailscale-cert"]=n?{status:"ok",detail:pa}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},n&&(e.ready={status:"ok",detail:`https://${o}:<port>`}),ya(e)}(),_.exit(0)}}),ba=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:_a},async run({args:e}){await async function(e){if(console.log(""),console.log(ca),console.log(` ${oa("Claude Cowork Setup")} ${na("— Install")}`),console.log(ca),console.log(""),!await Zn())return console.log(` ${sa("Tailscale is not installed.")}`),console.log(""),console.log(fa()),console.log(""),console.log(` ${na("After installing, run")} ${aa("tailscale up")} ${na("to connect, then re-run this command.")}`),void console.log("");let t=await Qn();if(!t||!t.Online)return console.log(ha()),void console.log("");let o=ea(t.DNSName);if(console.log(` ${na("Tailscale hostname:")} ${oa(o)}`),console.log(""),console.log(` ${oa("Generating TLS certificate via Tailscale…")}`),console.log(` ${na("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${aa(`$ tailscale cert --cert-file ${pa} --key-file ${da} ${o}`)}`),console.log(""),e||await r.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(ua,{recursive:!0}),r.start("Generating certificate (this may take a few seconds)…"),await ra("tailscale",["cert","--cert-file",pa,"--key-file",da,o]),console.log(` ${ia("✓ Certificate generated")}`)}catch(e){let t=e instanceof Error?e.message:String(e);return void r.error(`Failed to generate cert: ${t}`)}console.log(""),console.log(ca),console.log(` ${oa("Next steps")}`),console.log(ca),console.log(""),console.log(` ${oa("1.")} Start the proxy:`),console.log(` ${aa("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${oa("2.")} In Cowork ${na("→")} Settings ${na("→")} Inference Provider, set:`),console.log(` ${oa("inferenceGatewayBaseUrl")} = ${aa(`https://${o}:<port>`)}`),console.log(` ${na("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${oa("3.")} Restart Cowork ${na("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${na("For Cowork's own configuration docs, see:")}`),console.log(` ${aa("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else r.info("Skipped.")}(e.yes),_.exit(0)}}),va=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:_a},async run({args:e}){await async function(e){if(console.log(""),console.log(ca),console.log(` ${oa("Claude Cowork Setup")} ${na("— Revert")}`),console.log(ca),console.log(""),await ga())if(console.log(` ${oa("Remove Tailscale cert files:")}`),console.log(` ${na(pa)}`),console.log(` ${na(da)}`),console.log(""),e||await r.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(ua,{recursive:!0}),console.log(` ${ia("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);r.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${na("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else r.info("Skipped.");else console.log(` ${na("No Tailscale cert found. Nothing to revert.")}`),console.log("")}(e.yes),_.exit(0)}}),ka=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:wa,install:ba,revert:va}}),xa=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Ta(e){if(!xa.test(e))return e;let t=e,r=String.fromCodePoint(27),o=t.split(r);if(o.length>1){t=o[0];for(let e=1;e<o.length;e++){let n=o[e],a=n.match(/^\[[0-9;]*[a-z]/i);t+=a?n.slice(a[0].length):r+n}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function Aa(e){return"string"==typeof e?Ta(e):Array.isArray(e)?function(e){let t;for(let r=0;r<e.length;r++){let o=e[r],n=Aa(o);!t&&n!==o&&(t=e.slice(0,r)),t?.push(n)}return t??e}(e):e&&"object"==typeof e?function(e){let t,r=Object.entries(e),o="thinking"===e.type;for(let e=0;e<r.length;e++){let[n,a]=r[e],i=!o||"thinking"!==n&&"signature"!==n?Aa(a):a;t||i===a&&"__proto__"!==n||(t=Sa({},r,e)),t&&(t[n]=i)}let n=t??e;return"object"===n.type&&!("properties"in n)&&(t??=Sa({},r,r.length),t.properties={}),t??e}(e):e}function Sa(e,t,r){for(let o=0;o<r;o++)e[t[o][0]]=t[o][1];return e}const $a="x-copilot-api-self-test",Ea=N();const Oa=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Ca(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==e.capabilities.type&&"image"!==e.capabilities.type&&!function(e){let t=e.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e.id)}(e)&&!function(e){return"disabled"===e.policy?.state}(e)}function Ia(e){let t=2;return Oa.test(e.id)?t=0:"Anthropic"===e.vendor&&(t=1),2*t+ +!e.model_picker_enabled}const Ra=new Set(["model_not_supported","no_available_model_endpoints"]);function Pa(e,t){if(400!==e||!t)return!1;try{let e=JSON.parse(t).error?.code;return"string"==typeof e&&Ra.has(e)}catch{return!1}}const qa="function"==typeof l.snapshot?l.snapshot():e=>e(),Ma=e=>{try{return J(e,"utf8")}catch{return}},Na=e=>({read:Ma,root:"/sys/fs/cgroup",totalMem:i.totalmem(),rss:()=>process.memoryUsage.rss(),platform:process.platform,...e}),ja=(e,t)=>Number.isFinite(e)&&e>0&&e<t?e:void 0,Da=(e,t)=>{if(!e)return;let r=RegExp(`^${t}:? +(\\d+)`,"m").exec(e);return r?Number(r[1]):void 0};const La=(e,t)=>{let r=e.root.replace(/\/+$/,""),o=r&&(t===r||t.startsWith(`${r}/`))?t.slice(r.length):t;return((e,t)=>{let r=t.split("/").filter(e=>e&&"."!==e&&".."!==e),o=[];for(let t=r.length;t>=0;t--)o.push([e,...r.slice(0,t)].join("/"));return o})(e.mountPoint,o)};function Ba(e={}){let t,r=Na(e),o=function(e){let t=e.read("/proc/self/cgroup")??"",r=function(e){let t={v2:{root:"/",mountPoint:e.root},v1:{root:"/",mountPoint:`${e.root}/memory`}},r={v2:!1,v1:!1};for(let o of(e.read("/proc/self/mountinfo")??"").split("\n")){let e=o.split(" "),n=e.indexOf("-");if(n<5)continue;let a={root:e[3],mountPoint:e[4]},i=e[n+1];"cgroup2"!==i||r.v2?"cgroup"===i&&!r.v1&&(e[n+3]??"").split(",").includes("memory")&&(t.v1=a,r.v1=!0):(t.v2=a,r.v2=!0)}return t}(e),o=[{source:"cgroup_v2",dirs:La(r.v2,/^0::(.*)$/m.exec(t)?.[1]??"/"),current:"memory.current",max:"memory.max",inactive:"inactive_file"},{source:"cgroup_v1",dirs:La(r.v1,/^\d+:(?:[^:]*,)?memory(?:,[^:]*)?:(.*)$/m.exec(t)?.[1]??"/"),current:"memory.usage_in_bytes",max:"memory.limit_in_bytes",inactive:"total_inactive_file"}];for(let t of o){let r=[];for(let o of t.dirs){let n=Number(e.read(`${o}/${t.current}`));if(!Number.isFinite(n))continue;let a=e.read(`${o}/${t.max}`)?.trim(),i=Da(e.read(`${o}/memory.stat`),t.inactive);r.push({limit:void 0===a||"max"===a?void 0:ja(Number(a),e.totalMem),used:Math.max(0,n-(i??0))})}if(r.length>0)return{source:t.source,levels:r}}}(r);for(let e of o?.levels??[])void 0!==e.limit&&(!t||e.limit-e.used<t.limitBytes-t.usedBytes)&&(t={limitBytes:e.limit,usedBytes:e.used,source:o?.source??"host"});if(t)return t;let n=r.read("/proc/meminfo"),a=Da(n,"MemTotal"),i=Da(n,"MemAvailable");return"linux"===r.platform&&a&&void 0!==i?{limitBytes:1024*a,usedBytes:Math.max(0,1024*(a-i)),source:"host"}:{limitBytes:r.totalMem,usedBytes:r.rss(),source:"rss"}}const Fa=(e,t)=>{let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?r:t};var Ua=class{level="normal";last;timer;listeners=new Set;sampleListeners=new Set;thresholds;read;rss;intervalMs;constructor(e={}){this.thresholds=e.thresholds??{low:Fa("COPILOT_API_IMAGES_PRESSURE_LOW",.7),high:Fa("COPILOT_API_IMAGES_PRESSURE_HIGH",.8),critical:Fa("COPILOT_API_IMAGES_PRESSURE_CRITICAL",.9)},this.read=e.read??(()=>Ba()),this.rss=e.rss??(()=>process.memoryUsage.rss()),this.intervalMs=e.intervalMs??1e3}get current(){return this.level}get lastSample(){return this.last}onChange(e){this.listeners.add(e)}onSample(e){this.sampleListeners.add(e)}start(){this.timer||(this.sample(),qa(()=>{this.timer=setInterval(()=>this.sample(),this.intervalMs),this.timer.unref()}))}stop(){clearInterval(this.timer),this.timer=void 0}sample(){let e;try{e=this.read()}catch{return this.level}for(let t of this.sampleListeners)t(e);let t=((e,t)=>"cgroup_v2"===e.source||"cgroup_v1"===e.source?e.usedBytes:t)(e,this.rss()),r=t/e.limitBytes,o=this.level;if(this.level=function(e,t,r){return t>=r.critical?"critical":t>=r.high?"critical"===e?"critical":"high":"critical"===e?"high":"high"===e?t<r.low?"normal":"high":"normal"}(o,r,this.thresholds),this.last={level:this.level,usedBytes:t,limitBytes:e.limitBytes,ratio:r,source:e.source},this.level!==o){let a=e=>Math.round(e/1024/1024),i=`Image memory pressure ${o} -> ${this.level}: ${a(t)} of ${a(e.limitBytes)} MB (${Math.round(100*r)}%, ${e.source})`;"normal"===this.level?n.info(i):n.warn(i);for(let e of this.listeners)e(this.level,o)}return this.level}};const Ha=1048576,za=8388608,Ja=16*Ha,Ga=100*Ha,Ka=e=>((e,t=1)=>Math.ceil(1*Math.min(Math.max(e,0),Ga)+5242880*Math.max(1,Math.floor(t))))(e??Ja)+za;var Wa=class extends Error{reason;constructor(e){super(`Image request not admitted: ${e}`),this.reason=e,this.name="AdmissionRejectedError"}},Ya=class{inUse=0;inFlight=0;queue=[];budgetScale=1;paused=!1;latencyMs=3e4;now;options;constructor(e){this.options=e,this.now=e.now??(()=>performance.now())}get fullBudget(){return Math.max(0,this.options.ceilingBytes??this.options.budgetBytes)}get budget(){let e=Math.min(Math.max(0,this.options.budgetBytes),this.fullBudget);return Math.floor(e*this.budgetScale)}setBudgetBytes(e){e!==this.options.budgetBytes&&(this.options={...this.options,budgetBytes:e},this.pump())}stats(){return{budgetBytes:this.budget,inUseBytes:this.inUse,inFlight:this.inFlight,queueDepth:this.queue.length}}retryAfterSeconds(){return Math.min(55,Math.max(5,Math.ceil(this.latencyMs/1e3)))}setPaused(e){this.paused=e,e||this.pump()}get isPaused(){return this.paused}setBudgetScale(e){this.budgetScale=e,this.pump()}failQueued(e){for(let t of this.queue.splice(0))t.cleanup(),t.reject(new Wa(e))}acquire(e,t){return t?.aborted?Promise.reject(new Wa("aborted")):e>this.fullBudget?Promise.reject(new Wa("too_large")):this.paused?Promise.reject(new Wa("memory_pressure")):0===this.queue.length&&this.fits(e)?Promise.resolve(this.grant(e)):this.queue.length>=this.options.maxQueue?Promise.reject(new Wa("queue_full")):new Promise((r,o)=>{let n=()=>{let e=this.queue.indexOf(s);return-1!==e&&(this.queue.splice(e,1),s.cleanup(),this.pump(),!0)},a=setTimeout(()=>{n()&&o(new Wa("queue_timeout"))},this.options.queueTimeoutMs),i=()=>{n()&&o(new Wa("aborted"))},s={weight:e,enqueuedAt:this.now(),resolve:r,reject:o,cleanup:()=>{clearTimeout(a),t?.removeEventListener("abort",i)}};t?.addEventListener("abort",i,{once:!0}),this.queue.push(s)})}fits(e){return!(this.inFlight>=this.options.maxConcurrent)&&this.inUse+Math.max(Math.ceil(e),0)<=this.budget}pump(){for(;!this.paused&&this.queue.length>0;){let e=this.queue[0];if(!this.fits(e.weight))return;this.queue.shift(),e.cleanup(),e.resolve(this.grant(e.weight))}}grant(e){let t=Math.max(Math.ceil(e),0);return this.inUse+=t,this.inFlight+=1,new Va(this,t,this.now())}growHeld(e,t){let r=Math.max(0,Math.ceil(t));return e+r>this.fullBudget?"too_large":this.inUse+r>this.budget?"busy":(this.inUse+=r,"ok")}trimHeld(e){this.inUse-=e,this.pump()}releaseHeld(e,t){this.inUse-=e,--this.inFlight,this.recordLatency(this.now()-t),this.pump()}recordLatency(e){this.latencyMs=.2*e+.8*this.latencyMs}},Va=class{released=!1;held;gate;grantedAt;constructor(e,t,r){this.gate=e,this.held=t,this.grantedAt=r}get weight(){return this.held}grow(e){if(this.released)return"busy";let t=this.gate.growHeld(this.held,e);return"ok"===t&&(this.held+=Math.max(0,Math.ceil(e))),t}trim(e){let t=Math.max(0,Math.ceil(e));this.released||t>=this.held||(this.gate.trimHeld(this.held-t),this.held=t)}release(){this.released||(this.released=!0,this.gate.releaseHeld(this.held,this.grantedAt))}};const Xa=(e,t)=>{let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?Math.floor(r):t};function Za(e,t,r=0){let o=Xa("COPILOT_API_IMAGES_MEMORY_BUDGET_MB",0)*Ha;if(o>0)return o;let n=e-Math.max(t,209715200)-Math.max(0,r)-268435456;return Math.max(0,Math.floor(.9*n))}const Qa=e=>Za(e.limitBytes,Math.max(e.idleRssBytes,e.rssBytes-e.imageInUseBytes),e.usedBytes-e.rssBytes);var ei=class{tokens;last;timer;queue=[];burst;intervalMs;now;constructor(e){this.burst=e.burst,this.intervalMs=e.intervalMs,this.now=e.now??(()=>performance.now()),this.tokens=e.burst,this.last=this.now()}get waiting(){return this.queue.length}refill(){let e=this.now();this.tokens=Math.min(this.burst,this.tokens+(e-this.last)/this.intervalMs),this.last=e}drain(){for(this.refill();this.queue.length>0&&this.tokens>=1;){--this.tokens;let e=this.queue.shift();e.resolve(Math.round(this.now()-e.enqueuedAt))}this.queue.length>0&&!this.timer&&qa(()=>{this.timer=setTimeout(()=>{this.timer=void 0,this.drain()},Math.ceil((1-this.tokens)*this.intervalMs))})}take(e){return e?.aborted?Promise.reject(new Wa("aborted")):(this.refill(),0===this.queue.length&&this.tokens>=1?(--this.tokens,Promise.resolve(0)):new Promise((t,r)=>{let o=()=>{let e=this.queue.indexOf(n);-1!==e&&(this.queue.splice(e,1),r(new Wa("aborted")))},n={enqueuedAt:this.now(),resolve:r=>{e?.removeEventListener("abort",o),t(r)}};e?.addEventListener("abort",o,{once:!0}),this.queue.push(n),this.drain()}))}};let ti;function ri(){if(ti)return ti;let e=Ba(),t=process.memoryUsage.rss(),r=Qa({limitBytes:e.limitBytes,usedBytes:e.usedBytes,rssBytes:t,idleRssBytes:t,imageInUseBytes:0}),o=new Ya({budgetBytes:r,ceilingBytes:Za(e.limitBytes,t),maxConcurrent:Xa("COPILOT_API_IMAGES_MAX_CONCURRENT",30),maxQueue:Xa("COPILOT_API_IMAGES_MAX_QUEUE",32),queueTimeoutMs:Xa("COPILOT_API_IMAGES_QUEUE_TIMEOUT_MS",45e3)}),a=new Ua;return a.onChange(e=>oi(o,e)),a.onSample(e=>o.setBudgetBytes(Qa({limitBytes:e.limitBytes,usedBytes:e.usedBytes,rssBytes:process.memoryUsage.rss(),idleRssBytes:t,imageInUseBytes:o.stats().inUseBytes}))),n.info(`Image admission: budget ${Math.round(r/Ha)} MB of a ${Math.round(e.limitBytes/Ha)} MB limit (${e.source})`),ti={gate:o,monitor:a,pacer:new ei({burst:Xa("COPILOT_API_IMAGES_START_BURST",30),intervalMs:Xa("COPILOT_API_IMAGES_START_RATE",400)})},a.start(),oi(o,a.current),ti}function oi(e,t){"critical"===t?(e.setPaused(!0),e.failQueued("memory_pressure"),e.setBudgetScale(.5)):(e.setBudgetScale(1),e.setPaused("high"===t))}let ni;function ai(e){let{heapUsed:t,rss:r,external:o,arrayBuffers:n}=process.memoryUsage();ni??=U().heap_size_limit,e.setAttribute("copilot_api.process.heap_used_bytes",t),e.setAttribute("copilot_api.process.rss_bytes",r),e.setAttribute("copilot_api.process.external_bytes",o),e.setAttribute("copilot_api.process.array_buffers_bytes",n);let a=ti?.monitor.lastSample;a&&(e.setAttribute("copilot_api.process.memory_pressure",a.level),("cgroup_v2"===a.source||"cgroup_v1"===a.source)&&e.setAttribute("copilot_api.process.cgroup_working_set_bytes",a.usedBytes)),e.setAttribute("copilot_api.process.heap_limit_bytes",ni),e.setAttribute("copilot_api.process.uptime_s",Math.round(process.uptime()))}function ii(e){try{!function(e){let{c:t,start:r,span:o}=e,n=t.get("requestData"),a=t.res.status,i=n?.model??"unknown",s=n?.streaming??!1,l=Math.round(performance.now()-r);if(o.setAttribute("http.status_code",a),o.setAttribute("copilot_api.model",i),o.setAttribute("copilot_api.streaming",s),o.setAttribute("copilot_api.duration_ms",l),ai(o),n?._d1&&o.setAttribute("copilot_api.copilot_duration_ms",n._d1),n?.tokenUsage){let e=n.tokenUsage;o.setAttribute("copilot_api.input_tokens",e.inputTokens),o.setAttribute("copilot_api.output_tokens",e.outputTokens),o.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&o.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let r=t.toLowerCase();_t.has(r)||o.setAttribute(`http.response.header.${r}`,e)}),a>=400&&o.setStatus({code:p.ERROR,message:`HTTP ${a}`})}(e)}catch(e){r.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:r,method:o,path:n,endpointType:a,requestId:i}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-r),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:o,path:n,status_code:String(c),model:u,streaming:String(p),endpoint_type:a};if(Le.add(1,d),ot.record(s,d),c>=400&&Be.add(1,{method:o,path:n,status_code:String(c),error_type:c>=500?"server_error":"client_error"}),l?.tokenUsage){let e=l.tokenUsage,t={model:u,endpoint_type:a};e.inputTokens&&(Fe.add(e.inputTokens,t),ut.record(e.inputTokens,t)),e.outputTokens&&(Ue.add(e.outputTokens,t),pt.record(e.outputTokens,t)),e.cachedTokens&&He.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&Oe.executeCompletion(i)}(e)}catch(e){r.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}Oe.completionCallbacks.delete(e.requestId)}const si=3e4,li=12e4,ci=2e3,ui=new WeakMap,pi=(e,t)=>{if(!e)return Promise.resolve();let r=ui.get(e);return r||(r=di(e,t),ui.set(e,r)),r},di=async(e,{read:t,limit:r,declared:o,deadline:n=performance.now()+li})=>{let a,i=t;try{for(;;){void 0===a&&(i>r||void 0!==o&&i>o)&&(a=performance.now()+ci);let t=Math.min(n,a??n),s=Math.min(si,t-performance.now());if(s<=0)return void await mi(e);let l=await fi(e,s);if("timeout"===l)return void await mi(e);if(l.done)return;i+=l.value.byteLength}}catch{}},mi=async e=>{let t;try{await Promise.race([e.cancel().catch(()=>{}),new Promise(e=>{t=setTimeout(e,1e3)})])}finally{clearTimeout(t)}},fi=async(e,t)=>{let r;try{return await Promise.race([e.read(),new Promise(e=>{r=setTimeout(()=>e("timeout"),t)})])}finally{clearTimeout(r)}};let hi=0;const gi=()=>{if(hi>=(()=>{let e=Number(process.env.COPILOT_API_IMAGES_MAX_DRAINS);return Number.isFinite(e)&&e>=0?Math.floor(e):8})())return;hi++;let e=!1;return{start:t=>{e||(e=!0,qa(()=>{yi(t())}))}}},yi=e=>{e.catch(()=>{}).finally(()=>{hi--})},_i=e=>{let t=gi();return t?.start(e),void 0!==t},wi=(e,t,r)=>{let{body:o}=e;return!(o&&!o.locked)||((e,t)=>ui.has(e)||_i(()=>pi(e,t)))(o.getReader(),{read:0,limit:t,declared:r})},bi=e=>e.includes("/images/edits")?104857600:33554432,vi=e=>new Promise((t,r)=>{let o=()=>r(new DOMException("The client closed the request.","AbortError"));e?.aborted?o():e?.addEventListener("abort",o,{once:!0})}),ki=async e=>{if(!se())return Ne.startActiveSpan("copilot_api.approval.await",async t=>{let o=performance.now();try{let n,a=r.prompt("Accept incoming request?",{type:"confirm"});try{n=await Promise.race([a,vi(e)])}catch(r){throw e?.aborted&&(t.setAttribute("copilot_api.approval.result","aborted"),Qe.add(1,{result:"aborted"})),r}let i=performance.now()-o;if(t.setAttribute("copilot_api.approval.wait_duration_ms",i),mt.record(i),!n)throw t.setAttribute("copilot_api.approval.result","rejected"),Qe.add(1,{result:"rejected"}),new mr("Request rejected",Response.json({message:"Request rejected"},{status:403}));t.setAttribute("copilot_api.approval.result","approved"),Qe.add(1,{result:"approved"})}finally{t.end()}})};async function xi(e){if(mo(he)||await Cn())return null;let t=xn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${An()}`,type:"authentication_error"}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function Ti(e){let t=e.prompt_tokens||0,r=e.completion_tokens||0;return{inputTokens:t,outputTokens:r,totalTokens:e.total_tokens||t+r,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function Ai(e,t){e.setAttributes(function(e){let t={};void 0!==e.prompt_tokens&&(t["copilot_api.input_tokens"]=e.prompt_tokens),void 0!==e.completion_tokens&&(t["copilot_api.output_tokens"]=e.completion_tokens),void 0!==e.total_tokens&&(t["copilot_api.total_tokens"]=e.total_tokens);let r=e.prompt_tokens_details?.cached_tokens;return void 0!==r&&(t["copilot_api.cached_tokens"]=r),t}(t))}var Si=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function $i(e){if(!e||"string"!=typeof e)throw new Si("Model name is required and must be a string");if("foundry"===he.provider)return e;if(!he.models?.data)throw new Si("Models not available. Please try again later.",503);let t=he.models.data.map(e=>e.id);if(t.includes(e))return e;let r=Po(e,t);if(!r)throw Je.add(1,{requested_model:e}),new Si(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return r}function Ei(e){let t=he.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===he.provider?wo(e):/gpt-[\d.]+-codex/i.test(e)}async function Oi(e){if(void 0===e.rateLimitSeconds||se())return;let t=e.rateLimitSeconds;return Ne.startActiveSpan("copilot_api.rate_limit.check",async o=>{try{let n=Date.now();if(o.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=n,void o.setAttribute("copilot_api.rate_limit.action","allowed");let a=(n-e.lastRequestTimestamp)/1e3;if(o.setAttribute("copilot_api.rate_limit.elapsed_seconds",a),a>t)return e.lastRequestTimestamp=n,void o.setAttribute("copilot_api.rate_limit.action","allowed");let i=Math.ceil(t-a);if(o.setAttribute("copilot_api.rate_limit.wait_seconds",i),!e.rateLimitWait)throw o.setAttribute("copilot_api.rate_limit.action","rejected"),ze.add(1,{action:"rejected",source:"local"}),r.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new mr("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;o.setAttribute("copilot_api.rate_limit.action","waited"),ze.add(1,{action:"waited",source:"local"}),it.record(s,{source:"local"}),r.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await un(s),e.lastRequestTimestamp=n,r.info("Rate limit wait completed, proceeding with request")}finally{o.end()}})}var Ci=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Ii(e){if(e instanceof Ci)return{type:e.type,message:e.message};if(e instanceof mr){let t=e.response.status;return{type:529===t?"overloaded_error":`upstream_error_${t}`,message:`Upstream error (${t}) while streaming response`}}return{type:"api_error",message:"Stream interrupted before completion"}}async function Ri(e,t){let{type:o,message:n}=Ii(t);try{await e.writeSSE({event:"error",data:JSON.stringify({type:"error",error:{type:o,message:n}})})}catch(e){r.debug("Failed to emit Anthropic stream error frame:",e)}}async function Pi(e,t){let{type:o,message:n}=Ii(t);try{await e.writeSSE({event:"error",data:JSON.stringify({error:{message:n,type:o}})})}catch(e){r.debug("Failed to emit OpenAI stream error frame:",e)}}function qi(e){if("number"==typeof e){if(!Number.isFinite(e))return null;let t=Math.floor(e);return t>0?t:null}if("string"==typeof e){let t=e.trim();if(!t)return null;let r=Number(t);if(!Number.isFinite(r))return null;let o=Math.floor(r);return o>0?o:null}return null}function Mi(e,t,r){return Math.min(Math.max(e,t),r)}function Ni(e,t=0){if(t>5||!e||"object"!=typeof e)return null;let r=e.error;if(!r||"object"!=typeof r)return null;let o=r.code;if("string"==typeof o)return o;let n=r.message;if("string"!=typeof n)return null;try{return Ni(JSON.parse(n),t+1)}catch{return null}}function ji(e,t){let r=e?.data.find(e=>e.id===t);if(!r)return null;let o=qi(r.capabilities.supports.min_thinking_budget),n=qi(r.capabilities.supports.max_thinking_budget);return!o||!n||n<=o?null:{bounds:{min:o,max:n-1},maxOutputTokens:qi(r.capabilities.limits?.max_output_tokens)??void 0}}function Di(e){let{config:t}=e,r=t.bounds.min,o=t.bounds.max,n=Mi(qi(e.requestedBudget)??r,r,o),a=qi(e.maxTokens);if(a||=n+1,t.maxOutputTokens&&a>t.maxOutputTokens&&(a=t.maxOutputTokens),a<=n){let e=Math.min(n,a-1);if(e>=r)n=e;else{let e=r+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:a};a=e,n=r}}return a<=n?{thinkingBudget:null,maxTokens:a}:{thinkingBudget:n,maxTokens:a}}function Li(e,t){if(pn(e.thinking_budget))return e;let r=ji(t,e.model);if(!r)return{...e,thinking_budget:void 0};let o=Di({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:r});return null===o.thinkingBudget?{...e,max_tokens:o.maxTokens,thinking_budget:void 0}:{...e,max_tokens:o.maxTokens,thinking_budget:o.thinkingBudget}}function Bi(e){return"invalid_thinking_budget"===Ni(e)}async function Fi(e){let{payload:t,error:r,models:o,errorBodyText:n}=e;if(pn(t.thinking_budget)||!(r instanceof Error))return null;let a,i,s=r;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==n)a=n;else try{a=await s.response.clone().text()}catch{return null}try{i=JSON.parse(a)}catch{return null}if(!Bi(i))return null;let l=ji(o,t.model);return l?function(e,t){let r=Di({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:t});if(null===r.thinkingBudget)return{...e,max_tokens:r.maxTokens,thinking_budget:void 0};let o=r.thinkingBudget,n=qi(e.thinking_budget);if(n&&n===r.thinkingBudget){let e=o+1;e<=t.bounds.max&&(!r.maxTokens||e<r.maxTokens)&&(o=e)}let a=r.maxTokens;if((!a||a<=o)&&(a=o+1),t.maxOutputTokens&&a>t.maxOutputTokens){if(!(t.maxOutputTokens>o))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};a=t.maxOutputTokens}return{...e,max_tokens:a,thinking_budget:o}}(t,l):{...t,thinking_budget:void 0}}function Ui(e,t){let r=!1;return()=>{if(r)return;r=!0;let o=e.get("requestData")||{};o.upstreamTtfbMs=performance.now()-t,e.set("requestData",o)}}function Hi(e,t){let r=e.get("requestData")||{};r.upstreamTotalMs=performance.now()-t,r._d1=r.upstreamTotalMs,e.set("requestData",r)}const zi=new Map,Ji=new Map,Gi=new Set;let Ki,Wi,Yi;function Vi(e){return!e.closed&&!e.destroyed}function Xi(e){r.debug(`Creating HTTP/2 client for ${e}`);let t=new I(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return zi.set(t,Date.now()),tt.add(1,{event:"created",origin:e}),ft(w.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{r.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{r.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(o,n,a)=>{r.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=Gi.has(t);tt.add(1,{event:"goaway",origin:e}),ft(i?w.WARN:w.DEBUG,i?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),Ji.delete(t),Gi.delete(t),zi.delete(t),Vi(t)&&t.close().catch(e=>{r.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Zi(e,t){if(!he.connectivity.h2)return;if(Ki&&Ki!==e&&function(){for(let e of[...Ji.keys(),...Gi])Vi(e)&&e.close().catch(e=>{r.debug("Error closing HTTP/2 pool entry:",e)});Ji.clear(),Gi.clear(),zi.clear()}(),Ki=e,t?.fresh){let t=Xi(e);return Gi.add(t),t}let o=Date.now();for(let[t]of Ji)if(o-(zi.get(t)??0)>=6e5)Ji.delete(t),zi.delete(t),Vi(t)&&t.close().catch(e=>{r.debug("Error closing rotated HTTP/2 client:",e)}),tt.add(1,{event:"rotated",origin:e}),ft(w.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Vi(t))return Ji.delete(t),Gi.add(t),t;Ji.delete(t),zi.delete(t)}let n=Xi(e);return Gi.add(n),n}function Qi(e){e&&Gi.delete(e)&&(Vi(e)?Ji.set(e,Date.now()):zi.delete(e))}function es(){Yi||(Yi=setInterval(()=>{!function(){let e=Date.now(),t=he.connectivity.h2Keepalive,o=Ji.size;for(let[n,a]of Ji)e-a<6e4||t&&o<=1||(Ji.delete(n),zi.delete(n),o--,Vi(n)&&n.close().catch(e=>{r.debug("Error closing idle HTTP/2 client:",e)}),tt.add(1,{event:"idle_reaped",origin:Ki??""}),ft(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${Ki}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Ki??""}))}()},3e4),Yi.unref())}function ts(){Wi||(r.debug("Starting HTTP/2 keepalive (every 45s)"),Wi=setInterval(()=>{(async function(){if(0===Ji.size&&0===Gi.size){if(Ki){let e=Xi(Ki);Ji.set(e,Date.now())}return}let e=[...Ji.keys()];for(let t of e)Ji.delete(t);await Promise.allSettled(e.map(async e=>{if(Vi(e))try{let{statusCode:t,body:o}=await e.request({path:"/models",method:"GET",headers:Ct(he)});await o.dump(),et.add(1,{result:"success"}),r.debug(`HTTP/2 keepalive: GET /models → ${t}`),Ji.set(e,Date.now())}catch(t){et.add(1,{result:"error"}),r.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),tt.add(1,{event:"error",origin:Ki??""}),zi.delete(e),Vi(e)&&e.close().catch(e=>{r.debug("Error closing broken HTTP/2 client:",e)})}else zi.delete(e)}))})().catch(e=>{r.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Wi.unref(),es())}function rs(e,t){if(e instanceof ReadableStream)return new Response(e,t);let r,o=new ReadableStream({async pull(t){r??=e[Symbol.asyncIterator]();let o=await r.next();o.done?t.close():t.enqueue(o.value)},cancel(t){e.on("error",()=>{}),e.destroy(t instanceof Error?t:void 0)}});return new Response(o,t)}async function*os(e,t){try{yield*K(e)}finally{ns(t)}}function ns(e){e instanceof ReadableStream||e.destroyed||(e.on("error",()=>{}),e.destroy())}function as(e){return e.max_completion_tokens??e.max_tokens}async function is(e,t,r){try{if(!e.ok)throw new mr("Failed to create chat completions",e,{outgoingBody:r.outgoingBody,outgoingHeaders:r.outgoingHeaders});let o=await e.json();return o.id&&t.setAttribute("copilot_api.response.id",o.id),o.usage&&Ai(t,o.usage),o}catch(e){throw ht(t,e),e}finally{t.end()}}const ss=e=>lo(he)?e:function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...r}=e;return null==t?r:{...r,max_tokens:t}}let{max_tokens:r,max_completion_tokens:o,stop:n,...a}=e,i=as(e);return null==i?a:{...a,max_completion_tokens:i}}(e,he.models),ls=e=>lo(he)?e:Aa(e),cs=async(e,t)=>{let o=ls(e),n=t?.signal;try{return await ds(o,n)}catch(e){if(e instanceof mr&&401===e.response.status){if(!await Zr(e))throw e;return ds(o,n)}let t;if(e instanceof mr)try{t=await e.response.clone().text()}catch{t=void 0}let a=await Fi({payload:o,error:e,models:he.models,errorBodyText:t});if(a)return e instanceof mr&&void 0!==t&&r.warn(`Upstream rejected thinking_budget (status ${e.response.status}): ${t.slice(0,500)}`),r.warn("Adjusting thinking_budget payload and retrying once..."),await ds(ls(a),n);throw e}},us=async(e,t)=>{let r=Ko(e);return r?(t.setAttribute("copilot_api.foundry.throttled_stream",!0),t.setAttribute("copilot_api.upstream.effective_status",429),t.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(e.body?.cancel()),t.end(),r):(e.ok||t.end(),e.ok?void 0:e)};function ps(e,t){let r=()=>t.abort(e?.reason);return e?.aborted?r():e?.addEventListener("abort",r,{once:!0}),()=>e?.removeEventListener("abort",r)}async function ds(e,t){if(!mo(he))throw Error("Service token not found");let r=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),o=e.messages.some(e=>["assistant","tool"].includes(e.role)),n={...po(he,r),"X-Initiator":o?"agent":"user"},a=uo(he),i=`${a}/chat/completions`,s=he.timeoutMs,l=ss(e),c=JSON.stringify(l),u={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":s,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":as(e)??0,"copilot_api.vision_enabled":r,"copilot_api.initiator":o?"agent":"user","copilot_api.upstream.provider":he.provider};for(let r=0;r<=1;r++){me();let o=Zi(a,{fresh:r>0}),l=new AbortController,p=Yo(l,s),d=ps(t,l);try{let{statusCode:t,headers:a,body:d,span:m}=await vt({spanName:"copilot POST /chat/completions",url:i,target:"chat_completions",headers:n,body:c,signal:l.signal,headersTimeout:s,bodyTimeout:3*s,extraAttributes:{...u,"copilot_api.h2.retry_attempt":r},dispatcher:o}).finally(p.headersArrived),f=rs(d,{status:t,headers:a});if(e.stream){let e=await us(f,m);if(e)throw new mr("Failed to create chat completions",e,{outgoingBody:c,outgoingHeaders:n});return{events:os(f,d),span:m,release:()=>Qi(o)}}try{return await is(f,m,{outgoingBody:c,outgoingHeaders:n})}finally{Qi(o)}}catch(e){if(Qi(o),await dr(e,{attempt:r,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{p.clear(),d()}}throw Error("Unexpected: exhausted GOAWAY retries without result")}const ms=new Map;const fs=["none","minimal","low","medium","high","xhigh","max"];function hs(e,t){if(!e.reasoning)return e;if(0===t.length){let{reasoning:t,...r}=e;return r}let r=e.reasoning.effort;if(!r)return e;let o=function(e,t){if(t.includes(e))return e;let r=fs.indexOf(e);if(-1===r)return t[0];let o,n=1/0;for(let e of t){let t=fs.indexOf(e);if(-1===t)continue;let a=Math.abs(t-r);a<n&&(n=a,o=e)}return o??t[0]}(r,t);return o&&o!==r?{...e,reasoning:{...e.reasoning,effort:o}}:e}function gs(e,t){if(!e.reasoning)return null;let o=function(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}let{param:r,code:o,message:n=""}=t.error??{};if("reasoning.effort"===r||"reasoning"===r){if("unsupported_value"===o){let e=[...(/Supported values are:(.*)$/i.exec(n)?.[1]??"").matchAll(/\x27([^\x27]+)\x27/g)].map(e=>e[1]);return e.length>0?{kind:"unsupported_value",supported:e}:void 0}if("unsupported_parameter"===o)return{kind:"unsupported_parameter"}}}(t);if(!o)return null;let n="unsupported_value"===o.kind?o.supported:[];ms.set(e.model,n);let a=hs(e,n);return a===e?null:(r.debug(`Foundry rejected reasoning.effort=${e.reasoning.effort} on ${e.model}; retrying with ${a.reasoning?.effort??"no reasoning"}`),a)}async function ys(e,t,r){try{if(!e.ok)throw new mr("Failed to create responses",e,{outgoingBody:r.outgoingBody,outgoingHeaders:r.outgoingHeaders});let o=await e.json();return o.id&&t.setAttribute("copilot_api.response.id",o.id),o.usage&&Ai(t,{prompt_tokens:o.usage.input_tokens,completion_tokens:o.usage.output_tokens,total_tokens:o.usage.total_tokens,prompt_tokens_details:o.usage.input_tokens_details}),o}catch(e){throw ht(t,e),e}finally{t.end()}}const _s=async(e,t)=>{let r=lo(he),o=r?function(e){let t=ms.get(e.model);return t?hs(e,t):e}(e):e,n=!1,a=!1;for(;;)try{return t?.onAttempt?.(o),await bs(o,t?.signal)}catch(e){if(!(e instanceof mr))throw e;if(401===e.response.status&&!n){if(n=!0,!await Zr(e))throw e;continue}if(r&&400===e.response.status&&!a){a=!0;let t=gs(o,await e.response.clone().text().catch(()=>{}));if(t){o=t;continue}}throw e}};function ws(e,t){let r,o=()=>{r?.destroy(e?.reason),t.abort(e?.reason)};return e?.aborted?o():e?.addEventListener("abort",o,{once:!0}),{attach:e=>r=e,dispose:()=>e?.removeEventListener("abort",o)}}const bs=async(e,t)=>{if(!mo(he))throw Error("Service token not found");let r=lo(he)?e:Aa(e),o={...po(he),"X-Initiator":"agent"},n=uo(he),a=`${n}/responses`,i=he.timeoutMs,s=JSON.stringify(r),l=((e,t)=>({"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":t,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.max_output_tokens":e.max_output_tokens??0,"copilot_api.api_type":"responses","copilot_api.upstream.provider":he.provider}))(r,i);for(let e=0;e<=1;e++){me();let c=Zi(n,{fresh:e>0}),u=new AbortController,d=Yo(u,i),m=ws(t,u);try{let{statusCode:t,headers:n,body:f,span:h}=await vt({spanName:"copilot POST /responses",url:a,target:"responses",headers:o,body:s,signal:u.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:c}).finally(d.headersArrived);m.attach(f);let g=rs(f,{status:t,headers:n});if(r.stream){let e=Ko(g);if(e&&(h.setAttribute("copilot_api.foundry.throttled_stream",!0),h.setAttribute("copilot_api.upstream.effective_status",429),h.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(g.body?.cancel())),!g.ok||e)throw h.end(),new mr("Failed to create responses",e??g,{outgoingBody:s,outgoingHeaders:o});return{events:os(g,f),span:h,release:()=>{m.dispose(),Qi(c)}}}try{return await ys(g,h,{outgoingBody:s,outgoingHeaders:o})}finally{m.dispose(),Qi(c)}}catch(t){if(m.dispose(),Qi(c),await dr(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{d.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},vs=e=>Object.hasOwn(e,"output");function ks(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens,...t.input_tokens_details&&{prompt_tokens_details:{cached_tokens:t.input_tokens_details.cached_tokens}},...t.output_tokens_details&&{completion_tokens_details:{reasoning_tokens:t.output_tokens_details.reasoning_tokens}}}:null}var xs=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,r=null){super(e),this.code=t,this.param=r}};const Ts=new Set(["model","messages","max_tokens","max_completion_tokens","temperature","top_p","stream","stream_options","tools","tool_choice","parallel_tool_calls","user","reasoning_effort","response_format"]);function As(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new xs(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new xs(`logprobs is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","logprobs")}(e);let t=function(e){return e.filter(e=>"system"===e.role||"developer"===e.role).map(e=>$s(e.content)).filter(Boolean).join("\n\n")||void 0}(e.messages),r=function(e){let t=[];for(let r of e)switch(r.role){case"user":{let e=Es(r.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=$s(r.content);e&&t.push({type:"message",role:"assistant",content:[{type:"output_text",text:e}]});for(let e of r.tool_calls??[])t.push({type:"function_call",call_id:e.id,name:e.function.name,arguments:e.function.arguments});break}case"tool":t.push({type:"function_call_output",call_id:r.tool_call_id??"",output:$s(r.content)})}return t}(e.messages);if(0===r.length)throw new xs("request has no translatable message content","invalid_request","messages");let o={model:e.model,input:r,store:!1};t&&(o.instructions=t);let n=e.max_completion_tokens??e.max_tokens;"number"==typeof n&&(o.max_output_tokens=Math.max(n,16)),e.stream&&(o.stream=!0),Ss(e.temperature)&&(o.temperature=e.temperature),Ss(e.top_p)&&(o.top_p=e.top_p),Ss(e.parallel_tool_calls)&&(o.parallel_tool_calls=e.parallel_tool_calls),Ss(e.user)&&(o.user=e.user),e.reasoning_effort&&(o.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(o.tools=e.tools.filter(e=>"function"===e.type).map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters}))),e.tool_choice&&(o.tool_choice="string"==typeof e.tool_choice?e.tool_choice:{type:"function",name:e.tool_choice.function.name});let a=function(e){if(e)switch(e.type){case"json_schema":{let{name:t,description:r,schema:o,strict:n}=e.json_schema;return{type:"json_schema",name:t,description:r,schema:o,strict:n}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return a&&(o.text={format:a}),o}function Ss(e){return null!=e}function $s(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Es(e){if("string"==typeof e)return e?[{type:"input_text",text:e}]:[];let t=[];for(let r of e??[])if("text"===r.type)r.text&&t.push({type:"input_text",text:r.text});else{if("image_url"!==r.type)throw new xs(`content part type '${r.type}' is not supported for models served via the Responses API`,"unsupported_content_type","messages");t.push({type:"input_image",image_url:r.image_url.url,detail:"low"===r.image_url.detail?"low":"high"})}return t}function Os(e){let t={prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens};return void 0!==e.input_tokens_details?.cached_tokens&&(t.prompt_tokens_details={cached_tokens:e.input_tokens_details.cached_tokens}),void 0!==e.output_tokens_details?.reasoning_tokens&&(t.completion_tokens_details={reasoning_tokens:e.output_tokens_details.reasoning_tokens}),t}function Cs(e,t){if("incomplete"===e.status){let t=e.incomplete_details?.reason;if("content_filter"===t)return"content_filter";if("max_output_tokens"===t)return"length"}return t?"tool_calls":"stop"}function Is(e,t,r=null){let o=e.roleSent?t:{role:"assistant",...t};return e.roleSent=!0,{id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[{index:0,delta:o,logprobs:null,finish_reason:r}]}}function Rs(e,t,r){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(r)}function Ps(e,t){let r=e.item;if("function_call"!==r.type)return[];let o="response.output_item.done"===e.type,n=Rs(t,r.id,e.output_index);if(void 0!==n)return o&&!t.toolCallsWithArgs.has(n)&&r.arguments?(t.toolCallsWithArgs.add(n),[Is(t,{tool_calls:[{index:n,function:{arguments:r.arguments}}]})]):[];let a=function(e,t,r){let o=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,o),e.toolCallIndexByOutputIndex.set(r,o),o}(t,r.id,e.output_index),i=o?r.arguments:"";return i&&t.toolCallsWithArgs.add(a),[Is(t,{tool_calls:[{index:a,id:r.call_id,type:"function",function:{name:r.name,arguments:i}}]})]}function qs(e,t){let r=[Is(e,{},Cs(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:o,...n}=Os(t.usage);r.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:n})}return r}function Ms(e,t){switch(e.type){case"response.created":case"response.in_progress":return t.id=e.response.id||t.id,t.model=e.response.model||t.model,e.response.created_at&&(t.created=e.response.created_at),{chunks:[]};case"response.output_text.delta":case"response.refusal.delta":return e.delta?{chunks:[Is(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Ps(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let r=Rs(t,e.item_id,e.output_index);return void 0!==r&&e.delta?(t.toolCallsWithArgs.add(r),{chunks:[Is(t,{tool_calls:[{index:r,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:qs(t,e.response),done:!0};case"response.failed":return{chunks:[],error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}};case"error":return{chunks:[],error:{type:e.code??"api_error",message:e.message??"Response generation failed"}};default:return{chunks:[]}}}const Ns="openai_responses";function js(e){let t=performance.now(),o=Ne.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),As(e)}finally{t.end()}});st.record(performance.now()-t,{direction:"openai_to_responses"});let n=function(e){return Object.entries(e).filter(([e,t])=>!Ts.has(e)&&null!=t).map(([e])=>e)}(e);return n.length>0&&r.debug(`Dropped chat-only fields with no Responses API equivalent: ${n.join(", ")}`),o}function Ds(e){let t=performance.now(),r=Ne.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",r=!1,o=[];for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type?(t+=e.text,r=!0):"refusal"===e.type&&(t+=e.refusal,r=!0);else"function_call"===n.type&&o.push({id:n.call_id,type:"function",function:{name:n.name,arguments:n.arguments}});let n={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:r?t:null,...o.length>0&&{tool_calls:o}},logprobs:null,finish_reason:Cs(e,o.length>0)}]};return e.usage&&(n.usage=Os(e.usage)),n}(e)}finally{t.end()}});return st.record(performance.now()-t,{direction:"responses_to_openai"}),r}function Ls(e,t,n){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...r}=Os(t.usage);a.tokenUsage=Ti(r)}return a._d1=n,a.upstreamTtfbMs=n,a.upstreamTotalMs=n,e.set("requestData",a),r.level>=o.debug&&r.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(Ds(t))}async function Bs(e,t,o){let n;try{n=js(t)}catch(t){if(t instanceof xs)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}r.debug("Translated chat → Responses API payload:",JSON.stringify(n).slice(-400)),e.set("requestData",{model:n.model,streaming:!!n.stream}),he.manualApprove&&!o.isSelfTest&&await ki();let a=await xi(e);if(a)return a;let i=performance.now(),s=await _s(n),l=performance.now()-i;if(nt.record(l,{model:n.model,target:"responses",streaming:String(!!n.stream)}),vs(s))return Ls(e,s,l);let{events:c,span:u,release:p}=s,d=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:n.model,includeUsage:!0===t.stream_options?.include_usage});return G(e,async t=>{let o=null,a=0,s=performance.now(),m=Ui(e,i);try{try{for await(let i of c){if(m(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){r.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Ze.add(1,{model:n.model,endpoint_type:Ns});let c=ks(s);if(c){o=c;let t=e.get("requestData")||{};t.tokenUsage=Ti(c),t._d1=l,e.set("requestData",t)}let u=Ms(s,d);if(u.error)throw new Ci(u.error.type,u.error.message);for(let e of u.chunks)await t.writeSSE({data:JSON.stringify(e)});u.done&&await t.writeSSE({data:"[DONE]"})}let u={model:n.model,endpoint_type:Ns};at.record(performance.now()-s,u),dt.record(a,u),Hi(e,i)}catch(r){throw gt(u,e.get("requestSpan"),r),await Pi(t,r),r}finally{o&&Ai(u,o),u.end(),p()}let f=e.get("requestId");f&&Oe.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Fs(e,t){if(!e.data)return e;try{let r=JSON.parse(e.data);if(r.usage&&t(r.usage),void 0!==r.usage?.prompt_tokens_details?.cached_tokens)return{...e,data:JSON.stringify({...r,usage:{...r.usage,prompt_tokens_details:void 0}})}}catch(t){r.warn("Failed to parse streaming chunk:",e.data.slice(0,200),t)}return e}async function Us(e){let t=!0===e.get("isSelfTest");t||await Oi(he);let o=await e.req.json();r.debug("Request payload:",JSON.stringify(o).slice(-400));try{o=function(e){return Ne.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let o=$i(e.model);return t.setAttribute("copilot_api.model.normalized",o),o===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ge.add(1,{from_model:e.model,to_model:o}),r.debug(`Normalized model from '${e.model}' to '${o}'`),{...e,model:o})}finally{t.end()}})}(o)}catch(t){if(t instanceof Si)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(Ei(o.model))return Bs(e,o,{isSelfTest:t});e.set("requestData",{model:o.model,streaming:!!o.stream}),he.manualApprove&&!t&&await ki(),"foundry"!==he.provider&&(o=function(e){if(!pn(e.max_completion_tokens)){let{max_completion_tokens:t,...r}=e;return{...r,max_tokens:t}}if(!pn(e.max_tokens))return e;let t=(he.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return r.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(o),o=Li(o,he.models)),pn(o.thinking_budget)||r.debug("Normalized thinking_budget to:",JSON.stringify(o.thinking_budget));let n=await xi(e);if(n)return n;let a=performance.now(),i=await cs(o),s=performance.now()-a;if(nt.record(s,{model:o.model,target:"chat_completions",streaming:String(!!o.stream)}),Hs(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Ti(i.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),r.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return G(e,async t=>{let r={value:null},n=0,i=performance.now(),p=Ui(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(n++,Ze.add(1,{model:o.model,endpoint_type:"openai"}),i=Fs(a,t=>{r.value=t;let o=e.get("requestData")||{};o.tokenUsage=Ti(t),o._d1=s,e.set("requestData",o)})),await t.writeSSE(i)}let c=performance.now()-i,u={model:o.model,endpoint_type:"openai"};if(at.record(c,u),dt.record(n,u),Hi(e,a),r.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Ti(r.value),t._d1=s,e.set("requestData",t))}}catch(r){throw gt(c,e.get("requestSpan"),r),await Pi(t,r),r}finally{r.value&&Ai(c,r.value),c.end(),u()}let d=e.get("requestId");d&&Oe.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Hs=e=>Object.hasOwn(e,"choices"),zs=new B;zs.post("/",async e=>{try{return await cn(e,"chat",Us)}catch(t){return await jr(e,t)}});const Js=async e=>{if(!mo(he))throw Error("Service token not found");let t=`${uo(he)}/embeddings`,r=po(he),o=he.timeoutMs,n=new AbortController,a=hr(n,o),i=JSON.stringify(e);try{let{response:o,span:a}=await bt({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:r,body:i,signal:n.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1,"copilot_api.upstream.provider":he.provider}});try{if(!o.ok)throw new mr("Failed to create embeddings",o,{outgoingBody:i,outgoingHeaders:r});return await o.json()}catch(e){throw ht(a,e),e}finally{a.end()}}finally{clearTimeout(a)}},Gs=new B;Gs.post("/",async e=>{try{let t=await e.req.json();try{t.model=$i(t.model)}catch(t){if(t instanceof Si)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let r=await xi(e);if(r)return r;let o=performance.now(),n=await(async e=>{try{return await Js(e)}catch(t){if(t instanceof mr&&401===t.response.status){if(!await Zr(t))throw t;return Js(e)}throw t}})(t),a=performance.now()-o;nt.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Ti(n.usage),i._d1=a,e.set("requestData",i),e.json(n)}catch(t){return await jr(e,t)}});const Ks=new B;let Ws=null,Ys=null;Ks.get("/",async e=>{let t,r=function(){if(lo(he)){if(!mo(he))return"missing";let e=he.foundry?.bearerExpiresAt;return void 0!==e&&e<=Date.now()?"expired":"valid"}let e=he._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let r=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),o=JSON.parse(atob(r)),n="object"==typeof o&&o&&"exp"in o&&"number"==typeof o.exp?o.exp:void 0;return void 0!==n&&1e3*n<Date.now()?"expired":"valid"}catch{return"expired"}}(),o=await async function(){let e=Date.now(),t=Ws;return t&&e-t.timestamp<3e4?{result:t.result}:Ys||(Ys=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),r=performance.now();try{let t=`${uo(he)}/models`,o=await fetch(t,{method:"GET",headers:po(he),signal:e.signal}),n=Math.round(performance.now()-r),a=o.ok?"reachable":"unreachable";return Ws={result:a,timestamp:Date.now()},{result:a,latencyMs:n}}catch{let e=Math.round(performance.now()-r);return Ws={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),Ys=null}})(),Ys)}();t="valid"===r&&"reachable"===o.result?"ok":"valid"!==r&&"reachable"!==o.result?"unhealthy":"degraded";let n={status:t,copilot_token:r,upstream:o.result,version:"0.46.0",timestamp:(new Date).toISOString()};void 0!==o.latencyMs&&(n.upstream_latency_ms=o.latencyMs);let a="ok"===t?200:503;return e.json(n,a)});var Vs=class extends Error{upstream;constructor(e){super("Copilot rejected the token for a streamed image upload"),this.upstream=e,this.name="ImagesRetryLaterError"}};const Xs=e=>"object"==typeof e&&"chunks"in e,Zs=async()=>{let e=(e=>{let t=e&&/(?:^|;)exp=(\d+)/.exec(e)?.[1];return t?1e3*Number(t):void 0})(he._t1);void 0!==e&&e-Date.now()<3e5&&await Zr()},Qs=async(e,t,r)=>{let{status:o}=e.response;if(401===o&&!t.refreshed){if(t.refreshed=!0,!await Zr(e))throw e;if(!t.replayable)throw new Vs(e);return}if(429!==o||!t.replayable)throw e;let n=(e=>{let t=Number(e.headers.get("retry-after-ms"));if(Number.isFinite(t)&&t>0)return t;let r=e.headers.get("retry-after")??"",o=Number(r);if(r&&Number.isFinite(o)&&o>0)return 1e3*o;let n=Date.parse(r)-Date.now();return Number.isFinite(n)&&n>0?n:1e3})(e.response)+250*Math.random();if(t.attempts>=3||Date.now()-t.start+n>Math.min(1e4,he.timeoutMs))throw e;t.attempts++,await((e,t)=>new Promise((r,o)=>{if(t?.aborted)return void o(t.reason);let n=()=>{clearTimeout(a),o(t?.reason)},a=setTimeout(()=>{t?.removeEventListener("abort",n),r()},e);t?.addEventListener("abort",n,{once:!0})}))(n,r)},el=async(e,t,r)=>{if(!mo(he))throw Error("Service token not found");let o=`${uo(he)}/v1/images/${e.operation}`,n=new AbortController,a=rl(n,t),{body:i,length:s}=ol(e.body,n.signal,a),l=e.model?void 0:e.lateModel,c=tl(e.contentType,s),{release:u}=a,p=!1;try{let s=await vt({spanName:`copilot POST /v1/images/${e.operation}`,url:o,target:"images",method:"POST",headers:c,body:i,signal:n.signal,headersTimeout:he.timeoutMs,bodyTimeout:he.timeoutMs,extraAttributes:{...e.model&&{"copilot_api.model":e.model},"copilot_api.upstream.provider":he.provider}}),{span:d}=s;s.body instanceof ReadableStream||a.attachBody(s.body);try{let o=il(s);if(!o.ok){let t=await o.text();throw new mr(`Failed to create image ${e.operation}`,new Response(t,{status:o.status,statusText:o.statusText,headers:o.headers}),{outgoingHeaders:c})}let n=o.headers.get("content-type")??"application/json",{stream:i,fail:m}=cl(o.body,(e,r,o)=>{void 0!==e&&(!o&&!t?.aborted)&&ht(d,e);let n=l?.();n&&d.setAttribute("copilot_api.model",n),void 0!==r&&d.setAttribute("copilot_api.images.total_nano_aiu",r),d.end(),u()},r);return a.onAbort(m),p=!0,{contentType:n,body:i}}catch(e){throw ht(d,e),e}finally{if(!p){let e=l?.();e&&d.setAttribute("copilot_api.model",e),d.end()}}}finally{p||u()}},tl=(e,t)=>({...po(he),"Content-Type":e,...void 0!==t&&{"Content-Length":String(t)},"accept-encoding":"identity"}),rl=(e,t)=>{let r,o,n=1,a=t=>{o?.(t),r?.on("error",()=>{}),r?.destroy(t),e.abort(t)},i=setTimeout(()=>a(new fr(he.timeoutMs)),he.timeoutMs),s=()=>a(t?.reason);return t?.aborted?s():t?.addEventListener("abort",s,{once:!0}),{hold:()=>{n++},release:()=>{--n>0||(clearTimeout(i),t?.removeEventListener("abort",s))},attachBody:e=>{r=e},onAbort:e=>{o=e}}},ol=(e,t,r)=>{if("string"==typeof e)return{body:e,length:P.byteLength(e)};if(Xs(e)){e.progress?.();let o=W.from(async function*({chunks:e,rest:t,progress:r}){if(null===t)yield*e;else{for(let t=0;t<e.length;t++){let o=e[t];e[t]=nl,yield o,r?.()}e.length=0,yield*t}}(e),{objectMode:!1}),{rest:n}=e;r.hold();let a=!1,i=()=>{a||(a=!0,t.removeEventListener("abort",i),r.release(),n?.[Symbol.asyncIterator]().return?.(t.aborted?t.reason:void 0).catch(()=>{}))};return o.once("close",i),t.aborted?i():t.addEventListener("abort",i,{once:!0}),{body:o,length:e.length}}return{body:P.from(e.buffer,e.byteOffset,e.byteLength),length:e.byteLength}};const nl=new Uint8Array,al=new Set([101,204,205,304]),il=({statusCode:e,headers:t,body:r})=>{let o={status:e,headers:t};return al.has(e)?(ns(r),new Response(null,o)):rs(r,o)},sl=async(e,t)=>{let r;try{await Promise.race([e?.cancel(t).catch(()=>{}),new Promise(e=>{r=setTimeout(e,5e3)})])}finally{clearTimeout(r)}},ll=65536,cl=(e,t,r)=>{let o,n=e?.getReader(),a=new dl,i=!1,s=!1,l=(e,o=!1)=>{if(i)return;if(i=!0,void 0!==e)return t(e,void 0,o),void r?.({error:e,cancelled:o});let n=a.read();t(void 0,n.totalNanoAiu),r?.(n)};return{stream:new ReadableStream({start(e){o=e},async pull(e){let t;try{t=await(n?.read())}catch(t){let r=t??new ul;return e.error(r),void(s||l(r))}!t||t.done?(e.close(),l()):(a.push(t.value),e.enqueue(t.value))},async cancel(e){let t=e instanceof pl,r=t?e.cause??e:e;try{await sl(n,e)}finally{l(r instanceof Error?r:new DOMException("The client cancelled the image response.","AbortError"),!t)}}}),fail:e=>{if(i||s)return;s=!0;let t=e instanceof Error?e:Error(String(e));o.error(t),sl(n,t).then(()=>l(t))}}};var ul=class extends Error{name="ImagesBodyFailedError";constructor(){super("The upstream image response failed before its end.")}},pl=class extends Error{name="ImagesRouteCancel"},dl=class{head=new Uint8Array(ll);headLength=0;ring=new Uint8Array(ll);ringEnd=0;total=0;push(e){if(this.total+=e.byteLength,this.headLength<ll){let t=Math.min(e.byteLength,ll-this.headLength);this.head.set(e.subarray(0,t),this.headLength),this.headLength+=t}let t=e.byteLength>ll?e.subarray(e.byteLength-ll):e,r=Math.min(t.byteLength,ll-this.ringEnd);this.ring.set(t.subarray(0,r),this.ringEnd),this.ring.set(t.subarray(r),0),this.ringEnd=(this.ringEnd+t.byteLength)%ll}tail(){if(this.total<ll)return this.ring.subarray(0,this.total);let e=new Uint8Array(ll);return e.set(this.ring.subarray(this.ringEnd)),e.set(this.ring.subarray(0,this.ringEnd),ll-this.ringEnd),e}read(){let e,t=this.tail(),r=this.head.subarray(0,this.headLength);if(this.total<=ll)e=[[ml(t),"end"]];else if(this.total<=2*ll){let o=new Uint8Array(this.total);o.set(r),o.set(t.subarray(2*ll-this.total),ll),e=[[ml(o),"end"]]}else e=[[ml(t),"end"],[ml(r),"start"]];let o=t=>{for(let[r,o]of e){let e=hl(r,t,o);if(e)return e}},n=o("copilot_usage")?.total_nano_aiu;return{usage:o("usage"),totalNanoAiu:"number"==typeof n?n:void 0}}};const ml=e=>(new TextDecoder).decode(e),fl=(e,[t,r],o)=>{let n=0,a=!1;for(let i=t;i<r;i++){let t=e[i];if(a)"\\"===t?i++:'"'===t&&(a=!1);else switch(t){case'"':a=!0;break;case"{":case"[":n+=o;break;case"}":case"]":n-=o}}return n};function hl(e,t,r){let o=new RegExp(String.raw`[{,]\s*"${t}"\s*:\s*\{`,"g"),n=-1;for(let t of e.matchAll(o))1===("end"===r?fl(e,[t.index+1,e.length],-1):fl(e,[0,t.index+1],1))&&(n=t.index+t[0].length-1);if(n<0)return;let a=0,i=!1;for(let t=n;t<e.length;t++){let r=e[t];if(i)"\\"===r?t++:'"'===r&&(i=!1);else if('"'===r)i=!0;else if("{"===r)a++;else if("}"===r&&0===--a)try{let r=JSON.parse(e.slice(n,t+1));return"object"==typeof r&&r?r:void 0}catch{return}}}const gl=e=>e.header("Connection","close"),yl=e=>{let t=(e=>{let t=Number(e.req.header("content-length"));return{limit:bi(e.req.path),declaredLength:Number.isSafeInteger(t)&&t>=0?t:void 0}})(e);(void 0!==t.declaredLength&&!((e,t)=>e<=t.limit&&(void 0===t.declaredLength||t.declaredLength<=t.limit&&e<=t.declaredLength))(0,t)||!wi(e.req.raw,t.limit,t.declaredLength))&&gl(e)},_l=(e,t)=>{f.getActiveSpan()?.setAttribute("copilot_api.error_type","images_capacity");let r=ri().gate.retryAfterSeconds();return e.header("Retry-After",String(r)),e.header("retry-after-ms",String(1e3*r)),e.header("x-should-retry","true"),e.json({error:{message:t,type:"server_error",code:"images_capacity"}},503)},wl={queue_full:"Too many image requests are waiting. Retry later.",queue_timeout:"The image request waited too long for capacity. Retry later.",memory_pressure:"The server is low on memory for image requests. Retry later.",grow_denied:"The image request body is larger than the free image capacity. Retry later."},bl=e=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","images_capacity"),e.json({error:{message:"The image request needs more memory than this server allows for image requests. Send a smaller body.",type:"invalid_request_error",code:"request_too_large"}},413)),vl=e=>(gl(e),f.getActiveSpan()?.setAttribute("copilot_api.error_type","request_timeout"),e.json({error:{message:"The request body stopped arriving.",type:"invalid_request_error",code:"request_timeout"}},408));var kl=class extends Error{constructor(){super("The request body stopped arriving."),this.name="BodyIdleTimeoutError"}};const xl=async(e,t)=>{let r;try{await Promise.race([e.cancel(t).catch(()=>{}),new Promise(e=>{r=setTimeout(e,1e3)})])}finally{clearTimeout(r)}},Tl=async(e,t)=>{let r,o;try{return await Promise.race([e.read(),new Promise((e,t)=>{r=setTimeout(()=>t(new kl),(()=>{let e=Number(process.env.COPILOT_API_IMAGES_BODY_IDLE_TIMEOUT_MS);return Number.isFinite(e)&&e>0?e:3e4})())}),new Promise((e,r)=>{o=()=>r(new DOMException("The client closed the request.","AbortError")),t.aborted?o():t.addEventListener("abort",o,{once:!0})})])}finally{clearTimeout(r),o&&t.removeEventListener("abort",o)}},Al=1048576,Sl=(e,t)=>{let r=(e=>Math.min(Math.max(e??Ja,0),Ga))(t);return t=>{if(t<=r)return"ok";let o=Math.ceil(t/Al)*Al,n=e.grow(Math.ceil(1*(o-r)));return"ok"===n&&(r=o),n}},$l=e=>{let t=0;return async()=>{let r=await(e=>ri().pacer.take(e))(e);t+=r,t>0&&f.getActiveSpan()?.setAttribute("copilot_api.images.start_wait_ms",t)}},El=async(e,t,r)=>{try{return await async function(e,t){let{gate:r}=ri(),o=r.stats(),n=Ne.startSpan("copilot_api.images.admission",{kind:u.INTERNAL,attributes:{"copilot_api.images.admission.weight_bytes":e,"copilot_api.images.admission.budget_bytes":o.budgetBytes,"copilot_api.images.admission.in_use_bytes":o.inUseBytes,"copilot_api.images.admission.in_flight":o.inFlight,"copilot_api.images.admission.queue_depth":o.queueDepth}}),a=performance.now();try{let o=await r.acquire(e,t);return n.setAttribute("copilot_api.images.admission.result","admitted"),o}catch(e){let t=e instanceof Wa?e.reason:"error";throw n.setAttribute("copilot_api.images.admission.result",t),"aborted"!==t&&n.setStatus({code:p.ERROR,message:t}),e}finally{n.setAttribute("copilot_api.images.admission.wait_ms",Math.round(performance.now()-a)),n.end()}}(((e,t)=>{let r=(e.req.header("content-type")??"").split(";")[0].trim().toLowerCase();if("edits"===t&&"multipart/form-data"===r)return 11534336;let o=Number(e.req.header("content-length"));return Ka(Number.isSafeInteger(o)&&o>=0?o:void 0)})(e,t),r)}catch(t){if(t instanceof Wa&&"aborted"!==t.reason)return yl(e),"too_large"===t.reason?bl(e):_l(e,wl[t.reason]);throw t}},Ol=(e,t)=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error",code:"invalid_request"}},400)),Cl=(e,t)=>e.json({error:{message:`Request body exceeds the ${t/1024/1024} MB limit.`,type:"invalid_request_error",code:"request_too_large"}},413),Il=(e,t,r)=>{try{if(r)throw new Si(r);return $i(t)}catch(t){if(t instanceof Si)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}},Rl=(e,t)=>{if(e.length<256)return void e.push(t);let r=e.at(-1),o=r&&ql.get(r);if(t.byteLength>=16384)return o&&Pl(e,r,o),void e.push(t);if(o&&r.byteLength+t.byteLength<=o.byteLength){o.set(t,r.byteLength);let n=o.subarray(0,r.byteLength+t.byteLength);return ql.set(n,o),void(e[e.length-1]=n)}o&&Pl(e,r,o);let n=new Uint8Array(65536);n.set(t);let a=n.subarray(0,t.byteLength);ql.set(a,n),e.push(a)},Pl=(e,t,r)=>{ql.delete(t),r.byteLength-t.byteLength>=16384&&(e[e.length-1]=t.slice())},ql=new WeakMap;var Ml=class extends Error{constructor(e){super(e),this.name="JsonSyntaxError"}},Nl=class extends Error{constructor(){super('Request body has more than one top-level "model" field.'),this.name="DuplicateModelError"}};const jl=0,Dl=1,Ll=2,Bl=3,Fl=4,Ul=5,Hl=6,zl=7,Jl=8,Gl=9,Kl=10,Wl=11,Yl=12,Vl=13,Xl=14,Zl=15,Ql=16,ec=17,tc=18,rc=19,oc=20,nc=21,ac=[239,187,191],ic=[34,109,111,100,101,108,34],sc=e=>32===e||10===e||13===e||9===e,lc=e=>e>=48&&e<=57,cc={[Vl]:[Xl,Zl,-2,-2,-2,-2],[Xl]:[-1,-1,Ql,tc,-1,-1],[Zl]:[Zl,Zl,Ql,tc,-1,-1],[Ql]:[ec,ec,-2,-2,-2,-2],[ec]:[ec,ec,-1,tc,-1,-1],[tc]:[oc,oc,-2,-2,rc,-2],[rc]:[oc,oc,-2,-2,-2,-2],[oc]:[oc,oc,-1,-1,-1,-1]};var uc=class{bits=new Uint8Array(64);length=0;push(e){let t=this.length>>3;if(t===this.bits.length){let e=new Uint8Array(2*this.bits.length);e.set(this.bits),this.bits=e}let r=1<<(7&this.length);e?this.bits[t]|=r:this.bits[t]&=~r,this.length++}pop(){this.length>0&&this.length--}top(){if(0===this.length)return!1;let e=this.length-1;return!!(this.bits[e>>3]&1<<(7&e))}},pc=class{state=jl;stack=new uc;offset=0;hexLeft=0;utf8Left=0;utf8Min=128;utf8Max=191;literal=[];literalIndex=0;bomIndex=0;stringRole="none";capture=[];captureOverflow=!1;stringStart=0;stringIsKey=!1;expectModelValue=!1;otherModelDepth;modelSeen=!1;topLevelObject=!1;model;get isObject(){return this.topLevelObject}get bytes(){return this.offset}push(e){let t=e.length,r=0;for(;r<t;){if(this.state===Jl&&"none"===this.stringRole){let o=r,n=e[r];for(;n>=32&&n<128&&34!==n&&92!==n&&++r!==t;)n=e[r];if(this.offset+=r-o,r===t)return}this.step(e[r]),this.offset++,r++}}end(){0===this.stack.length&&(this.state===Xl||this.state===Zl||this.state===ec||this.state===oc)&&(this.state=zl),this.state!==zl&&this.fail("Unexpected end of JSON input")}fail(e){throw new Ml(`${e} at byte ${this.offset}`)}step(e){switch(this.state){case jl:return e===ac[0]&&0===this.offset?(this.state=nc,void(this.bomIndex=1)):(this.state=Dl,void this.step(e));case nc:return e!==ac[this.bomIndex]&&this.fail("Unexpected token"),void(++this.bomIndex===ac.length&&(this.state=Dl));case Dl:case Ll:if(sc(e))return;return 93===e&&this.state===Ll?void this.closeContainer():void this.startValue(e);case Bl:case Fl:if(sc(e))return;return 125===e&&this.state===Bl?void this.closeContainer():(34!==e&&this.fail("Expected a property name"),void this.beginString(1===this.stack.length?"key":"none",!0));case Ul:if(sc(e))return;return 58!==e&&this.fail("Expected ':'"),void(this.state=Dl);case Hl:{if(sc(e))return;let t=this.stack.top();return 44===e?void(this.state=t?Fl:Dl):e===(t?125:93)?void this.closeContainer():void this.fail("Expected ',' or a close")}case zl:return void(sc(e)||this.fail("Unexpected non-whitespace after JSON"));case Jl:return void this.stringByte(e);case Gl:return this.record(e),117===e?(this.state=Kl,void(this.hexLeft=4)):(34!==e&&92!==e&&47!==e&&98!==e&&102!==e&&110!==e&&114!==e&&116!==e&&this.fail("Bad escape in string"),void(this.state=Jl));case Kl:return(e=>lc(e)||e>=97&&e<=102||e>=65&&e<=70)(e)||this.fail("Bad Unicode escape"),this.record(e),void(0===--this.hexLeft&&(this.state=Jl));case Wl:return(e<this.utf8Min||e>this.utf8Max)&&this.fail("Invalid UTF-8"),this.record(e),this.utf8Min=128,this.utf8Max=191,void(0===--this.utf8Left&&(this.state=Jl));case Yl:return e!==this.literal[this.literalIndex]&&this.fail("Unexpected token"),void(++this.literalIndex===this.literal.length&&this.endScalar());default:this.numberByte(e)}}startValue(e){let t=this.stack.length,r=this.expectModelValue;switch(this.expectModelValue=!1,0===t&&(this.topLevelObject=123===e),r&&34!==e&&(this.otherModelDepth=t),e){case 123:return this.stack.push(!0),void(this.state=Bl);case 91:return this.stack.push(!1),void(this.state=Ll);case 34:return void this.beginString(r?"model":"none");case 116:return void this.beginLiteral([116,114,117,101]);case 102:return void this.beginLiteral([102,97,108,115,101]);case 110:return void this.beginLiteral([110,117,108,108]);case 45:return void(this.state=Vl);default:48===e?this.state=Xl:lc(e)?this.state=Zl:this.fail("Unexpected token")}}beginLiteral(e){this.literal=e,this.literalIndex=1,this.state=Yl}beginString(e,t=!1){this.state=Jl,this.stringIsKey=t,this.stringRole=e,this.stringStart=this.offset,this.capture="none"===e?[]:[34],this.captureOverflow=!1}record(e){if("none"===this.stringRole||this.captureOverflow)return;let t="key"===this.stringRole?64:4096;this.capture.length>=t?(this.captureOverflow=!0,this.capture=[]):this.capture.push(e)}stringByte(e){34===e?(this.record(e),this.endString()):92===e?(this.record(e),this.state=Gl):(e<32&&this.fail("Bad control character in string"),this.record(e),e<128||(e>=194&&e<=223?this.utf8Left=1:e>=224&&e<=239?(this.utf8Left=2,224===e&&(this.utf8Min=160),237===e&&(this.utf8Max=159)):e>=240&&e<=244?(this.utf8Left=3,240===e&&(this.utf8Min=144),244===e&&(this.utf8Max=143)):this.fail("Invalid UTF-8"),this.state=Wl))}endString(){let e=this.stringRole;if(this.stringRole="none",this.stringIsKey){if(this.state=Ul,"key"!==e)return;if(!this.captureOverflow&&this.isModelKey(this.capture)){if(this.modelSeen)throw new Nl;this.modelSeen=!0,this.expectModelValue=!0}this.capture=[]}else{if("model"===e){if(this.captureOverflow)this.model={kind:"too-long"};else{let e=Buffer.from(this.capture).toString("utf8");this.model={kind:"string",value:JSON.parse(e),start:this.stringStart,end:this.offset+1}}this.capture=[]}this.endScalar()}}isModelKey(e){return!(e.length!==ic.length||!e.every((e,t)=>e===ic[t]))||!!e.includes(92)&&"model"===JSON.parse(Buffer.from(e).toString("utf8"))}endScalar(){this.otherModelDepth===this.stack.length&&(this.otherModelDepth=void 0,this.model={kind:"other"}),this.state=0===this.stack.length?zl:Hl}closeContainer(){this.stack.pop(),this.endScalar()}numberByte(e){let t=cc[this.state]?.[(e=>48===e?0:lc(e)?1:46===e?2:101===e||69===e?3:43===e||45===e?4:5)(e)]??-2;-2===t?this.fail("Bad number"):-1===t?this.endNumber(e):this.state=t}endNumber(e){this.endScalar(),this.step(e)}};var dc=class extends Error{kind;constructor(e){super(`JSON request body rejected: ${e}`),this.kind=e,this.name="JsonBodyError"}},mc=class extends Error{constructor(){super("The JSON request body upload stopped before its end."),this.name="UploadCancelledError"}};const fc=async(e,t)=>{let r,o=new pc,n=e?.getReader(),a=[],i=0,s=()=>r,l=(()=>{let e,t,r=new Promise((r,o)=>{e=r,t=o});return r.catch(()=>{}),{promise:r,resolve:e,reject:t}})(),c={reading:!1,stop:!1},{claim:u,discard:p}=hc(n,t,()=>({read:i,deadline:c.deadline})),d=()=>(l.reject(new mc),a.length=0,u(),bc(c,n,p),Promise.resolve()),m=e=>{i+=e.byteLength},f=e=>{if(m(e),i>t.limit)throw r=new dc("too-large");if(void 0!==t.declaredLength&&i>t.declaredLength)throw r=new dc("length-mismatch");try{_c(o,e)}catch(e){throw r=e,e}},h=()=>{if(void 0!==t.declaredLength&&i!==t.declaredLength)throw r=new dc("length-mismatch");try{o.end()}catch{throw r=new dc("invalid-json")}if(!o.isObject)throw r=new dc("not-object")},g=e=>({model:o.model,head:a,headLength:i,declaredLength:t.declaredLength,rest:e?.rest??null,cancel:d,failure:s,complete:e?l.promise:Promise.resolve(),idleMs:e?.idleMs??(()=>0),progress:e?.progress??(()=>{})});try{for(;;){let e=n?await n.read():{done:!0};if(e.done)return h(),g(void 0);f(e.value);let s=yc(t,i);if(s)throw r=s;if(Rl(a,e.value),void 0!==o.model&&i!==t.declaredLength&&n)return g(kc(wc(n,{take:f,count:m,finish:h,settled:l,discard:p,control:c}),l))}}catch(e){throw l.reject(e),p(),e}},hc=(e,t,r)=>{let o,n=!1,a=()=>{!n&&e&&(n=!0,o=gi(),!o&&t.drains&&(t.drains.refused=!0))};return{claim:a,discard:()=>{a();let n=o;return o=void 0,n&&e&&n.start(gc(e,{...r(),limit:t.limit,declared:t.declaredLength})),Promise.resolve()}}},gc=(e,t)=>()=>pi(e,t),yc=(e,t)=>{let r=e.reserve?.(t)??"ok";return"busy"===r?new dc("no-capacity"):"too_large"===r?new dc("over-budget"):void 0},_c=(e,t)=>{try{e.push(t)}catch(e){throw new dc(e instanceof Nl?"duplicate-model":"invalid-json")}};async function*wc(e,t){let r,{take:o,count:n,finish:a,settled:i,discard:s,control:l}=t,c=!1;try{for(;;){let t=await vc(e,l);if(l.stop)throw t.done||n(t.value),new mc;if(t.done)break;0!==t.value.byteLength&&(o(t.value),r&&(yield r),r=t.value)}a(),c=!0,r&&(yield r),i.resolve()}catch(e){throw i.reject(e),e}finally{c||(i.reject(new mc),s())}}const bc=(e,t,r)=>{e.stop=!0,e.reading?(e.deadline??=performance.now()+li,e.watchdog??=setTimeout(()=>{t?.cancel().catch(()=>{})},Math.min(si,li))):r()},vc=(e,t)=>t.stop?Promise.reject(new mc):(t.reading=!0,e.read().finally(()=>{t.reading=!1,clearTimeout(t.watchdog)})),kc=(e,t)=>{let r,o={next:async()=>{r=void 0;try{return await e.next()}finally{r=Date.now()}},return:async r=>(t.reject(r instanceof Error?r:new mc),e.return(r)),throw:t=>e.throw(t)};return{rest:{[Symbol.asyncIterator]:()=>o},progress:()=>{r=Date.now()},idleMs:()=>void 0===r?0:Date.now()-r}},xc=(e,{start:t,end:r},o)=>{let n=[],a=0,i=!1;for(let s of e){let e=a,l=a+s.byteLength;a=l,l<=t||e>=r?(!i&&e>=r&&(n.push(o),i=!0),n.push(s)):(e<t&&n.push(s.subarray(0,t-e)),i||=(n.push(o),!0),l>r&&n.push(s.subarray(r-e)))}return i||n.push(o),n.filter(e=>e.byteLength>0)},Tc=(e,t)=>{switch("length-mismatch"===t&&(e=>{e.header("Connection","close")})(e),t){case"too-large":return Cl(e,bi(e.req.path));case"no-capacity":return _l(e,wl.grow_denied);case"over-budget":return bl(e);case"not-object":return Ol(e,"Request body must be a JSON object.");case"duplicate-model":return Ol(e,'Request body must have exactly one top-level "model" field.');case"length-mismatch":return Ol(e,"The request body length does not match its Content-Length.");default:return Ol(e,"Request body must be valid JSON.")}},Ac=async(e,t,{stream:r=e.req.raw.body,drains:o,reserve:n}={})=>{let a,i=(e=>{let t=e.req.header("content-length");if(void 0===t||""===t.trim())return;let r=Number(t);return Number.isSafeInteger(r)&&r>=0?r:void 0})(e);try{a=await fc(r,{limit:bi(e.req.path),declaredLength:i,drains:o,reserve:n})}catch(t){if(t instanceof dc)return Tc(e,t.kind);throw t}let s=a.model,l="too-long"===s?.kind?Il(e,"","Model name is too long."):Il(e,"string"===s?.kind?s.value:void 0);if(l instanceof Response)return await a.cancel(),l;let{chunks:c,length:u}=((e,t,{model:r,declared:o})=>{let n=o??(e.rest?void 0:e.headLength);if(!t||t.value===r)return{chunks:e.head,length:n};let a=(new TextEncoder).encode(JSON.stringify(r));return{chunks:xc(e.head,t,a),length:void 0===n?void 0:n+a.byteLength-(t.end-t.start)}})(a,"string"===s?.kind?s:void 0,{model:l,declared:i});return{operation:t,model:l,body:null===a.rest&&1===c.length?c[0]:{chunks:c,rest:a.rest,length:u,progress:a.progress},contentType:"application/json",bodyFailure:e=>{let t=a.failure()?.kind;return t?Tc(e,t):void 0},cancelBody:a.cancel,...a.rest&&{uploadComplete:a.complete,uploadIdleMs:a.idleMs}}};var Sc=class extends Error{status;constructor(e,t){super(e),this.status=t,this.name="MultipartScanError"}},$c=class{field;fileBeforeField=!1;total=0;delimiter;maxHeaderBytes;maxFieldBytes;maxLineBytes;state="preamble";carry=P.from("\r\n","latin1");carryStart=-2;headers="";inField=!1;valueStart=0;value=[];valueLength=0;name;limits;constructor(e,t,r){this.name=t,this.limits=r,this.delimiter=P.from(`\r\n--${e}`,"latin1"),this.maxHeaderBytes=r.maxHeaderBytes??16384,this.maxFieldBytes=r.maxFieldBytes??256,this.maxLineBytes=r.maxLineBytes??1024}get complete(){return"end"===this.state}push(e){let t=this.total;if(this.total+=e.byteLength,this.total>this.limits.maxBytes)throw new Sc(`Request body exceeds the ${this.limits.maxBytes/1024/1024} MB limit.`,413);if("end"===this.state)return;let r=P.from(e.buffer,e.byteOffset,e.byteLength),o=this.carry.byteLength>0?P.concat([this.carry,r]):r,n=this.carry.byteLength>0?this.carryStart:t;this.carry=P.alloc(0),this.scan(o,n)}finish(){if("headers"!==this.state&&"end"!==this.state&&this.carry.byteLength>=this.delimiter.byteLength+2&&this.carry.subarray(0,this.delimiter.byteLength).equals(this.delimiter)&&/^--[ \t]*$/.test(this.carry.toString("latin1",this.delimiter.byteLength))&&("body"===this.state&&this.endPart(this.carryStart),this.state="end"),"end"!==this.state)throw new Sc("Malformed multipart/form-data body.",400)}keep(e,t,r){this.carry=P.from(e.subarray(t)),this.carryStart=r+t}scan(e,t){let r=0;for(;-1!==r&&r<e.byteLength;){if("end"===this.state)return;r="headers"===this.state?this.scanHeaders(e,r,t):this.scanBody(e,r,t)}}scanBody(e,t,r){let o=t;for(;;){let n=e.indexOf(this.delimiter,o);if(-1===n){let n=Oc(e,o,this.delimiter);return this.bodyBytes(e,t,e.byteLength-n),this.keep(e,e.byteLength-n,r),-1}let a=Ec(e,n+this.delimiter.byteLength,this.maxLineBytes);if("not-delimiter"!==a)return this.bodyBytes(e,t,n),"more"===a?(this.keep(e,n,r),-1):("body"===this.state&&this.endPart(r+n),"close"===a?(this.state="end",-1):(this.state="headers",this.headers="",a));o=n+1}}scanHeaders(e,t,r){let o=this.maxHeaderBytes+4-this.headers.length,n=this.headers+e.toString("latin1",t,Math.min(e.byteLength,t+o)),a=n.startsWith("\r\n")?0:n.indexOf("\r\n\r\n");if(-1===a){if(n.length-4>=this.maxHeaderBytes)throw new Sc("Multipart part headers are too large.",400);return this.headers=n,-1}let i=(0===a?2:a+4)-this.headers.length;return this.startPart(n.slice(0,a),r+t+i),t+i}startPart(e,t){this.headers="",this.state="body";let r=Cc(e);if(r?.file&&r.name===this.name)throw new Sc(`The multipart "${this.name}" field must be a text field.`,400);if(this.inField=void 0!==r&&!r.file&&r.name===this.name,r?.file&&!this.field&&(this.fileBeforeField=!0),this.inField){if(this.field)throw new Sc(`The multipart body has more than one "${this.name}" field.`,400);this.valueStart=t,this.value=[],this.valueLength=0}}bodyBytes(e,t,r){if("body"===this.state&&this.inField&&!(r<=t)){if(this.valueLength+=r-t,this.valueLength>this.maxFieldBytes)throw new Sc(`The multipart "${this.name}" field is too long.`,400);this.value.push(P.from(e.subarray(t,r)))}}endPart(e){this.inField&&(this.inField=!1,this.field={value:P.concat(this.value).toString("utf8"),start:this.valueStart,end:e},this.value=[])}};const Ec=(e,t,r)=>{if(e.byteLength-t<2)return"more";let o=45===e[t]&&45===e[t+1],n=o?t+2:t;for(;n<e.byteLength&&(32===e[n]||9===e[n]);)n++;return n-t>r||n<e.byteLength&&13!==e[n]?"not-delimiter":n+1>=e.byteLength?"more":13!==e[n]||10!==e[n+1]?"not-delimiter":o?"close":n+2},Oc=(e,t,r)=>{let o=Math.min(r.byteLength-1,e.byteLength-t);for(let t=o;t>0;t--)if(0===e.compare(r,0,t,e.byteLength-t,e.byteLength))return t;return 0},Cc=e=>{for(let t of e.split("\r\n")){let e=t.indexOf(":");if("content-disposition"!==t.slice(0,e).trim().toLowerCase())continue;let r=t.slice(e+1),o=Ic(r);return{name:"form-data"===r.split(";")[0].trim().toLowerCase()?o.get("name"):void 0,file:o.has("filename")||o.has("filename*")}}},Ic=e=>{let t=new Map,r=e.indexOf(";");for(;-1!==r;){let o=e.indexOf("=",r+1);if(-1===o)break;let n=e.lastIndexOf(";",o);if(n>r){r=n;continue}let a=e.slice(r+1,o).trim().toLowerCase(),i=o+1;for(;" "===e[i]||"\t"===e[i];)i++;let s="";if('"'===e[i]){for(i++;i<e.length&&'"'!==e[i];i++)"\\"===e[i]&&i++,s+=e[i]??"";r=e.indexOf(";",i+1)}else r=e.indexOf(";",i),s=e.slice(i,-1===r?void 0:r).trim();t.has(a)||t.set(a,s)}return t},Rc=async(e,t)=>{let r;try{r=await e.read()}catch(e){return void t.error(e??new ul)}r.done?t.close():t.enqueue(r.value)},Pc=new Uint8Array;var qc=class extends Error{constructor(){super("The early answer did not fit in the spool."),this.name="SpoolOverflowError"}};const Mc=new B,Nc=(e,t,r)=>{if(t instanceof kl)return vl(e);if(t instanceof Dc){let r=Il(e,t.value);return r instanceof Response?r:Ol(e,t.message)}return 413===t.status?Cl(e,r):Ol(e,t.message)};var jc=class extends Error{constructor(){super("The upload did not reach the upstream in full."),this.name="UploadStoppedError"}},Dc=class extends Error{value;constructor(e){super("The multipart model field is missing or not valid."),this.name="ModelPartError",this.value=e}};const Lc=e=>{try{return $i(e)}catch(t){throw t instanceof Si?new Dc(e):t}},Bc=async(e,t,r)=>{let o=(e=>{let t=Ic(e).get("boundary");return t&&t.length<=70?t:void 0})(t),n=e.req.raw.body;if(!o||!n)return Ol(e,"Malformed multipart/form-data body.");let a=bi(e.req.path),i=new $c(o,"model",{maxBytes:a}),s=Number(e.req.header("content-length")),l=Number.isSafeInteger(s)&&s>0,c=l?s:void 0,{reader:u,drain:p}=Zc(n.getReader(),{limit:a,declared:c},r),d=[],m=Lt(e),f=await Uc({reader:u,drain:p,scanner:i,held:d,declared:c,signal:m});if("boolean"!=typeof f)return Nc(e,f,a);let{field:h}=i;if(!f&&!h){let e={};return{...Fc({contentType:t,drain:p,body:{chunks:d,length:void 0},rest:t=>Hc({reader:u,drain:p,scanner:i,declared:c,signal:m,onError:t,onModel:t=>{e.model=t}}),model:""}),found:e,lateModel:()=>e.model}}let g=Il(e,h?.value??null);if(g instanceof Response)return f||p(),g;let y=d,_=0;return h&&h.value!==g&&(y=zc(d,0,{...h,value:g}),_=P.byteLength(g)-(h.end-h.start)),f?(u.releaseLock(),{operation:"edits",model:g,contentType:t,body:{chunks:y,rest:null,length:d.reduce((e,t)=>e+t.byteLength,0)+_}}):Fc({contentType:t,drain:p,body:{chunks:y,length:l?s+_:void 0},rest:e=>Hc({reader:u,drain:p,scanner:i,declared:c,signal:m,onError:e}),model:g})},Fc=({contentType:e,drain:t,body:r,rest:o,model:n})=>{let a,i,s=new Promise((e,t)=>{i={resolve:e,reject:t}});s.catch(()=>{});let l,c=o(e=>a=e)[Symbol.asyncIterator](),u=!1,p={[Symbol.asyncIterator]:()=>p,next:async()=>{u=!0;try{let e=await c.next();return u=!1,l=Date.now(),e.done&&i.resolve(),e}catch(e){throw u=!1,i.reject(e),e}},return:async e=>((e=>{i.reject(e instanceof Error?e:new jc)})(e),await(c.return?.()),{done:!0,value:void 0})};return{operation:"edits",model:n,contentType:e,body:{chunks:r.chunks,length:r.length,rest:p,progress:()=>{l=Date.now()}},bodyFailure:e=>a&&Nc(e,a,bi(e.req.path)),cancelBody:()=>(t(),Promise.resolve()),uploadComplete:s,uploadIdleMs:()=>u||void 0===l?0:Date.now()-l}},Uc=async({reader:e,drain:t,scanner:r,held:o,declared:n,signal:a})=>{try{for(;;){let{done:t,value:i}=await Tl(e,a);if(t)return r.finish(),void 0===n||r.total===n||new Sc("The request body length does not match its Content-Length.",400);let s=r.complete;if(r.push(i),!s&&(o.push(i),!r.complete&&(r.field||!r.inField&&(r.fileBeforeField||r.total>1048576))))return!1}}catch(r){if(r instanceof kl)return await xl(e),r;if(t(),r instanceof Sc)return r;throw r}};async function*Hc({reader:e,drain:t,scanner:r,declared:o,signal:n,onError:a,onModel:i}){let s=!1,l=[],c=0,u=void 0!==i;try{for(;;){let{done:t,value:a}=await Tl(e,n);if(t){if(r.finish(),void 0!==o&&r.total!==o)throw new Sc("The request body length does not match its Content-Length.",400);if(u)throw new Dc(null);return void(s=!0)}let p=r.total;if(r.push(a),!u){yield a;continue}if(0===l.length&&(c=p),!r.field){r.inField?l.push(a):yield a;continue}l.push(a);let{field:d}=r,m=Lc(d.value);i?.(m);let f=m===d.value?l:zc(l,c,{...d,value:m});l=[],u=!1,yield*f}}catch(e){throw(e=>e instanceof Sc||e instanceof Dc||e instanceof kl)(e)&&a(e),e}finally{s||t()}}const zc=(e,t,{start:r,end:o,value:n})=>{if(r<t)throw new Sc("Malformed multipart/form-data body.",400);let a=P.from(n,"utf8"),i=[],s=t,l=!1;for(let t of e){let e=s;s+=t.byteLength,s<=r||e>=o?(e>=o&&!l&&(i.push(a),l=!0),i.push(t)):(e<r&&i.push(t.subarray(0,r-e)),l||=(i.push(a),!0),s>o&&i.push(t.subarray(o-e)))}return l||i.push(a),i},Jc=3e4,Gc=1e3,Kc=e=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:"The upstream sent a large answer before it read the whole request body.",type:"api_error",code:"early_answer_too_large"}},502)),Wc=e=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upload_stalled"),e.json({error:{message:"The upstream stopped reading the request body after it answered.",type:"timeout_error",code:"upload_stalled"}},504)),Yc=async(e,t,r)=>{if(!t.uploadComplete)return{body:r};let o=((e,t)=>{let r=e.getReader(),o={queue:[],next:0,size:0,done:!1,active:!0,dropped:!1},n=e=>{e.done||!e.value?o.done=!0:o.size+e.value.byteLength>t?o.dropped=!0:(Rl(o.queue,e.value),o.size+=e.value.byteLength)},a={},i=new Promise((e,t)=>{a.reject=t});i.catch(()=>{});let s=e=>{o.failure??=e??new ul,o.done=!0,a.reject?.(o.failure)},l=()=>{o.inflight=void 0};return r.closed.catch(e=>s(e)),o.inflight=(async()=>{for(;o.active&&!o.done&&!o.dropped&&o.size<t;)try{n(await r.read())}catch(e){s(e)}})(),{release:()=>(o.active=!1,new ReadableStream({async pull(e){for(;;){if(void 0!==o.failure||o.dropped)return void e.error(o.failure??new qc);if(o.next<o.queue.length){let t=o.queue[o.next];return o.queue[o.next++]=Pc,void e.enqueue(t)}if(o.done)return void e.close();let{inflight:t}=o;if(!t)break;await t,l()}await Rc(r,e)},cancel:e=>r.cancel(e)})),cancel:async e=>{o.active=!1,await r.cancel(e).catch(()=>{})},full:()=>o.dropped||!o.done&&o.size>=t,dropped:()=>o.dropped,failure:i}})(r,Vc);try{let n=await(async(e,t)=>{let r=Promise.race([e.uploadComplete?.then(()=>!0),t.failure]);for(;;){let o,n=new Promise(e=>{o=setTimeout(()=>e(!1),Gc)});try{if(await Promise.race([r,n]))return!t.dropped()||"blocked"}finally{clearTimeout(o)}if(t.full())return"blocked";if((e.uploadIdleMs?.()??0)>=Jc)return"stalled"}})(t,o);if(!0!==n)return await o.cancel(new pl(`upload ${n}`)),await(t.cancelBody?.()),Qc(e,t),{failed:"stalled"===n?Wc(e):Kc(e),body:r}}catch(n){return await o.cancel(new pl("The upload failed.",{cause:n})),await(t.cancelBody?.()),Qc(e,t),{failed:t.bodyFailure?.(e)??(n instanceof jc||n instanceof mc?Ol(e,"The request body did not reach the upstream in full."):await jr(e,n)),body:r}}return Qc(e,t),{body:o.release()}},Vc=za;var Xc=class extends Error{constructor(){super("The client body is being drained."),this.name="BodyHandedOff"}};const Zc=(e,t,r)=>{let o,n=0,a=!1;return{reader:{read:async()=>{if(a)throw new Xc;let t=e.read();o=t;let r=await t;return r.done||(n+=r.value.byteLength),r},cancel:t=>e.cancel(t),releaseLock:()=>e.releaseLock()},drain:()=>{a||(a=!0,_i(async()=>{let r=performance.now()+li;o&&!await(async(e,t)=>{let r;try{return await Promise.race([e.then(()=>!0).catch(()=>!0),new Promise(e=>{r=setTimeout(()=>e(!1),Math.min(si,t-performance.now()))})])}finally{clearTimeout(r)}})(o,r)?await e.cancel().catch(()=>{}):await pi(e,{read:n,...t,deadline:r})})||(r.refused=!0))}}},Qc=(e,t)=>{let r=t.found?.model;if(!r)return;let o=e.get("requestData");o?o.model=r:e.set("requestData",{model:r})},eu=async(e,t,r)=>(await(t?.cancelBody?.()),t&&Qc(e,t),t?.bodyFailure?.(e)||(r instanceof Vs?(e=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"The Service token was renewed during the upload; retry the request.",type:"service_unavailable"}},503)))(e):(e=>"UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"===e?.code)(r)?Ol(e,"The request body length does not match its Content-Length."):jr(e,r))),tu=(e,t,{signal:r,guard:o,ticket:n,drains:a})=>{let i=()=>{let t=((e,t)=>{if(!e)return{body:e,timedOut:()=>!1};let r=e.getReader(),o=!1;return{body:new ReadableStream({async pull(e){try{let o=await Tl(r,t);o.done?e.close():e.enqueue(o.value)}catch(t){t instanceof kl&&(o=!0),e.error(t),await xl(r)}},async cancel(e){await xl(r,e)}},{highWaterMark:0}),timedOut:()=>o}})(e.req.raw.body,r);return o.timedOut=t.timedOut,t.body},s=Number(e.req.header("content-length")),l={drains:a,reserve:Sl(n,Number.isSafeInteger(s)&&s>=0?s:void 0)};return"generations"===t?Ac(e,"generations",{stream:i(),...l}):(async(e,t,r)=>{let o=e.req.header("content-type")??"",n=o.split(";")[0].trim().toLowerCase();return"application/json"===n?Ac(e,"edits",{stream:t(),...r}):"multipart/form-data"===n?Bc(e,o,r.drains):Ol(e,"Image edits require a multipart/form-data or application/json body.")})(e,i,l)},ru=e=>async(t,r)=>{let o,n,a={timedOut:()=>!1},i=!1;try{if(lo(he))return Ol(t,"Image endpoints are available only with the Copilot provider.");await Oi(he);let s=Lt(t),l=await El(t,e,s);if(l instanceof Response)return l;n=l;let c=await tu(t,e,{signal:s,guard:a,ticket:l,drains:r});if(c instanceof Response)return c;o=c,t.set("requestData",o.model?{model:o.model}:{});let u=await xi(t);if(u)return await(o.cancelBody?.()),u;he.manualApprove&&await ki(s);let p=((e,t)=>{let r={...e.get("requestData"),deferFinalize:!0};e.set("requestData",r);let o=e.get("requestSpan"),n=e.get("resolveStreamComplete"),a=Lt(e),i=performance.now();return e=>{try{if(void 0===e.error){let o=performance.now()-i;if(nt.record(o,{model:r.model||t,target:"images",streaming:"false"}),e.usage){let t=e.usage.input_tokens??0,o=e.usage.output_tokens??0;r.tokenUsage={inputTokens:t,outputTokens:o,totalTokens:e.usage.total_tokens??t+o}}r._d1=o}else e.cancelled||a.aborted?o?.setAttribute("copilot_api.client_aborted",!0):o&&ht(o,e.error)}finally{n?.()}}})(t,o.model),d=((e,t,r)=>{let o=(e=>{let t=2,r=()=>{0===--t&&e.release()},o=!1,n=!1;return{upstreamEnded:()=>{o||(o=!0,r())},clientEnded:()=>{n||(n=!0,r())}}})(e);return{hooks:{onBodyEnd:e=>{o.upstreamEnded(),r(e)},beforeAttempt:$l(t)},clientEnded:o.clientEnded}})(l,s,p),m=await(async(e,t,r={})=>{let{onBodyEnd:o,beforeAttempt:n}=r,a=!Xs(e.body)||null===e.body.rest;a||await Zs();let i={replayable:a,attempts:1,refreshed:!1,start:Date.now()};for(;;)try{return await(n?.()),await el(e,t,o)}catch(e){if(!(e instanceof mr))throw e;await Qs(e,i,t)}})(o,s,d.hooks),f=await Yc(t,o,m.body);return f.failed?f.failed:(i=!0,new Response(((e,t)=>{let r=e.getReader();return new ReadableStream({async pull(e){let o;try{o=await r.read()}catch(r){return e.error(r),void t()}o.done?(e.close(),t()):e.enqueue(o.value)},async cancel(e){await xl(r,e),t()}})})(f.body,d.clientEnded),{status:200,headers:{"content-type":m.contentType}}))}catch(e){return a.timedOut()?(await(o?.cancelBody?.()),vl(t)):await eu(t,o,e)}finally{i||n?.release()}},ou=e=>async t=>{let r={refused:!1},o=await e(t,r);if(o.status<400||"close"===o.headers.get("connection")?.toLowerCase())return o;let n=Number(t.req.header("content-length"));return wi(t.req.raw,bi(t.req.path),Number.isSafeInteger(n)&&n>=0?n:void 0)&&!r.refused?o:(e=>{try{return e.headers.set("Connection","close"),e}catch{let t=new Headers(e.headers);return t.set("Connection","close"),new Response(e.body,{status:e.status,statusText:e.statusText,headers:t})}})(o)};function nu(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function au(e){return!nu(e)}Mc.post("/generations",ou(ru("generations"))),Mc.post("/edits",ou(ru("edits")));const iu=new Y(X);let su;const lu={...V["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function cu(e,t){try{return e.encode(t,[],[]).length}catch(e){return r.debug("count_tokens: tokenizer failed, using length/4",e),Math.ceil(t.length/4)}}function uu(e,t){let r=0;for(let o of e)switch(o.type){case"text":r+=t(o.text)*lu.contentMultiplier;break;case"tool_use":r+=t(o.name+JSON.stringify(o.input))*lu.contentMultiplier;break;case"tool_result":o.content&&(r+=t("string"==typeof o.content?o.content:JSON.stringify(o.content))*lu.contentMultiplier);break;case"thinking":r+=t(o.thinking)*lu.contentMultiplier;break;case"image":r+=1600}return r}function pu(e,t){let r=0,o=e.properties;if(!o)return r;let n=Object.entries(o);for(let[e,[o,a]]of n.entries()){if(r+=0===e?lu.perFirstProp:lu.perAdditionalProp,r+=t(o),a.description&&(r+=lu.perPropDesc+t(a.description)),a.enum&&Array.isArray(a.enum)){r+=lu.perEnum;for(let e of a.enum)r+=t(String(e))}if("object"===a.type&&a.properties&&(r+=lu.perNestedObject,r+=pu(a,t)),"array"===a.type&&a.items){let e=a.items;"object"===e.type&&e.properties&&(r+=lu.perArrayOfObjects,r+=pu(e,t))}}return r}const du={event:"ping",data:JSON.stringify({type:"ping"})};function mu(e,t=15e3){let r,o=performance.now(),n=!1,a=()=>{if(n||e.aborted||e.closed)return void(r=void 0);let i=performance.now()-o;i>=t?(o=performance.now(),e.writeSSE(du).catch(()=>{}),r=setTimeout(a,t)):r=setTimeout(a,t-i)};return r=setTimeout(a,t),{writeSSE:async t=>{await e.writeSSE(t),o=performance.now()},stop:()=>{n=!0,clearTimeout(r),r=void 0}}}function fu(e,t){let r={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")},o=e.thinking;if(o&&"object"==typeof o){let{type:e,budget_tokens:t}=o;"string"==typeof e&&(r["copilot_api.thinking.type"]=e),"number"==typeof t&&t&&(r["copilot_api.thinking.budget_tokens"]=t)}let n=e.output_config?.effort;return"string"==typeof n&&n&&(r["copilot_api.output_config.effort"]=n),r}function hu(e,t,r){let o=fu(t,r);for(let[t,r]of Object.entries(o))void 0!==r&&e.setAttribute(t,r)}const gu=async(e,t,o)=>{try{return await yu(e,t)}catch(n){if(n instanceof mr&&401===n.response.status){if(!await Zr(n))throw n;return yu(e,t)}if(n instanceof mr&&400===n.response.status&&o?.onStructuredOutputFallback){let a;try{a=await n.response.clone().text()}catch{a=void 0}let i=o.onStructuredOutputFallback(e,a);if(i)return r.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${i.model}`),yu(i,t)}throw n}};const yu=async(e,t)=>{if(!mo(he))throw Error("Service token not found");let{baseUrl:r,headers:o,cleanPayload:n}=lo(he)&&he.foundry?{baseUrl:io(he.foundry),headers:so(he.foundry,t),cleanPayload:e}:function(e,t){let{metadata:r,...o}=e,n=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(o),a={...Rt(he,t,n),"X-Initiator":"agent"};return{baseUrl:Ot(he),headers:a,cleanPayload:o}}(Aa(e),t),a=`${r}/v1/messages`,i=he.timeoutMs,s=JSON.stringify(n),l=function(e,t,r){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":r,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough","copilot_api.upstream.provider":he.provider,...fu(e,t?.anthropicBeta)}}(n,t,i);for(let e=0;e<=1;e++){me();let t=Zi(r,{fresh:e>0}),c=new AbortController,u=Yo(c,i);try{let{statusCode:r,headers:p,body:d,span:m}=await vt({spanName:"copilot POST /v1/messages",url:a,target:"anthropic_messages",headers:o,body:s,signal:c.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:t}).finally(u.headersArrived),f=rs(d,{status:r,headers:p});if(!f.ok)throw m.end(),new mr("Failed to create anthropic messages",f,{outgoingBody:s,outgoingHeaders:o});if(n.stream)return{events:os(f,d),span:m,release:()=>Qi(t)};try{let e=await f.json();"string"==typeof e.id&&m.setAttribute("copilot_api.response.id",e.id);let t=e.usage;return t&&Ai(m,{prompt_tokens:t.input_tokens??0,completion_tokens:t.output_tokens??0,total_tokens:(t.input_tokens??0)+(t.output_tokens??0)}),e}finally{m.end(),Qi(t)}}catch(r){if(Qi(t),await dr(r,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw r}finally{u.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},_u=new Set(["resolveStreamComplete","requestId"]);function wu(e,t){if(!t)return e;let r=JSON.parse(e),o={...r.usage};for(let[e,r]of Object.entries(t))"number"==typeof r&&r>0&&!o[e]&&(o[e]=r);return JSON.stringify({...r,usage:o})}async function bu(e,t,r){let{stream:o,client:n}=t,{reason:a,progress:i}=r,s=await async function(e){let t=e.req.raw,r=new Request(t.url,{method:t.method,headers:t.headers,body:JSON.stringify(await e.req.json()),signal:Lt(e)}),o=new L(r,{env:e.env});for(let[t,r]of Object.entries(e.var))_u.has(t)||o.set(t,r);return o}(e);try{let e,t=await async function(e,t,r){let o=await ln(e,t,r);if(o.ok&&o.body)return o;throw await(o.body?.cancel()),new mr("Copilot fallback failed",o)}(s,a,r.failure);for await(let{event:r,data:o}of K(t))r&&void 0!==o&&"ping"!==r&&("message_start"===r&&i.messageStart?e=JSON.parse(o).message?.usage:await n.writeSSE({event:r,data:"message_delta"===r?wu(o,e):o}))}catch(t){if(Ft(e))return;let r=e.get("requestSpan");throw r&&ht(r,t),await Ri(o,t),t}finally{e.set("requestData",s.get("requestData"))}}const vu=24e4;var ku=class extends fr{name="StreamHeadersTimeoutError"};function xu(){if(le())return;let e=new AbortController,t=setTimeout(()=>{e.abort(new ku(vu))},vu);return{signal:e.signal,clear:()=>clearTimeout(t)}}function Tu(e,t){e.get("requestSpan")?.setAttribute("copilot_api.stream.headers_wait_ms",Math.round(performance.now()-t))}async function Au(e,t,r){let o=e.get("requestSpan");try{let n=await async function(e,t){let r,o=new Promise(e=>{r=setTimeout(()=>e(void 0),t)});try{return await Promise.race([e.then(e=>({value:e})),o])}finally{clearTimeout(r)}}(t,15e3);return o?.setAttribute("copilot_api.stream.early_commit",!n),n&&Tu(e,r),n}catch(t){throw o?.setAttribute("copilot_api.stream.early_commit",!1),Tu(e,r),t}}const Su={400:"invalid_request_error",401:"authentication_error",403:"permission_error",404:"not_found_error",413:"request_too_large",429:"rate_limit_error",503:"overloaded_error",529:"overloaded_error"},$u=e=>Su[e]??(e>=500?"api_error":"invalid_request_error");async function Eu(e,t){let r=new L(e.req.raw,{env:e.env,path:e.req.path});for(let[t,o]of Object.entries(e.var))r.set(t,o);let o=await jr(r,t);if(499===o.status)return;if((e=>e instanceof ku||e instanceof Error&&e.cause instanceof ku)(t))return await(o.body?.cancel()),{type:"overloaded_error",message:"Upstream sent no response within 240s; retry"};let n=(await o.json().catch(()=>{}))?.error?.message??"Upstream request failed";return gr(t)?{type:"overloaded_error",message:n}:{type:$u(o.status),message:n}}async function Ou(e,t,r){await t.client.writeSSE(du);try{let t=await r.pending;return Tu(e,r.start),t}catch(o){if(Tu(e,r.start),Ft(e))return void Oe.completionCallbacks.delete(e.get("requestId"));let n=function(e,t){if(nn(e))return Vo(t,void 0!==en()?.sent)}(e,o);if(n)return void await bu(e,t,{reason:n,progress:{messageStart:!1,content:!1,held:[]},failure:o});let a=await Eu(e,o);return void(a&&await t.client.writeSSE({event:"error",data:JSON.stringify({type:"error",error:a})}))}}const Cu=new Set(["low","medium","high","max","xhigh"]),Iu=(e,t)=>!(!e||!t||e===t);function Ru(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!Cu.has(t))return e;let o=he.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,n=Mo(t,o);if(!n||!Cu.has(n))return e;let a=n;if(a===t)return e;r.debug(`Effort clamp: ${t} → ${a}`);let i=f.getActiveSpan();return i?.setAttribute("copilot_api.effort.requested",t),i?.setAttribute("copilot_api.effort.clamped_to",a),{...e,output_config:{...e.output_config,effort:a}}}function Pu(e,t,o){if("foundry"===he.provider)return Ru(e);let n=t.includes(e.model)?e.model:Po(e.model,t)??e.model,a=n===e.model?e:{...e,model:n},i=function(e,t,r={}){let o=Po(e,t);return o&&r.context1m?function(e,t){let r=`${e}-1m`;if(t.has(r))return r;let o=`${e}-1m-`;for(let e of t)if(e.startsWith(o))return e;return null}(o,new Set(t)):null}(a.model,t,{context1m:o.context1m}),s=a;if(i&&i!==a.model){r.debug(`Resolved model variant: ${a.model} → ${i}`);let e=f.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",a.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),s={...a,model:i}}return Ru(s)}const qu=e=>"object"==typeof e&&!!e&&!Array.isArray(e),Mu=["properties","patternProperties","$defs","definitions"],Nu=["items","additionalProperties","propertyNames","contains","not","if","then","else"],ju=["anyOf","allOf","oneOf","prefixItems"];const Du=()=>["string","number","boolean"].map(e=>({type:e})),Lu=()=>({anyOf:[...Du(),{type:"array",items:{anyOf:Du()}},{type:"object"}]}),Bu=e=>!0===e||qu(e)&&0===Object.keys(e).length,Fu=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function Uu(e,t){let r={...e};for(let e of Mu){let o=r[e];qu(o)&&(r[e]=Object.fromEntries(Object.entries(o).map(([e,r])=>[e,qu(r)?Uu(r,t):r])))}for(let e of Nu){let o=r[e];qu(o)&&(r[e]=Uu(o,t))}for(let e of ju){let o=r[e];Array.isArray(o)&&(r[e]=o.map(e=>qu(e)?Uu(e,t):e))}return"prefixItems"in r&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(qu(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let r=t.flatMap(e=>Bu(e)?Lu().anyOf:qu(e)?[e]:[]);if(0===r.length)return;let o=[...new Map(r.map(e=>[JSON.stringify(e),e]))].map(([,e])=>e);e.items=1===o.length?o[0]:{anyOf:o}}(r)),Fu(r)&&(!("items"in r)||Bu(r.items))&&(t.add("items"),r.items=Lu()),Bu(r.additionalProperties)&&(t.add("additionalProperties"),delete r.additionalProperties),r}function Hu(e){let t=[],r=[];for(let o of e)switch(o.role){case"system":{if(r.length>0){r.push(o);break}let e=Ju(o);e&&t.push(e);break}case"user":case"assistant":r.push(o)}return{leadingSystemTexts:t,messages:r}}function zu(e){return Gu(Ju(e))}function Ju(e){return"string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.flatMap(e=>"text"===e.type&&"string"==typeof e.text?[e.text]:[]).join("\n\n"):""}function Gu(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function Ku(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>Gu(e)).filter(Boolean).join("\n\n")}const Wu=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),Yu=new Set(["text","image"]);function Vu(e,t){if(Array.isArray(e?.content))for(let r of e.content){if(t.size>=20)return;let e=String(r?.type).slice(0,64);Yu.has(e)||t.add(`block:tool_result:${e}`)}}const Xu=new Set;function Zu(e,t){e.setAttribute("copilot_api.translation.system_message_count",t.filter(e=>"system"===e.role).length),e.setAttribute("copilot_api.translation.has_images",function(e){return e.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type||"tool_result"===e.type&&Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)))}(t));let r=function(e){let t=new Set;for(let r of e){if(t.size>=20)break;let e=String(r.role).slice(0,64),o=Wu.get(e);if(o){if(Array.isArray(r.content))for(let n of r.content){let r=String(n?.type).slice(0,64);if(o.has(r)||t.add(`block:${e}:${r}`),"tool_result"===r&&Vu(n,t),t.size>=20)break}}else t.add(`role:${e}`)}return[...t].sort()}(t);if(0===r.length)return;e.setAttribute("copilot_api.translation.unknown_shapes",r.join(","));let o=function(e){let t=[];for(let r of e){if(Xu.size>=100)break;Xu.has(r)||(Xu.add(r),t.push(r))}return t}(r);0!==o.length&&n.warn(`Request contains message shapes the translator does not handle (dropped): ${o.join(", ")}`)}const Qu=e=>q("sha256").update(e).digest("hex").slice(0,12);function ep(e,t){e.setAttribute("copilot_api.translation.system_hash",Qu(t.system)),e.setAttribute("copilot_api.translation.tools_hash",Qu(JSON.stringify(t.tools??[])))}function tp(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function rp(e){return e.toLowerCase().startsWith("claude-")}function op(e,t){let r={model:e.model,messages:np(e.messages,e.system),max_tokens:e.max_tokens,stop:e.stop_sequences,stream:e.stream,temperature:e.temperature,top_p:e.top_p,user:e.metadata?.user_id,tools:dp(e.tools,e.model),tool_choice:mp(e.tool_choice)},o=e.thinking;if("enabled"===o?.type||"adaptive"===o?.type){let n=ji(t,r.model);if(n){let a="enabled"===o.type&&"number"==typeof o.budget_tokens?o.budget_tokens:function(e,t,r){let o=function(e,t){return"max"===e||"xhigh"===e?t:"medium"===e?8e3:"low"===e?1024:16e3}(e,r.max),n=qi(t),a=n&&n>1?n-1:r.min;return Mi(Math.min(o,a),r.min,r.max)}(e.output_config?.effort??"high",r.max_tokens,n.bounds);r=Li({...r,thinking_budget:a},t)}}return r}function np(e,t){let{leadingSystemTexts:r,messages:o}=Hu(e),n=function(e,t){let r=Ku(e,t);return r?[{role:"system",content:r}]:[]}(t,r),a=[];for(let e of o)switch(e.role){case"system":{let t=zu(e);if(!t)break;ap(n)?a.push(t):ip(n,t);break}case"user":n.push(...sp(e));for(let e of a)ip(n,e);a=[];break;case"assistant":n.push(...lp(e))}for(let e of a)ip(n,e);return n}function ap(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function ip(e,t){let r=function(e){return e.trimStart().startsWith("<system-reminder>")?e:`<system-reminder>\n${e}\n</system-reminder>`}(t),o=e.at(-1);"user"===o?.role?Array.isArray(o.content)?o.content.push({type:"text",text:r}):o.content=o.content?`${o.content}\n\n${r}`:r:e.push({role:"user",content:r})}function sp(e){let t=[];if(Array.isArray(e.content)){let r=e.content.filter(e=>"tool_result"===e.type),o=e.content.filter(e=>"tool_result"!==e.type);for(let e of r)t.push({role:"tool",tool_call_id:e.tool_use_id,content:pp(e.content)});o.length>0&&t.push({role:"user",content:pp(o)})}else t.push({role:"user",content:pp(e.content)});return t}function lp(e){let t=function(e){return{reasoning_text:up(e.reasoning_text),reasoning_opaque:up(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:pp(e.content),...t}];let r=e.content.filter(e=>"tool_use"===e.type),o=e.content.filter(e=>"text"===e.type),n=e.content.filter(e=>"thinking"===e.type),a=[...o.map(e=>e.text),...n.map(e=>e.thinking)].join("\n\n");return r.length>0?[{role:"assistant",content:a||null,...t,tool_calls:r.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:"assistant",content:pp(e.content),...t}]}const cp=32768;function up(e){if("string"==typeof e)return e.length<=cp?e:e.slice(0,cp)}function pp(e){if("string"==typeof e)return e;if(!Array.isArray(e))return null;if(!e.some(e=>"image"===e.type))return e.filter(e=>"text"===e.type||"thinking"===e.type).map(e=>"text"===e.type?e.text:e.thinking).join("\n\n");let t=[];for(let r of e)switch(r.type){case"text":t.push({type:"text",text:r.text});break;case"thinking":t.push({type:"text",text:r.thinking});break;case"image":t.push({type:"image_url",image_url:{url:`data:${r.source.media_type};base64,${r.source.data}`}})}return t}function dp(e,t){if(!e)return;let r=e.filter(au),o=function(e){return e.toLowerCase().startsWith("gemini")}(t),n=new Set,a=r.map(e=>{let t=e.input_schema;if(o){let e=function(e){let t=new Set;return{schema:Uu(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)n.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return n.size>0&&f.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...n].sort().join(",")),a}function mp(e){if(e)switch(e.type){case"auto":return"auto";case"any":return"required";case"tool":return e.name?{type:"function",function:{name:e.name}}:void 0;case"none":return"none";default:return}}function fp(e){return"string"==typeof e?[{type:"text",text:e}]:Array.isArray(e)?e.filter(e=>"text"===e.type).map(e=>({type:"text",text:e.text})):[]}function hp(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function gp(e){return e?e.map(e=>{let t={};try{t=JSON.parse(e.function.arguments)}catch{n.warn(`Failed to parse tool call arguments for "${e.function.name}": ${e.function.arguments.slice(0,200)}`)}return{type:"tool_use",id:e.id,name:e.function.name,input:t}}):[]}const yp=new Set(["low","medium","high","max","xhigh"]);function _p(e,t){let r=e.thinking;if(!r||"enabled"!==r.type)return e;let o=t?.data.find(t=>t.id===e.model);if(!o||!o.capabilities.supports.adaptive_thinking)return e;let n={...e,thinking:{type:"adaptive"}};if(!e.output_config?.effort){let t=(e=>null!==e&&yp.has(e)?e:null)(Mo(function(e){return!e||e<=0?"medium":e<8e3?"low":e<24e3?"medium":"high"}(r.budget_tokens),o.capabilities.supports.reasoning_effort));t&&(n.output_config={...e.output_config,effort:t})}return n}function wp(e){return"string"!=typeof e&&Array.isArray(e)?e.map(e=>{let t=e;if(!t.cache_control||"object"!=typeof t.cache_control)return e;let r=t.cache_control;if("string"!=typeof r.type){let{cache_control:e,...r}=t;return r}let o={type:r.type};return void 0!==r.ttl&&(o.ttl=r.ttl),{...t,cache_control:o}}):e}const bp=/[^\w-]/g;function vp(e){return e.replaceAll(bp,"_")}function kp(e,t){let r=function(e,t){if(!e.output_config?.effort)return e;let r=t?.data.find(t=>t.id===e.model);if(!r)return e;let o=r.capabilities.supports.reasoning_effort;if(Array.isArray(o)&&o.length>0)return e;let{effort:n,...a}=e.output_config;if(0===Object.keys(a).length){let{output_config:t,...r}=e;return r}return{...e,output_config:a}}(e,t);return r=_p(r,t),r=function(e,t){let r=e.max_tokens;if("number"!=typeof r)return e;let o=t?.data.find(t=>t.id===e.model);if(!o)return e;let n=o.capabilities.limits;if(!n)return e;let a=(!1===e.stream?n.max_non_streaming_output_tokens:void 0)??n.max_output_tokens;if("number"!=typeof a||a<=0)return e;let i=Math.max(Math.min(r,a),16);return i===r?e:{...e,max_tokens:i}}(r,t),r={...r,system:wp(r.system)},r=function(e){let t=e.messages.map(e=>{if(!Array.isArray(e.content))return e;let t=e.content.map(e=>{let t=e;return"tool_use"===t.type&&"string"==typeof t.id?{...t,id:vp(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:vp(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(r),r}function xp(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"thinking must be an object";let r=t;return"string"==typeof r.type?"enabled"!==r.type||void 0===r.budget_tokens||"number"==typeof r.budget_tokens&&Number.isFinite(r.budget_tokens)&&!(r.budget_tokens<=0)&&Number.isInteger(r.budget_tokens)?null:"thinking.budget_tokens must be a positive integer":"thinking.type must be a string"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"output_config must be an object";let r=t;return void 0===r.effort||"string"==typeof r.effort?null:"output_config.effort must be a string"}(e)}function Tp(e,t,r=400){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},r)}function Ap(e,t){return Ne.startActiveSpan("copilot_api.model.validate",o=>{try{o.setAttribute("copilot_api.model.requested",t.model),hu(o,t,e.req.header("anthropic-beta"));let n=$i(t.model);o.setAttribute("copilot_api.model.normalized",n);let a=xp(t);return a?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}):n===t.model?(o.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(o.setAttribute("copilot_api.model.was_mapped",!0),Ge.add(1,{from_model:t.model,to_model:n}),r.debug(`Model mapping: '${t.model}' → '${n}'`),{ok:!0,payload:{...t,model:n}})}catch(t){if(t instanceof Si)return{ok:!1,response:Tp(e,t.message,t.statusCode)};throw t}finally{o.end()}})}var Sp=class extends Ci{name="UpstreamIdleError";constructor(e){super("api_error",`Upstream sent nothing for ${Math.round(e/1e3)}s; stream aborted`)}};function $p(e,t,r){let{leadingSystemTexts:o,messages:n}=Hu(e.messages),a=function(e){let t=[],r=[];for(let o of e)switch(o.role){case"system":{let e=zu(o);if(!e)break;"function_call"===t.at(-1)?.type?r.push(e):t.push(Pp(e));break}case"user":t.push(...qp(o),...r.map(e=>Pp(e))),r=[];break;case"assistant":t.push(...jp(o))}return t.push(...r.map(e=>Pp(e))),t}(n);if(0===a.length)throw new mr("request has no translatable message content",Response.json({type:"error",error:{type:"invalid_request_error",message:"request has no translatable message content"}},{status:400}));let i={model:e.model,input:a,max_output_tokens:Math.max(e.max_tokens,16),stream:e.stream,temperature:e.temperature,top_p:e.top_p,store:!1,user:e.metadata?.user_id?.slice(0,64)},s=function(e,t){return Ku(e,t)||null}(e.system,o);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(au).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(i.tool_choice=function(e){switch(e.type){case"auto":return"auto";case"any":return"required";case"none":return"none";case"tool":return e.name?{type:"function",name:e.name}:void 0;default:return}}(e.tool_choice));let l=function(e,t,r){if("adaptive"===e.thinking?.type){let t=e.output_config?.effort??"high";return r&&"max"===t?{effort:"max"}:{effort:Rp(t)}}if("enabled"===e.thinking?.type&&e.thinking.budget_tokens){let{effort:r}=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens),o=Mo(r,t);return{effort:Ip(o)?o:r}}}(e,t,r?.keepMax??!1);return l&&(i.reasoning=l),r?.promptCacheKey&&(i.prompt_cache_key=r.promptCacheKey),i}function Ep(e,t){let r=e?.trim()||t?.trim();if(r)return`cc-${q("sha256").update(r).digest("hex").slice(0,32)}`}function Op(e){let t=e?.input_tokens??0,r=e?.input_tokens_details?.cached_tokens;return{input_tokens:void 0===r?t:Math.max(t-r,0),output_tokens:e?.output_tokens??0,...void 0===r?{}:{cache_read_input_tokens:r}}}const Cp=new Set(["low","medium","high","xhigh"]),Ip=e=>null!==e&&Cp.has(e);function Rp(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Pp(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function qp(e){if("string"==typeof e.content)return[{type:"message",role:"user",content:e.content}];let t=[],r=e.content.filter(e=>"tool_result"===e.type),o=e.content.filter(e=>"tool_result"!==e.type);for(let e of r)t.push(Np(e));if(o.length>0)if(o.some(e=>"image"===e.type)){let e=[];for(let t of o)switch(t.type){case"text":e.push({type:"input_text",text:t.text});break;case"image":e.push(Mp(t))}t.push({type:"message",role:"user",content:e})}else{let e=o.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function Mp(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function Np(e){if(Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)){let t=e.content.filter(e=>["image","text"].includes(e.type)).map(e=>"image"===e.type?Mp(e):{type:"input_text",text:e.text});return e.is_error&&t.unshift({type:"input_text",text:"[ERROR]"}),{type:"function_call_output",call_id:e.tool_use_id,output:t}}let t;return t="string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.filter(e=>"text"===e.type).map(e=>e.text).join("\n"):"",e.is_error&&(t=`[ERROR] ${t}`),{type:"function_call_output",call_id:e.tool_use_id,output:t}}function jp(e){if("string"==typeof e.content)return[{type:"message",role:"assistant",content:e.content}];let t=[],r=e.content.filter(e=>"text"===e.type),o=e.content.filter(e=>"thinking"===e.type),n=e.content.filter(e=>"tool_use"===e.type),a=[...r.map(e=>e.text),...o.map(e=>e.thinking)].join("\n\n");a&&t.push({type:"message",role:"assistant",content:a});for(let e of n)t.push({type:"function_call",call_id:e.id,name:e.name,arguments:JSON.stringify(e.input)});return t}function Dp(e,t){if("incomplete"===e.status)return"content_filter"===e.incomplete_details?.reason?"refusal":"max_tokens";if(t)return"tool_use";switch(e.status){case"completed":case"cancelled":case"failed":return"end_turn";default:return null}}function Lp(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Bp(e,t,r){e.messageStartSent||=(e.responseId=r?.responseId??e.responseId,e.model=r?.model??e.model,t.push({type:"message_start",message:{id:e.responseId,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}),!0)}function Fp(e,t){let r=[];switch(e.type){case"response.created":Bp(t,r,{responseId:e.response.id,model:e.response.model});break;case"response.in_progress":case"response.output_text.done":case"response.function_call_arguments.done":break;case"response.output_item.added":if("function_call"===e.item.type){Bp(t,r),Lp(t,r);let o=e.item;t.toolCalls[e.output_index]={call_id:o.call_id,name:o.name,_bi1:t.contentBlockIndex},r.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"tool_use",id:o.call_id,name:o.name,input:{}}}),t.contentBlockOpen=!0}break;case"response.content_part.added":Bp(t,r),Lp(t,r),r.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),t.contentBlockOpen=!0;break;case"response.output_text.delta":r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"response.content_part.done":Lp(t,r);break;case"response.function_call_arguments.delta":{let o=t.toolCalls[e.output_index];o&&r.push({type:"content_block_delta",index:o._bi1,delta:{type:"input_json_delta",partial_json:e.delta}});break}case"response.output_item.done":if("function_call"===e.item.type){let o=t.toolCalls[e.output_index];o&&t.contentBlockOpen&&(r.push({type:"content_block_stop",index:o._bi1}),t.contentBlockIndex++,t.contentBlockOpen=!1)}break;case"response.completed":{Lp(t,r);let o=e.response.output.some(e=>"function_call"===e.type),n=e.response.usage,a=Dp(e.response,o);t.terminalEvent=e.type,t.stopReason=a,r.push({type:"message_delta",delta:{stop_reason:a,stop_sequence:null},usage:Op(n)},{type:"message_stop"});break}case"response.incomplete":{Bp(t,r),Lp(t,r);let o=e.response.usage,n=Dp(e.response,!1);t.terminalEvent=e.type,t.stopReason=n,r.push({type:"message_delta",delta:{stop_reason:n,stop_sequence:null},usage:Op(o)},{type:"message_stop"});break}case"response.failed":Bp(t,r),Lp(t,r),t.terminalEvent=e.type,r.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":Bp(t,r),Lp(t,r),t.terminalEvent=e.type,t.stopReason="end_turn",r.push({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{input_tokens:0,output_tokens:0}},{type:"message_stop"});break;case"response.refusal.delta":Bp(t,r),t.contentBlockOpen||=(r.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"error":t.terminalEvent=e.type,r.push({type:"error",error:{type:e.code??"api_error",message:e.message??"Response generation failed"}})}return r}function Up(e,t,r){let o=t.reasoning?.effort,n=e.get("requestData")||{};n.reasoningEffort=o,n.effortClamped=Iu(r,o),e.set("requestData",n)}function Hp(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function zp(e,t,o){let n=!1;for(let a of t){if(r.debug("Translated Anthropic event:",a),"error"===a.type)throw new Ci(a.error.type,a.error.message);if("message_start"===a.type){await e.writeSSE({event:a.type,data:JSON.stringify(a)}),o.messageStart=!0,n=!0;continue}let t="content_block_start"===a.type&&"text"===a.content_block.type&&!a.content_block.text,i="content_block_stop"===a.type&&o.held.length>0;if(o.content||!t&&!i){o.content=!0;for(let t of o.held.splice(0))await e.writeSSE({event:t.type,data:JSON.stringify(t)});await e.writeSSE({event:a.type,data:JSON.stringify(a)}),n=!0}else o.held.push(a)}return n}function Jp(e){let t,r=0;return{progress:e=>!function(e){if("keepalive"===e.event)return!0;let{data:t}=e;if(!t?.includes('"keepalive"'))return!1;try{return"keepalive"===JSON.parse(t).type}catch{return!1}}(e)||(r++,!1),forwarded:()=>{t=performance.now()},record:o=>{o.setAttribute("copilot_api.upstream.keepalive_count",r),void 0!==t&&o.setAttribute("copilot_api.stream.last_forward_ms",Math.round(t-e))}}}function Gp(e){if(e)try{return JSON.parse(e)}catch(t){return void r.warn("Failed to parse streaming chunk:",e.slice(0,200),t)}}function Kp(e,t){let r=performance.now()-t;return nt.record(r,{model:e.model,target:"responses",streaming:String(!!e.stream)}),r}function Wp(e,t){return G(e,async r=>{let o=mu(r);r.onAbort(()=>{o.stop(),Bt(e)});try{await t({stream:r,client:o})}finally{o.stop();try{let t=e.get("requestId");t&&Oe.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}})}async function Yp(e,t,o){r.debug("Streaming Responses API response");let n,{stream:a,client:i}=t,{events:s,span:l,release:c}=o.response,{model:u,copilotStart:p,_d1:d,upstreamIdle:m}=o,f=null,h=0,g=performance.now(),y=Jp(g),_=Ui(e,p),w={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}},b={messageStart:!1,content:!1,held:[]};try{for await(let t of async function*(e,t,r={}){let o,{idleMs:n=3e5,progress:a=()=>!0}=r,i=e[Symbol.asyncIterator](),s={idle:!1};try{for(;;){let e,r=new Promise((e,r)=>{o=setTimeout(()=>{s.idle=!0;let e=new Sp(n);t.abort(e),r(e)},n)});try{do{e=await Promise.race([i.next(),r])}while(!e.done&&!a(e.value))}finally{clearTimeout(o)}if(e.done)return;yield e.value}}finally{clearTimeout(o),s.idle||await(i.return?.())}}(s,m,{progress:y.progress})){_(),r.debug("Responses API raw stream event:",t);let o=Gp(t.data);if(!o)continue;h++,Ze.add(1,{model:u,endpoint_type:"responses"});let n=ks(o);if(n){f=n;let t=e.get("requestData")||{};t.tokenUsage=Ti(f),t._d1=d,e.set("requestData",t)}await zp(i,Fp(o,w),b)&&y.forwarded()}(function(e){if(!e.terminalEvent)throw new Ci("api_error","Upstream stream ended before the response completed")})(w),sn();let t=performance.now()-g,o={model:u,endpoint_type:"responses"};at.record(t,o),dt.record(h,o),Hi(e,p)}catch(t){if(Ft(e))return;if(b.content||!nn(e))throw function(e,t,r){if(!(t instanceof Ci))return;let o="stream_incomplete";t instanceof Sp?o="upstream_idle":r.terminalEvent&&(o="upstream_failure"),e?.setAttribute("copilot_api.error_type",o)}(e.get("requestSpan"),t,w),gt(l,e.get("requestSpan"),t),await Ri(a,t),t;n=t instanceof Sp?"foundry_stream_idle":"foundry_stream_failed",ht(l,t)}finally{f&&Ai(l,f),y.record(l),n||function(e,t,r){e&&(Hp(e,r?.completion_tokens_details?.reasoning_tokens),e.setAttribute("copilot_api.stream.terminal_event",t.terminalEvent??"none"),void 0!==t.stopReason&&e.setAttribute("copilot_api.translation.stop_reason",t.stopReason??"null"),e.setAttribute("copilot_api.translation.tool_use_count",Object.keys(t.toolCalls).length))}(e.get("requestSpan"),w,f),l.end(),c()}n&&await bu(e,t,{reason:n,progress:b})}async function Vp(e,t,n){let a=performance.now(),i=Ne.startActiveSpan("copilot_api.translate.anthropic_to_responses",r=>{try{r.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),r.setAttribute("copilot_api.translation.message_count",t.messages.length),Zu(r,t.messages);let o=$p(t,he.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===he.provider,promptCacheKey:"foundry"===he.provider?Ep(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return ep(r,{system:o.instructions??"",tools:o.tools}),o}finally{r.end()}});st.record(performance.now()-a,{direction:"anthropic_to_responses"}),r.debug("Translated Responses API payload:",i),e.set("requestData",{model:i.model,streaming:!!i.stream}),Up(e,i,n),he.manualApprove&&await ki();let s=performance.now(),l=new AbortController,{pending:c,capped:u}=function(e,t,r){let o=t.stream?xu():void 0;return{pending:_s(t,{onAttempt:t=>Up(e,t,r.requestedEffort),signal:AbortSignal.any([Lt(e),r.upstreamIdle.signal,...o?[o.signal]:[]])}).finally(()=>o?.clear()),capped:void 0!==o}}(e,i,{requestedEffort:n,upstreamIdle:l});if(u&&!await Au(e,c,s))return function(e,t,r){let{pending:o,copilotStart:n,upstreamIdle:a}=r;return an(),Wp(e,async r=>{let i=await Ou(e,r,{pending:o,start:n});i&&!vs(i)&&await Yp(e,r,{response:i,model:t.model,copilotStart:n,_d1:Kp(t,n),upstreamIdle:a})})}(e,i,{pending:c,copilotStart:s,upstreamIdle:l});let p=await c,d=Kp(i,s);if(vs(p)){let t=e.get("requestData")||{};if(Hp(e.get("requestSpan"),p.usage?.output_tokens_details?.reasoning_tokens),p.usage&&(t.tokenUsage=Ti({prompt_tokens:p.usage.input_tokens,completion_tokens:p.usage.output_tokens,total_tokens:p.usage.total_tokens,prompt_tokens_details:p.usage.input_tokens_details})),t._d1=d,t.upstreamTtfbMs=d,t.upstreamTotalMs=d,e.set("requestData",t),r.level>=o.debug&&r.debug("Non-streaming Responses API response:",JSON.stringify(p).slice(-400)),"failed"===p.status)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:p.error?.code??"api_error",message:p.error?.message??"Response generation failed"}},500);let n=performance.now(),a=Ne.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","responses_to_anthropic");let t=function(e){let t=[],r=!1;for(let o of e.output)if("message"===o.type)for(let e of o.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===o.type){r=!0;let e={};try{e=JSON.parse(o.arguments)}catch{}t.push({type:"tool_use",id:o.call_id,name:o.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:Dp(e,r),stop_sequence:null,usage:Op(e.usage)}}(p);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return st.record(performance.now()-n,{direction:"responses_to_anthropic"}),e.json(a)}return an(),Wp(e,t=>Yp(e,t,{response:p,model:i.model,copilotStart:s,_d1:d,upstreamIdle:l}))}function Xp(e,t){e.thinkingBlockOpen||(e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1),t.push({type:"content_block_start",index:e.contentBlockIndex,content_block:{type:"thinking",thinking:""}}),e.thinkingBlockOpen=!0,e.contentBlockOpen=!0)}function Zp(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Qp(e,t){let r=[];if(0===e.choices.length)return r;let o=e.choices[0],{delta:n}=o;if(t.messageStartSent||=(r.push({type:"message_start",message:{id:e.id,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:0}}}),!0),"string"==typeof n.reasoning_text&&""!==n.reasoning_text&&(Xp(t,r),r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"thinking_delta",thinking:n.reasoning_text}})),"string"==typeof n.reasoning_opaque&&""!==n.reasoning_opaque&&(Xp(t,r),r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:n.reasoning_opaque}}),Zp(t,r)),n.content&&(Zp(t,r),function(e){return!!e.contentBlockOpen&&Object.values(e.toolCalls).some(t=>t._bi1===e.contentBlockIndex)}(t)&&(r.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1),t.contentBlockOpen||=(r.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:n.content}})),n.tool_calls){Zp(t,r);for(let e of n.tool_calls){if(e.id&&e.function?.name){t.contentBlockOpen&&=(r.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,!1);let o=t.contentBlockIndex;t.toolCalls[e.index]={id:e.id,name:e.function.name,_bi1:o},r.push({type:"content_block_start",index:o,content_block:{type:"tool_use",id:e.id,name:e.function.name,input:{}}}),t.contentBlockOpen=!0}if(e.function?.arguments){let o=t.toolCalls[e.index];o&&r.push({type:"content_block_delta",index:o._bi1,delta:{type:"input_json_delta",partial_json:e.function.arguments}})}}}return o.finish_reason&&(Zp(t,r),t.contentBlockOpen&&=(r.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),r.push({type:"message_delta",delta:{stop_reason:tp(o.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:"message_stop"})),r}const ed=/structured_outputs|output_config\.format/i;function td(e,t,r){return function(e,t,r){return!(!e.output_config?.format||"claude-haiku-4.5"===r||!t)&&ed.test(t)}(e,t,e.model)&&r?.data.some(e=>"claude-haiku-4.5"===e.id)?kp({...e,model:Oo},r):null}var rd=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var od=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const nd={tavily:async function(e,t,o){let n=function(e,t){let r={query:e,max_results:t?.maxResults??5};return t?.includeDomains?.length&&(r.include_domains=t.includeDomains),t?.excludeDomains?.length&&(r.exclude_domains=t.excludeDomains),r}(t,o);r.debug("Tavily search request:",JSON.stringify(n));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await bt({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(n),signal:a.signal,extraAttributes:{"tavily.max_results":o?.maxResults??5,"tavily.has_include_domains":!!o?.includeDomains?.length,"tavily.has_exclude_domains":!!o?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("tavily.results_count",e.results.length),r.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw ht(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new od:e}finally{clearTimeout(i)}},exa:async function(e,t,o){let n=function(e,t){let r={query:e,numResults:t?.maxResults??5,contents:{text:!0}};return t?.includeDomains?.length&&(r.includeDomains=t.includeDomains),t?.excludeDomains?.length&&(r.excludeDomains=t.excludeDomains),r}(t,o);r.debug("Exa search request:",JSON.stringify(n));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await bt({spanName:"exa POST /search",url:"https://api.exa.ai/search",target:"exa_search",method:"POST",headers:{"Content-Type":"application/json","x-api-key":e},body:JSON.stringify(n),signal:a.signal,extraAttributes:{"exa.max_results":o?.maxResults??5,"exa.has_include_domains":!!o?.includeDomains?.length,"exa.has_exclude_domains":!!o?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("exa.results_count",e.results.length),r.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw ht(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new rd:e}finally{clearTimeout(i)}}},ad=["tavily","exa"];function id(e){return"tavily"===e||"exa"===e}function sd(){return he.webSearchProviders.length>0}async function ld(e,t){return async function(e,t,o){let{providers:n,searchFns:a=nd}=o;if(0===n.length)throw Error("No web search provider configured");let i,s=[];for(let[o,l]of n.entries())try{let o=await a[l.name](l.key,e,t);return s.length>0&&r.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),o}catch(e){i=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);o!==n.length-1&&r.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${n[o+1].name}".`)}let l=i instanceof Error?i.message:String(i);throw r.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),i instanceof Error?i:Error("All web search providers failed")}(e,t,{providers:he.webSearchProviders})}function cd(e){let t=e.tools;return!(!t||1!==t.length)&&nu(t[0])}function ud(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function pd(e,t){let r=[{type:"web_search_tool_result_error",error_code:t.errorCode??"unavailable"}];return{type:"web_search_tool_result",tool_use_id:e,content:t.searchFailed?r:t.results}}async function dd(e,t){let o=function(e){let t,r=e.messages[0];if(!r||"user"!==r.role)return null;if("string"==typeof r.content)t=r.content;else{if(!Array.isArray(r.content))return null;{let e=r.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!o)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let n=function(e){let t=e.tools?.[0];return t&&nu(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);r.info(`Web search intercepted: "${o}"`);let a,i=[],s=!1;try{if(!sd())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await ld(o,{maxResults:Math.min(n.maxResults,10),includeDomains:n.allowedDomains,excludeDomains:n.blockedDomains})).map(e=>({type:"web_search_result",url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString("base64"),page_age:null}))}catch(e){r.error("Web search failed:",e),s=!0,a??="unavailable"}let l={query:o,results:i,model:t.model,searchFailed:s,errorCode:a};if(!t.stream)return e.set("requestData",{model:t.model,streaming:!1}),e.json(function(e){let{query:t,model:r}=e,o=`srvtoolu_${ud()}`,n=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:o,name:"web_search",input:{query:t}},{...pd(o,e)}];return{id:`msg_ws_${ud()}`,type:"message",role:"assistant",model:r,content:n,stop_reason:"end_turn",stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}(l));let c=function(e){let{query:t,model:r}=e,o=`srvtoolu_${ud()}`,n=`msg_ws_${ud()}`,a=[];return a.push({type:"message_start",message:{id:n,type:"message",role:"assistant",content:[],model:r,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:"content_block_start",index:0,content_block:{type:"text",text:""}},{type:"content_block_delta",index:0,delta:{type:"text_delta",text:"I'll search for that."}},{type:"content_block_stop",index:0},{type:"content_block_start",index:1,content_block:{type:"server_tool_use",id:o,name:"web_search",input:{}}},{type:"content_block_delta",index:1,delta:{type:"input_json_delta",partial_json:JSON.stringify({query:t})}},{type:"content_block_stop",index:1},{type:"content_block_start",index:2,content_block:pd(o,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),G(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}async function md(e){if(mo(he)||await Cn())return null;let t=xn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${An()}`}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function fd(e,t){let r=t.model;return r&&"string"==typeof r?null:Tp(e,"Model name is required and must be a string")}function hd(e,t){let r=performance.now()-t;return nt.record(r,{model:e.model,target:"chat_completions",streaming:String(!!e.stream)}),r}function gd(e,t){return G(e,async r=>{let o=mu(r);r.onAbort(()=>{o.stop(),Bt(e)});try{await t({stream:r,client:o})}finally{o.stop(),e.get("resolveStreamComplete")?.()}})}async function yd(e,t,r){let{pending:o,capped:n,copilotStart:a}=r;if(n&&!await Au(e,o,a))return function(e,t,r){let{pending:o,copilotStart:n}=r;return an(),gd(e,async r=>{let a=await Ou(e,r,{pending:o,start:n});if(a)bd(a)||(sn(),await _d(e,r,{response:a,model:t.model,copilotStart:n,_d1:hd(t,n)}));else{let t=e.get("requestId");t&&Oe.executeCompletion(t)}})}(e,t,{pending:o,copilotStart:a})}async function _d(e,t,o){r.debug("Streaming response from service");let{stream:n,client:a}=t,{events:i,span:s,release:l}=o.response,{model:c,copilotStart:u,_d1:p}=o,d=null,m=0,f=performance.now(),h=Ui(e,u),g={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{for await(let t of i){if(h(),r.debug("Raw stream event:",t),"[DONE]"===t.data)break;if(!t.data)continue;let o;try{o=JSON.parse(t.data)}catch(e){r.warn("Failed to parse streaming chunk:",t.data.slice(0,200),e);continue}if(m++,Ze.add(1,{model:c,endpoint_type:"anthropic"}),o.usage){d=o.usage;let t=e.get("requestData")||{};t.tokenUsage=Ti(d),t._d1=p,e.set("requestData",t)}let n=Qp(o,g);for(let e of n)r.debug("Translated Anthropic event:",e),await a.writeSSE({event:e.type,data:JSON.stringify(e)})}let t=performance.now()-f,o={model:c,endpoint_type:"anthropic"};if(at.record(t,o),dt.record(m,o),Hi(e,u),d){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Ti(d),t._d1=p,e.set("requestData",t))}}catch(t){throw gt(s,e.get("requestSpan"),t),await Ri(n,t),t}finally{d&&Ai(s,d),s.end(),l()}let y=e.get("requestId");y&&Oe.executeCompletion(y)}async function wd(e){let t=await e.req.json();if(cd(t))return fd(e,t)??dd(e,t);await Oi(he),r.debug("Anthropic request payload:",t);let n=t.output_config?.effort,a=fd(e,t);if(a)return a;t=function(e,t){return Pu(t,he.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Ap(e,t);if(!i.ok)return i.response;t=i.payload;let s=await md(e);if(s)return s;if(Ei(t.model))return Vp(e,t,n);if(function(e){if("foundry"!==he.provider)return rp(e);let t=he.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:rp(e)}(t.model))return async function(e,t,r){let o="foundry"===he.provider,n=o?t:kp(t,he.models),a={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},i=n.output_config?.effort;return e.set("requestData",{model:n.model,reasoningEffort:i,effortClamped:Iu(r,i),streaming:!!n.stream}),he.manualApprove&&await ki(),Ne.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",n.model),t.setAttribute("copilot_api.streaming",!!n.stream),hu(t,n,a.anthropicBeta);try{let r=performance.now(),i=await gu(n,a,{onStructuredOutputFallback:(e,r)=>{if(o)return null;let n=td(e,r,he.models);return n&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",n.model)),n}}),s=performance.now()-r;if(nt.record(s,{model:n.model,target:"anthropic_messages",streaming:String(!!n.stream)}),!n.stream){let r=i,o=r.usage;if(o){let t={input_tokens:o.input_tokens||0,output_tokens:o.output_tokens||0,cache_read_input_tokens:o.cache_read_input_tokens||0,cache_creation_input_tokens:o.cache_creation_input_tokens||0},r=e.get("requestData")||{};r.tokenUsage=Ti(vd(t)),r._d1=s,r.upstreamTtfbMs=s,r.upstreamTotalMs=s,e.set("requestData",r)}return t.end(),e.json(r)}let{events:l,span:c,release:u}=i;return G(e,async o=>{let a=0,i=performance.now(),s={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=Ui(e,r);try{try{for await(let e of l)d(),!e.data||"[DONE]"===e.data||(a++,Ze.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),kd(e.data,s)&&(p=!0)),await o.writeSSE(e);let e=performance.now()-i,t={model:n.model,endpoint_type:"anthropic_messages"};at.record(e,t),dt.record(a,t)}catch(t){throw gt(c,e.get("requestSpan"),t),await Ri(o,t),t}finally{if(Hi(e,r),p){let t=vd(s);Ai(c,t);let r=e.get("requestData")||{};r.tokenUsage=Ti(t),e.set("requestData",r)}c.end(),u()}let t=e.get("requestId");t&&Oe.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw ht(t,e),t.end(),e}})}(e,t,n);let l=performance.now(),c=Ne.startActiveSpan("copilot_api.translate.anthropic_to_openai",r=>{try{r.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),r.setAttribute("copilot_api.translation.message_count",t.messages.length),r.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),r.setAttribute("copilot_api.translation.has_system",!!t.system),r.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let o=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));r.setAttribute("copilot_api.translation.has_thinking",o),Zu(r,t.messages);let n=op(t,he.models),a=n.messages.at(0);return ep(r,{system:"system"===a?.role&&"string"==typeof a.content?a.content:"",tools:n.tools}),n}finally{r.end()}});st.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=Li(c,he.models),r.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:Iu(n,u),streaming:!!c.stream});let p=performance.now();he.manualApprove&&await ki();let{pending:d,capped:m}=function(e,t){let r=t.stream?xu():void 0;return{pending:cs(t,r&&{signal:AbortSignal.any([Lt(e),r.signal])}).finally(()=>r?.clear()),capped:void 0!==r}}(e,c),f=await yd(e,c,{pending:d,capped:m,copilotStart:p});if(f)return f;let h=await d,g=hd(c,p);if(bd(h)){let t=e.get("requestData")||{};h.usage&&(t.tokenUsage=Ti(h.usage)),t._d1=g,t.upstreamTtfbMs=g,t.upstreamTotalMs=g,e.set("requestData",t),r.level>=o.debug&&r.debug("Non-streaming response:",JSON.stringify(h).slice(-400));let n=performance.now(),a=Ne.startActiveSpan("copilot_api.translate.openai_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","openai_to_anthropic");let t=function(e){let t=[],r=[],o=[],n=null;n=e.choices[0]?.finish_reason??n;for(let a of e.choices){let e=hp(a.message),i=fp(a.message.content),s=gp(a.message.tool_calls);t.push(...e),r.push(...i),o.push(...s),("tool_calls"===a.finish_reason||"stop"===n)&&(n=a.finish_reason)}return{id:e.id,type:"message",role:"assistant",model:e.model,content:[...t,...r,...o],stop_reason:tp(n),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(h);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return st.record(performance.now()-n,{direction:"openai_to_anthropic"}),r.debug("Translated Anthropic response:",a),e.json(a)}return gd(e,t=>_d(e,t,{response:h,model:c.model,copilotStart:p,_d1:g}))}const bd=e=>Object.hasOwn(e,"choices");function vd(e){let t=e.input_tokens+e.cache_read_input_tokens+e.cache_creation_input_tokens;return{prompt_tokens:t,completion_tokens:e.output_tokens,total_tokens:t+e.output_tokens,prompt_tokens_details:{cached_tokens:e.cache_read_input_tokens}}}function kd(e,t){try{let r=JSON.parse(e);if("message_start"===r.type){let e=r.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===r.type){let e=r.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}const xd=new B;xd.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&cd(t)}catch{return!1}}(e)?await wd(e):await cn(e,"messages",wd)}catch(t){return await jr(e,t)}});const Td=new B;function Ad(e){return Ne.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let o=$i(e.model);return t.setAttribute("copilot_api.model.normalized",o),o===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ge.add(1,{from_model:e.model,to_model:o}),r.debug(`Normalized model from '${e.model}' to '${o}'`),{...e,model:o})}finally{t.end()}})}function Sd(e,t){let r=function(e){try{let t=JSON.parse(e);if(("response.completed"===t.type||"response.incomplete"===t.type)&&t.response?.usage){let e=t.response.usage;return{prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens,prompt_tokens_details:e.input_tokens_details}}}catch{}return null}(e);if(!r)return;t.usageRef.value=r;let o=t.c.get("requestData")||{};o.tokenUsage=Ti(r),o._d1=t._d1,t.c.set("requestData",o)}Td.get("/",async e=>{try{he.models||await dn();let t=he.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await jr(e,t)}});const $d=new Set(["message","function_call","function_call_output"]),Ed=new Set(["type","name","description","parameters"]);async function Od(e){if(!e)return!1;let t=e.sources;if(t&&t.length>0)return!1;let o=e.query??e.queries?.[0];return!(!o||!sd())&&(r.info(`Enriching web search: "${o}"`),e.sources=(await ld(o,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Cd(e){if(sd())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Od(e.action)}}catch(e){r.error("Failed to enrich non-streaming web search:",e)}}async function Id(e){if(!sd())return e;try{let t=JSON.parse(e);if("response.output_item.done"===t.type){let e=t.item;if("web_search_call"===e?.type&&await Od(e.action))return JSON.stringify(t)}}catch(e){r.error("Failed to enrich web search:",e)}return e}function Rd(e){switch(e.type){case"custom_tool_call":{let t=e.input;return{type:"function_call",call_id:e.call_id,name:e.name,arguments:JSON.stringify("string"==typeof t?{input:t}:t)}}case"custom_tool_call_output":return{type:"function_call_output",call_id:e.call_id,output:e.output};default:return $d.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Pd(e,t){if("function_call"!==e.type||!t.has(e.name))return!1;if(e.type="custom_tool_call","string"==typeof e.arguments){try{e.input=JSON.parse(e.arguments).input??e.arguments}catch{e.input=e.arguments}delete e.arguments}return!0}function qd(e,t){if(0===t.size)return e;try{let r=JSON.parse(e),o=r.type;if("response.output_item.added"===o||"response.output_item.done"===o){let e=r.item;if(e&&Pd(e,t))return JSON.stringify(r)}if("response.completed"===o){let o=r.response?.output;if(!o)return e;let n=!1;for(let e of o)Pd(e,t)&&(n=!0);if(n)return JSON.stringify(r)}}catch{}return e}function Md(e){return null!=e}function Nd(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function jd(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Dd(e){let t={model:e.model},{input:r,droppedInputTypes:o}=function(e){if(!Array.isArray(e))return{input:e,droppedInputTypes:[]};let t=new Set,r=[];for(let o of e){if(!Nd(o)){r.push(o);continue}let e=Rd(o);null===e?t.add(jd(o.type)):r.push(e)}return{input:r,droppedInputTypes:[...t]}}(e.input);void 0!==r&&(t.input=r);for(let r of["previous_response_id","prompt","conversation","instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])Md(e[r])&&(t[r]=e[r]);let n=new Set;if(Md(e.tools)){let r=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let r=e.type;if("web_search"===r||r.startsWith("web_search_"))return{type:e.type};let o={};for(let t of Object.keys(e))Ed.has(t)&&(o[t]=e[t]);return"custom"===o.type&&(o.type="function",t.add(o.name),o.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),o}),customToolNames:t}}(e.tools);t.tools=r.tools,n=r.customToolNames}if(Md(e.reasoning)&&"object"==typeof e.reasoning){let r=e.reasoning;t.reasoning={},Md(r.effort)&&(t.reasoning.effort=r.effort),Md(r.summary)&&(t.reasoning.summary=r.summary)}if(Md(e.text)&&"object"==typeof e.text){let r=e.text;Md(r.format)&&(t.text={format:r.format})}return{payload:t,customToolNames:n,droppedInputTypes:o}}function Ld(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Bd(e,t,r){let{payload:o,droppedInputTypes:n}=r;if(!Array.isArray(t)||!Array.isArray(o.input))return null;let a=f.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",o.input.length),0===t.length||o.input.length>0||Md(o.previous_response_id)||Md(o.prompt)||Md(o.conversation)?null:Ld(e,`input contains no supported items: every item was dropped (unsupported item types: ${n.join(", ")}). Provide at least one message, function_call or function_call_output item, or previous_response_id, prompt or conversation.`)}async function Fd(e){await Oi(he);let t=await e.req.json();if(!Nd(t))return Ld(e,"request body must be a JSON object");let o=function(e){return"foundry"===he.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:Dd(e)}(t),{customToolNames:n}=o,a=o.payload;r.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),n.size>0&&r.debug(`Custom tools detected: ${[...n].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:Ad(t)}}catch(t){if(t instanceof Si)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,a);if(!i.ok)return i.response;a=i.payload;let s=Bd(e,t.input,o);if(s)return s;let l=await xi(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),he.manualApprove&&await ki();let c=performance.now(),u=await _s(a,{signal:Lt(e)}),p=performance.now()-c;if(nt.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Ud(u))return async function(e,t,r){await Cd(t);let o=e.get("requestData")||{};return t.usage&&(o.tokenUsage=Ti({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens,prompt_tokens_details:t.usage.input_tokens_details})),o._d1=r,o.upstreamTtfbMs=r,o.upstreamTotalMs=r,e.set("requestData",o),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return G(e,async t=>{t.onAbort(()=>Bt(e));let r={value:null},o=0,i=performance.now(),s=Ui(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){o++;let s=qd(i.data,n);s=await Id(s);let l=s===i.data?i:{...i,data:s};Ze.add(1,{model:a.model,endpoint_type:"responses"}),Sd(s,{usageRef:r,c:e,_d1:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};at.record(l,u),dt.record(o,u),Hi(e,c)}catch(r){if(Ft(e))return;throw gt(m,e.get("requestSpan"),r),await Pi(t,r),r}finally{r.value&&Ai(m,r.value),m.end(),f()}}finally{!function(e){try{let t=e.get("requestId");t&&Oe.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}(e)}})}const Ud=e=>Object.hasOwn(e,"output"),Hd=new B;Hd.post("/",async e=>{try{return await cn(e,"responses",Fd)}catch(t){return await jr(e,t)}});const zd=new B;zd.get("/",e=>{try{return he.showToken?e.json({token:he._t1}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return r.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const Jd=new B;Jd.get("/",async e=>{try{let t=await Gn();return e.json(t)}catch(t){return r.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Gd=new B;function Kd(e,t,r){let o=function(e){if(!e)return;try{let t=JSON.parse(e),r=t.error?.message??t.message;if("string"==typeof r&&r.length>0)return Ta(r).slice(0,200)}catch{}let t=Ta(e).trim();return t.length>0?t.slice(0,200):void 0}(t),n=o?` (upstream: ${o})`:"";switch(!0){case 401===e:case 403===e:return`Authentication/entitlement failed (HTTP ${e}). Your GitHub Copilot subscription may be inactive, or the Auth token is invalid. Run \`copilot-api auth\` to re-authenticate; if it persists, this account has no active Copilot access${n}.`;case 402===e:return`Premium monthly quota exhausted (HTTP 402). Switch to a non-premium model (e.g. claude-haiku-4.5) or wait for the monthly quota reset${n}.`;case 400===e:return`Model '${r}' was rejected (HTTP 400). On individual plans only some models are entitled — try claude-haiku-4.5, or run \`copilot-api doctor\` to see what works${n}.`;case 413===e:return`Request too large (HTTP 413)${n}.`;case 429===e:return`Rate limited upstream (HTTP 429) — wait and retry${n}.`;case 503===e:return`Service not ready (HTTP 503) — the model catalog or Service token is still warming up. Retry in a few seconds${n}.`;case e>=500:return`Upstream error (HTTP ${e})${n}.`;default:return`Unexpected response (HTTP ${e})${n}.`}}async function Wd(e={}){let t=performance.now(),r=e.model&&function(e){let t=he.models?.data.find(t=>t.id===e);return void 0!==t&&Ca(t)}(e.model)?[e.model]:function(e){return e.filter(e=>Ca(e)).map((e,t)=>({id:e.id,rank:Ia(e),index:t})).sort((e,t)=>e.rank-t.rank||e.index-t.index).map(e=>e.id)}(he.models?.data??[]).slice(0,3);if(0===r.length)return{ok:!1,durationMs:0,reason:"No models available — the catalog is empty (upstream /models failed at startup). Check connectivity and authentication."};let o,n=e.timeoutMs??3e4,a=()=>Math.round(performance.now()-t),i=r[0],s=!1,l=e=>(i=e,async function(e,t){try{let r=await Gd.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[$a]:Ea},body:JSON.stringify({model:e,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(r.ok)return{ok:!0,model:e,status:r.status,durationMs:t()};let o=await r.text().catch(()=>"");return{ok:!1,model:e,status:r.status,durationMs:t(),reason:Kd(r.status,o,e),detail:o.slice(0,400)||void 0,modelUnavailable:Pa(r.status,o)}}catch(r){let o=r instanceof Error?r.message:String(r);return{ok:!1,model:e,durationMs:t(),reason:`Request failed before a usable response: ${o}`,detail:o}}}(e,a)),c=(async()=>{let e=await async function(e,t,r=()=>!1){let o,n=[];for(let a of e){if(o){if(r())break;n.push(o.model)}if(o={model:a,result:await t(a)},o.result.ok||!o.result.modelUnavailable)break}return o?{result:o.result,skipped:n}:void 0}(r,l,()=>s);if(!e)throw Error("self-test had no candidate");let{modelUnavailable:t,...o}=e.result;return e.skipped.length>0?{...o,skipped:e.skipped}:o})(),u=new Promise(e=>{o=setTimeout(()=>{s=!0,e({ok:!1,model:i,durationMs:a(),reason:`Did not complete within ${n}ms. If you started with --manual, approve the request or use --no-smoke-test; otherwise the upstream may be slow or unreachable.`})},n)});try{return await Promise.race([c,u])}finally{o&&clearTimeout(o)}}Gd.use(async(e,t)=>{let o=performance.now(),n=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=Ut(i),l=function(e){return e===Ea}(e.req.header($a));e.set("requestId",n),e.set("isSelfTest",l),e.header("x-request-id",n);let c=Ne.startSpan("copilot_api.handle_request",{kind:u.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":n,"copilot_api.endpoint_type":s}});e.set("requestSpan",c),e.set("requestTraceContext",c.spanContext()),l&&c.setAttribute("copilot_api.self_test",!0);for(let[t,r]of Object.entries(e.req.header())){let e=t.toLowerCase();_t.has(e)||"x-copilot-api-self-test"!==e&&c.setAttribute(`http.request.header.${e}`,r)}await async function(e,t){let{method:o,path:n,endpointType:a}=t;if("POST"===o&&("anthropic"===a||"openai"===a||"embeddings"===a||n.includes("/responses")))try{let t=e.req.raw.clone(),r=new Uint8Array(await t.arrayBuffer());e.set("rawBody",(new TextDecoder).decode(r.subarray(0,1048576)))}catch(e){r.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let m,h=new Promise(e=>{m=e});e.set("streamComplete",h),e.set("resolveStreamComplete",m);let g=f.setSpan(d.active(),c);await d.with(g,async()=>{l||Oe.registerCompletion(n,e,o);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw c.setStatus({code:p.ERROR,message:t.message}),c.recordException(t),e}});let y=e.get("requestData"),_={c:e,start:o,method:a,path:i,endpointType:s,requestId:n,span:c};(y?.streaming||y?.deferFinalize)&&e.res.status<400?h.then(()=>ii(_)).catch(e=>{r.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{c.recordException(t),c.setStatus({code:p.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{c.end()}catch{}}):ii(_)}),Gd.use(F()),Gd.use(async(e,t)=>{let r=e.req.header("content-length");if(r){let t=Number(r),o=bi(e.req.path);if(Number.isFinite(t)&&t>o)return n.warn(`Rejected oversized request: ${t} bytes on ${e.req.path} (UA: ${e.req.header("user-agent")??"unknown"})`),wi(e.req.raw,o,t)||e.header("Connection","close"),e.json({type:"error",error:{type:"request_too_large",message:`Request body exceeds ${o/1024/1024} MB limit (got ${t} bytes).`}},413)}await t()}),Gd.get("/",e=>e.text("Server running")),Gd.route("/health",Ks),Gd.route("/chat/completions",zs),Gd.route("/models",Td),Gd.route("/embeddings",Gs),Gd.route("/usage",Jd),Gd.route("/token",zd),Gd.route("/v1/chat/completions",zs),Gd.route("/v1/models",Td),Gd.route("/v1/embeddings",Gs),Gd.route("/images",Mc),Gd.route("/v1/images",Mc),Gd.route("/v1/messages",xd),Gd.post("/v1/messages/count_tokens",async function(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:"invalid_request_error",message:"Invalid JSON"}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let{name:r,tokenizer:o}=await async function(e){let t=he.models?.data.find(t=>t.id===e);return!t||"Anthropic"===t.vendor||_o(t.capabilities.family)||"o200k_base"!==t.capabilities.tokenizer?{name:"claude",tokenizer:iu}:(su??=import("ai-tokenizer/encoding/o200k_base").then(e=>new Y(e)),{name:"o200k_base",tokenizer:await su})}(t.model),n=e=>cu(o,e),a=lu.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");a+=lu.perMessage+n(e)*lu.contentMultiplier}for(let e of t.messages)a+=lu.perMessage,a+=n(e.role),"string"==typeof e.content?a+=n(e.content)*lu.contentMultiplier:Array.isArray(e.content)&&(a+=uu(e.content,n));let i=t.tools?.filter(au);i&&i.length>0&&(a+=function(e,t){let r=lu.toolsExist;for(let[o,n]of e.entries())o>0&&(r+=lu.perTool),r+=t(n.name),n.description&&(r+=lu.perDesc+t(n.description)),r+=pu(n.input_schema,t);return r}(i,n));let s=Math.round(a);"string"==typeof t.model&&e.set("requestData",{model:t.model,streaming:!1});let l=e.get("requestSpan");return l?.setAttribute("copilot_api.count_tokens.estimate",s),l?.setAttribute("copilot_api.count_tokens.tokenizer",r),e.json({input_tokens:s})}),Gd.route("/v1/responses",Hd),Gd.route("/responses",Hd),Gd.onError((e,t)=>jr(t,e));const Yd=e=>`${e}`,Vd=e=>`${e}`,Xd=e=>`${e}`,Zd=e=>`${e}`,Qd=e=>`${e}`,em=Vd(" ─────────────────────────────────────────────────────────────");function tm(e,t,r){console.log(` ${function(e){return"ok"===e?Xd("✓"):"warn"===e?Qd("⚠"):Zd("✗")}(e)} ${Yd(t.padEnd(14))} ${r}`)}function rm(e){console.log(` ${Vd("↳")} ${Vd(e)}`)}function om(e){return e instanceof mr?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function nm(){let e=_.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await a.readFile(re.GITHUB_TOKEN_PATH,"utf8")).trim();return e.length>0?e:void 0}catch{return}}();return t?{token:t,source:"stored file"}:void 0}async function am(){try{await dn();let e=(he.models?.data.length??0)>0;return tm(e?"ok":"warn","Model catalog",e?function(){let e=he.models?.data??[],t={Claude:0,OpenAI:0,Gemini:0,Embedding:0};for(let r of e)r.id.startsWith("text-embedding")?t.Embedding++:"Anthropic"===r.vendor?t.Claude++:"Google"===r.vendor?t.Gemini++:t.OpenAI++;let r=Object.entries(t).filter(([,e])=>e>0).map(([e,t])=>`${e}: ${t}`);return`${e.length} models (${r.join(", ")})`}():"empty"),e}catch(e){return tm("fail","Model catalog",om(e)),rm("Could not fetch /models — check connectivity/auth."),!1}}async function im(e){he.accountType=e.accountType;let t=await er(),r=tr();if(console.log(""),console.log(` ${Yd("COPILOT-API DOCTOR")} ${Vd(`v${t}`)}`),console.log(em),tm("ok","Runtime",`${r.name} ${r.version} (${r.platform}-${r.arch})`),await oe(),mn(),!await async function(){let e=await nm();if(e){he._t2=e.token,tm("ok","Auth token",`found (${e.source})`);try{let e=await Lr();return await Et(he,e.login),tm("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return tm("fail","GitHub auth",om(e)),void rm("Token looks invalid/expired. Re-run `copilot-api auth`.")}}else tm("fail","Auth token","not found"),rm("Run `copilot-api auth` (or `copilot-api start`) to authenticate.")}())return console.log(em),console.log(` ${Zd("✗")} ${Yd("Authentication failed")} — cannot continue.`),console.log(""),1;let o=await async function(){try{let{token:e}=await Dr();return he._t1=e,tm("ok","Service token","acquired"),!0}catch(e){let t=e instanceof mr?e.response.status:0;return tm("fail","Service token",om(e)),rm(401===t?"Auth token is invalid/expired — run `copilot-api auth`.":403===t?"No active GitHub Copilot subscription on this account. Re-auth won't help.":"Transient/network issue — check connectivity and retry."),!1}}(),n=!!o&&await am();await async function(){try{let e=await Gn(),t=e.quota_snapshots.premium_interactions,r=t.unlimited?"credits unlimited":`credits ${Bn(Fn(t))} of ${Bn(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;tm("ok","Copilot plan",`${e.copilot_plan} · ${r} `+Vd(`(resets ${e.quota_reset_date})`))}catch(e){tm("warn","Copilot plan",`unavailable (${om(e)})`)}}();let a=!1;return o&&n?a=await async function(){let e=await Wd();return e.ok?(tm("ok","Generation",`works via ${e.model} ${Vd(`(${e.durationMs}ms)`)}`),!0):(tm("fail","Generation",`${e.reason}${e.status?Vd(` [HTTP ${e.status}]`):""}`),!1)}():tm("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let r of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let o=_.env[r];o&&("ANTHROPIC_BASE_URL"===r&&/\/v1\/*$/.test(o)&&(t="warn",e.push(`${r}=${o} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(o)&&(t="warn",e.push(`${r}=${o} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){tm(t,"Client config","potential base-URL issue");for(let t of e)rm(t)}else tm("ok","Client config","no base-URL issues detected");rm("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(em),a?(console.log(` ${Xd("✓")} ${Yd("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Qd("⚠")} ${Yd("Some checks need attention")} — see the ${Zd("✗")}/${Qd("⚠")} lines above.`),console.log(""),2)}const sm=e({meta:{name:"doctor",description:"Diagnose your setup end-to-end: token, auth, entitlement, model catalog, and one real generation. Tells you exactly what's wrong and how to fix it."},args:{"account-type":{alias:"a",type:"string",default:"individual",description:"Account type to check against (individual, business, enterprise)"}},async run({args:e}){let t=await im({accountType:e["account-type"]});_.exit(t)}});function lm(e){return{log(t,n){let a=r.level>=o.debug;if(t.level!==o.warn||a)for(let r of e)r.log(t,n)}}}let cm=!1;const um="copilot-api-node20",pm=`https://registry.npmjs.org/${um}/latest`,dm=e=>`${e}`,mm=e=>`${e}`;async function fm(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(pm,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function hm(e,t){let r=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(r)}let gm,ym;async function _m(e){try{let[t,r]=await Promise.all([er(),fm(e)]);return"unknown"!==t&&r&&function(e,t){let r=e.split(".").map(Number),o=t.split(".").map(Number),n=Math.max(r.length,o.length);for(let e=0;e<n;e++){let t=r[e]??0,n=o[e]??0;if(t<n)return!0;if(t>n)return!1}return!1}(t,r)?{current:t,latest:r}:null}catch{return null}}function wm(){if(!gm||!ym)return;let{signal:e}=ym;gm.then(t=>{t&&!e.aborted&&function(e,t){let r=`npx ${um}@latest`,o=mm("│"),n=` ${dm("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,a=` Run ${dm(r)} to update`,i=" ".repeat(54),s=mm(`╭${"─".repeat(54)}╮`),l=mm(`╰${"─".repeat(54)}╯`),c=["",s,`${o}${i}${o}`,`${o}${hm(n,54)}${o}`,`${o}${i}${o}`,`${o}${hm(a,54)}${o}`,`${o}${i}${o}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var bm={posts:[{title:"I Almost Bought an AI Code Reviewer. Then I Did the Math.",teaser:"100+ repos. Every PR reviewed by AI. Under $1K a month.",url:"https://barazany.dev/blog/claude-code-pr-reviewer",date:"2026-06-09"},{title:"I Had Claude Mine 30 Days of My Own Messages. What It Found Was Uncomfortably Accurate.",teaser:"I had Claude read a month of my messages. It nailed me.",url:"https://barazany.dev/blog/mining-claude-history-ultracode",date:"2026-06-05"},{title:"The 5-Hour Quota, Boris's Tweet, and What the Source Code Actually Reveals",teaser:"Claude Code's caching story — decoded from the source.",url:"https://barazany.dev/blog/claude-code-token-caching",date:"2026-04-01"}]};const vm=262144,km="https://barazany.dev",xm=/^[a-z0-9][a-z0-9-]*$/i,Tm=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function Am(e,t){if("string"!=typeof e)return"";let r=e.replaceAll(Tm," ").replaceAll(/\s+/g," ").trim(),o=Array.from(r);return o.length<=t?r:`${o.slice(0,t-1).join("").trimEnd()}…`}function Sm(e){if("object"!=typeof e||!e)return null;let t=e,r=Am(t.title,100),o=Am(t.teaser??t.excerpt??t.description,120),n=function(e){if("string"!=typeof e||e.length>2048)return null;let t;try{t=new URL(e)}catch{return null}if(t.origin!==km||t.username||t.password)return null;let r=t.href;return/^[\x21-\x7E]+$/.test(r)?r:null}(t.url);if(null===n&&void 0===t.url&&"string"==typeof t.slug&&xm.test(t.slug)&&(n=`${km}/blog/${t.slug}`),!r||!o||null===n)return null;let a=function(e){if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e))return Number.isFinite(Date.parse(e))?e.slice(0,10):void 0}(t.date);return a?{title:r,teaser:o,url:n,date:a}:{title:r,teaser:o,url:n}}function $m(e){let t=e;if(!Array.isArray(e)&&"object"==typeof e&&e&&(t=e.posts),!Array.isArray(t))return[];let r=[];for(let e of t){let t=Sm(e);t&&r.push(t)}let o=e=>e.date?Date.parse(e.date):-1/0;return r.sort((e,t)=>o(t)-o(e)).slice(0,3)}let Em=null;function Om(e){return s.join(e,"blog-posts.json")}function Cm(e=re.APP_DIR){try{if(Em&&Em.length>0)return Em;let t=function(e){try{let t=Om(e);return H.statSync(t).size>vm?[]:$m(JSON.parse(H.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:$m(bm)}catch{return[]}}function Im(e){return e>-6e4&&e<864e5}async function Rm(e){let t=new AbortController,r=setTimeout(()=>t.abort(),e);"object"==typeof r&&"unref"in r&&r.unref();try{let e=await fetch("https://barazany.dev/posts.json",{signal:t.signal,headers:{accept:"application/json"}});if(!e.ok)return await(e.body?.cancel().catch(()=>{})),[];let r=await async function(e,t){let r=Number(e.headers.get("content-length"));if(Number.isFinite(r)&&r>vm)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>vm?null:t}let o=e.body.getReader(),n=()=>{o.cancel().catch(()=>{})};t.addEventListener("abort",n,{once:!0});let a=[],i=0;try{for(;;){let{done:e,value:t}=await o.read();if(e)break;if(i+=t.byteLength,i>vm)return await o.cancel().catch(()=>{}),null;a.push(t)}}finally{t.removeEventListener("abort",n)}return t.aborted?null:Buffer.concat(a).toString("utf8")}(e,t.signal);return null===r?[]:$m(JSON.parse(r))}finally{clearTimeout(r)}}async function Pm(e={}){try{if("1"===_.env.COPILOT_API_NO_BLOG||"1"===_.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??re.APP_DIR,r=e.now??Date.now();if(await async function(e,t){try{let r=Om(e),o=await H.promises.stat(r);if(o.size<=vm){let e=await H.promises.readFile(r),o=JSON.parse(e.toString("utf8"));if("number"==typeof o.fetchedAt)return Im(t-o.fetchedAt)}return Im(t-o.mtimeMs)}catch{return!1}}(t,r))return;let o=await Rm(e.timeoutMs??3e3);if(0===o.length)return;Em=o,await async function(e,t,r){let o=Om(e),n=`${o}.${_.pid}.tmp`;try{await H.promises.writeFile(n,`${JSON.stringify({fetchedAt:r,posts:t})}\n`),await H.promises.rename(n,o)}catch(e){throw await H.promises.rm(n,{force:!0}).catch(()=>{}),e}}(t,o,r)}catch(e){r.debug("Blog posts refresh skipped:",e)}}async function qm(e){let t;try{({login:t}=await Mm(e))}catch(e){return void r.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await Fo(),r.info("Copilot fallback enabled for Foundry rate limits, errors and timeouts")}catch(e){r.error("Copilot fallback disabled: could not load the Copilot model list; serving from Foundry only.",e)}return t}async function Mm(e){e._t2&&r.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let t,o=e._t2||process.env.GH_TOKEN;o?(function(e){he._t2=e,kn=!1}(o),r.info("Using provided Auth token")):await Rn();try{t=await Lr(),await Et(he,t.login)}catch(e){throw r.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}return await(async()=>{let{token:e,refresh_in:t}=await Dr();he._t1=e,r.debug("Service token fetched successfully!"),he.showToken&&r.info("Service token:",e),vn=!0,In(t),kt.start(),yn=()=>{r.debug("Network connectivity restored, attempting immediate token refresh"),On(3,500,"network-restored").catch(e=>{r.error("Unexpected error in network-restored token refresh:",e)})},_n=()=>{r.debug("Network connectivity lost")},kt.on("online",yn),kt.on("offline",_n)})(),t}function Nm(e,t=""){let r,o=function(){let{platform:e,ppid:t,env:r}=_;if("win32"===e){try{if(y(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=r.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),n=Object.entries(e).filter(([,e])=>void 0!==e);switch(o){case"powershell":r=n.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":r=n.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":r=n.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=n.map(([e,t])=>`${e}=${t}`).join(" ");r=n.length>0?`export ${e}`:"";break}}return r&&t?`${r}${"cmd"===o?" & ":" && "}${t}`:r||t}function jm(e,t){return{version:t.version,port:e.port,accountType:e.accountType,verbose:e.verbose,manualApprove:e.manual,rateLimitSeconds:e.rateLimit??0,rateLimitWait:e.rateLimitWait,timeoutMs:e.timeout,showToken:e.showToken,_cc1:e._cc1,model:e.model,smallModel:e.smallModel,_t3:t._t3,provider:e.provider,fallback:e.fallback,foundryAuth:t.foundryAuth}}const Dm=e=>`${e}`,Lm=e=>`${e}`,Bm=e=>`${e}`,Fm=e=>`${e}`,Um=e=>`${e}`,Hm=e=>`${e}`,zm=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Jm="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Gm="https://github.com/johnib/copilot-api-issues/issues",Km=Lm(" ─────────────────────────────────────────────────────────────");function Wm(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Ym(e){return e&&0!==e.length?e.join("·"):"—"}function Vm(e){if(0===e.length)return[];let t=["",Km,` ${Dm("BARAZANY.DEV")} ${Lm("— Recent Posts")}`,Km,""];for(let[r,o]of e.entries()){let e=`${o.url}${Jm}`,n=zm(e,Dm(Hm(`[${r+1}]`)));t.push(` ${n} ${Bm(o.title)}`,` ${Lm("→")} ${Lm(o.teaser)}`,"")}return t.push(Km,` ${zm(`https://barazany.dev/blog${Jm}`,"barazany.dev/blog")}`,Km),t}function Xm(e){let t=[];he.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):he.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let r=e.webSearchProviders.length>0?`${e.webSearchProviders.map(e=>(e=>e&&e[0].toUpperCase()+e.slice(1))(e)).join(Lm(" → "))} ${Fm("✓")}`:Lm("off"),o=["",` ${Dm("COPILOT-API")} ${Lm(`v${e.version}`)}`,Km,` ${Lm("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Lm("User")} ${e.user} ${Lm("·")} ${e.accountType}`];return he._v1&&o.push(` ${Lm("Client")} VSCode ${he._v1}`),o.push(` ${Lm("Network")} ${t.join(Lm(" · "))}`,` ${Lm("Search")} ${r}`),e.clipboardCopied&&o.push(` ${Lm("Clipboard")} Claude Code command ${Fm("✓")}`),o.push(Km),o}function Zm(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Dm("Active")}`];if(e.model){let r=he.models?.data.find(t=>t.id===e.model),o=Wm(r?.capabilities.limits?.max_context_window_tokens),n=Ym(r?.capabilities.supports.reasoning_effort);t.push(` ${Bm(e.model.padEnd(32))} ${Lm("ctx")} ${Dm(o.padStart(5))} ${Lm("effort")} ${Lm(n)} ${Um("← main")}`)}if(e.smallModel){let r=he.models?.data.find(t=>t.id===e.smallModel),o=Wm(r?.capabilities.limits?.max_context_window_tokens),n=Ym(r?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Lm("ctx")} ${o.padStart(5)} ${Lm("effort")} ${Lm(n)} ${Um("← small")}`)}return t}function Qm(e){let t=[];for(let[r,o]of function(){let e=[],t=[],r=[],o=[];for(let n of he.models?.data??[]){let a=n.capabilities.limits?.max_context_window_tokens,i={id:n.id,ctx:a,effort:n.capabilities.supports.reasoning_effort};n.id.startsWith("text-embedding")?o.push(i):"Anthropic"===n.vendor?e.push(i):"Google"===n.vendor?r.push(i):t.push(i)}return[["Claude",e],["OpenAI",t],["Gemini",r],["Embedding",o]]}())if(0!==o.length){t.push("",` ${Dm(r)}`);for(let n of o){let o=n.id===e.model||n.id===e.smallModel,a=o?Bm("●"):Lm("·"),i=o?Bm(n.id.padEnd(34)):n.id.padEnd(34),s=n.ctx?Wm(n.ctx).padStart(5):"".padStart(5),l="Embedding"===r?"":` ${Ym(n.effort)}`;t.push(` ${a} ${i} ${Lm(s)}${Lm(l)}`)}}return t}function ef(){let e=Gm.replace(/^https:\/\//,""),t=zm(`${Gm}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Km,` ${Dm("FOUND A BUG?")} ${Lm("— Report it on GitHub")}`,Km,"",` ${Bm("→")} ${Bm(t)}`,` ${Lm("Bug reports, feature requests, and questions welcome.")}`,"",Km]}function tf(e){if(!e.endpoints)return[];let{scheme:t,port:r,hostname:o}=e.endpoints,n=o?`${t}://${o}:${r}`:`${t}://<your-tailscale-hostname>:${r}`,a=["",Km,` ${Dm("Claude Cowork")} ${Lm("— Settings → Inference Provider")}`,Km,"",` ${Lm("Paste into")} ${Dm("inferenceGatewayBaseUrl")}${Lm(":")}`,` ${Dm(Bm(n))}`];return o||a.push("",` ${Lm("Your Tailscale hostname is shown by:")} ${Bm("tailscale status --self")}`),a.push("",` ${Lm("Docs:")} ${Bm("https://claude.com/docs/cowork/3p/installation")}`),a}function rf(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,r=["",Km,` ${Dm("HTTPS")} ${Lm("— self-signed cert")}`,Km,"",` ${Lm("Cert")} ${t}`];switch(r.push("",` ${Dm("Trust this cert")} ${Lm("(one-time setup)")}`),_.platform){case"darwin":r.push(` ${Lm("macOS:")}`,` ${Bm("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Bm(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":r.push(` ${Lm("Windows (PowerShell as Administrator):")}`,` ${Bm(`Import-Certificate -FilePath "${t}" \``)}`,` ${Bm("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":r.push(` ${Lm("Linux (Debian/Ubuntu):")}`,` ${Bm(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Bm("sudo update-ca-certificates")}`,` ${Lm("Linux (Fedora/RHEL/Arch):")}`,` ${Bm(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Bm("sudo update-ca-trust")}`);break;default:r.push(` ${Lm("(Unknown platform — see Node fallback below.)")}`)}return r.push("",` ${Lm("Or, for Node CLIs only (no admin needed):")}`,` ${Bm(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Km),r}function of(e){let t=Math.floor(e/1e3),r=Math.floor(t/3600),o=Math.floor(t%3600/60);return r>0?`${r}h ${o}m`:o>0?`${o}m`:`${t}s`}async function nf(e,t){let r=yt({config:t,startupStage:"upstream_auth"},"copilot_api"),o=Ne.startSpan("copilot_api.server.startup_failed",{kind:u.INTERNAL,attributes:r}),n=function(e){let t=new Set,r=e;for(let e=0;e<=4;e++){if(!(r instanceof Error)||t.has(r))return;if(r instanceof mr)return r;t.add(r),r=wr(r)}}(e);n&&(o.setAttribute("http.response.status_code",n.response.status),o.setAttribute("url.full",n.response.url)),ht(o,e),o.end();let a=e instanceof Error?e.message:String(e);ft(w.ERROR,"ERROR","Server startup failed",{...r,"exception.message":Wt(n&&n!==e?`${a} (cause: ${n.message})`:a)}),await Me()}const af=s.join(re.APP_DIR,"certs"),sf=s.join(af,"cert.pem"),lf=s.join(af,"key.pem"),cf=s.join(af,"cert.meta.json");async function uf(e){try{return await a.readFile(e,"utf8")}catch{return}}async function pf(e){let t=await uf(sf),r=await uf(lf),o=await async function(){let e=await uf(cf);if(e)try{let t=JSON.parse(e);return Array.isArray(t.hosts)&&"string"==typeof t.notAfter?t:void 0}catch{return}}();if(!t||!r||!o)return!1;let n=new Set(o.hosts);for(let t of e)if(!n.has(t))return!1;let a=Date.parse(o.notAfter);return!Number.isNaN(a)&&a-Date.now()>2592e6}function df(e){return 0!==Q(e)}async function mf(e){await a.mkdir(af,{recursive:!0});let t=new Date,r=new Date;r.setDate(r.getDate()+825);let o=["127.0.0.1","::1"],n=new Set(["localhost"]),i=new Set(o);for(let t of e)df(t)?i.add(t):n.add(t);let s=[...[...n].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))],l=await ee([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:r,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:s}]});return await a.writeFile(sf,l.cert,{mode:420}),await a.writeFile(lf,l.private,{mode:384}),await async function(e){await a.writeFile(cf,JSON.stringify(e,null,2),{mode:420})}({hosts:[...n,...i].sort(),notAfter:r.toISOString()}),{cert:l.cert,key:l.private,certPath:sf,keyPath:lf,generated:!0}}const ff=[],hf=Date.now();let gf="";function yf(){let e=async(e,t=0)=>{let o=Ne.startSpan("copilot_api.server.shutdown",{kind:u.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-hf)/1e3}});for(let t of ff)try{await t()}catch(e){r.error("Error during cleanup:",e)}o.end(),function(e,t){let r=zm("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),o=["",Km,` ${Dm("COPILOT-API")} ${Lm(`v${e}`)} ${Lm("·")} ${of(t)} uptime`,Km,""," Check in from time to time on",` ${Bm(r)}`,"",Km,""];console.log(o.join("\n"))}(gf,Date.now()-hf),_.exit(t)};_.on("SIGINT",()=>e("SIGINT")),_.on("SIGTERM",()=>e("SIGTERM")),_.on("uncaughtException",t=>{r.error("Uncaught exception:",t),e("uncaughtException",1)}),_.on("unhandledRejection",(t,o)=>{r.error("Unhandled promise rejection at:",o,"reason:",t),e("unhandledRejection",1)})}const _f=e=>e.filter(e=>So(e)).map(e=>e.id),wf=e=>e.filter(e=>$o(e)).map(e=>e.id);async function bf(e,t,o){if(!e._cc1)return!1;he.models||(r.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),_.exit(1));let n,a,i=function(e,t,o){if(e&&t){if(!o.includes(e))throw r.info(`Available services: \n${o.join("\n")}`),Error(`Invalid model: ${e}`);if(!o.includes(t))throw r.info(`Available services: \n${o.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,_f(he.models.data));i?(n=i.model,a=i.smallModel):(n=await r.prompt("Select a model to use",{type:"select",options:_f(he.models.data)}),a=await r.prompt("Select a small model to use",{type:"select",options:_f(he.models.data)}));let s=Nm({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:n,ANTHROPIC_SMALL_FAST_MODEL:a,NODE_EXTRA_CA_CERTS:o?.certPath},"claude");try{return h.writeSync(s),!0}catch{return r.warn("Failed to copy to clipboard. Here is the command:"),r.log(s),!1}}function vf(e){return e._t2?"cli_arg":_.env.GH_TOKEN?"env_var":"stored"}function kf(e){let{options:t,version:r,runtime:o,_u1:n}=e,a=Ne.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:yt({config:jm(t,{version:r,_t3:vf(t),foundryAuth:he.foundry?.auth}),runtime:o,identity:{_u1:n.login,machineId:he.machineId,sessionId:he.sessionId,_v1:he._v1},connectivity:he.connectivity,modelsCount:he.models?.data.length??0,startupDurationMs:Date.now()-hf},"copilot_api")});if(he.models?.data)for(let e of he.models.data)a.addEvent("copilot_api.model.available",yt(e,"model"));a.end(),ft(w.INFO,"INFO","Server started",yt({version:r,port:t.port,accountType:t.accountType,_u1:n.login,modelsCount:he.models?.data.length??0,startupDurationMs:Date.now()-hf},"copilot_api"))}async function xf(e,t){try{return await async function(e){return"foundry"===e.provider?(he.foundry=oo(process.env),he.connectivity.h2=!1,he.connectivity.h2Keepalive=!1,"entra"===he.foundry.auth&&await Yr(he.foundry),r.info(`Using Microsoft Foundry upstream: ${he.foundry.endpoint} (${"entra"===he.foundry.auth?"Entra ID":"API key"} auth)`),{login:("copilot"===e.fallback?await qm(e):void 0)??"foundry"}):Mm(e)}(e)}catch(r){throw await nf(r,{version:t,provider:e.provider,accountType:e.accountType,_t3:vf(e)}),r}}async function Tf(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[r,o]=await Promise.all([a.readFile(e,"utf8"),a.readFile(t,"utf8")]);return{cert:r,key:o,certPath:e,keyPath:t,generated:!1}}(e.httpsCert,e.httpsKey);if(e.httpsCert||e.httpsKey)throw Error("Both --https-cert and --https-key must be provided together");return async function(e=[]){if(await pf(e)){let e=await uf(sf),t=await uf(lf);if(e&&t)return{cert:e,key:t,certPath:sf,keyPath:lf,generated:!1}}return r.info("Generating new self-signed TLS certificate…"),mf(e)}(e.httpsHosts)}}async function Af(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:o}=ma;try{z(t),z(o)}catch{throw r.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:o}}(e);if(yf(),ff.push(()=>{r.debug("Cleaning up connectivity monitor"),kt.stop()},()=>{r.debug("Cleaning up token management"),r.debug("Cleaning up token management"),vn=!1,hn&&=void clearInterval(hn),yn&&=void kt.off("online",yn),_n&&=void kt.off("offline",_n),gn=void 0,wn=void 0},async()=>{r.debug("Cleaning up HTTP/2 client"),await async function(){r.debug("Stopping HTTP/2 pool"),Wi&&=void clearInterval(Wi),Yi&&=void clearInterval(Yi);let e=[...Ji.keys(),...Gi];Ji.clear(),Gi.clear(),zi.clear(),Ki=void 0;for(let t of e)Vi(t)&&(tt.add(1,{event:"closed"}),await t.close())}()},async()=>{r.debug("Shutting down OTel SDK"),await Me()}),t.verbose&&(r.level=5,r.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");he.provider=t.provider,he.accountType=t.accountType,he.manualApprove=t.manual,he.rateLimitSeconds=t.rateLimit,he.rateLimitWait=t.rateLimitWait,he.showToken=t.showToken,he.timeoutMs=t.timeout,he.connectivity.timeoutMs=t.connectTimeout,he.webSearchProviders=t.webSearchProviders,he.errorReporting=function(e){let t=_.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===_.env.COPILOT_H2_KEEPALIVE||"true"===_.env.COPILOT_H2_KEEPALIVE,t=e||"1"===_.env.COPILOT_H2||"true"===_.env.COPILOT_H2;he.connectivity.h2=t,he.connectivity.h2Keepalive=e}(),await oe(),Pm().catch(()=>{}),mn();let o=await er();gf=o;let n=tr();!function(e,t){t&&(Re=t),Ie=crypto.randomUUID();let r=T({[O]:"copilot-api",[C]:e,[E]:Ie}),{endpoint:o,headers:n}=qe();Ce=new $({resource:r,traceExporter:new x({url:`${o}/v1/traces`,headers:n}),metricReader:new S({exporter:new k({url:`${o}/v1/metrics`,headers:n}),exportIntervalMillis:15e3}),logRecordProcessors:[new A({exporter:new v({url:`${o}/v1/logs`,headers:n})})],instrumentations:[]}),Ce.start()}(o,hf);let a=await xf(t,o);await async function(){try{return await dn({refreshFallback:!1}),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,o=e instanceof Error?e.message:"Unknown error occurred",n=void 0===t?"":` (HTTP ${t})`,a="foundry"===he.provider?"Foundry":"Copilot";return r.warn(`Could not fetch model list from ${a}${n}: ${o}. This is likely a transient network or authentication issue. The proxy will start anyway; model listing endpoints may return empty until the cache is populated.`),!1}}()||function(e){let t=setTimeout(()=>{dn().then(()=>{r.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{dn().then(()=>r.debug("Model list refreshed successfully")).catch(e=>{r.warn("Failed to refresh model list; keeping existing cache:",e)})},e);return t.unref(),()=>{clearInterval(t)}}();ff.push(()=>{r.debug("Cleaning up model refresh interval"),i()}),he.connectivity.h2&&(Qi(Zi(Ot(he))),he.connectivity.h2Keepalive&&ts()),kf({options:t,version:o,runtime:n,_u1:a});let s=await Tf(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await bf(t,c,s)||await async function(e,t,o){if(!e.codex)return!1;let n;if(he.models||(r.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),_.exit(1)),e.model){let t=wf(he.models.data);if(!t.includes(e.model))throw r.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);n=e.model}else n=await r.prompt("Select a model to use with Codex CLI",{type:"select",options:wf(he.models.data)});let a=Nm({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:o?.certPath},`codex --model ${n}`);try{return h.writeSync(a),!0}catch{return r.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),r.log(a),!1}}(t,c,s);(function(e){let t=[...Xm(e),...Zm(e),...Qm(e),...ef(),"",...Vm(Cm()),...tf(e),...rf(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:r,runtime:o,user:n,clipboardCopied:a,tls:i}=e,s=i?"https":"http";return{version:r,runtime:o,user:n,accountType:t.accountType,port:t.port,timeout:t.timeout,webSearchProviders:t.webSearchProviders.map(e=>e.name),model:t.model,smallModel:t.smallModel,clipboardCopied:a,https:i?{certPath:i.certPath,keyPath:i.keyPath,generated:i.generated,selfSigned:!t.httpsCert}:void 0,endpoints:t.claudeCowork?{scheme:s,port:t.port,hostname:await ta()}:void 0}}({options:t,version:o,runtime:n,user:a.login,clipboardCopied:u,tls:s})),wm(),Z({fetch:Gd.fetch,port:t.port,hostname:t.hostname,tls:s?{cert:s.cert,key:s.key}:void 0,bun:{idleTimeout:255}}),function(e,t,o){r.info(`Server listening on ${e}://${t}:${o}`)}(l,t.hostname,t.port),t.smokeTest&&"copilot"===t.provider&&await async function(e,t,o){try{r.start("Running first-run self-test (one tiny generation)…");let n=await Wd({model:t});if(n.ok){let t=void 0===o||["::1","127.0.0.1","localhost"].includes(o)?`Point your client at ${e}`:`Point your client at ${e} — you bound ${o}, so from another machine/container replace \`localhost\` with this host's reachable IP/hostname.`;return r.success(`Self-test passed — generation works via ${n.model} (${n.durationMs}ms). ${t}`),void(n.skipped&&r.info(` Skipped models this account cannot use: ${n.skipped.join(", ")}`))}let a=n.status?` (HTTP ${n.status})`:"";r.warn(`Self-test FAILED${a}: ${n.reason??"unknown error"}`),n.detail&&r.info(` detail: ${Ta(n.detail)}`),r.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){r.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(c,t.smallModel??t.model,t.hostname)}function Sf(e,t){let r=Number.parseInt(e,10);if(Number.isNaN(r))throw Error(`${t} must be a number, got: "${e}"`);return r}const $f=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT, plus FOUNDRY_API_KEY or an Entra ID login such as az login). Overrides COPILOT_API_PROVIDER.'},fallback:{type:"string",description:'With --provider foundry: "copilot" answers from GitHub Copilot when Foundry rate-limits, fails or times out (and, for Claude Code on an OpenAI deployment, when a Foundry stream fails before any output), and keeps that model on Copilot for Foundry\'s retry-after, or initially 10 s without one. Overrides COPILOT_API_FALLBACK.'},port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},"error-reporting":{type:"boolean",default:!0,description:"Send anonymous, sanitized error reports to the maintainer to help fix bugs (no prompts, completions, or tokens). Use --no-error-reporting or COPILOT_API_ERROR_REPORTING=0 to disable."},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"[DEPRECATED — set the TAVILY_API_KEY env var instead] Tavily API key for web search."},"web-search-provider":{type:"string",description:'Web search failover order, e.g. "exa,tavily" (first = primary, rest = fallbacks). Web search turns on when TAVILY_API_KEY and/or EXA_API_KEY are set; this flag is optional and only orders the providers you configured.'},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"},"smoke-test":{type:"boolean",default:!0,description:"After startup, run one tiny self-test generation to verify the proxy works end-to-end and print a clear PASS/FAIL. Disable with --no-smoke-test (or COPILOT_API_NO_SMOKE_TEST=1)."}},run({args:e}){let t=e["rate-limit"],o=void 0===t?void 0:Sf(t,"--rate-limit"),n=e.timeout,a=void 0===n?fe:Sf(n,"--timeout"),i=function(e,t){let r=e??t,o=void 0===r?15e3:Sf(r,"--connect-timeout");if(o<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${o}`);return o}(e["connect-timeout"],_.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??_.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&r.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},o=(e.order??[]).map(e=>e.toLowerCase());for(let e of o)if(!id(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${ad.join(", ")}`);let n=o.length>0?o:ad,a=new Set,i=o.length>0,s=[];for(let e of n){if(!id(e)||a.has(e))continue;a.add(e);let o=t[e];o?s.push({name:e,key:o}):i&&r.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||_.env.TAVILY_API_KEY,exaApiKey:_.env.EXA_API_KEY,order:u}),d=(_.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d,f=function(e,t){let r=(e??t??"copilot").trim().toLowerCase();if("copilot"===r||"foundry"===r)return r;throw Error(`--provider must be "copilot" or "foundry", got: "${r}"`)}(e.provider,_.env.COPILOT_API_PROVIDER);return Af({provider:f,fallback:Bo(e.fallback,_.env.COPILOT_API_FALLBACK,f),port:Sf(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:o,rateLimitWait:e.wait,_t2:e["github-token"],_cc1:e["claude-code"],codex:e.codex,model:e.model,smallModel:e["small-model"],showToken:e["show-token"],timeout:a,connectTimeout:i,webSearchProviders:p,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!m})}});cm||(cm=!0,r.setReporters([lm(r.options.reporters)]));const Ef=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(gm||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;ym=e,gm=_m(e).catch(()=>null)})(),Ef||wm();const Of=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Mn,start:$f,"check-usage":Vn,debug:nr,doctor:sm,"cowork-setup":ka}});await t(Of),Ef||(ym?.abort(),ym=void 0,gm=void 0);export{};
2
+ import{defineCommand as e,runMain as t}from"citty";import r,{LogLevels as o,consola as n}from"consola";import i from"node:fs/promises";import a from"node:os";import s from"node:path";import{AsyncLocalStorage as l}from"node:async_hooks";import{ROOT_CONTEXT as c,SpanKind as u,SpanStatusCode as d,context as p,metrics as m,trace as f}from"@opentelemetry/api";import h from"clipboardy";import{execFile as g,execSync as y}from"node:child_process";import _ from"node:process";import{SeverityNumber as w,logs as b}from"@opentelemetry/api-logs";import{OTLPLogExporter as v}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as x}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as T}from"@opentelemetry/resources";import{BatchLogRecordProcessor as A}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as S}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as E,ATTR_SERVICE_NAME as O,ATTR_SERVICE_VERSION as C}from"@opentelemetry/semantic-conventions";import{Client as I,request as R}from"undici";import{Buffer as q}from"node:buffer";import{createHash as P,randomBytes as N,randomUUID as M}from"node:crypto";import{promisify as j,stripVTControlCharacters as D}from"node:util";import{Context as L,Hono as B}from"hono";import{cors as F}from"hono/cors";import{getHeapStatistics as U}from"node:v8";import H,{accessSync as z,readFileSync as J}from"node:fs";import{streamSSE as G}from"hono/streaming";import{events as K}from"fetch-event-stream";import{Readable as W}from"node:stream";import{Tokenizer as Y,models as V}from"ai-tokenizer";import*as X from"ai-tokenizer/encoding/claude";import{serve as Z}from"srvx";import{isIP as Q}from"node:net";import{generate as ee}from"selfsigned";const te=s.join(a.homedir(),".local","share","copilot-api"),re={APP_DIR:te,GITHUB_TOKEN_PATH:s.join(te,"github_token"),MACHINE_ID_PATH:s.join(te,"machine_id"),SESSION_ID_PATH:s.join(te,"session_id")};async function oe(){await i.mkdir(re.APP_DIR,{recursive:!0}),await ne(re.GITHUB_TOKEN_PATH),await ne(re.SESSION_ID_PATH)}async function ne(e){try{await i.access(e,i.constants.W_OK)}catch{await i.writeFile(e,""),await i.chmod(e,384)}}const ie=new l;function ae(e,t){return ie.run(e,t)}const se=()=>!0===ie.getStore()?.rerun,le=()=>!0===ie.getStore()?.inStream,ce=new l;let ue;const de=()=>void 0!==ce.getStore(),pe=()=>ce.getStore();function me(){let e=ce.getStore();e&&(e.start??=performance.now(),ue?.(e))}const fe=6e5,he={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:fe,webSearchProviders:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}};async function ge(e,t,r=process.versions){if(!r.bun||"string"==typeof e||e instanceof Uint8Array)return e;if(t?.aborted)throw e.destroy(),t.reason;let o=()=>e.destroy(t?.reason);t?.addEventListener("abort",o,{once:!0});try{let t=[];for await(let r of e)t.push(r);return q.concat(t)}catch(e){throw t?.aborted?t.reason:e}finally{t?.removeEventListener("abort",o)}}function ye(e){let[t="",r=""]=e.trim().split(/\s+/,2),o=r&&"undefined"!==r&&"null"!==r?/^(?:ghu|gho|ghp|ghs|ghr|github_pat)_/.exec(r)?.[0]??"opaque":"missing";return`${t.toLowerCase()} ${o}`}!function(e){let t=e.provider,r=e.models;Object.defineProperties(e,{provider:{get:()=>ie.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=ie.getStore();return e?e.models:r},set:e=>{r=e},enumerable:!0,configurable:!0}})}(he);const _e=" │ ",we=e=>{if(e>=1e6){let t=e/1e6;return Number.isInteger(t)?`${t}M`:`${t.toFixed(1)}M`}return e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString()},be=(e,t)=>e.padEnd(t),ve=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ke=(e,t,r)=>` --\x3e ${be(e,4)} ${be(t,21)} ${be(r,3)}`,xe=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return be(t,22)})(e.model??"—")+be(t,8)},Te=e=>{let t=e?.inputTokens??0,r=e?.cachedTokens??0,o=e?we(Math.max(t-r,0)):"—",n=e?we(e.outputTokens??0):"—",i=r?we(r):"—";return`↑${o.padStart(5)} ⚡${i.padStart(5)} ↓${n.padStart(5)}`},Ae=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${be("—",10)}`;let r=Math.round(e.inputTokens/t*100),o=we(e.inputTokens).padStart(5),n=`${r}%`;return`ctx ${o}${n.padStart(Math.max(10-o.length,n.length+1))}`},Se=e=>{if(void 0===e.ttfbMs)return`e2e ${ve(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${ve(e.ttfbMs)} → e2e ${ve(e.e2eMs)} ${t}`},$e=e=>e?he.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,Ee=e=>({...e?.inputTokens&&{"copilot_api.input_tokens":e.inputTokens},...e?.inputTokens&&{"copilot_api.fresh_input_tokens":Math.max(e.inputTokens-(e.cachedTokens??0),0)},...e?.outputTokens&&{"copilot_api.output_tokens":e.outputTokens},...e?.cachedTokens&&{"copilot_api.cached_tokens":e.cachedTokens}}),Oe={completionCallbacks:new Map,registerCompletion(e,t,r){this.completionCallbacks.set(e,{context:t,startTime:r,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(e){let{context:t,startTime:o}=e,n=Math.round(performance.now()-o),i=t.get("requestData"),a=i?.upstreamTotalMs??i?._d1,s=(e=>[ke(e.method,e.path,e.status),xe(e),Te(e.tokenUsage),Ae(e.tokenUsage,e.maxContextTokens),Se({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(_e))({method:t.req.method,path:t.req.path,status:t.res.status.toString(),model:i?.model,reasoningEffort:i?.reasoningEffort,effortClamped:i?.effortClamped,tokenUsage:i?.tokenUsage,maxContextTokens:$e(i?.model),ttfbMs:i?.upstreamTtfbMs,e2eMs:n});r.info(s),ft(w.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:r,duration:o,upstreamTotal:n}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":o,...r?.model&&{"copilot_api.model":r.model},...r?.reasoningEffort&&{"copilot_api.reasoning_effort":r.reasoningEffort},...r?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==r?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(r.upstreamTtfbMs)},...void 0!==n&&{"copilot_api.upstream_total_ms":Math.round(n),"copilot_api.copilot_duration_ms":Math.round(n)},...Ee(r?.tokenUsage)}})({c:t,requestData:i,duration:n,upstreamTotal:a}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:o,startTime:n}=e,i=Math.round(performance.now()-n),a=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=o.get("requestData");r.error((e=>[ke(e.method,e.path,"429"),xe(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${ve(e.e2eMs)}`].join(_e))({method:o.req.method,path:o.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:a,e2eMs:i}))},logError(e,t,o){let{context:n,startTime:i}=e,a=Math.round(performance.now()-i),s=n.get("requestData");r.error((e=>{let t=ke(e.method,e.path,e.status.toString()),r=xe(e),o=e.message.replaceAll(/\s+/g," ").trim();return[t,r,(o.length>37?`${o.slice(0,36)}…`:o).padEnd(37),`e2e ${ve(e.e2eMs)}`].join(_e)})({method:n.req.method,path:n.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:o,e2eMs:a}))},cleanup(){let e=performance.now()-12e5;for(let[t,r]of this.completionCallbacks)r.startTime<e&&this.completionCallbacks.delete(t);if(this.completionCallbacks.size>1e3){let e=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),t=e.slice(0,e.length-1e3);for(let[e]of t)this.completionCallbacks.delete(e)}}};setInterval(()=>Oe.cleanup(),6e4);let Ce,Ie,Re=Date.now();const qe={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function Pe(){let e=process.env.OTEL_EXPORTER_OTLP_ENDPOINT??"https://api.honeycomb.io",t=process.env.OTEL_EXPORTER_OTLP_HEADERS?function(e){return e?Object.fromEntries(e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf("=");return-1===t?[e,""]:[decodeURIComponent(e.slice(0,t)),decodeURIComponent(e.slice(t+1))]})):{}}(process.env.OTEL_EXPORTER_OTLP_HEADERS):qe;return{endpoint:e.replace(/\/$/,""),headers:t}}async function Ne(){if(!Ce)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([Ce.shutdown(),t])&&r.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){r.warn("OTel SDK shutdown failed; continuing exit",e)}}const Me=f.getTracer("copilot-api"),je=m.getMeter("copilot-api"),De=b.getLogger("copilot-api"),Le=je.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),Be=je.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),Fe=je.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Ue=je.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),He=je.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),ze=je.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Je=je.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ge=je.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Ke=je.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),We=je.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ye=je.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Ve=je.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Xe=je.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Ze=je.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Qe=je.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),et=je.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),tt=je.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),rt=je.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),ot=je.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),nt=je.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),it=je.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),at=je.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),st=je.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),lt=je.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),ct=je.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),ut=je.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),dt=je.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),pt=je.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),mt=je.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function ft(e,t,r,o,n){let i=f.getActiveSpan()?.spanContext()??n;De.emit({severityNumber:e,severityText:t,body:r,attributes:{...o,...i&&{"trace.id":i.traceId,"span.id":i.spanId}}})}function ht(e,t,r){let o=t instanceof Error?t:Error(String(t));e.setStatus({code:d.ERROR,message:r??o.message}),e.recordException(o)}function gt(e,t,r){ht(e,r),t&&t!==e&&ht(t,r)}function yt(e,t=""){let r={};if(null==e)return r;if("object"!=typeof e)return("string"==typeof e||"number"==typeof e||"boolean"==typeof e)&&t&&(r[t]=e),r;if(Array.isArray(e))return t&&(r[t]=JSON.stringify(e)),r;for(let[o,n]of Object.entries(e)){let e=t?`${t}.${o}`:o;void 0!==n&&"function"!=typeof n&&(null===n?r[e]="null":"object"!=typeof n||Array.isArray(n)?Array.isArray(n)?r[e]=JSON.stringify(n):("string"==typeof n||"number"==typeof n||"boolean"==typeof n)&&(r[e]=n):Object.assign(r,yt(n,e)))}return r}je.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!kt.getConnectivityStats().isOnline)}),je.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(kt.getConnectivityStats().consecutiveFailures)}),je.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(he.models?.data.length??0)}),je.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(Oe.completionCallbacks.size)}),je.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-Re)/1e3)});const _t=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function wt(e,t,r){for(let[o,n]of Object.entries(r)){let r=o.toLowerCase();"authorization"===r&&e.setAttribute(`http.${t}.header.authorization.shape`,ye(n)),_t.has(r)||e.setAttribute(`http.${t}.header.${r}`,n)}}async function bt(e){let{spanName:t,url:r,target:o,method:n="GET",headers:i,body:a,signal:s,extraAttributes:l}=e,c=Me.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":n,"url.full":r,"copilot_api.target":o,...l}});i&&wt(c,"request",i);try{let e=await fetch(r,{method:n,headers:i,body:a,signal:s});return c.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,r)=>{let o=r.toLowerCase();_t.has(o)||e.setAttribute(`http.response.header.${o}`,t)})}(c,e),Xe.add(1,{target:o,status_code:String(e.status)}),e.ok||c.setStatus({code:d.ERROR,message:`HTTP ${e.status}`}),{response:e,span:c}}catch(e){throw ht(c,e),c.end(),e}}async function vt(e){let{spanName:t,url:r,target:o,method:n="POST",headers:i,body:a,signal:s,headersTimeout:l,bodyTimeout:c,extraAttributes:p,dispatcher:m}=e,f=Me.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":n,"url.full":r,"copilot_api.target":o,"copilot_api.h2.enabled":void 0!==m,...p}});wt(f,"request",i);try{let{statusCode:e,headers:t,body:u}=await R(r,{method:n,headers:i,body:await ge(a,s),signal:s,headersTimeout:l,bodyTimeout:c,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,r]of Object.entries(t)){let t=e.toLowerCase();void 0!==r&&!_t.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(r)?r.join(", "):r)}return Xe.add(1,{target:o,status_code:String(e)}),e>=400&&f.setStatus({code:d.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:u,span:f}}catch(e){throw ht(f,e),f.end(),e}}const kt=new class extends EventTarget{isOnline=!0;lastChecked=(new Date).toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){r.debug("Starting connectivity monitor",{probeEndpoints:he.connectivity.probeEndpoints,fastInterval:he.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){r.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?he.connectivity.slowProbeInterval:he.connectivity.fastProbeInterval)+Math.random()*he.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{r.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=Me.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),he.connectivity.timeoutMs);try{let o=!1;for(let e of he.connectivity.probeEndpoints)try{let t=performance.now(),r=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...he.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),n=performance.now()-t;if(r.ok){o=!0,this.lastSuccessfulEndpoint=e,ct.record(n,{endpoint:e,result:"success"});break}ct.record(n,{endpoint:e,result:"failed"})}catch(t){this.endpointFailureStats[e]=(this.endpointFailureStats[e]||0)+1,r.debug(`Probe failed for ${e}:`,t)}this.updateConnectivityState(o);let n=o?"online":"offline";e.setAttribute("copilot_api.connectivity.result",n),e.setAttribute("copilot_api.connectivity.consecutive_failures",this.consecutiveFailures),this.lastSuccessfulEndpoint&&e.setAttribute("copilot_api.connectivity.successful_endpoint",this.lastSuccessfulEndpoint),Ye.add(1,{result:o?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&r.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),Ve.add(1,{from:"offline",to:"online"}),ft(w.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(r.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),Ve.add(1,{from:"online",to:"offline"}),ft(w.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,r.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?he.connectivity.slowProbeInterval:he.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*he.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:he.connectivity.jitterMaxMs>0,connectionPooling:he.connectivity.connectionPooling,dnsCache:he.connectivity.dnsCache}}},xt=()=>({"content-type":"application/json",accept:"application/json"}),Tt="0.48.1",At=`copilot-chat/${Tt}`,St=`GitHubCopilotChat/${Tt}`,$t=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${re.MACHINE_ID_PATH}_${t}`})(e);try{let e=await i.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let r=(e=>{let t=P("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(a.hostname()),t.update(e),t.update(Date.now().toString()),t.update(N(16)),t.digest("hex")})(e);return await i.writeFile(t,r),await i.chmod(t,384),r},Et=async(e,t)=>{e.machineId||=await $t(t),e.sessionId||=await(async()=>{try{let e=await i.readFile(re.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=M();return await i.writeFile(re.SESSION_ID_PATH,e),await i.chmod(re.SESSION_ID_PATH,384),e})()},Ot=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,Ct=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let r=M(),o={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":At,"User-Agent":St,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":r,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":M(),"X-Request-Id":r};return t&&(o["copilot-vision-request"]="true"),o},It=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const Rt=(e,t,r)=>{let o=Ct(e);delete o["Copilot-Integration-Id"],o["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let n=new Set,i=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&It.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta):void 0;if(i)for(let e of i.split(","))n.add(e);if(r)for(let e of r)n.add(e);return n.size>0&&(o["anthropic-beta"]=[...n].join(",")),o},qt="https://api.github.com",Pt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":At,"user-agent":St,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),Nt="https://github.com",Mt="01ab8ac9400c4e429b23",jt=new WeakMap;function Dt(e){let t=e.req.raw,r=jt.get(t);if(!r){let e=new AbortController;t.signal.aborted?e.abort(t.signal.reason):t.signal.addEventListener("abort",()=>e.abort(t.signal.reason),{once:!0}),jt.set(t,e),r=e}return r}const Lt=e=>Dt(e).signal;function Bt(e){Dt(e).abort()}function Ft(e){return!!Dt(e).signal.aborted&&(e.get("requestSpan")?.setAttribute("copilot_api.client_aborted",!0),!0)}function Ut(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/images/")?"images":e.includes("/responses")?"responses":e.includes("/decisions")?"decisions":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const Ht=32768,zt=[{regex:/Bearer\s+[\w.-]{20,}/g,mask:"Bearer ***"},{regex:/\bghu_[A-Za-z0-9]{20,}/g,mask:"ghu_***"},{regex:/\bghp_[A-Za-z0-9]{20,}/g,mask:"ghp_***"},{regex:/\bgho_[A-Za-z0-9]{20,}/g,mask:"gho_***"},{regex:/\bghs_[A-Za-z0-9]{20,}/g,mask:"ghs_***"},{regex:/\bghr_[A-Za-z0-9]{20,}/g,mask:"ghr_***"},{regex:/\bsk-[A-Za-z0-9-]{20,}/g,mask:"sk-***"},{regex:/\bhcaik_[A-Za-z0-9]{20,}/g,mask:"hcaik_***"},{regex:/\bapi-key[\x22\x27]?\s*[:=]\s*[\x22\x27]?[\w-]{20,}/gi,mask:"api-key: ***"}],Jt=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Gt(e){let t=e;for(let{regex:e,mask:r}of zt)t=t.replace(e,r);return t}const Kt=/[\w.%+#!$&*=?^~\x27-]+@[\w-]+(?:\.[\w-]+)+/g;function Wt(e){return Gt(e).replaceAll(Kt,"<redacted-email>")}const Yt=new Map;function Vt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),r=e.upstreamErrorType??"unknown",o=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${r}:${o}:${t}`}function Xt(e,t,r){let o=Gt(r),n=8*Ht,i=o.length>n,a=i?o.slice(0,n):o,s=P("sha256").update(o).digest("hex");if(a.length<=Ht)e.setAttribute(t,a),e.setAttribute(`${t}.parts`,1);else{for(let r=0;r<a.length;r+=Ht)e.setAttribute(`${t}.part_${r/Ht}`,a.slice(r,r+Ht));e.setAttribute(`${t}.parts`,Math.ceil(a.length/Ht))}e.setAttribute(`${t}.bytes`,o.length),e.setAttribute(`${t}.sha256`,s),i&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,o.length-a.length))}function Zt(e,t){let r=function(e){if(Yt.size>=1e3&&!Yt.has(e)){let e=Yt.keys().next().value;void 0!==e&&Yt.delete(e)}let t,r=(Yt.get(e)??0)+1;return Yt.set(e,r),t=r<=2?"full":3===r?"suppressed":"drop",rt.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",r),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===r)return{decision:r};if("suppressed"===r)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:r};let o=t.c.get("rawBody");o&&Xt(e,"copilot_api.incoming_request_body",o);let n=Qt(t.c.req.header());return n&&Xt(e,"copilot_api.incoming_headers",n),void 0!==t.outgoingBody&&Xt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Xt(e,"copilot_api.outgoing_headers",Qt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Xt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:r}}function Qt(e){let t={};for(let[r,o]of Object.entries(e))Jt.has(r.toLowerCase())||(t[r]=o);return JSON.stringify(t)}async function er(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await i.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function tr(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:a.platform(),arch:a.arch()}}async function rr(){try{return!!(await i.stat(re.GITHUB_TOKEN_PATH)).isFile()&&(await i.readFile(re.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function or(e){let t=await async function(){let[e,t]=await Promise.all([er(),rr()]);return{version:e,runtime:tr(),paths:{APP_DIR:re.APP_DIR,GITHUB_TOKEN_PATH:re.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){r.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const nr=e({meta:{name:"debug",description:"Print debug information about the application"},args:{json:{type:"boolean",default:!1,description:"Output debug information as JSON"}},run:({args:e})=>or({json:e.json})}),ir=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",ar=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",sr=new Set;let lr;function cr(e){if(he.errorReporting&&!(e.statusCode<500)&&!sr.has(e.signature)){if(sr.size>=1e3){let e=sr.values().next().value;void 0!==e&&sr.delete(e)}sr.add(e.signature),async function(e){lr??=er();let t=await lr,r=tr(),o=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(Wt(e.upstreamErrorMessage)).slice(0,600),n={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:o,endpointType:Ut(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${r.platform}/${r.arch}`,runtime:`${r.name}/${r.version}`,timestamp:(new Date).toISOString()},i=new AbortController,a=setTimeout(()=>i.abort(),4e3);try{await fetch(ir,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":ar},body:JSON.stringify(n),signal:i.signal})}finally{clearTimeout(a)}}(e).catch(e=>{r.debug("Error report submission failed:",e)})}}function ur(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const dr=new WeakSet;async function pr(e,{attempt:t,maxRetries:o,operation:n}){return!de()&&(ur(e)&&t<o?(r.warn(`HTTP/2 connection error during ${n}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&dr.add(e)}(e),!1))}var mr=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,r){super(e),this.response=t,this.outgoingBody=r?.outgoingBody,this.outgoingHeaders=r?.outgoingHeaders}},fr=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function hr(e,t){return setTimeout(()=>e.abort(new fr(t)),t)}function gr(e){return e instanceof fr||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof fr}const yr=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),_r=RegExp(`\\b(?:${[...yr].join("|")})\\b`);function wr(e){let{cause:t,errors:r}=e;return t instanceof Error?t:Array.isArray(r)&&r[0]instanceof Error?r[0]:void 0}function br(e){let t=e,r=new Set([t]);for(let e=0;e<4;e++){let e=wr(t);if(!e||r.has(e))break;r.add(e),t=e}return t}function vr(e){let t=e.code;return"string"==typeof t?t:void 0}function kr(e){if(void 0===e.cause)return"";let t=br(e);if(t===e)return"";let r=vr(t);return` (cause: ${r?`${r}: `:""}${t.message})`}function xr(e){if(!(e instanceof Error))return!1;let{codes:t,messages:r}=function(e){let t=[],r=[],o=new Set,n=(e,i)=>{if(i>4||!(e instanceof Error)||o.has(e))return;o.add(e);let{code:a,errors:s,cause:l}=e;if("string"==typeof a&&t.push(a),r.push(e.message),Array.isArray(s))for(let e of s)n(e,i+1);n(l,i+1)};return n(e,0),{codes:t,messages:r}}(e);return!!t.some(e=>yr.has(e))||!(t.length>0)&&(!!r.some(e=>_r.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Tr(e){return e.req.path.startsWith("/v1/messages")}function Ar(e,t){if(Tr(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}const Sr=/maximum context length|exceeds the context window/i;function $r(e){let t=e.error,r={};return t&&"object"==typeof t&&("string"==typeof t.type?r.type=t.type:"string"==typeof t.code&&(r.type=t.code),"string"==typeof t.message&&(r.message=t.message)),!r.message&&"string"==typeof e.message&&(r.message=e.message),r}function Er(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",Wt(t.message)))}function Or(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=Wt(e.message)),t}function Cr(e){let{c:t,error:r,errorText:o,upstream:n}=e,i=f.getActiveSpan();if(!i)return;let a=Vt({endpointType:Ut(t.req.path),statusCode:r.response.status,upstreamErrorType:n.type,model:t.get("requestData")?.model});Zt(i,{c:t,outgoingBody:r.outgoingBody,outgoingHeaders:r.outgoingHeaders,upstreamResponseBody:o,signatureKey:a})}function Ir(e,t,r){let o=e.get("requestId"),n=Oe.completionCallbacks.get(o);n&&(Oe.logError(n,t,r),Oe.completionCallbacks.delete(o))}async function Rr(e,t){let r=f.getActiveSpan(),o=e.get("requestId"),n=Oe.completionCallbacks.get(o);n&&(Oe.logRateLimit(n,t.response),Oe.completionCallbacks.delete(o)),ze.add(1,{action:"rejected",source:"upstream"});let i=await t.response.text(),a=Ar(i,e),s=$r(a);return r?.setStatus({code:d.ERROR,message:"Rate limited by upstream"}),r?.setAttribute("copilot_api.error_type","rate_limit_upstream"),Er(r,s),ft(w.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...Or(s)}),Cr({c:e,error:t,errorText:i,upstream:s}),function(e,t){t.headers.forEach((t,r)=>{qr.test(r)&&e.header(r,t)})}(e,t.response),e.json(a,429)}const qr=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;async function Pr(e,t){let r=f.getActiveSpan(),o=await t.response.text(),n=Ar(o,e),i=$r(n);Ir(e,t.response.status,i.message??t.message),r?.setStatus({code:d.ERROR,message:t.message}),r?.recordException(t),r?.setAttribute("copilot_api.error_type","HTTPError"),Er(r,i),ft(w.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...Or(i)}),Cr({c:e,error:t,errorText:o,upstream:i}),t.response.status>=500&&cr({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Vt({endpointType:Ut(e.req.path),statusCode:t.response.status,upstreamErrorType:i.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:i.type,upstreamErrorMessage:i.message});let a=Tr(e)?function(e){let t;try{let r=JSON.parse(e);t=r.error&&"object"==typeof r.error?r.error:r}catch{return}let r="string"==typeof t.message?t.message:"";if("context_length_exceeded"!==t.code&&"context_length_exceeded"!==t.type&&!Sr.test(r))return;let o=/maximum context length is (\d+)/i.exec(r)?.[1],n=/(?:resulted in|requested) (\d+) tokens/i.exec(r)?.[1];return{type:"error",error:{type:"invalid_request_error",message:o&&n?`prompt is too long: ${n} tokens > ${o} maximum`:`prompt is too long: ${r||"context_length_exceeded"}`}}}(o):void 0;return a?e.json(a,400):e.json(n,t.response.status)}function Nr(e,t){(function(e){return"object"==typeof e&&!!e&&dr.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",he.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function Mr(e){return xr(e)||function(e){return ur(e)||e instanceof Error&&ur(e.cause)}(e)}async function jr(e,t){return Ft(e)?(Oe.completionCallbacks.delete(e.get("requestId")),new Response(null,{status:499})):async function(e,t){if(Nr(f.getActiveSpan(),t),t instanceof mr&&429===t.response.status)return Rr(e,t);if(t instanceof SyntaxError){f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),ft(w.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let r=Tr(e)?{type:"error",error:{type:"invalid_request_error",message:"Invalid JSON in request body"}}:{error:{message:"Invalid JSON in request body",type:"invalid_request_error"}};return Ir(e,400,"Invalid JSON in request body"),e.json(r,400)}if(t instanceof mr)return Pr(e,t);if(gr(t))return function(e,t){let r=f.getActiveSpan();r?.setStatus({code:d.ERROR,message:"Upstream request timed out"}),t instanceof Error&&r?.recordException(t),r?.setAttribute("copilot_api.error_type","request_timeout");let o="Upstream request timed out (gateway timeout). Increase the timeout or retry.";ft(w.ERROR,"ERROR",o,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let n=Tr(e)?{type:"error",error:{type:"api_error",message:o}}:{error:{message:o,type:"timeout_error"}};return Ir(e,504,t instanceof Error?t.message:o),e.json(n,504)}(e,t);if(Mr(t))return function(e,t){let r=f.getActiveSpan();r?.setStatus({code:d.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&r?.recordException(t),r?.setAttribute("copilot_api.error_type","transient_transport");let o=t instanceof Error?br(t):void 0,n=(o&&vr(o))??"none",i=o?.message??String(t);r?.setAttribute("copilot_api.transport_cause_code",n),r?.setAttribute("copilot_api.transport_cause_message",i);let a="Temporary upstream connection failure. Please retry.";ft(w.WARN,"WARN",a,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":n,"copilot_api.transport_cause_message":i}),e.header("Retry-After","1");let s=Tr(e)?{type:"error",error:{type:"api_error",message:a}}:{error:{message:a,type:"service_unavailable"}};return Ir(e,503,t instanceof Error?`${t.message}${kr(t)}`:a),e.json(s,503)}(e,t);let o=f.getActiveSpan(),n=t instanceof Error?t:Error(String(t));o?.setStatus({code:d.ERROR,message:n.message}),o?.recordException(n),o?.setAttribute("copilot_api.error_type",n.name),ft(w.ERROR,"ERROR",`Unhandled error: ${n.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":n.name}),cr({route:e.req.path,statusCode:500,errorClass:n.name,signature:Vt({endpointType:Ut(e.req.path),statusCode:500,upstreamErrorType:n.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:n.name,upstreamErrorMessage:`${n.message}${kr(n)}`}),Ir(e,500,n.message),r.error(n);let i=Tr(e)?{type:"error",error:{type:"api_error",message:n.message}}:{error:{message:n.message,type:"error"}};return e.json(i,500)}(e,t)}const Dr=async()=>{let e=`${qt}/copilot_internal/v2/token`,t=he.timeoutMs,r=new AbortController,o=setTimeout(()=>r.abort(),t);try{let{response:t,span:o}=await bt({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:Pt(he),signal:r.signal});try{if(!t.ok)throw new mr("Failed to get Service token",t);return await t.json()}catch(e){throw ht(o,e),e}finally{o.end()}}finally{clearTimeout(o)}};async function Lr(){let e=`${qt}/user`,t=he.timeoutMs,r=new AbortController,o=setTimeout(()=>r.abort(),t);try{let{response:t,span:o}=await bt({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${he._t2}`,"content-type":"application/json",accept:"application/json"},signal:r.signal});try{if(!t.ok)throw new mr("Failed to get GitHub user",t);return await t.json()}catch(e){throw ht(o,e),e}finally{o.end()}}finally{clearTimeout(o)}}const Br=3e5,Fr=12e4;let Ur,Hr,zr,Jr=null,Gr=0;function Kr(e){zr&&clearTimeout(zr),zr=setTimeout(()=>{Vr("scheduled").catch(e=>{r.warn("Foundry Entra token renewal failed; retrying:",e),Kr(3e4)})},e),zr.unref()}async function Wr(e){let t=Hr;if(!Ur||!t?.tokenScope)throw Error("Foundry Entra auth is not initialised");let r=Me.startSpan("copilot_api.foundry.entra_token",{kind:u.INTERNAL,attributes:{"copilot_api.foundry.token.trigger":e}},"upstream_401"===e?p.active():c);try{let e=await async function(e,t){let r=AbortSignal.timeout(Fr),o=new Promise((e,t)=>{r.addEventListener("abort",()=>{t(Error("Entra token request timed out after 120s"))},{once:!0})});return Promise.race([e.getToken(t,{abortSignal:r}),o])}(Ur,t.tokenScope);if(!e)throw Error(`No Entra token for scope ${t.tokenScope}`);r.setAttribute("copilot_api.foundry.token.expires_in_s",Math.round((e.expiresOnTimestamp-Date.now())/1e3)),t.bearerToken=e.token,t.bearerExpiresAt=e.expiresOnTimestamp,Gr=Date.now(),Kr(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-Br;return Math.max(t-Date.now(),3e4)}(e))}catch(e){throw ht(r,function(e){let t=e instanceof Error?e:Error(String(e)),r=D(t.message),o=`… (truncated from ${r.length} chars)`,n=Error(r.length>2e3?r.slice(0,2e3-o.length)+o:r);return n.name=t.name,n}(e)),e}finally{r.end()}}async function Yr(e,t){Hr=e,Ur=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await Wr("startup")}catch(e){throw Error("Foundry Entra ID auth: could not get a token. Run `az login` (or set FOUNDRY_API_KEY for key auth). The identity needs the 'Cognitive Services OpenAI User' role (GPT) or 'Azure AI User' (Claude) on the resource.",{cause:e})}}function Vr(e="upstream_401"){return Jr??=Wr(e).finally(()=>{Jr=null}),Jr}let Xr=null;async function Zr(e){if("foundry"===he.provider){if("entra"!==he.foundry?.auth)return!1;let t=e?.outgoingHeaders?.Authorization;return async function(e=!1,t){let o=Hr?.bearerToken;if(void 0!==t&&t!==o)return!0;let n=Hr?.bearerExpiresAt,i=void 0!==n&&n-Date.now()>Br;if(e&&i)return!1;if(Date.now()-Gr<3e4)return!0;try{return await Vr(),!0}catch(e){return r.warn("Foundry Entra token renewal after a 401 failed:",e),!1}}(await async function(e){if(!e)return!1;let t=await e.response.clone().text().catch(()=>"");return/"code"\s*:\s*"PermissionDenied"/.test(t)}(e),t?.replace(/^Bearer /,""))}return Xr||=Dr().then(({token:e})=>{he._t1=e,r.debug("Service token refreshed on upstream 401")}).finally(()=>{Xr=null}),await Xr,!0}function Qr(e,t="FOUNDRY_ENDPOINT"){let r,o=e.trim();try{r=new URL(o)}catch{throw Error(`${t} is not a valid URL: "${o}"`)}if("https:"!==r.protocol)throw Error(`${t} must use https, got: "${o}"`);let n=r.pathname.replace(/\/+$/,"").replace(/\/(?:openai|_an1)(?:\/v1)?$/i,"");return`${r.origin}${n}`}const eo=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function to(e){let t=new URL(e),r=eo.exec(t.hostname)?.[1];return r?`https://${r}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function ro(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,r]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:r||t}});return t.length>0?t:void 0}function oo(e){let t=e.FOUNDRY_ENDPOINT,r=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");let o=function(e,t){let r=e?.trim().toLowerCase();if(!r)return t?"key":"entra";if("key"!==r&&"entra"!==r)throw Error(`FOUNDRY_AUTH must be "key" or "entra", got: "${r}"`);if("key"===r&&!t)throw Error("FOUNDRY_AUTH=key requires FOUNDRY_API_KEY");return r}(e.FOUNDRY_AUTH,r),n=Qr(t),i=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:n,anthropicEndpoint:i?Qr(i,"FOUNDRY_ANTHROPIC_ENDPOINT"):to(n),auth:o,..."key"===o?{apiKey:r}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:ro(e.FOUNDRY_DEPLOYMENTS)}}const no=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},io=e=>({...no(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),ao=e=>`${e.anthropicEndpoint}/anthropic`,so=(e,t)=>({...no(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),lo=e=>"foundry"===e.provider;function co(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const uo=e=>lo(e)?(e=>`${e.endpoint}/openai/v1`)(co(e)):Ot(e),po=(e,t=!1)=>lo(e)?io(co(e)):Ct(e,t),mo=e=>lo(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const fo=[{pattern:/^gpt-6/,context:105e4,output:128e3},{pattern:/^gpt-5/,context:4e5,output:128e3},{pattern:/^gpt-4\.1/,context:1047576,output:32768},{pattern:/^o\d/,context:2e5,output:1e5}],ho={context:128e3,output:16384};function go(e){return fo.find(({pattern:t})=>t.test(e))??ho}const yo=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,_o=e=>/^claude/i.test(e),wo=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function bo(e,t){return{id:e.id,name:e.id,object:"model",vendor:t.vendor,version:e.model,preview:!1,model_picker_enabled:!0,supported_endpoints:t.supported_endpoints,capabilities:{family:e.model,object:"model_capabilities",type:"chat",tokenizer:"o200k_base",limits:t.limits&&{max_context_window_tokens:t.limits.context,max_output_tokens:t.limits.output},supports:{tool_calls:!0,parallel_tool_calls:!0}}}}async function vo(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,r=new AbortController,o=hr(r,he.timeoutMs);try{let{response:o,span:n}=await bt({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:io(e),signal:r.signal});try{if(!o.ok)throw new mr("Failed to list Foundry deployments",o);let e=(await o.json()).data.filter(e=>!e.status||"succeeded"===e.status).map(e=>({id:e.id,model:e.model}));return n.setAttribute("copilot_api.models_count",e.length),e}catch(e){throw ht(n,e),e}finally{n.end()}}finally{clearTimeout(o)}}async function ko(e){return{object:"list",data:(e.deployments??await vo(e)).map(e=>function(e){let{model:t}=e;if(!yo.test(t))return(e=>/embedding/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/embeddings"],capabilities:{family:t,object:"model_capabilities",type:"embeddings",tokenizer:"cl100k_base",supports:{}}}:(e=>/-decisions$/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/decisions"],capabilities:{family:t,object:"model_capabilities",type:"decisions",tokenizer:"o200k_base",supports:{}}}:_o(t)?bo(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):wo(t)?bo(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:go(t)}):bo(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:go(t)})}(e)).filter(e=>void 0!==e)}}const xo=()=>lo(he)&&he.foundry?ko(he.foundry):Ao(),To=async()=>{try{return await xo()}catch(e){if(e instanceof mr&&401===e.response.status){if(!await Zr(e))throw e;return xo()}throw e}},Ao=async()=>{let e=`${uo(he)}/models`,t=po(he),r=he.timeoutMs,o=new AbortController,n=hr(o,r);try{let{response:r,span:n}=await bt({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:o.signal});try{if(!r.ok)throw new mr("Failed to get models",r);let e=await r.json();return n.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw ht(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},So=e=>"embeddings"!==e.capabilities.type&&"image"!==e.capabilities.type&&"decisions"!==e.capabilities.type,$o=e=>So(e)&&(e.supported_endpoints?.includes("/responses")??!0);const Eo=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],Oo="claude-haiku-4.5",Co={haiku:Oo,"sonnet-4.6":"claude-sonnet-4.6","sonnet-4.5":"claude-sonnet-4.5","sonnet-4":"claude-sonnet-4","opus-4.7":"claude-opus-4.7","opus-4.6":"claude-opus-4.6","opus-4.5":"claude-opus-4.5",opus:"claude-opus-4.5"};const Io=/^claude-/i;function Ro(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function qo(e,t){if("string"!=typeof e)return null;let r=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[o,n]=function(e){let t=e.lastIndexOf("["),r=e.lastIndexOf("]");return-1!==t&&r===e.length-1&&r>t?[e.slice(0,t),e.slice(t+1,r)]:[e,null]}(r);if(t.includes(r))return r;if(n){let e=`${o}-${n}`.replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2");if(t.includes(e))return e}let i=function(e){for(let t of Eo)if(t.pattern.test(e))return t.family;return null}(o),a=Io.test(o),s=o.replace(/-\d{8}(?::.*)?$/,""),l=n?`-${n}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of a?c:[]){let r=Ro(e);for(let e of t)if(Ro(e.replace(/-\d{8}(?::.*)?$/,""))===r)return e}return i?function(e,t,r=null){let o=Co[e];if(!o)return null;if(r){let e=`${o}-${r}`;if(t.includes(e))return e}if(t.includes(o))return o;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let o=r?`${e}-${r}`:e;if(t.includes(o))return o}return null}(i,t,n):null}const Po=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function No(e,t){if(!e||!t||0===t.length)return null;let r=function(e){return"max"===e?"xhigh":e}(e);if(t.includes(r))return r;let o=Po.get(r);if(void 0===o)return t[0]??null;let n=null,i=1/0;for(let e of t){let t=Po.get(e);if(void 0===t)continue;let r=Math.abs(t-o);r<i&&(i=r,n=e)}return n}const Mo={messages:So,responses:$o,chat:e=>So(e)&&(e.supported_endpoints?.some(e=>"/chat/completions"===e||"/responses"===e)??!0)};let jo;const Do=new Map,Lo=new Map;function Bo(e,t,r){let o=(e??t??"").trim().toLowerCase();if(""!==o&&"none"!==o){if("copilot"!==o)throw Error(`--fallback must be "copilot", got: "${o}"`);if("foundry"!==r)throw Error("--fallback copilot requires --provider foundry");return o}}async function Fo(){jo=await ae({provider:"copilot"},To)}const Uo=()=>void 0!==jo;function Ho(e,t=Date.now()){let r=Do.get(e);return void 0!==r&&(t<r||(Do.delete(e),!1))}function zo(e,t=Date.now()){return{id:Lo.get(e)?.id??0,lapsed:!Ho(e,t)}}function Jo(e,t,r={}){let o=r.now??Date.now(),n=r.sent??zo(e,o),i=Lo.get(e)??{id:0,appliedMs:0},a=Math.max(function(e,t=Date.now()){let r=e.get("retry-after-ms");if(null!==r&&Number.isFinite(Number(r))&&Number(r)>=0)return Number(r);let o=e.get("retry-after");if(null!==o){let e=Number(o);if(""!==o.trim()&&Number.isFinite(e)&&e>=0)return 1e3*e;let r=Date.parse(o);if(!Number.isNaN(r))return Math.max(0,r-t)}return 1e4}(t,o),5e3),s=n.lapsed?n.id+1:n.id;if(s>i.id){let t=Math.min(2*i.appliedMs,6e4);a=Math.max(a,t),Lo.set(e,{id:s,appliedMs:a})}else s===i.id&&i.appliedMs>0&&a>i.appliedMs&&Lo.set(e,{id:i.id,appliedMs:a});let l=Math.max(Do.get(e)??0,o+a);return Do.set(e,l),l-o}function Go(e,t){let r=Lo.get(e);r&&t.lapsed&&t.id===r.id&&Lo.set(e,{id:r.id,appliedMs:0})}function Ko(e){if(!Uo()||!lo(he)||!e.ok)return;let{headers:t}=e;return t.has("retry-after")||t.has("retry-after-ms")?Response.json({error:{message:"Foundry rate-limited this request (HTTP 200 stream with retry-after).",type:"too_many_requests",code:"rate_limit_exceeded"}},{status:429,headers:t}):void 0}const Wo=new Set([429,408,500,502,503,504]);function Yo(e,t){let r=hr(e,t),o=de()||le()?hr(e,9e4):void 0;return{headersArrived:()=>clearTimeout(o),clear:()=>{clearTimeout(r),clearTimeout(o)}}}function Vo(e,t){if(e instanceof mr){let{status:t}=e.response;return Wo.has(t)&&void 0!==e.outgoingBody?`foundry_${t}`:void 0}if(t){if(gr(e))return"foundry_timeout";if(Mr(e))return"foundry_transport"}}const Xo={foundry_429:"rate-limited",foundry_timeout:"timed out on",foundry_transport:"could not be reached for",foundry_stream_failed:"failed the stream for",foundry_stream_idle:"went silent on"};function Zo(e,t,o){let n=Xo[t]??`returned ${t.slice(8)} for`;r.info(`Foundry ${n} ${e}; serving it from Copilot for ${Math.ceil(o/1e3)}s`)}function Qo(e,t,r){let{model:o,reason:n}=r,i=f.getActiveSpan();return i?.setAttribute("copilot_api.fallback.upstream","copilot"),i?.setAttribute("copilot_api.fallback.reason",n),i?.setAttribute("copilot_api.fallback.foundry_model",o),ae({provider:"copilot",models:jo,rerun:"breaker_open"!==n,inStream:r.inStream},()=>t(e))}const en=()=>pe();!function(e){ue=e}(e=>{let t=e;t.sent=zo(t.model)});const tn=new WeakMap;async function rn(e,t,r){let o=t instanceof mr?t.response:void 0,n=Jo(e,o?.headers??new Headers,{sent:r});return await(o?.body?.cancel()),n}function on(e,t,r){let{windowMs:o,attemptStart:n}=r,i=f.getActiveSpan();i?.setAttribute("copilot_api.fallback.retry_after_ms",o),void 0!==n&&i?.setAttribute("copilot_api.fallback.foundry_attempt_ms",Math.round(performance.now()-n)),Zo(e,t,o)}function nn(e){let t=pe();return void 0!==t&&tn.has(t)&&!Ft(e)}function an(){let e=pe(),t=e&&tn.get(e);t&&(t.deferReset=!0)}function sn(){let e=en();e?.sent&&tn.has(e)&&Go(e.model,e.sent)}async function ln(e,t,r){let o=en(),n=o&&tn.get(o);if(!o||!n)throw Error("Not in a Foundry attempt the fallback stands behind");tn.delete(o);let{model:i}=o;return on(i,t,{windowMs:await rn(i,r,o.sent??zo(i)),attemptStart:o.start}),function(e){return ce.exit(e)}(()=>Qo(e,n.handler,{model:i,reason:t,inStream:!0}))}async function cn(e,t,r){if(!Uo()||!lo(he))return r(e);let o=await async function(e){try{let t=await e.req.json();return"string"==typeof t.model?t.model:void 0}catch{return}}(e);if(!o||!function(e,t){let r=jo?.data??[],o=r.map(e=>e.id),n=o.includes(e)?e:qo(e,o),i=r.find(e=>e.id===n);return i&&Mo[t](i)?i.id:void 0}(o,t))return r(e);if(Ho(o))return Qo(e,r,{model:o,reason:"breaker_open"});let n=zo(o),i={model:o};tn.set(i,{handler:r});try{let t=await function(e,t){return ce.run(e,t)}(i,()=>r(e)),n=i.sent,a=!0===tn.get(i)?.deferReset;return t.ok&&n&&!a&&Go(o,n),t}catch(t){let a=i.sent,s=Vo(t,void 0!==a);if(!s||(on(o,s,{windowMs:await rn(o,t,a??n),attemptStart:i.start}),Ft(e)))throw t;return Qo(e,r,{model:o,reason:s})}}const un=e=>new Promise(t=>{setTimeout(t,e)}),dn=e=>null==e;async function pn({refreshFallback:e=!0}={}){let t=await To();he.models=t,e&&Uo()&&await Fo().catch(e=>{r.warn("Failed to refresh the Copilot fallback models:",e)})}const mn=()=>{he._v1="1.140.0-insider"};var fn=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let hn,gn,yn,_n,wn,bn=!1,vn=!1,kn=!1;function xn(){return Tn()?wn:void 0}function Tn(){return void 0!==wn&&Date.now()-wn.at<6e4}function An(){return kn?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const Sn=()=>i.readFile(re.GITHUB_TOKEN_PATH,"utf8");function $n(e){let{span:t,error:o,reason:n,refreshStart:i,attempt:a}=e,s=o.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";he._t1=void 0,wn={status:s,message:l,at:Date.now()},clearInterval(hn),hn=void 0,r.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Ke.add(1,{reason:n,success:"false"}),We.add(1,{reason:n}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:d.ERROR,message:o.message}),t.recordException(o),lt.record(performance.now()-i,{reason:n}),ft(w.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":a,"copilot_api.token_refresh.terminal_status":s})}function En(e){let{span:t,error:o,reason:n,refreshStart:i,maxRetries:a}=e;he._t1=void 0,r.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=o instanceof Error?o:Error(String(o));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:d.ERROR,message:s.message}),t.recordException(s),We.add(1,{reason:n}),lt.record(performance.now()-i,{reason:n}),ft(w.ERROR,"ERROR",`Token refresh failed after ${a} attempts (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempts":a})}const On=async(e=5,t=1e3,o="scheduled")=>bn?(r.debug("Token refresh already in progress, coalescing"),gn):(bn=!0,gn=Me.startActiveSpan("copilot_api.token.refresh",async n=>{let i=performance.now();n.setAttribute("copilot_api.token_refresh.reason",o),n.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let a=1;a<=e;a++)try{n.setAttribute("copilot_api.token_refresh.attempt",a),r.debug(`Refreshing Service token (${o}, attempt ${a}/${e})`);let{token:t,refresh_in:s}=await Dr();return he._t1=t,wn=void 0,vn&&void 0===hn&&(r.info("Token refresh recovered, resuming scheduled refresh"),In(s)),r.debug("Service token refreshed successfully"),he.showToken&&r.info("Refreshed Service token:",t),n.setAttribute("copilot_api.token_refresh.success",!0),Ke.add(1,{reason:o,success:"true"}),lt.record(performance.now()-i,{reason:o}),void ft(w.INFO,"INFO",`Token refreshed successfully (${o})`,{"copilot_api.token_refresh.reason":o,"copilot_api.token_refresh.attempt":a})}catch(s){if(s instanceof mr&&(401===s.response.status||403===s.response.status))return void $n({span:n,error:s,reason:o,refreshStart:i,attempt:a});let l=a===e;if(r.error(`Failed to refresh Service token (attempt ${a}/${e}):`,s),Ke.add(1,{reason:o,success:"false"}),l)return void En({span:n,error:s,reason:o,refreshStart:i,maxRetries:e});let c=t*2**(a-1);r.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{n.end(),bn=!1,gn=void 0}}),gn);async function Cn(){return!!he._t1||!Tn()&&(void 0!==wn&&kn&&await async function(){if(gn)return;let e=(await Sn().catch(()=>{}))?.trim();e&&e!==he._t2?.trim()&&(he._t2=e,r.info("Picked up re-authenticated Auth token from disk"),he.showToken&&r.info("Auth token:",e))}(),await On(3,250,"on-demand"),!!he._t1)}function In(e){hn&&clearInterval(hn);let t=Math.max(1e3*(e-60),6e4);hn=setInterval(()=>{On(5,1e3,"scheduled").catch(e=>{r.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Rn(e){try{let t=await Sn();if(t&&!e?.force)return he._t2=t,kn=!0,he.showToken&&r.info("Auth token:",t),void await qn();r.info("Authentication required");let o=await async function(){let e=new AbortController,t=he.timeoutMs,r=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${Nt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:Mt,scope:"user:email"}),signal:e.signal});if(!t.ok)throw new mr("Failed to get device code",t);return await t.json()}finally{clearTimeout(r)}}();r.debug("Device code response:",o),r.info(`Please enter the code "${o.user_code}" at ${o.verification_uri}`);try{h.writeSync(o.user_code),r.success("Code copied to clipboard — opening browser...")}catch{r.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,r=_.platform;t="darwin"===r?"open":"win32"===r?"start":"xdg-open",g(t,[e],()=>{})}catch{}}(o.verification_uri);let n=await async function(e){let t=1e3*(e.interval+1);r.debug(`Polling access token with interval of ${t}ms`),r.start("Waiting for authorization...");let o=Date.now(),n=1e3*e.expires_in;for(;;){if(Date.now()-o>=n)throw new fn("Authorization timed out — the code expired. Please run the command again.");let i=new AbortController,a=he.timeoutMs,s=setTimeout(()=>{i.abort()},a);try{let o=await fetch(`${Nt}/login/oauth/access_token`,{method:"POST",headers:xt(),body:JSON.stringify({client_id:Mt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:i.signal});if(!o.ok){await un(t),r.error("Failed to poll access token:",await o.text());continue}let n=await o.json();if(r.debug("Polling access token response:",n),n.error){if("expired_token"===n.error)throw new fn("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===n.error)throw new fn("Authorization was denied. Please run the command again and approve the request.");"authorization_pending"!==n.error&&"slow_down"!==n.error&&r.warn(`Unexpected auth error: ${n.error}`),await un(t);continue}if(n.access_token)return n.access_token;await un(t)}catch(e){if(e instanceof fn)throw e;if(e instanceof Error&&"AbortError"===e.name){r.error("Access token polling timed out"),await un(t);continue}throw e}finally{clearTimeout(s)}}}(o);await(e=>i.writeFile(re.GITHUB_TOKEN_PATH,e,{mode:384}))(n),he._t2=n,kn=!0,he.showToken&&r.info("Auth token:",n),await qn()}catch(e){throw e instanceof mr?(r.error("Failed to get Auth token:",await e.response.json()),e):(r.error("Failed to get Auth token:",e),e)}}async function qn(){let e=await Lr();r.success(`Authenticated as ${e.login}`)}async function Pn(e){e.verbose&&(r.level=5,r.info("Verbose logging enabled")),he.showToken=e.showToken,await oe(),await Rn({force:!0}),console.log("\n Get started:\n\n $ npx copilot-api-node20@latest start --claude-code\n $ npx copilot-api-node20@latest start --codex\n\n Full docs: https://www.npmjs.com/package/copilot-api-node20\n"),process.exit(0)}const Nn=e({meta:{name:"auth",description:"Run authentication flow"},args:{verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"show-token":{type:"boolean",default:!1,description:"Show token on auth"}},run:({args:e})=>Pn({verbose:e.verbose,showToken:e["show-token"]})}),Mn=.01,jn=864e5,Dn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Ln=new Intl.NumberFormat("en-US"),Bn=e=>Dn.format(e*Mn),Fn=e=>e.credits_used??e.entitlement-e.remaining,Un=(e,t,r)=>{let o=(e=>{let t=new Date(`${e}T00:00:00Z`);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-1,1))})(t),n=(r.getTime()-o.getTime())/jn;if(n<.5)return;let i=Fn(e),a=i*Mn/n,s=i>=e.entitlement;if(s||a<=0)return{usdPerDay:a,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Mn,c=new Date(o.getTime()+l/a*jn);return{usdPerDay:a,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Hn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Ln.format(Fn(e))} of ${Ln.format(e.entitlement)} used`:"n/a",zn=e=>e.padEnd(14),Jn=(e,t=new Date)=>{let r=e.quota_snapshots.premium_interactions,o=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(r.unlimited)o.push(`${zn("AI credits")}unlimited`);else{let e=Fn(r),t=r.percent_remaining;o.push(`${zn("AI credits")}${Bn(e)} / ${Bn(r.entitlement)} ${t.toFixed(1)}% left`,`${zn("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${zn("")}${Ln.format(e)} of ${Ln.format(r.entitlement)} credits`)}if(o.push("",`${zn("Chat")}${Hn(e.quota_snapshots.chat)}`,`${zn("Completions")}${Hn(e.quota_snapshots.completions)}`,"",`${zn("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/jn)))(e.quota_reset_date,t)} days)`),!r.unlimited){let n=Un(r,e.quota_reset_date,t);n&&o.push(`${zn("Burn rate")}~${Dn.format(n.usdPerDay)}/day${(e=>e.exhausted?" — allowance already exhausted":e.exhaustsOn?` — on track to exhaust ${(e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}))(e.exhaustsOn)}`:" — within allowance")(n)}`);let i=r.overage_permitted?"permitted, "+(r.overage_count>0?`${Ln.format(r.overage_count)} used`:"none used"):"not permitted";o.push(`${zn("Overage")}${i}`)}return o.join("\n")},Gn=async()=>{let e=`${qt}/copilot_internal/user`,t=he.timeoutMs,r=new AbortController,o=setTimeout(()=>r.abort(),t);try{let{response:t,span:o}=await bt({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:Pt(he),signal:r.signal});try{if(!t.ok)throw new mr("Failed to get usage",t);return await t.json()}catch(e){throw ht(o,e),e}finally{o.end()}}finally{clearTimeout(o)}},Kn=()=>_.stdout.write(""),Wn=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Yn=async()=>{let e=await Gn();return Jn(e)},Vn=e({meta:{name:"check-usage",description:"Show current usage/quota information"},args:{watch:{alias:"w",type:"boolean",default:!1,description:"Keep running and refresh the report on an interval"},interval:{alias:"i",type:"string",default:"60",description:"Seconds between refreshes in --watch mode (min 10)"}},async run({args:e}){if(await oe(),await Rn(),!e.watch){try{r.box(await Yn())}catch(e){r.error("Failed to fetch usage:",e),_.exit(1)}_.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?r.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&r.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),o=_.stdout.isTTY,n=()=>_.exit(0);for(_.on("SIGINT",n),_.on("SIGTERM",n);;){try{let e=await Yn();o&&Kn(),r.box(e),r.log(Wn(new Date,t))}catch(e){r.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Xn=j(g);async function Zn(){let e="win32"===_.platform?"where.exe":"which";try{return await Xn(e,["tailscale"]),!0}catch{return!1}}async function Qn(){try{let{stdout:e}=await Xn("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function ei(e){return e.replace(/\.$/,"")}async function ti(){let e=await Qn();if(e?.Online)return ei(e.DNSName)}const ri=j(g),oi=e=>`${e}`,ni=e=>`${e}`,ii=e=>`${e}`,ai=e=>`${e}`,si=e=>`${e}`,li=e=>`${e}`,ci=ni(" ─────────────────────────────────────────────────────────────"),ui=s.join(re.APP_DIR,"certs","tailscale"),di=s.join(ui,"cert.pem"),pi=s.join(ui,"key.pem"),mi={certDir:ui,certPath:di,keyPath:pi};function fi(){switch(_.platform){case"darwin":return[` ${ni("Install Tailscale for macOS:")}`,` ${ii("https://tailscale.com/download/mac")}`,` ${ni("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${ni("After installing, open the Tailscale app and sign in.")}`,` ${ni("Then re-run this command.")}`].join("\n");case"linux":return[` ${ni("Install Tailscale for Linux:")}`,` ${ii("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${ii("sudo tailscale up")}`,` ${ni("or")} ${ii("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${ni("Install Tailscale for Windows:")}`,` ${ii("https://tailscale.com/download/windows")}`,"",` ${ni("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${ni("Install Tailscale:")} ${ii("https://tailscale.com/download")}`}}function hi(){let e=[` ${si("Tailscale is not running.")}`];return"darwin"===_.platform?e.push(` ${ni("Open the Tailscale app from Applications and sign in.")}`,` ${ni("Download:")} ${ii("https://tailscale.com/download/mac")}`):"win32"===_.platform?e.push(` ${ni("Open the Tailscale app and sign in.")}`,` ${ni("Download:")} ${ii("https://tailscale.com/download/windows")}`):e.push(` ${ni("Connect with:")} ${ii("sudo tailscale up")}`),e.push("",` ${ni("Then re-run this command.")}`),e.join("\n")}async function gi(){try{return await i.access(di),await i.access(pi),!0}catch{return!1}}function yi(e){console.log(""),console.log(ci),console.log(` ${oi("Claude Cowork Setup")} ${ni("— Diagnostic")}`),console.log(ci),console.log("");for(let t of function(e){let t=[];for(let[r,o]of Object.entries(e)){let e;e="ok"===o.status?ai("✅"):"missing"===o.status?si("❌"):li("❓");let n=o.detail?ni(` ${o.detail}`):"";t.push(` ${e} ${r}${n}`)}return t}(e))console.log(t);console.log("");let t=Object.values(e).filter(e=>"missing"===e.status);0===t.length?console.log(` ${ai("All checks passed.")}`):console.log(` ${si(`${t.length} issue(s).`)} Run ${ii("copilot-api cowork-setup install")} to fix.`),console.log("")}const _i={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},wi=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Zn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return yi(e),console.log(""),console.log(fi()),void console.log("");let r=await Qn();if(!r||!r.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},yi(e),console.log(hi()),void console.log("");let o=ei(r.DNSName);e["tailscale-running"]={status:"ok",detail:o};let n=await gi();e["tailscale-cert"]=n?{status:"ok",detail:di}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},n&&(e.ready={status:"ok",detail:`https://${o}:<port>`}),yi(e)}(),_.exit(0)}}),bi=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:_i},async run({args:e}){await async function(e){if(console.log(""),console.log(ci),console.log(` ${oi("Claude Cowork Setup")} ${ni("— Install")}`),console.log(ci),console.log(""),!await Zn())return console.log(` ${si("Tailscale is not installed.")}`),console.log(""),console.log(fi()),console.log(""),console.log(` ${ni("After installing, run")} ${ii("tailscale up")} ${ni("to connect, then re-run this command.")}`),void console.log("");let t=await Qn();if(!t||!t.Online)return console.log(hi()),void console.log("");let o=ei(t.DNSName);if(console.log(` ${ni("Tailscale hostname:")} ${oi(o)}`),console.log(""),console.log(` ${oi("Generating TLS certificate via Tailscale…")}`),console.log(` ${ni("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${ii(`$ tailscale cert --cert-file ${di} --key-file ${pi} ${o}`)}`),console.log(""),e||await r.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await i.mkdir(ui,{recursive:!0}),r.start("Generating certificate (this may take a few seconds)…"),await ri("tailscale",["cert","--cert-file",di,"--key-file",pi,o]),console.log(` ${ai("✓ Certificate generated")}`)}catch(e){let t=e instanceof Error?e.message:String(e);return void r.error(`Failed to generate cert: ${t}`)}console.log(""),console.log(ci),console.log(` ${oi("Next steps")}`),console.log(ci),console.log(""),console.log(` ${oi("1.")} Start the proxy:`),console.log(` ${ii("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${oi("2.")} In Cowork ${ni("→")} Settings ${ni("→")} Inference Provider, set:`),console.log(` ${oi("inferenceGatewayBaseUrl")} = ${ii(`https://${o}:<port>`)}`),console.log(` ${ni("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${oi("3.")} Restart Cowork ${ni("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${ni("For Cowork's own configuration docs, see:")}`),console.log(` ${ii("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else r.info("Skipped.")}(e.yes),_.exit(0)}}),vi=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:_i},async run({args:e}){await async function(e){if(console.log(""),console.log(ci),console.log(` ${oi("Claude Cowork Setup")} ${ni("— Revert")}`),console.log(ci),console.log(""),await gi())if(console.log(` ${oi("Remove Tailscale cert files:")}`),console.log(` ${ni(di)}`),console.log(` ${ni(pi)}`),console.log(""),e||await r.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await i.rm(ui,{recursive:!0}),console.log(` ${ai("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);r.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${ni("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else r.info("Skipped.");else console.log(` ${ni("No Tailscale cert found. Nothing to revert.")}`),console.log("")}(e.yes),_.exit(0)}}),ki=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:wi,install:bi,revert:vi}}),xi=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Ti(e){if(!xi.test(e))return e;let t=e,r=String.fromCodePoint(27),o=t.split(r);if(o.length>1){t=o[0];for(let e=1;e<o.length;e++){let n=o[e],i=n.match(/^\[[0-9;]*[a-z]/i);t+=i?n.slice(i[0].length):r+n}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function Ai(e){return"string"==typeof e?Ti(e):Array.isArray(e)?function(e){let t;for(let r=0;r<e.length;r++){let o=e[r],n=Ai(o);!t&&n!==o&&(t=e.slice(0,r)),t?.push(n)}return t??e}(e):e&&"object"==typeof e?function(e){let t,r=Object.entries(e),o="thinking"===e.type;for(let e=0;e<r.length;e++){let[n,i]=r[e],a=!o||"thinking"!==n&&"signature"!==n?Ai(i):i;t||a===i&&"__proto__"!==n||(t=Si({},r,e)),t&&(t[n]=a)}let n=t??e;return"object"===n.type&&!("properties"in n)&&(t??=Si({},r,r.length),t.properties={}),t??e}(e):e}function Si(e,t,r){for(let o=0;o<r;o++)e[t[o][0]]=t[o][1];return e}const $i="x-copilot-api-self-test",Ei=M();const Oi=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Ci(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==e.capabilities.type&&"image"!==e.capabilities.type&&"decisions"!==e.capabilities.type&&!function(e){let t=e.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e.id)}(e)&&!function(e){return"disabled"===e.policy?.state}(e)}function Ii(e){let t=2;return Oi.test(e.id)?t=0:"Anthropic"===e.vendor&&(t=1),2*t+ +!e.model_picker_enabled}const Ri=new Set(["model_not_supported","no_available_model_endpoints"]);function qi(e,t){if(400!==e||!t)return!1;try{let e=JSON.parse(t).error?.code;return"string"==typeof e&&Ri.has(e)}catch{return!1}}const Pi="function"==typeof l.snapshot?l.snapshot():e=>e(),Ni=e=>{try{return J(e,"utf8")}catch{return}},Mi=e=>({read:Ni,root:"/sys/fs/cgroup",totalMem:a.totalmem(),rss:()=>process.memoryUsage.rss(),platform:process.platform,...e}),ji=(e,t)=>Number.isFinite(e)&&e>0&&e<t?e:void 0,Di=(e,t)=>{if(!e)return;let r=RegExp(`^${t}:? +(\\d+)`,"m").exec(e);return r?Number(r[1]):void 0};const Li=(e,t)=>{let r=e.root.replace(/\/+$/,""),o=r&&(t===r||t.startsWith(`${r}/`))?t.slice(r.length):t;return((e,t)=>{let r=t.split("/").filter(e=>e&&"."!==e&&".."!==e),o=[];for(let t=r.length;t>=0;t--)o.push([e,...r.slice(0,t)].join("/"));return o})(e.mountPoint,o)};function Bi(e={}){let t,r=Mi(e),o=function(e){let t=e.read("/proc/self/cgroup")??"",r=function(e){let t={v2:{root:"/",mountPoint:e.root},v1:{root:"/",mountPoint:`${e.root}/memory`}},r={v2:!1,v1:!1};for(let o of(e.read("/proc/self/mountinfo")??"").split("\n")){let e=o.split(" "),n=e.indexOf("-");if(n<5)continue;let i={root:e[3],mountPoint:e[4]},a=e[n+1];"cgroup2"!==a||r.v2?"cgroup"===a&&!r.v1&&(e[n+3]??"").split(",").includes("memory")&&(t.v1=i,r.v1=!0):(t.v2=i,r.v2=!0)}return t}(e),o=[{source:"cgroup_v2",dirs:Li(r.v2,/^0::(.*)$/m.exec(t)?.[1]??"/"),current:"memory.current",max:"memory.max",inactive:"inactive_file"},{source:"cgroup_v1",dirs:Li(r.v1,/^\d+:(?:[^:]*,)?memory(?:,[^:]*)?:(.*)$/m.exec(t)?.[1]??"/"),current:"memory.usage_in_bytes",max:"memory.limit_in_bytes",inactive:"total_inactive_file"}];for(let t of o){let r=[];for(let o of t.dirs){let n=Number(e.read(`${o}/${t.current}`));if(!Number.isFinite(n))continue;let i=e.read(`${o}/${t.max}`)?.trim(),a=Di(e.read(`${o}/memory.stat`),t.inactive);r.push({limit:void 0===i||"max"===i?void 0:ji(Number(i),e.totalMem),used:Math.max(0,n-(a??0))})}if(r.length>0)return{source:t.source,levels:r}}}(r);for(let e of o?.levels??[])void 0!==e.limit&&(!t||e.limit-e.used<t.limitBytes-t.usedBytes)&&(t={limitBytes:e.limit,usedBytes:e.used,source:o?.source??"host"});if(t)return t;let n=r.read("/proc/meminfo"),i=Di(n,"MemTotal"),a=Di(n,"MemAvailable");return"linux"===r.platform&&i&&void 0!==a?{limitBytes:1024*i,usedBytes:Math.max(0,1024*(i-a)),source:"host"}:{limitBytes:r.totalMem,usedBytes:r.rss(),source:"rss"}}const Fi=(e,t)=>{let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?r:t};var Ui=class{level="normal";last;timer;listeners=new Set;sampleListeners=new Set;thresholds;read;rss;intervalMs;constructor(e={}){this.thresholds=e.thresholds??{low:Fi("COPILOT_API_IMAGES_PRESSURE_LOW",.7),high:Fi("COPILOT_API_IMAGES_PRESSURE_HIGH",.8),critical:Fi("COPILOT_API_IMAGES_PRESSURE_CRITICAL",.9)},this.read=e.read??(()=>Bi()),this.rss=e.rss??(()=>process.memoryUsage.rss()),this.intervalMs=e.intervalMs??1e3}get current(){return this.level}get lastSample(){return this.last}onChange(e){this.listeners.add(e)}onSample(e){this.sampleListeners.add(e)}start(){this.timer||(this.sample(),Pi(()=>{this.timer=setInterval(()=>this.sample(),this.intervalMs),this.timer.unref()}))}stop(){clearInterval(this.timer),this.timer=void 0}sample(){let e;try{e=this.read()}catch{return this.level}for(let t of this.sampleListeners)t(e);let t=((e,t)=>"cgroup_v2"===e.source||"cgroup_v1"===e.source?e.usedBytes:t)(e,this.rss()),r=t/e.limitBytes,o=this.level;if(this.level=function(e,t,r){return t>=r.critical?"critical":t>=r.high?"critical"===e?"critical":"high":"critical"===e?"high":"high"===e?t<r.low?"normal":"high":"normal"}(o,r,this.thresholds),this.last={level:this.level,usedBytes:t,limitBytes:e.limitBytes,ratio:r,source:e.source},this.level!==o){let i=e=>Math.round(e/1024/1024),a=`Image memory pressure ${o} -> ${this.level}: ${i(t)} of ${i(e.limitBytes)} MB (${Math.round(100*r)}%, ${e.source})`;"normal"===this.level?n.info(a):n.warn(a);for(let e of this.listeners)e(this.level,o)}return this.level}};const Hi=1048576,zi=8388608,Ji=16*Hi,Gi=100*Hi,Ki=e=>((e,t=1)=>Math.ceil(1*Math.min(Math.max(e,0),Gi)+5242880*Math.max(1,Math.floor(t))))(e??Ji)+zi;var Wi=class extends Error{reason;constructor(e){super(`Image request not admitted: ${e}`),this.reason=e,this.name="AdmissionRejectedError"}},Yi=class{inUse=0;inFlight=0;queue=[];budgetScale=1;paused=!1;latencyMs=3e4;now;options;constructor(e){this.options=e,this.now=e.now??(()=>performance.now())}get fullBudget(){return Math.max(0,this.options.ceilingBytes??this.options.budgetBytes)}get budget(){let e=Math.min(Math.max(0,this.options.budgetBytes),this.fullBudget);return Math.floor(e*this.budgetScale)}setBudgetBytes(e){e!==this.options.budgetBytes&&(this.options={...this.options,budgetBytes:e},this.pump())}stats(){return{budgetBytes:this.budget,inUseBytes:this.inUse,inFlight:this.inFlight,queueDepth:this.queue.length}}retryAfterSeconds(){return Math.min(55,Math.max(5,Math.ceil(this.latencyMs/1e3)))}setPaused(e){this.paused=e,e||this.pump()}get isPaused(){return this.paused}setBudgetScale(e){this.budgetScale=e,this.pump()}failQueued(e){for(let t of this.queue.splice(0))t.cleanup(),t.reject(new Wi(e))}acquire(e,t){return t?.aborted?Promise.reject(new Wi("aborted")):e>this.fullBudget?Promise.reject(new Wi("too_large")):this.paused?Promise.reject(new Wi("memory_pressure")):0===this.queue.length&&this.fits(e)?Promise.resolve(this.grant(e)):this.queue.length>=this.options.maxQueue?Promise.reject(new Wi("queue_full")):new Promise((r,o)=>{let n=()=>{let e=this.queue.indexOf(s);return-1!==e&&(this.queue.splice(e,1),s.cleanup(),this.pump(),!0)},i=setTimeout(()=>{n()&&o(new Wi("queue_timeout"))},this.options.queueTimeoutMs),a=()=>{n()&&o(new Wi("aborted"))},s={weight:e,enqueuedAt:this.now(),resolve:r,reject:o,cleanup:()=>{clearTimeout(i),t?.removeEventListener("abort",a)}};t?.addEventListener("abort",a,{once:!0}),this.queue.push(s)})}fits(e){return!(this.inFlight>=this.options.maxConcurrent)&&this.inUse+Math.max(Math.ceil(e),0)<=this.budget}pump(){for(;!this.paused&&this.queue.length>0;){let e=this.queue[0];if(!this.fits(e.weight))return;this.queue.shift(),e.cleanup(),e.resolve(this.grant(e.weight))}}grant(e){let t=Math.max(Math.ceil(e),0);return this.inUse+=t,this.inFlight+=1,new Vi(this,t,this.now())}growHeld(e,t){let r=Math.max(0,Math.ceil(t));return e+r>this.fullBudget?"too_large":this.inUse+r>this.budget?"busy":(this.inUse+=r,"ok")}trimHeld(e){this.inUse-=e,this.pump()}releaseHeld(e,t){this.inUse-=e,--this.inFlight,this.recordLatency(this.now()-t),this.pump()}recordLatency(e){this.latencyMs=.2*e+.8*this.latencyMs}},Vi=class{released=!1;held;gate;grantedAt;constructor(e,t,r){this.gate=e,this.held=t,this.grantedAt=r}get weight(){return this.held}grow(e){if(this.released)return"busy";let t=this.gate.growHeld(this.held,e);return"ok"===t&&(this.held+=Math.max(0,Math.ceil(e))),t}trim(e){let t=Math.max(0,Math.ceil(e));this.released||t>=this.held||(this.gate.trimHeld(this.held-t),this.held=t)}release(){this.released||(this.released=!0,this.gate.releaseHeld(this.held,this.grantedAt))}};const Xi=(e,t)=>{let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?Math.floor(r):t};function Zi(e,t,r=0){let o=Xi("COPILOT_API_IMAGES_MEMORY_BUDGET_MB",0)*Hi;if(o>0)return o;let n=e-Math.max(t,209715200)-Math.max(0,r)-268435456;return Math.max(0,Math.floor(.9*n))}const Qi=e=>Zi(e.limitBytes,Math.max(e.idleRssBytes,e.rssBytes-e.imageInUseBytes),e.usedBytes-e.rssBytes);var ea=class{tokens;last;timer;queue=[];burst;intervalMs;now;constructor(e){this.burst=e.burst,this.intervalMs=e.intervalMs,this.now=e.now??(()=>performance.now()),this.tokens=e.burst,this.last=this.now()}get waiting(){return this.queue.length}refill(){let e=this.now();this.tokens=Math.min(this.burst,this.tokens+(e-this.last)/this.intervalMs),this.last=e}drain(){for(this.refill();this.queue.length>0&&this.tokens>=1;){--this.tokens;let e=this.queue.shift();e.resolve(Math.round(this.now()-e.enqueuedAt))}this.queue.length>0&&!this.timer&&Pi(()=>{this.timer=setTimeout(()=>{this.timer=void 0,this.drain()},Math.ceil((1-this.tokens)*this.intervalMs))})}take(e){return e?.aborted?Promise.reject(new Wi("aborted")):(this.refill(),0===this.queue.length&&this.tokens>=1?(--this.tokens,Promise.resolve(0)):new Promise((t,r)=>{let o=()=>{let e=this.queue.indexOf(n);-1!==e&&(this.queue.splice(e,1),r(new Wi("aborted")))},n={enqueuedAt:this.now(),resolve:r=>{e?.removeEventListener("abort",o),t(r)}};e?.addEventListener("abort",o,{once:!0}),this.queue.push(n),this.drain()}))}};let ta;function ra(){if(ta)return ta;let e=Bi(),t=process.memoryUsage.rss(),r=Qi({limitBytes:e.limitBytes,usedBytes:e.usedBytes,rssBytes:t,idleRssBytes:t,imageInUseBytes:0}),o=new Yi({budgetBytes:r,ceilingBytes:Zi(e.limitBytes,t),maxConcurrent:Xi("COPILOT_API_IMAGES_MAX_CONCURRENT",30),maxQueue:Xi("COPILOT_API_IMAGES_MAX_QUEUE",32),queueTimeoutMs:Xi("COPILOT_API_IMAGES_QUEUE_TIMEOUT_MS",45e3)}),i=new Ui;return i.onChange(e=>oa(o,e)),i.onSample(e=>o.setBudgetBytes(Qi({limitBytes:e.limitBytes,usedBytes:e.usedBytes,rssBytes:process.memoryUsage.rss(),idleRssBytes:t,imageInUseBytes:o.stats().inUseBytes}))),n.info(`Image admission: budget ${Math.round(r/Hi)} MB of a ${Math.round(e.limitBytes/Hi)} MB limit (${e.source})`),ta={gate:o,monitor:i,pacer:new ea({burst:Xi("COPILOT_API_IMAGES_START_BURST",30),intervalMs:Xi("COPILOT_API_IMAGES_START_RATE",400)})},i.start(),oa(o,i.current),ta}function oa(e,t){"critical"===t?(e.setPaused(!0),e.failQueued("memory_pressure"),e.setBudgetScale(.5)):(e.setBudgetScale(1),e.setPaused("high"===t))}let na;function ia(e){let{heapUsed:t,rss:r,external:o,arrayBuffers:n}=process.memoryUsage();na??=U().heap_size_limit,e.setAttribute("copilot_api.process.heap_used_bytes",t),e.setAttribute("copilot_api.process.rss_bytes",r),e.setAttribute("copilot_api.process.external_bytes",o),e.setAttribute("copilot_api.process.array_buffers_bytes",n);let i=ta?.monitor.lastSample;i&&(e.setAttribute("copilot_api.process.memory_pressure",i.level),("cgroup_v2"===i.source||"cgroup_v1"===i.source)&&e.setAttribute("copilot_api.process.cgroup_working_set_bytes",i.usedBytes)),e.setAttribute("copilot_api.process.heap_limit_bytes",na),e.setAttribute("copilot_api.process.uptime_s",Math.round(process.uptime()))}function aa(e){try{!function(e){let{c:t,start:r,span:o}=e,n=t.get("requestData"),i=t.res.status,a=n?.model??"unknown",s=n?.streaming??!1,l=Math.round(performance.now()-r);if(o.setAttribute("http.status_code",i),o.setAttribute("copilot_api.model",a),o.setAttribute("copilot_api.streaming",s),o.setAttribute("copilot_api.duration_ms",l),ia(o),n?._d1&&o.setAttribute("copilot_api.copilot_duration_ms",n._d1),n?.tokenUsage){let e=n.tokenUsage;o.setAttribute("copilot_api.input_tokens",e.inputTokens),o.setAttribute("copilot_api.output_tokens",e.outputTokens),o.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&o.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let r=t.toLowerCase();_t.has(r)||o.setAttribute(`http.response.header.${r}`,e)}),i>=400&&o.setStatus({code:d.ERROR,message:`HTTP ${i}`})}(e)}catch(e){r.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:r,method:o,path:n,endpointType:i,requestId:a}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-r),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",d=l?.streaming??!1,p={method:o,path:n,status_code:String(c),model:u,streaming:String(d),endpoint_type:i};if(Le.add(1,p),ot.record(s,p),c>=400&&Be.add(1,{method:o,path:n,status_code:String(c),error_type:c>=500?"server_error":"client_error"}),l?.tokenUsage){let e=l.tokenUsage,t={model:u,endpoint_type:i};e.inputTokens&&(Fe.add(e.inputTokens,t),ut.record(e.inputTokens,t)),e.outputTokens&&(Ue.add(e.outputTokens,t),dt.record(e.outputTokens,t)),e.cachedTokens&&He.add(e.cachedTokens,{model:u})}!d&&l?.tokenUsage&&Oe.executeCompletion(a)}(e)}catch(e){r.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}Oe.completionCallbacks.delete(e.requestId)}const sa=3e4,la=12e4,ca=2e3,ua=new WeakMap,da=(e,t)=>{if(!e)return Promise.resolve();let r=ua.get(e);return r||(r=pa(e,t),ua.set(e,r)),r},pa=async(e,{read:t,limit:r,declared:o,deadline:n=performance.now()+la})=>{let i,a=t;try{for(;;){void 0===i&&(a>r||void 0!==o&&a>o)&&(i=performance.now()+ca);let t=Math.min(n,i??n),s=Math.min(sa,t-performance.now());if(s<=0)return void await ma(e);let l=await fa(e,s);if("timeout"===l)return void await ma(e);if(l.done)return;a+=l.value.byteLength}}catch{}},ma=async e=>{let t;try{await Promise.race([e.cancel().catch(()=>{}),new Promise(e=>{t=setTimeout(e,1e3)})])}finally{clearTimeout(t)}},fa=async(e,t)=>{let r;try{return await Promise.race([e.read(),new Promise(e=>{r=setTimeout(()=>e("timeout"),t)})])}finally{clearTimeout(r)}};let ha=0;const ga=()=>{if(ha>=(()=>{let e=Number(process.env.COPILOT_API_IMAGES_MAX_DRAINS);return Number.isFinite(e)&&e>=0?Math.floor(e):8})())return;ha++;let e=!1;return{start:t=>{e||(e=!0,Pi(()=>{ya(t())}))}}},ya=e=>{e.catch(()=>{}).finally(()=>{ha--})},_a=e=>{let t=ga();return t?.start(e),void 0!==t},wa=(e,t,r)=>{let{body:o}=e;return!(o&&!o.locked)||((e,t)=>ua.has(e)||_a(()=>da(e,t)))(o.getReader(),{read:0,limit:t,declared:r})},ba=e=>e.includes("/images/edits")?104857600:33554432,va=e=>new Promise((t,r)=>{let o=()=>r(new DOMException("The client closed the request.","AbortError"));e?.aborted?o():e?.addEventListener("abort",o,{once:!0})}),ka=async e=>{if(!se())return Me.startActiveSpan("copilot_api.approval.await",async t=>{let o=performance.now();try{let n,i=r.prompt("Accept incoming request?",{type:"confirm"});try{n=await Promise.race([i,va(e)])}catch(r){throw e?.aborted&&(t.setAttribute("copilot_api.approval.result","aborted"),Qe.add(1,{result:"aborted"})),r}let a=performance.now()-o;if(t.setAttribute("copilot_api.approval.wait_duration_ms",a),mt.record(a),!n)throw t.setAttribute("copilot_api.approval.result","rejected"),Qe.add(1,{result:"rejected"}),new mr("Request rejected",Response.json({message:"Request rejected"},{status:403}));t.setAttribute("copilot_api.approval.result","approved"),Qe.add(1,{result:"approved"})}finally{t.end()}})};async function xa(e){if(mo(he)||await Cn())return null;let t=xn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${An()}`,type:"authentication_error"}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function Ta(e){let t=e.prompt_tokens||0,r=e.completion_tokens||0;return{inputTokens:t,outputTokens:r,totalTokens:e.total_tokens||t+r,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function Aa(e,t){e.setAttributes(function(e){let t={};void 0!==e.prompt_tokens&&(t["copilot_api.input_tokens"]=e.prompt_tokens),void 0!==e.completion_tokens&&(t["copilot_api.output_tokens"]=e.completion_tokens),void 0!==e.total_tokens&&(t["copilot_api.total_tokens"]=e.total_tokens);let r=e.prompt_tokens_details?.cached_tokens;return void 0!==r&&(t["copilot_api.cached_tokens"]=r),t}(t))}var Sa=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function $a(e){if(!e||"string"!=typeof e)throw new Sa("Model name is required and must be a string");if("foundry"===he.provider)return e;if(!he.models?.data)throw new Sa("Models not available. Please try again later.",503);let t=he.models.data.map(e=>e.id);if(t.includes(e))return e;let r=qo(e,t);if(!r)throw Je.add(1,{requested_model:e}),new Sa(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return r}function Ea(e){let t=he.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===he.provider?wo(e):/gpt-[\d.]+-codex/i.test(e)}async function Oa(e){if(void 0===e.rateLimitSeconds||se())return;let t=e.rateLimitSeconds;return Me.startActiveSpan("copilot_api.rate_limit.check",async o=>{try{let n=Date.now();if(o.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=n,void o.setAttribute("copilot_api.rate_limit.action","allowed");let i=(n-e.lastRequestTimestamp)/1e3;if(o.setAttribute("copilot_api.rate_limit.elapsed_seconds",i),i>t)return e.lastRequestTimestamp=n,void o.setAttribute("copilot_api.rate_limit.action","allowed");let a=Math.ceil(t-i);if(o.setAttribute("copilot_api.rate_limit.wait_seconds",a),!e.rateLimitWait)throw o.setAttribute("copilot_api.rate_limit.action","rejected"),ze.add(1,{action:"rejected",source:"local"}),r.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new mr("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*a;o.setAttribute("copilot_api.rate_limit.action","waited"),ze.add(1,{action:"waited",source:"local"}),at.record(s,{source:"local"}),r.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await un(s),e.lastRequestTimestamp=n,r.info("Rate limit wait completed, proceeding with request")}finally{o.end()}})}var Ca=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Ia(e){if(e instanceof Ca)return{type:e.type,message:e.message};if(e instanceof mr){let t=e.response.status;return{type:529===t?"overloaded_error":`upstream_error_${t}`,message:`Upstream error (${t}) while streaming response`}}return{type:"api_error",message:"Stream interrupted before completion"}}async function Ra(e,t){let{type:o,message:n}=Ia(t);try{await e.writeSSE({event:"error",data:JSON.stringify({type:"error",error:{type:o,message:n}})})}catch(e){r.debug("Failed to emit Anthropic stream error frame:",e)}}async function qa(e,t){let{type:o,message:n}=Ia(t);try{await e.writeSSE({event:"error",data:JSON.stringify({error:{message:n,type:o}})})}catch(e){r.debug("Failed to emit OpenAI stream error frame:",e)}}function Pa(e){if("number"==typeof e){if(!Number.isFinite(e))return null;let t=Math.floor(e);return t>0?t:null}if("string"==typeof e){let t=e.trim();if(!t)return null;let r=Number(t);if(!Number.isFinite(r))return null;let o=Math.floor(r);return o>0?o:null}return null}function Na(e,t,r){return Math.min(Math.max(e,t),r)}function Ma(e,t=0){if(t>5||!e||"object"!=typeof e)return null;let r=e.error;if(!r||"object"!=typeof r)return null;let o=r.code;if("string"==typeof o)return o;let n=r.message;if("string"!=typeof n)return null;try{return Ma(JSON.parse(n),t+1)}catch{return null}}function ja(e,t){let r=e?.data.find(e=>e.id===t);if(!r)return null;let o=Pa(r.capabilities.supports.min_thinking_budget),n=Pa(r.capabilities.supports.max_thinking_budget);return!o||!n||n<=o?null:{bounds:{min:o,max:n-1},maxOutputTokens:Pa(r.capabilities.limits?.max_output_tokens)??void 0}}function Da(e){let{config:t}=e,r=t.bounds.min,o=t.bounds.max,n=Na(Pa(e.requestedBudget)??r,r,o),i=Pa(e.maxTokens);if(i||=n+1,t.maxOutputTokens&&i>t.maxOutputTokens&&(i=t.maxOutputTokens),i<=n){let e=Math.min(n,i-1);if(e>=r)n=e;else{let e=r+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:i};i=e,n=r}}return i<=n?{thinkingBudget:null,maxTokens:i}:{thinkingBudget:n,maxTokens:i}}function La(e,t){if(dn(e.thinking_budget))return e;let r=ja(t,e.model);if(!r)return{...e,thinking_budget:void 0};let o=Da({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:r});return null===o.thinkingBudget?{...e,max_tokens:o.maxTokens,thinking_budget:void 0}:{...e,max_tokens:o.maxTokens,thinking_budget:o.thinkingBudget}}function Ba(e){return"invalid_thinking_budget"===Ma(e)}async function Fa(e){let{payload:t,error:r,models:o,errorBodyText:n}=e;if(dn(t.thinking_budget)||!(r instanceof Error))return null;let i,a,s=r;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==n)i=n;else try{i=await s.response.clone().text()}catch{return null}try{a=JSON.parse(i)}catch{return null}if(!Ba(a))return null;let l=ja(o,t.model);return l?function(e,t){let r=Da({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:t});if(null===r.thinkingBudget)return{...e,max_tokens:r.maxTokens,thinking_budget:void 0};let o=r.thinkingBudget,n=Pa(e.thinking_budget);if(n&&n===r.thinkingBudget){let e=o+1;e<=t.bounds.max&&(!r.maxTokens||e<r.maxTokens)&&(o=e)}let i=r.maxTokens;if((!i||i<=o)&&(i=o+1),t.maxOutputTokens&&i>t.maxOutputTokens){if(!(t.maxOutputTokens>o))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};i=t.maxOutputTokens}return{...e,max_tokens:i,thinking_budget:o}}(t,l):{...t,thinking_budget:void 0}}function Ua(e,t){let r=!1;return()=>{if(r)return;r=!0;let o=e.get("requestData")||{};o.upstreamTtfbMs=performance.now()-t,e.set("requestData",o)}}function Ha(e,t){let r=e.get("requestData")||{};r.upstreamTotalMs=performance.now()-t,r._d1=r.upstreamTotalMs,e.set("requestData",r)}const za=new Map,Ja=new Map,Ga=new Set;let Ka,Wa,Ya;function Va(e){return!e.closed&&!e.destroyed}function Xa(e){r.debug(`Creating HTTP/2 client for ${e}`);let t=new I(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return za.set(t,Date.now()),tt.add(1,{event:"created",origin:e}),ft(w.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{r.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{r.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(o,n,i)=>{r.debug(`HTTP/2 client disconnected from ${e}:`,i.message);let a=Ga.has(t);tt.add(1,{event:"goaway",origin:e}),ft(a?w.WARN:w.DEBUG,a?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${i.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":i.message}),Ja.delete(t),Ga.delete(t),za.delete(t),Va(t)&&t.close().catch(e=>{r.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Za(e,t){if(!he.connectivity.h2)return;if(Ka&&Ka!==e&&function(){for(let e of[...Ja.keys(),...Ga])Va(e)&&e.close().catch(e=>{r.debug("Error closing HTTP/2 pool entry:",e)});Ja.clear(),Ga.clear(),za.clear()}(),Ka=e,t?.fresh){let t=Xa(e);return Ga.add(t),t}let o=Date.now();for(let[t]of Ja)if(o-(za.get(t)??0)>=6e5)Ja.delete(t),za.delete(t),Va(t)&&t.close().catch(e=>{r.debug("Error closing rotated HTTP/2 client:",e)}),tt.add(1,{event:"rotated",origin:e}),ft(w.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Va(t))return Ja.delete(t),Ga.add(t),t;Ja.delete(t),za.delete(t)}let n=Xa(e);return Ga.add(n),n}function Qa(e){e&&Ga.delete(e)&&(Va(e)?Ja.set(e,Date.now()):za.delete(e))}function es(){Ya||(Ya=setInterval(()=>{!function(){let e=Date.now(),t=he.connectivity.h2Keepalive,o=Ja.size;for(let[n,i]of Ja)e-i<6e4||t&&o<=1||(Ja.delete(n),za.delete(n),o--,Va(n)&&n.close().catch(e=>{r.debug("Error closing idle HTTP/2 client:",e)}),tt.add(1,{event:"idle_reaped",origin:Ka??""}),ft(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${Ka}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Ka??""}))}()},3e4),Ya.unref())}function ts(){Wa||(r.debug("Starting HTTP/2 keepalive (every 45s)"),Wa=setInterval(()=>{(async function(){if(0===Ja.size&&0===Ga.size){if(Ka){let e=Xa(Ka);Ja.set(e,Date.now())}return}let e=[...Ja.keys()];for(let t of e)Ja.delete(t);await Promise.allSettled(e.map(async e=>{if(Va(e))try{let{statusCode:t,body:o}=await e.request({path:"/models",method:"GET",headers:Ct(he)});await o.dump(),et.add(1,{result:"success"}),r.debug(`HTTP/2 keepalive: GET /models → ${t}`),Ja.set(e,Date.now())}catch(t){et.add(1,{result:"error"}),r.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),tt.add(1,{event:"error",origin:Ka??""}),za.delete(e),Va(e)&&e.close().catch(e=>{r.debug("Error closing broken HTTP/2 client:",e)})}else za.delete(e)}))})().catch(e=>{r.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Wa.unref(),es())}function rs(e,t){if(e instanceof ReadableStream)return new Response(e,t);let r,o=new ReadableStream({async pull(t){r??=e[Symbol.asyncIterator]();let o=await r.next();o.done?t.close():t.enqueue(o.value)},cancel(t){e.on("error",()=>{}),e.destroy(t instanceof Error?t:void 0)}});return new Response(o,t)}async function*os(e,t){try{yield*K(e)}finally{ns(t)}}function ns(e){e instanceof ReadableStream||e.destroyed||(e.on("error",()=>{}),e.destroy())}function is(e){return e.max_completion_tokens??e.max_tokens}async function as(e,t,r){try{if(!e.ok)throw new mr("Failed to create chat completions",e,{outgoingBody:r.outgoingBody,outgoingHeaders:r.outgoingHeaders});let o=await e.json();return o.id&&t.setAttribute("copilot_api.response.id",o.id),o.usage&&Aa(t,o.usage),o}catch(e){throw ht(t,e),e}finally{t.end()}}const ss=e=>lo(he)?e:function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...r}=e;return null==t?r:{...r,max_tokens:t}}let{max_tokens:r,max_completion_tokens:o,stop:n,...i}=e,a=is(e);return null==a?i:{...i,max_completion_tokens:a}}(e,he.models),ls=e=>lo(he)?e:Ai(e),cs=async(e,t)=>{let o=ls(e),n=t?.signal;try{return await ps(o,n)}catch(e){if(e instanceof mr&&401===e.response.status){if(!await Zr(e))throw e;return ps(o,n)}let t;if(e instanceof mr)try{t=await e.response.clone().text()}catch{t=void 0}let i=await Fa({payload:o,error:e,models:he.models,errorBodyText:t});if(i)return e instanceof mr&&void 0!==t&&r.warn(`Upstream rejected thinking_budget (status ${e.response.status}): ${t.slice(0,500)}`),r.warn("Adjusting thinking_budget payload and retrying once..."),await ps(ls(i),n);throw e}},us=async(e,t)=>{let r=Ko(e);return r?(t.setAttribute("copilot_api.foundry.throttled_stream",!0),t.setAttribute("copilot_api.upstream.effective_status",429),t.setStatus({code:d.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(e.body?.cancel()),t.end(),r):(e.ok||t.end(),e.ok?void 0:e)};function ds(e,t){let r=()=>t.abort(e?.reason);return e?.aborted?r():e?.addEventListener("abort",r,{once:!0}),()=>e?.removeEventListener("abort",r)}async function ps(e,t){if(!mo(he))throw Error("Service token not found");let r=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),o=e.messages.some(e=>["assistant","tool"].includes(e.role)),n={...po(he,r),"X-Initiator":o?"agent":"user"},i=uo(he),a=`${i}/chat/completions`,s=he.timeoutMs,l=ss(e),c=JSON.stringify(l),u={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":s,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":is(e)??0,"copilot_api.vision_enabled":r,"copilot_api.initiator":o?"agent":"user","copilot_api.upstream.provider":he.provider};for(let r=0;r<=1;r++){me();let o=Za(i,{fresh:r>0}),l=new AbortController,d=Yo(l,s),p=ds(t,l);try{let{statusCode:t,headers:i,body:p,span:m}=await vt({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:c,signal:l.signal,headersTimeout:s,bodyTimeout:3*s,extraAttributes:{...u,"copilot_api.h2.retry_attempt":r},dispatcher:o}).finally(d.headersArrived),f=rs(p,{status:t,headers:i});if(e.stream){let e=await us(f,m);if(e)throw new mr("Failed to create chat completions",e,{outgoingBody:c,outgoingHeaders:n});return{events:os(f,p),span:m,release:()=>Qa(o)}}try{return await as(f,m,{outgoingBody:c,outgoingHeaders:n})}finally{Qa(o)}}catch(e){if(Qa(o),await pr(e,{attempt:r,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{d.clear(),p()}}throw Error("Unexpected: exhausted GOAWAY retries without result")}const ms=new Map;const fs=["none","minimal","low","medium","high","xhigh","max"];function hs(e,t){if(!e.reasoning)return e;if(0===t.length){let{reasoning:t,...r}=e;return r}let r=e.reasoning.effort;if(!r)return e;let o=function(e,t){if(t.includes(e))return e;let r=fs.indexOf(e);if(-1===r)return t[0];let o,n=1/0;for(let e of t){let t=fs.indexOf(e);if(-1===t)continue;let i=Math.abs(t-r);i<n&&(n=i,o=e)}return o??t[0]}(r,t);return o&&o!==r?{...e,reasoning:{...e.reasoning,effort:o}}:e}function gs(e,t){if(!e.reasoning)return null;let o=function(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}let{param:r,code:o,message:n=""}=t.error??{};if("reasoning.effort"===r||"reasoning"===r){if("unsupported_value"===o){let e=[...(/Supported values are:(.*)$/i.exec(n)?.[1]??"").matchAll(/\x27([^\x27]+)\x27/g)].map(e=>e[1]);return e.length>0?{kind:"unsupported_value",supported:e}:void 0}if("unsupported_parameter"===o)return{kind:"unsupported_parameter"}}}(t);if(!o)return null;let n="unsupported_value"===o.kind?o.supported:[];ms.set(e.model,n);let i=hs(e,n);return i===e?null:(r.debug(`Foundry rejected reasoning.effort=${e.reasoning.effort} on ${e.model}; retrying with ${i.reasoning?.effort??"no reasoning"}`),i)}async function ys(e,t,r){try{if(!e.ok)throw new mr("Failed to create responses",e,{outgoingBody:r.outgoingBody,outgoingHeaders:r.outgoingHeaders});let o=await e.json();return o.id&&t.setAttribute("copilot_api.response.id",o.id),o.usage&&Aa(t,{prompt_tokens:o.usage.input_tokens,completion_tokens:o.usage.output_tokens,total_tokens:o.usage.total_tokens,prompt_tokens_details:o.usage.input_tokens_details}),o}catch(e){throw ht(t,e),e}finally{t.end()}}const _s=async(e,t)=>{let r=lo(he),o=r?function(e){let t=ms.get(e.model);return t?hs(e,t):e}(e):e,n=!1,i=!1;for(;;)try{return t?.onAttempt?.(o),await bs(o,t?.signal)}catch(e){if(!(e instanceof mr))throw e;if(401===e.response.status&&!n){if(n=!0,!await Zr(e))throw e;continue}if(r&&400===e.response.status&&!i){i=!0;let t=gs(o,await e.response.clone().text().catch(()=>{}));if(t){o=t;continue}}throw e}};function ws(e,t){let r,o=()=>{r?.destroy(e?.reason),t.abort(e?.reason)};return e?.aborted?o():e?.addEventListener("abort",o,{once:!0}),{attach:e=>r=e,dispose:()=>e?.removeEventListener("abort",o)}}const bs=async(e,t)=>{if(!mo(he))throw Error("Service token not found");let r=lo(he)?e:Ai(e),o={...po(he),"X-Initiator":"agent"},n=uo(he),i=`${n}/responses`,a=he.timeoutMs,s=JSON.stringify(r),l=((e,t)=>({"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":t,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.max_output_tokens":e.max_output_tokens??0,"copilot_api.api_type":"responses","copilot_api.upstream.provider":he.provider}))(r,a);for(let e=0;e<=1;e++){me();let c=Za(n,{fresh:e>0}),u=new AbortController,p=Yo(u,a),m=ws(t,u);try{let{statusCode:t,headers:n,body:f,span:h}=await vt({spanName:"copilot POST /responses",url:i,target:"responses",headers:o,body:s,signal:u.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:c}).finally(p.headersArrived);m.attach(f);let g=rs(f,{status:t,headers:n});if(r.stream){let e=Ko(g);if(e&&(h.setAttribute("copilot_api.foundry.throttled_stream",!0),h.setAttribute("copilot_api.upstream.effective_status",429),h.setStatus({code:d.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(g.body?.cancel())),!g.ok||e)throw h.end(),new mr("Failed to create responses",e??g,{outgoingBody:s,outgoingHeaders:o});return{events:os(g,f),span:h,release:()=>{m.dispose(),Qa(c)}}}try{return await ys(g,h,{outgoingBody:s,outgoingHeaders:o})}finally{m.dispose(),Qa(c)}}catch(t){if(m.dispose(),Qa(c),await pr(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{p.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},vs=e=>Object.hasOwn(e,"output");function ks(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens,...t.input_tokens_details&&{prompt_tokens_details:{cached_tokens:t.input_tokens_details.cached_tokens}},...t.output_tokens_details&&{completion_tokens_details:{reasoning_tokens:t.output_tokens_details.reasoning_tokens}}}:null}var xs=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,r=null){super(e),this.code=t,this.param=r}};const Ts=new Set(["model","messages","max_tokens","max_completion_tokens","temperature","top_p","stream","stream_options","tools","tool_choice","parallel_tool_calls","user","reasoning_effort","response_format"]);function As(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new xs(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new xs(`logprobs is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","logprobs")}(e);let t=function(e){return e.filter(e=>"system"===e.role||"developer"===e.role).map(e=>$s(e.content)).filter(Boolean).join("\n\n")||void 0}(e.messages),r=function(e){let t=[];for(let r of e)switch(r.role){case"user":{let e=Es(r.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=$s(r.content);e&&t.push({type:"message",role:"assistant",content:[{type:"output_text",text:e}]});for(let e of r.tool_calls??[])t.push({type:"function_call",call_id:e.id,name:e.function.name,arguments:e.function.arguments});break}case"tool":t.push({type:"function_call_output",call_id:r.tool_call_id??"",output:$s(r.content)})}return t}(e.messages);if(0===r.length)throw new xs("request has no translatable message content","invalid_request","messages");let o={model:e.model,input:r,store:!1};t&&(o.instructions=t);let n=e.max_completion_tokens??e.max_tokens;"number"==typeof n&&(o.max_output_tokens=Math.max(n,16)),e.stream&&(o.stream=!0),Ss(e.temperature)&&(o.temperature=e.temperature),Ss(e.top_p)&&(o.top_p=e.top_p),Ss(e.parallel_tool_calls)&&(o.parallel_tool_calls=e.parallel_tool_calls),Ss(e.user)&&(o.user=e.user),e.reasoning_effort&&(o.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(o.tools=e.tools.filter(e=>"function"===e.type).map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters}))),e.tool_choice&&(o.tool_choice="string"==typeof e.tool_choice?e.tool_choice:{type:"function",name:e.tool_choice.function.name});let i=function(e){if(e)switch(e.type){case"json_schema":{let{name:t,description:r,schema:o,strict:n}=e.json_schema;return{type:"json_schema",name:t,description:r,schema:o,strict:n}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return i&&(o.text={format:i}),o}function Ss(e){return null!=e}function $s(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Es(e){if("string"==typeof e)return e?[{type:"input_text",text:e}]:[];let t=[];for(let r of e??[])if("text"===r.type)r.text&&t.push({type:"input_text",text:r.text});else{if("image_url"!==r.type)throw new xs(`content part type '${r.type}' is not supported for models served via the Responses API`,"unsupported_content_type","messages");t.push({type:"input_image",image_url:r.image_url.url,detail:"low"===r.image_url.detail?"low":"high"})}return t}function Os(e){let t={prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens};return void 0!==e.input_tokens_details?.cached_tokens&&(t.prompt_tokens_details={cached_tokens:e.input_tokens_details.cached_tokens}),void 0!==e.output_tokens_details?.reasoning_tokens&&(t.completion_tokens_details={reasoning_tokens:e.output_tokens_details.reasoning_tokens}),t}function Cs(e,t){if("incomplete"===e.status){let t=e.incomplete_details?.reason;if("content_filter"===t)return"content_filter";if("max_output_tokens"===t)return"length"}return t?"tool_calls":"stop"}function Is(e,t,r=null){let o=e.roleSent?t:{role:"assistant",...t};return e.roleSent=!0,{id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[{index:0,delta:o,logprobs:null,finish_reason:r}]}}function Rs(e,t,r){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(r)}function qs(e,t){let r=e.item;if("function_call"!==r.type)return[];let o="response.output_item.done"===e.type,n=Rs(t,r.id,e.output_index);if(void 0!==n)return o&&!t.toolCallsWithArgs.has(n)&&r.arguments?(t.toolCallsWithArgs.add(n),[Is(t,{tool_calls:[{index:n,function:{arguments:r.arguments}}]})]):[];let i=function(e,t,r){let o=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,o),e.toolCallIndexByOutputIndex.set(r,o),o}(t,r.id,e.output_index),a=o?r.arguments:"";return a&&t.toolCallsWithArgs.add(i),[Is(t,{tool_calls:[{index:i,id:r.call_id,type:"function",function:{name:r.name,arguments:a}}]})]}function Ps(e,t){let r=[Is(e,{},Cs(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:o,...n}=Os(t.usage);r.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:n})}return r}function Ns(e,t){switch(e.type){case"response.created":case"response.in_progress":return t.id=e.response.id||t.id,t.model=e.response.model||t.model,e.response.created_at&&(t.created=e.response.created_at),{chunks:[]};case"response.output_text.delta":case"response.refusal.delta":return e.delta?{chunks:[Is(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:qs(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let r=Rs(t,e.item_id,e.output_index);return void 0!==r&&e.delta?(t.toolCallsWithArgs.add(r),{chunks:[Is(t,{tool_calls:[{index:r,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Ps(t,e.response),done:!0};case"response.failed":return{chunks:[],error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}};case"error":return{chunks:[],error:{type:e.code??"api_error",message:e.message??"Response generation failed"}};default:return{chunks:[]}}}const Ms="openai_responses";function js(e){let t=performance.now(),o=Me.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),As(e)}finally{t.end()}});st.record(performance.now()-t,{direction:"openai_to_responses"});let n=function(e){return Object.entries(e).filter(([e,t])=>!Ts.has(e)&&null!=t).map(([e])=>e)}(e);return n.length>0&&r.debug(`Dropped chat-only fields with no Responses API equivalent: ${n.join(", ")}`),o}function Ds(e){let t=performance.now(),r=Me.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",r=!1,o=[];for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type?(t+=e.text,r=!0):"refusal"===e.type&&(t+=e.refusal,r=!0);else"function_call"===n.type&&o.push({id:n.call_id,type:"function",function:{name:n.name,arguments:n.arguments}});let n={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:r?t:null,...o.length>0&&{tool_calls:o}},logprobs:null,finish_reason:Cs(e,o.length>0)}]};return e.usage&&(n.usage=Os(e.usage)),n}(e)}finally{t.end()}});return st.record(performance.now()-t,{direction:"responses_to_openai"}),r}function Ls(e,t,n){let i=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...r}=Os(t.usage);i.tokenUsage=Ta(r)}return i._d1=n,i.upstreamTtfbMs=n,i.upstreamTotalMs=n,e.set("requestData",i),r.level>=o.debug&&r.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(Ds(t))}async function Bs(e,t,o){let n;try{n=js(t)}catch(t){if(t instanceof xs)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}r.debug("Translated chat → Responses API payload:",JSON.stringify(n).slice(-400)),e.set("requestData",{model:n.model,streaming:!!n.stream}),he.manualApprove&&!o.isSelfTest&&await ka();let i=await xa(e);if(i)return i;let a=performance.now(),s=await _s(n),l=performance.now()-a;if(nt.record(l,{model:n.model,target:"responses",streaming:String(!!n.stream)}),vs(s))return Ls(e,s,l);let{events:c,span:u,release:d}=s,p=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:n.model,includeUsage:!0===t.stream_options?.include_usage});return G(e,async t=>{let o=null,i=0,s=performance.now(),m=Ua(e,a);try{try{for await(let a of c){if(m(),!a.data||"[DONE]"===a.data)continue;let s;try{s=JSON.parse(a.data)}catch(e){r.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}i++,Ze.add(1,{model:n.model,endpoint_type:Ms});let c=ks(s);if(c){o=c;let t=e.get("requestData")||{};t.tokenUsage=Ta(c),t._d1=l,e.set("requestData",t)}let u=Ns(s,p);if(u.error)throw new Ca(u.error.type,u.error.message);for(let e of u.chunks)await t.writeSSE({data:JSON.stringify(e)});u.done&&await t.writeSSE({data:"[DONE]"})}let u={model:n.model,endpoint_type:Ms};it.record(performance.now()-s,u),pt.record(i,u),Ha(e,a)}catch(r){throw gt(u,e.get("requestSpan"),r),await qa(t,r),r}finally{o&&Aa(u,o),u.end(),d()}let f=e.get("requestId");f&&Oe.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Fs(e,t){if(!e.data)return e;try{let r=JSON.parse(e.data);if(r.usage&&t(r.usage),void 0!==r.usage?.prompt_tokens_details?.cached_tokens)return{...e,data:JSON.stringify({...r,usage:{...r.usage,prompt_tokens_details:void 0}})}}catch(t){r.warn("Failed to parse streaming chunk:",e.data.slice(0,200),t)}return e}async function Us(e){let t=!0===e.get("isSelfTest");t||await Oa(he);let o=await e.req.json();r.debug("Request payload:",JSON.stringify(o).slice(-400));try{o=function(e){return Me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let o=$a(e.model);return t.setAttribute("copilot_api.model.normalized",o),o===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ge.add(1,{from_model:e.model,to_model:o}),r.debug(`Normalized model from '${e.model}' to '${o}'`),{...e,model:o})}finally{t.end()}})}(o)}catch(t){if(t instanceof Sa)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(Ea(o.model))return Bs(e,o,{isSelfTest:t});e.set("requestData",{model:o.model,streaming:!!o.stream}),he.manualApprove&&!t&&await ka(),"foundry"!==he.provider&&(o=function(e){if(!dn(e.max_completion_tokens)){let{max_completion_tokens:t,...r}=e;return{...r,max_tokens:t}}if(!dn(e.max_tokens))return e;let t=(he.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return r.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(o),o=La(o,he.models)),dn(o.thinking_budget)||r.debug("Normalized thinking_budget to:",JSON.stringify(o.thinking_budget));let n=await xa(e);if(n)return n;let i=performance.now(),a=await cs(o),s=performance.now()-i;if(nt.record(s,{model:o.model,target:"chat_completions",streaming:String(!!o.stream)}),Hs(a)){let t=e.get("requestData")||{};return a.usage&&(t.tokenUsage=Ta(a.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),r.debug("Non-streaming response:",JSON.stringify(a)),e.json(a)}let{events:l,span:c,release:u}=a;return G(e,async t=>{let r={value:null},n=0,a=performance.now(),d=Ua(e,i);try{try{for await(let i of l){d();let a=i;i.data&&"[DONE]"!==i.data&&(n++,Ze.add(1,{model:o.model,endpoint_type:"openai"}),a=Fs(i,t=>{r.value=t;let o=e.get("requestData")||{};o.tokenUsage=Ta(t),o._d1=s,e.set("requestData",o)})),await t.writeSSE(a)}let c=performance.now()-a,u={model:o.model,endpoint_type:"openai"};if(it.record(c,u),pt.record(n,u),Ha(e,i),r.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Ta(r.value),t._d1=s,e.set("requestData",t))}}catch(r){throw gt(c,e.get("requestSpan"),r),await qa(t,r),r}finally{r.value&&Aa(c,r.value),c.end(),u()}let p=e.get("requestId");p&&Oe.executeCompletion(p)}finally{e.get("resolveStreamComplete")?.()}})}const Hs=e=>Object.hasOwn(e,"choices"),zs=new B;zs.post("/",async e=>{try{return await cn(e,"chat",Us)}catch(t){return await jr(e,t)}});const Js=async(e,t,r)=>{if(!mo(he))throw Error("Service token not found");let o=lo(he)?"/decisions":"/v1/decisions",n=`${uo(he)}${o}`,i=po(he),a=new AbortController,s=hr(a,he.timeoutMs);try{let{response:o,span:s}=await bt({spanName:"copilot POST /v1/decisions",url:n,target:"decisions",method:"POST",headers:i,body:t,signal:r?AbortSignal.any([a.signal,r]):a.signal,extraAttributes:{"copilot_api.model":e,"copilot_api.upstream.provider":he.provider}});try{let e=await o.text();if(!o.ok)throw new mr("Failed to create decisions",new Response(e,{status:o.status,statusText:o.statusText,headers:o.headers}),{outgoingBody:t,outgoingHeaders:i});let r=Gs(e);if(!r){let e=`Upstream returned a ${o.status} decisions reply that is not a JSON object`;throw new mr(e,Response.json({error:{type:"upstream_invalid_reply",message:e}},{status:502}),{outgoingBody:t,outgoingHeaders:i})}return r}catch(e){throw ht(s,e),e}finally{s.end()}}finally{clearTimeout(s)}},Gs=e=>{try{let t=JSON.parse(e);return"object"==typeof t&&t&&!Array.isArray(t)?t:void 0}catch{return}},Ks=(e,t)=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error",code:"invalid_request"}},400)),Ws=(e,t)=>e.json({error:{message:`Request body exceeds the ${t/1024/1024} MB limit.`,type:"invalid_request_error",code:"request_too_large"}},413),Ys=(e,t,r)=>{try{if(r)throw new Sa(r);return $a(t)}catch(t){if(t instanceof Sa)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}},Vs=new B;Vs.post("/",async e=>{try{await Oa(he);let t=await e.req.text(),r=(e=>{try{let t=JSON.parse(e);return"object"==typeof t&&t&&!Array.isArray(t)?t:void 0}catch{return}})(t);if(!r)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json(((e,t)=>({error:{message:e,type:"invalid_request_error",code:t}}))("Request body must be a JSON object","invalid_json"),400);let o=Ys(e,r.model);if(o instanceof Response)return o;e.set("requestData",{model:o});let n=await xa(e);if(n)return n;he.manualApprove&&await ka(Lt(e));let i=o===r.model?t:JSON.stringify({...r,model:o}),a=performance.now(),s=await(async(e,t,r)=>{try{return await Js(e,t,r)}catch(o){if(o instanceof mr&&401===o.response.status){if(!await Zr(o))throw o;return Js(e,t,r)}throw o}})(o,i,Lt(e)),l=performance.now()-a;nt.record(l,{model:o,target:"decisions",streaming:"false"});let c=e.get("requestData")||{};return s.usage&&(c.tokenUsage=Ta(Os(s.usage))),c._d1=l,e.set("requestData",c),e.json(s)}catch(t){return await jr(e,t)}});const Xs=async e=>{if(!mo(he))throw Error("Service token not found");let t=`${uo(he)}/embeddings`,r=po(he),o=he.timeoutMs,n=new AbortController,i=hr(n,o),a=JSON.stringify(e);try{let{response:o,span:i}=await bt({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:r,body:a,signal:n.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1,"copilot_api.upstream.provider":he.provider}});try{if(!o.ok)throw new mr("Failed to create embeddings",o,{outgoingBody:a,outgoingHeaders:r});return await o.json()}catch(e){throw ht(i,e),e}finally{i.end()}}finally{clearTimeout(i)}},Zs=new B;Zs.post("/",async e=>{try{let t=await e.req.json();try{t.model=$a(t.model)}catch(t){if(t instanceof Sa)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let r=await xa(e);if(r)return r;let o=performance.now(),n=await(async e=>{try{return await Xs(e)}catch(t){if(t instanceof mr&&401===t.response.status){if(!await Zr(t))throw t;return Xs(e)}throw t}})(t),i=performance.now()-o;nt.record(i,{model:t.model,target:"embeddings",streaming:"false"});let a=e.get("requestData")||{};return a.tokenUsage=Ta(n.usage),a._d1=i,e.set("requestData",a),e.json(n)}catch(t){return await jr(e,t)}});const Qs=new B;let el=null,tl=null;Qs.get("/",async e=>{let t,r=function(){if(lo(he)){if(!mo(he))return"missing";let e=he.foundry?.bearerExpiresAt;return void 0!==e&&e<=Date.now()?"expired":"valid"}let e=he._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let r=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),o=JSON.parse(atob(r)),n="object"==typeof o&&o&&"exp"in o&&"number"==typeof o.exp?o.exp:void 0;return void 0!==n&&1e3*n<Date.now()?"expired":"valid"}catch{return"expired"}}(),o=await async function(){let e=Date.now(),t=el;return t&&e-t.timestamp<3e4?{result:t.result}:tl||(tl=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),r=performance.now();try{let t=`${uo(he)}/models`,o=await fetch(t,{method:"GET",headers:po(he),signal:e.signal}),n=Math.round(performance.now()-r),i=o.ok?"reachable":"unreachable";return el={result:i,timestamp:Date.now()},{result:i,latencyMs:n}}catch{let e=Math.round(performance.now()-r);return el={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),tl=null}})(),tl)}();t="valid"===r&&"reachable"===o.result?"ok":"valid"!==r&&"reachable"!==o.result?"unhealthy":"degraded";let n={status:t,copilot_token:r,upstream:o.result,version:"0.47.0",timestamp:(new Date).toISOString()};void 0!==o.latencyMs&&(n.upstream_latency_ms=o.latencyMs);let i="ok"===t?200:503;return e.json(n,i)});var rl=class extends Error{upstream;constructor(e){super("Copilot rejected the token for a streamed image upload"),this.upstream=e,this.name="ImagesRetryLaterError"}};const ol=e=>"object"==typeof e&&"chunks"in e,nl=async()=>{let e=(e=>{let t=e&&/(?:^|;)exp=(\d+)/.exec(e)?.[1];return t?1e3*Number(t):void 0})(he._t1);void 0!==e&&e-Date.now()<3e5&&await Zr()},il=async(e,t,r)=>{let{status:o}=e.response;if(401===o&&!t.refreshed){if(t.refreshed=!0,!await Zr(e))throw e;if(!t.replayable)throw new rl(e);return}if(429!==o||!t.replayable)throw e;let n=(e=>{let t=Number(e.headers.get("retry-after-ms"));if(Number.isFinite(t)&&t>0)return t;let r=e.headers.get("retry-after")??"",o=Number(r);if(r&&Number.isFinite(o)&&o>0)return 1e3*o;let n=Date.parse(r)-Date.now();return Number.isFinite(n)&&n>0?n:1e3})(e.response)+250*Math.random();if(t.attempts>=3||Date.now()-t.start+n>Math.min(1e4,he.timeoutMs))throw e;t.attempts++,await((e,t)=>new Promise((r,o)=>{if(t?.aborted)return void o(t.reason);let n=()=>{clearTimeout(i),o(t?.reason)},i=setTimeout(()=>{t?.removeEventListener("abort",n),r()},e);t?.addEventListener("abort",n,{once:!0})}))(n,r)},al=async(e,t,r)=>{if(!mo(he))throw Error("Service token not found");let o=`${uo(he)}/v1/images/${e.operation}`,n=new AbortController,i=ll(n,t),{body:a,length:s}=cl(e.body,n.signal,i),l=e.model?void 0:e.lateModel,c=sl(e.contentType,s),{release:u}=i,d=!1;try{let s=await vt({spanName:`copilot POST /v1/images/${e.operation}`,url:o,target:"images",method:"POST",headers:c,body:a,signal:n.signal,headersTimeout:he.timeoutMs,bodyTimeout:he.timeoutMs,extraAttributes:{...e.model&&{"copilot_api.model":e.model},"copilot_api.upstream.provider":he.provider}}),{span:p}=s;s.body instanceof ReadableStream||i.attachBody(s.body);try{let o=pl(s);if(!o.ok){let t=await o.text();throw new mr(`Failed to create image ${e.operation}`,new Response(t,{status:o.status,statusText:o.statusText,headers:o.headers}),{outgoingHeaders:c})}let n=o.headers.get("content-type")??"application/json",{stream:a,fail:m}=hl(o.body,(e,r,o)=>{void 0!==e&&(!o&&!t?.aborted)&&ht(p,e);let n=l?.();n&&p.setAttribute("copilot_api.model",n),void 0!==r&&p.setAttribute("copilot_api.images.total_nano_aiu",r),p.end(),u()},r);return i.onAbort(m),d=!0,{contentType:n,body:a}}catch(e){throw ht(p,e),e}finally{if(!d){let e=l?.();e&&p.setAttribute("copilot_api.model",e),p.end()}}}finally{d||u()}},sl=(e,t)=>({...po(he),"Content-Type":e,...void 0!==t&&{"Content-Length":String(t)},"accept-encoding":"identity"}),ll=(e,t)=>{let r,o,n=1,i=t=>{o?.(t),r?.on("error",()=>{}),r?.destroy(t),e.abort(t)},a=setTimeout(()=>i(new fr(he.timeoutMs)),he.timeoutMs),s=()=>i(t?.reason);return t?.aborted?s():t?.addEventListener("abort",s,{once:!0}),{hold:()=>{n++},release:()=>{--n>0||(clearTimeout(a),t?.removeEventListener("abort",s))},attachBody:e=>{r=e},onAbort:e=>{o=e}}},cl=(e,t,r)=>{if("string"==typeof e)return{body:e,length:q.byteLength(e)};if(ol(e)){e.progress?.();let o=W.from(async function*({chunks:e,rest:t,progress:r}){if(null===t)yield*e;else{for(let t=0;t<e.length;t++){let o=e[t];e[t]=ul,yield o,r?.()}e.length=0,yield*t}}(e),{objectMode:!1}),{rest:n}=e;r.hold();let i=!1,a=()=>{i||(i=!0,t.removeEventListener("abort",a),r.release(),n?.[Symbol.asyncIterator]().return?.(t.aborted?t.reason:void 0).catch(()=>{}))};return o.once("close",a),t.aborted?a():t.addEventListener("abort",a,{once:!0}),{body:o,length:e.length}}return{body:q.from(e.buffer,e.byteOffset,e.byteLength),length:e.byteLength}};const ul=new Uint8Array,dl=new Set([101,204,205,304]),pl=({statusCode:e,headers:t,body:r})=>{let o={status:e,headers:t};return dl.has(e)?(ns(r),new Response(null,o)):rs(r,o)},ml=async(e,t)=>{let r;try{await Promise.race([e?.cancel(t).catch(()=>{}),new Promise(e=>{r=setTimeout(e,5e3)})])}finally{clearTimeout(r)}},fl=65536,hl=(e,t,r)=>{let o,n=e?.getReader(),i=new _l,a=!1,s=!1,l=(e,o=!1)=>{if(a)return;if(a=!0,void 0!==e)return t(e,void 0,o),void r?.({error:e,cancelled:o});let n=i.read();t(void 0,n.totalNanoAiu),r?.(n)};return{stream:new ReadableStream({start(e){o=e},async pull(e){let t;try{t=await(n?.read())}catch(t){let r=t??new gl;return e.error(r),void(s||l(r))}!t||t.done?(e.close(),l()):(i.push(t.value),e.enqueue(t.value))},async cancel(e){let t=e instanceof yl,r=t?e.cause??e:e;try{await ml(n,e)}finally{l(r instanceof Error?r:new DOMException("The client cancelled the image response.","AbortError"),!t)}}}),fail:e=>{if(a||s)return;s=!0;let t=e instanceof Error?e:Error(String(e));o.error(t),ml(n,t).then(()=>l(t))}}};var gl=class extends Error{name="ImagesBodyFailedError";constructor(){super("The upstream image response failed before its end.")}},yl=class extends Error{name="ImagesRouteCancel"},_l=class{head=new Uint8Array(fl);headLength=0;ring=new Uint8Array(fl);ringEnd=0;total=0;push(e){if(this.total+=e.byteLength,this.headLength<fl){let t=Math.min(e.byteLength,fl-this.headLength);this.head.set(e.subarray(0,t),this.headLength),this.headLength+=t}let t=e.byteLength>fl?e.subarray(e.byteLength-fl):e,r=Math.min(t.byteLength,fl-this.ringEnd);this.ring.set(t.subarray(0,r),this.ringEnd),this.ring.set(t.subarray(r),0),this.ringEnd=(this.ringEnd+t.byteLength)%fl}tail(){if(this.total<fl)return this.ring.subarray(0,this.total);let e=new Uint8Array(fl);return e.set(this.ring.subarray(this.ringEnd)),e.set(this.ring.subarray(0,this.ringEnd),fl-this.ringEnd),e}read(){let e,t=this.tail(),r=this.head.subarray(0,this.headLength);if(this.total<=fl)e=[[wl(t),"end"]];else if(this.total<=2*fl){let o=new Uint8Array(this.total);o.set(r),o.set(t.subarray(2*fl-this.total),fl),e=[[wl(o),"end"]]}else e=[[wl(t),"end"],[wl(r),"start"]];let o=t=>{for(let[r,o]of e){let e=vl(r,t,o);if(e)return e}},n=o("copilot_usage")?.total_nano_aiu;return{usage:o("usage"),totalNanoAiu:"number"==typeof n?n:void 0}}};const wl=e=>(new TextDecoder).decode(e),bl=(e,[t,r],o)=>{let n=0,i=!1;for(let a=t;a<r;a++){let t=e[a];if(i)"\\"===t?a++:'"'===t&&(i=!1);else switch(t){case'"':i=!0;break;case"{":case"[":n+=o;break;case"}":case"]":n-=o}}return n};function vl(e,t,r){let o=new RegExp(String.raw`[{,]\s*"${t}"\s*:\s*\{`,"g"),n=-1;for(let t of e.matchAll(o))1===("end"===r?bl(e,[t.index+1,e.length],-1):bl(e,[0,t.index+1],1))&&(n=t.index+t[0].length-1);if(n<0)return;let i=0,a=!1;for(let t=n;t<e.length;t++){let r=e[t];if(a)"\\"===r?t++:'"'===r&&(a=!1);else if('"'===r)a=!0;else if("{"===r)i++;else if("}"===r&&0===--i)try{let r=JSON.parse(e.slice(n,t+1));return"object"==typeof r&&r?r:void 0}catch{return}}}const kl=e=>e.header("Connection","close"),xl=e=>{let t=(e=>{let t=Number(e.req.header("content-length"));return{limit:ba(e.req.path),declaredLength:Number.isSafeInteger(t)&&t>=0?t:void 0}})(e);(void 0!==t.declaredLength&&!((e,t)=>e<=t.limit&&(void 0===t.declaredLength||t.declaredLength<=t.limit&&e<=t.declaredLength))(0,t)||!wa(e.req.raw,t.limit,t.declaredLength))&&kl(e)},Tl=(e,t)=>{f.getActiveSpan()?.setAttribute("copilot_api.error_type","images_capacity");let r=ra().gate.retryAfterSeconds();return e.header("Retry-After",String(r)),e.header("retry-after-ms",String(1e3*r)),e.header("x-should-retry","true"),e.json({error:{message:t,type:"server_error",code:"images_capacity"}},503)},Al={queue_full:"Too many image requests are waiting. Retry later.",queue_timeout:"The image request waited too long for capacity. Retry later.",memory_pressure:"The server is low on memory for image requests. Retry later.",grow_denied:"The image request body is larger than the free image capacity. Retry later."},Sl=e=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","images_capacity"),e.json({error:{message:"The image request needs more memory than this server allows for image requests. Send a smaller body.",type:"invalid_request_error",code:"request_too_large"}},413)),$l=e=>(kl(e),f.getActiveSpan()?.setAttribute("copilot_api.error_type","request_timeout"),e.json({error:{message:"The request body stopped arriving.",type:"invalid_request_error",code:"request_timeout"}},408));var El=class extends Error{constructor(){super("The request body stopped arriving."),this.name="BodyIdleTimeoutError"}};const Ol=async(e,t)=>{let r;try{await Promise.race([e.cancel(t).catch(()=>{}),new Promise(e=>{r=setTimeout(e,1e3)})])}finally{clearTimeout(r)}},Cl=async(e,t)=>{let r,o;try{return await Promise.race([e.read(),new Promise((e,t)=>{r=setTimeout(()=>t(new El),(()=>{let e=Number(process.env.COPILOT_API_IMAGES_BODY_IDLE_TIMEOUT_MS);return Number.isFinite(e)&&e>0?e:3e4})())}),new Promise((e,r)=>{o=()=>r(new DOMException("The client closed the request.","AbortError")),t.aborted?o():t.addEventListener("abort",o,{once:!0})})])}finally{clearTimeout(r),o&&t.removeEventListener("abort",o)}},Il=1048576,Rl=(e,t)=>{let r=(e=>Math.min(Math.max(e??Ji,0),Gi))(t);return t=>{if(t<=r)return"ok";let o=Math.ceil(t/Il)*Il,n=e.grow(Math.ceil(1*(o-r)));return"ok"===n&&(r=o),n}},ql=e=>{let t=0;return async()=>{let r=await(e=>ra().pacer.take(e))(e);t+=r,t>0&&f.getActiveSpan()?.setAttribute("copilot_api.images.start_wait_ms",t)}},Pl=async(e,t,r)=>{try{return await async function(e,t){let{gate:r}=ra(),o=r.stats(),n=Me.startSpan("copilot_api.images.admission",{kind:u.INTERNAL,attributes:{"copilot_api.images.admission.weight_bytes":e,"copilot_api.images.admission.budget_bytes":o.budgetBytes,"copilot_api.images.admission.in_use_bytes":o.inUseBytes,"copilot_api.images.admission.in_flight":o.inFlight,"copilot_api.images.admission.queue_depth":o.queueDepth}}),i=performance.now();try{let o=await r.acquire(e,t);return n.setAttribute("copilot_api.images.admission.result","admitted"),o}catch(e){let t=e instanceof Wi?e.reason:"error";throw n.setAttribute("copilot_api.images.admission.result",t),"aborted"!==t&&n.setStatus({code:d.ERROR,message:t}),e}finally{n.setAttribute("copilot_api.images.admission.wait_ms",Math.round(performance.now()-i)),n.end()}}(((e,t)=>{let r=(e.req.header("content-type")??"").split(";")[0].trim().toLowerCase();if("edits"===t&&"multipart/form-data"===r)return 11534336;let o=Number(e.req.header("content-length"));return Ki(Number.isSafeInteger(o)&&o>=0?o:void 0)})(e,t),r)}catch(t){if(t instanceof Wi&&"aborted"!==t.reason)return xl(e),"too_large"===t.reason?Sl(e):Tl(e,Al[t.reason]);throw t}},Nl=(e,t)=>{if(e.length<256)return void e.push(t);let r=e.at(-1),o=r&&jl.get(r);if(t.byteLength>=16384)return o&&Ml(e,r,o),void e.push(t);if(o&&r.byteLength+t.byteLength<=o.byteLength){o.set(t,r.byteLength);let n=o.subarray(0,r.byteLength+t.byteLength);return jl.set(n,o),void(e[e.length-1]=n)}o&&Ml(e,r,o);let n=new Uint8Array(65536);n.set(t);let i=n.subarray(0,t.byteLength);jl.set(i,n),e.push(i)},Ml=(e,t,r)=>{jl.delete(t),r.byteLength-t.byteLength>=16384&&(e[e.length-1]=t.slice())},jl=new WeakMap;var Dl=class extends Error{constructor(e){super(e),this.name="JsonSyntaxError"}},Ll=class extends Error{constructor(){super('Request body has more than one top-level "model" field.'),this.name="DuplicateModelError"}};const Bl=0,Fl=1,Ul=2,Hl=3,zl=4,Jl=5,Gl=6,Kl=7,Wl=8,Yl=9,Vl=10,Xl=11,Zl=12,Ql=13,ec=14,tc=15,rc=16,oc=17,nc=18,ic=19,ac=20,sc=21,lc=[239,187,191],cc=[34,109,111,100,101,108,34],uc=e=>32===e||10===e||13===e||9===e,dc=e=>e>=48&&e<=57,pc={[Ql]:[ec,tc,-2,-2,-2,-2],[ec]:[-1,-1,rc,nc,-1,-1],[tc]:[tc,tc,rc,nc,-1,-1],[rc]:[oc,oc,-2,-2,-2,-2],[oc]:[oc,oc,-1,nc,-1,-1],[nc]:[ac,ac,-2,-2,ic,-2],[ic]:[ac,ac,-2,-2,-2,-2],[ac]:[ac,ac,-1,-1,-1,-1]};var mc=class{bits=new Uint8Array(64);length=0;push(e){let t=this.length>>3;if(t===this.bits.length){let e=new Uint8Array(2*this.bits.length);e.set(this.bits),this.bits=e}let r=1<<(7&this.length);e?this.bits[t]|=r:this.bits[t]&=~r,this.length++}pop(){this.length>0&&this.length--}top(){if(0===this.length)return!1;let e=this.length-1;return!!(this.bits[e>>3]&1<<(7&e))}},fc=class{state=Bl;stack=new mc;offset=0;hexLeft=0;utf8Left=0;utf8Min=128;utf8Max=191;literal=[];literalIndex=0;bomIndex=0;stringRole="none";capture=[];captureOverflow=!1;stringStart=0;stringIsKey=!1;expectModelValue=!1;otherModelDepth;modelSeen=!1;topLevelObject=!1;model;get isObject(){return this.topLevelObject}get bytes(){return this.offset}push(e){let t=e.length,r=0;for(;r<t;){if(this.state===Wl&&"none"===this.stringRole){let o=r,n=e[r];for(;n>=32&&n<128&&34!==n&&92!==n&&++r!==t;)n=e[r];if(this.offset+=r-o,r===t)return}this.step(e[r]),this.offset++,r++}}end(){0===this.stack.length&&(this.state===ec||this.state===tc||this.state===oc||this.state===ac)&&(this.state=Kl),this.state!==Kl&&this.fail("Unexpected end of JSON input")}fail(e){throw new Dl(`${e} at byte ${this.offset}`)}step(e){switch(this.state){case Bl:return e===lc[0]&&0===this.offset?(this.state=sc,void(this.bomIndex=1)):(this.state=Fl,void this.step(e));case sc:return e!==lc[this.bomIndex]&&this.fail("Unexpected token"),void(++this.bomIndex===lc.length&&(this.state=Fl));case Fl:case Ul:if(uc(e))return;return 93===e&&this.state===Ul?void this.closeContainer():void this.startValue(e);case Hl:case zl:if(uc(e))return;return 125===e&&this.state===Hl?void this.closeContainer():(34!==e&&this.fail("Expected a property name"),void this.beginString(1===this.stack.length?"key":"none",!0));case Jl:if(uc(e))return;return 58!==e&&this.fail("Expected ':'"),void(this.state=Fl);case Gl:{if(uc(e))return;let t=this.stack.top();return 44===e?void(this.state=t?zl:Fl):e===(t?125:93)?void this.closeContainer():void this.fail("Expected ',' or a close")}case Kl:return void(uc(e)||this.fail("Unexpected non-whitespace after JSON"));case Wl:return void this.stringByte(e);case Yl:return this.record(e),117===e?(this.state=Vl,void(this.hexLeft=4)):(34!==e&&92!==e&&47!==e&&98!==e&&102!==e&&110!==e&&114!==e&&116!==e&&this.fail("Bad escape in string"),void(this.state=Wl));case Vl:return(e=>dc(e)||e>=97&&e<=102||e>=65&&e<=70)(e)||this.fail("Bad Unicode escape"),this.record(e),void(0===--this.hexLeft&&(this.state=Wl));case Xl:return(e<this.utf8Min||e>this.utf8Max)&&this.fail("Invalid UTF-8"),this.record(e),this.utf8Min=128,this.utf8Max=191,void(0===--this.utf8Left&&(this.state=Wl));case Zl:return e!==this.literal[this.literalIndex]&&this.fail("Unexpected token"),void(++this.literalIndex===this.literal.length&&this.endScalar());default:this.numberByte(e)}}startValue(e){let t=this.stack.length,r=this.expectModelValue;switch(this.expectModelValue=!1,0===t&&(this.topLevelObject=123===e),r&&34!==e&&(this.otherModelDepth=t),e){case 123:return this.stack.push(!0),void(this.state=Hl);case 91:return this.stack.push(!1),void(this.state=Ul);case 34:return void this.beginString(r?"model":"none");case 116:return void this.beginLiteral([116,114,117,101]);case 102:return void this.beginLiteral([102,97,108,115,101]);case 110:return void this.beginLiteral([110,117,108,108]);case 45:return void(this.state=Ql);default:48===e?this.state=ec:dc(e)?this.state=tc:this.fail("Unexpected token")}}beginLiteral(e){this.literal=e,this.literalIndex=1,this.state=Zl}beginString(e,t=!1){this.state=Wl,this.stringIsKey=t,this.stringRole=e,this.stringStart=this.offset,this.capture="none"===e?[]:[34],this.captureOverflow=!1}record(e){if("none"===this.stringRole||this.captureOverflow)return;let t="key"===this.stringRole?64:4096;this.capture.length>=t?(this.captureOverflow=!0,this.capture=[]):this.capture.push(e)}stringByte(e){34===e?(this.record(e),this.endString()):92===e?(this.record(e),this.state=Yl):(e<32&&this.fail("Bad control character in string"),this.record(e),e<128||(e>=194&&e<=223?this.utf8Left=1:e>=224&&e<=239?(this.utf8Left=2,224===e&&(this.utf8Min=160),237===e&&(this.utf8Max=159)):e>=240&&e<=244?(this.utf8Left=3,240===e&&(this.utf8Min=144),244===e&&(this.utf8Max=143)):this.fail("Invalid UTF-8"),this.state=Xl))}endString(){let e=this.stringRole;if(this.stringRole="none",this.stringIsKey){if(this.state=Jl,"key"!==e)return;if(!this.captureOverflow&&this.isModelKey(this.capture)){if(this.modelSeen)throw new Ll;this.modelSeen=!0,this.expectModelValue=!0}this.capture=[]}else{if("model"===e){if(this.captureOverflow)this.model={kind:"too-long"};else{let e=Buffer.from(this.capture).toString("utf8");this.model={kind:"string",value:JSON.parse(e),start:this.stringStart,end:this.offset+1}}this.capture=[]}this.endScalar()}}isModelKey(e){return!(e.length!==cc.length||!e.every((e,t)=>e===cc[t]))||!!e.includes(92)&&"model"===JSON.parse(Buffer.from(e).toString("utf8"))}endScalar(){this.otherModelDepth===this.stack.length&&(this.otherModelDepth=void 0,this.model={kind:"other"}),this.state=0===this.stack.length?Kl:Gl}closeContainer(){this.stack.pop(),this.endScalar()}numberByte(e){let t=pc[this.state]?.[(e=>48===e?0:dc(e)?1:46===e?2:101===e||69===e?3:43===e||45===e?4:5)(e)]??-2;-2===t?this.fail("Bad number"):-1===t?this.endNumber(e):this.state=t}endNumber(e){this.endScalar(),this.step(e)}};var hc=class extends Error{kind;constructor(e){super(`JSON request body rejected: ${e}`),this.kind=e,this.name="JsonBodyError"}},gc=class extends Error{constructor(){super("The JSON request body upload stopped before its end."),this.name="UploadCancelledError"}};const yc=async(e,t)=>{let r,o=new fc,n=e?.getReader(),i=[],a=0,s=()=>r,l=(()=>{let e,t,r=new Promise((r,o)=>{e=r,t=o});return r.catch(()=>{}),{promise:r,resolve:e,reject:t}})(),c={reading:!1,stop:!1},{claim:u,discard:d}=_c(n,t,()=>({read:a,deadline:c.deadline})),p=()=>(l.reject(new gc),i.length=0,u(),xc(c,n,d),Promise.resolve()),m=e=>{a+=e.byteLength},f=e=>{if(m(e),a>t.limit)throw r=new hc("too-large");if(void 0!==t.declaredLength&&a>t.declaredLength)throw r=new hc("length-mismatch");try{vc(o,e)}catch(e){throw r=e,e}},h=()=>{if(void 0!==t.declaredLength&&a!==t.declaredLength)throw r=new hc("length-mismatch");try{o.end()}catch{throw r=new hc("invalid-json")}if(!o.isObject)throw r=new hc("not-object")},g=e=>({model:o.model,head:i,headLength:a,declaredLength:t.declaredLength,rest:e?.rest??null,cancel:p,failure:s,complete:e?l.promise:Promise.resolve(),idleMs:e?.idleMs??(()=>0),progress:e?.progress??(()=>{})});try{for(;;){let e=n?await n.read():{done:!0};if(e.done)return h(),g(void 0);f(e.value);let s=bc(t,a);if(s)throw r=s;if(Nl(i,e.value),void 0!==o.model&&a!==t.declaredLength&&n)return g(Ac(kc(n,{take:f,count:m,finish:h,settled:l,discard:d,control:c}),l))}}catch(e){throw l.reject(e),d(),e}},_c=(e,t,r)=>{let o,n=!1,i=()=>{!n&&e&&(n=!0,o=ga(),!o&&t.drains&&(t.drains.refused=!0))};return{claim:i,discard:()=>{i();let n=o;return o=void 0,n&&e&&n.start(wc(e,{...r(),limit:t.limit,declared:t.declaredLength})),Promise.resolve()}}},wc=(e,t)=>()=>da(e,t),bc=(e,t)=>{let r=e.reserve?.(t)??"ok";return"busy"===r?new hc("no-capacity"):"too_large"===r?new hc("over-budget"):void 0},vc=(e,t)=>{try{e.push(t)}catch(e){throw new hc(e instanceof Ll?"duplicate-model":"invalid-json")}};async function*kc(e,t){let r,{take:o,count:n,finish:i,settled:a,discard:s,control:l}=t,c=!1;try{for(;;){let t=await Tc(e,l);if(l.stop)throw t.done||n(t.value),new gc;if(t.done)break;0!==t.value.byteLength&&(o(t.value),r&&(yield r),r=t.value)}i(),c=!0,r&&(yield r),a.resolve()}catch(e){throw a.reject(e),e}finally{c||(a.reject(new gc),s())}}const xc=(e,t,r)=>{e.stop=!0,e.reading?(e.deadline??=performance.now()+la,e.watchdog??=setTimeout(()=>{t?.cancel().catch(()=>{})},Math.min(sa,la))):r()},Tc=(e,t)=>t.stop?Promise.reject(new gc):(t.reading=!0,e.read().finally(()=>{t.reading=!1,clearTimeout(t.watchdog)})),Ac=(e,t)=>{let r,o={next:async()=>{r=void 0;try{return await e.next()}finally{r=Date.now()}},return:async r=>(t.reject(r instanceof Error?r:new gc),e.return(r)),throw:t=>e.throw(t)};return{rest:{[Symbol.asyncIterator]:()=>o},progress:()=>{r=Date.now()},idleMs:()=>void 0===r?0:Date.now()-r}},Sc=(e,{start:t,end:r},o)=>{let n=[],i=0,a=!1;for(let s of e){let e=i,l=i+s.byteLength;i=l,l<=t||e>=r?(!a&&e>=r&&(n.push(o),a=!0),n.push(s)):(e<t&&n.push(s.subarray(0,t-e)),a||=(n.push(o),!0),l>r&&n.push(s.subarray(r-e)))}return a||n.push(o),n.filter(e=>e.byteLength>0)},$c=(e,t)=>{switch("length-mismatch"===t&&(e=>{e.header("Connection","close")})(e),t){case"too-large":return Ws(e,ba(e.req.path));case"no-capacity":return Tl(e,Al.grow_denied);case"over-budget":return Sl(e);case"not-object":return Ks(e,"Request body must be a JSON object.");case"duplicate-model":return Ks(e,'Request body must have exactly one top-level "model" field.');case"length-mismatch":return Ks(e,"The request body length does not match its Content-Length.");default:return Ks(e,"Request body must be valid JSON.")}},Ec=async(e,t,{stream:r=e.req.raw.body,drains:o,reserve:n}={})=>{let i,a=(e=>{let t=e.req.header("content-length");if(void 0===t||""===t.trim())return;let r=Number(t);return Number.isSafeInteger(r)&&r>=0?r:void 0})(e);try{i=await yc(r,{limit:ba(e.req.path),declaredLength:a,drains:o,reserve:n})}catch(t){if(t instanceof hc)return $c(e,t.kind);throw t}let s=i.model,l="too-long"===s?.kind?Ys(e,"","Model name is too long."):Ys(e,"string"===s?.kind?s.value:void 0);if(l instanceof Response)return await i.cancel(),l;let{chunks:c,length:u}=((e,t,{model:r,declared:o})=>{let n=o??(e.rest?void 0:e.headLength);if(!t||t.value===r)return{chunks:e.head,length:n};let i=(new TextEncoder).encode(JSON.stringify(r));return{chunks:Sc(e.head,t,i),length:void 0===n?void 0:n+i.byteLength-(t.end-t.start)}})(i,"string"===s?.kind?s:void 0,{model:l,declared:a});return{operation:t,model:l,body:null===i.rest&&1===c.length?c[0]:{chunks:c,rest:i.rest,length:u,progress:i.progress},contentType:"application/json",bodyFailure:e=>{let t=i.failure()?.kind;return t?$c(e,t):void 0},cancelBody:i.cancel,...i.rest&&{uploadComplete:i.complete,uploadIdleMs:i.idleMs}}};var Oc=class extends Error{status;constructor(e,t){super(e),this.status=t,this.name="MultipartScanError"}},Cc=class{field;fileBeforeField=!1;total=0;delimiter;maxHeaderBytes;maxFieldBytes;maxLineBytes;state="preamble";carry=q.from("\r\n","latin1");carryStart=-2;headers="";inField=!1;valueStart=0;value=[];valueLength=0;name;limits;constructor(e,t,r){this.name=t,this.limits=r,this.delimiter=q.from(`\r\n--${e}`,"latin1"),this.maxHeaderBytes=r.maxHeaderBytes??16384,this.maxFieldBytes=r.maxFieldBytes??256,this.maxLineBytes=r.maxLineBytes??1024}get complete(){return"end"===this.state}push(e){let t=this.total;if(this.total+=e.byteLength,this.total>this.limits.maxBytes)throw new Oc(`Request body exceeds the ${this.limits.maxBytes/1024/1024} MB limit.`,413);if("end"===this.state)return;let r=q.from(e.buffer,e.byteOffset,e.byteLength),o=this.carry.byteLength>0?q.concat([this.carry,r]):r,n=this.carry.byteLength>0?this.carryStart:t;this.carry=q.alloc(0),this.scan(o,n)}finish(){if("headers"!==this.state&&"end"!==this.state&&this.carry.byteLength>=this.delimiter.byteLength+2&&this.carry.subarray(0,this.delimiter.byteLength).equals(this.delimiter)&&/^--[ \t]*$/.test(this.carry.toString("latin1",this.delimiter.byteLength))&&("body"===this.state&&this.endPart(this.carryStart),this.state="end"),"end"!==this.state)throw new Oc("Malformed multipart/form-data body.",400)}keep(e,t,r){this.carry=q.from(e.subarray(t)),this.carryStart=r+t}scan(e,t){let r=0;for(;-1!==r&&r<e.byteLength;){if("end"===this.state)return;r="headers"===this.state?this.scanHeaders(e,r,t):this.scanBody(e,r,t)}}scanBody(e,t,r){let o=t;for(;;){let n=e.indexOf(this.delimiter,o);if(-1===n){let n=Rc(e,o,this.delimiter);return this.bodyBytes(e,t,e.byteLength-n),this.keep(e,e.byteLength-n,r),-1}let i=Ic(e,n+this.delimiter.byteLength,this.maxLineBytes);if("not-delimiter"!==i)return this.bodyBytes(e,t,n),"more"===i?(this.keep(e,n,r),-1):("body"===this.state&&this.endPart(r+n),"close"===i?(this.state="end",-1):(this.state="headers",this.headers="",i));o=n+1}}scanHeaders(e,t,r){let o=this.maxHeaderBytes+4-this.headers.length,n=this.headers+e.toString("latin1",t,Math.min(e.byteLength,t+o)),i=n.startsWith("\r\n")?0:n.indexOf("\r\n\r\n");if(-1===i){if(n.length-4>=this.maxHeaderBytes)throw new Oc("Multipart part headers are too large.",400);return this.headers=n,-1}let a=(0===i?2:i+4)-this.headers.length;return this.startPart(n.slice(0,i),r+t+a),t+a}startPart(e,t){this.headers="",this.state="body";let r=qc(e);if(r?.file&&r.name===this.name)throw new Oc(`The multipart "${this.name}" field must be a text field.`,400);if(this.inField=void 0!==r&&!r.file&&r.name===this.name,r?.file&&!this.field&&(this.fileBeforeField=!0),this.inField){if(this.field)throw new Oc(`The multipart body has more than one "${this.name}" field.`,400);this.valueStart=t,this.value=[],this.valueLength=0}}bodyBytes(e,t,r){if("body"===this.state&&this.inField&&!(r<=t)){if(this.valueLength+=r-t,this.valueLength>this.maxFieldBytes)throw new Oc(`The multipart "${this.name}" field is too long.`,400);this.value.push(q.from(e.subarray(t,r)))}}endPart(e){this.inField&&(this.inField=!1,this.field={value:q.concat(this.value).toString("utf8"),start:this.valueStart,end:e},this.value=[])}};const Ic=(e,t,r)=>{if(e.byteLength-t<2)return"more";let o=45===e[t]&&45===e[t+1],n=o?t+2:t;for(;n<e.byteLength&&(32===e[n]||9===e[n]);)n++;return n-t>r||n<e.byteLength&&13!==e[n]?"not-delimiter":n+1>=e.byteLength?"more":13!==e[n]||10!==e[n+1]?"not-delimiter":o?"close":n+2},Rc=(e,t,r)=>{let o=Math.min(r.byteLength-1,e.byteLength-t);for(let t=o;t>0;t--)if(0===e.compare(r,0,t,e.byteLength-t,e.byteLength))return t;return 0},qc=e=>{for(let t of e.split("\r\n")){let e=t.indexOf(":");if("content-disposition"!==t.slice(0,e).trim().toLowerCase())continue;let r=t.slice(e+1),o=Pc(r);return{name:"form-data"===r.split(";")[0].trim().toLowerCase()?o.get("name"):void 0,file:o.has("filename")||o.has("filename*")}}},Pc=e=>{let t=new Map,r=e.indexOf(";");for(;-1!==r;){let o=e.indexOf("=",r+1);if(-1===o)break;let n=e.lastIndexOf(";",o);if(n>r){r=n;continue}let i=e.slice(r+1,o).trim().toLowerCase(),a=o+1;for(;" "===e[a]||"\t"===e[a];)a++;let s="";if('"'===e[a]){for(a++;a<e.length&&'"'!==e[a];a++)"\\"===e[a]&&a++,s+=e[a]??"";r=e.indexOf(";",a+1)}else r=e.indexOf(";",a),s=e.slice(a,-1===r?void 0:r).trim();t.has(i)||t.set(i,s)}return t},Nc=async(e,t)=>{let r;try{r=await e.read()}catch(e){return void t.error(e??new gl)}r.done?t.close():t.enqueue(r.value)},Mc=new Uint8Array;var jc=class extends Error{constructor(){super("The early answer did not fit in the spool."),this.name="SpoolOverflowError"}};const Dc=new B,Lc=(e,t,r)=>{if(t instanceof El)return $l(e);if(t instanceof Fc){let r=Ys(e,t.value);return r instanceof Response?r:Ks(e,t.message)}return 413===t.status?Ws(e,r):Ks(e,t.message)};var Bc=class extends Error{constructor(){super("The upload did not reach the upstream in full."),this.name="UploadStoppedError"}},Fc=class extends Error{value;constructor(e){super("The multipart model field is missing or not valid."),this.name="ModelPartError",this.value=e}};const Uc=e=>{try{return $a(e)}catch(t){throw t instanceof Sa?new Fc(e):t}},Hc=async(e,t,r)=>{let o=(e=>{let t=Pc(e).get("boundary");return t&&t.length<=70?t:void 0})(t),n=e.req.raw.body;if(!o||!n)return Ks(e,"Malformed multipart/form-data body.");let i=ba(e.req.path),a=new Cc(o,"model",{maxBytes:i}),s=Number(e.req.header("content-length")),l=Number.isSafeInteger(s)&&s>0,c=l?s:void 0,{reader:u,drain:d}=tu(n.getReader(),{limit:i,declared:c},r),p=[],m=Lt(e),f=await Jc({reader:u,drain:d,scanner:a,held:p,declared:c,signal:m});if("boolean"!=typeof f)return Lc(e,f,i);let{field:h}=a;if(!f&&!h){let e={};return{...zc({contentType:t,drain:d,body:{chunks:p,length:void 0},rest:t=>Gc({reader:u,drain:d,scanner:a,declared:c,signal:m,onError:t,onModel:t=>{e.model=t}}),model:""}),found:e,lateModel:()=>e.model}}let g=Ys(e,h?.value??null);if(g instanceof Response)return f||d(),g;let y=p,_=0;return h&&h.value!==g&&(y=Kc(p,0,{...h,value:g}),_=q.byteLength(g)-(h.end-h.start)),f?(u.releaseLock(),{operation:"edits",model:g,contentType:t,body:{chunks:y,rest:null,length:p.reduce((e,t)=>e+t.byteLength,0)+_}}):zc({contentType:t,drain:d,body:{chunks:y,length:l?s+_:void 0},rest:e=>Gc({reader:u,drain:d,scanner:a,declared:c,signal:m,onError:e}),model:g})},zc=({contentType:e,drain:t,body:r,rest:o,model:n})=>{let i,a,s=new Promise((e,t)=>{a={resolve:e,reject:t}});s.catch(()=>{});let l,c=o(e=>i=e)[Symbol.asyncIterator](),u=!1,d={[Symbol.asyncIterator]:()=>d,next:async()=>{u=!0;try{let e=await c.next();return u=!1,l=Date.now(),e.done&&a.resolve(),e}catch(e){throw u=!1,a.reject(e),e}},return:async e=>((e=>{a.reject(e instanceof Error?e:new Bc)})(e),await(c.return?.()),{done:!0,value:void 0})};return{operation:"edits",model:n,contentType:e,body:{chunks:r.chunks,length:r.length,rest:d,progress:()=>{l=Date.now()}},bodyFailure:e=>i&&Lc(e,i,ba(e.req.path)),cancelBody:()=>(t(),Promise.resolve()),uploadComplete:s,uploadIdleMs:()=>u||void 0===l?0:Date.now()-l}},Jc=async({reader:e,drain:t,scanner:r,held:o,declared:n,signal:i})=>{try{for(;;){let{done:t,value:a}=await Cl(e,i);if(t)return r.finish(),void 0===n||r.total===n||new Oc("The request body length does not match its Content-Length.",400);let s=r.complete;if(r.push(a),!s&&(o.push(a),!r.complete&&(r.field||!r.inField&&(r.fileBeforeField||r.total>1048576))))return!1}}catch(r){if(r instanceof El)return await Ol(e),r;if(t(),r instanceof Oc)return r;throw r}};async function*Gc({reader:e,drain:t,scanner:r,declared:o,signal:n,onError:i,onModel:a}){let s=!1,l=[],c=0,u=void 0!==a;try{for(;;){let{done:t,value:i}=await Cl(e,n);if(t){if(r.finish(),void 0!==o&&r.total!==o)throw new Oc("The request body length does not match its Content-Length.",400);if(u)throw new Fc(null);return void(s=!0)}let d=r.total;if(r.push(i),!u){yield i;continue}if(0===l.length&&(c=d),!r.field){r.inField?l.push(i):yield i;continue}l.push(i);let{field:p}=r,m=Uc(p.value);a?.(m);let f=m===p.value?l:Kc(l,c,{...p,value:m});l=[],u=!1,yield*f}}catch(e){throw(e=>e instanceof Oc||e instanceof Fc||e instanceof El)(e)&&i(e),e}finally{s||t()}}const Kc=(e,t,{start:r,end:o,value:n})=>{if(r<t)throw new Oc("Malformed multipart/form-data body.",400);let i=q.from(n,"utf8"),a=[],s=t,l=!1;for(let t of e){let e=s;s+=t.byteLength,s<=r||e>=o?(e>=o&&!l&&(a.push(i),l=!0),a.push(t)):(e<r&&a.push(t.subarray(0,r-e)),l||=(a.push(i),!0),s>o&&a.push(t.subarray(o-e)))}return l||a.push(i),a},Wc=3e4,Yc=1e3,Vc=e=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:"The upstream sent a large answer before it read the whole request body.",type:"api_error",code:"early_answer_too_large"}},502)),Xc=e=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upload_stalled"),e.json({error:{message:"The upstream stopped reading the request body after it answered.",type:"timeout_error",code:"upload_stalled"}},504)),Zc=async(e,t,r)=>{if(!t.uploadComplete)return{body:r};let o=((e,t)=>{let r=e.getReader(),o={queue:[],next:0,size:0,done:!1,active:!0,dropped:!1},n=e=>{e.done||!e.value?o.done=!0:o.size+e.value.byteLength>t?o.dropped=!0:(Nl(o.queue,e.value),o.size+=e.value.byteLength)},i={},a=new Promise((e,t)=>{i.reject=t});a.catch(()=>{});let s=e=>{o.failure??=e??new gl,o.done=!0,i.reject?.(o.failure)},l=()=>{o.inflight=void 0};return r.closed.catch(e=>s(e)),o.inflight=(async()=>{for(;o.active&&!o.done&&!o.dropped&&o.size<t;)try{n(await r.read())}catch(e){s(e)}})(),{release:()=>(o.active=!1,new ReadableStream({async pull(e){for(;;){if(void 0!==o.failure||o.dropped)return void e.error(o.failure??new jc);if(o.next<o.queue.length){let t=o.queue[o.next];return o.queue[o.next++]=Mc,void e.enqueue(t)}if(o.done)return void e.close();let{inflight:t}=o;if(!t)break;await t,l()}await Nc(r,e)},cancel:e=>r.cancel(e)})),cancel:async e=>{o.active=!1,await r.cancel(e).catch(()=>{})},full:()=>o.dropped||!o.done&&o.size>=t,dropped:()=>o.dropped,failure:a}})(r,Qc);try{let n=await(async(e,t)=>{let r=Promise.race([e.uploadComplete?.then(()=>!0),t.failure]);for(;;){let o,n=new Promise(e=>{o=setTimeout(()=>e(!1),Yc)});try{if(await Promise.race([r,n]))return!t.dropped()||"blocked"}finally{clearTimeout(o)}if(t.full())return"blocked";if((e.uploadIdleMs?.()??0)>=Wc)return"stalled"}})(t,o);if(!0!==n)return await o.cancel(new yl(`upload ${n}`)),await(t.cancelBody?.()),ru(e,t),{failed:"stalled"===n?Xc(e):Vc(e),body:r}}catch(n){return await o.cancel(new yl("The upload failed.",{cause:n})),await(t.cancelBody?.()),ru(e,t),{failed:t.bodyFailure?.(e)??(n instanceof Bc||n instanceof gc?Ks(e,"The request body did not reach the upstream in full."):await jr(e,n)),body:r}}return ru(e,t),{body:o.release()}},Qc=zi;var eu=class extends Error{constructor(){super("The client body is being drained."),this.name="BodyHandedOff"}};const tu=(e,t,r)=>{let o,n=0,i=!1;return{reader:{read:async()=>{if(i)throw new eu;let t=e.read();o=t;let r=await t;return r.done||(n+=r.value.byteLength),r},cancel:t=>e.cancel(t),releaseLock:()=>e.releaseLock()},drain:()=>{i||(i=!0,_a(async()=>{let r=performance.now()+la;o&&!await(async(e,t)=>{let r;try{return await Promise.race([e.then(()=>!0).catch(()=>!0),new Promise(e=>{r=setTimeout(()=>e(!1),Math.min(sa,t-performance.now()))})])}finally{clearTimeout(r)}})(o,r)?await e.cancel().catch(()=>{}):await da(e,{read:n,...t,deadline:r})})||(r.refused=!0))}}},ru=(e,t)=>{let r=t.found?.model;if(!r)return;let o=e.get("requestData");o?o.model=r:e.set("requestData",{model:r})},ou=async(e,t,r)=>(await(t?.cancelBody?.()),t&&ru(e,t),t?.bodyFailure?.(e)||(r instanceof rl?(e=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"The Service token was renewed during the upload; retry the request.",type:"service_unavailable"}},503)))(e):(e=>"UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"===e?.code)(r)?Ks(e,"The request body length does not match its Content-Length."):jr(e,r))),nu=(e,t,{signal:r,guard:o,ticket:n,drains:i})=>{let a=()=>{let t=((e,t)=>{if(!e)return{body:e,timedOut:()=>!1};let r=e.getReader(),o=!1;return{body:new ReadableStream({async pull(e){try{let o=await Cl(r,t);o.done?e.close():e.enqueue(o.value)}catch(t){t instanceof El&&(o=!0),e.error(t),await Ol(r)}},async cancel(e){await Ol(r,e)}},{highWaterMark:0}),timedOut:()=>o}})(e.req.raw.body,r);return o.timedOut=t.timedOut,t.body},s=Number(e.req.header("content-length")),l={drains:i,reserve:Rl(n,Number.isSafeInteger(s)&&s>=0?s:void 0)};return"generations"===t?Ec(e,"generations",{stream:a(),...l}):(async(e,t,r)=>{let o=e.req.header("content-type")??"",n=o.split(";")[0].trim().toLowerCase();return"application/json"===n?Ec(e,"edits",{stream:t(),...r}):"multipart/form-data"===n?Hc(e,o,r.drains):Ks(e,"Image edits require a multipart/form-data or application/json body.")})(e,a,l)},iu=e=>async(t,r)=>{let o,n,i={timedOut:()=>!1},a=!1;try{if(lo(he))return Ks(t,"Image endpoints are available only with the Copilot provider.");await Oa(he);let s=Lt(t),l=await Pl(t,e,s);if(l instanceof Response)return l;n=l;let c=await nu(t,e,{signal:s,guard:i,ticket:l,drains:r});if(c instanceof Response)return c;o=c,t.set("requestData",o.model?{model:o.model}:{});let u=await xa(t);if(u)return await(o.cancelBody?.()),u;he.manualApprove&&await ka(s);let d=((e,t)=>{let r={...e.get("requestData"),deferFinalize:!0};e.set("requestData",r);let o=e.get("requestSpan"),n=e.get("resolveStreamComplete"),i=Lt(e),a=performance.now();return e=>{try{if(void 0===e.error){let o=performance.now()-a;if(nt.record(o,{model:r.model||t,target:"images",streaming:"false"}),e.usage){let t=e.usage.input_tokens??0,o=e.usage.output_tokens??0;r.tokenUsage={inputTokens:t,outputTokens:o,totalTokens:e.usage.total_tokens??t+o}}r._d1=o}else e.cancelled||i.aborted?o?.setAttribute("copilot_api.client_aborted",!0):o&&ht(o,e.error)}finally{n?.()}}})(t,o.model),p=((e,t,r)=>{let o=(e=>{let t=2,r=()=>{0===--t&&e.release()},o=!1,n=!1;return{upstreamEnded:()=>{o||(o=!0,r())},clientEnded:()=>{n||(n=!0,r())}}})(e);return{hooks:{onBodyEnd:e=>{o.upstreamEnded(),r(e)},beforeAttempt:ql(t)},clientEnded:o.clientEnded}})(l,s,d),m=await(async(e,t,r={})=>{let{onBodyEnd:o,beforeAttempt:n}=r,i=!ol(e.body)||null===e.body.rest;i||await nl();let a={replayable:i,attempts:1,refreshed:!1,start:Date.now()};for(;;)try{return await(n?.()),await al(e,t,o)}catch(e){if(!(e instanceof mr))throw e;await il(e,a,t)}})(o,s,p.hooks),f=await Zc(t,o,m.body);return f.failed?f.failed:(a=!0,new Response(((e,t)=>{let r=e.getReader();return new ReadableStream({async pull(e){let o;try{o=await r.read()}catch(r){return e.error(r),void t()}o.done?(e.close(),t()):e.enqueue(o.value)},async cancel(e){await Ol(r,e),t()}})})(f.body,p.clientEnded),{status:200,headers:{"content-type":m.contentType}}))}catch(e){return i.timedOut()?(await(o?.cancelBody?.()),$l(t)):await ou(t,o,e)}finally{a||n?.release()}},au=e=>async t=>{let r={refused:!1},o=await e(t,r);if(o.status<400||"close"===o.headers.get("connection")?.toLowerCase())return o;let n=Number(t.req.header("content-length"));return wa(t.req.raw,ba(t.req.path),Number.isSafeInteger(n)&&n>=0?n:void 0)&&!r.refused?o:(e=>{try{return e.headers.set("Connection","close"),e}catch{let t=new Headers(e.headers);return t.set("Connection","close"),new Response(e.body,{status:e.status,statusText:e.statusText,headers:t})}})(o)};function su(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function lu(e){return!su(e)}Dc.post("/generations",au(iu("generations"))),Dc.post("/edits",au(iu("edits")));const cu=new Y(X);let uu;const du={...V["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function pu(e,t){try{return e.encode(t,[],[]).length}catch(e){return r.debug("count_tokens: tokenizer failed, using length/4",e),Math.ceil(t.length/4)}}function mu(e,t){let r=0;for(let o of e)switch(o.type){case"text":r+=t(o.text)*du.contentMultiplier;break;case"tool_use":r+=t(o.name+JSON.stringify(o.input))*du.contentMultiplier;break;case"tool_result":o.content&&(r+=t("string"==typeof o.content?o.content:JSON.stringify(o.content))*du.contentMultiplier);break;case"thinking":r+=t(o.thinking)*du.contentMultiplier;break;case"image":r+=1600}return r}function fu(e,t){let r=0,o=e.properties;if(!o)return r;let n=Object.entries(o);for(let[e,[o,i]]of n.entries()){if(r+=0===e?du.perFirstProp:du.perAdditionalProp,r+=t(o),i.description&&(r+=du.perPropDesc+t(i.description)),i.enum&&Array.isArray(i.enum)){r+=du.perEnum;for(let e of i.enum)r+=t(String(e))}if("object"===i.type&&i.properties&&(r+=du.perNestedObject,r+=fu(i,t)),"array"===i.type&&i.items){let e=i.items;"object"===e.type&&e.properties&&(r+=du.perArrayOfObjects,r+=fu(e,t))}}return r}const hu={event:"ping",data:JSON.stringify({type:"ping"})};function gu(e,t=15e3){let r,o=performance.now(),n=!1,i=()=>{if(n||e.aborted||e.closed)return void(r=void 0);let a=performance.now()-o;a>=t?(o=performance.now(),e.writeSSE(hu).catch(()=>{}),r=setTimeout(i,t)):r=setTimeout(i,t-a)};return r=setTimeout(i,t),{writeSSE:async t=>{await e.writeSSE(t),o=performance.now()},stop:()=>{n=!0,clearTimeout(r),r=void 0}}}function yu(e,t){let r={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")},o=e.thinking;if(o&&"object"==typeof o){let{type:e,budget_tokens:t}=o;"string"==typeof e&&(r["copilot_api.thinking.type"]=e),"number"==typeof t&&t&&(r["copilot_api.thinking.budget_tokens"]=t)}let n=e.output_config?.effort;return"string"==typeof n&&n&&(r["copilot_api.output_config.effort"]=n),r}function _u(e,t,r){let o=yu(t,r);for(let[t,r]of Object.entries(o))void 0!==r&&e.setAttribute(t,r)}const wu=async(e,t,o)=>{try{return await bu(e,t)}catch(n){if(n instanceof mr&&401===n.response.status){if(!await Zr(n))throw n;return bu(e,t)}if(n instanceof mr&&400===n.response.status&&o?.onStructuredOutputFallback){let i;try{i=await n.response.clone().text()}catch{i=void 0}let a=o.onStructuredOutputFallback(e,i);if(a)return r.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${a.model}`),bu(a,t)}throw n}};const bu=async(e,t)=>{if(!mo(he))throw Error("Service token not found");let{baseUrl:r,headers:o,cleanPayload:n}=lo(he)&&he.foundry?{baseUrl:ao(he.foundry),headers:so(he.foundry,t),cleanPayload:e}:function(e,t){let{metadata:r,...o}=e,n=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(o),i={...Rt(he,t,n),"X-Initiator":"agent"};return{baseUrl:Ot(he),headers:i,cleanPayload:o}}(Ai(e),t),i=`${r}/v1/messages`,a=he.timeoutMs,s=JSON.stringify(n),l=function(e,t,r){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":r,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough","copilot_api.upstream.provider":he.provider,...yu(e,t?.anthropicBeta)}}(n,t,a);for(let e=0;e<=1;e++){me();let t=Za(r,{fresh:e>0}),c=new AbortController,u=Yo(c,a);try{let{statusCode:r,headers:d,body:p,span:m}=await vt({spanName:"copilot POST /v1/messages",url:i,target:"anthropic_messages",headers:o,body:s,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:t}).finally(u.headersArrived),f=rs(p,{status:r,headers:d});if(!f.ok)throw m.end(),new mr("Failed to create anthropic messages",f,{outgoingBody:s,outgoingHeaders:o});if(n.stream)return{events:os(f,p),span:m,release:()=>Qa(t)};try{let e=await f.json();"string"==typeof e.id&&m.setAttribute("copilot_api.response.id",e.id);let t=e.usage;return t&&Aa(m,{prompt_tokens:t.input_tokens??0,completion_tokens:t.output_tokens??0,total_tokens:(t.input_tokens??0)+(t.output_tokens??0)}),e}finally{m.end(),Qa(t)}}catch(r){if(Qa(t),await pr(r,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw r}finally{u.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},vu=new Set(["resolveStreamComplete","requestId"]);function ku(e,t){if(!t)return e;let r=JSON.parse(e),o={...r.usage};for(let[e,r]of Object.entries(t))"number"==typeof r&&r>0&&!o[e]&&(o[e]=r);return JSON.stringify({...r,usage:o})}async function xu(e,t,r){let{stream:o,client:n}=t,{reason:i,progress:a}=r,s=await async function(e){let t=e.req.raw,r=new Request(t.url,{method:t.method,headers:t.headers,body:JSON.stringify(await e.req.json()),signal:Lt(e)}),o=new L(r,{env:e.env});for(let[t,r]of Object.entries(e.var))vu.has(t)||o.set(t,r);return o}(e);try{let e,t=await async function(e,t,r){let o=await ln(e,t,r);if(o.ok&&o.body)return o;throw await(o.body?.cancel()),new mr("Copilot fallback failed",o)}(s,i,r.failure);for await(let{event:r,data:o}of K(t))r&&void 0!==o&&"ping"!==r&&("message_start"===r&&a.messageStart?e=JSON.parse(o).message?.usage:await n.writeSSE({event:r,data:"message_delta"===r?ku(o,e):o}))}catch(t){if(Ft(e))return;let r=e.get("requestSpan");throw r&&ht(r,t),await Ra(o,t),t}finally{e.set("requestData",s.get("requestData"))}}const Tu=24e4;var Au=class extends fr{name="StreamHeadersTimeoutError"};function Su(){if(le())return;let e=new AbortController,t=setTimeout(()=>{e.abort(new Au(Tu))},Tu);return{signal:e.signal,clear:()=>clearTimeout(t)}}function $u(e,t){e.get("requestSpan")?.setAttribute("copilot_api.stream.headers_wait_ms",Math.round(performance.now()-t))}async function Eu(e,t,r){let o=e.get("requestSpan");try{let n=await async function(e,t){let r,o=new Promise(e=>{r=setTimeout(()=>e(void 0),t)});try{return await Promise.race([e.then(e=>({value:e})),o])}finally{clearTimeout(r)}}(t,15e3);return o?.setAttribute("copilot_api.stream.early_commit",!n),n&&$u(e,r),n}catch(t){throw o?.setAttribute("copilot_api.stream.early_commit",!1),$u(e,r),t}}const Ou={400:"invalid_request_error",401:"authentication_error",403:"permission_error",404:"not_found_error",413:"request_too_large",429:"rate_limit_error",503:"overloaded_error",529:"overloaded_error"},Cu=e=>Ou[e]??(e>=500?"api_error":"invalid_request_error");async function Iu(e,t){let r=new L(e.req.raw,{env:e.env,path:e.req.path});for(let[t,o]of Object.entries(e.var))r.set(t,o);let o=await jr(r,t);if(499===o.status)return;if((e=>e instanceof Au||e instanceof Error&&e.cause instanceof Au)(t))return await(o.body?.cancel()),{type:"overloaded_error",message:"Upstream sent no response within 240s; retry"};let n=(await o.json().catch(()=>{}))?.error?.message??"Upstream request failed";return gr(t)?{type:"overloaded_error",message:n}:{type:Cu(o.status),message:n}}async function Ru(e,t,r){await t.client.writeSSE(hu);try{let t=await r.pending;return $u(e,r.start),t}catch(o){if($u(e,r.start),Ft(e))return void Oe.completionCallbacks.delete(e.get("requestId"));let n=function(e,t){if(nn(e))return Vo(t,void 0!==en()?.sent)}(e,o);if(n)return void await xu(e,t,{reason:n,progress:{messageStart:!1,content:!1,held:[]},failure:o});let i=await Iu(e,o);return void(i&&await t.client.writeSSE({event:"error",data:JSON.stringify({type:"error",error:i})}))}}const qu=new Set(["low","medium","high","max","xhigh"]),Pu=(e,t)=>!(!e||!t||e===t);function Nu(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!qu.has(t))return e;let o=he.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,n=No(t,o);if(!n||!qu.has(n))return e;let i=n;if(i===t)return e;r.debug(`Effort clamp: ${t} → ${i}`);let a=f.getActiveSpan();return a?.setAttribute("copilot_api.effort.requested",t),a?.setAttribute("copilot_api.effort.clamped_to",i),{...e,output_config:{...e.output_config,effort:i}}}function Mu(e,t,o){if("foundry"===he.provider)return Nu(e);let n=t.includes(e.model)?e.model:qo(e.model,t)??e.model,i=n===e.model?e:{...e,model:n},a=function(e,t,r={}){let o=qo(e,t);return o&&r.context1m?function(e,t){let r=`${e}-1m`;if(t.has(r))return r;let o=`${e}-1m-`;for(let e of t)if(e.startsWith(o))return e;return null}(o,new Set(t)):null}(i.model,t,{context1m:o.context1m}),s=i;if(a&&a!==i.model){r.debug(`Resolved model variant: ${i.model} → ${a}`);let e=f.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",i.model),e?.setAttribute("copilot_api.model.variant_resolved_to",a),s={...i,model:a}}return Nu(s)}const ju=e=>"object"==typeof e&&!!e&&!Array.isArray(e),Du=["properties","patternProperties","$defs","definitions"],Lu=["items","additionalProperties","propertyNames","contains","not","if","then","else"],Bu=["anyOf","allOf","oneOf","prefixItems"];const Fu=()=>["string","number","boolean"].map(e=>({type:e})),Uu=()=>({anyOf:[...Fu(),{type:"array",items:{anyOf:Fu()}},{type:"object"}]}),Hu=e=>!0===e||ju(e)&&0===Object.keys(e).length,zu=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function Ju(e,t){let r={...e};for(let e of Du){let o=r[e];ju(o)&&(r[e]=Object.fromEntries(Object.entries(o).map(([e,r])=>[e,ju(r)?Ju(r,t):r])))}for(let e of Lu){let o=r[e];ju(o)&&(r[e]=Ju(o,t))}for(let e of Bu){let o=r[e];Array.isArray(o)&&(r[e]=o.map(e=>ju(e)?Ju(e,t):e))}return"prefixItems"in r&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(ju(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let r=t.flatMap(e=>Hu(e)?Uu().anyOf:ju(e)?[e]:[]);if(0===r.length)return;let o=[...new Map(r.map(e=>[JSON.stringify(e),e]))].map(([,e])=>e);e.items=1===o.length?o[0]:{anyOf:o}}(r)),zu(r)&&(!("items"in r)||Hu(r.items))&&(t.add("items"),r.items=Uu()),Hu(r.additionalProperties)&&(t.add("additionalProperties"),delete r.additionalProperties),r}function Gu(e){let t=[],r=[];for(let o of e)switch(o.role){case"system":{if(r.length>0){r.push(o);break}let e=Wu(o);e&&t.push(e);break}case"user":case"assistant":r.push(o)}return{leadingSystemTexts:t,messages:r}}function Ku(e){return Yu(Wu(e))}function Wu(e){return"string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.flatMap(e=>"text"===e.type&&"string"==typeof e.text?[e.text]:[]).join("\n\n"):""}function Yu(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function Vu(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>Yu(e)).filter(Boolean).join("\n\n")}const Xu=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),Zu=new Set(["text","image"]);function Qu(e,t){if(Array.isArray(e?.content))for(let r of e.content){if(t.size>=20)return;let e=String(r?.type).slice(0,64);Zu.has(e)||t.add(`block:tool_result:${e}`)}}const ed=new Set;function td(e,t){e.setAttribute("copilot_api.translation.system_message_count",t.filter(e=>"system"===e.role).length),e.setAttribute("copilot_api.translation.has_images",function(e){return e.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type||"tool_result"===e.type&&Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)))}(t));let r=function(e){let t=new Set;for(let r of e){if(t.size>=20)break;let e=String(r.role).slice(0,64),o=Xu.get(e);if(o){if(Array.isArray(r.content))for(let n of r.content){let r=String(n?.type).slice(0,64);if(o.has(r)||t.add(`block:${e}:${r}`),"tool_result"===r&&Qu(n,t),t.size>=20)break}}else t.add(`role:${e}`)}return[...t].sort()}(t);if(0===r.length)return;e.setAttribute("copilot_api.translation.unknown_shapes",r.join(","));let o=function(e){let t=[];for(let r of e){if(ed.size>=100)break;ed.has(r)||(ed.add(r),t.push(r))}return t}(r);0!==o.length&&n.warn(`Request contains message shapes the translator does not handle (dropped): ${o.join(", ")}`)}const rd=e=>P("sha256").update(e).digest("hex").slice(0,12);function od(e,t){e.setAttribute("copilot_api.translation.system_hash",rd(t.system)),e.setAttribute("copilot_api.translation.tools_hash",rd(JSON.stringify(t.tools??[])))}function nd(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function id(e){return e.toLowerCase().startsWith("claude-")}function ad(e,t){let r={model:e.model,messages:sd(e.messages,e.system),max_tokens:e.max_tokens,stop:e.stop_sequences,stream:e.stream,temperature:e.temperature,top_p:e.top_p,user:e.metadata?.user_id,tools:hd(e.tools,e.model),tool_choice:gd(e.tool_choice)},o=e.thinking;if("enabled"===o?.type||"adaptive"===o?.type){let n=ja(t,r.model);if(n){let i="enabled"===o.type&&"number"==typeof o.budget_tokens?o.budget_tokens:function(e,t,r){let o=function(e,t){return"max"===e||"xhigh"===e?t:"medium"===e?8e3:"low"===e?1024:16e3}(e,r.max),n=Pa(t),i=n&&n>1?n-1:r.min;return Na(Math.min(o,i),r.min,r.max)}(e.output_config?.effort??"high",r.max_tokens,n.bounds);r=La({...r,thinking_budget:i},t)}}return r}function sd(e,t){let{leadingSystemTexts:r,messages:o}=Gu(e),n=function(e,t){let r=Vu(e,t);return r?[{role:"system",content:r}]:[]}(t,r),i=[];for(let e of o)switch(e.role){case"system":{let t=Ku(e);if(!t)break;ld(n)?i.push(t):cd(n,t);break}case"user":n.push(...ud(e));for(let e of i)cd(n,e);i=[];break;case"assistant":n.push(...dd(e))}for(let e of i)cd(n,e);return n}function ld(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function cd(e,t){let r=function(e){return e.trimStart().startsWith("<system-reminder>")?e:`<system-reminder>\n${e}\n</system-reminder>`}(t),o=e.at(-1);"user"===o?.role?Array.isArray(o.content)?o.content.push({type:"text",text:r}):o.content=o.content?`${o.content}\n\n${r}`:r:e.push({role:"user",content:r})}function ud(e){let t=[];if(Array.isArray(e.content)){let r=e.content.filter(e=>"tool_result"===e.type),o=e.content.filter(e=>"tool_result"!==e.type);for(let e of r)t.push({role:"tool",tool_call_id:e.tool_use_id,content:fd(e.content)});o.length>0&&t.push({role:"user",content:fd(o)})}else t.push({role:"user",content:fd(e.content)});return t}function dd(e){let t=function(e){return{reasoning_text:md(e.reasoning_text),reasoning_opaque:md(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:fd(e.content),...t}];let r=e.content.filter(e=>"tool_use"===e.type),o=e.content.filter(e=>"text"===e.type),n=e.content.filter(e=>"thinking"===e.type),i=[...o.map(e=>e.text),...n.map(e=>e.thinking)].join("\n\n");return r.length>0?[{role:"assistant",content:i||null,...t,tool_calls:r.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:"assistant",content:fd(e.content),...t}]}const pd=32768;function md(e){if("string"==typeof e)return e.length<=pd?e:e.slice(0,pd)}function fd(e){if("string"==typeof e)return e;if(!Array.isArray(e))return null;if(!e.some(e=>"image"===e.type))return e.filter(e=>"text"===e.type||"thinking"===e.type).map(e=>"text"===e.type?e.text:e.thinking).join("\n\n");let t=[];for(let r of e)switch(r.type){case"text":t.push({type:"text",text:r.text});break;case"thinking":t.push({type:"text",text:r.thinking});break;case"image":t.push({type:"image_url",image_url:{url:`data:${r.source.media_type};base64,${r.source.data}`}})}return t}function hd(e,t){if(!e)return;let r=e.filter(lu),o=function(e){return e.toLowerCase().startsWith("gemini")}(t),n=new Set,i=r.map(e=>{let t=e.input_schema;if(o){let e=function(e){let t=new Set;return{schema:Ju(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)n.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return n.size>0&&f.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...n].sort().join(",")),i}function gd(e){if(e)switch(e.type){case"auto":return"auto";case"any":return"required";case"tool":return e.name?{type:"function",function:{name:e.name}}:void 0;case"none":return"none";default:return}}function yd(e){return"string"==typeof e?[{type:"text",text:e}]:Array.isArray(e)?e.filter(e=>"text"===e.type).map(e=>({type:"text",text:e.text})):[]}function _d(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function wd(e){return e?e.map(e=>{let t={};try{t=JSON.parse(e.function.arguments)}catch{n.warn(`Failed to parse tool call arguments for "${e.function.name}": ${e.function.arguments.slice(0,200)}`)}return{type:"tool_use",id:e.id,name:e.function.name,input:t}}):[]}const bd=new Set(["low","medium","high","max","xhigh"]);function vd(e,t){let r=e.thinking;if(!r||"enabled"!==r.type)return e;let o=t?.data.find(t=>t.id===e.model);if(!o||!o.capabilities.supports.adaptive_thinking)return e;let n={...e,thinking:{type:"adaptive"}};if(!e.output_config?.effort){let t=(e=>null!==e&&bd.has(e)?e:null)(No(function(e){return!e||e<=0?"medium":e<8e3?"low":e<24e3?"medium":"high"}(r.budget_tokens),o.capabilities.supports.reasoning_effort));t&&(n.output_config={...e.output_config,effort:t})}return n}function kd(e){return"string"!=typeof e&&Array.isArray(e)?e.map(e=>{let t=e;if(!t.cache_control||"object"!=typeof t.cache_control)return e;let r=t.cache_control;if("string"!=typeof r.type){let{cache_control:e,...r}=t;return r}let o={type:r.type};return void 0!==r.ttl&&(o.ttl=r.ttl),{...t,cache_control:o}}):e}const xd=/[^\w-]/g;function Td(e){return e.replaceAll(xd,"_")}function Ad(e,t){let r=function(e,t){if(!e.output_config?.effort)return e;let r=t?.data.find(t=>t.id===e.model);if(!r)return e;let o=r.capabilities.supports.reasoning_effort;if(Array.isArray(o)&&o.length>0)return e;let{effort:n,...i}=e.output_config;if(0===Object.keys(i).length){let{output_config:t,...r}=e;return r}return{...e,output_config:i}}(e,t);return r=vd(r,t),r=function(e,t){let r=e.max_tokens;if("number"!=typeof r)return e;let o=t?.data.find(t=>t.id===e.model);if(!o)return e;let n=o.capabilities.limits;if(!n)return e;let i=(!1===e.stream?n.max_non_streaming_output_tokens:void 0)??n.max_output_tokens;if("number"!=typeof i||i<=0)return e;let a=Math.max(Math.min(r,i),16);return a===r?e:{...e,max_tokens:a}}(r,t),r={...r,system:kd(r.system)},r=function(e){let t=e.messages.map(e=>{if(!Array.isArray(e.content))return e;let t=e.content.map(e=>{let t=e;return"tool_use"===t.type&&"string"==typeof t.id?{...t,id:Td(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Td(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(r),r}function Sd(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"thinking must be an object";let r=t;return"string"==typeof r.type?"enabled"!==r.type||void 0===r.budget_tokens||"number"==typeof r.budget_tokens&&Number.isFinite(r.budget_tokens)&&!(r.budget_tokens<=0)&&Number.isInteger(r.budget_tokens)?null:"thinking.budget_tokens must be a positive integer":"thinking.type must be a string"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"output_config must be an object";let r=t;return void 0===r.effort||"string"==typeof r.effort?null:"output_config.effort must be a string"}(e)}function $d(e,t,r=400){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},r)}function Ed(e,t){return Me.startActiveSpan("copilot_api.model.validate",o=>{try{o.setAttribute("copilot_api.model.requested",t.model),_u(o,t,e.req.header("anthropic-beta"));let n=$a(t.model);o.setAttribute("copilot_api.model.normalized",n);let i=Sd(t);return i?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:i}},400)}):n===t.model?(o.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(o.setAttribute("copilot_api.model.was_mapped",!0),Ge.add(1,{from_model:t.model,to_model:n}),r.debug(`Model mapping: '${t.model}' → '${n}'`),{ok:!0,payload:{...t,model:n}})}catch(t){if(t instanceof Sa)return{ok:!1,response:$d(e,t.message,t.statusCode)};throw t}finally{o.end()}})}var Od=class extends Ca{name="UpstreamIdleError";constructor(e){super("api_error",`Upstream sent nothing for ${Math.round(e/1e3)}s; stream aborted`)}};function Cd(e,t,r){let{leadingSystemTexts:o,messages:n}=Gu(e.messages),i=function(e){let t=[],r=[];for(let o of e)switch(o.role){case"system":{let e=Ku(o);if(!e)break;"function_call"===t.at(-1)?.type?r.push(e):t.push(Md(e));break}case"user":t.push(...jd(o),...r.map(e=>Md(e))),r=[];break;case"assistant":t.push(...Bd(o))}return t.push(...r.map(e=>Md(e))),t}(n);if(0===i.length)throw new mr("request has no translatable message content",Response.json({type:"error",error:{type:"invalid_request_error",message:"request has no translatable message content"}},{status:400}));let a={model:e.model,input:i,max_output_tokens:Math.max(e.max_tokens,16),stream:e.stream,temperature:e.temperature,top_p:e.top_p,store:!1,user:e.metadata?.user_id?.slice(0,64)},s=function(e,t){return Vu(e,t)||null}(e.system,o);s&&(a.instructions=s),e.tools?.length&&(a.tools=e.tools.filter(lu).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(a.tool_choice=function(e){switch(e.type){case"auto":return"auto";case"any":return"required";case"none":return"none";case"tool":return e.name?{type:"function",name:e.name}:void 0;default:return}}(e.tool_choice));let l=function(e,t,r){if("adaptive"===e.thinking?.type){let t=e.output_config?.effort??"high";return r&&"max"===t?{effort:"max"}:{effort:Nd(t)}}if("enabled"===e.thinking?.type&&e.thinking.budget_tokens){let{effort:r}=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens),o=No(r,t);return{effort:Pd(o)?o:r}}}(e,t,r?.keepMax??!1);return l&&(a.reasoning=l),r?.promptCacheKey&&(a.prompt_cache_key=r.promptCacheKey),a}function Id(e,t){let r=e?.trim()||t?.trim();if(r)return`cc-${P("sha256").update(r).digest("hex").slice(0,32)}`}function Rd(e){let t=e?.input_tokens??0,r=e?.input_tokens_details?.cached_tokens;return{input_tokens:void 0===r?t:Math.max(t-r,0),output_tokens:e?.output_tokens??0,...void 0===r?{}:{cache_read_input_tokens:r}}}const qd=new Set(["low","medium","high","xhigh"]),Pd=e=>null!==e&&qd.has(e);function Nd(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Md(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function jd(e){if("string"==typeof e.content)return[{type:"message",role:"user",content:e.content}];let t=[],r=e.content.filter(e=>"tool_result"===e.type),o=e.content.filter(e=>"tool_result"!==e.type);for(let e of r)t.push(Ld(e));if(o.length>0)if(o.some(e=>"image"===e.type)){let e=[];for(let t of o)switch(t.type){case"text":e.push({type:"input_text",text:t.text});break;case"image":e.push(Dd(t))}t.push({type:"message",role:"user",content:e})}else{let e=o.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function Dd(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function Ld(e){if(Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)){let t=e.content.filter(e=>["image","text"].includes(e.type)).map(e=>"image"===e.type?Dd(e):{type:"input_text",text:e.text});return e.is_error&&t.unshift({type:"input_text",text:"[ERROR]"}),{type:"function_call_output",call_id:e.tool_use_id,output:t}}let t;return t="string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.filter(e=>"text"===e.type).map(e=>e.text).join("\n"):"",e.is_error&&(t=`[ERROR] ${t}`),{type:"function_call_output",call_id:e.tool_use_id,output:t}}function Bd(e){if("string"==typeof e.content)return[{type:"message",role:"assistant",content:e.content}];let t=[],r=e.content.filter(e=>"text"===e.type),o=e.content.filter(e=>"thinking"===e.type),n=e.content.filter(e=>"tool_use"===e.type),i=[...r.map(e=>e.text),...o.map(e=>e.thinking)].join("\n\n");i&&t.push({type:"message",role:"assistant",content:i});for(let e of n)t.push({type:"function_call",call_id:e.id,name:e.name,arguments:JSON.stringify(e.input)});return t}function Fd(e,t){if("incomplete"===e.status)return"content_filter"===e.incomplete_details?.reason?"refusal":"max_tokens";if(t)return"tool_use";switch(e.status){case"completed":case"cancelled":case"failed":return"end_turn";default:return null}}function Ud(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Hd(e,t,r){e.messageStartSent||=(e.responseId=r?.responseId??e.responseId,e.model=r?.model??e.model,t.push({type:"message_start",message:{id:e.responseId,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}),!0)}function zd(e,t){let r=[];switch(e.type){case"response.created":Hd(t,r,{responseId:e.response.id,model:e.response.model});break;case"response.in_progress":case"response.output_text.done":case"response.function_call_arguments.done":break;case"response.output_item.added":if("function_call"===e.item.type){Hd(t,r),Ud(t,r);let o=e.item;t.toolCalls[e.output_index]={call_id:o.call_id,name:o.name,_bi1:t.contentBlockIndex},r.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"tool_use",id:o.call_id,name:o.name,input:{}}}),t.contentBlockOpen=!0}break;case"response.content_part.added":Hd(t,r),Ud(t,r),r.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),t.contentBlockOpen=!0;break;case"response.output_text.delta":r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"response.content_part.done":Ud(t,r);break;case"response.function_call_arguments.delta":{let o=t.toolCalls[e.output_index];o&&r.push({type:"content_block_delta",index:o._bi1,delta:{type:"input_json_delta",partial_json:e.delta}});break}case"response.output_item.done":if("function_call"===e.item.type){let o=t.toolCalls[e.output_index];o&&t.contentBlockOpen&&(r.push({type:"content_block_stop",index:o._bi1}),t.contentBlockIndex++,t.contentBlockOpen=!1)}break;case"response.completed":{Ud(t,r);let o=e.response.output.some(e=>"function_call"===e.type),n=e.response.usage,i=Fd(e.response,o);t.terminalEvent=e.type,t.stopReason=i,r.push({type:"message_delta",delta:{stop_reason:i,stop_sequence:null},usage:Rd(n)},{type:"message_stop"});break}case"response.incomplete":{Hd(t,r),Ud(t,r);let o=e.response.usage,n=Fd(e.response,!1);t.terminalEvent=e.type,t.stopReason=n,r.push({type:"message_delta",delta:{stop_reason:n,stop_sequence:null},usage:Rd(o)},{type:"message_stop"});break}case"response.failed":Hd(t,r),Ud(t,r),t.terminalEvent=e.type,r.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":Hd(t,r),Ud(t,r),t.terminalEvent=e.type,t.stopReason="end_turn",r.push({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{input_tokens:0,output_tokens:0}},{type:"message_stop"});break;case"response.refusal.delta":Hd(t,r),t.contentBlockOpen||=(r.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"error":t.terminalEvent=e.type,r.push({type:"error",error:{type:e.code??"api_error",message:e.message??"Response generation failed"}})}return r}function Jd(e,t,r){let o=t.reasoning?.effort,n=e.get("requestData")||{};n.reasoningEffort=o,n.effortClamped=Pu(r,o),e.set("requestData",n)}function Gd(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function Kd(e,t,o){let n=!1;for(let i of t){if(r.debug("Translated Anthropic event:",i),"error"===i.type)throw new Ca(i.error.type,i.error.message);if("message_start"===i.type){await e.writeSSE({event:i.type,data:JSON.stringify(i)}),o.messageStart=!0,n=!0;continue}let t="content_block_start"===i.type&&"text"===i.content_block.type&&!i.content_block.text,a="content_block_stop"===i.type&&o.held.length>0;if(o.content||!t&&!a){o.content=!0;for(let t of o.held.splice(0))await e.writeSSE({event:t.type,data:JSON.stringify(t)});await e.writeSSE({event:i.type,data:JSON.stringify(i)}),n=!0}else o.held.push(i)}return n}function Wd(e){let t,r=0;return{progress:e=>!function(e){if("keepalive"===e.event)return!0;let{data:t}=e;if(!t?.includes('"keepalive"'))return!1;try{return"keepalive"===JSON.parse(t).type}catch{return!1}}(e)||(r++,!1),forwarded:()=>{t=performance.now()},record:o=>{o.setAttribute("copilot_api.upstream.keepalive_count",r),void 0!==t&&o.setAttribute("copilot_api.stream.last_forward_ms",Math.round(t-e))}}}function Yd(e){if(e)try{return JSON.parse(e)}catch(t){return void r.warn("Failed to parse streaming chunk:",e.slice(0,200),t)}}function Vd(e,t){let r=performance.now()-t;return nt.record(r,{model:e.model,target:"responses",streaming:String(!!e.stream)}),r}function Xd(e,t){return G(e,async r=>{let o=gu(r);r.onAbort(()=>{o.stop(),Bt(e)});try{await t({stream:r,client:o})}finally{o.stop();try{let t=e.get("requestId");t&&Oe.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}})}async function Zd(e,t,o){r.debug("Streaming Responses API response");let n,{stream:i,client:a}=t,{events:s,span:l,release:c}=o.response,{model:u,copilotStart:d,_d1:p,upstreamIdle:m}=o,f=null,h=0,g=performance.now(),y=Wd(g),_=Ua(e,d),w={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}},b={messageStart:!1,content:!1,held:[]};try{for await(let t of async function*(e,t,r={}){let o,{idleMs:n=3e5,progress:i=()=>!0}=r,a=e[Symbol.asyncIterator](),s={idle:!1};try{for(;;){let e,r=new Promise((e,r)=>{o=setTimeout(()=>{s.idle=!0;let e=new Od(n);t.abort(e),r(e)},n)});try{do{e=await Promise.race([a.next(),r])}while(!e.done&&!i(e.value))}finally{clearTimeout(o)}if(e.done)return;yield e.value}}finally{clearTimeout(o),s.idle||await(a.return?.())}}(s,m,{progress:y.progress})){_(),r.debug("Responses API raw stream event:",t);let o=Yd(t.data);if(!o)continue;h++,Ze.add(1,{model:u,endpoint_type:"responses"});let n=ks(o);if(n){f=n;let t=e.get("requestData")||{};t.tokenUsage=Ta(f),t._d1=p,e.set("requestData",t)}await Kd(a,zd(o,w),b)&&y.forwarded()}(function(e){if(!e.terminalEvent)throw new Ca("api_error","Upstream stream ended before the response completed")})(w),sn();let t=performance.now()-g,o={model:u,endpoint_type:"responses"};it.record(t,o),pt.record(h,o),Ha(e,d)}catch(t){if(Ft(e))return;if(b.content||!nn(e))throw function(e,t,r){if(!(t instanceof Ca))return;let o="stream_incomplete";t instanceof Od?o="upstream_idle":r.terminalEvent&&(o="upstream_failure"),e?.setAttribute("copilot_api.error_type",o)}(e.get("requestSpan"),t,w),gt(l,e.get("requestSpan"),t),await Ra(i,t),t;n=t instanceof Od?"foundry_stream_idle":"foundry_stream_failed",ht(l,t)}finally{f&&Aa(l,f),y.record(l),n||function(e,t,r){e&&(Gd(e,r?.completion_tokens_details?.reasoning_tokens),e.setAttribute("copilot_api.stream.terminal_event",t.terminalEvent??"none"),void 0!==t.stopReason&&e.setAttribute("copilot_api.translation.stop_reason",t.stopReason??"null"),e.setAttribute("copilot_api.translation.tool_use_count",Object.keys(t.toolCalls).length))}(e.get("requestSpan"),w,f),l.end(),c()}n&&await xu(e,t,{reason:n,progress:b})}async function Qd(e,t,n){let i=performance.now(),a=Me.startActiveSpan("copilot_api.translate.anthropic_to_responses",r=>{try{r.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),r.setAttribute("copilot_api.translation.message_count",t.messages.length),td(r,t.messages);let o=Cd(t,he.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===he.provider,promptCacheKey:"foundry"===he.provider?Id(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return od(r,{system:o.instructions??"",tools:o.tools}),o}finally{r.end()}});st.record(performance.now()-i,{direction:"anthropic_to_responses"}),r.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),Jd(e,a,n),he.manualApprove&&await ka();let s=performance.now(),l=new AbortController,{pending:c,capped:u}=function(e,t,r){let o=t.stream?Su():void 0;return{pending:_s(t,{onAttempt:t=>Jd(e,t,r.requestedEffort),signal:AbortSignal.any([Lt(e),r.upstreamIdle.signal,...o?[o.signal]:[]])}).finally(()=>o?.clear()),capped:void 0!==o}}(e,a,{requestedEffort:n,upstreamIdle:l});if(u&&!await Eu(e,c,s))return function(e,t,r){let{pending:o,copilotStart:n,upstreamIdle:i}=r;return an(),Xd(e,async r=>{let a=await Ru(e,r,{pending:o,start:n});a&&!vs(a)&&await Zd(e,r,{response:a,model:t.model,copilotStart:n,_d1:Vd(t,n),upstreamIdle:i})})}(e,a,{pending:c,copilotStart:s,upstreamIdle:l});let d=await c,p=Vd(a,s);if(vs(d)){let t=e.get("requestData")||{};if(Gd(e.get("requestSpan"),d.usage?.output_tokens_details?.reasoning_tokens),d.usage&&(t.tokenUsage=Ta({prompt_tokens:d.usage.input_tokens,completion_tokens:d.usage.output_tokens,total_tokens:d.usage.total_tokens,prompt_tokens_details:d.usage.input_tokens_details})),t._d1=p,t.upstreamTtfbMs=p,t.upstreamTotalMs=p,e.set("requestData",t),r.level>=o.debug&&r.debug("Non-streaming Responses API response:",JSON.stringify(d).slice(-400)),"failed"===d.status)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:d.error?.code??"api_error",message:d.error?.message??"Response generation failed"}},500);let n=performance.now(),i=Me.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","responses_to_anthropic");let t=function(e){let t=[],r=!1;for(let o of e.output)if("message"===o.type)for(let e of o.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===o.type){r=!0;let e={};try{e=JSON.parse(o.arguments)}catch{}t.push({type:"tool_use",id:o.call_id,name:o.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:Fd(e,r),stop_sequence:null,usage:Rd(e.usage)}}(d);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return st.record(performance.now()-n,{direction:"responses_to_anthropic"}),e.json(i)}return an(),Xd(e,t=>Zd(e,t,{response:d,model:a.model,copilotStart:s,_d1:p,upstreamIdle:l}))}function ep(e,t){e.thinkingBlockOpen||(e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1),t.push({type:"content_block_start",index:e.contentBlockIndex,content_block:{type:"thinking",thinking:""}}),e.thinkingBlockOpen=!0,e.contentBlockOpen=!0)}function tp(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function rp(e,t){let r=[];if(0===e.choices.length)return r;let o=e.choices[0],{delta:n}=o;if(t.messageStartSent||=(r.push({type:"message_start",message:{id:e.id,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:0}}}),!0),"string"==typeof n.reasoning_text&&""!==n.reasoning_text&&(ep(t,r),r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"thinking_delta",thinking:n.reasoning_text}})),"string"==typeof n.reasoning_opaque&&""!==n.reasoning_opaque&&(ep(t,r),r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:n.reasoning_opaque}}),tp(t,r)),n.content&&(tp(t,r),function(e){return!!e.contentBlockOpen&&Object.values(e.toolCalls).some(t=>t._bi1===e.contentBlockIndex)}(t)&&(r.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1),t.contentBlockOpen||=(r.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:n.content}})),n.tool_calls){tp(t,r);for(let e of n.tool_calls){if(e.id&&e.function?.name){t.contentBlockOpen&&=(r.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,!1);let o=t.contentBlockIndex;t.toolCalls[e.index]={id:e.id,name:e.function.name,_bi1:o},r.push({type:"content_block_start",index:o,content_block:{type:"tool_use",id:e.id,name:e.function.name,input:{}}}),t.contentBlockOpen=!0}if(e.function?.arguments){let o=t.toolCalls[e.index];o&&r.push({type:"content_block_delta",index:o._bi1,delta:{type:"input_json_delta",partial_json:e.function.arguments}})}}}return o.finish_reason&&(tp(t,r),t.contentBlockOpen&&=(r.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),r.push({type:"message_delta",delta:{stop_reason:nd(o.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:"message_stop"})),r}const op=/structured_outputs|output_config\.format/i;function np(e,t,r){return function(e,t,r){return!(!e.output_config?.format||"claude-haiku-4.5"===r||!t)&&op.test(t)}(e,t,e.model)&&r?.data.some(e=>"claude-haiku-4.5"===e.id)?Ad({...e,model:Oo},r):null}var ip=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var ap=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const sp={tavily:async function(e,t,o){let n=function(e,t){let r={query:e,max_results:t?.maxResults??5};return t?.includeDomains?.length&&(r.include_domains=t.includeDomains),t?.excludeDomains?.length&&(r.exclude_domains=t.excludeDomains),r}(t,o);r.debug("Tavily search request:",JSON.stringify(n));let i=new AbortController,a=setTimeout(()=>i.abort(),15e3);try{let{response:t,span:a}=await bt({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(n),signal:i.signal,extraAttributes:{"tavily.max_results":o?.maxResults??5,"tavily.has_include_domains":!!o?.includeDomains?.length,"tavily.has_exclude_domains":!!o?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return a.setAttribute("tavily.results_count",e.results.length),r.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw ht(a,e),e}finally{a.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new ap:e}finally{clearTimeout(a)}},exa:async function(e,t,o){let n=function(e,t){let r={query:e,numResults:t?.maxResults??5,contents:{text:!0}};return t?.includeDomains?.length&&(r.includeDomains=t.includeDomains),t?.excludeDomains?.length&&(r.excludeDomains=t.excludeDomains),r}(t,o);r.debug("Exa search request:",JSON.stringify(n));let i=new AbortController,a=setTimeout(()=>i.abort(),15e3);try{let{response:t,span:a}=await bt({spanName:"exa POST /search",url:"https://api.exa.ai/search",target:"exa_search",method:"POST",headers:{"Content-Type":"application/json","x-api-key":e},body:JSON.stringify(n),signal:i.signal,extraAttributes:{"exa.max_results":o?.maxResults??5,"exa.has_include_domains":!!o?.includeDomains?.length,"exa.has_exclude_domains":!!o?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return a.setAttribute("exa.results_count",e.results.length),r.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw ht(a,e),e}finally{a.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new ip:e}finally{clearTimeout(a)}}},lp=["tavily","exa"];function cp(e){return"tavily"===e||"exa"===e}function up(){return he.webSearchProviders.length>0}async function dp(e,t){return async function(e,t,o){let{providers:n,searchFns:i=sp}=o;if(0===n.length)throw Error("No web search provider configured");let a,s=[];for(let[o,l]of n.entries())try{let o=await i[l.name](l.key,e,t);return s.length>0&&r.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),o}catch(e){a=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);o!==n.length-1&&r.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${n[o+1].name}".`)}let l=a instanceof Error?a.message:String(a);throw r.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),a instanceof Error?a:Error("All web search providers failed")}(e,t,{providers:he.webSearchProviders})}function pp(e){let t=e.tools;return!(!t||1!==t.length)&&su(t[0])}function mp(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function fp(e,t){let r=[{type:"web_search_tool_result_error",error_code:t.errorCode??"unavailable"}];return{type:"web_search_tool_result",tool_use_id:e,content:t.searchFailed?r:t.results}}async function hp(e,t){let o=function(e){let t,r=e.messages[0];if(!r||"user"!==r.role)return null;if("string"==typeof r.content)t=r.content;else{if(!Array.isArray(r.content))return null;{let e=r.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!o)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let n=function(e){let t=e.tools?.[0];return t&&su(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);r.info(`Web search intercepted: "${o}"`);let i,a=[],s=!1;try{if(!up())throw s=!0,i="unavailable",Error("No web search provider configured");a=(await dp(o,{maxResults:Math.min(n.maxResults,10),includeDomains:n.allowedDomains,excludeDomains:n.blockedDomains})).map(e=>({type:"web_search_result",url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString("base64"),page_age:null}))}catch(e){r.error("Web search failed:",e),s=!0,i??="unavailable"}let l={query:o,results:a,model:t.model,searchFailed:s,errorCode:i};if(!t.stream)return e.set("requestData",{model:t.model,streaming:!1}),e.json(function(e){let{query:t,model:r}=e,o=`srvtoolu_${mp()}`,n=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:o,name:"web_search",input:{query:t}},{...fp(o,e)}];return{id:`msg_ws_${mp()}`,type:"message",role:"assistant",model:r,content:n,stop_reason:"end_turn",stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}(l));let c=function(e){let{query:t,model:r}=e,o=`srvtoolu_${mp()}`,n=`msg_ws_${mp()}`,i=[];return i.push({type:"message_start",message:{id:n,type:"message",role:"assistant",content:[],model:r,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:"content_block_start",index:0,content_block:{type:"text",text:""}},{type:"content_block_delta",index:0,delta:{type:"text_delta",text:"I'll search for that."}},{type:"content_block_stop",index:0},{type:"content_block_start",index:1,content_block:{type:"server_tool_use",id:o,name:"web_search",input:{}}},{type:"content_block_delta",index:1,delta:{type:"input_json_delta",partial_json:JSON.stringify({query:t})}},{type:"content_block_stop",index:1},{type:"content_block_start",index:2,content_block:fp(o,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),i}(l);return e.set("requestData",{model:t.model,streaming:!0}),G(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}async function gp(e){if(mo(he)||await Cn())return null;let t=xn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${An()}`}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function yp(e,t){let r=t.model;return r&&"string"==typeof r?null:$d(e,"Model name is required and must be a string")}function _p(e,t){let r=performance.now()-t;return nt.record(r,{model:e.model,target:"chat_completions",streaming:String(!!e.stream)}),r}function wp(e,t){return G(e,async r=>{let o=gu(r);r.onAbort(()=>{o.stop(),Bt(e)});try{await t({stream:r,client:o})}finally{o.stop(),e.get("resolveStreamComplete")?.()}})}async function bp(e,t,r){let{pending:o,capped:n,copilotStart:i}=r;if(n&&!await Eu(e,o,i))return function(e,t,r){let{pending:o,copilotStart:n}=r;return an(),wp(e,async r=>{let i=await Ru(e,r,{pending:o,start:n});if(i)xp(i)||(sn(),await vp(e,r,{response:i,model:t.model,copilotStart:n,_d1:_p(t,n)}));else{let t=e.get("requestId");t&&Oe.executeCompletion(t)}})}(e,t,{pending:o,copilotStart:i})}async function vp(e,t,o){r.debug("Streaming response from service");let{stream:n,client:i}=t,{events:a,span:s,release:l}=o.response,{model:c,copilotStart:u,_d1:d}=o,p=null,m=0,f=performance.now(),h=Ua(e,u),g={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{for await(let t of a){if(h(),r.debug("Raw stream event:",t),"[DONE]"===t.data)break;if(!t.data)continue;let o;try{o=JSON.parse(t.data)}catch(e){r.warn("Failed to parse streaming chunk:",t.data.slice(0,200),e);continue}if(m++,Ze.add(1,{model:c,endpoint_type:"anthropic"}),o.usage){p=o.usage;let t=e.get("requestData")||{};t.tokenUsage=Ta(p),t._d1=d,e.set("requestData",t)}let n=rp(o,g);for(let e of n)r.debug("Translated Anthropic event:",e),await i.writeSSE({event:e.type,data:JSON.stringify(e)})}let t=performance.now()-f,o={model:c,endpoint_type:"anthropic"};if(it.record(t,o),pt.record(m,o),Ha(e,u),p){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Ta(p),t._d1=d,e.set("requestData",t))}}catch(t){throw gt(s,e.get("requestSpan"),t),await Ra(n,t),t}finally{p&&Aa(s,p),s.end(),l()}let y=e.get("requestId");y&&Oe.executeCompletion(y)}async function kp(e){let t=await e.req.json();if(pp(t))return yp(e,t)??hp(e,t);await Oa(he),r.debug("Anthropic request payload:",t);let n=t.output_config?.effort,i=yp(e,t);if(i)return i;t=function(e,t){return Mu(t,he.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let a=Ed(e,t);if(!a.ok)return a.response;t=a.payload;let s=await gp(e);if(s)return s;if(Ea(t.model))return Qd(e,t,n);if(function(e){if("foundry"!==he.provider)return id(e);let t=he.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:id(e)}(t.model))return async function(e,t,r){let o="foundry"===he.provider,n=o?t:Ad(t,he.models),i={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},a=n.output_config?.effort;return e.set("requestData",{model:n.model,reasoningEffort:a,effortClamped:Pu(r,a),streaming:!!n.stream}),he.manualApprove&&await ka(),Me.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",n.model),t.setAttribute("copilot_api.streaming",!!n.stream),_u(t,n,i.anthropicBeta);try{let r=performance.now(),a=await wu(n,i,{onStructuredOutputFallback:(e,r)=>{if(o)return null;let n=np(e,r,he.models);return n&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",n.model)),n}}),s=performance.now()-r;if(nt.record(s,{model:n.model,target:"anthropic_messages",streaming:String(!!n.stream)}),!n.stream){let r=a,o=r.usage;if(o){let t={input_tokens:o.input_tokens||0,output_tokens:o.output_tokens||0,cache_read_input_tokens:o.cache_read_input_tokens||0,cache_creation_input_tokens:o.cache_creation_input_tokens||0},r=e.get("requestData")||{};r.tokenUsage=Ta(Tp(t)),r._d1=s,r.upstreamTtfbMs=s,r.upstreamTotalMs=s,e.set("requestData",r)}return t.end(),e.json(r)}let{events:l,span:c,release:u}=a;return G(e,async o=>{let i=0,a=performance.now(),s={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},d=!1,p=Ua(e,r);try{try{for await(let e of l)p(),!e.data||"[DONE]"===e.data||(i++,Ze.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),Ap(e.data,s)&&(d=!0)),await o.writeSSE(e);let e=performance.now()-a,t={model:n.model,endpoint_type:"anthropic_messages"};it.record(e,t),pt.record(i,t)}catch(t){throw gt(c,e.get("requestSpan"),t),await Ra(o,t),t}finally{if(Ha(e,r),d){let t=Tp(s);Aa(c,t);let r=e.get("requestData")||{};r.tokenUsage=Ta(t),e.set("requestData",r)}c.end(),u()}let t=e.get("requestId");t&&Oe.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw ht(t,e),t.end(),e}})}(e,t,n);let l=performance.now(),c=Me.startActiveSpan("copilot_api.translate.anthropic_to_openai",r=>{try{r.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),r.setAttribute("copilot_api.translation.message_count",t.messages.length),r.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),r.setAttribute("copilot_api.translation.has_system",!!t.system),r.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let o=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));r.setAttribute("copilot_api.translation.has_thinking",o),td(r,t.messages);let n=ad(t,he.models),i=n.messages.at(0);return od(r,{system:"system"===i?.role&&"string"==typeof i.content?i.content:"",tools:n.tools}),n}finally{r.end()}});st.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=La(c,he.models),r.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:Pu(n,u),streaming:!!c.stream});let d=performance.now();he.manualApprove&&await ka();let{pending:p,capped:m}=function(e,t){let r=t.stream?Su():void 0;return{pending:cs(t,r&&{signal:AbortSignal.any([Lt(e),r.signal])}).finally(()=>r?.clear()),capped:void 0!==r}}(e,c),f=await bp(e,c,{pending:p,capped:m,copilotStart:d});if(f)return f;let h=await p,g=_p(c,d);if(xp(h)){let t=e.get("requestData")||{};h.usage&&(t.tokenUsage=Ta(h.usage)),t._d1=g,t.upstreamTtfbMs=g,t.upstreamTotalMs=g,e.set("requestData",t),r.level>=o.debug&&r.debug("Non-streaming response:",JSON.stringify(h).slice(-400));let n=performance.now(),i=Me.startActiveSpan("copilot_api.translate.openai_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","openai_to_anthropic");let t=function(e){let t=[],r=[],o=[],n=null;n=e.choices[0]?.finish_reason??n;for(let i of e.choices){let e=_d(i.message),a=yd(i.message.content),s=wd(i.message.tool_calls);t.push(...e),r.push(...a),o.push(...s),("tool_calls"===i.finish_reason||"stop"===n)&&(n=i.finish_reason)}return{id:e.id,type:"message",role:"assistant",model:e.model,content:[...t,...r,...o],stop_reason:nd(n),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(h);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return st.record(performance.now()-n,{direction:"openai_to_anthropic"}),r.debug("Translated Anthropic response:",i),e.json(i)}return wp(e,t=>vp(e,t,{response:h,model:c.model,copilotStart:d,_d1:g}))}const xp=e=>Object.hasOwn(e,"choices");function Tp(e){let t=e.input_tokens+e.cache_read_input_tokens+e.cache_creation_input_tokens;return{prompt_tokens:t,completion_tokens:e.output_tokens,total_tokens:t+e.output_tokens,prompt_tokens_details:{cached_tokens:e.cache_read_input_tokens}}}function Ap(e,t){try{let r=JSON.parse(e);if("message_start"===r.type){let e=r.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===r.type){let e=r.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}const Sp=new B;Sp.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&pp(t)}catch{return!1}}(e)?await kp(e):await cn(e,"messages",kp)}catch(t){return await jr(e,t)}});const $p=new B;function Ep(e){return Me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let o=$a(e.model);return t.setAttribute("copilot_api.model.normalized",o),o===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ge.add(1,{from_model:e.model,to_model:o}),r.debug(`Normalized model from '${e.model}' to '${o}'`),{...e,model:o})}finally{t.end()}})}function Op(e,t){let r=function(e){try{let t=JSON.parse(e);if(("response.completed"===t.type||"response.incomplete"===t.type)&&t.response?.usage){let e=t.response.usage;return{prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens,prompt_tokens_details:e.input_tokens_details}}}catch{}return null}(e);if(!r)return;t.usageRef.value=r;let o=t.c.get("requestData")||{};o.tokenUsage=Ta(r),o._d1=t._d1,t.c.set("requestData",o)}$p.get("/",async e=>{try{he.models||await pn();let t=he.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await jr(e,t)}});const Cp=new Set(["message","function_call","function_call_output"]),Ip=new Set(["type","name","description","parameters"]);async function Rp(e){if(!e)return!1;let t=e.sources;if(t&&t.length>0)return!1;let o=e.query??e.queries?.[0];return!(!o||!up())&&(r.info(`Enriching web search: "${o}"`),e.sources=(await dp(o,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function qp(e){if(up())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Rp(e.action)}}catch(e){r.error("Failed to enrich non-streaming web search:",e)}}async function Pp(e){if(!up())return e;try{let t=JSON.parse(e);if("response.output_item.done"===t.type){let e=t.item;if("web_search_call"===e?.type&&await Rp(e.action))return JSON.stringify(t)}}catch(e){r.error("Failed to enrich web search:",e)}return e}function Np(e){switch(e.type){case"custom_tool_call":{let t=e.input;return{type:"function_call",call_id:e.call_id,name:e.name,arguments:JSON.stringify("string"==typeof t?{input:t}:t)}}case"custom_tool_call_output":return{type:"function_call_output",call_id:e.call_id,output:e.output};default:return Cp.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Mp(e,t){if("function_call"!==e.type||!t.has(e.name))return!1;if(e.type="custom_tool_call","string"==typeof e.arguments){try{e.input=JSON.parse(e.arguments).input??e.arguments}catch{e.input=e.arguments}delete e.arguments}return!0}function jp(e,t){if(0===t.size)return e;try{let r=JSON.parse(e),o=r.type;if("response.output_item.added"===o||"response.output_item.done"===o){let e=r.item;if(e&&Mp(e,t))return JSON.stringify(r)}if("response.completed"===o){let o=r.response?.output;if(!o)return e;let n=!1;for(let e of o)Mp(e,t)&&(n=!0);if(n)return JSON.stringify(r)}}catch{}return e}function Dp(e){return null!=e}function Lp(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Bp(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Fp(e){let t={model:e.model},{input:r,droppedInputTypes:o}=function(e){if(!Array.isArray(e))return{input:e,droppedInputTypes:[]};let t=new Set,r=[];for(let o of e){if(!Lp(o)){r.push(o);continue}let e=Np(o);null===e?t.add(Bp(o.type)):r.push(e)}return{input:r,droppedInputTypes:[...t]}}(e.input);void 0!==r&&(t.input=r);for(let r of["previous_response_id","prompt","conversation","instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])Dp(e[r])&&(t[r]=e[r]);let n=new Set;if(Dp(e.tools)){let r=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let r=e.type;if("web_search"===r||r.startsWith("web_search_"))return{type:e.type};let o={};for(let t of Object.keys(e))Ip.has(t)&&(o[t]=e[t]);return"custom"===o.type&&(o.type="function",t.add(o.name),o.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),o}),customToolNames:t}}(e.tools);t.tools=r.tools,n=r.customToolNames}if(Dp(e.reasoning)&&"object"==typeof e.reasoning){let r=e.reasoning;t.reasoning={},Dp(r.effort)&&(t.reasoning.effort=r.effort),Dp(r.summary)&&(t.reasoning.summary=r.summary)}if(Dp(e.text)&&"object"==typeof e.text){let r=e.text;Dp(r.format)&&(t.text={format:r.format})}return{payload:t,customToolNames:n,droppedInputTypes:o}}function Up(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Hp(e,t,r){let{payload:o,droppedInputTypes:n}=r;if(!Array.isArray(t)||!Array.isArray(o.input))return null;let i=f.getActiveSpan();return i?.setAttribute("copilot_api.responses.input_items_in",t.length),i?.setAttribute("copilot_api.responses.input_items_out",o.input.length),0===t.length||o.input.length>0||Dp(o.previous_response_id)||Dp(o.prompt)||Dp(o.conversation)?null:Up(e,`input contains no supported items: every item was dropped (unsupported item types: ${n.join(", ")}). Provide at least one message, function_call or function_call_output item, or previous_response_id, prompt or conversation.`)}async function zp(e){await Oa(he);let t=await e.req.json();if(!Lp(t))return Up(e,"request body must be a JSON object");let o=function(e){return"foundry"===he.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:Fp(e)}(t),{customToolNames:n}=o,i=o.payload;r.debug(`Responses API [${Array.isArray(i.input)?i.input.length:1} items]`),n.size>0&&r.debug(`Custom tools detected: ${[...n].join(", ")}`);let a=function(e,t){try{return{ok:!0,payload:Ep(t)}}catch(t){if(t instanceof Sa)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,i);if(!a.ok)return a.response;i=a.payload;let s=Hp(e,t.input,o);if(s)return s;let l=await xa(e);if(l)return l;e.set("requestData",{model:i.model,reasoningEffort:i.reasoning?.effort,streaming:!!i.stream}),he.manualApprove&&await ka();let c=performance.now(),u=await _s(i,{signal:Lt(e)}),d=performance.now()-c;if(nt.record(d,{model:i.model,target:"responses",streaming:String(!!i.stream)}),Jp(u))return async function(e,t,r){await qp(t);let o=e.get("requestData")||{};return t.usage&&(o.tokenUsage=Ta({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens,prompt_tokens_details:t.usage.input_tokens_details})),o._d1=r,o.upstreamTtfbMs=r,o.upstreamTotalMs=r,e.set("requestData",o),e.json(t)}(e,u,d);let{events:p,span:m,release:f}=u;return G(e,async t=>{t.onAbort(()=>Bt(e));let r={value:null},o=0,a=performance.now(),s=Ua(e,c);try{try{for await(let a of p)if(s(),a.data&&"[DONE]"!==a.data){o++;let s=jp(a.data,n);s=await Pp(s);let l=s===a.data?a:{...a,data:s};Ze.add(1,{model:i.model,endpoint_type:"responses"}),Op(s,{usageRef:r,c:e,_d1:d}),await t.writeSSE(l)}else await t.writeSSE(a);let l=performance.now()-a,u={model:i.model,endpoint_type:"responses"};it.record(l,u),pt.record(o,u),Ha(e,c)}catch(r){if(Ft(e))return;throw gt(m,e.get("requestSpan"),r),await qa(t,r),r}finally{r.value&&Aa(m,r.value),m.end(),f()}}finally{!function(e){try{let t=e.get("requestId");t&&Oe.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}(e)}})}const Jp=e=>Object.hasOwn(e,"output"),Gp=new B;Gp.post("/",async e=>{try{return await cn(e,"responses",zp)}catch(t){return await jr(e,t)}});const Kp=new B;Kp.get("/",e=>{try{return he.showToken?e.json({token:he._t1}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return r.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const Wp=new B;Wp.get("/",async e=>{try{let t=await Gn();return e.json(t)}catch(t){return r.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Yp=new B;function Vp(e,t,r){let o=function(e){if(!e)return;try{let t=JSON.parse(e),r=t.error?.message??t.message;if("string"==typeof r&&r.length>0)return Ti(r).slice(0,200)}catch{}let t=Ti(e).trim();return t.length>0?t.slice(0,200):void 0}(t),n=o?` (upstream: ${o})`:"";switch(!0){case 401===e:case 403===e:return`Authentication/entitlement failed (HTTP ${e}). Your GitHub Copilot subscription may be inactive, or the Auth token is invalid. Run \`copilot-api auth\` to re-authenticate; if it persists, this account has no active Copilot access${n}.`;case 402===e:return`Premium monthly quota exhausted (HTTP 402). Switch to a non-premium model (e.g. claude-haiku-4.5) or wait for the monthly quota reset${n}.`;case 400===e:return`Model '${r}' was rejected (HTTP 400). On individual plans only some models are entitled — try claude-haiku-4.5, or run \`copilot-api doctor\` to see what works${n}.`;case 413===e:return`Request too large (HTTP 413)${n}.`;case 429===e:return`Rate limited upstream (HTTP 429) — wait and retry${n}.`;case 503===e:return`Service not ready (HTTP 503) — the model catalog or Service token is still warming up. Retry in a few seconds${n}.`;case e>=500:return`Upstream error (HTTP ${e})${n}.`;default:return`Unexpected response (HTTP ${e})${n}.`}}async function Xp(e={}){let t=performance.now(),r=e.model&&function(e){let t=he.models?.data.find(t=>t.id===e);return void 0!==t&&Ci(t)}(e.model)?[e.model]:function(e){return e.filter(e=>Ci(e)).map((e,t)=>({id:e.id,rank:Ii(e),index:t})).sort((e,t)=>e.rank-t.rank||e.index-t.index).map(e=>e.id)}(he.models?.data??[]).slice(0,3);if(0===r.length)return{ok:!1,durationMs:0,reason:"No models available — the catalog is empty (upstream /models failed at startup). Check connectivity and authentication."};let o,n=e.timeoutMs??3e4,i=()=>Math.round(performance.now()-t),a=r[0],s=!1,l=e=>(a=e,async function(e,t){try{let r=await Yp.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[$i]:Ei},body:JSON.stringify({model:e,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(r.ok)return{ok:!0,model:e,status:r.status,durationMs:t()};let o=await r.text().catch(()=>"");return{ok:!1,model:e,status:r.status,durationMs:t(),reason:Vp(r.status,o,e),detail:o.slice(0,400)||void 0,modelUnavailable:qi(r.status,o)}}catch(r){let o=r instanceof Error?r.message:String(r);return{ok:!1,model:e,durationMs:t(),reason:`Request failed before a usable response: ${o}`,detail:o}}}(e,i)),c=(async()=>{let e=await async function(e,t,r=()=>!1){let o,n=[];for(let i of e){if(o){if(r())break;n.push(o.model)}if(o={model:i,result:await t(i)},o.result.ok||!o.result.modelUnavailable)break}return o?{result:o.result,skipped:n}:void 0}(r,l,()=>s);if(!e)throw Error("self-test had no candidate");let{modelUnavailable:t,...o}=e.result;return e.skipped.length>0?{...o,skipped:e.skipped}:o})(),u=new Promise(e=>{o=setTimeout(()=>{s=!0,e({ok:!1,model:a,durationMs:i(),reason:`Did not complete within ${n}ms. If you started with --manual, approve the request or use --no-smoke-test; otherwise the upstream may be slow or unreachable.`})},n)});try{return await Promise.race([c,u])}finally{o&&clearTimeout(o)}}Yp.use(async(e,t)=>{let o=performance.now(),n=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,i=e.req.method,a=e.req.path,s=Ut(a),l=function(e){return e===Ei}(e.req.header($i));e.set("requestId",n),e.set("isSelfTest",l),e.header("x-request-id",n);let c=Me.startSpan("copilot_api.handle_request",{kind:u.SERVER,attributes:{"http.method":i,"http.url":e.req.url,"http.route":a,"copilot_api.request_id":n,"copilot_api.endpoint_type":s}});e.set("requestSpan",c),e.set("requestTraceContext",c.spanContext()),l&&c.setAttribute("copilot_api.self_test",!0);for(let[t,r]of Object.entries(e.req.header())){let e=t.toLowerCase();_t.has(e)||"x-copilot-api-self-test"!==e&&c.setAttribute(`http.request.header.${e}`,r)}await async function(e,t){let{method:o,path:n,endpointType:i}=t;if("POST"===o&&("anthropic"===i||"openai"===i||"embeddings"===i||n.includes("/responses")))try{let t=e.req.raw.clone(),r=new Uint8Array(await t.arrayBuffer());e.set("rawBody",(new TextDecoder).decode(r.subarray(0,1048576)))}catch(e){r.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:i,path:a,endpointType:s});let m,h=new Promise(e=>{m=e});e.set("streamComplete",h),e.set("resolveStreamComplete",m);let g=f.setSpan(p.active(),c);await p.with(g,async()=>{l||Oe.registerCompletion(n,e,o);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw c.setStatus({code:d.ERROR,message:t.message}),c.recordException(t),e}});let y=e.get("requestData"),_={c:e,start:o,method:i,path:a,endpointType:s,requestId:n,span:c};(y?.streaming||y?.deferFinalize)&&e.res.status<400?h.then(()=>aa(_)).catch(e=>{r.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{c.recordException(t),c.setStatus({code:d.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{c.end()}catch{}}):aa(_)}),Yp.use(F()),Yp.use(async(e,t)=>{let r=e.req.header("content-length");if(r){let t=Number(r),o=ba(e.req.path);if(Number.isFinite(t)&&t>o)return n.warn(`Rejected oversized request: ${t} bytes on ${e.req.path} (UA: ${e.req.header("user-agent")??"unknown"})`),wa(e.req.raw,o,t)||e.header("Connection","close"),e.json({type:"error",error:{type:"request_too_large",message:`Request body exceeds ${o/1024/1024} MB limit (got ${t} bytes).`}},413)}await t()}),Yp.get("/",e=>e.text("Server running")),Yp.route("/health",Qs),Yp.route("/chat/completions",zs),Yp.route("/models",$p),Yp.route("/embeddings",Zs),Yp.route("/usage",Wp),Yp.route("/token",Kp),Yp.route("/v1/chat/completions",zs),Yp.route("/v1/models",$p),Yp.route("/v1/embeddings",Zs),Yp.route("/images",Dc),Yp.route("/v1/images",Dc),Yp.route("/v1/messages",Sp),Yp.post("/v1/messages/count_tokens",async function(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:"invalid_request_error",message:"Invalid JSON"}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let{name:r,tokenizer:o}=await async function(e){let t=he.models?.data.find(t=>t.id===e);return!t||"Anthropic"===t.vendor||_o(t.capabilities.family)||"o200k_base"!==t.capabilities.tokenizer?{name:"claude",tokenizer:cu}:(uu??=import("ai-tokenizer/encoding/o200k_base").then(e=>new Y(e)),{name:"o200k_base",tokenizer:await uu})}(t.model),n=e=>pu(o,e),i=du.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");i+=du.perMessage+n(e)*du.contentMultiplier}for(let e of t.messages)i+=du.perMessage,i+=n(e.role),"string"==typeof e.content?i+=n(e.content)*du.contentMultiplier:Array.isArray(e.content)&&(i+=mu(e.content,n));let a=t.tools?.filter(lu);a&&a.length>0&&(i+=function(e,t){let r=du.toolsExist;for(let[o,n]of e.entries())o>0&&(r+=du.perTool),r+=t(n.name),n.description&&(r+=du.perDesc+t(n.description)),r+=fu(n.input_schema,t);return r}(a,n));let s=Math.round(i);"string"==typeof t.model&&e.set("requestData",{model:t.model,streaming:!1});let l=e.get("requestSpan");return l?.setAttribute("copilot_api.count_tokens.estimate",s),l?.setAttribute("copilot_api.count_tokens.tokenizer",r),e.json({input_tokens:s})}),Yp.route("/v1/responses",Gp),Yp.route("/responses",Gp),Yp.route("/v1/decisions",Vs),Yp.route("/decisions",Vs),Yp.onError((e,t)=>jr(t,e));const Zp=e=>`${e}`,Qp=e=>`${e}`,em=e=>`${e}`,tm=e=>`${e}`,rm=e=>`${e}`,om=Qp(" ─────────────────────────────────────────────────────────────");function nm(e,t,r){console.log(` ${function(e){return"ok"===e?em("✓"):"warn"===e?rm("⚠"):tm("✗")}(e)} ${Zp(t.padEnd(14))} ${r}`)}function im(e){console.log(` ${Qp("↳")} ${Qp(e)}`)}function am(e){return e instanceof mr?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function sm(){let e=_.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await i.readFile(re.GITHUB_TOKEN_PATH,"utf8")).trim();return e.length>0?e:void 0}catch{return}}();return t?{token:t,source:"stored file"}:void 0}async function lm(){try{await pn();let e=(he.models?.data.length??0)>0;return nm(e?"ok":"warn","Model catalog",e?function(){let e=he.models?.data??[],t={Claude:0,OpenAI:0,Gemini:0,Embedding:0};for(let r of e)r.id.startsWith("text-embedding")?t.Embedding++:"Anthropic"===r.vendor?t.Claude++:"Google"===r.vendor?t.Gemini++:t.OpenAI++;let r=Object.entries(t).filter(([,e])=>e>0).map(([e,t])=>`${e}: ${t}`);return`${e.length} models (${r.join(", ")})`}():"empty"),e}catch(e){return nm("fail","Model catalog",am(e)),im("Could not fetch /models — check connectivity/auth."),!1}}async function cm(e){he.accountType=e.accountType;let t=await er(),r=tr();if(console.log(""),console.log(` ${Zp("COPILOT-API DOCTOR")} ${Qp(`v${t}`)}`),console.log(om),nm("ok","Runtime",`${r.name} ${r.version} (${r.platform}-${r.arch})`),await oe(),mn(),!await async function(){let e=await sm();if(e){he._t2=e.token,nm("ok","Auth token",`found (${e.source})`);try{let e=await Lr();return await Et(he,e.login),nm("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return nm("fail","GitHub auth",am(e)),void im("Token looks invalid/expired. Re-run `copilot-api auth`.")}}else nm("fail","Auth token","not found"),im("Run `copilot-api auth` (or `copilot-api start`) to authenticate.")}())return console.log(om),console.log(` ${tm("✗")} ${Zp("Authentication failed")} — cannot continue.`),console.log(""),1;let o=await async function(){try{let{token:e}=await Dr();return he._t1=e,nm("ok","Service token","acquired"),!0}catch(e){let t=e instanceof mr?e.response.status:0;return nm("fail","Service token",am(e)),im(401===t?"Auth token is invalid/expired — run `copilot-api auth`.":403===t?"No active GitHub Copilot subscription on this account. Re-auth won't help.":"Transient/network issue — check connectivity and retry."),!1}}(),n=!!o&&await lm();await async function(){try{let e=await Gn(),t=e.quota_snapshots.premium_interactions,r=t.unlimited?"credits unlimited":`credits ${Bn(Fn(t))} of ${Bn(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;nm("ok","Copilot plan",`${e.copilot_plan} · ${r} `+Qp(`(resets ${e.quota_reset_date})`))}catch(e){nm("warn","Copilot plan",`unavailable (${am(e)})`)}}();let i=!1;return o&&n?i=await async function(){let e=await Xp();return e.ok?(nm("ok","Generation",`works via ${e.model} ${Qp(`(${e.durationMs}ms)`)}`),!0):(nm("fail","Generation",`${e.reason}${e.status?Qp(` [HTTP ${e.status}]`):""}`),!1)}():nm("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let r of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let o=_.env[r];o&&("ANTHROPIC_BASE_URL"===r&&/\/v1\/*$/.test(o)&&(t="warn",e.push(`${r}=${o} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(o)&&(t="warn",e.push(`${r}=${o} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){nm(t,"Client config","potential base-URL issue");for(let t of e)im(t)}else nm("ok","Client config","no base-URL issues detected");im("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(om),i?(console.log(` ${em("✓")} ${Zp("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${rm("⚠")} ${Zp("Some checks need attention")} — see the ${tm("✗")}/${rm("⚠")} lines above.`),console.log(""),2)}const um=e({meta:{name:"doctor",description:"Diagnose your setup end-to-end: token, auth, entitlement, model catalog, and one real generation. Tells you exactly what's wrong and how to fix it."},args:{"account-type":{alias:"a",type:"string",default:"individual",description:"Account type to check against (individual, business, enterprise)"}},async run({args:e}){let t=await cm({accountType:e["account-type"]});_.exit(t)}});function dm(e){return{log(t,n){let i=r.level>=o.debug;if(t.level!==o.warn||i)for(let r of e)r.log(t,n)}}}let pm=!1;const mm="copilot-api-node20",fm=`https://registry.npmjs.org/${mm}/latest`,hm=e=>`${e}`,gm=e=>`${e}`;async function ym(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(fm,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function _m(e,t){let r=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(r)}let wm,bm;async function vm(e){try{let[t,r]=await Promise.all([er(),ym(e)]);return"unknown"!==t&&r&&function(e,t){let r=e.split(".").map(Number),o=t.split(".").map(Number),n=Math.max(r.length,o.length);for(let e=0;e<n;e++){let t=r[e]??0,n=o[e]??0;if(t<n)return!0;if(t>n)return!1}return!1}(t,r)?{current:t,latest:r}:null}catch{return null}}function km(){if(!wm||!bm)return;let{signal:e}=bm;wm.then(t=>{t&&!e.aborted&&function(e,t){let r=`npx ${mm}@latest`,o=gm("│"),n=` ${hm("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,i=` Run ${hm(r)} to update`,a=" ".repeat(54),s=gm(`╭${"─".repeat(54)}╮`),l=gm(`╰${"─".repeat(54)}╯`),c=["",s,`${o}${a}${o}`,`${o}${_m(n,54)}${o}`,`${o}${a}${o}`,`${o}${_m(i,54)}${o}`,`${o}${a}${o}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var xm={posts:[{title:"I Almost Bought an AI Code Reviewer. Then I Did the Math.",teaser:"100+ repos. Every PR reviewed by AI. Under $1K a month.",url:"https://barazany.dev/blog/claude-code-pr-reviewer",date:"2026-06-09"},{title:"I Had Claude Mine 30 Days of My Own Messages. What It Found Was Uncomfortably Accurate.",teaser:"I had Claude read a month of my messages. It nailed me.",url:"https://barazany.dev/blog/mining-claude-history-ultracode",date:"2026-06-05"},{title:"The 5-Hour Quota, Boris's Tweet, and What the Source Code Actually Reveals",teaser:"Claude Code's caching story — decoded from the source.",url:"https://barazany.dev/blog/claude-code-token-caching",date:"2026-04-01"}]};const Tm=262144,Am="https://barazany.dev",Sm=/^[a-z0-9][a-z0-9-]*$/i,$m=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function Em(e,t){if("string"!=typeof e)return"";let r=e.replaceAll($m," ").replaceAll(/\s+/g," ").trim(),o=Array.from(r);return o.length<=t?r:`${o.slice(0,t-1).join("").trimEnd()}…`}function Om(e){if("object"!=typeof e||!e)return null;let t=e,r=Em(t.title,100),o=Em(t.teaser??t.excerpt??t.description,120),n=function(e){if("string"!=typeof e||e.length>2048)return null;let t;try{t=new URL(e)}catch{return null}if(t.origin!==Am||t.username||t.password)return null;let r=t.href;return/^[\x21-\x7E]+$/.test(r)?r:null}(t.url);if(null===n&&void 0===t.url&&"string"==typeof t.slug&&Sm.test(t.slug)&&(n=`${Am}/blog/${t.slug}`),!r||!o||null===n)return null;let i=function(e){if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e))return Number.isFinite(Date.parse(e))?e.slice(0,10):void 0}(t.date);return i?{title:r,teaser:o,url:n,date:i}:{title:r,teaser:o,url:n}}function Cm(e){let t=e;if(!Array.isArray(e)&&"object"==typeof e&&e&&(t=e.posts),!Array.isArray(t))return[];let r=[];for(let e of t){let t=Om(e);t&&r.push(t)}let o=e=>e.date?Date.parse(e.date):-1/0;return r.sort((e,t)=>o(t)-o(e)).slice(0,3)}let Im=null;function Rm(e){return s.join(e,"blog-posts.json")}function qm(e=re.APP_DIR){try{if(Im&&Im.length>0)return Im;let t=function(e){try{let t=Rm(e);return H.statSync(t).size>Tm?[]:Cm(JSON.parse(H.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Cm(xm)}catch{return[]}}function Pm(e){return e>-6e4&&e<864e5}async function Nm(e){let t=new AbortController,r=setTimeout(()=>t.abort(),e);"object"==typeof r&&"unref"in r&&r.unref();try{let e=await fetch("https://barazany.dev/posts.json",{signal:t.signal,headers:{accept:"application/json"}});if(!e.ok)return await(e.body?.cancel().catch(()=>{})),[];let r=await async function(e,t){let r=Number(e.headers.get("content-length"));if(Number.isFinite(r)&&r>Tm)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>Tm?null:t}let o=e.body.getReader(),n=()=>{o.cancel().catch(()=>{})};t.addEventListener("abort",n,{once:!0});let i=[],a=0;try{for(;;){let{done:e,value:t}=await o.read();if(e)break;if(a+=t.byteLength,a>Tm)return await o.cancel().catch(()=>{}),null;i.push(t)}}finally{t.removeEventListener("abort",n)}return t.aborted?null:Buffer.concat(i).toString("utf8")}(e,t.signal);return null===r?[]:Cm(JSON.parse(r))}finally{clearTimeout(r)}}async function Mm(e={}){try{if("1"===_.env.COPILOT_API_NO_BLOG||"1"===_.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??re.APP_DIR,r=e.now??Date.now();if(await async function(e,t){try{let r=Rm(e),o=await H.promises.stat(r);if(o.size<=Tm){let e=await H.promises.readFile(r),o=JSON.parse(e.toString("utf8"));if("number"==typeof o.fetchedAt)return Pm(t-o.fetchedAt)}return Pm(t-o.mtimeMs)}catch{return!1}}(t,r))return;let o=await Nm(e.timeoutMs??3e3);if(0===o.length)return;Im=o,await async function(e,t,r){let o=Rm(e),n=`${o}.${_.pid}.tmp`;try{await H.promises.writeFile(n,`${JSON.stringify({fetchedAt:r,posts:t})}\n`),await H.promises.rename(n,o)}catch(e){throw await H.promises.rm(n,{force:!0}).catch(()=>{}),e}}(t,o,r)}catch(e){r.debug("Blog posts refresh skipped:",e)}}async function jm(e){let t;try{({login:t}=await Dm(e))}catch(e){return void r.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await Fo(),r.info("Copilot fallback enabled for Foundry rate limits, errors and timeouts")}catch(e){r.error("Copilot fallback disabled: could not load the Copilot model list; serving from Foundry only.",e)}return t}async function Dm(e){e._t2&&r.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let t,o=e._t2||process.env.GH_TOKEN;o?(function(e){he._t2=e,kn=!1}(o),r.info("Using provided Auth token")):await Rn();try{t=await Lr(),await Et(he,t.login)}catch(e){throw r.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}return await(async()=>{let{token:e,refresh_in:t}=await Dr();he._t1=e,r.debug("Service token fetched successfully!"),he.showToken&&r.info("Service token:",e),vn=!0,In(t),kt.start(),yn=()=>{r.debug("Network connectivity restored, attempting immediate token refresh"),On(3,500,"network-restored").catch(e=>{r.error("Unexpected error in network-restored token refresh:",e)})},_n=()=>{r.debug("Network connectivity lost")},kt.on("online",yn),kt.on("offline",_n)})(),t}function Lm(e,t=""){let r,o=function(){let{platform:e,ppid:t,env:r}=_;if("win32"===e){try{if(y(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=r.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),n=Object.entries(e).filter(([,e])=>void 0!==e);switch(o){case"powershell":r=n.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":r=n.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":r=n.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=n.map(([e,t])=>`${e}=${t}`).join(" ");r=n.length>0?`export ${e}`:"";break}}return r&&t?`${r}${"cmd"===o?" & ":" && "}${t}`:r||t}function Bm(e,t){return{version:t.version,port:e.port,accountType:e.accountType,verbose:e.verbose,manualApprove:e.manual,rateLimitSeconds:e.rateLimit??0,rateLimitWait:e.rateLimitWait,timeoutMs:e.timeout,showToken:e.showToken,_cc1:e._cc1,model:e.model,smallModel:e.smallModel,_t3:t._t3,provider:e.provider,fallback:e.fallback,foundryAuth:t.foundryAuth}}const Fm=e=>`${e}`,Um=e=>`${e}`,Hm=e=>`${e}`,zm=e=>`${e}`,Jm=e=>`${e}`,Gm=e=>`${e}`,Km=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Wm="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Ym="https://github.com/johnib/copilot-api-issues/issues",Vm=Um(" ─────────────────────────────────────────────────────────────");function Xm(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Zm(e){return e&&0!==e.length?e.join("·"):"—"}function Qm(e){if(0===e.length)return[];let t=["",Vm,` ${Fm("BARAZANY.DEV")} ${Um("— Recent Posts")}`,Vm,""];for(let[r,o]of e.entries()){let e=`${o.url}${Wm}`,n=Km(e,Fm(Gm(`[${r+1}]`)));t.push(` ${n} ${Hm(o.title)}`,` ${Um("→")} ${Um(o.teaser)}`,"")}return t.push(Vm,` ${Km(`https://barazany.dev/blog${Wm}`,"barazany.dev/blog")}`,Vm),t}function ef(e){let t=[];he.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):he.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let r=e.webSearchProviders.length>0?`${e.webSearchProviders.map(e=>(e=>e&&e[0].toUpperCase()+e.slice(1))(e)).join(Um(" → "))} ${zm("✓")}`:Um("off"),o=["",` ${Fm("COPILOT-API")} ${Um(`v${e.version}`)}`,Vm,` ${Um("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Um("User")} ${e.user} ${Um("·")} ${e.accountType}`];return he._v1&&o.push(` ${Um("Client")} VSCode ${he._v1}`),o.push(` ${Um("Network")} ${t.join(Um(" · "))}`,` ${Um("Search")} ${r}`),e.clipboardCopied&&o.push(` ${Um("Clipboard")} Claude Code command ${zm("✓")}`),o.push(Vm),o}function tf(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Fm("Active")}`];if(e.model){let r=he.models?.data.find(t=>t.id===e.model),o=Xm(r?.capabilities.limits?.max_context_window_tokens),n=Zm(r?.capabilities.supports.reasoning_effort);t.push(` ${Hm(e.model.padEnd(32))} ${Um("ctx")} ${Fm(o.padStart(5))} ${Um("effort")} ${Um(n)} ${Jm("← main")}`)}if(e.smallModel){let r=he.models?.data.find(t=>t.id===e.smallModel),o=Xm(r?.capabilities.limits?.max_context_window_tokens),n=Zm(r?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Um("ctx")} ${o.padStart(5)} ${Um("effort")} ${Um(n)} ${Jm("← small")}`)}return t}function rf(e){let t=[];for(let[r,o]of function(){let e=[],t=[],r=[],o=[];for(let n of he.models?.data??[]){let i=n.capabilities.limits?.max_context_window_tokens,a={id:n.id,ctx:i,effort:n.capabilities.supports.reasoning_effort};n.id.startsWith("text-embedding")?o.push(a):"Anthropic"===n.vendor?e.push(a):"Google"===n.vendor?r.push(a):t.push(a)}return[["Claude",e],["OpenAI",t],["Gemini",r],["Embedding",o]]}())if(0!==o.length){t.push("",` ${Fm(r)}`);for(let n of o){let o=n.id===e.model||n.id===e.smallModel,i=o?Hm("●"):Um("·"),a=o?Hm(n.id.padEnd(34)):n.id.padEnd(34),s=n.ctx?Xm(n.ctx).padStart(5):"".padStart(5),l="Embedding"===r?"":` ${Zm(n.effort)}`;t.push(` ${i} ${a} ${Um(s)}${Um(l)}`)}}return t}function of(){let e=Ym.replace(/^https:\/\//,""),t=Km(`${Ym}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Vm,` ${Fm("FOUND A BUG?")} ${Um("— Report it on GitHub")}`,Vm,"",` ${Hm("→")} ${Hm(t)}`,` ${Um("Bug reports, feature requests, and questions welcome.")}`,"",Vm]}function nf(e){if(!e.endpoints)return[];let{scheme:t,port:r,hostname:o}=e.endpoints,n=o?`${t}://${o}:${r}`:`${t}://<your-tailscale-hostname>:${r}`,i=["",Vm,` ${Fm("Claude Cowork")} ${Um("— Settings → Inference Provider")}`,Vm,"",` ${Um("Paste into")} ${Fm("inferenceGatewayBaseUrl")}${Um(":")}`,` ${Fm(Hm(n))}`];return o||i.push("",` ${Um("Your Tailscale hostname is shown by:")} ${Hm("tailscale status --self")}`),i.push("",` ${Um("Docs:")} ${Hm("https://claude.com/docs/cowork/3p/installation")}`),i}function af(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,r=["",Vm,` ${Fm("HTTPS")} ${Um("— self-signed cert")}`,Vm,"",` ${Um("Cert")} ${t}`];switch(r.push("",` ${Fm("Trust this cert")} ${Um("(one-time setup)")}`),_.platform){case"darwin":r.push(` ${Um("macOS:")}`,` ${Hm("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Hm(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":r.push(` ${Um("Windows (PowerShell as Administrator):")}`,` ${Hm(`Import-Certificate -FilePath "${t}" \``)}`,` ${Hm("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":r.push(` ${Um("Linux (Debian/Ubuntu):")}`,` ${Hm(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Hm("sudo update-ca-certificates")}`,` ${Um("Linux (Fedora/RHEL/Arch):")}`,` ${Hm(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Hm("sudo update-ca-trust")}`);break;default:r.push(` ${Um("(Unknown platform — see Node fallback below.)")}`)}return r.push("",` ${Um("Or, for Node CLIs only (no admin needed):")}`,` ${Hm(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Vm),r}function sf(e){let t=Math.floor(e/1e3),r=Math.floor(t/3600),o=Math.floor(t%3600/60);return r>0?`${r}h ${o}m`:o>0?`${o}m`:`${t}s`}async function lf(e,t){let r=yt({config:t,startupStage:"upstream_auth"},"copilot_api"),o=Me.startSpan("copilot_api.server.startup_failed",{kind:u.INTERNAL,attributes:r}),n=function(e){let t=new Set,r=e;for(let e=0;e<=4;e++){if(!(r instanceof Error)||t.has(r))return;if(r instanceof mr)return r;t.add(r),r=wr(r)}}(e);n&&(o.setAttribute("http.response.status_code",n.response.status),o.setAttribute("url.full",n.response.url)),ht(o,e),o.end();let i=e instanceof Error?e.message:String(e);ft(w.ERROR,"ERROR","Server startup failed",{...r,"exception.message":Wt(n&&n!==e?`${i} (cause: ${n.message})`:i)}),await Ne()}const cf=s.join(re.APP_DIR,"certs"),uf=s.join(cf,"cert.pem"),df=s.join(cf,"key.pem"),pf=s.join(cf,"cert.meta.json");async function mf(e){try{return await i.readFile(e,"utf8")}catch{return}}async function ff(e){let t=await mf(uf),r=await mf(df),o=await async function(){let e=await mf(pf);if(e)try{let t=JSON.parse(e);return Array.isArray(t.hosts)&&"string"==typeof t.notAfter?t:void 0}catch{return}}();if(!t||!r||!o)return!1;let n=new Set(o.hosts);for(let t of e)if(!n.has(t))return!1;let i=Date.parse(o.notAfter);return!Number.isNaN(i)&&i-Date.now()>2592e6}function hf(e){return 0!==Q(e)}async function gf(e){await i.mkdir(cf,{recursive:!0});let t=new Date,r=new Date;r.setDate(r.getDate()+825);let o=["127.0.0.1","::1"],n=new Set(["localhost"]),a=new Set(o);for(let t of e)hf(t)?a.add(t):n.add(t);let s=[...[...n].map(e=>({type:2,value:e})),...[...a].map(e=>({type:7,ip:e}))],l=await ee([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:r,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:s}]});return await i.writeFile(uf,l.cert,{mode:420}),await i.writeFile(df,l.private,{mode:384}),await async function(e){await i.writeFile(pf,JSON.stringify(e,null,2),{mode:420})}({hosts:[...n,...a].sort(),notAfter:r.toISOString()}),{cert:l.cert,key:l.private,certPath:uf,keyPath:df,generated:!0}}const yf=[],_f=Date.now();let wf="";function bf(){let e=async(e,t=0)=>{let o=Me.startSpan("copilot_api.server.shutdown",{kind:u.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-_f)/1e3}});for(let t of yf)try{await t()}catch(e){r.error("Error during cleanup:",e)}o.end(),function(e,t){let r=Km("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),o=["",Vm,` ${Fm("COPILOT-API")} ${Um(`v${e}`)} ${Um("·")} ${sf(t)} uptime`,Vm,""," Check in from time to time on",` ${Hm(r)}`,"",Vm,""];console.log(o.join("\n"))}(wf,Date.now()-_f),_.exit(t)};_.on("SIGINT",()=>e("SIGINT")),_.on("SIGTERM",()=>e("SIGTERM")),_.on("uncaughtException",t=>{r.error("Uncaught exception:",t),e("uncaughtException",1)}),_.on("unhandledRejection",(t,o)=>{r.error("Unhandled promise rejection at:",o,"reason:",t),e("unhandledRejection",1)})}const vf=e=>e.filter(e=>So(e)).map(e=>e.id),kf=e=>e.filter(e=>$o(e)).map(e=>e.id);async function xf(e,t,o){if(!e._cc1)return!1;he.models||(r.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),_.exit(1));let n,i,a=function(e,t,o){if(e&&t){if(!o.includes(e))throw r.info(`Available services: \n${o.join("\n")}`),Error(`Invalid model: ${e}`);if(!o.includes(t))throw r.info(`Available services: \n${o.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,vf(he.models.data));a?(n=a.model,i=a.smallModel):(n=await r.prompt("Select a model to use",{type:"select",options:vf(he.models.data)}),i=await r.prompt("Select a small model to use",{type:"select",options:vf(he.models.data)}));let s=Lm({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:n,ANTHROPIC_SMALL_FAST_MODEL:i,NODE_EXTRA_CA_CERTS:o?.certPath},"claude");try{return h.writeSync(s),!0}catch{return r.warn("Failed to copy to clipboard. Here is the command:"),r.log(s),!1}}function Tf(e){return e._t2?"cli_arg":_.env.GH_TOKEN?"env_var":"stored"}function Af(e){let{options:t,version:r,runtime:o,_u1:n}=e,i=Me.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:yt({config:Bm(t,{version:r,_t3:Tf(t),foundryAuth:he.foundry?.auth}),runtime:o,identity:{_u1:n.login,machineId:he.machineId,sessionId:he.sessionId,_v1:he._v1},connectivity:he.connectivity,modelsCount:he.models?.data.length??0,startupDurationMs:Date.now()-_f},"copilot_api")});if(he.models?.data)for(let e of he.models.data)i.addEvent("copilot_api.model.available",yt(e,"model"));i.end(),ft(w.INFO,"INFO","Server started",yt({version:r,port:t.port,accountType:t.accountType,_u1:n.login,modelsCount:he.models?.data.length??0,startupDurationMs:Date.now()-_f},"copilot_api"))}async function Sf(e,t){try{return await async function(e){return"foundry"===e.provider?(he.foundry=oo(process.env),he.connectivity.h2=!1,he.connectivity.h2Keepalive=!1,"entra"===he.foundry.auth&&await Yr(he.foundry),r.info(`Using Microsoft Foundry upstream: ${he.foundry.endpoint} (${"entra"===he.foundry.auth?"Entra ID":"API key"} auth)`),{login:("copilot"===e.fallback?await jm(e):void 0)??"foundry"}):Dm(e)}(e)}catch(r){throw await lf(r,{version:t,provider:e.provider,accountType:e.accountType,_t3:Tf(e)}),r}}async function $f(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[r,o]=await Promise.all([i.readFile(e,"utf8"),i.readFile(t,"utf8")]);return{cert:r,key:o,certPath:e,keyPath:t,generated:!1}}(e.httpsCert,e.httpsKey);if(e.httpsCert||e.httpsKey)throw Error("Both --https-cert and --https-key must be provided together");return async function(e=[]){if(await ff(e)){let e=await mf(uf),t=await mf(df);if(e&&t)return{cert:e,key:t,certPath:uf,keyPath:df,generated:!1}}return r.info("Generating new self-signed TLS certificate…"),gf(e)}(e.httpsHosts)}}async function Ef(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:o}=mi;try{z(t),z(o)}catch{throw r.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:o}}(e);if(bf(),yf.push(()=>{r.debug("Cleaning up connectivity monitor"),kt.stop()},()=>{r.debug("Cleaning up token management"),r.debug("Cleaning up token management"),vn=!1,hn&&=void clearInterval(hn),yn&&=void kt.off("online",yn),_n&&=void kt.off("offline",_n),gn=void 0,wn=void 0},async()=>{r.debug("Cleaning up HTTP/2 client"),await async function(){r.debug("Stopping HTTP/2 pool"),Wa&&=void clearInterval(Wa),Ya&&=void clearInterval(Ya);let e=[...Ja.keys(),...Ga];Ja.clear(),Ga.clear(),za.clear(),Ka=void 0;for(let t of e)Va(t)&&(tt.add(1,{event:"closed"}),await t.close())}()},async()=>{r.debug("Shutting down OTel SDK"),await Ne()}),t.verbose&&(r.level=5,r.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");he.provider=t.provider,he.accountType=t.accountType,he.manualApprove=t.manual,he.rateLimitSeconds=t.rateLimit,he.rateLimitWait=t.rateLimitWait,he.showToken=t.showToken,he.timeoutMs=t.timeout,he.connectivity.timeoutMs=t.connectTimeout,he.webSearchProviders=t.webSearchProviders,he.errorReporting=function(e){let t=_.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===_.env.COPILOT_H2_KEEPALIVE||"true"===_.env.COPILOT_H2_KEEPALIVE,t=e||"1"===_.env.COPILOT_H2||"true"===_.env.COPILOT_H2;he.connectivity.h2=t,he.connectivity.h2Keepalive=e}(),await oe(),Mm().catch(()=>{}),mn();let o=await er();wf=o;let n=tr();!function(e,t){t&&(Re=t),Ie=crypto.randomUUID();let r=T({[O]:"copilot-api",[C]:e,[E]:Ie}),{endpoint:o,headers:n}=Pe();Ce=new $({resource:r,traceExporter:new x({url:`${o}/v1/traces`,headers:n}),metricReader:new S({exporter:new k({url:`${o}/v1/metrics`,headers:n}),exportIntervalMillis:15e3}),logRecordProcessors:[new A({exporter:new v({url:`${o}/v1/logs`,headers:n})})],instrumentations:[]}),Ce.start()}(o,_f);let i=await Sf(t,o);await async function(){try{return await pn({refreshFallback:!1}),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,o=e instanceof Error?e.message:"Unknown error occurred",n=void 0===t?"":` (HTTP ${t})`,i="foundry"===he.provider?"Foundry":"Copilot";return r.warn(`Could not fetch model list from ${i}${n}: ${o}. This is likely a transient network or authentication issue. The proxy will start anyway; model listing endpoints may return empty until the cache is populated.`),!1}}()||function(e){let t=setTimeout(()=>{pn().then(()=>{r.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let a=function(e=18e5){let t=setInterval(()=>{pn().then(()=>r.debug("Model list refreshed successfully")).catch(e=>{r.warn("Failed to refresh model list; keeping existing cache:",e)})},e);return t.unref(),()=>{clearInterval(t)}}();yf.push(()=>{r.debug("Cleaning up model refresh interval"),a()}),he.connectivity.h2&&(Qa(Za(Ot(he))),he.connectivity.h2Keepalive&&ts()),Af({options:t,version:o,runtime:n,_u1:i});let s=await $f(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await xf(t,c,s)||await async function(e,t,o){if(!e.codex)return!1;let n;if(he.models||(r.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),_.exit(1)),e.model){let t=kf(he.models.data);if(!t.includes(e.model))throw r.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);n=e.model}else n=await r.prompt("Select a model to use with Codex CLI",{type:"select",options:kf(he.models.data)});let i=Lm({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:o?.certPath},`codex --model ${n}`);try{return h.writeSync(i),!0}catch{return r.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),r.log(i),!1}}(t,c,s);(function(e){let t=[...ef(e),...tf(e),...rf(e),...of(),"",...Qm(qm()),...nf(e),...af(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:r,runtime:o,user:n,clipboardCopied:i,tls:a}=e,s=a?"https":"http";return{version:r,runtime:o,user:n,accountType:t.accountType,port:t.port,timeout:t.timeout,webSearchProviders:t.webSearchProviders.map(e=>e.name),model:t.model,smallModel:t.smallModel,clipboardCopied:i,https:a?{certPath:a.certPath,keyPath:a.keyPath,generated:a.generated,selfSigned:!t.httpsCert}:void 0,endpoints:t.claudeCowork?{scheme:s,port:t.port,hostname:await ti()}:void 0}}({options:t,version:o,runtime:n,user:i.login,clipboardCopied:u,tls:s})),km(),Z({fetch:Yp.fetch,port:t.port,hostname:t.hostname,tls:s?{cert:s.cert,key:s.key}:void 0,bun:{idleTimeout:255}}),function(e,t,o){r.info(`Server listening on ${e}://${t}:${o}`)}(l,t.hostname,t.port),t.smokeTest&&"copilot"===t.provider&&await async function(e,t,o){try{r.start("Running first-run self-test (one tiny generation)…");let n=await Xp({model:t});if(n.ok){let t=void 0===o||["::1","127.0.0.1","localhost"].includes(o)?`Point your client at ${e}`:`Point your client at ${e} — you bound ${o}, so from another machine/container replace \`localhost\` with this host's reachable IP/hostname.`;return r.success(`Self-test passed — generation works via ${n.model} (${n.durationMs}ms). ${t}`),void(n.skipped&&r.info(` Skipped models this account cannot use: ${n.skipped.join(", ")}`))}let i=n.status?` (HTTP ${n.status})`:"";r.warn(`Self-test FAILED${i}: ${n.reason??"unknown error"}`),n.detail&&r.info(` detail: ${Ti(n.detail)}`),r.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){r.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(c,t.smallModel??t.model,t.hostname)}function Of(e,t){let r=Number.parseInt(e,10);if(Number.isNaN(r))throw Error(`${t} must be a number, got: "${e}"`);return r}const Cf=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT, plus FOUNDRY_API_KEY or an Entra ID login such as az login). Overrides COPILOT_API_PROVIDER.'},fallback:{type:"string",description:'With --provider foundry: "copilot" answers from GitHub Copilot when Foundry rate-limits, fails or times out (and, for Claude Code on an OpenAI deployment, when a Foundry stream fails before any output), and keeps that model on Copilot for Foundry\'s retry-after, or initially 10 s without one. Overrides COPILOT_API_FALLBACK.'},port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},"error-reporting":{type:"boolean",default:!0,description:"Send anonymous, sanitized error reports to the maintainer to help fix bugs (no prompts, completions, or tokens). Use --no-error-reporting or COPILOT_API_ERROR_REPORTING=0 to disable."},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"[DEPRECATED — set the TAVILY_API_KEY env var instead] Tavily API key for web search."},"web-search-provider":{type:"string",description:'Web search failover order, e.g. "exa,tavily" (first = primary, rest = fallbacks). Web search turns on when TAVILY_API_KEY and/or EXA_API_KEY are set; this flag is optional and only orders the providers you configured.'},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"},"smoke-test":{type:"boolean",default:!0,description:"After startup, run one tiny self-test generation to verify the proxy works end-to-end and print a clear PASS/FAIL. Disable with --no-smoke-test (or COPILOT_API_NO_SMOKE_TEST=1)."}},run({args:e}){let t=e["rate-limit"],o=void 0===t?void 0:Of(t,"--rate-limit"),n=e.timeout,i=void 0===n?fe:Of(n,"--timeout"),a=function(e,t){let r=e??t,o=void 0===r?15e3:Of(r,"--connect-timeout");if(o<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${o}`);return o}(e["connect-timeout"],_.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??_.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&r.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let d=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},o=(e.order??[]).map(e=>e.toLowerCase());for(let e of o)if(!cp(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${lp.join(", ")}`);let n=o.length>0?o:lp,i=new Set,a=o.length>0,s=[];for(let e of n){if(!cp(e)||i.has(e))continue;i.add(e);let o=t[e];o?s.push({name:e,key:o}):a&&r.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||_.env.TAVILY_API_KEY,exaApiKey:_.env.EXA_API_KEY,order:u}),p=(_.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==p&&"0"!==p&&"false"!==p,f=function(e,t){let r=(e??t??"copilot").trim().toLowerCase();if("copilot"===r||"foundry"===r)return r;throw Error(`--provider must be "copilot" or "foundry", got: "${r}"`)}(e.provider,_.env.COPILOT_API_PROVIDER);return Ef({provider:f,fallback:Bo(e.fallback,_.env.COPILOT_API_FALLBACK,f),port:Of(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:o,rateLimitWait:e.wait,_t2:e["github-token"],_cc1:e["claude-code"],codex:e.codex,model:e.model,smallModel:e["small-model"],showToken:e["show-token"],timeout:i,connectTimeout:a,webSearchProviders:d,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!m})}});pm||(pm=!0,r.setReporters([dm(r.options.reporters)]));const If=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(wm||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;bm=e,wm=vm(e).catch(()=>null)})(),If||km();const Rf=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Nn,start:Cf,"check-usage":Vn,debug:nr,doctor:um,"cowork-setup":ki}});await t(Rf),If||(bm?.abort(),bm=void 0,wm=void 0);export{};