copilot-api-node20 0.47.3 → 0.47.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.mjs +1 -1
  2. package/package.json +1 -1
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 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 A}from"@opentelemetry/resources";import{BatchLogRecordProcessor as T}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 I}from"@opentelemetry/semantic-conventions";import{Client as C,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(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 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:()=>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)},Ae=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)}`},Te=(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),Ae(e.tokenUsage),Te(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 Ie,Ce,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(!Ie)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([Ie.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"}),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"}),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 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: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:a,body:i,signal:s,extraAttributes:l}=e,c=Me.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: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:a,body:i,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",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: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"}),At="0.48.1",Tt=`copilot-chat/${At}`,St=`GitHubCopilotChat/${At}`,$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=P("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(N(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=M();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`,It=(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":Tt,"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},Ct=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const Rt=(e,t,r)=>{let o=It(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&&Ct.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},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":Tt,"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,a=o.length>n,i=a?o.slice(0,n):o,s=P("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 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","ConnectionRefused","FailedToOpenSocket","ConnectionClosed"]),_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 Ar(e){return e.req.path.startsWith("/v1/messages")}function Tr(e,t){if(Ar(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}}}return function(e){try{let t=JSON.parse(e);if("object"==typeof t&&t&&!Array.isArray(t))return t}catch{}return{error:{message:e,type:"error"}}}(e)}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){let r;try{r=JSON.parse(e)}catch{return $r(t)}return"object"!=typeof r||!r||Array.isArray(r)?{}:$r(t)}function Or(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 Ir(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 Rr(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 qr(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=Tr(a,e),s=Er(a,i);return r?.setStatus({code:d.ERROR,message:"Rate limited by upstream"}),r?.setAttribute("copilot_api.error_type","rate_limit_upstream"),Or(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",...Ir(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 Nr(e,t){let r=f.getActiveSpan(),o=await t.response.text(),n=Tr(o,e),a=Er(o,n);Rr(e,t.response.status,a.message??t.message),r?.setStatus({code:d.ERROR,message:t.message}),r?.recordException(t),r?.setAttribute("copilot_api.error_type","HTTPError"),Or(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",...Ir(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=Ar(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&&dr.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",he.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function jr(e){return xr(e)||function(e){return ur(e)||e instanceof Error&&ur(e.cause)}(e)}async function Dr(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 qr(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=Ar(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 Rr(e,400,"Invalid JSON in request body"),e.json(r,400)}if(t instanceof mr)return Nr(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=Ar(e)?{type:"error",error:{type:"api_error",message:o}}:{error:{message:o,type:"timeout_error"}};return Rr(e,504,t instanceof Error?t.message:o),e.json(n,504)}(e,t);if(jr(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",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=Ar(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return Rr(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: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)}`}),Rr(e,500,n.message),r.error(n);let a=Ar(e)?{type:"error",error:{type:"api_error",message:n.message}}:{error:{message:n.message,type:"error"}};return e.json(a,500)}(e,t)}const Lr=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 Br(){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 Fr=e=>"chat"===e.capabilities.type,Ur=3e5,Hr=12e4;let zr,Jr,Gr,Kr=null,Wr=0;function Yr(e){Gr&&clearTimeout(Gr),Gr=setTimeout(()=>{Zr("scheduled").catch(e=>{r.warn("Foundry Entra token renewal failed; retrying:",e),Yr(3e4)})},e),Gr.unref()}async function Vr(e){let t=Jr;if(!zr||!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(Hr),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])}(zr,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,Wr=Date.now(),Yr(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-Ur;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 Xr(e,t){Jr=e,zr=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await Vr("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 Zr(e="upstream_401"){return Kr??=Vr(e).finally(()=>{Kr=null}),Kr}let Qr=null;async function eo(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=Jr?.bearerToken;if(void 0!==t&&t!==o)return!0;let n=Jr?.bearerExpiresAt,a=void 0!==n&&n-Date.now()>Ur;if(e&&a)return!1;if(Date.now()-Wr<3e4)return!0;try{return await Zr(),!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 Qr||=Lr().then(({token:e})=>{he._t1=e,r.debug("Service token refreshed on upstream 401")}).finally(()=>{Qr=null}),await Qr,!0}function to(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 ro=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function oo(e){let t=new URL(e),r=ro.exec(t.hostname)?.[1];return r?`https://${r}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function no(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 ao(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=to(t),a=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:n,anthropicEndpoint:a?to(a,"FOUNDRY_ANTHROPIC_ENDPOINT"):oo(n),auth:o,..."key"===o?{apiKey:r}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:no(e.FOUNDRY_DEPLOYMENTS)}}const io=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},so=e=>({...io(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),lo=e=>`${e.anthropicEndpoint}/anthropic`,co=(e,t)=>({...io(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),uo=e=>"foundry"===e.provider;function po(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const mo=e=>uo(e)?(e=>`${e.endpoint}/openai/v1`)(po(e)):Ot(e),fo=(e,t=!1)=>uo(e)?so(po(e)):It(e,t),ho=e=>uo(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const go=[{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}],yo={context:128e3,output:16384};function _o(e){return go.find(({pattern:t})=>t.test(e))??yo}const wo=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,bo=e=>/^claude/i.test(e),vo=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function ko(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 xo(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:so(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 Ao(e){return{object:"list",data:(e.deployments??await xo(e)).map(e=>function(e){let{model:t}=e;if(!wo.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:{}}}:bo(t)?ko(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):vo(t)?ko(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:_o(t)}):ko(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:_o(t)})}(e)).filter(e=>void 0!==e)}}const To=()=>uo(he)&&he.foundry?Ao(he.foundry):$o(),So=async()=>{try{return await To()}catch(e){if(e instanceof mr&&401===e.response.status){if(!await eo(e))throw e;return To()}throw e}},$o=async()=>{let e=`${mo(he)}/models`,t=fo(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)}},Eo=e=>Fr(e),Oo=e=>Eo(e)&&(e.supported_endpoints?.includes("/responses")??!0);const Io=[{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"}],Co="claude-haiku-4.5",Ro={haiku:Co,"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 qo=/^claude-/i;function Po(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function No(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 Io)if(t.pattern.test(e))return t.family;return null}(o),i=qo.test(o),s=o.replace(/-\d{8}(?::.*)?$/,""),l=n?`-${n}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let r=Po(e);for(let e of t)if(Po(e.replace(/-\d{8}(?::.*)?$/,""))===r)return e}return a?function(e,t,r=null){let o=Ro[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 Mo=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function jo(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=Mo.get(r);if(void 0===o)return t[0]??null;let n=null,a=1/0;for(let e of t){let t=Mo.get(e);if(void 0===t)continue;let r=Math.abs(t-o);r<a&&(a=r,n=e)}return n}const Do={messages:Eo,responses:Oo,chat:e=>Eo(e)&&(e.supported_endpoints?.some(e=>"/chat/completions"===e||"/responses"===e)??!0)};let Lo;const Bo=new Map,Fo=new Map;function Uo(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 Ho(){Lo=await ie({provider:"copilot"},So)}const zo=()=>void 0!==Lo;function Jo(e,t=Date.now()){let r=Bo.get(e);return void 0!==r&&(t<r||(Bo.delete(e),!1))}function Go(e,t=Date.now()){return{id:Fo.get(e)?.id??0,lapsed:!Jo(e,t)}}function Ko(e,t,r={}){let o=r.now??Date.now(),n=r.sent??Go(e,o),a=Fo.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),Fo.set(e,{id:s,appliedMs:i})}else s===a.id&&a.appliedMs>0&&i>a.appliedMs&&Fo.set(e,{id:a.id,appliedMs:i});let l=Math.max(Bo.get(e)??0,o+i);return Bo.set(e,l),l-o}function Wo(e,t){let r=Fo.get(e);r&&t.lapsed&&t.id===r.id&&Fo.set(e,{id:r.id,appliedMs:0})}function Yo(e){if(!zo()||!uo(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 Vo=new Set([429,408,500,502,503,504]);function Xo(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 Zo(e,t){if(e instanceof mr){let{status:t}=e.response;return Vo.has(t)&&void 0!==e.outgoingBody?`foundry_${t}`:void 0}if(t){if(gr(e))return"foundry_timeout";if(jr(e))return"foundry_transport"}}const Qo={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 en(e,t,o){let n=Qo[t]??`returned ${t.slice(8)} for`;r.info(`Foundry ${n} ${e}; serving it from Copilot for ${Math.ceil(o/1e3)}s`)}function tn(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:Lo,rerun:"breaker_open"!==n,inStream:r.inStream},()=>t(e))}const rn=()=>pe();!function(e){ue=e}(e=>{let t=e;t.sent=Go(t.model)});const on=new WeakMap;async function nn(e,t,r){let o=t instanceof mr?t.response:void 0,n=Ko(e,o?.headers??new Headers,{sent:r});return await(o?.body?.cancel()),n}function an(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)),en(e,t,o)}function sn(e){let t=pe();return void 0!==t&&on.has(t)&&!Ft(e)}function ln(){let e=pe(),t=e&&on.get(e);t&&(t.deferReset=!0)}function cn(){let e=rn();e?.sent&&on.has(e)&&Wo(e.model,e.sent)}async function un(e,t,r){let o=rn(),n=o&&on.get(o);if(!o||!n)throw Error("Not in a Foundry attempt the fallback stands behind");on.delete(o);let{model:a}=o;return an(a,t,{windowMs:await nn(a,r,o.sent??Go(a)),attemptStart:o.start}),function(e){return ce.exit(e)}(()=>tn(e,n.handler,{model:a,reason:t,inStream:!0}))}async function dn(e,t,r){if(!zo()||!uo(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=Lo?.data??[],o=r.map(e=>e.id),n=o.includes(e)?e:No(e,o),a=r.find(e=>e.id===n);return a&&Do[t](a)?a.id:void 0}(o,t))return r(e);if(Jo(o))return tn(e,r,{model:o,reason:"breaker_open"});let n=Go(o),a={model:o};on.set(a,{handler:r});try{let t=await function(e,t){return ce.run(e,t)}(a,()=>r(e)),n=a.sent,i=!0===on.get(a)?.deferReset;return t.ok&&n&&!i&&Wo(o,n),t}catch(t){let i=a.sent,s=Zo(t,void 0!==i);if(!s||(an(o,s,{windowMs:await nn(o,t,i??n),attemptStart:a.start}),Ft(e)))throw t;return tn(e,r,{model:o,reason:s})}}const pn=e=>new Promise(t=>{setTimeout(t,e)}),mn=e=>null==e;async function fn({refreshFallback:e=!0}={}){let t=await So();he.models=t,e&&zo()&&await Ho().catch(e=>{r.warn("Failed to refresh the Copilot fallback models:",e)})}const hn=()=>{he._v1="1.140.0-insider"};var gn=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let yn,_n,wn,bn,vn,kn=!1,xn=!1,An=!1;function Tn(){return Sn()?vn:void 0}function Sn(){return void 0!==vn&&Date.now()-vn.at<6e4}function $n(){return An?"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 En=()=>a.readFile(re.GITHUB_TOKEN_PATH,"utf8");function On(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,vn={status:s,message:l,at:Date.now()},clearInterval(yn),yn=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()-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 In(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:d.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 Cn=async(e=5,t=1e3,o="scheduled")=>kn?(r.debug("Token refresh already in progress, coalescing"),_n):(kn=!0,_n=Me.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 Lr();return he._t1=t,vn=void 0,xn&&void 0===yn&&(r.info("Token refresh recovered, resuming scheduled refresh"),qn(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 On({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 In({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(),kn=!1,_n=void 0}}),_n);async function Rn(){return!!he._t1||!Sn()&&(void 0!==vn&&An&&await async function(){if(_n)return;let e=(await En().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 Cn(3,250,"on-demand"),!!he._t1)}function qn(e){yn&&clearInterval(yn);let t=Math.max(1e3*(e-60),6e4);yn=setInterval(()=>{Cn(5,1e3,"scheduled").catch(e=>{r.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Pn(e){try{let t=await En();if(t&&!e?.force)return he._t2=t,An=!0,he.showToken&&r.info("Auth token:",t),void await Nn();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 gn("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(`${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:a.signal});if(!o.ok){await pn(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 gn("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===n.error)throw new gn("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 pn(t);continue}if(n.access_token)return n.access_token;await pn(t)}catch(e){if(e instanceof gn)throw e;if(e instanceof Error&&"AbortError"===e.name){r.error("Access token polling timed out"),await pn(t);continue}throw e}finally{clearTimeout(s)}}}(o);await(e=>a.writeFile(re.GITHUB_TOKEN_PATH,e,{mode:384}))(n),he._t2=n,An=!0,he.showToken&&r.info("Auth token:",n),await Nn()}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 Nn(){let e=await Br();r.success(`Authenticated as ${e.login}`)}async function Mn(e){e.verbose&&(r.level=5,r.info("Verbose logging enabled")),he.showToken=e.showToken,await oe(),await Pn({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 jn=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})=>Mn({verbose:e.verbose,showToken:e["show-token"]})}),Dn=.01,Ln=864e5,Bn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Fn=new Intl.NumberFormat("en-US"),Un=e=>Bn.format(e*Dn),Hn=e=>e.credits_used??e.entitlement-e.remaining,zn=(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())/Ln;if(n<.5)return;let a=Hn(e),i=a*Dn/n,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Dn,c=new Date(o.getTime()+l/i*Ln);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Jn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Fn.format(Hn(e))} of ${Fn.format(e.entitlement)} used`:"n/a",Gn=e=>e.padEnd(14),Kn=(e,t=new Date)=>{let r=e.quota_snapshots.premium_interactions,o=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(r.unlimited)o.push(`${Gn("AI credits")}unlimited`);else{let e=Hn(r),t=r.percent_remaining;o.push(`${Gn("AI credits")}${Un(e)} / ${Un(r.entitlement)} ${t.toFixed(1)}% left`,`${Gn("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Gn("")}${Fn.format(e)} of ${Fn.format(r.entitlement)} credits`)}if(o.push("",`${Gn("Chat")}${Jn(e.quota_snapshots.chat)}`,`${Gn("Completions")}${Jn(e.quota_snapshots.completions)}`,"",`${Gn("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Ln)))(e.quota_reset_date,t)} days)`),!r.unlimited){let n=zn(r,e.quota_reset_date,t);n&&o.push(`${Gn("Burn rate")}~${Bn.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?`${Fn.format(r.overage_count)} used`:"none used"):"not permitted";o.push(`${Gn("Overage")}${a}`)}return o.join("\n")},Wn=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)}},Yn=()=>_.stdout.write(""),Vn=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Xn=async()=>{let e=await Wn();return Kn(e)},Zn=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 Pn(),!e.watch){try{r.box(await Xn())}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 Xn();o&&Yn(),r.box(e),r.log(Vn(new Date,t))}catch(e){r.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Qn=j(g);async function ea(){let e="win32"===_.platform?"where.exe":"which";try{return await Qn(e,["tailscale"]),!0}catch{return!1}}async function ta(){try{let{stdout:e}=await Qn("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function ra(e){return e.replace(/\.$/,"")}async function oa(){let e=await ta();if(e?.Online)return ra(e.DNSName)}const na=j(g),aa=e=>`${e}`,ia=e=>`${e}`,sa=e=>`${e}`,la=e=>`${e}`,ca=e=>`${e}`,ua=e=>`${e}`,da=ia(" ─────────────────────────────────────────────────────────────"),pa=s.join(re.APP_DIR,"certs","tailscale"),ma=s.join(pa,"cert.pem"),fa=s.join(pa,"key.pem"),ha={certDir:pa,certPath:ma,keyPath:fa};function ga(){switch(_.platform){case"darwin":return[` ${ia("Install Tailscale for macOS:")}`,` ${sa("https://tailscale.com/download/mac")}`,` ${ia("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${ia("After installing, open the Tailscale app and sign in.")}`,` ${ia("Then re-run this command.")}`].join("\n");case"linux":return[` ${ia("Install Tailscale for Linux:")}`,` ${sa("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${sa("sudo tailscale up")}`,` ${ia("or")} ${sa("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${ia("Install Tailscale for Windows:")}`,` ${sa("https://tailscale.com/download/windows")}`,"",` ${ia("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${ia("Install Tailscale:")} ${sa("https://tailscale.com/download")}`}}function ya(){let e=[` ${ca("Tailscale is not running.")}`];return"darwin"===_.platform?e.push(` ${ia("Open the Tailscale app from Applications and sign in.")}`,` ${ia("Download:")} ${sa("https://tailscale.com/download/mac")}`):"win32"===_.platform?e.push(` ${ia("Open the Tailscale app and sign in.")}`,` ${ia("Download:")} ${sa("https://tailscale.com/download/windows")}`):e.push(` ${ia("Connect with:")} ${sa("sudo tailscale up")}`),e.push("",` ${ia("Then re-run this command.")}`),e.join("\n")}async function _a(){try{return await a.access(ma),await a.access(fa),!0}catch{return!1}}function wa(e){console.log(""),console.log(da),console.log(` ${aa("Claude Cowork Setup")} ${ia("— Diagnostic")}`),console.log(da),console.log("");for(let t of function(e){let t=[];for(let[r,o]of Object.entries(e)){let e;e="ok"===o.status?la("✅"):"missing"===o.status?ca("❌"):ua("❓");let n=o.detail?ia(` ${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(` ${la("All checks passed.")}`):console.log(` ${ca(`${t.length} issue(s).`)} Run ${sa("copilot-api cowork-setup install")} to fix.`),console.log("")}const ba={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},va=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await ea();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return wa(e),console.log(""),console.log(ga()),void console.log("");let r=await ta();if(!r||!r.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},wa(e),console.log(ya()),void console.log("");let o=ra(r.DNSName);e["tailscale-running"]={status:"ok",detail:o};let n=await _a();e["tailscale-cert"]=n?{status:"ok",detail:ma}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},n&&(e.ready={status:"ok",detail:`https://${o}:<port>`}),wa(e)}(),_.exit(0)}}),ka=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:ba},async run({args:e}){await async function(e){if(console.log(""),console.log(da),console.log(` ${aa("Claude Cowork Setup")} ${ia("— Install")}`),console.log(da),console.log(""),!await ea())return console.log(` ${ca("Tailscale is not installed.")}`),console.log(""),console.log(ga()),console.log(""),console.log(` ${ia("After installing, run")} ${sa("tailscale up")} ${ia("to connect, then re-run this command.")}`),void console.log("");let t=await ta();if(!t||!t.Online)return console.log(ya()),void console.log("");let o=ra(t.DNSName);if(console.log(` ${ia("Tailscale hostname:")} ${aa(o)}`),console.log(""),console.log(` ${aa("Generating TLS certificate via Tailscale…")}`),console.log(` ${ia("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${sa(`$ tailscale cert --cert-file ${ma} --key-file ${fa} ${o}`)}`),console.log(""),e||await r.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(pa,{recursive:!0}),r.start("Generating certificate (this may take a few seconds)…"),await na("tailscale",["cert","--cert-file",ma,"--key-file",fa,o]),console.log(` ${la("✓ 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(da),console.log(` ${aa("Next steps")}`),console.log(da),console.log(""),console.log(` ${aa("1.")} Start the proxy:`),console.log(` ${sa("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${aa("2.")} In Cowork ${ia("→")} Settings ${ia("→")} Inference Provider, set:`),console.log(` ${aa("inferenceGatewayBaseUrl")} = ${sa(`https://${o}:<port>`)}`),console.log(` ${ia("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${aa("3.")} Restart Cowork ${ia("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${ia("For Cowork's own configuration docs, see:")}`),console.log(` ${sa("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else r.info("Skipped.")}(e.yes),_.exit(0)}}),xa=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:ba},async run({args:e}){await async function(e){if(console.log(""),console.log(da),console.log(` ${aa("Claude Cowork Setup")} ${ia("— Revert")}`),console.log(da),console.log(""),await _a())if(console.log(` ${aa("Remove Tailscale cert files:")}`),console.log(` ${ia(ma)}`),console.log(` ${ia(fa)}`),console.log(""),e||await r.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(pa,{recursive:!0}),console.log(` ${la("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);r.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${ia("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else r.info("Skipped.");else console.log(` ${ia("No Tailscale cert found. Nothing to revert.")}`),console.log("")}(e.yes),_.exit(0)}}),Aa=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:va,install:ka,revert:xa}}),Ta=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Sa(e){if(!Ta.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 $a(e){return"string"==typeof e?Sa(e):Array.isArray(e)?function(e){let t;for(let r=0;r<e.length;r++){let o=e[r],n=$a(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?$a(a):a;t||i===a&&"__proto__"!==n||(t=Ea({},r,e)),t&&(t[n]=i)}let n=t??e;return"object"===n.type&&!("properties"in n)&&(t??=Ea({},r,r.length),t.properties={}),t??e}(e):e}function Ea(e,t,r){for(let o=0;o<r;o++)e[t[o][0]]=t[o][1];return e}const Oa="x-copilot-api-self-test",Ia=M();const Ca=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Ra(e){return!e.id.startsWith("text-embedding")&&Fr(e)&&!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 qa(e){let t=2;return Ca.test(e.id)?t=0:"Anthropic"===e.vendor&&(t=1),2*t+ +!e.model_picker_enabled}const Pa=new Set(["model_not_supported","no_available_model_endpoints"]);function Na(e,t){if(400!==e||!t)return!1;try{let e=JSON.parse(t).error?.code;return"string"==typeof e&&Pa.has(e)}catch{return!1}}const Ma="function"==typeof l.snapshot?l.snapshot():e=>e(),ja=e=>{try{return J(e,"utf8")}catch{return}},Da=e=>({read:ja,root:"/sys/fs/cgroup",totalMem:i.totalmem(),rss:()=>process.memoryUsage.rss(),platform:process.platform,...e}),La=(e,t)=>Number.isFinite(e)&&e>0&&e<t?e:void 0,Ba=(e,t)=>{if(!e)return;let r=RegExp(`^${t}:? +(\\d+)`,"m").exec(e);return r?Number(r[1]):void 0};const Fa=(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 Ua(e={}){let t,r=Da(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:Fa(r.v2,/^0::(.*)$/m.exec(t)?.[1]??"/"),current:"memory.current",max:"memory.max",inactive:"inactive_file"},{source:"cgroup_v1",dirs:Fa(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=Ba(e.read(`${o}/memory.stat`),t.inactive);r.push({limit:void 0===a||"max"===a?void 0:La(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=Ba(n,"MemTotal"),i=Ba(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 Ha=(e,t)=>{let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?r:t};var za=class{level="normal";last;timer;listeners=new Set;sampleListeners=new Set;thresholds;read;rss;intervalMs;constructor(e={}){this.thresholds=e.thresholds??{low:Ha("COPILOT_API_IMAGES_PRESSURE_LOW",.7),high:Ha("COPILOT_API_IMAGES_PRESSURE_HIGH",.8),critical:Ha("COPILOT_API_IMAGES_PRESSURE_CRITICAL",.9)},this.read=e.read??(()=>Ua()),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(),Ma(()=>{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 Ja=1048576,Ga=8388608,Ka=16*Ja,Wa=100*Ja,Ya=e=>((e,t=1)=>Math.ceil(1*Math.min(Math.max(e,0),Wa)+5242880*Math.max(1,Math.floor(t))))(e??Ka)+Ga;var Va=class extends Error{reason;constructor(e){super(`Image request not admitted: ${e}`),this.reason=e,this.name="AdmissionRejectedError"}},Xa=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 Va(e))}acquire(e,t){return t?.aborted?Promise.reject(new Va("aborted")):e>this.fullBudget?Promise.reject(new Va("too_large")):this.paused?Promise.reject(new Va("memory_pressure")):0===this.queue.length&&this.fits(e)?Promise.resolve(this.grant(e)):this.queue.length>=this.options.maxQueue?Promise.reject(new Va("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 Va("queue_timeout"))},this.options.queueTimeoutMs),i=()=>{n()&&o(new Va("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 Za(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}},Za=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 Qa=(e,t)=>{let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?Math.floor(r):t};function ei(e,t,r=0){let o=Qa("COPILOT_API_IMAGES_MEMORY_BUDGET_MB",0)*Ja;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 ti=e=>ei(e.limitBytes,Math.max(e.idleRssBytes,e.rssBytes-e.imageInUseBytes),e.usedBytes-e.rssBytes);var ri=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&&Ma(()=>{this.timer=setTimeout(()=>{this.timer=void 0,this.drain()},Math.ceil((1-this.tokens)*this.intervalMs))})}take(e){return e?.aborted?Promise.reject(new Va("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 Va("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 oi;function ni(){if(oi)return oi;let e=Ua(),t=process.memoryUsage.rss(),r=ti({limitBytes:e.limitBytes,usedBytes:e.usedBytes,rssBytes:t,idleRssBytes:t,imageInUseBytes:0}),o=new Xa({budgetBytes:r,ceilingBytes:ei(e.limitBytes,t),maxConcurrent:Qa("COPILOT_API_IMAGES_MAX_CONCURRENT",30),maxQueue:Qa("COPILOT_API_IMAGES_MAX_QUEUE",32),queueTimeoutMs:Qa("COPILOT_API_IMAGES_QUEUE_TIMEOUT_MS",45e3)}),a=new za;return a.onChange(e=>ai(o,e)),a.onSample(e=>o.setBudgetBytes(ti({limitBytes:e.limitBytes,usedBytes:e.usedBytes,rssBytes:process.memoryUsage.rss(),idleRssBytes:t,imageInUseBytes:o.stats().inUseBytes}))),n.info(`Image admission: budget ${Math.round(r/Ja)} MB of a ${Math.round(e.limitBytes/Ja)} MB limit (${e.source})`),oi={gate:o,monitor:a,pacer:new ri({burst:Qa("COPILOT_API_IMAGES_START_BURST",30),intervalMs:Qa("COPILOT_API_IMAGES_START_RATE",400)})},a.start(),ai(o,a.current),oi}function ai(e,t){"critical"===t?(e.setPaused(!0),e.failQueued("memory_pressure"),e.setBudgetScale(.5)):(e.setBudgetScale(1),e.setPaused("high"===t))}let ii;function si(e){let{heapUsed:t,rss:r,external:o,arrayBuffers:n}=process.memoryUsage();ii??=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=oi?.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",ii),e.setAttribute("copilot_api.process.uptime_s",Math.round(process.uptime()))}function li(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),si(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:d.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",d=l?.streaming??!1,p={method:o,path:n,status_code:String(c),model:u,streaming:String(d),endpoint_type:a};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:a};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(i)}(e)}catch(e){r.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}Oe.completionCallbacks.delete(e.requestId)}const ci=3e4,ui=12e4,di=2e3,pi=new WeakMap,mi=(e,t)=>{if(!e)return Promise.resolve();let r=pi.get(e);return r||(r=fi(e,t),pi.set(e,r)),r},fi=async(e,{read:t,limit:r,declared:o,deadline:n=performance.now()+ui})=>{let a,i=t;try{for(;;){void 0===a&&(i>r||void 0!==o&&i>o)&&(a=performance.now()+di);let t=Math.min(n,a??n),s=Math.min(ci,t-performance.now());if(s<=0)return void await hi(e);let l=await gi(e,s);if("timeout"===l)return void await hi(e);if(l.done)return;i+=l.value.byteLength}}catch{}},hi=async e=>{let t;try{await Promise.race([e.cancel().catch(()=>{}),new Promise(e=>{t=setTimeout(e,1e3)})])}finally{clearTimeout(t)}},gi=async(e,t)=>{let r;try{return await Promise.race([e.read(),new Promise(e=>{r=setTimeout(()=>e("timeout"),t)})])}finally{clearTimeout(r)}};let yi=0;const _i=()=>{if(yi>=(()=>{let e=Number(process.env.COPILOT_API_IMAGES_MAX_DRAINS);return Number.isFinite(e)&&e>=0?Math.floor(e):8})())return;yi++;let e=!1;return{start:t=>{e||(e=!0,Ma(()=>{wi(t())}))}}},wi=e=>{e.catch(()=>{}).finally(()=>{yi--})},bi=e=>{let t=_i();return t?.start(e),void 0!==t},vi=(e,t,r)=>{let{body:o}=e;return!(o&&!o.locked)||((e,t)=>pi.has(e)||bi(()=>mi(e,t)))(o.getReader(),{read:0,limit:t,declared:r})},ki=e=>e.includes("/images/edits")?104857600:33554432,xi=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})}),Ai=async e=>{if(!se())return Me.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,xi(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 Ti(e){if(ho(he)||await Rn())return null;let t=Tn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${$n()}`,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 Si(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 $i(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 Ei=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Oi(e){if(!e||"string"!=typeof e)throw new Ei("Model name is required and must be a string");if("foundry"===he.provider)return e;if(!he.models?.data)throw new Ei("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=No(e,t);if(!r)throw Je.add(1,{requested_model:e}),new Ei(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return r}function Ii(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?vo(e):/gpt-[\d.]+-codex/i.test(e)}async function Ci(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 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 pn(s),e.lastRequestTimestamp=n,r.info("Rate limit wait completed, proceeding with request")}finally{o.end()}})}var Ri=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function qi(e){if(e instanceof Ri)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 Pi(e,t){let{type:o,message:n}=qi(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 Ni(e,t){let{type:o,message:n}=qi(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 Mi(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 ji(e,t,r){return Math.min(Math.max(e,t),r)}function Di(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 Di(JSON.parse(n),t+1)}catch{return null}}function Li(e,t){let r=e?.data.find(e=>e.id===t);if(!r)return null;let o=Mi(r.capabilities.supports.min_thinking_budget),n=Mi(r.capabilities.supports.max_thinking_budget);return!o||!n||n<=o?null:{bounds:{min:o,max:n-1},maxOutputTokens:Mi(r.capabilities.limits?.max_output_tokens)??void 0}}function Bi(e){let{config:t}=e,r=t.bounds.min,o=t.bounds.max,n=ji(Mi(e.requestedBudget)??r,r,o),a=Mi(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 Fi(e,t){if(mn(e.thinking_budget))return e;let r=Li(t,e.model);if(!r)return{...e,thinking_budget:void 0};let o=Bi({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 Ui(e){return"invalid_thinking_budget"===Di(e)}async function Hi(e){let{payload:t,error:r,models:o,errorBodyText:n}=e;if(mn(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(!Ui(i))return null;let l=Li(o,t.model);return l?function(e,t){let r=Bi({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=Mi(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 zi(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 Ji(e,t){let r=e.get("requestData")||{};r.upstreamTotalMs=performance.now()-t,r._d1=r.upstreamTotalMs,e.set("requestData",r)}const Gi=new Map,Ki=new Map,Wi=new Set;let Yi,Vi,Xi;function Zi(e){return!e.closed&&!e.destroyed}function Qi(e){r.debug(`Creating HTTP/2 client for ${e}`);let t=new C(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return Gi.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=Wi.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}),Ki.delete(t),Wi.delete(t),Gi.delete(t),Zi(t)&&t.close().catch(e=>{r.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function es(e,t){if(!he.connectivity.h2)return;if(Yi&&Yi!==e&&function(){for(let e of[...Ki.keys(),...Wi])Zi(e)&&e.close().catch(e=>{r.debug("Error closing HTTP/2 pool entry:",e)});Ki.clear(),Wi.clear(),Gi.clear()}(),Yi=e,t?.fresh){let t=Qi(e);return Wi.add(t),t}let o=Date.now();for(let[t]of Ki)if(o-(Gi.get(t)??0)>=6e5)Ki.delete(t),Gi.delete(t),Zi(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(Zi(t))return Ki.delete(t),Wi.add(t),t;Ki.delete(t),Gi.delete(t)}let n=Qi(e);return Wi.add(n),n}function ts(e){e&&Wi.delete(e)&&(Zi(e)?Ki.set(e,Date.now()):Gi.delete(e))}function rs(){Xi||(Xi=setInterval(()=>{!function(){let e=Date.now(),t=he.connectivity.h2Keepalive,o=Ki.size;for(let[n,a]of Ki)e-a<6e4||t&&o<=1||(Ki.delete(n),Gi.delete(n),o--,Zi(n)&&n.close().catch(e=>{r.debug("Error closing idle HTTP/2 client:",e)}),tt.add(1,{event:"idle_reaped",origin:Yi??""}),ft(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${Yi}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Yi??""}))}()},3e4),Xi.unref())}function os(){Vi||(r.debug("Starting HTTP/2 keepalive (every 45s)"),Vi=setInterval(()=>{(async function(){if(0===Ki.size&&0===Wi.size){if(Yi){let e=Qi(Yi);Ki.set(e,Date.now())}return}let e=[...Ki.keys()];for(let t of e)Ki.delete(t);await Promise.allSettled(e.map(async e=>{if(Zi(e))try{let{statusCode:t,body:o}=await e.request({path:"/models",method:"GET",headers:It(he)});await o.dump(),et.add(1,{result:"success"}),r.debug(`HTTP/2 keepalive: GET /models → ${t}`),Ki.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:Yi??""}),Gi.delete(e),Zi(e)&&e.close().catch(e=>{r.debug("Error closing broken HTTP/2 client:",e)})}else Gi.delete(e)}))})().catch(e=>{r.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Vi.unref(),rs())}function ns(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*as(e,t){try{yield*K(e)}finally{is(t)}}function is(e){e instanceof ReadableStream||e.destroyed||(e.on("error",()=>{}),e.destroy())}function ss(e){return e.max_completion_tokens??e.max_tokens}async function ls(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&&$i(t,o.usage),o}catch(e){throw ht(t,e),e}finally{t.end()}}const cs=e=>uo(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=ss(e);return null==i?a:{...a,max_completion_tokens:i}}(e,he.models),us=e=>uo(he)?e:$a(e),ds=async(e,t)=>{let o=us(e),n=t?.signal;try{return await fs(o,n)}catch(e){if(e instanceof mr&&401===e.response.status){if(!await eo(e))throw e;return fs(o,n)}let t;if(e instanceof mr)try{t=await e.response.clone().text()}catch{t=void 0}let a=await Hi({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 fs(us(a),n);throw e}},ps=async(e,t)=>{let r=Yo(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 ms(e,t){let r=()=>t.abort(e?.reason);return e?.aborted?r():e?.addEventListener("abort",r,{once:!0}),()=>e?.removeEventListener("abort",r)}async function fs(e,t){if(!ho(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={...fo(he,r),"X-Initiator":o?"agent":"user"},a=mo(he),i=`${a}/chat/completions`,s=he.timeoutMs,l=cs(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":ss(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=es(a,{fresh:r>0}),l=new AbortController,d=Xo(l,s),p=ms(t,l);try{let{statusCode:t,headers:a,body:p,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(d.headersArrived),f=ns(p,{status:t,headers:a});if(e.stream){let e=await ps(f,m);if(e)throw new mr("Failed to create chat completions",e,{outgoingBody:c,outgoingHeaders:n});return{events:as(f,p),span:m,release:()=>ts(o)}}try{return await ls(f,m,{outgoingBody:c,outgoingHeaders:n})}finally{ts(o)}}catch(e){if(ts(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 hs=new Map;const gs=["none","minimal","low","medium","high","xhigh","max"];function ys(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=gs.indexOf(e);if(-1===r)return t[0];let o,n=1/0;for(let e of t){let t=gs.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 _s(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:[];hs.set(e.model,n);let a=ys(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 ws(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&&$i(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 bs=async(e,t)=>{let r=uo(he),o=r?function(e){let t=hs.get(e.model);return t?ys(e,t):e}(e):e,n=!1,a=!1;for(;;)try{return t?.onAttempt?.(o),await ks(o,t?.signal)}catch(e){if(!(e instanceof mr))throw e;if(401===e.response.status&&!n){if(n=!0,!await eo(e))throw e;continue}if(r&&400===e.response.status&&!a){a=!0;let t=_s(o,await e.response.clone().text().catch(()=>{}));if(t){o=t;continue}}throw e}};function vs(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 ks=async(e,t)=>{if(!ho(he))throw Error("Service token not found");let r=uo(he)?e:$a(e),o={...fo(he),"X-Initiator":"agent"},n=mo(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=es(n,{fresh:e>0}),u=new AbortController,p=Xo(u,i),m=vs(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(p.headersArrived);m.attach(f);let g=ns(f,{status:t,headers:n});if(r.stream){let e=Yo(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:as(g,f),span:h,release:()=>{m.dispose(),ts(c)}}}try{return await ws(g,h,{outgoingBody:s,outgoingHeaders:o})}finally{m.dispose(),ts(c)}}catch(t){if(m.dispose(),ts(c),await pr(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{p.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},xs=e=>Object.hasOwn(e,"output");function As(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 Ts=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,r=null){super(e),this.code=t,this.param=r}};const Ss=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 $s(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Ts(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Ts(`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=>Os(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=Is(r.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Os(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:Os(r.content)})}return t}(e.messages);if(0===r.length)throw new Ts("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),Es(e.temperature)&&(o.temperature=e.temperature),Es(e.top_p)&&(o.top_p=e.top_p),Es(e.parallel_tool_calls)&&(o.parallel_tool_calls=e.parallel_tool_calls),Es(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 Es(e){return null!=e}function Os(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Is(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 Ts(`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 Cs(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 Rs(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 qs(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 Ps(e,t,r){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(r)}function Ns(e,t){let r=e.item;if("function_call"!==r.type)return[];let o="response.output_item.done"===e.type,n=Ps(t,r.id,e.output_index);if(void 0!==n)return o&&!t.toolCallsWithArgs.has(n)&&r.arguments?(t.toolCallsWithArgs.add(n),[qs(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),[qs(t,{tool_calls:[{index:a,id:r.call_id,type:"function",function:{name:r.name,arguments:i}}]})]}function Ms(e,t){let r=[qs(e,{},Rs(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:o,...n}=Cs(t.usage);r.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:n})}return r}function js(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:[qs(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Ns(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let r=Ps(t,e.item_id,e.output_index);return void 0!==r&&e.delta?(t.toolCallsWithArgs.add(r),{chunks:[qs(t,{tool_calls:[{index:r,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Ms(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 Ds="openai_responses";function Ls(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),$s(e)}finally{t.end()}});st.record(performance.now()-t,{direction:"openai_to_responses"});let n=function(e){return Object.entries(e).filter(([e,t])=>!Ss.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 Bs(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:Rs(e,o.length>0)}]};return e.usage&&(n.usage=Cs(e.usage)),n}(e)}finally{t.end()}});return st.record(performance.now()-t,{direction:"responses_to_openai"}),r}function Fs(e,t,n){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...r}=Cs(t.usage);a.tokenUsage=Si(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(Bs(t))}async function Us(e,t,o){let n;try{n=Ls(t)}catch(t){if(t instanceof Ts)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 Ai();let a=await Ti(e);if(a)return a;let i=performance.now(),s=await bs(n),l=performance.now()-i;if(nt.record(l,{model:n.model,target:"responses",streaming:String(!!n.stream)}),xs(s))return Fs(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,a=0,s=performance.now(),m=zi(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:Ds});let c=As(s);if(c){o=c;let t=e.get("requestData")||{};t.tokenUsage=Si(c),t._d1=l,e.set("requestData",t)}let u=js(s,p);if(u.error)throw new Ri(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:Ds};at.record(performance.now()-s,u),pt.record(a,u),Ji(e,i)}catch(r){throw gt(u,e.get("requestSpan"),r),await Ni(t,r),r}finally{o&&$i(u,o),u.end(),d()}let f=e.get("requestId");f&&Oe.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Hs(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 zs(e){let t=!0===e.get("isSelfTest");t||await Ci(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=Oi(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 Ei)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(Ii(o.model))return Us(e,o,{isSelfTest:t});e.set("requestData",{model:o.model,streaming:!!o.stream}),he.manualApprove&&!t&&await Ai(),"foundry"!==he.provider&&(o=function(e){if(!mn(e.max_completion_tokens)){let{max_completion_tokens:t,...r}=e;return{...r,max_tokens:t}}if(!mn(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=Fi(o,he.models)),mn(o.thinking_budget)||r.debug("Normalized thinking_budget to:",JSON.stringify(o.thinking_budget));let n=await Ti(e);if(n)return n;let a=performance.now(),i=await ds(o),s=performance.now()-a;if(nt.record(s,{model:o.model,target:"chat_completions",streaming:String(!!o.stream)}),Js(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Si(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(),d=zi(e,a);try{try{for await(let a of l){d();let i=a;a.data&&"[DONE]"!==a.data&&(n++,Ze.add(1,{model:o.model,endpoint_type:"openai"}),i=Hs(a,t=>{r.value=t;let o=e.get("requestData")||{};o.tokenUsage=Si(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),pt.record(n,u),Ji(e,a),r.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Si(r.value),t._d1=s,e.set("requestData",t))}}catch(r){throw gt(c,e.get("requestSpan"),r),await Ni(t,r),r}finally{r.value&&$i(c,r.value),c.end(),u()}let p=e.get("requestId");p&&Oe.executeCompletion(p)}finally{e.get("resolveStreamComplete")?.()}})}const Js=e=>Object.hasOwn(e,"choices"),Gs=new B;Gs.post("/",async e=>{try{return await dn(e,"chat",zs)}catch(t){return await Dr(e,t)}});const Ks=async(e,t,r)=>{if(!ho(he))throw Error("Service token not found");let o=uo(he)?"/decisions":"/v1/decisions",n=`${mo(he)}${o}`,a=fo(he),i=new AbortController,s=hr(i,he.timeoutMs);try{let{response:o,span:s}=await bt({spanName:"copilot POST /v1/decisions",url:n,target:"decisions",method:"POST",headers:a,body:t,signal:r?AbortSignal.any([i.signal,r]):i.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:a});let r=Ws(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:a})}return r}catch(e){throw ht(s,e),e}finally{s.end()}}finally{clearTimeout(s)}},Ws=e=>{try{let t=JSON.parse(e);return"object"==typeof t&&t&&!Array.isArray(t)?t:void 0}catch{return}},Ys=(e,t)=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error",code:"invalid_request"}},400)),Vs=(e,t)=>e.json({error:{message:`Request body exceeds the ${t/1024/1024} MB limit.`,type:"invalid_request_error",code:"request_too_large"}},413),Xs=(e,t,r)=>{try{if(r)throw new Ei(r);return Oi(t)}catch(t){if(t instanceof Ei)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}},Zs=new B;Zs.post("/",async e=>{try{await Ci(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=Xs(e,r.model);if(o instanceof Response)return o;e.set("requestData",{model:o});let n=await Ti(e);if(n)return n;he.manualApprove&&await Ai(Lt(e));let a=o===r.model?t:JSON.stringify({...r,model:o}),i=performance.now(),s=await(async(e,t,r)=>{try{return await Ks(e,t,r)}catch(o){if(o instanceof mr&&401===o.response.status){if(!await eo(o))throw o;return Ks(e,t,r)}throw o}})(o,a,Lt(e)),l=performance.now()-i;nt.record(l,{model:o,target:"decisions",streaming:"false"});let c=e.get("requestData")||{};return s.usage&&(c.tokenUsage=Si(Cs(s.usage))),c._d1=l,e.set("requestData",c),e.json(s)}catch(t){return await Dr(e,t)}});const Qs=async e=>{if(!ho(he))throw Error("Service token not found");let t=`${mo(he)}/embeddings`,r=fo(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)}},el=new B;el.post("/",async e=>{try{let t=await e.req.json();try{t.model=Oi(t.model)}catch(t){if(t instanceof Ei)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 Ti(e);if(r)return r;let o=performance.now(),n=await(async e=>{try{return await Qs(e)}catch(t){if(t instanceof mr&&401===t.response.status){if(!await eo(t))throw t;return Qs(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=Si(n.usage),i._d1=a,e.set("requestData",i),e.json(n)}catch(t){return await Dr(e,t)}});const tl=new B;let rl=null,ol=null;tl.get("/",async e=>{let t,r=function(){if(uo(he)){if(!ho(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=rl;return t&&e-t.timestamp<3e4?{result:t.result}:ol||(ol=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),r=performance.now();try{let t=`${mo(he)}/models`,o=await fetch(t,{method:"GET",headers:fo(he),signal:e.signal}),n=Math.round(performance.now()-r),a=o.ok?"reachable":"unreachable";return rl={result:a,timestamp:Date.now()},{result:a,latencyMs:n}}catch{let e=Math.round(performance.now()-r);return rl={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),ol=null}})(),ol)}();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.3",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 nl=class extends Error{upstream;constructor(e){super("Copilot rejected the token for a streamed image upload"),this.upstream=e,this.name="ImagesRetryLaterError"}};const al=e=>"object"==typeof e&&"chunks"in e,il=async(e,t)=>{if(void 0===e)return await t();let r=e-performance.now();if(r<=0)throw new fr(he.timeoutMs);let o=new AbortController,n=new Promise((e,t)=>{o.signal.addEventListener("abort",()=>t(Error()),{once:!0})});n.catch(()=>{});let a=setTimeout(()=>o.abort(),r);try{return await Promise.race([t(o.signal),n])}catch(e){throw o.signal.aborted?new fr(he.timeoutMs):e}finally{clearTimeout(a)}},sl=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 eo()},ll=async(e,t,r)=>{let{status:o}=e.response;if(401===o&&!t.refreshed){if(t.refreshed=!0,!await il(t.deadline,()=>eo(e)))throw e;if(!t.replayable)throw new nl(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>1e4||performance.now()+n>(t.deadline??1/0))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)},cl=async(e,t,{onBodyEnd:r,timeoutMs:o})=>{if(!ho(he))throw Error("Service token not found");let n=`${mo(he)}/v1/images/${e.operation}`,a=new AbortController,i=dl(a,t,o),{body:s,length:l}=pl(e.body,a.signal,i),c=e.model?void 0:e.lateModel,u=ul(e.contentType,l),{release:d}=i,p=!1;try{let l=await vt({spanName:`copilot POST /v1/images/${e.operation}`,url:n,target:"images",method:"POST",headers:u,body:s,signal:a.signal,headersTimeout:o,bodyTimeout:o,extraAttributes:{...e.model&&{"copilot_api.model":e.model},"copilot_api.upstream.provider":he.provider}}),{span:m}=l;l.body instanceof ReadableStream||i.attachBody(l.body);try{let o=hl(l);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:u})}let n=o.headers.get("content-type")??"application/json",{stream:a,fail:s}=_l(o.body,(e,r,o)=>{void 0!==e&&(!o&&!t?.aborted)&&ht(m,e);let n=c?.();n&&m.setAttribute("copilot_api.model",n),void 0!==r&&m.setAttribute("copilot_api.images.total_nano_aiu",r),m.end(),d()},r);return i.onAbort(s),p=!0,{contentType:n,body:a}}catch(e){throw ht(m,e),e}finally{if(!p){let e=c?.();e&&m.setAttribute("copilot_api.model",e),m.end()}}}finally{p||d()}},ul=(e,t)=>({...fo(he),"Content-Type":e,...void 0!==t&&{"Content-Length":String(t)},"accept-encoding":"identity"}),dl=(e,t,r)=>{let o,n,a=1,i=t=>{n?.(t),o?.on("error",()=>{}),o?.destroy(t),e.abort(t)},s=setTimeout(()=>i(new fr(he.timeoutMs)),r),l=()=>i(t?.reason);return t?.aborted?l():t?.addEventListener("abort",l,{once:!0}),{hold:()=>{a++},release:()=>{--a>0||(clearTimeout(s),t?.removeEventListener("abort",l))},attachBody:e=>{o=e},onAbort:e=>{n=e}}},pl=(e,t,r)=>{if("string"==typeof e)return{body:e,length:q.byteLength(e)};if(al(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]=ml,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:q.from(e.buffer,e.byteOffset,e.byteLength),length:e.byteLength}};const ml=new Uint8Array,fl=new Set([101,204,205,304]),hl=({statusCode:e,headers:t,body:r})=>{let o={status:e,headers:t};return fl.has(e)?(is(r),new Response(null,o)):ns(r,o)},gl=async(e,t)=>{let r;try{await Promise.race([e?.cancel(t).catch(()=>{}),new Promise(e=>{r=setTimeout(e,5e3)})])}finally{clearTimeout(r)}},yl=65536,_l=(e,t,r)=>{let o,n=e?.getReader(),a=new vl,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 wl;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 bl,r=t?e.cause??e:e;try{await gl(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),gl(n,t).then(()=>l(t))}}};var wl=class extends Error{name="ImagesBodyFailedError";constructor(){super("The upstream image response failed before its end.")}},bl=class extends Error{name="ImagesRouteCancel"},vl=class{head=new Uint8Array(yl);headLength=0;ring=new Uint8Array(yl);ringEnd=0;total=0;push(e){if(this.total+=e.byteLength,this.headLength<yl){let t=Math.min(e.byteLength,yl-this.headLength);this.head.set(e.subarray(0,t),this.headLength),this.headLength+=t}let t=e.byteLength>yl?e.subarray(e.byteLength-yl):e,r=Math.min(t.byteLength,yl-this.ringEnd);this.ring.set(t.subarray(0,r),this.ringEnd),this.ring.set(t.subarray(r),0),this.ringEnd=(this.ringEnd+t.byteLength)%yl}tail(){if(this.total<yl)return this.ring.subarray(0,this.total);let e=new Uint8Array(yl);return e.set(this.ring.subarray(this.ringEnd)),e.set(this.ring.subarray(0,this.ringEnd),yl-this.ringEnd),e}read(){let e,t=this.tail(),r=this.head.subarray(0,this.headLength);if(this.total<=yl)e=[[kl(t),"end"]];else if(this.total<=2*yl){let o=new Uint8Array(this.total);o.set(r),o.set(t.subarray(2*yl-this.total),yl),e=[[kl(o),"end"]]}else e=[[kl(t),"end"],[kl(r),"start"]];let o=t=>{for(let[r,o]of e){let e=Al(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 kl=e=>(new TextDecoder).decode(e),xl=(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 Al(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?xl(e,[t.index+1,e.length],-1):xl(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 Tl=e=>e.header("Connection","close"),Sl=e=>{let t=(e=>{let t=Number(e.req.header("content-length"));return{limit:ki(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)||!vi(e.req.raw,t.limit,t.declaredLength))&&Tl(e)},$l=(e,t)=>{f.getActiveSpan()?.setAttribute("copilot_api.error_type","images_capacity");let r=ni().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)},El={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."},Ol=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)),Il=e=>(Tl(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 Cl=class extends Error{constructor(){super("The request body stopped arriving."),this.name="BodyIdleTimeoutError"}};const Rl=async(e,t)=>{let r;try{await Promise.race([e.cancel(t).catch(()=>{}),new Promise(e=>{r=setTimeout(e,1e3)})])}finally{clearTimeout(r)}},ql=async(e,t)=>{let r,o;try{return await Promise.race([e.read(),new Promise((e,t)=>{r=setTimeout(()=>t(new Cl),(()=>{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)}},Pl=1048576,Nl=(e,t)=>{let r=(e=>Math.min(Math.max(e??Ka,0),Wa))(t);return t=>{if(t<=r)return"ok";let o=Math.ceil(t/Pl)*Pl,n=e.grow(Math.ceil(1*(o-r)));return"ok"===n&&(r=o),n}},Ml=e=>{let t=0;return async r=>{let o=await(e=>ni().pacer.take(e))(r?AbortSignal.any([e,r]):e);t+=o,t>0&&f.getActiveSpan()?.setAttribute("copilot_api.images.start_wait_ms",t)}},jl=async(e,t,r)=>{try{return await async function(e,t){let{gate:r}=ni(),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}}),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 Va?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()-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 Ya(Number.isSafeInteger(o)&&o>=0?o:void 0)})(e,t),r)}catch(t){if(t instanceof Va&&"aborted"!==t.reason)return Sl(e),"too_large"===t.reason?Ol(e):$l(e,El[t.reason]);throw t}},Dl=(e,t)=>{if(e.length<256)return void e.push(t);let r=e.at(-1),o=r&&Bl.get(r);if(t.byteLength>=16384)return o&&Ll(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 Bl.set(n,o),void(e[e.length-1]=n)}o&&Ll(e,r,o);let n=new Uint8Array(65536);n.set(t);let a=n.subarray(0,t.byteLength);Bl.set(a,n),e.push(a)},Ll=(e,t,r)=>{Bl.delete(t),r.byteLength-t.byteLength>=16384&&(e[e.length-1]=t.slice())},Bl=new WeakMap;var Fl=class extends Error{constructor(e){super(e),this.name="JsonSyntaxError"}},Ul=class extends Error{constructor(){super('Request body has more than one top-level "model" field.'),this.name="DuplicateModelError"}};const Hl=0,zl=1,Jl=2,Gl=3,Kl=4,Wl=5,Yl=6,Vl=7,Xl=8,Zl=9,Ql=10,ec=11,tc=12,rc=13,oc=14,nc=15,ac=16,ic=17,sc=18,lc=19,cc=20,uc=21,dc=[239,187,191],pc=[34,109,111,100,101,108,34],mc=e=>32===e||10===e||13===e||9===e,fc=e=>e>=48&&e<=57,hc={[rc]:[oc,nc,-2,-2,-2,-2],[oc]:[-1,-1,ac,sc,-1,-1],[nc]:[nc,nc,ac,sc,-1,-1],[ac]:[ic,ic,-2,-2,-2,-2],[ic]:[ic,ic,-1,sc,-1,-1],[sc]:[cc,cc,-2,-2,lc,-2],[lc]:[cc,cc,-2,-2,-2,-2],[cc]:[cc,cc,-1,-1,-1,-1]};var gc=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))}},yc=class{state=Hl;stack=new gc;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===Xl&&"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===oc||this.state===nc||this.state===ic||this.state===cc)&&(this.state=Vl),this.state!==Vl&&this.fail("Unexpected end of JSON input")}fail(e){throw new Fl(`${e} at byte ${this.offset}`)}step(e){switch(this.state){case Hl:return e===dc[0]&&0===this.offset?(this.state=uc,void(this.bomIndex=1)):(this.state=zl,void this.step(e));case uc:return e!==dc[this.bomIndex]&&this.fail("Unexpected token"),void(++this.bomIndex===dc.length&&(this.state=zl));case zl:case Jl:if(mc(e))return;return 93===e&&this.state===Jl?void this.closeContainer():void this.startValue(e);case Gl:case Kl:if(mc(e))return;return 125===e&&this.state===Gl?void this.closeContainer():(34!==e&&this.fail("Expected a property name"),void this.beginString(1===this.stack.length?"key":"none",!0));case Wl:if(mc(e))return;return 58!==e&&this.fail("Expected ':'"),void(this.state=zl);case Yl:{if(mc(e))return;let t=this.stack.top();return 44===e?void(this.state=t?Kl:zl):e===(t?125:93)?void this.closeContainer():void this.fail("Expected ',' or a close")}case Vl:return void(mc(e)||this.fail("Unexpected non-whitespace after JSON"));case Xl:return void this.stringByte(e);case Zl:return this.record(e),117===e?(this.state=Ql,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=Xl));case Ql:return(e=>fc(e)||e>=97&&e<=102||e>=65&&e<=70)(e)||this.fail("Bad Unicode escape"),this.record(e),void(0===--this.hexLeft&&(this.state=Xl));case ec: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=Xl));case tc: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=Gl);case 91:return this.stack.push(!1),void(this.state=Jl);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=rc);default:48===e?this.state=oc:fc(e)?this.state=nc:this.fail("Unexpected token")}}beginLiteral(e){this.literal=e,this.literalIndex=1,this.state=tc}beginString(e,t=!1){this.state=Xl,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=Zl):(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=ec))}endString(){let e=this.stringRole;if(this.stringRole="none",this.stringIsKey){if(this.state=Wl,"key"!==e)return;if(!this.captureOverflow&&this.isModelKey(this.capture)){if(this.modelSeen)throw new Ul;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!==pc.length||!e.every((e,t)=>e===pc[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?Vl:Yl}closeContainer(){this.stack.pop(),this.endScalar()}numberByte(e){let t=hc[this.state]?.[(e=>48===e?0:fc(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 _c=class extends Error{kind;constructor(e){super(`JSON request body rejected: ${e}`),this.kind=e,this.name="JsonBodyError"}},wc=class extends Error{constructor(){super("The JSON request body upload stopped before its end."),this.name="UploadCancelledError"}};const bc=async(e,t)=>{let r,o=new yc,n=e?.getReader(),a=[],i=0,s=(()=>{let e,t,r=new Promise((r,o)=>{e=r,t=o});return r.catch(()=>{}),{promise:r,resolve:e,reject:t}})(),l={reading:!1,stop:!1},{claim:c,discard:u,end:d}=vc(n,t,()=>({read:i,deadline:l.deadline})),p=()=>(s.reject(new wc),a.length=0,c(),Sc(l,n,u),Promise.resolve()),m=e=>{i+=e.byteLength},f=e=>{if(m(e),i>t.limit)throw r=new _c("too-large");if(void 0!==t.declaredLength&&i>t.declaredLength)throw r=new _c("length-mismatch");try{Ac(o,e)}catch(e){throw r=e,e}},h=()=>{if(d(),void 0!==t.declaredLength&&i!==t.declaredLength)throw r=new _c("length-mismatch");try{o.end()}catch{throw r=new _c("invalid-json")}if(!o.isObject)throw r=new _c("not-object")},g=e=>({model:o.model,head:a,headLength:i,declaredLength:t.declaredLength,rest:e?.rest??null,cancel:p,failure:()=>r,complete:e?s.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 c=xc(t,i);if(c)throw r=c;if(Dl(a,e.value),void 0!==o.model&&i!==t.declaredLength&&n)return g(Ec(Tc(n,{take:f,count:m,finish:h,settled:s,discard:u,control:l}),s))}}catch(e){throw s.reject(e),u(),e}},vc=(e,t,r)=>{let o,n=!1,a=!1,i=()=>{n||a||!e||(n=!0,o=_i(),!o&&t.drains&&(t.drains.refused=!0))};return{claim:i,discard:()=>{i();let n=o;return o=void 0,n&&e&&n.start(kc(e,{...r(),limit:t.limit,declared:t.declaredLength})),Promise.resolve()},end:()=>{a=!0}}},kc=(e,t)=>()=>mi(e,t),xc=(e,t)=>{let r=e.reserve?.(t)??"ok";return"busy"===r?new _c("no-capacity"):"too_large"===r?new _c("over-budget"):void 0},Ac=(e,t)=>{try{e.push(t)}catch(e){throw new _c(e instanceof Ul?"duplicate-model":"invalid-json")}};async function*Tc(e,t){let r,{take:o,count:n,finish:a,settled:i,discard:s,control:l}=t,c=!1;try{for(;;){let t=await $c(e,l);if(l.stop)throw t.done||n(t.value),new wc;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 wc),s())}}const Sc=(e,t,r)=>{e.stop=!0,e.reading?(e.deadline??=performance.now()+ui,e.watchdog??=setTimeout(()=>{t?.cancel().catch(()=>{})},Math.min(ci,ui))):r()},$c=(e,t)=>t.stop?Promise.reject(new wc):(t.reading=!0,e.read().finally(()=>{t.reading=!1,clearTimeout(t.watchdog)})),Ec=(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 wc),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}},Oc=(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)},Ic=(e,t)=>{switch("length-mismatch"===t&&(e=>{e.header("Connection","close")})(e),t){case"too-large":return Vs(e,ki(e.req.path));case"no-capacity":return $l(e,El.grow_denied);case"over-budget":return Ol(e);case"not-object":return Ys(e,"Request body must be a JSON object.");case"duplicate-model":return Ys(e,'Request body must have exactly one top-level "model" field.');case"length-mismatch":return Ys(e,"The request body length does not match its Content-Length.");default:return Ys(e,"Request body must be valid JSON.")}},Cc=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 bc(r,{limit:ki(e.req.path),declaredLength:i,drains:o,reserve:n})}catch(t){if(t instanceof _c)return Ic(e,t.kind);throw t}let s=a.model,l="too-long"===s?.kind?Xs(e,"","Model name is too long."):Xs(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:Oc(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?Ic(e,t):void 0},cancelBody:a.cancel,...a.rest&&{uploadComplete:a.complete,uploadIdleMs:a.idleMs}}};var Rc=class extends Error{status;constructor(e,t){super(e),this.status=t,this.name="MultipartScanError"}},qc=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 Rc(`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 Rc("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=Nc(e,o,this.delimiter);return this.bodyBytes(e,t,e.byteLength-n),this.keep(e,e.byteLength-n,r),-1}let a=Pc(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 Rc("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=Mc(e);if(r?.file&&r.name===this.name)throw new Rc(`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 Rc(`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 Rc(`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 Pc=(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},Nc=(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},Mc=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=jc(r);return{name:"form-data"===r.split(";")[0].trim().toLowerCase()?o.get("name"):void 0,file:o.has("filename")||o.has("filename*")}}},jc=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},Dc=(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:(e=>o.active&&o.size+e.byteLength>t)(e.value)?o.dropped=!0:(Dl(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 wl,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 Fc);if(o.next<o.queue.length){let t=o.queue[o.next];return o.queue[o.next++]=Bc,void e.enqueue(t)}if(o.done)return void e.close();let{inflight:t}=o;if(!t)break;await t,l()}await Lc(r,e)},cancel:e=>r.cancel(e)})),cancel:async e=>{o.active=!1,await r.cancel(e).catch(()=>{})},dropped:()=>o.dropped,failure:i}},Lc=async(e,t)=>{let r;try{r=await e.read()}catch(e){return void t.error(e??new wl)}r.done?t.close():t.enqueue(r.value)},Bc=new Uint8Array;var Fc=class extends Error{constructor(){super("The early answer did not fit in the spool."),this.name="SpoolOverflowError"}};const Uc=new B,Hc=(e,t,r)=>{if(t instanceof Cl)return Il(e);if(t instanceof Jc){let r=Xs(e,t.value);return r instanceof Response?r:Ys(e,t.message)}return 413===t.status?Vs(e,r):Ys(e,t.message)};var zc=class extends Error{constructor(){super("The upload did not reach the upstream in full."),this.name="UploadStoppedError"}},Jc=class extends Error{value;constructor(e){super("The multipart model field is missing or not valid."),this.name="ModelPartError",this.value=e}};const Gc=e=>{try{return Oi(e)}catch(t){throw t instanceof Ei?new Jc(e):t}},Kc=async(e,t,r)=>{let o=(e=>{let t=jc(e).get("boundary");return t&&t.length<=70?t:void 0})(t),n=e.req.raw.body;if(!o||!n)return Ys(e,"Malformed multipart/form-data body.");let a=ki(e.req.path),i=new qc(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:d}=au(n.getReader(),{limit:a,declared:c},r),p=[],m=Lt(e),f=await Yc({reader:u,drain:d,scanner:i,held:p,declared:c,signal:m});if("boolean"!=typeof f)return Hc(e,f,a);let{field:h}=i;if(!f&&!h){let e={};return{...Wc({contentType:t,drain:d,body:{chunks:p,length:void 0},rest:t=>Vc({reader:u,drain:d,scanner:i,declared:c,signal:m,onError:t,onModel:t=>{e.model=t}}),model:""}),found:e,lateModel:()=>e.model}}let g=Xs(e,h?.value??null);if(g instanceof Response)return f||d(),g;let y=p,_=0;return h&&h.value!==g&&(y=Xc(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)+_}}):Wc({contentType:t,drain:d,body:{chunks:y,length:l?s+_:void 0},rest:e=>Vc({reader:u,drain:d,scanner:i,declared:c,signal:m,onError:e}),model:g})},Wc=({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,d={[Symbol.asyncIterator]:()=>d,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 zc)})(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=>a&&Hc(e,a,ki(e.req.path)),cancelBody:()=>(t(),Promise.resolve()),uploadComplete:s,uploadIdleMs:()=>u||void 0===l?0:Date.now()-l}},Yc=async({reader:e,drain:t,scanner:r,held:o,declared:n,signal:a})=>{try{for(;;){let{done:t,value:i}=await ql(e,a);if(t)return r.finish(),void 0===n||r.total===n||new Rc("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 Cl)return await Rl(e),r;if(t(),r instanceof Rc)return r;throw r}};async function*Vc({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 ql(e,n);if(t){if(r.finish(),void 0!==o&&r.total!==o)throw new Rc("The request body length does not match its Content-Length.",400);if(u)throw new Jc(null);return void(s=!0)}let d=r.total;if(r.push(a),!u){yield a;continue}if(0===l.length&&(c=d),!r.field){r.inField?l.push(a):yield a;continue}l.push(a);let{field:p}=r,m=Gc(p.value);i?.(m);let f=m===p.value?l:Xc(l,c,{...p,value:m});l=[],u=!1,yield*f}}catch(e){throw(e=>e instanceof Rc||e instanceof Jc||e instanceof Cl)(e)&&a(e),e}finally{s||t()}}const Xc=(e,t,{start:r,end:o,value:n})=>{if(r<t)throw new Rc("Malformed multipart/form-data body.",400);let a=q.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},Zc=3e4,Qc=1e3,eu=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)),tu=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)),ru=async(e,t,r)=>{if(!t.uploadComplete)return{body:r};let o=Dc(r,ou);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),Qc)});try{if(await Promise.race([r,n]))return!t.dropped()||"blocked"}finally{clearTimeout(o)}if(t.dropped())return"blocked";if((e.uploadIdleMs?.()??0)>=Zc)return"stalled"}})(t,o);if(!0!==n)return await o.cancel(new bl(`upload ${n}`)),await(t.cancelBody?.()),iu(e,t),{failed:"stalled"===n?tu(e):eu(e),body:r}}catch(n){return await o.cancel(new bl("The upload failed.",{cause:n})),await(t.cancelBody?.()),iu(e,t),{failed:t.bodyFailure?.(e)??(n instanceof zc||n instanceof wc?Ys(e,"The request body did not reach the upstream in full."):await Dr(e,n)),body:r}}return iu(e,t),{body:o.release()}},ou=Ga;var nu=class extends Error{constructor(){super("The client body is being drained."),this.name="BodyHandedOff"}};const au=(e,t,r)=>{let o,n=0,a=!1;return{reader:{read:async()=>{if(a)throw new nu;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,bi(async()=>{let r=performance.now()+ui;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(ci,t-performance.now()))})])}finally{clearTimeout(r)}})(o,r)?await e.cancel().catch(()=>{}):await mi(e,{read:n,...t,deadline:r})})||(r.refused=!0))}}},iu=(e,t)=>{let r=t.found?.model;if(!r)return;let o=e.get("requestData");o?o.model=r:e.set("requestData",{model:r})},su=async(e,t,r)=>(await(t?.cancelBody?.()),t&&iu(e,t),t?.bodyFailure?.(e)||(r instanceof nl?(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)?Ys(e,"The request body length does not match its Content-Length."):Dr(e,r))),lu=(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 ql(r,t);o.done?e.close():e.enqueue(o.value)}catch(t){t instanceof Cl&&(o=!0),e.error(t),await Rl(r)}},async cancel(e){await Rl(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:Nl(n,Number.isSafeInteger(s)&&s>=0?s:void 0)};return"generations"===t?Cc(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?Cc(e,"edits",{stream:t(),...r}):"multipart/form-data"===n?Kc(e,o,r.drains):Ys(e,"Image edits require a multipart/form-data or application/json body.")})(e,i,l)},cu=e=>async(t,r)=>{let o,n,a={timedOut:()=>!1},i=!1;try{if(uo(he))return Ys(t,"Image endpoints are available only with the Copilot provider.");await Ci(he);let s=Lt(t),l=await jl(t,e,s);if(l instanceof Response)return l;n=l;let c=await lu(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 Ti(t);if(u)return await(o.cancelBody?.()),u;he.manualApprove&&await Ai(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"),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),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:Ml(t)},clientEnded:o.clientEnded}})(l,s,d),m=await(async(e,t,r={})=>{let{onBodyEnd:o,beforeAttempt:n}=r,a=!al(e.body)||null===e.body.rest;a||await sl();let i={replayable:a,attempts:1,refreshed:!1,start:Date.now()};for(;;)try{await il(i.deadline,e=>n?.(e)),i.deadline??=performance.now()+he.timeoutMs;let r=i.deadline-performance.now();if(r<=0)throw new fr(he.timeoutMs);return await cl(e,t,{onBodyEnd:o,timeoutMs:r})}catch(e){if(!(e instanceof mr))throw e;await ll(e,i,t)}})(o,s,p.hooks),f=await ru(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 Rl(r,e),t()}})})(f.body,p.clientEnded),{status:200,headers:{"content-type":m.contentType}}))}catch(e){return a.timedOut()?(await(o?.cancelBody?.()),Il(t)):await su(t,o,e)}finally{i||n?.release()}},uu=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 vi(t.req.raw,ki(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 du(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function pu(e){return!du(e)}function mu(e,t,r){return null==t?null:("string"==typeof r.model&&e.set("requestData",{...e.get("requestData"),model:r.model,streaming:!!r.stream}),e.get("requestSpan")?.setAttribute("copilot_api.error_type","thread_unsupported_request"),e.json({type:"error",error:{type:"invalid_request_error",message:"This route does not support message threads. Resend the full conversation, system instructions, and tools without thread.",details:{error_code:"thread_unsupported_request"}}},400))}Uc.post("/generations",uu(cu("generations"))),Uc.post("/edits",uu(cu("edits")));const fu=new Y(X);let hu;const gu={...V["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function yu(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 _u(e,t){let r=0;for(let o of e)switch(o.type){case"text":r+=t(o.text)*gu.contentMultiplier;break;case"tool_use":r+=t(o.name+JSON.stringify(o.input))*gu.contentMultiplier;break;case"tool_result":o.content&&(r+=t("string"==typeof o.content?o.content:JSON.stringify(o.content))*gu.contentMultiplier);break;case"thinking":r+=t(o.thinking)*gu.contentMultiplier;break;case"image":r+=1600}return r}function wu(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?gu.perFirstProp:gu.perAdditionalProp,r+=t(o),a.description&&(r+=gu.perPropDesc+t(a.description)),a.enum&&Array.isArray(a.enum)){r+=gu.perEnum;for(let e of a.enum)r+=t(String(e))}if("object"===a.type&&a.properties&&(r+=gu.perNestedObject,r+=wu(a,t)),"array"===a.type&&a.items){let e=a.items;"object"===e.type&&e.properties&&(r+=gu.perArrayOfObjects,r+=wu(e,t))}}return r}const bu={event:"ping",data:JSON.stringify({type:"ping"})};function vu(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(bu).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 ku(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 xu(e,t,r){let o=ku(t,r);for(let[t,r]of Object.entries(o))void 0!==r&&e.setAttribute(t,r)}const Au=async(e,t,o)=>{try{return await Tu(e,t)}catch(n){if(n instanceof mr&&401===n.response.status){if(!await eo(n))throw n;return Tu(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}`),Tu(i,t)}throw n}};const Tu=async(e,t)=>{if(!ho(he))throw Error("Service token not found");let{baseUrl:r,headers:o,cleanPayload:n}=uo(he)&&he.foundry?{baseUrl:lo(he.foundry),headers:co(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}}($a(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,...ku(e,t?.anthropicBeta)}}(n,t,i);for(let e=0;e<=1;e++){me();let t=es(r,{fresh:e>0}),c=new AbortController,u=Xo(c,i);try{let{statusCode:r,headers:d,body:p,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=ns(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:as(f,p),span:m,release:()=>ts(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&&$i(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(),ts(t)}}catch(r){if(ts(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")},Su=new Set(["resolveStreamComplete","requestId"]);function $u(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 Eu(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))Su.has(t)||o.set(t,r);return o}(e);try{let e,t=await async function(e,t,r){let o=await un(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?$u(o,e):o}))}catch(t){if(Ft(e))return;let r=e.get("requestSpan");throw r&&ht(r,t),await Pi(o,t),t}finally{e.set("requestData",s.get("requestData"))}}const Ou=24e4;var Iu=class extends fr{name="StreamHeadersTimeoutError"};function Cu(){if(le())return;let e=new AbortController,t=setTimeout(()=>{e.abort(new Iu(Ou))},Ou);return{signal:e.signal,clear:()=>clearTimeout(t)}}function Ru(e,t){e.get("requestSpan")?.setAttribute("copilot_api.stream.headers_wait_ms",Math.round(performance.now()-t))}async function qu(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&&Ru(e,r),n}catch(t){throw o?.setAttribute("copilot_api.stream.early_commit",!1),Ru(e,r),t}}const Pu={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"},Nu=e=>Pu[e]??(e>=500?"api_error":"invalid_request_error");async function Mu(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 Dr(r,t);if(499===o.status)return;if((e=>e instanceof Iu||e instanceof Error&&e.cause instanceof Iu)(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:Nu(o.status),message:n}}async function ju(e,t,r){await t.client.writeSSE(bu);try{let t=await r.pending;return Ru(e,r.start),t}catch(o){if(Ru(e,r.start),Ft(e))return void Oe.completionCallbacks.delete(e.get("requestId"));let n=function(e,t){if(sn(e))return Zo(t,void 0!==rn()?.sent)}(e,o);if(n)return void await Eu(e,t,{reason:n,progress:{messageStart:!1,content:!1,held:[]},failure:o});let a=await Mu(e,o);return void(a&&await t.client.writeSSE({event:"error",data:JSON.stringify({type:"error",error:a})}))}}const Du=new Set(["low","medium","high","max","xhigh"]),Lu=(e,t)=>!(!e||!t||e===t);function Bu(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!Du.has(t))return e;let o=he.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,n=jo(t,o);if(!n||!Du.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 Fu(e,t,o){if("foundry"===he.provider)return Bu(e);let n=t.includes(e.model)?e.model:No(e.model,t)??e.model,a=n===e.model?e:{...e,model:n},i=function(e,t,r={}){let o=No(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 Bu(s)}const Uu=e=>"object"==typeof e&&!!e&&!Array.isArray(e),Hu=["properties","patternProperties","$defs","definitions"],zu=["items","additionalProperties","propertyNames","contains","not","if","then","else"],Ju=["anyOf","allOf","oneOf","prefixItems"];const Gu=()=>["string","number","boolean"].map(e=>({type:e})),Ku=()=>({anyOf:[...Gu(),{type:"array",items:{anyOf:Gu()}},{type:"object"}]}),Wu=e=>!0===e||Uu(e)&&0===Object.keys(e).length,Yu=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function Vu(e,t){let r={...e};for(let e of Hu){let o=r[e];Uu(o)&&(r[e]=Object.fromEntries(Object.entries(o).map(([e,r])=>[e,Uu(r)?Vu(r,t):r])))}for(let e of zu){let o=r[e];Uu(o)&&(r[e]=Vu(o,t))}for(let e of Ju){let o=r[e];Array.isArray(o)&&(r[e]=o.map(e=>Uu(e)?Vu(e,t):e))}return"prefixItems"in r&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(Uu(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let r=t.flatMap(e=>Wu(e)?Ku().anyOf:Uu(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)),Yu(r)&&(!("items"in r)||Wu(r.items))&&(t.add("items"),r.items=Ku()),Wu(r.additionalProperties)&&(t.add("additionalProperties"),delete r.additionalProperties),r}function Xu(e){let t=[],r=[];for(let o of e)switch(o.role){case"system":{if(r.length>0){r.push(o);break}let e=Qu(o);e&&t.push(e);break}case"user":case"assistant":r.push(o)}return{leadingSystemTexts:t,messages:r}}function Zu(e){return ed(Qu(e))}function Qu(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 ed(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function td(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>ed(e)).filter(Boolean).join("\n\n")}const rd=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),od=new Set(["text","image"]);function nd(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);od.has(e)||t.add(`block:tool_result:${e}`)}}const ad=new Set;function id(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=rd.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&&nd(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(ad.size>=100)break;ad.has(r)||(ad.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 sd=e=>P("sha256").update(e).digest("hex").slice(0,12);function ld(e,t){e.setAttribute("copilot_api.translation.system_hash",sd(t.system)),e.setAttribute("copilot_api.translation.tools_hash",sd(JSON.stringify(t.tools??[])))}function cd(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function ud(e){return e.toLowerCase().startsWith("claude-")}function dd(e,t){let r={model:e.model,messages:pd(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:bd(e.tools,e.model),tool_choice:vd(e.tool_choice)},o=e.thinking;if("enabled"===o?.type||"adaptive"===o?.type){let n=Li(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=Mi(t),a=n&&n>1?n-1:r.min;return ji(Math.min(o,a),r.min,r.max)}(e.output_config?.effort??"high",r.max_tokens,n.bounds);r=Fi({...r,thinking_budget:a},t)}}return r}function pd(e,t){let{leadingSystemTexts:r,messages:o}=Xu(e),n=function(e,t){let r=td(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;md(n)?a.push(t):fd(n,t);break}case"user":n.push(...hd(e));for(let e of a)fd(n,e);a=[];break;case"assistant":n.push(...gd(e))}for(let e of a)fd(n,e);return n}function md(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function fd(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 hd(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:wd(e.content)});o.length>0&&t.push({role:"user",content:wd(o)})}else t.push({role:"user",content:wd(e.content)});return t}function gd(e){let t=function(e){return{reasoning_text:_d(e.reasoning_text),reasoning_opaque:_d(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:wd(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:wd(e.content),...t}]}const yd=32768;function _d(e){if("string"==typeof e)return e.length<=yd?e:e.slice(0,yd)}function wd(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 bd(e,t){if(!e)return;let r=e.filter(pu),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:Vu(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 vd(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 kd(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 xd(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Ad(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 Td=new Set(["low","medium","high","max","xhigh"]);function Sd(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&&Td.has(e)?e:null)(jo(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 $d(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 Ed=/[^\w-]/g;function Od(e){return e.replaceAll(Ed,"_")}function Id(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=Sd(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:$d(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:Od(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Od(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(r),r}function Cd(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 Rd(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 qd(e,t){return Me.startActiveSpan("copilot_api.model.validate",o=>{try{o.setAttribute("copilot_api.model.requested",t.model),xu(o,t,e.req.header("anthropic-beta"));let n=Oi(t.model);o.setAttribute("copilot_api.model.normalized",n);let a=Cd(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 Ei)return{ok:!1,response:Rd(e,t.message,t.statusCode)};throw t}finally{o.end()}})}var Pd=class extends Ri{name="UpstreamIdleError";constructor(e){super("api_error",`Upstream sent nothing for ${Math.round(e/1e3)}s; stream aborted`)}};function Nd(e,t,r){let{leadingSystemTexts:o,messages:n}=Xu(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(Fd(e));break}case"user":t.push(...Ud(o),...r.map(e=>Fd(e))),r=[];break;case"assistant":t.push(...Jd(o))}return t.push(...r.map(e=>Fd(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 td(e,t)||null}(e.system,o);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(pu).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:Bd(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=jo(r,t);return{effort:Ld(o)?o:r}}}(e,t,r?.keepMax??!1);return l&&(i.reasoning=l),r?.promptCacheKey&&(i.prompt_cache_key=r.promptCacheKey),i}function Md(e,t){let r=e?.trim()||t?.trim();if(r)return`cc-${P("sha256").update(r).digest("hex").slice(0,32)}`}function jd(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 Dd=new Set(["low","medium","high","xhigh"]),Ld=e=>null!==e&&Dd.has(e);function Bd(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Fd(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function Ud(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(zd(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(Hd(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 Hd(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function zd(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?Hd(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 Jd(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 Gd(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 Kd(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Wd(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 Yd(e,t){let r=[];switch(e.type){case"response.created":Wd(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){Wd(t,r),Kd(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":Wd(t,r),Kd(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":Kd(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":{Kd(t,r);let o=e.response.output.some(e=>"function_call"===e.type),n=e.response.usage,a=Gd(e.response,o);t.terminalEvent=e.type,t.stopReason=a,r.push({type:"message_delta",delta:{stop_reason:a,stop_sequence:null},usage:jd(n)},{type:"message_stop"});break}case"response.incomplete":{Wd(t,r),Kd(t,r);let o=e.response.usage,n=Gd(e.response,!1);t.terminalEvent=e.type,t.stopReason=n,r.push({type:"message_delta",delta:{stop_reason:n,stop_sequence:null},usage:jd(o)},{type:"message_stop"});break}case"response.failed":Wd(t,r),Kd(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":Wd(t,r),Kd(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":Wd(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 Vd(e,t,r){let o=t.reasoning?.effort,n=e.get("requestData")||{};n.reasoningEffort=o,n.effortClamped=Lu(r,o),e.set("requestData",n)}function Xd(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function Zd(e,t,o){let n=!1;for(let a of t){if(r.debug("Translated Anthropic event:",a),"error"===a.type)throw new Ri(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 Qd(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 ep(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 tp(e,t){let r=performance.now()-t;return nt.record(r,{model:e.model,target:"responses",streaming:String(!!e.stream)}),r}function rp(e,t){return G(e,async r=>{let o=vu(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 op(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:d,_d1:p,upstreamIdle:m}=o,f=null,h=0,g=performance.now(),y=Qd(g),_=zi(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: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 Pd(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=ep(t.data);if(!o)continue;h++,Ze.add(1,{model:u,endpoint_type:"responses"});let n=As(o);if(n){f=n;let t=e.get("requestData")||{};t.tokenUsage=Si(f),t._d1=p,e.set("requestData",t)}await Zd(i,Yd(o,w),b)&&y.forwarded()}(function(e){if(!e.terminalEvent)throw new Ri("api_error","Upstream stream ended before the response completed")})(w),cn();let t=performance.now()-g,o={model:u,endpoint_type:"responses"};at.record(t,o),pt.record(h,o),Ji(e,d)}catch(t){if(Ft(e))return;if(b.content||!sn(e))throw function(e,t,r){if(!(t instanceof Ri))return;let o="stream_incomplete";t instanceof Pd?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 Pi(a,t),t;n=t instanceof Pd?"foundry_stream_idle":"foundry_stream_failed",ht(l,t)}finally{f&&$i(l,f),y.record(l),n||function(e,t,r){e&&(Xd(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 Eu(e,t,{reason:n,progress:b})}async function np(e,t,n){let a=performance.now(),i=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),id(r,t.messages);let o=Nd(t,he.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===he.provider,promptCacheKey:"foundry"===he.provider?Md(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return ld(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}),Vd(e,i,n),he.manualApprove&&await Ai();let s=performance.now(),l=new AbortController,{pending:c,capped:u}=function(e,t,r){let o=t.stream?Cu():void 0;return{pending:bs(t,{onAttempt:t=>Vd(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 qu(e,c,s))return function(e,t,r){let{pending:o,copilotStart:n,upstreamIdle:a}=r;return ln(),rp(e,async r=>{let i=await ju(e,r,{pending:o,start:n});i&&!xs(i)&&await op(e,r,{response:i,model:t.model,copilotStart:n,_d1:tp(t,n),upstreamIdle:a})})}(e,i,{pending:c,copilotStart:s,upstreamIdle:l});let d=await c,p=tp(i,s);if(xs(d)){let t=e.get("requestData")||{};if(Xd(e.get("requestSpan"),d.usage?.output_tokens_details?.reasoning_tokens),d.usage&&(t.tokenUsage=Si({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(),a=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:Gd(e,r),stop_sequence:null,usage:jd(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(a)}return ln(),rp(e,t=>op(e,t,{response:d,model:i.model,copilotStart:s,_d1:p,upstreamIdle:l}))}function ap(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 ip(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function sp(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&&(ap(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&&(ap(t,r),r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:n.reasoning_opaque}}),ip(t,r)),n.content&&(ip(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){ip(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&&(ip(t,r),t.contentBlockOpen&&=(r.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),r.push({type:"message_delta",delta:{stop_reason:cd(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 lp=/structured_outputs|output_config\.format/i;function cp(e,t,r){return function(e,t,r){return!(!e.output_config?.format||"claude-haiku-4.5"===r||!t)&&lp.test(t)}(e,t,e.model)&&r?.data.some(e=>"claude-haiku-4.5"===e.id)?Id({...e,model:Co},r):null}const up=new WeakMap;var dp=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}},pp=class extends Error{domain;reason;constructor(e,t,r){super(e),this.name="ExaInvalidDomainError",this.domain=t,this.reason=r}};async function mp(e){if(!e.ok){let t=await e.text(),r=`Exa API error: ${e.status} ${t}`,o=400===e.status?function(e){try{let t=JSON.parse(e);if("INVALID_DOMAIN"!==t.tag||"string"!=typeof t.error)return null;let r=t.error.lastIndexOf(": ");return-1===r?null:{domain:t.error.slice(r+2),reason:t.error}}catch{return null}}(t):null;throw o?new pp(r,o.domain,o.reason):Error(r)}return await e.json()}var fp=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const hp={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 fp: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 mp(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 dp:e}finally{clearTimeout(i)}}},gp=["tavily","exa"];function yp(e){return"tavily"===e||"exa"===e}function _p(){return he.webSearchProviders.length>0}async function wp(e,t){return async function(e,t,o){let{providers:n,searchFns:a=hp}=o;if(0===n.length)throw Error("No web search provider configured");let i,s,l=[];for(let[o,c]of n.entries())try{let o=await a[c.name](c.key,e,t);return l.length>0&&r.info(`Web search recovered: served by "${c.name}" after ${l.join(", ")} failed.`),o}catch(e){i=e,e instanceof pp&&(s??=e),l.push(c.name);let t=e instanceof Error?e.message:String(e);o!==n.length-1&&r.warn(`Web search provider "${c.name}" failed (${t}); falling over to "${n[o+1].name}".`)}let c=i instanceof Error?i.message:String(i);throw r.error(`Web search failed: all providers exhausted (${l.join(", ")}). Last error: ${c}`),s||(i instanceof Error?i:Error("All web search providers failed"))}(e,t,{providers:he.webSearchProviders})}function bp(e){let t=e.tools;return!(!t||1!==t.length)&&du(t[0])}function vp(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function kp(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 xp(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&&du(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(!_p())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await wp(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(o){if(o instanceof pp){let a=`Invalid web search domain filter: ${function(e,t){let{allowedDomains:r,blockedDomains:o}=e;return Array.isArray(r)&&r.includes(t)?"allowed_domains":Array.isArray(o)&&o.includes(t)?"blocked_domains":null}(n,o.domain)??"a domain filter"} contains "${o.domain}". The search provider rejected it: ${o.reason}. Use a full domain such as "example.com".`;return r.warn(a),e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}r.error("Web search failed:",o),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_${vp()}`,n=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:o,name:"web_search",input:{query:t}},{...kp(o,e)}];return{id:`msg_ws_${vp()}`,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_${vp()}`,n=`msg_ws_${vp()}`,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:kp(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 Ap(e){if(ho(he)||await Rn())return null;let t=Tn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${$n()}`}},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 Tp(e){if("foundry"!==he.provider)return ud(e);let t=he.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:ud(e)}async function Sp(e,t){(void 0!==e.thread&&null!==e.thread)===t&&await Ci(he)}async function $p(e,t){return void 0===t.thread||null===t.thread||"foundry"===he.provider&&!he.models?.data.some(e=>e.id===t.model)&&!(await async function(){let e=he.foundry;if(!e)throw Error("Foundry configuration is unavailable");let t=Date.now(),r=up.get(e);if(!r||r.expires<=t){let t=Math.max(1e3,1e3*(he.rateLimitSeconds??0)),o=he.models,n=So().then(e=>(he.models===o&&(he.models=e),he.models??e));r={result:n,previous:o,expires:1/0},up.set(e,r);let a=r;n.then(()=>{a.expires=Date.now()+t},()=>{a.result=void 0,a.expires=Date.now()+t})}if(!r.result){if(he.models&&he.models!==r.previous)return he.models;let e=Math.max(1,Math.ceil((r.expires-t)/1e3)),o="Deployment discovery rate limit exceeded. Retry later.";throw new mr(o,Response.json({type:"error",error:{type:"rate_limit_error",message:o}},{status:429,headers:{"Retry-After":String(e)}}))}let o=await r.result;return he.models??o}()).data.some(e=>e.id===t.model)?null:"foundry"!==he.provider||Ii(t.model)||!Tp(t.model)?mu(e,t.thread,t):null}function Ep(e,t){let r=t.model;return r&&"string"==typeof r?null:Rd(e,"Model name is required and must be a string")}function Op(e,t){let r=performance.now()-t;return nt.record(r,{model:e.model,target:"chat_completions",streaming:String(!!e.stream)}),r}function Ip(e,t){return G(e,async r=>{let o=vu(r);r.onAbort(()=>{o.stop(),Bt(e)});try{await t({stream:r,client:o})}finally{o.stop(),e.get("resolveStreamComplete")?.()}})}async function Cp(e,t,r){let{pending:o,capped:n,copilotStart:a}=r;if(n&&!await qu(e,o,a))return function(e,t,r){let{pending:o,copilotStart:n}=r;return ln(),Ip(e,async r=>{let a=await ju(e,r,{pending:o,start:n});if(a)Pp(a)||(cn(),await Rp(e,r,{response:a,model:t.model,copilotStart:n,_d1:Op(t,n)}));else{let t=e.get("requestId");t&&Oe.executeCompletion(t)}})}(e,t,{pending:o,copilotStart:a})}async function Rp(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:d}=o,p=null,m=0,f=performance.now(),h=zi(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){p=o.usage;let t=e.get("requestData")||{};t.tokenUsage=Si(p),t._d1=d,e.set("requestData",t)}let n=sp(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),pt.record(m,o),Ji(e,u),p){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Si(p),t._d1=d,e.set("requestData",t))}}catch(t){throw gt(s,e.get("requestSpan"),t),await Pi(n,t),t}finally{p&&$i(s,p),s.end(),l()}let y=e.get("requestId");y&&Oe.executeCompletion(y)}async function qp(e){let t=await e.req.json();if(bp(t))return function(e,t){return Ep(e,t)??mu(e,t.thread,t)??xp(e,t)}(e,t);await Sp(t,!1),r.debug("Anthropic request payload:",t);let n=t.output_config?.effort,a=Ep(e,t);if(a)return a;t=function(e,t){return Fu(t,he.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=qd(e,t);if(!i.ok)return i.response;t=i.payload;let s=await $p(e,t);if(s)return s;await Sp(t,!0);let l=await Ap(e);if(l)return l;if(Ii(t.model))return np(e,t,n);if(Tp(t.model))return async function(e,t,r){let o="foundry"===he.provider,n=o?t:Id(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:Lu(r,i),streaming:!!n.stream}),he.manualApprove&&await Ai(),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),xu(t,n,a.anthropicBeta);try{let r=performance.now(),i=await Au(n,a,{onStructuredOutputFallback:(e,r)=>{if(o)return null;let n=cp(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=Si(Np(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},d=!1,p=zi(e,r);try{try{for await(let e of l)p(),!e.data||"[DONE]"===e.data||(a++,Ze.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),Mp(e.data,s)&&(d=!0)),await o.writeSSE(e);let e=performance.now()-i,t={model:n.model,endpoint_type:"anthropic_messages"};at.record(e,t),pt.record(a,t)}catch(t){throw gt(c,e.get("requestSpan"),t),await Pi(o,t),t}finally{if(Ji(e,r),d){let t=Np(s);$i(c,t);let r=e.get("requestData")||{};r.tokenUsage=Si(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 c=performance.now(),u=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),id(r,t.messages);let n=dd(t,he.models),a=n.messages.at(0);return ld(r,{system:"system"===a?.role&&"string"==typeof a.content?a.content:"",tools:n.tools}),n}finally{r.end()}});st.record(performance.now()-c,{direction:"anthropic_to_openai"}),u=Fi(u,he.models),r.debug("Translated OpenAI request payload:",u);let d=t.output_config?.effort;e.set("requestData",{model:u.model,reasoningEffort:d,effortClamped:Lu(n,d),streaming:!!u.stream});let p=performance.now();he.manualApprove&&await Ai();let{pending:m,capped:f}=function(e,t){let r=t.stream?Cu():void 0;return{pending:ds(t,r&&{signal:AbortSignal.any([Lt(e),r.signal])}).finally(()=>r?.clear()),capped:void 0!==r}}(e,u),h=await Cp(e,u,{pending:m,capped:f,copilotStart:p});if(h)return h;let g=await m,y=Op(u,p);if(Pp(g)){let t=e.get("requestData")||{};g.usage&&(t.tokenUsage=Si(g.usage)),t._d1=y,t.upstreamTtfbMs=y,t.upstreamTotalMs=y,e.set("requestData",t),r.level>=o.debug&&r.debug("Non-streaming response:",JSON.stringify(g).slice(-400));let n=performance.now(),a=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 a of e.choices){let e=xd(a.message),i=kd(a.message.content),s=Ad(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:cd(n),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(g);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 Ip(e,t=>Rp(e,t,{response:g,model:u.model,copilotStart:p,_d1:y}))}const Pp=e=>Object.hasOwn(e,"choices");function Np(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 Mp(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 jp=new B;jp.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&bp(t)}catch{return!1}}(e)?await qp(e):await dn(e,"messages",qp)}catch(t){return await Dr(e,t)}});const Dp=new B;function Lp(e){return Me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let o=Oi(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 Bp(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=Si(r),o._d1=t._d1,t.c.set("requestData",o)}Dp.get("/",async e=>{try{he.models||await fn();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 Dr(e,t)}});const Fp=new Set(["message","function_call","function_call_output"]),Up=new Set(["type","name","description","parameters"]);async function Hp(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||!_p())&&(r.info(`Enriching web search: "${o}"`),e.sources=(await wp(o,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function zp(e){if(_p())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Hp(e.action)}}catch(e){r.error("Failed to enrich non-streaming web search:",e)}}async function Jp(e){if(!_p())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 Hp(e.action))return JSON.stringify(t)}}catch(e){r.error("Failed to enrich web search:",e)}return e}function Gp(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 Fp.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Kp(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 Wp(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&&Kp(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)Kp(e,t)&&(n=!0);if(n)return JSON.stringify(r)}}catch{}return e}function Yp(e){return null!=e}function Vp(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Xp(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Zp(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(!Vp(o)){r.push(o);continue}let e=Gp(o);null===e?t.add(Xp(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"])Yp(e[r])&&(t[r]=e[r]);let n=new Set;if(Yp(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))Up.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(Yp(e.reasoning)&&"object"==typeof e.reasoning){let r=e.reasoning;t.reasoning={},Yp(r.effort)&&(t.reasoning.effort=r.effort),Yp(r.summary)&&(t.reasoning.summary=r.summary)}if(Yp(e.text)&&"object"==typeof e.text){let r=e.text;Yp(r.format)&&(t.text={format:r.format})}return{payload:t,customToolNames:n,droppedInputTypes:o}}function Qp(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function em(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||Yp(o.previous_response_id)||Yp(o.prompt)||Yp(o.conversation)?null:Qp(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 tm(e){await Ci(he);let t=await e.req.json();if(!Vp(t))return Qp(e,"request body must be a JSON object");let o=function(e){return"foundry"===he.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:Zp(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:Lp(t)}}catch(t){if(t instanceof Ei)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=em(e,t.input,o);if(s)return s;let l=await Ti(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),he.manualApprove&&await Ai();let c=performance.now(),u=await bs(a,{signal:Lt(e)}),d=performance.now()-c;if(nt.record(d,{model:a.model,target:"responses",streaming:String(!!a.stream)}),rm(u))return async function(e,t,r){await zp(t);let o=e.get("requestData")||{};return t.usage&&(o.tokenUsage=Si({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,i=performance.now(),s=zi(e,c);try{try{for await(let i of p)if(s(),i.data&&"[DONE]"!==i.data){o++;let s=Wp(i.data,n);s=await Jp(s);let l=s===i.data?i:{...i,data:s};Ze.add(1,{model:a.model,endpoint_type:"responses"}),Bp(s,{usageRef:r,c:e,_d1:d}),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),pt.record(o,u),Ji(e,c)}catch(r){if(Ft(e))return;throw gt(m,e.get("requestSpan"),r),await Ni(t,r),r}finally{r.value&&$i(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 rm=e=>Object.hasOwn(e,"output"),om=new B;om.post("/",async e=>{try{return await dn(e,"responses",tm)}catch(t){return await Dr(e,t)}});const nm=new B;nm.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 am=new B;am.get("/",async e=>{try{let t=await Wn();return e.json(t)}catch(t){return r.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const im=new B;function sm(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 Sa(r).slice(0,200)}catch{}let t=Sa(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 lm(e={}){let t=performance.now(),r=e.model&&function(e){let t=he.models?.data.find(t=>t.id===e);return void 0!==t&&Ra(t)}(e.model)?[e.model]:function(e){return e.filter(e=>Ra(e)).map((e,t)=>({id:e.id,rank:qa(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 im.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[Oa]:Ia},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:sm(r.status,o,e),detail:o.slice(0,400)||void 0,modelUnavailable:Na(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)}}im.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===Ia}(e.req.header(Oa));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":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(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:a,path:i,endpointType:s,requestId:n,span:c};(y?.streaming||y?.deferFinalize)&&e.res.status<400?h.then(()=>li(_)).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{}}):li(_)}),im.use(F()),im.use(async(e,t)=>{let r=e.req.header("content-length");if(r){let t=Number(r),o=ki(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"})`),vi(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()}),im.get("/",e=>e.text("Server running")),im.route("/health",tl),im.route("/chat/completions",Gs),im.route("/models",Dp),im.route("/embeddings",el),im.route("/usage",am),im.route("/token",nm),im.route("/v1/chat/completions",Gs),im.route("/v1/models",Dp),im.route("/v1/embeddings",el),im.route("/images",Uc),im.route("/v1/images",Uc),im.route("/v1/messages",jp),im.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)}let r=mu(e,t.thread,{model:t.model});if(r)return r;if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let{name:o,tokenizer:n}=await async function(e){let t=he.models?.data.find(t=>t.id===e);return!t||"Anthropic"===t.vendor||bo(t.capabilities.family)||"o200k_base"!==t.capabilities.tokenizer?{name:"claude",tokenizer:fu}:(hu??=import("ai-tokenizer/encoding/o200k_base").then(e=>new Y(e)),{name:"o200k_base",tokenizer:await hu})}(t.model),a=e=>yu(n,e),i=gu.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");i+=gu.perMessage+a(e)*gu.contentMultiplier}for(let e of t.messages)i+=gu.perMessage,i+=a(e.role),"string"==typeof e.content?i+=a(e.content)*gu.contentMultiplier:Array.isArray(e.content)&&(i+=_u(e.content,a));let s=t.tools?.filter(pu);s&&s.length>0&&(i+=function(e,t){let r=gu.toolsExist;for(let[o,n]of e.entries())o>0&&(r+=gu.perTool),r+=t(n.name),n.description&&(r+=gu.perDesc+t(n.description)),r+=wu(n.input_schema,t);return r}(s,a));let l=Math.round(i);"string"==typeof t.model&&e.set("requestData",{model:t.model,streaming:!1});let c=e.get("requestSpan");return c?.setAttribute("copilot_api.count_tokens.estimate",l),c?.setAttribute("copilot_api.count_tokens.tokenizer",o),e.json({input_tokens:l})}),im.route("/v1/responses",om),im.route("/responses",om),im.route("/v1/decisions",Zs),im.route("/decisions",Zs),im.onError((e,t)=>Dr(t,e));const cm=e=>`${e}`,um=e=>`${e}`,dm=e=>`${e}`,pm=e=>`${e}`,mm=e=>`${e}`,fm=um(" ─────────────────────────────────────────────────────────────");function hm(e,t,r){console.log(` ${function(e){return"ok"===e?dm("✓"):"warn"===e?mm("⚠"):pm("✗")}(e)} ${cm(t.padEnd(14))} ${r}`)}function gm(e){console.log(` ${um("↳")} ${um(e)}`)}function ym(e){return e instanceof mr?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function _m(){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 wm(){try{await fn();let e=(he.models?.data.length??0)>0;return hm(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 hm("fail","Model catalog",ym(e)),gm("Could not fetch /models — check connectivity/auth."),!1}}async function bm(e){he.accountType=e.accountType;let t=await er(),r=tr();if(console.log(""),console.log(` ${cm("COPILOT-API DOCTOR")} ${um(`v${t}`)}`),console.log(fm),hm("ok","Runtime",`${r.name} ${r.version} (${r.platform}-${r.arch})`),await oe(),hn(),!await async function(){let e=await _m();if(e){he._t2=e.token,hm("ok","Auth token",`found (${e.source})`);try{let e=await Br();return await Et(he,e.login),hm("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return hm("fail","GitHub auth",ym(e)),void gm("Token looks invalid/expired. Re-run `copilot-api auth`.")}}else hm("fail","Auth token","not found"),gm("Run `copilot-api auth` (or `copilot-api start`) to authenticate.")}())return console.log(fm),console.log(` ${pm("✗")} ${cm("Authentication failed")} — cannot continue.`),console.log(""),1;let o=await async function(){try{let{token:e}=await Lr();return he._t1=e,hm("ok","Service token","acquired"),!0}catch(e){let t=e instanceof mr?e.response.status:0;return hm("fail","Service token",ym(e)),gm(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 wm();await async function(){try{let e=await Wn(),t=e.quota_snapshots.premium_interactions,r=t.unlimited?"credits unlimited":`credits ${Un(Hn(t))} of ${Un(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;hm("ok","Copilot plan",`${e.copilot_plan} · ${r} `+um(`(resets ${e.quota_reset_date})`))}catch(e){hm("warn","Copilot plan",`unavailable (${ym(e)})`)}}();let a=!1;return o&&n?a=await async function(){let e=await lm();return e.ok?(hm("ok","Generation",`works via ${e.model} ${um(`(${e.durationMs}ms)`)}`),!0):(hm("fail","Generation",`${e.reason}${e.status?um(` [HTTP ${e.status}]`):""}`),!1)}():hm("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){hm(t,"Client config","potential base-URL issue");for(let t of e)gm(t)}else hm("ok","Client config","no base-URL issues detected");gm("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(fm),a?(console.log(` ${dm("✓")} ${cm("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${mm("⚠")} ${cm("Some checks need attention")} — see the ${pm("✗")}/${mm("⚠")} lines above.`),console.log(""),2)}const vm=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 bm({accountType:e["account-type"]});_.exit(t)}});function km(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 xm=!1;const Am="copilot-api-node20",Tm=`https://registry.npmjs.org/${Am}/latest`,Sm=e=>`${e}`,$m=e=>`${e}`;async function Em(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Tm,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Om(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 Im,Cm;async function Rm(e){try{let[t,r]=await Promise.all([er(),Em(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 qm(){if(!Im||!Cm)return;let{signal:e}=Cm;Im.then(t=>{t&&!e.aborted&&function(e,t){let r=`npx ${Am}@latest`,o=$m("│"),n=` ${Sm("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,a=` Run ${Sm(r)} to update`,i=" ".repeat(54),s=$m(`╭${"─".repeat(54)}╮`),l=$m(`╰${"─".repeat(54)}╯`),c=["",s,`${o}${i}${o}`,`${o}${Om(n,54)}${o}`,`${o}${i}${o}`,`${o}${Om(a,54)}${o}`,`${o}${i}${o}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var Pm={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 Nm=262144,Mm="https://barazany.dev",jm=/^[a-z0-9][a-z0-9-]*$/i,Dm=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function Lm(e,t){if("string"!=typeof e)return"";let r=e.replaceAll(Dm," ").replaceAll(/\s+/g," ").trim(),o=Array.from(r);return o.length<=t?r:`${o.slice(0,t-1).join("").trimEnd()}…`}function Bm(e){if("object"!=typeof e||!e)return null;let t=e,r=Lm(t.title,100),o=Lm(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!==Mm||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&&jm.test(t.slug)&&(n=`${Mm}/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 Fm(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=Bm(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 Um=null;function Hm(e){return s.join(e,"blog-posts.json")}function zm(e=re.APP_DIR){try{if(Um&&Um.length>0)return Um;let t=function(e){try{let t=Hm(e);return H.statSync(t).size>Nm?[]:Fm(JSON.parse(H.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Fm(Pm)}catch{return[]}}function Jm(e){return e>-6e4&&e<864e5}async function Gm(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>Nm)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>Nm?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>Nm)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?[]:Fm(JSON.parse(r))}finally{clearTimeout(r)}}async function Km(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=Hm(e),o=await H.promises.stat(r);if(o.size<=Nm){let e=await H.promises.readFile(r),o=JSON.parse(e.toString("utf8"));if("number"==typeof o.fetchedAt)return Jm(t-o.fetchedAt)}return Jm(t-o.mtimeMs)}catch{return!1}}(t,r))return;let o=await Gm(e.timeoutMs??3e3);if(0===o.length)return;Um=o,await async function(e,t,r){let o=Hm(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 Wm(e){let t;try{({login:t}=await Ym(e))}catch(e){return void r.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await Ho(),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 Ym(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,An=!1}(o),r.info("Using provided Auth token")):await Pn();try{t=await Br(),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 Lr();he._t1=e,r.debug("Service token fetched successfully!"),he.showToken&&r.info("Service token:",e),xn=!0,qn(t),kt.start(),wn=()=>{r.debug("Network connectivity restored, attempting immediate token refresh"),Cn(3,500,"network-restored").catch(e=>{r.error("Unexpected error in network-restored token refresh:",e)})},bn=()=>{r.debug("Network connectivity lost")},kt.on("online",wn),kt.on("offline",bn)})(),t}function Vm(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 Xm(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 Zm=e=>`${e}`,Qm=e=>`${e}`,ef=e=>`${e}`,tf=e=>`${e}`,rf=e=>`${e}`,of=e=>`${e}`,nf=(e,t)=>`]8;;${e}\\${t}]8;;\\`,af="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",sf="https://github.com/johnib/copilot-api-issues/issues",lf=Qm(" ─────────────────────────────────────────────────────────────");function cf(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function uf(e){return e&&0!==e.length?e.join("·"):"—"}function df(e){if(0===e.length)return[];let t=["",lf,` ${Zm("BARAZANY.DEV")} ${Qm("— Recent Posts")}`,lf,""];for(let[r,o]of e.entries()){let e=`${o.url}${af}`,n=nf(e,Zm(of(`[${r+1}]`)));t.push(` ${n} ${ef(o.title)}`,` ${Qm("→")} ${Qm(o.teaser)}`,"")}return t.push(lf,` ${nf(`https://barazany.dev/blog${af}`,"barazany.dev/blog")}`,lf),t}function pf(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(Qm(" → "))} ${tf("✓")}`:Qm("off"),o=["",` ${Zm("COPILOT-API")} ${Qm(`v${e.version}`)}`,lf,` ${Qm("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Qm("User")} ${e.user} ${Qm("·")} ${e.accountType}`];return he._v1&&o.push(` ${Qm("Client")} VSCode ${he._v1}`),o.push(` ${Qm("Network")} ${t.join(Qm(" · "))}`,` ${Qm("Search")} ${r}`),e.clipboardCopied&&o.push(` ${Qm("Clipboard")} Claude Code command ${tf("✓")}`),o.push(lf),o}function mf(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Zm("Active")}`];if(e.model){let r=he.models?.data.find(t=>t.id===e.model),o=cf(r?.capabilities.limits?.max_context_window_tokens),n=uf(r?.capabilities.supports.reasoning_effort);t.push(` ${ef(e.model.padEnd(32))} ${Qm("ctx")} ${Zm(o.padStart(5))} ${Qm("effort")} ${Qm(n)} ${rf("← main")}`)}if(e.smallModel){let r=he.models?.data.find(t=>t.id===e.smallModel),o=cf(r?.capabilities.limits?.max_context_window_tokens),n=uf(r?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Qm("ctx")} ${o.padStart(5)} ${Qm("effort")} ${Qm(n)} ${rf("← small")}`)}return t}function ff(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("",` ${Zm(r)}`);for(let n of o){let o=n.id===e.model||n.id===e.smallModel,a=o?ef("●"):Qm("·"),i=o?ef(n.id.padEnd(34)):n.id.padEnd(34),s=n.ctx?cf(n.ctx).padStart(5):"".padStart(5),l="Embedding"===r?"":` ${uf(n.effort)}`;t.push(` ${a} ${i} ${Qm(s)}${Qm(l)}`)}}return t}function hf(){let e=sf.replace(/^https:\/\//,""),t=nf(`${sf}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",lf,` ${Zm("FOUND A BUG?")} ${Qm("— Report it on GitHub")}`,lf,"",` ${ef("→")} ${ef(t)}`,` ${Qm("Bug reports, feature requests, and questions welcome.")}`,"",lf]}function gf(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=["",lf,` ${Zm("Claude Cowork")} ${Qm("— Settings → Inference Provider")}`,lf,"",` ${Qm("Paste into")} ${Zm("inferenceGatewayBaseUrl")}${Qm(":")}`,` ${Zm(ef(n))}`];return o||a.push("",` ${Qm("Your Tailscale hostname is shown by:")} ${ef("tailscale status --self")}`),a.push("",` ${Qm("Docs:")} ${ef("https://claude.com/docs/cowork/3p/installation")}`),a}function yf(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,r=["",lf,` ${Zm("HTTPS")} ${Qm("— self-signed cert")}`,lf,"",` ${Qm("Cert")} ${t}`];switch(r.push("",` ${Zm("Trust this cert")} ${Qm("(one-time setup)")}`),_.platform){case"darwin":r.push(` ${Qm("macOS:")}`,` ${ef("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${ef(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":r.push(` ${Qm("Windows (PowerShell as Administrator):")}`,` ${ef(`Import-Certificate -FilePath "${t}" \``)}`,` ${ef("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":r.push(` ${Qm("Linux (Debian/Ubuntu):")}`,` ${ef(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${ef("sudo update-ca-certificates")}`,` ${Qm("Linux (Fedora/RHEL/Arch):")}`,` ${ef(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${ef("sudo update-ca-trust")}`);break;default:r.push(` ${Qm("(Unknown platform — see Node fallback below.)")}`)}return r.push("",` ${Qm("Or, for Node CLIs only (no admin needed):")}`,` ${ef(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,lf),r}function _f(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 wf(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 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 Ne()}const bf=s.join(re.APP_DIR,"certs"),vf=s.join(bf,"cert.pem"),kf=s.join(bf,"key.pem"),xf=s.join(bf,"cert.meta.json");async function Af(e){try{return await a.readFile(e,"utf8")}catch{return}}async function Tf(e){let t=await Af(vf),r=await Af(kf),o=await async function(){let e=await Af(xf);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 Sf(e){return 0!==Q(e)}async function $f(e){await a.mkdir(bf,{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)Sf(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(vf,l.cert,{mode:420}),await a.writeFile(kf,l.private,{mode:384}),await async function(e){await a.writeFile(xf,JSON.stringify(e,null,2),{mode:420})}({hosts:[...n,...i].sort(),notAfter:r.toISOString()}),{cert:l.cert,key:l.private,certPath:vf,keyPath:kf,generated:!0}}const Ef=[],Of=Date.now();let If="";function Cf(){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()-Of)/1e3}});for(let t of Ef)try{await t()}catch(e){r.error("Error during cleanup:",e)}o.end(),function(e,t){let r=nf("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),o=["",lf,` ${Zm("COPILOT-API")} ${Qm(`v${e}`)} ${Qm("·")} ${_f(t)} uptime`,lf,""," Check in from time to time on",` ${ef(r)}`,"",lf,""];console.log(o.join("\n"))}(If,Date.now()-Of),_.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 Rf=e=>e.filter(e=>Eo(e)).map(e=>e.id),qf=e=>e.filter(e=>Oo(e)).map(e=>e.id);async function Pf(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,Rf(he.models.data));i?(n=i.model,a=i.smallModel):(n=await r.prompt("Select a model to use",{type:"select",options:Rf(he.models.data)}),a=await r.prompt("Select a small model to use",{type:"select",options:Rf(he.models.data)}));let s=Vm({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 Nf(e){return e._t2?"cli_arg":_.env.GH_TOKEN?"env_var":"stored"}function Mf(e){let{options:t,version:r,runtime:o,_u1:n}=e,a=Me.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:yt({config:Xm(t,{version:r,_t3:Nf(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()-Of},"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()-Of},"copilot_api"))}async function jf(e,t){try{return await async function(e){return"foundry"===e.provider?(he.foundry=ao(process.env),he.connectivity.h2=!1,he.connectivity.h2Keepalive=!1,"entra"===he.foundry.auth&&await Xr(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 Wm(e):void 0)??"foundry"}):Ym(e)}(e)}catch(r){throw await wf(r,{version:t,provider:e.provider,accountType:e.accountType,_t3:Nf(e)}),r}}async function Df(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 Tf(e)){let e=await Af(vf),t=await Af(kf);if(e&&t)return{cert:e,key:t,certPath:vf,keyPath:kf,generated:!1}}return r.info("Generating new self-signed TLS certificate…"),$f(e)}(e.httpsHosts)}}async function Lf(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:o}=ha;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(Cf(),Ef.push(()=>{r.debug("Cleaning up connectivity monitor"),kt.stop()},()=>{r.debug("Cleaning up token management"),r.debug("Cleaning up token management"),xn=!1,yn&&=void clearInterval(yn),wn&&=void kt.off("online",wn),bn&&=void kt.off("offline",bn),_n=void 0,vn=void 0},async()=>{r.debug("Cleaning up HTTP/2 client"),await async function(){r.debug("Stopping HTTP/2 pool"),Vi&&=void clearInterval(Vi),Xi&&=void clearInterval(Xi);let e=[...Ki.keys(),...Wi];Ki.clear(),Wi.clear(),Gi.clear(),Yi=void 0;for(let t of e)Zi(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(),Km().catch(()=>{}),hn();let o=await er();If=o;let n=tr();!function(e,t){t&&(Re=t),Ce=crypto.randomUUID();let r=A({[O]:"copilot-api",[I]:e,[E]:Ce}),{endpoint:o,headers:n}=Pe();Ie=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 T({exporter:new v({url:`${o}/v1/logs`,headers:n})})],instrumentations:[]}),Ie.start()}(o,Of);let a=await jf(t,o);await async function(){try{return await fn({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(()=>{fn().then(()=>{r.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{fn().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)}}();Ef.push(()=>{r.debug("Cleaning up model refresh interval"),i()}),he.connectivity.h2&&(ts(es(Ot(he))),he.connectivity.h2Keepalive&&os()),Mf({options:t,version:o,runtime:n,_u1:a});let s=await Df(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await Pf(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=qf(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:qf(he.models.data)});let a=Vm({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=[...pf(e),...mf(e),...ff(e),...hf(),"",...df(zm()),...gf(e),...yf(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 oa()}:void 0}}({options:t,version:o,runtime:n,user:a.login,clipboardCopied:u,tls:s})),qm(),Z({fetch:im.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 lm({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: ${Sa(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 Bf(e,t){let r=Number.parseInt(e,10);if(Number.isNaN(r))throw Error(`${t} must be a number, got: "${e}"`);return r}const Ff=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:Bf(t,"--rate-limit"),n=e.timeout,a=void 0===n?fe:Bf(n,"--timeout"),i=function(e,t){let r=e??t,o=void 0===r?15e3:Bf(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(!yp(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${gp.join(", ")}`);let n=o.length>0?o:gp,a=new Set,i=o.length>0,s=[];for(let e of n){if(!yp(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}),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 Lf({provider:f,fallback:Uo(e.fallback,_.env.COPILOT_API_FALLBACK,f),port:Bf(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: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})}});xm||(xm=!0,r.setReporters([km(r.options.reporters)]));const Uf=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(Im||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;Cm=e,Im=Rm(e).catch(()=>null)})(),Uf||qm();const Hf=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:jn,start:Ff,"check-usage":Zn,debug:nr,doctor:vm,"cowork-setup":Aa}});await t(Hf),Uf||(Cm?.abort(),Cm=void 0,Im=void 0);export{};
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 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 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 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:()=>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 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 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"}),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 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: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: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: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:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,extraAttributes:p,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,...p}});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: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=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=P("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},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"}),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("/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,a=o.length>n,i=a?o.slice(0,n):o,s=P("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 e instanceof Error&&"ERR_HTTP2_STREAM_ERROR"===e.code&&/NGHTTP2_ENHANCE_YOUR_CALM/.test(e.message)}function dr(e){return ur(e)||e instanceof Error&&ur(e.cause)}function pr(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 mr=new WeakSet;async function fr(e,{attempt:t,maxRetries:o,operation:n}){return!de()&&(pr(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&&mr.add(e)}(e),!1))}var hr=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,r){super(e),this.response=t,this.outgoingBody=r?.outgoingBody,this.outgoingHeaders=r?.outgoingHeaders}},gr=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function yr(e,t){return setTimeout(()=>e.abort(new gr(t)),t)}function _r(e){return e instanceof gr||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof gr}const wr=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED","ConnectionRefused","FailedToOpenSocket","ConnectionClosed"]),br=RegExp(`\\b(?:${[...wr].join("|")})\\b`);function vr(e){let{cause:t,errors:r}=e;return t instanceof Error?t:Array.isArray(r)&&r[0]instanceof Error?r[0]:void 0}function kr(e){let t=e,r=new Set([t]);for(let e=0;e<4;e++){let e=vr(t);if(!e||r.has(e))break;r.add(e),t=e}return t}function xr(e){let t=e.code;return"string"==typeof t?t:void 0}function Tr(e){if(void 0===e.cause)return"";let t=kr(e);if(t===e)return"";let r=xr(t);return` (cause: ${r?`${r}: `:""}${t.message})`}function Ar(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=>wr.has(e))||!(t.length>0)&&(!!r.some(e=>br.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Sr(e){return e.req.path.startsWith("/v1/messages")}function $r(e,t){if(Sr(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}}}return function(e){try{let t=JSON.parse(e);if("object"==typeof t&&t&&!Array.isArray(t))return t}catch{}return{error:{message:e,type:"error"}}}(e)}const Er=/maximum context length|exceeds the context window/i;function Or(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 Cr(e,t){let r;try{r=JSON.parse(e)}catch{return Or(t)}return"object"!=typeof r||!r||Array.isArray(r)?{}:Or(t)}function Ir(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 Rr(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 qr(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 Pr(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 Mr(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=$r(a,e),s=Cr(a,i);return r?.setStatus({code:d.ERROR,message:"Rate limited by upstream"}),r?.setAttribute("copilot_api.error_type","rate_limit_upstream"),Ir(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",...Rr(s)}),qr({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,r)=>{Nr.test(r)&&e.header(r,t)})}(e,t.response),e.json(i,429)}const Nr=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;async function jr(e,t){let r=f.getActiveSpan(),o=await t.response.text(),n=$r(o,e),a=Cr(o,n);Pr(e,t.response.status,a.message??t.message),r?.setStatus({code:d.ERROR,message:t.message}),r?.recordException(t),r?.setAttribute("copilot_api.error_type","HTTPError"),Ir(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",...Rr(a)}),qr({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=Sr(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&&!Er.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 Dr(e,t){(function(e){return"object"==typeof e&&!!e&&mr.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",he.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function Lr(e){return Ar(e)||function(e){return pr(e)||ur(e)||e instanceof Error&&(pr(e.cause)||ur(e.cause))}(e)}async function Br(e,t){return Ft(e)?(Oe.completionCallbacks.delete(e.get("requestId")),new Response(null,{status:499})):async function(e,t){if(Dr(f.getActiveSpan(),t),t instanceof hr&&429===t.response.status)return Mr(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=Sr(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 Pr(e,400,"Invalid JSON in request body"),e.json(r,400)}if(t instanceof hr)return jr(e,t);if(_r(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=Sr(e)?{type:"error",error:{type:"api_error",message:o}}:{error:{message:o,type:"timeout_error"}};return Pr(e,504,t instanceof Error?t.message:o),e.json(n,504)}(e,t);if(Lr(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?kr(t):void 0,n=(o&&xr(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=Sr(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return Pr(e,503,t instanceof Error?`${t.message}${Tr(t)}`:i),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}${Tr(n)}`}),Pr(e,500,n.message),r.error(n);let a=Sr(e)?{type:"error",error:{type:"api_error",message:n.message}}:{error:{message:n.message,type:"error"}};return e.json(a,500)}(e,t)}const Fr=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 hr("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 Ur(){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 hr("Failed to get GitHub user",t);return await t.json()}catch(e){throw ht(o,e),e}finally{o.end()}}finally{clearTimeout(o)}}const Hr=e=>"chat"===e.capabilities.type,zr=3e5,Jr=12e4;let Gr,Kr,Wr,Yr=null,Vr=0;function Xr(e){Wr&&clearTimeout(Wr),Wr=setTimeout(()=>{eo("scheduled").catch(e=>{r.warn("Foundry Entra token renewal failed; retrying:",e),Xr(3e4)})},e),Wr.unref()}async function Zr(e){let t=Kr;if(!Gr||!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?p.active():c);try{let e=await async function(e,t){let r=AbortSignal.timeout(Jr),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])}(Gr,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,Vr=Date.now(),Xr(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-zr;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 Qr(e,t){Kr=e,Gr=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await Zr("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 eo(e="upstream_401"){return Yr??=Zr(e).finally(()=>{Yr=null}),Yr}let to=null;async function ro(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=Kr?.bearerToken;if(void 0!==t&&t!==o)return!0;let n=Kr?.bearerExpiresAt,a=void 0!==n&&n-Date.now()>zr;if(e&&a)return!1;if(Date.now()-Vr<3e4)return!0;try{return await eo(),!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 to||=Fr().then(({token:e})=>{he._t1=e,r.debug("Service token refreshed on upstream 401")}).finally(()=>{to=null}),await to,!0}function oo(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 no=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function ao(e){let t=new URL(e),r=no.exec(t.hostname)?.[1];return r?`https://${r}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function io(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 so(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=oo(t),a=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:n,anthropicEndpoint:a?oo(a,"FOUNDRY_ANTHROPIC_ENDPOINT"):ao(n),auth:o,..."key"===o?{apiKey:r}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:io(e.FOUNDRY_DEPLOYMENTS)}}const lo=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},co=e=>({...lo(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),uo=e=>`${e.anthropicEndpoint}/anthropic`,po=(e,t)=>({...lo(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),mo=e=>"foundry"===e.provider;function fo(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const ho=e=>mo(e)?(e=>`${e.endpoint}/openai/v1`)(fo(e)):Ot(e),go=(e,t=!1)=>mo(e)?co(fo(e)):Ct(e,t),yo=e=>mo(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const _o=[{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}],wo={context:128e3,output:16384};function bo(e){return _o.find(({pattern:t})=>t.test(e))??wo}const vo=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,ko=e=>/^claude/i.test(e),xo=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function To(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 Ao(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,r=new AbortController,o=yr(r,he.timeoutMs);try{let{response:o,span:n}=await bt({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:co(e),signal:r.signal});try{if(!o.ok)throw new hr("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 So(e){return{object:"list",data:(e.deployments??await Ao(e)).map(e=>function(e){let{model:t}=e;if(!vo.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:{}}}:ko(t)?To(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):xo(t)?To(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:bo(t)}):To(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:bo(t)})}(e)).filter(e=>void 0!==e)}}const $o=()=>mo(he)&&he.foundry?So(he.foundry):Oo(),Eo=async()=>{try{return await $o()}catch(e){if(e instanceof hr&&401===e.response.status){if(!await ro(e))throw e;return $o()}throw e}},Oo=async()=>{let e=`${ho(he)}/models`,t=go(he),r=he.timeoutMs,o=new AbortController,n=yr(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 hr("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)}},Co=e=>Hr(e),Io=e=>Co(e)&&(e.supported_endpoints?.includes("/responses")??!0);const Ro=[{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"}],qo="claude-haiku-4.5",Po={haiku:qo,"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 Mo=/^claude-/i;function No(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function jo(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 Ro)if(t.pattern.test(e))return t.family;return null}(o),i=Mo.test(o),s=o.replace(/-\d{8}(?::.*)?$/,""),l=n?`-${n}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let r=No(e);for(let e of t)if(No(e.replace(/-\d{8}(?::.*)?$/,""))===r)return e}return a?function(e,t,r=null){let o=Po[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 Do=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Lo(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=Do.get(r);if(void 0===o)return t[0]??null;let n=null,a=1/0;for(let e of t){let t=Do.get(e);if(void 0===t)continue;let r=Math.abs(t-o);r<a&&(a=r,n=e)}return n}const Bo={messages:Co,responses:Io,chat:e=>Co(e)&&(e.supported_endpoints?.some(e=>"/chat/completions"===e||"/responses"===e)??!0)};let Fo;const Uo=new Map,Ho=new Map;function zo(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 Jo(){Fo=await ie({provider:"copilot"},Eo)}const Go=()=>void 0!==Fo;function Ko(e,t=Date.now(),r=1e4){let o=e.get("retry-after-ms");if(null!==o&&""!==o.trim()&&Number.isFinite(Number(o))&&Number(o)>=0)return Number(o);let n=e.get("retry-after");if(null!==n){let e=Number(n);if(""!==n.trim()&&Number.isFinite(e)&&e>=0)return 1e3*e;let r=Date.parse(n);if(!Number.isNaN(r))return Math.max(0,r-t)}return r}function Wo(e,t=Date.now()){let r=Uo.get(e);return void 0!==r&&(t<r||(Uo.delete(e),!1))}function Yo(e,t=Date.now()){return{id:Ho.get(e)?.id??0,lapsed:!Wo(e,t)}}function Vo(e,t){let r=Ho.get(e);r&&t.lapsed&&t.id===r.id&&Ho.set(e,{id:r.id,appliedMs:0})}function Xo(e){if(!Go()||!mo(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 Zo=new Set([429,408,500,502,503,504]);function Qo(e,t){let r=yr(e,t),o=de()||le()?yr(e,9e4):void 0;return{headersArrived:()=>clearTimeout(o),clear:()=>{clearTimeout(r),clearTimeout(o)}}}function en(e,t){if(e instanceof hr){let{status:t}=e.response;return Zo.has(t)&&void 0!==e.outgoingBody?`foundry_${t}`:void 0}if(t){if(_r(e))return"foundry_timeout";if(!dr(e)&&Lr(e))return"foundry_transport"}}const tn={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 rn(e,t,o){let n=tn[t]??`returned ${t.slice(8)} for`;r.info(`Foundry ${n} ${e}; serving it from Copilot for ${Math.ceil(o/1e3)}s`)}function on(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:Fo,rerun:"breaker_open"!==n,inStream:r.inStream},()=>t(e))}const nn=()=>pe();!function(e){ue=e}(e=>{let t=e;t.sent=Yo(t.model)});const an=new WeakMap;async function sn(e,t,r){let o=t instanceof hr?t.response:void 0,n=function(e,t,r={}){let o=r.now??Date.now(),n=r.sent??Yo(e,o),a=Ho.get(e)??{id:0,appliedMs:0},i=Math.max(Ko(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),Ho.set(e,{id:s,appliedMs:i})}else s===a.id&&a.appliedMs>0&&i>a.appliedMs&&Ho.set(e,{id:a.id,appliedMs:i});let l=Math.max(Uo.get(e)??0,o+i);return Uo.set(e,l),l-o}(e,o?.headers??new Headers,{sent:r});return await(o?.body?.cancel()),n}function ln(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)),rn(e,t,o)}function cn(e){let t=pe();return void 0!==t&&an.has(t)&&!Ft(e)}function un(){let e=pe(),t=e&&an.get(e);t&&(t.deferReset=!0)}function dn(){let e=nn();e?.sent&&an.has(e)&&Vo(e.model,e.sent)}async function pn(e,t,r){let o=nn(),n=o&&an.get(o);if(!o||!n)throw Error("Not in a Foundry attempt the fallback stands behind");an.delete(o);let{model:a}=o;return ln(a,t,{windowMs:await sn(a,r,o.sent??Yo(a)),attemptStart:o.start}),function(e){return ce.exit(e)}(()=>on(e,n.handler,{model:a,reason:t,inStream:!0}))}async function mn(e,t,r){if(!Go()||!mo(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=Fo?.data??[],o=r.map(e=>e.id),n=o.includes(e)?e:jo(e,o),a=r.find(e=>e.id===n);return a&&Bo[t](a)?a.id:void 0}(o,t))return r(e);if(Wo(o))return on(e,r,{model:o,reason:"breaker_open"});let n=Yo(o),a={model:o};an.set(a,{handler:r});try{let t=await function(e,t){return ce.run(e,t)}(a,()=>r(e)),n=a.sent,i=!0===an.get(a)?.deferReset;return t.ok&&n&&!i&&Vo(o,n),t}catch(t){let i=a.sent,s=en(t,void 0!==i);if(!s||(ln(o,s,{windowMs:await sn(o,t,i??n),attemptStart:a.start}),Ft(e)))throw t;return on(e,r,{model:o,reason:s})}}const fn=e=>new Promise(t=>{setTimeout(t,e)}),hn=e=>null==e;async function gn({refreshFallback:e=!0}={}){let t=await Eo();he.models=t,e&&Go()&&await Jo().catch(e=>{r.warn("Failed to refresh the Copilot fallback models:",e)})}const yn=()=>{he._v1="1.140.0-insider"};var _n=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let wn,bn,vn,kn,xn,Tn=!1,An=!1,Sn=!1;function $n(){return En()?xn:void 0}function En(){return void 0!==xn&&Date.now()-xn.at<6e4}function On(){return Sn?"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 Cn=()=>a.readFile(re.GITHUB_TOKEN_PATH,"utf8");function In(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,xn={status:s,message:l,at:Date.now()},clearInterval(wn),wn=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()-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 Rn(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:d.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 qn=async(e=5,t=1e3,o="scheduled")=>Tn?(r.debug("Token refresh already in progress, coalescing"),bn):(Tn=!0,bn=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 Fr();return he._t1=t,xn=void 0,An&&void 0===wn&&(r.info("Token refresh recovered, resuming scheduled refresh"),Mn(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 hr&&(401===s.response.status||403===s.response.status))return void In({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 Rn({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(),Tn=!1,bn=void 0}}),bn);async function Pn(){return!!he._t1||!En()&&(void 0!==xn&&Sn&&await async function(){if(bn)return;let e=(await Cn().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 qn(3,250,"on-demand"),!!he._t1)}function Mn(e){wn&&clearInterval(wn);let t=Math.max(1e3*(e-60),6e4);wn=setInterval(()=>{qn(5,1e3,"scheduled").catch(e=>{r.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Nn(e){try{let t=await Cn();if(t&&!e?.force)return he._t2=t,Sn=!0,he.showToken&&r.info("Auth token:",t),void await jn();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 hr("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 _n("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 fn(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 _n("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===n.error)throw new _n("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 fn(t);continue}if(n.access_token)return n.access_token;await fn(t)}catch(e){if(e instanceof _n)throw e;if(e instanceof Error&&"AbortError"===e.name){r.error("Access token polling timed out"),await fn(t);continue}throw e}finally{clearTimeout(s)}}}(o);await(e=>a.writeFile(re.GITHUB_TOKEN_PATH,e,{mode:384}))(n),he._t2=n,Sn=!0,he.showToken&&r.info("Auth token:",n),await jn()}catch(e){throw e instanceof hr?(r.error("Failed to get Auth token:",await e.response.json()),e):(r.error("Failed to get Auth token:",e),e)}}async function jn(){let e=await Ur();r.success(`Authenticated as ${e.login}`)}async function Dn(e){e.verbose&&(r.level=5,r.info("Verbose logging enabled")),he.showToken=e.showToken,await oe(),await Nn({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 Ln=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})=>Dn({verbose:e.verbose,showToken:e["show-token"]})}),Bn=.01,Fn=864e5,Un=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Hn=new Intl.NumberFormat("en-US"),zn=e=>Un.format(e*Bn),Jn=e=>e.credits_used??e.entitlement-e.remaining,Gn=(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())/Fn;if(n<.5)return;let a=Jn(e),i=a*Bn/n,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Bn,c=new Date(o.getTime()+l/i*Fn);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Kn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Hn.format(Jn(e))} of ${Hn.format(e.entitlement)} used`:"n/a",Wn=e=>e.padEnd(14),Yn=(e,t=new Date)=>{let r=e.quota_snapshots.premium_interactions,o=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(r.unlimited)o.push(`${Wn("AI credits")}unlimited`);else{let e=Jn(r),t=r.percent_remaining;o.push(`${Wn("AI credits")}${zn(e)} / ${zn(r.entitlement)} ${t.toFixed(1)}% left`,`${Wn("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Wn("")}${Hn.format(e)} of ${Hn.format(r.entitlement)} credits`)}if(o.push("",`${Wn("Chat")}${Kn(e.quota_snapshots.chat)}`,`${Wn("Completions")}${Kn(e.quota_snapshots.completions)}`,"",`${Wn("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Fn)))(e.quota_reset_date,t)} days)`),!r.unlimited){let n=Gn(r,e.quota_reset_date,t);n&&o.push(`${Wn("Burn rate")}~${Un.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?`${Hn.format(r.overage_count)} used`:"none used"):"not permitted";o.push(`${Wn("Overage")}${a}`)}return o.join("\n")},Vn=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 hr("Failed to get usage",t);return await t.json()}catch(e){throw ht(o,e),e}finally{o.end()}}finally{clearTimeout(o)}},Xn=()=>_.stdout.write(""),Zn=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Qn=async()=>{let e=await Vn();return Yn(e)},ea=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 Nn(),!e.watch){try{r.box(await Qn())}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 Qn();o&&Xn(),r.box(e),r.log(Zn(new Date,t))}catch(e){r.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),ta=j(g);async function ra(){let e="win32"===_.platform?"where.exe":"which";try{return await ta(e,["tailscale"]),!0}catch{return!1}}async function oa(){try{let{stdout:e}=await ta("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function na(e){return e.replace(/\.$/,"")}async function aa(){let e=await oa();if(e?.Online)return na(e.DNSName)}const ia=j(g),sa=e=>`${e}`,la=e=>`${e}`,ca=e=>`${e}`,ua=e=>`${e}`,da=e=>`${e}`,pa=e=>`${e}`,ma=la(" ─────────────────────────────────────────────────────────────"),fa=s.join(re.APP_DIR,"certs","tailscale"),ha=s.join(fa,"cert.pem"),ga=s.join(fa,"key.pem"),ya={certDir:fa,certPath:ha,keyPath:ga};function _a(){switch(_.platform){case"darwin":return[` ${la("Install Tailscale for macOS:")}`,` ${ca("https://tailscale.com/download/mac")}`,` ${la("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${la("After installing, open the Tailscale app and sign in.")}`,` ${la("Then re-run this command.")}`].join("\n");case"linux":return[` ${la("Install Tailscale for Linux:")}`,` ${ca("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${ca("sudo tailscale up")}`,` ${la("or")} ${ca("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${la("Install Tailscale for Windows:")}`,` ${ca("https://tailscale.com/download/windows")}`,"",` ${la("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${la("Install Tailscale:")} ${ca("https://tailscale.com/download")}`}}function wa(){let e=[` ${da("Tailscale is not running.")}`];return"darwin"===_.platform?e.push(` ${la("Open the Tailscale app from Applications and sign in.")}`,` ${la("Download:")} ${ca("https://tailscale.com/download/mac")}`):"win32"===_.platform?e.push(` ${la("Open the Tailscale app and sign in.")}`,` ${la("Download:")} ${ca("https://tailscale.com/download/windows")}`):e.push(` ${la("Connect with:")} ${ca("sudo tailscale up")}`),e.push("",` ${la("Then re-run this command.")}`),e.join("\n")}async function ba(){try{return await a.access(ha),await a.access(ga),!0}catch{return!1}}function va(e){console.log(""),console.log(ma),console.log(` ${sa("Claude Cowork Setup")} ${la("— Diagnostic")}`),console.log(ma),console.log("");for(let t of function(e){let t=[];for(let[r,o]of Object.entries(e)){let e;e="ok"===o.status?ua("✅"):"missing"===o.status?da("❌"):pa("❓");let n=o.detail?la(` ${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(` ${ua("All checks passed.")}`):console.log(` ${da(`${t.length} issue(s).`)} Run ${ca("copilot-api cowork-setup install")} to fix.`),console.log("")}const ka={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},xa=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await ra();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return va(e),console.log(""),console.log(_a()),void console.log("");let r=await oa();if(!r||!r.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},va(e),console.log(wa()),void console.log("");let o=na(r.DNSName);e["tailscale-running"]={status:"ok",detail:o};let n=await ba();e["tailscale-cert"]=n?{status:"ok",detail:ha}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},n&&(e.ready={status:"ok",detail:`https://${o}:<port>`}),va(e)}(),_.exit(0)}}),Ta=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:ka},async run({args:e}){await async function(e){if(console.log(""),console.log(ma),console.log(` ${sa("Claude Cowork Setup")} ${la("— Install")}`),console.log(ma),console.log(""),!await ra())return console.log(` ${da("Tailscale is not installed.")}`),console.log(""),console.log(_a()),console.log(""),console.log(` ${la("After installing, run")} ${ca("tailscale up")} ${la("to connect, then re-run this command.")}`),void console.log("");let t=await oa();if(!t||!t.Online)return console.log(wa()),void console.log("");let o=na(t.DNSName);if(console.log(` ${la("Tailscale hostname:")} ${sa(o)}`),console.log(""),console.log(` ${sa("Generating TLS certificate via Tailscale…")}`),console.log(` ${la("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${ca(`$ tailscale cert --cert-file ${ha} --key-file ${ga} ${o}`)}`),console.log(""),e||await r.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(fa,{recursive:!0}),r.start("Generating certificate (this may take a few seconds)…"),await ia("tailscale",["cert","--cert-file",ha,"--key-file",ga,o]),console.log(` ${ua("✓ 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(ma),console.log(` ${sa("Next steps")}`),console.log(ma),console.log(""),console.log(` ${sa("1.")} Start the proxy:`),console.log(` ${ca("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${sa("2.")} In Cowork ${la("→")} Settings ${la("→")} Inference Provider, set:`),console.log(` ${sa("inferenceGatewayBaseUrl")} = ${ca(`https://${o}:<port>`)}`),console.log(` ${la("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${sa("3.")} Restart Cowork ${la("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${la("For Cowork's own configuration docs, see:")}`),console.log(` ${ca("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else r.info("Skipped.")}(e.yes),_.exit(0)}}),Aa=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:ka},async run({args:e}){await async function(e){if(console.log(""),console.log(ma),console.log(` ${sa("Claude Cowork Setup")} ${la("— Revert")}`),console.log(ma),console.log(""),await ba())if(console.log(` ${sa("Remove Tailscale cert files:")}`),console.log(` ${la(ha)}`),console.log(` ${la(ga)}`),console.log(""),e||await r.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(fa,{recursive:!0}),console.log(` ${ua("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);r.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${la("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else r.info("Skipped.");else console.log(` ${la("No Tailscale cert found. Nothing to revert.")}`),console.log("")}(e.yes),_.exit(0)}}),Sa=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:xa,install:Ta,revert:Aa}}),$a=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Ea(e){if(!$a.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 Oa(e){return"string"==typeof e?Ea(e):Array.isArray(e)?function(e){let t;for(let r=0;r<e.length;r++){let o=e[r],n=Oa(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?Oa(a):a;t||i===a&&"__proto__"!==n||(t=Ca({},r,e)),t&&(t[n]=i)}let n=t??e;return"object"===n.type&&!("properties"in n)&&(t??=Ca({},r,r.length),t.properties={}),t??e}(e):e}function Ca(e,t,r){for(let o=0;o<r;o++)e[t[o][0]]=t[o][1];return e}const Ia="x-copilot-api-self-test",Ra=N();const qa=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Pa(e){return!e.id.startsWith("text-embedding")&&Hr(e)&&!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 Ma(e){let t=2;return qa.test(e.id)?t=0:"Anthropic"===e.vendor&&(t=1),2*t+ +!e.model_picker_enabled}const Na=new Set(["model_not_supported","no_available_model_endpoints"]);function ja(e,t){if(400!==e||!t)return!1;try{let e=JSON.parse(t).error?.code;return"string"==typeof e&&Na.has(e)}catch{return!1}}const Da="function"==typeof l.snapshot?l.snapshot():e=>e(),La=e=>{try{return J(e,"utf8")}catch{return}},Ba=e=>({read:La,root:"/sys/fs/cgroup",totalMem:i.totalmem(),rss:()=>process.memoryUsage.rss(),platform:process.platform,...e}),Fa=(e,t)=>Number.isFinite(e)&&e>0&&e<t?e:void 0,Ua=(e,t)=>{if(!e)return;let r=RegExp(`^${t}:? +(\\d+)`,"m").exec(e);return r?Number(r[1]):void 0};const Ha=(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 za(e={}){let t,r=Ba(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:Ha(r.v2,/^0::(.*)$/m.exec(t)?.[1]??"/"),current:"memory.current",max:"memory.max",inactive:"inactive_file"},{source:"cgroup_v1",dirs:Ha(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=Ua(e.read(`${o}/memory.stat`),t.inactive);r.push({limit:void 0===a||"max"===a?void 0:Fa(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=Ua(n,"MemTotal"),i=Ua(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 Ja=(e,t)=>{let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?r:t};var Ga=class{level="normal";last;timer;listeners=new Set;sampleListeners=new Set;thresholds;read;rss;intervalMs;constructor(e={}){this.thresholds=e.thresholds??{low:Ja("COPILOT_API_IMAGES_PRESSURE_LOW",.7),high:Ja("COPILOT_API_IMAGES_PRESSURE_HIGH",.8),critical:Ja("COPILOT_API_IMAGES_PRESSURE_CRITICAL",.9)},this.read=e.read??(()=>za()),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(),Da(()=>{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 Ka=1048576,Wa=8388608,Ya=16*Ka,Va=100*Ka,Xa=e=>((e,t=1)=>Math.ceil(1*Math.min(Math.max(e,0),Va)+5242880*Math.max(1,Math.floor(t))))(e??Ya)+Wa;var Za=class extends Error{reason;constructor(e){super(`Image request not admitted: ${e}`),this.reason=e,this.name="AdmissionRejectedError"}},Qa=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 Za(e))}acquire(e,t){return t?.aborted?Promise.reject(new Za("aborted")):e>this.fullBudget?Promise.reject(new Za("too_large")):this.paused?Promise.reject(new Za("memory_pressure")):0===this.queue.length&&this.fits(e)?Promise.resolve(this.grant(e)):this.queue.length>=this.options.maxQueue?Promise.reject(new Za("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 Za("queue_timeout"))},this.options.queueTimeoutMs),i=()=>{n()&&o(new Za("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 ei(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}},ei=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 ti=(e,t)=>{let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?Math.floor(r):t};function ri(e,t,r=0){let o=ti("COPILOT_API_IMAGES_MEMORY_BUDGET_MB",0)*Ka;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 oi=e=>ri(e.limitBytes,Math.max(e.idleRssBytes,e.rssBytes-e.imageInUseBytes),e.usedBytes-e.rssBytes);var ni=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&&Da(()=>{this.timer=setTimeout(()=>{this.timer=void 0,this.drain()},Math.ceil((1-this.tokens)*this.intervalMs))})}take(e){return e?.aborted?Promise.reject(new Za("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 Za("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 ai;function ii(){if(ai)return ai;let e=za(),t=process.memoryUsage.rss(),r=oi({limitBytes:e.limitBytes,usedBytes:e.usedBytes,rssBytes:t,idleRssBytes:t,imageInUseBytes:0}),o=new Qa({budgetBytes:r,ceilingBytes:ri(e.limitBytes,t),maxConcurrent:ti("COPILOT_API_IMAGES_MAX_CONCURRENT",30),maxQueue:ti("COPILOT_API_IMAGES_MAX_QUEUE",32),queueTimeoutMs:ti("COPILOT_API_IMAGES_QUEUE_TIMEOUT_MS",45e3)}),a=new Ga;return a.onChange(e=>si(o,e)),a.onSample(e=>o.setBudgetBytes(oi({limitBytes:e.limitBytes,usedBytes:e.usedBytes,rssBytes:process.memoryUsage.rss(),idleRssBytes:t,imageInUseBytes:o.stats().inUseBytes}))),n.info(`Image admission: budget ${Math.round(r/Ka)} MB of a ${Math.round(e.limitBytes/Ka)} MB limit (${e.source})`),ai={gate:o,monitor:a,pacer:new ni({burst:ti("COPILOT_API_IMAGES_START_BURST",30),intervalMs:ti("COPILOT_API_IMAGES_START_RATE",400)})},a.start(),si(o,a.current),ai}function si(e,t){"critical"===t?(e.setPaused(!0),e.failQueued("memory_pressure"),e.setBudgetScale(.5)):(e.setBudgetScale(1),e.setPaused("high"===t))}let li;function ci(e){let{heapUsed:t,rss:r,external:o,arrayBuffers:n}=process.memoryUsage();li??=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=ai?.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",li),e.setAttribute("copilot_api.process.uptime_s",Math.round(process.uptime()))}function ui(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),ci(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:d.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",d=l?.streaming??!1,p={method:o,path:n,status_code:String(c),model:u,streaming:String(d),endpoint_type:a};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:a};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(i)}(e)}catch(e){r.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}Oe.completionCallbacks.delete(e.requestId)}const di=3e4,pi=12e4,mi=2e3,fi=new WeakMap,hi=(e,t)=>{if(!e)return Promise.resolve();let r=fi.get(e);return r||(r=gi(e,t),fi.set(e,r)),r},gi=async(e,{read:t,limit:r,declared:o,deadline:n=performance.now()+pi})=>{let a,i=t;try{for(;;){void 0===a&&(i>r||void 0!==o&&i>o)&&(a=performance.now()+mi);let t=Math.min(n,a??n),s=Math.min(di,t-performance.now());if(s<=0)return void await yi(e);let l=await _i(e,s);if("timeout"===l)return void await yi(e);if(l.done)return;i+=l.value.byteLength}}catch{}},yi=async e=>{let t;try{await Promise.race([e.cancel().catch(()=>{}),new Promise(e=>{t=setTimeout(e,1e3)})])}finally{clearTimeout(t)}},_i=async(e,t)=>{let r;try{return await Promise.race([e.read(),new Promise(e=>{r=setTimeout(()=>e("timeout"),t)})])}finally{clearTimeout(r)}};let wi=0;const bi=()=>{if(wi>=(()=>{let e=Number(process.env.COPILOT_API_IMAGES_MAX_DRAINS);return Number.isFinite(e)&&e>=0?Math.floor(e):8})())return;wi++;let e=!1;return{start:t=>{e||(e=!0,Da(()=>{vi(t())}))}}},vi=e=>{e.catch(()=>{}).finally(()=>{wi--})},ki=e=>{let t=bi();return t?.start(e),void 0!==t},xi=(e,t,r)=>{let{body:o}=e;return!(o&&!o.locked)||((e,t)=>fi.has(e)||ki(()=>hi(e,t)))(o.getReader(),{read:0,limit:t,declared:r})},Ti=e=>e.includes("/images/edits")?104857600:33554432,Ai=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})}),Si=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,Ai(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 hr("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 $i(e){if(yo(he)||await Pn())return null;let t=$n();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${On()}`,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 Ei(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 Oi(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 Ci=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Ii(e){if(!e||"string"!=typeof e)throw new Ci("Model name is required and must be a string");if("foundry"===he.provider)return e;if(!he.models?.data)throw new Ci("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=jo(e,t);if(!r)throw Je.add(1,{requested_model:e}),new Ci(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return r}function Ri(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?xo(e):/gpt-[\d.]+-codex/i.test(e)}async function qi(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 hr("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 fn(s),e.lastRequestTimestamp=n,r.info("Rate limit wait completed, proceeding with request")}finally{o.end()}})}var Pi=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Mi(e){if(e instanceof Pi)return{type:e.type,message:e.message};if(e instanceof hr){let t=e.response.status;return{type:529===t?"overloaded_error":`upstream_error_${t}`,message:`Upstream error (${t}) while streaming response`}}return dr(e)?{type:"overloaded_error",message:"Upstream overloaded while streaming response"}:{type:"api_error",message:"Stream interrupted before completion"}}async function Ni(e,t){let{type:o,message:n}=Mi(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 ji(e,t){let{type:o,message:n}=Mi(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 Di(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 Li(e,t,r){return Math.min(Math.max(e,t),r)}function Bi(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 Bi(JSON.parse(n),t+1)}catch{return null}}function Fi(e,t){let r=e?.data.find(e=>e.id===t);if(!r)return null;let o=Di(r.capabilities.supports.min_thinking_budget),n=Di(r.capabilities.supports.max_thinking_budget);return!o||!n||n<=o?null:{bounds:{min:o,max:n-1},maxOutputTokens:Di(r.capabilities.limits?.max_output_tokens)??void 0}}function Ui(e){let{config:t}=e,r=t.bounds.min,o=t.bounds.max,n=Li(Di(e.requestedBudget)??r,r,o),a=Di(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 Hi(e,t){if(hn(e.thinking_budget))return e;let r=Fi(t,e.model);if(!r)return{...e,thinking_budget:void 0};let o=Ui({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 zi(e){return"invalid_thinking_budget"===Bi(e)}async function Ji(e){let{payload:t,error:r,models:o,errorBodyText:n}=e;if(hn(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(!zi(i))return null;let l=Fi(o,t.model);return l?function(e,t){let r=Ui({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=Di(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 Gi(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 Ki(e,t){let r=e.get("requestData")||{};r.upstreamTotalMs=performance.now()-t,r._d1=r.upstreamTotalMs,e.set("requestData",r)}const Wi=new Map,Yi=new Map,Vi=new Set;let Xi,Zi,Qi;function es(e){return!e.closed&&!e.destroyed}function ts(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 Wi.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=Vi.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}),Yi.delete(t),Vi.delete(t),Wi.delete(t),es(t)&&t.close().catch(e=>{r.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function rs(e,t){if(!he.connectivity.h2)return;if(Xi&&Xi!==e&&function(){for(let e of[...Yi.keys(),...Vi])es(e)&&e.close().catch(e=>{r.debug("Error closing HTTP/2 pool entry:",e)});Yi.clear(),Vi.clear(),Wi.clear()}(),Xi=e,t?.fresh){let t=ts(e);return Vi.add(t),t}let o=Date.now();for(let[t]of Yi)if(o-(Wi.get(t)??0)>=6e5)Yi.delete(t),Wi.delete(t),es(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(es(t))return Yi.delete(t),Vi.add(t),t;Yi.delete(t),Wi.delete(t)}let n=ts(e);return Vi.add(n),n}function os(e){e&&Vi.delete(e)&&(es(e)?Yi.set(e,Date.now()):Wi.delete(e))}function ns(){Qi||(Qi=setInterval(()=>{!function(){let e=Date.now(),t=he.connectivity.h2Keepalive,o=Yi.size;for(let[n,a]of Yi)e-a<6e4||t&&o<=1||(Yi.delete(n),Wi.delete(n),o--,es(n)&&n.close().catch(e=>{r.debug("Error closing idle HTTP/2 client:",e)}),tt.add(1,{event:"idle_reaped",origin:Xi??""}),ft(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${Xi}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Xi??""}))}()},3e4),Qi.unref())}function as(){Zi||(r.debug("Starting HTTP/2 keepalive (every 45s)"),Zi=setInterval(()=>{(async function(){if(0===Yi.size&&0===Vi.size){if(Xi){let e=ts(Xi);Yi.set(e,Date.now())}return}let e=[...Yi.keys()];for(let t of e)Yi.delete(t);await Promise.allSettled(e.map(async e=>{if(es(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}`),Yi.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:Xi??""}),Wi.delete(e),es(e)&&e.close().catch(e=>{r.debug("Error closing broken HTTP/2 client:",e)})}else Wi.delete(e)}))})().catch(e=>{r.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Zi.unref(),ns())}function is(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*ss(e,t){try{yield*K(e)}finally{ls(t)}}function ls(e){e instanceof ReadableStream||e.destroyed||(e.on("error",()=>{}),e.destroy())}function cs(e){return e.max_completion_tokens??e.max_tokens}async function us(e,t,r){try{if(!e.ok)throw new hr("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&&Oi(t,o.usage),o}catch(e){throw ht(t,e),e}finally{t.end()}}const ds=e=>mo(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=cs(e);return null==i?a:{...a,max_completion_tokens:i}}(e,he.models),ps=e=>mo(he)?e:Oa(e),ms=async(e,t)=>{let o=ps(e),n=t?.signal;try{return await gs(o,n)}catch(e){if(e instanceof hr&&401===e.response.status){if(!await ro(e))throw e;return gs(o,n)}let t;if(e instanceof hr)try{t=await e.response.clone().text()}catch{t=void 0}let a=await Ji({payload:o,error:e,models:he.models,errorBodyText:t});if(a)return e instanceof hr&&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 gs(ps(a),n);throw e}},fs=async(e,t)=>{let r=Xo(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 hs(e,t){let r=()=>t.abort(e?.reason);return e?.aborted?r():e?.addEventListener("abort",r,{once:!0}),()=>e?.removeEventListener("abort",r)}async function gs(e,t){if(!yo(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={...go(he,r),"X-Initiator":o?"agent":"user"},a=ho(he),i=`${a}/chat/completions`,s=he.timeoutMs,l=ds(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":cs(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=rs(a,{fresh:r>0}),l=new AbortController,d=Qo(l,s),p=hs(t,l);try{let{statusCode:t,headers:a,body:p,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(d.headersArrived),f=is(p,{status:t,headers:a});if(e.stream){let e=await fs(f,m);if(e)throw new hr("Failed to create chat completions",e,{outgoingBody:c,outgoingHeaders:n});return{events:ss(f,p),span:m,release:()=>os(o)}}try{return await us(f,m,{outgoingBody:c,outgoingHeaders:n})}finally{os(o)}}catch(e){if(os(o),await fr(e,{attempt:r,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{d.clear(),p()}}throw Error("Unexpected: exhausted GOAWAY retries without result")}const ys=new Map;const _s=["none","minimal","low","medium","high","xhigh","max"];function ws(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=_s.indexOf(e);if(-1===r)return t[0];let o,n=1/0;for(let e of t){let t=_s.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 bs(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:[];ys.set(e.model,n);let a=ws(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 vs(e,t,r){try{if(!e.ok)throw new hr("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&&Oi(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 ks=async(e,t)=>{let r=mo(he),o=r?function(e){let t=ys.get(e.model);return t?ws(e,t):e}(e):e,n=!1,a=!1;for(;;)try{return t?.onAttempt?.(o),await Ts(o,t?.signal)}catch(e){if(!(e instanceof hr))throw e;if(401===e.response.status&&!n){if(n=!0,!await ro(e))throw e;continue}if(r&&400===e.response.status&&!a){a=!0;let t=bs(o,await e.response.clone().text().catch(()=>{}));if(t){o=t;continue}}throw e}};function xs(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 Ts=async(e,t)=>{if(!yo(he))throw Error("Service token not found");let r=mo(he)?e:Oa(e),o={...go(he),"X-Initiator":"agent"},n=ho(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=rs(n,{fresh:e>0}),u=new AbortController,p=Qo(u,i),m=xs(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(p.headersArrived);m.attach(f);let g=is(f,{status:t,headers:n});if(r.stream){let e=Xo(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 hr("Failed to create responses",e??g,{outgoingBody:s,outgoingHeaders:o});return{events:ss(g,f),span:h,release:()=>{m.dispose(),os(c)}}}try{return await vs(g,h,{outgoingBody:s,outgoingHeaders:o})}finally{m.dispose(),os(c)}}catch(t){if(m.dispose(),os(c),await fr(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{p.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},As=e=>Object.hasOwn(e,"output");function Ss(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 $s=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,r=null){super(e),this.code=t,this.param=r}};const Es=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 Os(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new $s(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new $s(`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=>Is(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=Rs(r.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Is(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:Is(r.content)})}return t}(e.messages);if(0===r.length)throw new $s("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),Cs(e.temperature)&&(o.temperature=e.temperature),Cs(e.top_p)&&(o.top_p=e.top_p),Cs(e.parallel_tool_calls)&&(o.parallel_tool_calls=e.parallel_tool_calls),Cs(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 Cs(e){return null!=e}function Is(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Rs(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 $s(`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 qs(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 Ps(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 Ms(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 Ns(e,t,r){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(r)}function js(e,t){let r=e.item;if("function_call"!==r.type)return[];let o="response.output_item.done"===e.type,n=Ns(t,r.id,e.output_index);if(void 0!==n)return o&&!t.toolCallsWithArgs.has(n)&&r.arguments?(t.toolCallsWithArgs.add(n),[Ms(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),[Ms(t,{tool_calls:[{index:a,id:r.call_id,type:"function",function:{name:r.name,arguments:i}}]})]}function Ds(e,t){let r=[Ms(e,{},Ps(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:o,...n}=qs(t.usage);r.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:n})}return r}function Ls(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:[Ms(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:js(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let r=Ns(t,e.item_id,e.output_index);return void 0!==r&&e.delta?(t.toolCallsWithArgs.add(r),{chunks:[Ms(t,{tool_calls:[{index:r,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Ds(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 Bs="openai_responses";function Fs(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),Os(e)}finally{t.end()}});st.record(performance.now()-t,{direction:"openai_to_responses"});let n=function(e){return Object.entries(e).filter(([e,t])=>!Es.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 Us(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:Ps(e,o.length>0)}]};return e.usage&&(n.usage=qs(e.usage)),n}(e)}finally{t.end()}});return st.record(performance.now()-t,{direction:"responses_to_openai"}),r}function Hs(e,t,n){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...r}=qs(t.usage);a.tokenUsage=Ei(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(Us(t))}async function zs(e,t,o){let n;try{n=Fs(t)}catch(t){if(t instanceof $s)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 Si();let a=await $i(e);if(a)return a;let i=performance.now(),s=await ks(n),l=performance.now()-i;if(nt.record(l,{model:n.model,target:"responses",streaming:String(!!n.stream)}),As(s))return Hs(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,a=0,s=performance.now(),m=Gi(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:Bs});let c=Ss(s);if(c){o=c;let t=e.get("requestData")||{};t.tokenUsage=Ei(c),t._d1=l,e.set("requestData",t)}let u=Ls(s,p);if(u.error)throw new Pi(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:Bs};at.record(performance.now()-s,u),pt.record(a,u),Ki(e,i)}catch(r){throw gt(u,e.get("requestSpan"),r),await ji(t,r),r}finally{o&&Oi(u,o),u.end(),d()}let f=e.get("requestId");f&&Oe.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Js(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 Gs(e){let t=!0===e.get("isSelfTest");t||await qi(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=Ii(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 Ci)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(Ri(o.model))return zs(e,o,{isSelfTest:t});e.set("requestData",{model:o.model,streaming:!!o.stream}),he.manualApprove&&!t&&await Si(),"foundry"!==he.provider&&(o=function(e){if(!hn(e.max_completion_tokens)){let{max_completion_tokens:t,...r}=e;return{...r,max_tokens:t}}if(!hn(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=Hi(o,he.models)),hn(o.thinking_budget)||r.debug("Normalized thinking_budget to:",JSON.stringify(o.thinking_budget));let n=await $i(e);if(n)return n;let a=performance.now(),i=await ms(o),s=performance.now()-a;if(nt.record(s,{model:o.model,target:"chat_completions",streaming:String(!!o.stream)}),Ks(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Ei(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(),d=Gi(e,a);try{try{for await(let a of l){d();let i=a;a.data&&"[DONE]"!==a.data&&(n++,Ze.add(1,{model:o.model,endpoint_type:"openai"}),i=Js(a,t=>{r.value=t;let o=e.get("requestData")||{};o.tokenUsage=Ei(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),pt.record(n,u),Ki(e,a),r.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Ei(r.value),t._d1=s,e.set("requestData",t))}}catch(r){throw gt(c,e.get("requestSpan"),r),await ji(t,r),r}finally{r.value&&Oi(c,r.value),c.end(),u()}let p=e.get("requestId");p&&Oe.executeCompletion(p)}finally{e.get("resolveStreamComplete")?.()}})}const Ks=e=>Object.hasOwn(e,"choices"),Ws=new B;Ws.post("/",async e=>{try{return await mn(e,"chat",Gs)}catch(t){return await Br(e,t)}});const Ys=async(e,t,r)=>{if(!yo(he))throw Error("Service token not found");let o=mo(he)?"/decisions":"/v1/decisions",n=`${ho(he)}${o}`,a=go(he),i=new AbortController,s=yr(i,he.timeoutMs);try{let{response:o,span:s}=await bt({spanName:"copilot POST /v1/decisions",url:n,target:"decisions",method:"POST",headers:a,body:t,signal:r?AbortSignal.any([i.signal,r]):i.signal,extraAttributes:{"copilot_api.model":e,"copilot_api.upstream.provider":he.provider}});try{let e=await o.text();if(!o.ok)throw new hr("Failed to create decisions",new Response(e,{status:o.status,statusText:o.statusText,headers:o.headers}),{outgoingBody:t,outgoingHeaders:a});let r=Vs(e);if(!r){let e=`Upstream returned a ${o.status} decisions reply that is not a JSON object`;throw new hr(e,Response.json({error:{type:"upstream_invalid_reply",message:e}},{status:502}),{outgoingBody:t,outgoingHeaders:a})}return r}catch(e){throw ht(s,e),e}finally{s.end()}}finally{clearTimeout(s)}},Vs=e=>{try{let t=JSON.parse(e);return"object"==typeof t&&t&&!Array.isArray(t)?t:void 0}catch{return}},Xs=(e,t)=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error",code:"invalid_request"}},400)),Zs=(e,t)=>e.json({error:{message:`Request body exceeds the ${t/1024/1024} MB limit.`,type:"invalid_request_error",code:"request_too_large"}},413),Qs=(e,t,r)=>{try{if(r)throw new Ci(r);return Ii(t)}catch(t){if(t instanceof Ci)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}},el=new B;el.post("/",async e=>{try{await qi(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=Qs(e,r.model);if(o instanceof Response)return o;e.set("requestData",{model:o});let n=await $i(e);if(n)return n;he.manualApprove&&await Si(Lt(e));let a=o===r.model?t:JSON.stringify({...r,model:o}),i=performance.now(),s=await(async(e,t,r)=>{try{return await Ys(e,t,r)}catch(o){if(o instanceof hr&&401===o.response.status){if(!await ro(o))throw o;return Ys(e,t,r)}throw o}})(o,a,Lt(e)),l=performance.now()-i;nt.record(l,{model:o,target:"decisions",streaming:"false"});let c=e.get("requestData")||{};return s.usage&&(c.tokenUsage=Ei(qs(s.usage))),c._d1=l,e.set("requestData",c),e.json(s)}catch(t){return await Br(e,t)}});const tl=async e=>{if(!yo(he))throw Error("Service token not found");let t=`${ho(he)}/embeddings`,r=go(he),o=he.timeoutMs,n=new AbortController,a=yr(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 hr("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)}},rl=new B;rl.post("/",async e=>{try{let t=await e.req.json();try{t.model=Ii(t.model)}catch(t){if(t instanceof Ci)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 $i(e);if(r)return r;let o=performance.now(),n=await(async e=>{try{return await tl(e)}catch(t){if(t instanceof hr&&401===t.response.status){if(!await ro(t))throw t;return tl(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=Ei(n.usage),i._d1=a,e.set("requestData",i),e.json(n)}catch(t){return await Br(e,t)}});const ol=new B;let nl=null,al=null;ol.get("/",async e=>{let t,r=function(){if(mo(he)){if(!yo(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=nl;return t&&e-t.timestamp<3e4?{result:t.result}:al||(al=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),r=performance.now();try{let t=`${ho(he)}/models`,o=await fetch(t,{method:"GET",headers:go(he),signal:e.signal}),n=Math.round(performance.now()-r),a=o.ok?"reachable":"unreachable";return nl={result:a,timestamp:Date.now()},{result:a,latencyMs:n}}catch{let e=Math.round(performance.now()-r);return nl={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),al=null}})(),al)}();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.4",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 il=class extends Error{upstream;constructor(e){super("Copilot rejected the token for a streamed image upload"),this.upstream=e,this.name="ImagesRetryLaterError"}};const sl=e=>"object"==typeof e&&"chunks"in e,ll=async(e,t)=>{if(void 0===e)return await t();let r=e-performance.now();if(r<=0)throw new gr(he.timeoutMs);let o=new AbortController,n=new Promise((e,t)=>{o.signal.addEventListener("abort",()=>t(Error()),{once:!0})});n.catch(()=>{});let a=setTimeout(()=>o.abort(),r);try{return await Promise.race([t(o.signal),n])}catch(e){throw o.signal.aborted?new gr(he.timeoutMs):e}finally{clearTimeout(a)}},cl=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 ro()},ul=async(e,t,r)=>{let{status:o}=e.response;if(401===o&&!t.refreshed){if(t.refreshed=!0,!await ll(t.deadline,()=>ro(e)))throw e;if(!t.replayable)throw new il(e);return}if(429!==o||!t.replayable)throw e;let n=Ko(e.response.headers,Date.now(),1e3)+250*Math.random();if(t.attempts>=3||Date.now()-t.start+n>1e4||performance.now()+n>(t.deadline??1/0))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)},dl=async(e,t,{onBodyEnd:r,timeoutMs:o})=>{if(!yo(he))throw Error("Service token not found");let n=`${ho(he)}/v1/images/${e.operation}`,a=new AbortController,i=ml(a,t,o),{body:s,length:l}=fl(e.body,a.signal,i),c=e.model?void 0:e.lateModel,u=pl(e.contentType,l),{release:d}=i,p=!1;try{let l=await vt({spanName:`copilot POST /v1/images/${e.operation}`,url:n,target:"images",method:"POST",headers:u,body:s,signal:a.signal,headersTimeout:o,bodyTimeout:o,extraAttributes:{...e.model&&{"copilot_api.model":e.model},"copilot_api.upstream.provider":he.provider}}),{span:m}=l;l.body instanceof ReadableStream||i.attachBody(l.body);try{let o=yl(l);if(!o.ok){let t=await o.text();throw new hr(`Failed to create image ${e.operation}`,new Response(t,{status:o.status,statusText:o.statusText,headers:o.headers}),{outgoingHeaders:u})}let n=o.headers.get("content-type")??"application/json",{stream:a,fail:s}=bl(o.body,(e,r,o)=>{void 0!==e&&(!o&&!t?.aborted)&&ht(m,e);let n=c?.();n&&m.setAttribute("copilot_api.model",n),void 0!==r&&m.setAttribute("copilot_api.images.total_nano_aiu",r),m.end(),d()},r);return i.onAbort(s),p=!0,{contentType:n,body:a}}catch(e){throw ht(m,e),e}finally{if(!p){let e=c?.();e&&m.setAttribute("copilot_api.model",e),m.end()}}}finally{p||d()}},pl=(e,t)=>({...go(he),"Content-Type":e,...void 0!==t&&{"Content-Length":String(t)},"accept-encoding":"identity"}),ml=(e,t,r)=>{let o,n,a=1,i=t=>{n?.(t),o?.on("error",()=>{}),o?.destroy(t),e.abort(t)},s=setTimeout(()=>i(new gr(he.timeoutMs)),r),l=()=>i(t?.reason);return t?.aborted?l():t?.addEventListener("abort",l,{once:!0}),{hold:()=>{a++},release:()=>{--a>0||(clearTimeout(s),t?.removeEventListener("abort",l))},attachBody:e=>{o=e},onAbort:e=>{n=e}}},fl=(e,t,r)=>{if("string"==typeof e)return{body:e,length:q.byteLength(e)};if(sl(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]=hl,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:q.from(e.buffer,e.byteOffset,e.byteLength),length:e.byteLength}};const hl=new Uint8Array,gl=new Set([101,204,205,304]),yl=({statusCode:e,headers:t,body:r})=>{let o={status:e,headers:t};return gl.has(e)?(ls(r),new Response(null,o)):is(r,o)},_l=async(e,t)=>{let r;try{await Promise.race([e?.cancel(t).catch(()=>{}),new Promise(e=>{r=setTimeout(e,5e3)})])}finally{clearTimeout(r)}},wl=65536,bl=(e,t,r)=>{let o,n=e?.getReader(),a=new xl,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 vl;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 kl,r=t?e.cause??e:e;try{await _l(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),_l(n,t).then(()=>l(t))}}};var vl=class extends Error{name="ImagesBodyFailedError";constructor(){super("The upstream image response failed before its end.")}},kl=class extends Error{name="ImagesRouteCancel"},xl=class{head=new Uint8Array(wl);headLength=0;ring=new Uint8Array(wl);ringEnd=0;total=0;push(e){if(this.total+=e.byteLength,this.headLength<wl){let t=Math.min(e.byteLength,wl-this.headLength);this.head.set(e.subarray(0,t),this.headLength),this.headLength+=t}let t=e.byteLength>wl?e.subarray(e.byteLength-wl):e,r=Math.min(t.byteLength,wl-this.ringEnd);this.ring.set(t.subarray(0,r),this.ringEnd),this.ring.set(t.subarray(r),0),this.ringEnd=(this.ringEnd+t.byteLength)%wl}tail(){if(this.total<wl)return this.ring.subarray(0,this.total);let e=new Uint8Array(wl);return e.set(this.ring.subarray(this.ringEnd)),e.set(this.ring.subarray(0,this.ringEnd),wl-this.ringEnd),e}read(){let e,t=this.tail(),r=this.head.subarray(0,this.headLength);if(this.total<=wl)e=[[Tl(t),"end"]];else if(this.total<=2*wl){let o=new Uint8Array(this.total);o.set(r),o.set(t.subarray(2*wl-this.total),wl),e=[[Tl(o),"end"]]}else e=[[Tl(t),"end"],[Tl(r),"start"]];let o=t=>{for(let[r,o]of e){let e=Sl(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 Tl=e=>(new TextDecoder).decode(e),Al=(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 Sl(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?Al(e,[t.index+1,e.length],-1):Al(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 $l=e=>e.header("Connection","close"),El=e=>{let t=(e=>{let t=Number(e.req.header("content-length"));return{limit:Ti(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)||!xi(e.req.raw,t.limit,t.declaredLength))&&$l(e)},Ol=(e,t)=>{f.getActiveSpan()?.setAttribute("copilot_api.error_type","images_capacity");let r=ii().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)},Cl={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."},Il=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)),Rl=e=>($l(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 ql=class extends Error{constructor(){super("The request body stopped arriving."),this.name="BodyIdleTimeoutError"}};const Pl=async(e,t)=>{let r;try{await Promise.race([e.cancel(t).catch(()=>{}),new Promise(e=>{r=setTimeout(e,1e3)})])}finally{clearTimeout(r)}},Ml=async(e,t)=>{let r,o;try{return await Promise.race([e.read(),new Promise((e,t)=>{r=setTimeout(()=>t(new ql),(()=>{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)}},Nl=1048576,jl=(e,t)=>{let r=(e=>Math.min(Math.max(e??Ya,0),Va))(t);return t=>{if(t<=r)return"ok";let o=Math.ceil(t/Nl)*Nl,n=e.grow(Math.ceil(1*(o-r)));return"ok"===n&&(r=o),n}},Dl=e=>{let t=0;return async r=>{let o=await(e=>ii().pacer.take(e))(r?AbortSignal.any([e,r]):e);t+=o,t>0&&f.getActiveSpan()?.setAttribute("copilot_api.images.start_wait_ms",t)}},Ll=async(e,t,r)=>{try{return await async function(e,t){let{gate:r}=ii(),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 Za?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()-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 Xa(Number.isSafeInteger(o)&&o>=0?o:void 0)})(e,t),r)}catch(t){if(t instanceof Za&&"aborted"!==t.reason)return El(e),"too_large"===t.reason?Il(e):Ol(e,Cl[t.reason]);throw t}},Bl=(e,t)=>{if(e.length<256)return void e.push(t);let r=e.at(-1),o=r&&Ul.get(r);if(t.byteLength>=16384)return o&&Fl(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 Ul.set(n,o),void(e[e.length-1]=n)}o&&Fl(e,r,o);let n=new Uint8Array(65536);n.set(t);let a=n.subarray(0,t.byteLength);Ul.set(a,n),e.push(a)},Fl=(e,t,r)=>{Ul.delete(t),r.byteLength-t.byteLength>=16384&&(e[e.length-1]=t.slice())},Ul=new WeakMap;var Hl=class extends Error{constructor(e){super(e),this.name="JsonSyntaxError"}},zl=class extends Error{constructor(){super('Request body has more than one top-level "model" field.'),this.name="DuplicateModelError"}};const Jl=0,Gl=1,Kl=2,Wl=3,Yl=4,Vl=5,Xl=6,Zl=7,Ql=8,ec=9,tc=10,rc=11,oc=12,nc=13,ac=14,ic=15,sc=16,lc=17,cc=18,uc=19,dc=20,pc=21,mc=[239,187,191],fc=[34,109,111,100,101,108,34],hc=e=>32===e||10===e||13===e||9===e,gc=e=>e>=48&&e<=57,yc={[nc]:[ac,ic,-2,-2,-2,-2],[ac]:[-1,-1,sc,cc,-1,-1],[ic]:[ic,ic,sc,cc,-1,-1],[sc]:[lc,lc,-2,-2,-2,-2],[lc]:[lc,lc,-1,cc,-1,-1],[cc]:[dc,dc,-2,-2,uc,-2],[uc]:[dc,dc,-2,-2,-2,-2],[dc]:[dc,dc,-1,-1,-1,-1]};var _c=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))}},wc=class{state=Jl;stack=new _c;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===Ql&&"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===ac||this.state===ic||this.state===lc||this.state===dc)&&(this.state=Zl),this.state!==Zl&&this.fail("Unexpected end of JSON input")}fail(e){throw new Hl(`${e} at byte ${this.offset}`)}step(e){switch(this.state){case Jl:return e===mc[0]&&0===this.offset?(this.state=pc,void(this.bomIndex=1)):(this.state=Gl,void this.step(e));case pc:return e!==mc[this.bomIndex]&&this.fail("Unexpected token"),void(++this.bomIndex===mc.length&&(this.state=Gl));case Gl:case Kl:if(hc(e))return;return 93===e&&this.state===Kl?void this.closeContainer():void this.startValue(e);case Wl:case Yl:if(hc(e))return;return 125===e&&this.state===Wl?void this.closeContainer():(34!==e&&this.fail("Expected a property name"),void this.beginString(1===this.stack.length?"key":"none",!0));case Vl:if(hc(e))return;return 58!==e&&this.fail("Expected ':'"),void(this.state=Gl);case Xl:{if(hc(e))return;let t=this.stack.top();return 44===e?void(this.state=t?Yl:Gl):e===(t?125:93)?void this.closeContainer():void this.fail("Expected ',' or a close")}case Zl:return void(hc(e)||this.fail("Unexpected non-whitespace after JSON"));case Ql:return void this.stringByte(e);case ec:return this.record(e),117===e?(this.state=tc,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=Ql));case tc:return(e=>gc(e)||e>=97&&e<=102||e>=65&&e<=70)(e)||this.fail("Bad Unicode escape"),this.record(e),void(0===--this.hexLeft&&(this.state=Ql));case rc: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=Ql));case oc: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=Wl);case 91:return this.stack.push(!1),void(this.state=Kl);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=nc);default:48===e?this.state=ac:gc(e)?this.state=ic:this.fail("Unexpected token")}}beginLiteral(e){this.literal=e,this.literalIndex=1,this.state=oc}beginString(e,t=!1){this.state=Ql,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=ec):(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=rc))}endString(){let e=this.stringRole;if(this.stringRole="none",this.stringIsKey){if(this.state=Vl,"key"!==e)return;if(!this.captureOverflow&&this.isModelKey(this.capture)){if(this.modelSeen)throw new zl;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!==fc.length||!e.every((e,t)=>e===fc[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:Xl}closeContainer(){this.stack.pop(),this.endScalar()}numberByte(e){let t=yc[this.state]?.[(e=>48===e?0:gc(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 bc=class extends Error{kind;constructor(e){super(`JSON request body rejected: ${e}`),this.kind=e,this.name="JsonBodyError"}},vc=class extends Error{constructor(){super("The JSON request body upload stopped before its end."),this.name="UploadCancelledError"}};const kc=async(e,t)=>{let r,o=new wc,n=e?.getReader(),a=[],i=0,s=(()=>{let e,t,r=new Promise((r,o)=>{e=r,t=o});return r.catch(()=>{}),{promise:r,resolve:e,reject:t}})(),l={reading:!1,stop:!1},{claim:c,discard:u,end:d}=xc(n,t,()=>({read:i,deadline:l.deadline})),p=()=>(s.reject(new vc),a.length=0,c(),Ec(l,n,u),Promise.resolve()),m=e=>{i+=e.byteLength},f=e=>{if(m(e),i>t.limit)throw r=new bc("too-large");if(void 0!==t.declaredLength&&i>t.declaredLength)throw r=new bc("length-mismatch");try{Sc(o,e)}catch(e){throw r=e,e}},h=()=>{if(d(),void 0!==t.declaredLength&&i!==t.declaredLength)throw r=new bc("length-mismatch");try{o.end()}catch{throw r=new bc("invalid-json")}if(!o.isObject)throw r=new bc("not-object")},g=e=>({model:o.model,head:a,headLength:i,declaredLength:t.declaredLength,rest:e?.rest??null,cancel:p,failure:()=>r,complete:e?s.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 c=Ac(t,i);if(c)throw r=c;if(Bl(a,e.value),void 0!==o.model&&i!==t.declaredLength&&n)return g(Cc($c(n,{take:f,count:m,finish:h,settled:s,discard:u,control:l}),s))}}catch(e){throw s.reject(e),u(),e}},xc=(e,t,r)=>{let o,n=!1,a=!1,i=()=>{n||a||!e||(n=!0,o=bi(),!o&&t.drains&&(t.drains.refused=!0))};return{claim:i,discard:()=>{i();let n=o;return o=void 0,n&&e&&n.start(Tc(e,{...r(),limit:t.limit,declared:t.declaredLength})),Promise.resolve()},end:()=>{a=!0}}},Tc=(e,t)=>()=>hi(e,t),Ac=(e,t)=>{let r=e.reserve?.(t)??"ok";return"busy"===r?new bc("no-capacity"):"too_large"===r?new bc("over-budget"):void 0},Sc=(e,t)=>{try{e.push(t)}catch(e){throw new bc(e instanceof zl?"duplicate-model":"invalid-json")}};async function*$c(e,t){let r,{take:o,count:n,finish:a,settled:i,discard:s,control:l}=t,c=!1;try{for(;;){let t=await Oc(e,l);if(l.stop)throw t.done||n(t.value),new vc;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 vc),s())}}const Ec=(e,t,r)=>{e.stop=!0,e.reading?(e.deadline??=performance.now()+pi,e.watchdog??=setTimeout(()=>{t?.cancel().catch(()=>{})},Math.min(di,pi))):r()},Oc=(e,t)=>t.stop?Promise.reject(new vc):(t.reading=!0,e.read().finally(()=>{t.reading=!1,clearTimeout(t.watchdog)})),Cc=(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 vc),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}},Ic=(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)},Rc=(e,t)=>{switch("length-mismatch"===t&&(e=>{e.header("Connection","close")})(e),t){case"too-large":return Zs(e,Ti(e.req.path));case"no-capacity":return Ol(e,Cl.grow_denied);case"over-budget":return Il(e);case"not-object":return Xs(e,"Request body must be a JSON object.");case"duplicate-model":return Xs(e,'Request body must have exactly one top-level "model" field.');case"length-mismatch":return Xs(e,"The request body length does not match its Content-Length.");default:return Xs(e,"Request body must be valid JSON.")}},qc=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 kc(r,{limit:Ti(e.req.path),declaredLength:i,drains:o,reserve:n})}catch(t){if(t instanceof bc)return Rc(e,t.kind);throw t}let s=a.model,l="too-long"===s?.kind?Qs(e,"","Model name is too long."):Qs(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:Ic(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?Rc(e,t):void 0},cancelBody:a.cancel,...a.rest&&{uploadComplete:a.complete,uploadIdleMs:a.idleMs}}};var Pc=class extends Error{status;constructor(e,t){super(e),this.status=t,this.name="MultipartScanError"}},Mc=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 Pc(`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 Pc("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=jc(e,o,this.delimiter);return this.bodyBytes(e,t,e.byteLength-n),this.keep(e,e.byteLength-n,r),-1}let a=Nc(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 Pc("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=Dc(e);if(r?.file&&r.name===this.name)throw new Pc(`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 Pc(`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 Pc(`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 Nc=(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},jc=(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},Dc=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=Lc(r);if(!o)throw new Pc("Malformed multipart/form-data body.",400);return{name:"form-data"===r.split(";")[0].trim().toLowerCase()?o.get("name"):void 0,file:o.has("filename")||o.has("filename*")}}},Lc=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]??"";if('"'!==e[i]){if("filename"!==a||!e.trimEnd().endsWith(String.raw`\"`))return;s=`${s.trimEnd().slice(0,-1)}\\`}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},Bc=(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:(e=>o.active&&o.size+e.byteLength>t)(e.value)?o.dropped=!0:(Bl(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 vl,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 Hc);if(o.next<o.queue.length){let t=o.queue[o.next];return o.queue[o.next++]=Uc,void e.enqueue(t)}if(o.done)return void e.close();let{inflight:t}=o;if(!t)break;await t,l()}await Fc(r,e)},cancel:e=>r.cancel(e)})),cancel:async e=>{o.active=!1,await r.cancel(e).catch(()=>{})},dropped:()=>o.dropped,failure:i}},Fc=async(e,t)=>{let r;try{r=await e.read()}catch(e){return void t.error(e??new vl)}r.done?t.close():t.enqueue(r.value)},Uc=new Uint8Array;var Hc=class extends Error{constructor(){super("The early answer did not fit in the spool."),this.name="SpoolOverflowError"}};const zc=new B,Jc=(e,t,r)=>{if(t instanceof ql)return Rl(e);if(t instanceof Kc){let r=Qs(e,t.value);return r instanceof Response?r:Xs(e,t.message)}return 413===t.status?Zs(e,r):Xs(e,t.message)};var Gc=class extends Error{constructor(){super("The upload did not reach the upstream in full."),this.name="UploadStoppedError"}},Kc=class extends Error{value;constructor(e){super("The multipart model field is missing or not valid."),this.name="ModelPartError",this.value=e}};const Wc=e=>{try{return Ii(e)}catch(t){throw t instanceof Ci?new Kc(e):t}},Yc=async(e,t,r)=>{let o=(e=>{let t=Lc(e)?.get("boundary");return t&&t.length<=70?t:void 0})(t),n=e.req.raw.body;if(!o||!n)return Xs(e,"Malformed multipart/form-data body.");let a=Ti(e.req.path),i=new Mc(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:d}=su(n.getReader(),{limit:a,declared:c},r),p=[],m=Lt(e),f=await Xc({reader:u,drain:d,scanner:i,held:p,declared:c,signal:m});if("boolean"!=typeof f)return Jc(e,f,a);let{field:h}=i;if(!f&&!h){let e={};return{...Vc({contentType:t,drain:d,body:{chunks:p,length:void 0},rest:t=>Zc({reader:u,drain:d,scanner:i,declared:c,signal:m,onError:t,onModel:t=>{e.model=t}}),model:""}),found:e,lateModel:()=>e.model}}let g=Qs(e,h?.value??null);if(g instanceof Response)return f||d(),g;let y=p,_=0;return h&&h.value!==g&&(y=Qc(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)+_}}):Vc({contentType:t,drain:d,body:{chunks:y,length:l?s+_:void 0},rest:e=>Zc({reader:u,drain:d,scanner:i,declared:c,signal:m,onError:e}),model:g})},Vc=({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,d={[Symbol.asyncIterator]:()=>d,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 Gc)})(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=>a&&Jc(e,a,Ti(e.req.path)),cancelBody:()=>(t(),Promise.resolve()),uploadComplete:s,uploadIdleMs:()=>u||void 0===l?0:Date.now()-l}},Xc=async({reader:e,drain:t,scanner:r,held:o,declared:n,signal:a})=>{try{for(;;){let{done:t,value:i}=await Ml(e,a);if(t)return r.finish(),void 0===n||r.total===n||new Pc("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 ql)return await Pl(e),r;if(t(),r instanceof Pc)return r;throw r}};async function*Zc({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 Ml(e,n);if(t){if(r.finish(),void 0!==o&&r.total!==o)throw new Pc("The request body length does not match its Content-Length.",400);if(u)throw new Kc(null);return void(s=!0)}let d=r.total;if(r.push(a),!u){yield a;continue}if(0===l.length&&(c=d),!r.field){r.inField?l.push(a):yield a;continue}l.push(a);let{field:p}=r,m=Wc(p.value);i?.(m);let f=m===p.value?l:Qc(l,c,{...p,value:m});l=[],u=!1,yield*f}}catch(e){throw(e=>e instanceof Pc||e instanceof Kc||e instanceof ql)(e)&&a(e),e}finally{s||t()}}const Qc=(e,t,{start:r,end:o,value:n})=>{if(r<t)throw new Pc("Malformed multipart/form-data body.",400);let a=q.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},eu=3e4,tu=1e3,ru=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)),ou=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)),nu=async(e,t,r)=>{if(!t.uploadComplete)return{body:r};let o=Bc(r,au);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),tu)});try{if(await Promise.race([r,n]))return!t.dropped()||"blocked"}finally{clearTimeout(o)}if(t.dropped())return"blocked";if((e.uploadIdleMs?.()??0)>=eu)return"stalled"}})(t,o);if(!0!==n)return await o.cancel(new kl(`upload ${n}`)),await(t.cancelBody?.()),lu(e,t),{failed:"stalled"===n?ou(e):ru(e),body:r}}catch(n){return await o.cancel(new kl("The upload failed.",{cause:n})),await(t.cancelBody?.()),lu(e,t),{failed:t.bodyFailure?.(e)??(n instanceof Gc||n instanceof vc?Xs(e,"The request body did not reach the upstream in full."):await Br(e,n)),body:r}}return lu(e,t),{body:o.release()}},au=Wa;var iu=class extends Error{constructor(){super("The client body is being drained."),this.name="BodyHandedOff"}};const su=(e,t,r)=>{let o,n=0,a=!1;return{reader:{read:async()=>{if(a)throw new iu;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,ki(async()=>{let r=performance.now()+pi;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(di,t-performance.now()))})])}finally{clearTimeout(r)}})(o,r)?await e.cancel().catch(()=>{}):await hi(e,{read:n,...t,deadline:r})})||(r.refused=!0))}}},lu=(e,t)=>{let r=t.found?.model;if(!r)return;let o=e.get("requestData");o?o.model=r:e.set("requestData",{model:r})},cu=async(e,t,r)=>(await(t?.cancelBody?.()),t&&lu(e,t),t?.bodyFailure?.(e)||(r instanceof il?(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)?Xs(e,"The request body length does not match its Content-Length."):Br(e,r))),uu=(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 Ml(r,t);o.done?e.close():e.enqueue(o.value)}catch(t){t instanceof ql&&(o=!0),e.error(t),await Pl(r)}},async cancel(e){await Pl(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:jl(n,Number.isSafeInteger(s)&&s>=0?s:void 0)};return"generations"===t?qc(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?qc(e,"edits",{stream:t(),...r}):"multipart/form-data"===n?Yc(e,o,r.drains):Xs(e,"Image edits require a multipart/form-data or application/json body.")})(e,i,l)},du=e=>async(t,r)=>{let o,n,a={timedOut:()=>!1},i=!1;try{if(mo(he))return Xs(t,"Image endpoints are available only with the Copilot provider.");await qi(he);let s=Lt(t),l=await Ll(t,e,s);if(l instanceof Response)return l;n=l;let c=await uu(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 $i(t);if(u)return await(o.cancelBody?.()),u;he.manualApprove&&await Si(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"),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),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:Dl(t)},clientEnded:o.clientEnded}})(l,s,d),m=await(async(e,t,r={})=>{let{onBodyEnd:o,beforeAttempt:n}=r,a=!sl(e.body)||null===e.body.rest;a||await cl();let i={replayable:a,attempts:1,refreshed:!1,start:Date.now()};for(;;)try{await ll(i.deadline,e=>n?.(e)),i.deadline??=performance.now()+he.timeoutMs;let r=i.deadline-performance.now();if(r<=0)throw new gr(he.timeoutMs);return await dl(e,t,{onBodyEnd:o,timeoutMs:r})}catch(e){if(!(e instanceof hr))throw e;await ul(e,i,t)}})(o,s,p.hooks),f=await nu(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 Pl(r,e),t()}})})(f.body,p.clientEnded),{status:200,headers:{"content-type":m.contentType}}))}catch(e){return a.timedOut()?(await(o?.cancelBody?.()),Rl(t)):await cu(t,o,e)}finally{i||n?.release()}},pu=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 xi(t.req.raw,Ti(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 mu(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function fu(e){return!mu(e)}function hu(e,t,r){return null==t?null:("string"==typeof r.model&&e.set("requestData",{...e.get("requestData"),model:r.model,streaming:!!r.stream}),e.get("requestSpan")?.setAttribute("copilot_api.error_type","thread_unsupported_request"),e.json({type:"error",error:{type:"invalid_request_error",message:"This route does not support message threads. Resend the full conversation, system instructions, and tools without thread.",details:{error_code:"thread_unsupported_request"}}},400))}zc.post("/generations",pu(du("generations"))),zc.post("/edits",pu(du("edits")));const gu=new Y(X);let yu;const _u={...V["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function wu(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 bu(e,t){let r=0;for(let o of e)switch(o.type){case"text":r+=t(o.text)*_u.contentMultiplier;break;case"tool_use":r+=t(o.name+JSON.stringify(o.input))*_u.contentMultiplier;break;case"tool_result":o.content&&(r+=t("string"==typeof o.content?o.content:JSON.stringify(o.content))*_u.contentMultiplier);break;case"thinking":r+=t(o.thinking)*_u.contentMultiplier;break;case"image":r+=1600}return r}function vu(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?_u.perFirstProp:_u.perAdditionalProp,r+=t(o),a.description&&(r+=_u.perPropDesc+t(a.description)),a.enum&&Array.isArray(a.enum)){r+=_u.perEnum;for(let e of a.enum)r+=t(String(e))}if("object"===a.type&&a.properties&&(r+=_u.perNestedObject,r+=vu(a,t)),"array"===a.type&&a.items){let e=a.items;"object"===e.type&&e.properties&&(r+=_u.perArrayOfObjects,r+=vu(e,t))}}return r}const ku={event:"ping",data:JSON.stringify({type:"ping"})};function xu(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(ku).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 Tu(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 Au(e,t,r){let o=Tu(t,r);for(let[t,r]of Object.entries(o))void 0!==r&&e.setAttribute(t,r)}const Su=async(e,t,o)=>{try{return await $u(e,t)}catch(n){if(n instanceof hr&&401===n.response.status){if(!await ro(n))throw n;return $u(e,t)}if(n instanceof hr&&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}`),$u(i,t)}throw n}};const $u=async(e,t)=>{if(!yo(he))throw Error("Service token not found");let{baseUrl:r,headers:o,cleanPayload:n}=mo(he)&&he.foundry?{baseUrl:uo(he.foundry),headers:po(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}}(Oa(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,...Tu(e,t?.anthropicBeta)}}(n,t,i);for(let e=0;e<=1;e++){me();let t=rs(r,{fresh:e>0}),c=new AbortController,u=Qo(c,i);try{let{statusCode:r,headers:d,body:p,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=is(p,{status:r,headers:d});if(!f.ok)throw m.end(),new hr("Failed to create anthropic messages",f,{outgoingBody:s,outgoingHeaders:o});if(n.stream)return{events:ss(f,p),span:m,release:()=>os(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&&Oi(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(),os(t)}}catch(r){if(os(t),await fr(r,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw r}finally{u.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Eu=new Set(["resolveStreamComplete","requestId"]);function Ou(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 Cu(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))Eu.has(t)||o.set(t,r);return o}(e);try{let e,t=await async function(e,t,r){let o=await pn(e,t,r);if(o.ok&&o.body)return o;throw await(o.body?.cancel()),new hr("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?Ou(o,e):o}))}catch(t){if(Ft(e))return;let r=e.get("requestSpan");throw r&&ht(r,t),await Ni(o,t),t}finally{e.set("requestData",s.get("requestData"))}}const Iu=24e4;var Ru=class extends gr{name="StreamHeadersTimeoutError"};function qu(){if(le())return;let e=new AbortController,t=setTimeout(()=>{e.abort(new Ru(Iu))},Iu);return{signal:e.signal,clear:()=>clearTimeout(t)}}function Pu(e,t){e.get("requestSpan")?.setAttribute("copilot_api.stream.headers_wait_ms",Math.round(performance.now()-t))}async function Mu(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&&Pu(e,r),n}catch(t){throw o?.setAttribute("copilot_api.stream.early_commit",!1),Pu(e,r),t}}const Nu={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"},ju=e=>Nu[e]??(e>=500?"api_error":"invalid_request_error");async function Du(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 Br(r,t);if(499===o.status)return;if((e=>e instanceof Ru||e instanceof Error&&e.cause instanceof Ru)(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 _r(t)?{type:"overloaded_error",message:n}:{type:ju(o.status),message:n}}async function Lu(e,t,r){await t.client.writeSSE(ku);try{let t=await r.pending;return Pu(e,r.start),t}catch(o){if(Pu(e,r.start),Ft(e))return void Oe.completionCallbacks.delete(e.get("requestId"));let n=function(e,t){if(cn(e))return en(t,void 0!==nn()?.sent)}(e,o);if(n)return void await Cu(e,t,{reason:n,progress:{messageStart:!1,content:!1,held:[]},failure:o});let a=await Du(e,o);return void(a&&await t.client.writeSSE({event:"error",data:JSON.stringify({type:"error",error:a})}))}}const Bu=new Set(["low","medium","high","max","xhigh"]),Fu=(e,t)=>!(!e||!t||e===t);function Uu(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!Bu.has(t))return e;let o=he.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,n=Lo(t,o);if(!n||!Bu.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 Hu(e,t,o){if("foundry"===he.provider)return Uu(e);let n=t.includes(e.model)?e.model:jo(e.model,t)??e.model,a=n===e.model?e:{...e,model:n},i=function(e,t,r={}){let o=jo(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 Uu(s)}const zu=e=>"object"==typeof e&&!!e&&!Array.isArray(e),Ju=["properties","patternProperties","$defs","definitions"],Gu=["items","additionalProperties","propertyNames","contains","not","if","then","else"],Ku=["anyOf","allOf","oneOf","prefixItems"];const Wu=()=>["string","number","boolean"].map(e=>({type:e})),Yu=()=>({anyOf:[...Wu(),{type:"array",items:{anyOf:Wu()}},{type:"object"}]}),Vu=e=>!0===e||zu(e)&&0===Object.keys(e).length,Xu=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function Zu(e,t){let r={...e};for(let e of Ju){let o=r[e];zu(o)&&(r[e]=Object.fromEntries(Object.entries(o).map(([e,r])=>[e,zu(r)?Zu(r,t):r])))}for(let e of Gu){let o=r[e];zu(o)&&(r[e]=Zu(o,t))}for(let e of Ku){let o=r[e];Array.isArray(o)&&(r[e]=o.map(e=>zu(e)?Zu(e,t):e))}return"prefixItems"in r&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(zu(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let r=t.flatMap(e=>Vu(e)?Yu().anyOf:zu(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)),Xu(r)&&(!("items"in r)||Vu(r.items))&&(t.add("items"),r.items=Yu()),Vu(r.additionalProperties)&&(t.add("additionalProperties"),delete r.additionalProperties),r}function Qu(e){let t=[],r=[];for(let o of e)switch(o.role){case"system":{if(r.length>0){r.push(o);break}let e=td(o);e&&t.push(e);break}case"user":case"assistant":r.push(o)}return{leadingSystemTexts:t,messages:r}}function ed(e){return rd(td(e))}function td(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 rd(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function od(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>rd(e)).filter(Boolean).join("\n\n")}const nd=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),ad=new Set(["text","image"]);function id(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);ad.has(e)||t.add(`block:tool_result:${e}`)}}const sd=new Set;function ld(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=nd.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&&id(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(sd.size>=100)break;sd.has(r)||(sd.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 cd=e=>P("sha256").update(e).digest("hex").slice(0,12);function ud(e,t){e.setAttribute("copilot_api.translation.system_hash",cd(t.system)),e.setAttribute("copilot_api.translation.tools_hash",cd(JSON.stringify(t.tools??[])))}function dd(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function pd(e){return e.toLowerCase().startsWith("claude-")}function md(e,t){let r={model:e.model,messages:fd(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:kd(e.tools,e.model),tool_choice:xd(e.tool_choice)},o=e.thinking;if("enabled"===o?.type||"adaptive"===o?.type){let n=Fi(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=Di(t),a=n&&n>1?n-1:r.min;return Li(Math.min(o,a),r.min,r.max)}(e.output_config?.effort??"high",r.max_tokens,n.bounds);r=Hi({...r,thinking_budget:a},t)}}return r}function fd(e,t){let{leadingSystemTexts:r,messages:o}=Qu(e),n=function(e,t){let r=od(e,t);return r?[{role:"system",content:r}]:[]}(t,r),a=[];for(let e of o)switch(e.role){case"system":{let t=ed(e);if(!t)break;hd(n)?a.push(t):gd(n,t);break}case"user":n.push(...yd(e));for(let e of a)gd(n,e);a=[];break;case"assistant":n.push(..._d(e))}for(let e of a)gd(n,e);return n}function hd(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function gd(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 yd(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:vd(e.content)});o.length>0&&t.push({role:"user",content:vd(o)})}else t.push({role:"user",content:vd(e.content)});return t}function _d(e){let t=function(e){return{reasoning_text:bd(e.reasoning_text),reasoning_opaque:bd(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:vd(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:vd(e.content),...t}]}const wd=32768;function bd(e){if("string"==typeof e)return e.length<=wd?e:e.slice(0,wd)}function vd(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 kd(e,t){if(!e)return;let r=e.filter(fu),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:Zu(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 xd(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 Td(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 Ad(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Sd(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 $d=new Set(["low","medium","high","max","xhigh"]);function Ed(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&&$d.has(e)?e:null)(Lo(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 Od(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 Cd=/[^\w-]/g;function Id(e){return e.replaceAll(Cd,"_")}function Rd(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=Ed(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:Od(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:Id(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Id(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(r),r}function qd(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 Pd(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 Md(e,t){return Ne.startActiveSpan("copilot_api.model.validate",o=>{try{o.setAttribute("copilot_api.model.requested",t.model),Au(o,t,e.req.header("anthropic-beta"));let n=Ii(t.model);o.setAttribute("copilot_api.model.normalized",n);let a=qd(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 Ci)return{ok:!1,response:Pd(e,t.message,t.statusCode)};throw t}finally{o.end()}})}var Nd=class extends Pi{name="UpstreamIdleError";constructor(e){super("api_error",`Upstream sent nothing for ${Math.round(e/1e3)}s; stream aborted`)}};function jd(e,t,r){let{leadingSystemTexts:o,messages:n}=Qu(e.messages),a=function(e){let t=[],r=[];for(let o of e)switch(o.role){case"system":{let e=ed(o);if(!e)break;"function_call"===t.at(-1)?.type?r.push(e):t.push(Hd(e));break}case"user":t.push(...zd(o),...r.map(e=>Hd(e))),r=[];break;case"assistant":t.push(...Kd(o))}return t.push(...r.map(e=>Hd(e))),t}(n);if(0===a.length)throw new hr("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 od(e,t)||null}(e.system,o);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(fu).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:Ud(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=Lo(r,t);return{effort:Fd(o)?o:r}}}(e,t,r?.keepMax??!1);return l&&(i.reasoning=l),r?.promptCacheKey&&(i.prompt_cache_key=r.promptCacheKey),i}function Dd(e,t){let r=e?.trim()||t?.trim();if(r)return`cc-${P("sha256").update(r).digest("hex").slice(0,32)}`}function Ld(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 Bd=new Set(["low","medium","high","xhigh"]),Fd=e=>null!==e&&Bd.has(e);function Ud(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Hd(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function zd(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(Gd(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(Jd(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 Jd(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function Gd(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?Jd(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 Kd(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 Wd(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 Yd(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Vd(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 Xd(e,t){let r=[];switch(e.type){case"response.created":Vd(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){Vd(t,r),Yd(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":Vd(t,r),Yd(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":Yd(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":{Yd(t,r);let o=e.response.output.some(e=>"function_call"===e.type),n=e.response.usage,a=Wd(e.response,o);t.terminalEvent=e.type,t.stopReason=a,r.push({type:"message_delta",delta:{stop_reason:a,stop_sequence:null},usage:Ld(n)},{type:"message_stop"});break}case"response.incomplete":{Vd(t,r),Yd(t,r);let o=e.response.usage,n=Wd(e.response,!1);t.terminalEvent=e.type,t.stopReason=n,r.push({type:"message_delta",delta:{stop_reason:n,stop_sequence:null},usage:Ld(o)},{type:"message_stop"});break}case"response.failed":Vd(t,r),Yd(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":Vd(t,r),Yd(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":Vd(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 Zd(e,t,r){let o=t.reasoning?.effort,n=e.get("requestData")||{};n.reasoningEffort=o,n.effortClamped=Fu(r,o),e.set("requestData",n)}function Qd(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function ep(e,t,o){let n=!1;for(let a of t){if(r.debug("Translated Anthropic event:",a),"error"===a.type)throw new Pi(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 tp(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 rp(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 op(e,t){let r=performance.now()-t;return nt.record(r,{model:e.model,target:"responses",streaming:String(!!e.stream)}),r}function np(e,t){return G(e,async r=>{let o=xu(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 ap(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:d,_d1:p,upstreamIdle:m}=o,f=null,h=0,g=performance.now(),y=tp(g),_=Gi(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: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 Nd(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=rp(t.data);if(!o)continue;h++,Ze.add(1,{model:u,endpoint_type:"responses"});let n=Ss(o);if(n){f=n;let t=e.get("requestData")||{};t.tokenUsage=Ei(f),t._d1=p,e.set("requestData",t)}await ep(i,Xd(o,w),b)&&y.forwarded()}(function(e){if(!e.terminalEvent)throw new Pi("api_error","Upstream stream ended before the response completed")})(w),dn();let t=performance.now()-g,o={model:u,endpoint_type:"responses"};at.record(t,o),pt.record(h,o),Ki(e,d)}catch(t){if(Ft(e))return;if(b.content||dr(t)||!cn(e))throw function(e,t,r){if(!(t instanceof Pi))return;let o="stream_incomplete";t instanceof Nd?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 Ni(a,t),t;n=t instanceof Nd?"foundry_stream_idle":"foundry_stream_failed",ht(l,t)}finally{f&&Oi(l,f),y.record(l),n||function(e,t,r){e&&(Qd(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 Cu(e,t,{reason:n,progress:b})}async function ip(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),ld(r,t.messages);let o=jd(t,he.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===he.provider,promptCacheKey:"foundry"===he.provider?Dd(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return ud(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}),Zd(e,i,n),he.manualApprove&&await Si();let s=performance.now(),l=new AbortController,{pending:c,capped:u}=function(e,t,r){let o=t.stream?qu():void 0;return{pending:ks(t,{onAttempt:t=>Zd(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 Mu(e,c,s))return function(e,t,r){let{pending:o,copilotStart:n,upstreamIdle:a}=r;return un(),np(e,async r=>{let i=await Lu(e,r,{pending:o,start:n});i&&!As(i)&&await ap(e,r,{response:i,model:t.model,copilotStart:n,_d1:op(t,n),upstreamIdle:a})})}(e,i,{pending:c,copilotStart:s,upstreamIdle:l});let d=await c,p=op(i,s);if(As(d)){let t=e.get("requestData")||{};if(Qd(e.get("requestSpan"),d.usage?.output_tokens_details?.reasoning_tokens),d.usage&&(t.tokenUsage=Ei({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(),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:Wd(e,r),stop_sequence:null,usage:Ld(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(a)}return un(),np(e,t=>ap(e,t,{response:d,model:i.model,copilotStart:s,_d1:p,upstreamIdle:l}))}function sp(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 lp(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function cp(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&&(sp(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&&(sp(t,r),r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:n.reasoning_opaque}}),lp(t,r)),n.content&&(lp(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){lp(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&&(lp(t,r),t.contentBlockOpen&&=(r.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),r.push({type:"message_delta",delta:{stop_reason:dd(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 up=/structured_outputs|output_config\.format/i;function dp(e,t,r){return function(e,t,r){return!(!e.output_config?.format||"claude-haiku-4.5"===r||!t)&&up.test(t)}(e,t,e.model)&&r?.data.some(e=>"claude-haiku-4.5"===e.id)?Rd({...e,model:qo},r):null}const pp=new WeakMap;var mp=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}},fp=class extends Error{domain;reason;constructor(e,t,r){super(e),this.name="ExaInvalidDomainError",this.domain=t,this.reason=r}};async function hp(e){if(!e.ok){let t=await e.text(),r=`Exa API error: ${e.status} ${t}`,o=400===e.status?function(e){try{let t=JSON.parse(e);if("INVALID_DOMAIN"!==t.tag||"string"!=typeof t.error)return null;let r=t.error.lastIndexOf(": ");return-1===r?null:{domain:t.error.slice(r+2),reason:t.error}}catch{return null}}(t):null;throw o?new fp(r,o.domain,o.reason):Error(r)}return await e.json()}var gp=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const yp={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 gp: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 hp(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 mp:e}finally{clearTimeout(i)}}},_p=["tavily","exa"];function wp(e){return"tavily"===e||"exa"===e}function bp(){return he.webSearchProviders.length>0}async function vp(e,t){return async function(e,t,o){let{providers:n,searchFns:a=yp}=o;if(0===n.length)throw Error("No web search provider configured");let i,s,l=[];for(let[o,c]of n.entries())try{let o=await a[c.name](c.key,e,t);return l.length>0&&r.info(`Web search recovered: served by "${c.name}" after ${l.join(", ")} failed.`),o}catch(e){i=e,e instanceof fp&&(s??=e),l.push(c.name);let t=e instanceof Error?e.message:String(e);o!==n.length-1&&r.warn(`Web search provider "${c.name}" failed (${t}); falling over to "${n[o+1].name}".`)}let c=i instanceof Error?i.message:String(i);throw r.error(`Web search failed: all providers exhausted (${l.join(", ")}). Last error: ${c}`),s||(i instanceof Error?i:Error("All web search providers failed"))}(e,t,{providers:he.webSearchProviders})}function kp(e){let t=e.tools;return!(!t||1!==t.length)&&mu(t[0])}function xp(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Tp(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 Ap(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&&mu(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(!bp())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await vp(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(o){if(o instanceof fp){let a=`Invalid web search domain filter: ${function(e,t){let{allowedDomains:r,blockedDomains:o}=e;return Array.isArray(r)&&r.includes(t)?"allowed_domains":Array.isArray(o)&&o.includes(t)?"blocked_domains":null}(n,o.domain)??"a domain filter"} contains "${o.domain}". The search provider rejected it: ${o.reason}. Use a full domain such as "example.com".`;return r.warn(a),e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}r.error("Web search failed:",o),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_${xp()}`,n=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:o,name:"web_search",input:{query:t}},{...Tp(o,e)}];return{id:`msg_ws_${xp()}`,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_${xp()}`,n=`msg_ws_${xp()}`,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:Tp(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 Sp(e){if(yo(he)||await Pn())return null;let t=$n();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${On()}`}},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 $p(e){if("foundry"!==he.provider)return pd(e);let t=he.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:pd(e)}async function Ep(e,t){(void 0!==e.thread&&null!==e.thread)===t&&await qi(he)}async function Op(e,t){return void 0===t.thread||null===t.thread||"foundry"===he.provider&&!he.models?.data.some(e=>e.id===t.model)&&!(await async function(){let e=he.foundry;if(!e)throw Error("Foundry configuration is unavailable");let t=Date.now(),r=pp.get(e);if(!r||r.expires<=t){let t=Math.max(1e3,1e3*(he.rateLimitSeconds??0)),o=he.models,n=Eo().then(e=>(he.models===o&&(he.models=e),he.models??e));r={result:n,previous:o,expires:1/0},pp.set(e,r);let a=r;n.then(()=>{a.expires=Date.now()+t},()=>{a.result=void 0,a.expires=Date.now()+t})}if(!r.result){if(he.models&&he.models!==r.previous)return he.models;let e=Math.max(1,Math.ceil((r.expires-t)/1e3)),o="Deployment discovery rate limit exceeded. Retry later.";throw new hr(o,Response.json({type:"error",error:{type:"rate_limit_error",message:o}},{status:429,headers:{"Retry-After":String(e)}}))}let o=await r.result;return he.models??o}()).data.some(e=>e.id===t.model)?null:"foundry"!==he.provider||Ri(t.model)||!$p(t.model)?hu(e,t.thread,t):null}function Cp(e,t){let r=t.model;return r&&"string"==typeof r?null:Pd(e,"Model name is required and must be a string")}function Ip(e,t){let r=performance.now()-t;return nt.record(r,{model:e.model,target:"chat_completions",streaming:String(!!e.stream)}),r}function Rp(e,t){return G(e,async r=>{let o=xu(r);r.onAbort(()=>{o.stop(),Bt(e)});try{await t({stream:r,client:o})}finally{o.stop(),e.get("resolveStreamComplete")?.()}})}async function qp(e,t,r){let{pending:o,capped:n,copilotStart:a}=r;if(n&&!await Mu(e,o,a))return function(e,t,r){let{pending:o,copilotStart:n}=r;return un(),Rp(e,async r=>{let a=await Lu(e,r,{pending:o,start:n});if(a)Np(a)||(dn(),await Pp(e,r,{response:a,model:t.model,copilotStart:n,_d1:Ip(t,n)}));else{let t=e.get("requestId");t&&Oe.executeCompletion(t)}})}(e,t,{pending:o,copilotStart:a})}async function Pp(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:d}=o,p=null,m=0,f=performance.now(),h=Gi(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){p=o.usage;let t=e.get("requestData")||{};t.tokenUsage=Ei(p),t._d1=d,e.set("requestData",t)}let n=cp(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),pt.record(m,o),Ki(e,u),p){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Ei(p),t._d1=d,e.set("requestData",t))}}catch(t){throw gt(s,e.get("requestSpan"),t),await Ni(n,t),t}finally{p&&Oi(s,p),s.end(),l()}let y=e.get("requestId");y&&Oe.executeCompletion(y)}async function Mp(e){let t=await e.req.json();if(kp(t))return function(e,t){return Cp(e,t)??hu(e,t.thread,t)??Ap(e,t)}(e,t);await Ep(t,!1),r.debug("Anthropic request payload:",t);let n=t.output_config?.effort,a=Cp(e,t);if(a)return a;t=function(e,t){return Hu(t,he.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Md(e,t);if(!i.ok)return i.response;t=i.payload;let s=await Op(e,t);if(s)return s;await Ep(t,!0);let l=await Sp(e);if(l)return l;if(Ri(t.model))return ip(e,t,n);if($p(t.model))return async function(e,t,r){let o="foundry"===he.provider,n=o?t:Rd(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:Fu(r,i),streaming:!!n.stream}),he.manualApprove&&await Si(),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),Au(t,n,a.anthropicBeta);try{let r=performance.now(),i=await Su(n,a,{onStructuredOutputFallback:(e,r)=>{if(o)return null;let n=dp(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=Ei(jp(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},d=!1,p=Gi(e,r);try{try{for await(let e of l)p(),!e.data||"[DONE]"===e.data||(a++,Ze.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),Dp(e.data,s)&&(d=!0)),await o.writeSSE(e);let e=performance.now()-i,t={model:n.model,endpoint_type:"anthropic_messages"};at.record(e,t),pt.record(a,t)}catch(t){throw gt(c,e.get("requestSpan"),t),await Ni(o,t),t}finally{if(Ki(e,r),d){let t=jp(s);Oi(c,t);let r=e.get("requestData")||{};r.tokenUsage=Ei(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 c=performance.now(),u=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),ld(r,t.messages);let n=md(t,he.models),a=n.messages.at(0);return ud(r,{system:"system"===a?.role&&"string"==typeof a.content?a.content:"",tools:n.tools}),n}finally{r.end()}});st.record(performance.now()-c,{direction:"anthropic_to_openai"}),u=Hi(u,he.models),r.debug("Translated OpenAI request payload:",u);let d=t.output_config?.effort;e.set("requestData",{model:u.model,reasoningEffort:d,effortClamped:Fu(n,d),streaming:!!u.stream});let p=performance.now();he.manualApprove&&await Si();let{pending:m,capped:f}=function(e,t){let r=t.stream?qu():void 0;return{pending:ms(t,r&&{signal:AbortSignal.any([Lt(e),r.signal])}).finally(()=>r?.clear()),capped:void 0!==r}}(e,u),h=await qp(e,u,{pending:m,capped:f,copilotStart:p});if(h)return h;let g=await m,y=Ip(u,p);if(Np(g)){let t=e.get("requestData")||{};g.usage&&(t.tokenUsage=Ei(g.usage)),t._d1=y,t.upstreamTtfbMs=y,t.upstreamTotalMs=y,e.set("requestData",t),r.level>=o.debug&&r.debug("Non-streaming response:",JSON.stringify(g).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=Ad(a.message),i=Td(a.message.content),s=Sd(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:dd(n),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(g);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 Rp(e,t=>Pp(e,t,{response:g,model:u.model,copilotStart:p,_d1:y}))}const Np=e=>Object.hasOwn(e,"choices");function jp(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 Dp(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 Lp=new B;Lp.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&kp(t)}catch{return!1}}(e)?await Mp(e):await mn(e,"messages",Mp)}catch(t){return await Br(e,t)}});const Bp=new B;function Fp(e){return Ne.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let o=Ii(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 Up(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=Ei(r),o._d1=t._d1,t.c.set("requestData",o)}Bp.get("/",async e=>{try{he.models||await gn();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 Br(e,t)}});const Hp=new Set(["message","function_call","function_call_output"]),zp=new Set(["type","name","description","parameters"]);async function Jp(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||!bp())&&(r.info(`Enriching web search: "${o}"`),e.sources=(await vp(o,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Gp(e){if(bp())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Jp(e.action)}}catch(e){r.error("Failed to enrich non-streaming web search:",e)}}async function Kp(e){if(!bp())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 Jp(e.action))return JSON.stringify(t)}}catch(e){r.error("Failed to enrich web search:",e)}return e}function Wp(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 Hp.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Yp(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 Vp(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&&Yp(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)Yp(e,t)&&(n=!0);if(n)return JSON.stringify(r)}}catch{}return e}function Xp(e){return null!=e}function Zp(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Qp(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function em(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(!Zp(o)){r.push(o);continue}let e=Wp(o);null===e?t.add(Qp(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"])Xp(e[r])&&(t[r]=e[r]);let n=new Set;if(Xp(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))zp.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(Xp(e.reasoning)&&"object"==typeof e.reasoning){let r=e.reasoning;t.reasoning={},Xp(r.effort)&&(t.reasoning.effort=r.effort),Xp(r.summary)&&(t.reasoning.summary=r.summary)}if(Xp(e.text)&&"object"==typeof e.text){let r=e.text;Xp(r.format)&&(t.text={format:r.format})}return{payload:t,customToolNames:n,droppedInputTypes:o}}function tm(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function rm(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||Xp(o.previous_response_id)||Xp(o.prompt)||Xp(o.conversation)?null:tm(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 om(e){await qi(he);let t=await e.req.json();if(!Zp(t))return tm(e,"request body must be a JSON object");let o=function(e){return"foundry"===he.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:em(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:Fp(t)}}catch(t){if(t instanceof Ci)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=rm(e,t.input,o);if(s)return s;let l=await $i(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),he.manualApprove&&await Si();let c=performance.now(),u=await ks(a,{signal:Lt(e)}),d=performance.now()-c;if(nt.record(d,{model:a.model,target:"responses",streaming:String(!!a.stream)}),nm(u))return async function(e,t,r){await Gp(t);let o=e.get("requestData")||{};return t.usage&&(o.tokenUsage=Ei({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,i=performance.now(),s=Gi(e,c);try{try{for await(let i of p)if(s(),i.data&&"[DONE]"!==i.data){o++;let s=Vp(i.data,n);s=await Kp(s);let l=s===i.data?i:{...i,data:s};Ze.add(1,{model:a.model,endpoint_type:"responses"}),Up(s,{usageRef:r,c:e,_d1:d}),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),pt.record(o,u),Ki(e,c)}catch(r){if(Ft(e))return;throw gt(m,e.get("requestSpan"),r),await ji(t,r),r}finally{r.value&&Oi(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 nm=e=>Object.hasOwn(e,"output"),am=new B;am.post("/",async e=>{try{return await mn(e,"responses",om)}catch(t){return await Br(e,t)}});const im=new B;im.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 sm=new B;sm.get("/",async e=>{try{let t=await Vn();return e.json(t)}catch(t){return r.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const lm=new B;function cm(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 Ea(r).slice(0,200)}catch{}let t=Ea(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 um(e={}){let t=performance.now(),r=e.model&&function(e){let t=he.models?.data.find(t=>t.id===e);return void 0!==t&&Pa(t)}(e.model)?[e.model]:function(e){return e.filter(e=>Pa(e)).map((e,t)=>({id:e.id,rank:Ma(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 lm.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[Ia]:Ra},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:cm(r.status,o,e),detail:o.slice(0,400)||void 0,modelUnavailable:ja(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)}}lm.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===Ra}(e.req.header(Ia));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(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:a,path:i,endpointType:s,requestId:n,span:c};(y?.streaming||y?.deferFinalize)&&e.res.status<400?h.then(()=>ui(_)).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{}}):ui(_)}),lm.use(F()),lm.use(async(e,t)=>{let r=e.req.header("content-length");if(r){let t=Number(r),o=Ti(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"})`),xi(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()}),lm.get("/",e=>e.text("Server running")),lm.route("/health",ol),lm.route("/chat/completions",Ws),lm.route("/models",Bp),lm.route("/embeddings",rl),lm.route("/usage",sm),lm.route("/token",im),lm.route("/v1/chat/completions",Ws),lm.route("/v1/models",Bp),lm.route("/v1/embeddings",rl),lm.route("/images",zc),lm.route("/v1/images",zc),lm.route("/v1/messages",Lp),lm.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)}let r=hu(e,t.thread,{model:t.model});if(r)return r;if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let{name:o,tokenizer:n}=await async function(e){let t=he.models?.data.find(t=>t.id===e);return!t||"Anthropic"===t.vendor||ko(t.capabilities.family)||"o200k_base"!==t.capabilities.tokenizer?{name:"claude",tokenizer:gu}:(yu??=import("ai-tokenizer/encoding/o200k_base").then(e=>new Y(e)),{name:"o200k_base",tokenizer:await yu})}(t.model),a=e=>wu(n,e),i=_u.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");i+=_u.perMessage+a(e)*_u.contentMultiplier}for(let e of t.messages)i+=_u.perMessage,i+=a(e.role),"string"==typeof e.content?i+=a(e.content)*_u.contentMultiplier:Array.isArray(e.content)&&(i+=bu(e.content,a));let s=t.tools?.filter(fu);s&&s.length>0&&(i+=function(e,t){let r=_u.toolsExist;for(let[o,n]of e.entries())o>0&&(r+=_u.perTool),r+=t(n.name),n.description&&(r+=_u.perDesc+t(n.description)),r+=vu(n.input_schema,t);return r}(s,a));let l=Math.round(i);"string"==typeof t.model&&e.set("requestData",{model:t.model,streaming:!1});let c=e.get("requestSpan");return c?.setAttribute("copilot_api.count_tokens.estimate",l),c?.setAttribute("copilot_api.count_tokens.tokenizer",o),e.json({input_tokens:l})}),lm.route("/v1/responses",am),lm.route("/responses",am),lm.route("/v1/decisions",el),lm.route("/decisions",el),lm.onError((e,t)=>Br(t,e));const dm=e=>`${e}`,pm=e=>`${e}`,mm=e=>`${e}`,fm=e=>`${e}`,hm=e=>`${e}`,gm=pm(" ─────────────────────────────────────────────────────────────");function ym(e,t,r){console.log(` ${function(e){return"ok"===e?mm("✓"):"warn"===e?hm("⚠"):fm("✗")}(e)} ${dm(t.padEnd(14))} ${r}`)}function _m(e){console.log(` ${pm("↳")} ${pm(e)}`)}function wm(e){return e instanceof hr?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function bm(){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 vm(){try{await gn();let e=(he.models?.data.length??0)>0;return ym(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 ym("fail","Model catalog",wm(e)),_m("Could not fetch /models — check connectivity/auth."),!1}}async function km(e){he.accountType=e.accountType;let t=await er(),r=tr();if(console.log(""),console.log(` ${dm("COPILOT-API DOCTOR")} ${pm(`v${t}`)}`),console.log(gm),ym("ok","Runtime",`${r.name} ${r.version} (${r.platform}-${r.arch})`),await oe(),yn(),!await async function(){let e=await bm();if(e){he._t2=e.token,ym("ok","Auth token",`found (${e.source})`);try{let e=await Ur();return await Et(he,e.login),ym("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return ym("fail","GitHub auth",wm(e)),void _m("Token looks invalid/expired. Re-run `copilot-api auth`.")}}else ym("fail","Auth token","not found"),_m("Run `copilot-api auth` (or `copilot-api start`) to authenticate.")}())return console.log(gm),console.log(` ${fm("✗")} ${dm("Authentication failed")} — cannot continue.`),console.log(""),1;let o=await async function(){try{let{token:e}=await Fr();return he._t1=e,ym("ok","Service token","acquired"),!0}catch(e){let t=e instanceof hr?e.response.status:0;return ym("fail","Service token",wm(e)),_m(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 vm();await async function(){try{let e=await Vn(),t=e.quota_snapshots.premium_interactions,r=t.unlimited?"credits unlimited":`credits ${zn(Jn(t))} of ${zn(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;ym("ok","Copilot plan",`${e.copilot_plan} · ${r} `+pm(`(resets ${e.quota_reset_date})`))}catch(e){ym("warn","Copilot plan",`unavailable (${wm(e)})`)}}();let a=!1;return o&&n?a=await async function(){let e=await um();return e.ok?(ym("ok","Generation",`works via ${e.model} ${pm(`(${e.durationMs}ms)`)}`),!0):(ym("fail","Generation",`${e.reason}${e.status?pm(` [HTTP ${e.status}]`):""}`),!1)}():ym("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){ym(t,"Client config","potential base-URL issue");for(let t of e)_m(t)}else ym("ok","Client config","no base-URL issues detected");_m("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(gm),a?(console.log(` ${mm("✓")} ${dm("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${hm("⚠")} ${dm("Some checks need attention")} — see the ${fm("✗")}/${hm("⚠")} lines above.`),console.log(""),2)}const xm=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 km({accountType:e["account-type"]});_.exit(t)}});function Tm(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 Am=!1;const Sm="copilot-api-node20",$m=`https://registry.npmjs.org/${Sm}/latest`,Em=e=>`${e}`,Om=e=>`${e}`;async function Cm(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch($m,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Im(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 Rm,qm;async function Pm(e){try{let[t,r]=await Promise.all([er(),Cm(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 Mm(){if(!Rm||!qm)return;let{signal:e}=qm;Rm.then(t=>{t&&!e.aborted&&function(e,t){let r=`npx ${Sm}@latest`,o=Om("│"),n=` ${Em("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,a=` Run ${Em(r)} to update`,i=" ".repeat(54),s=Om(`╭${"─".repeat(54)}╮`),l=Om(`╰${"─".repeat(54)}╯`),c=["",s,`${o}${i}${o}`,`${o}${Im(n,54)}${o}`,`${o}${i}${o}`,`${o}${Im(a,54)}${o}`,`${o}${i}${o}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var Nm={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 jm=262144,Dm="https://barazany.dev",Lm=/^[a-z0-9][a-z0-9-]*$/i,Bm=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function Fm(e,t){if("string"!=typeof e)return"";let r=e.replaceAll(Bm," ").replaceAll(/\s+/g," ").trim(),o=Array.from(r);return o.length<=t?r:`${o.slice(0,t-1).join("").trimEnd()}…`}function Um(e){if("object"!=typeof e||!e)return null;let t=e,r=Fm(t.title,100),o=Fm(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!==Dm||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&&Lm.test(t.slug)&&(n=`${Dm}/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 Hm(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=Um(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 zm=null;function Jm(e){return s.join(e,"blog-posts.json")}function Gm(e=re.APP_DIR){try{if(zm&&zm.length>0)return zm;let t=function(e){try{let t=Jm(e);return H.statSync(t).size>jm?[]:Hm(JSON.parse(H.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Hm(Nm)}catch{return[]}}function Km(e){return e>-6e4&&e<864e5}async function Wm(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>jm)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>jm?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>jm)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?[]:Hm(JSON.parse(r))}finally{clearTimeout(r)}}async function Ym(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=Jm(e),o=await H.promises.stat(r);if(o.size<=jm){let e=await H.promises.readFile(r),o=JSON.parse(e.toString("utf8"));if("number"==typeof o.fetchedAt)return Km(t-o.fetchedAt)}return Km(t-o.mtimeMs)}catch{return!1}}(t,r))return;let o=await Wm(e.timeoutMs??3e3);if(0===o.length)return;zm=o,await async function(e,t,r){let o=Jm(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 Vm(e){let t;try{({login:t}=await Xm(e))}catch(e){return void r.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await Jo(),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 Xm(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,Sn=!1}(o),r.info("Using provided Auth token")):await Nn();try{t=await Ur(),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 Fr();he._t1=e,r.debug("Service token fetched successfully!"),he.showToken&&r.info("Service token:",e),An=!0,Mn(t),kt.start(),vn=()=>{r.debug("Network connectivity restored, attempting immediate token refresh"),qn(3,500,"network-restored").catch(e=>{r.error("Unexpected error in network-restored token refresh:",e)})},kn=()=>{r.debug("Network connectivity lost")},kt.on("online",vn),kt.on("offline",kn)})(),t}function Zm(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 Qm(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 ef=e=>`${e}`,tf=e=>`${e}`,rf=e=>`${e}`,of=e=>`${e}`,nf=e=>`${e}`,af=e=>`${e}`,sf=(e,t)=>`]8;;${e}\\${t}]8;;\\`,lf="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",cf="https://github.com/johnib/copilot-api-issues/issues",uf=tf(" ─────────────────────────────────────────────────────────────");function df(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function pf(e){return e&&0!==e.length?e.join("·"):"—"}function mf(e){if(0===e.length)return[];let t=["",uf,` ${ef("BARAZANY.DEV")} ${tf("— Recent Posts")}`,uf,""];for(let[r,o]of e.entries()){let e=`${o.url}${lf}`,n=sf(e,ef(af(`[${r+1}]`)));t.push(` ${n} ${rf(o.title)}`,` ${tf("→")} ${tf(o.teaser)}`,"")}return t.push(uf,` ${sf(`https://barazany.dev/blog${lf}`,"barazany.dev/blog")}`,uf),t}function ff(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(tf(" → "))} ${of("✓")}`:tf("off"),o=["",` ${ef("COPILOT-API")} ${tf(`v${e.version}`)}`,uf,` ${tf("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${tf("User")} ${e.user} ${tf("·")} ${e.accountType}`];return he._v1&&o.push(` ${tf("Client")} VSCode ${he._v1}`),o.push(` ${tf("Network")} ${t.join(tf(" · "))}`,` ${tf("Search")} ${r}`),e.clipboardCopied&&o.push(` ${tf("Clipboard")} Claude Code command ${of("✓")}`),o.push(uf),o}function hf(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${ef("Active")}`];if(e.model){let r=he.models?.data.find(t=>t.id===e.model),o=df(r?.capabilities.limits?.max_context_window_tokens),n=pf(r?.capabilities.supports.reasoning_effort);t.push(` ${rf(e.model.padEnd(32))} ${tf("ctx")} ${ef(o.padStart(5))} ${tf("effort")} ${tf(n)} ${nf("← main")}`)}if(e.smallModel){let r=he.models?.data.find(t=>t.id===e.smallModel),o=df(r?.capabilities.limits?.max_context_window_tokens),n=pf(r?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${tf("ctx")} ${o.padStart(5)} ${tf("effort")} ${tf(n)} ${nf("← small")}`)}return t}function gf(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("",` ${ef(r)}`);for(let n of o){let o=n.id===e.model||n.id===e.smallModel,a=o?rf("●"):tf("·"),i=o?rf(n.id.padEnd(34)):n.id.padEnd(34),s=n.ctx?df(n.ctx).padStart(5):"".padStart(5),l="Embedding"===r?"":` ${pf(n.effort)}`;t.push(` ${a} ${i} ${tf(s)}${tf(l)}`)}}return t}function yf(){let e=cf.replace(/^https:\/\//,""),t=sf(`${cf}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",uf,` ${ef("FOUND A BUG?")} ${tf("— Report it on GitHub")}`,uf,"",` ${rf("→")} ${rf(t)}`,` ${tf("Bug reports, feature requests, and questions welcome.")}`,"",uf]}function _f(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=["",uf,` ${ef("Claude Cowork")} ${tf("— Settings → Inference Provider")}`,uf,"",` ${tf("Paste into")} ${ef("inferenceGatewayBaseUrl")}${tf(":")}`,` ${ef(rf(n))}`];return o||a.push("",` ${tf("Your Tailscale hostname is shown by:")} ${rf("tailscale status --self")}`),a.push("",` ${tf("Docs:")} ${rf("https://claude.com/docs/cowork/3p/installation")}`),a}function wf(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,r=["",uf,` ${ef("HTTPS")} ${tf("— self-signed cert")}`,uf,"",` ${tf("Cert")} ${t}`];switch(r.push("",` ${ef("Trust this cert")} ${tf("(one-time setup)")}`),_.platform){case"darwin":r.push(` ${tf("macOS:")}`,` ${rf("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${rf(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":r.push(` ${tf("Windows (PowerShell as Administrator):")}`,` ${rf(`Import-Certificate -FilePath "${t}" \``)}`,` ${rf("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":r.push(` ${tf("Linux (Debian/Ubuntu):")}`,` ${rf(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${rf("sudo update-ca-certificates")}`,` ${tf("Linux (Fedora/RHEL/Arch):")}`,` ${rf(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${rf("sudo update-ca-trust")}`);break;default:r.push(` ${tf("(Unknown platform — see Node fallback below.)")}`)}return r.push("",` ${tf("Or, for Node CLIs only (no admin needed):")}`,` ${rf(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,uf),r}function bf(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 vf(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 hr)return r;t.add(r),r=vr(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 kf=s.join(re.APP_DIR,"certs"),xf=s.join(kf,"cert.pem"),Tf=s.join(kf,"key.pem"),Af=s.join(kf,"cert.meta.json");async function Sf(e){try{return await a.readFile(e,"utf8")}catch{return}}async function $f(e){let t=await Sf(xf),r=await Sf(Tf),o=await async function(){let e=await Sf(Af);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 Ef(e){return 0!==Q(e)}async function Of(e){await a.mkdir(kf,{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)Ef(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(xf,l.cert,{mode:420}),await a.writeFile(Tf,l.private,{mode:384}),await async function(e){await a.writeFile(Af,JSON.stringify(e,null,2),{mode:420})}({hosts:[...n,...i].sort(),notAfter:r.toISOString()}),{cert:l.cert,key:l.private,certPath:xf,keyPath:Tf,generated:!0}}const Cf=[],If=Date.now();let Rf="";function qf(){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()-If)/1e3}});for(let t of Cf)try{await t()}catch(e){r.error("Error during cleanup:",e)}o.end(),function(e,t){let r=sf("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),o=["",uf,` ${ef("COPILOT-API")} ${tf(`v${e}`)} ${tf("·")} ${bf(t)} uptime`,uf,""," Check in from time to time on",` ${rf(r)}`,"",uf,""];console.log(o.join("\n"))}(Rf,Date.now()-If),_.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 Pf=e=>e.filter(e=>Co(e)).map(e=>e.id),Mf=e=>e.filter(e=>Io(e)).map(e=>e.id);async function Nf(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,Pf(he.models.data));i?(n=i.model,a=i.smallModel):(n=await r.prompt("Select a model to use",{type:"select",options:Pf(he.models.data)}),a=await r.prompt("Select a small model to use",{type:"select",options:Pf(he.models.data)}));let s=Zm({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 jf(e){return e._t2?"cli_arg":_.env.GH_TOKEN?"env_var":"stored"}function Df(e){let{options:t,version:r,runtime:o,_u1:n}=e,a=Ne.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:yt({config:Qm(t,{version:r,_t3:jf(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()-If},"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()-If},"copilot_api"))}async function Lf(e,t){try{return await async function(e){return"foundry"===e.provider?(he.foundry=so(process.env),he.connectivity.h2=!1,he.connectivity.h2Keepalive=!1,"entra"===he.foundry.auth&&await Qr(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 Vm(e):void 0)??"foundry"}):Xm(e)}(e)}catch(r){throw await vf(r,{version:t,provider:e.provider,accountType:e.accountType,_t3:jf(e)}),r}}async function Bf(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 $f(e)){let e=await Sf(xf),t=await Sf(Tf);if(e&&t)return{cert:e,key:t,certPath:xf,keyPath:Tf,generated:!1}}return r.info("Generating new self-signed TLS certificate…"),Of(e)}(e.httpsHosts)}}async function Ff(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:o}=ya;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(qf(),Cf.push(()=>{r.debug("Cleaning up connectivity monitor"),kt.stop()},()=>{r.debug("Cleaning up token management"),r.debug("Cleaning up token management"),An=!1,wn&&=void clearInterval(wn),vn&&=void kt.off("online",vn),kn&&=void kt.off("offline",kn),bn=void 0,xn=void 0},async()=>{r.debug("Cleaning up HTTP/2 client"),await async function(){r.debug("Stopping HTTP/2 pool"),Zi&&=void clearInterval(Zi),Qi&&=void clearInterval(Qi);let e=[...Yi.keys(),...Vi];Yi.clear(),Vi.clear(),Wi.clear(),Xi=void 0;for(let t of e)es(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(),Ym().catch(()=>{}),yn();let o=await er();Rf=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,If);let a=await Lf(t,o);await async function(){try{return await gn({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(()=>{gn().then(()=>{r.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{gn().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)}}();Cf.push(()=>{r.debug("Cleaning up model refresh interval"),i()}),he.connectivity.h2&&(os(rs(Ot(he))),he.connectivity.h2Keepalive&&as()),Df({options:t,version:o,runtime:n,_u1:a});let s=await Bf(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await Nf(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=Mf(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:Mf(he.models.data)});let a=Zm({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=[...ff(e),...hf(e),...gf(e),...yf(),"",...mf(Gm()),..._f(e),...wf(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 aa()}:void 0}}({options:t,version:o,runtime:n,user:a.login,clipboardCopied:u,tls:s})),Mm(),Z({fetch:lm.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 um({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: ${Ea(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 Uf(e,t){let r=Number.parseInt(e,10);if(Number.isNaN(r))throw Error(`${t} must be a number, got: "${e}"`);return r}const Hf=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:Uf(t,"--rate-limit"),n=e.timeout,a=void 0===n?fe:Uf(n,"--timeout"),i=function(e,t){let r=e??t,o=void 0===r?15e3:Uf(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(!wp(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${_p.join(", ")}`);let n=o.length>0?o:_p,a=new Set,i=o.length>0,s=[];for(let e of n){if(!wp(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}),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 Ff({provider:f,fallback:zo(e.fallback,_.env.COPILOT_API_FALLBACK,f),port:Uf(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: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})}});Am||(Am=!0,r.setReporters([Tm(r.options.reporters)]));const zf=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(Rm||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;qm=e,Rm=Pm(e).catch(()=>null)})(),zf||Mm();const Jf=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Ln,start:Hf,"check-usage":ea,debug:nr,doctor:xm,"cowork-setup":Sa}});await t(Jf),zf||(qm?.abort(),qm=void 0,Rm=void 0);export{};