copilot-api-node20 0.45.1 → 0.46.0-preview.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.mjs +1 -1
- 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 o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{AsyncLocalStorage as l}from"node:async_hooks";import{ROOT_CONTEXT as c,SpanKind as u,SpanStatusCode as p,context as d,metrics as m,trace as f}from"@opentelemetry/api";import h from"clipboardy";import{execFile as g,execSync as _}from"node:child_process";import y from"node:process";import{SeverityNumber as w,logs as b}from"@opentelemetry/api-logs";import{OTLPLogExporter as k}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as v}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 $}from"@opentelemetry/sdk-metrics";import{NodeSDK as S}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{createHash as N,randomBytes as P,randomUUID as q}from"node:crypto";import{promisify as D,stripVTControlCharacters as j}from"node:util";import{Context as M,Hono as F}from"hono";import{cors as U}from"hono/cors";import{getHeapStatistics as H}from"node:v8";import{streamSSE as B}from"hono/streaming";import{events as L}from"fetch-event-stream";import{Tokenizer as z,models as J}from"ai-tokenizer";import*as G from"ai-tokenizer/encoding/claude";import K,{accessSync as W}from"node:fs";import{serve as Y}from"srvx";import{isIP as V}from"node:net";import{generate as X}from"selfsigned";const Z=s.join(i.homedir(),".local","share","copilot-api"),Q={APP_DIR:Z,GITHUB_TOKEN_PATH:s.join(Z,"github_token"),MACHINE_ID_PATH:s.join(Z,"machine_id"),SESSION_ID_PATH:s.join(Z,"session_id")};async function ee(){await a.mkdir(Q.APP_DIR,{recursive:!0}),await te(Q.GITHUB_TOKEN_PATH),await te(Q.SESSION_ID_PATH)}async function te(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const oe=new l;function ne(e,t){return oe.run(e,t)}const re=()=>!0===oe.getStore()?.rerun,ae=()=>!0===oe.getStore()?.inStream,ie=new l;let se;const le=()=>void 0!==ie.getStore(),ce=()=>ie.getStore();function ue(){let e=ie.getStore();e&&(e.start??=performance.now(),se?.(e))}const pe=6e5,de={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:pe,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}};function me(e){let[t="",o=""]=e.trim().split(/\s+/,2),n=o&&"undefined"!==o&&"null"!==o?/^(?:ghu|gho|ghp|ghs|ghr|github_pat)_/.exec(o)?.[0]??"opaque":"missing";return`${t.toLowerCase()} ${n}`}!function(e){let t=e.provider,o=e.models;Object.defineProperties(e,{provider:{get:()=>oe.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=oe.getStore();return e?e.models:o},set:e=>{o=e},enumerable:!0,configurable:!0}})}(de);const fe=" │ ",he=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()},ge=(e,t)=>e.padEnd(t),_e=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ye=(e,t,o)=>` --\x3e ${ge(e,4)} ${ge(t,21)} ${ge(o,3)}`,we=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return ge(t,22)})(e.model??"—")+ge(t,8)},be=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?he(Math.max(t-o,0)):"—",r=e?he(e.outputTokens??0):"—",a=o?he(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},ke=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${ge("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=he(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},ve=e=>{if(void 0===e.ttfbMs)return`e2e ${_e(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${_e(e.ttfbMs)} → e2e ${_e(e.e2eMs)} ${t}`},xe=e=>e?de.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,Te=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}}),Ae={completionCallbacks:new Map,registerCompletion(e,t,o){this.completionCallbacks.set(e,{context:t,startTime:o,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(e){let{context:t,startTime:n}=e,r=Math.round(performance.now()-n),a=t.get("requestData"),i=a?.upstreamTotalMs??a?._d1,s=(e=>[ye(e.method,e.path,e.status),we(e),be(e.tokenUsage),ke(e.tokenUsage,e.maxContextTokens),ve({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(fe))({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:xe(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),ut(w.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:o,duration:n,upstreamTotal:r}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":n,...o?.model&&{"copilot_api.model":o.model},...o?.reasoningEffort&&{"copilot_api.reasoning_effort":o.reasoningEffort},...o?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==o?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(o.upstreamTtfbMs)},...void 0!==r&&{"copilot_api.upstream_total_ms":Math.round(r),"copilot_api.copilot_duration_ms":Math.round(r)},...Te(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),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=n.get("requestData");o.error((e=>[ye(e.method,e.path,"429"),we(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${_e(e.e2eMs)}`].join(fe))({method:n.req.method,path:n.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},logError(e,t,n){let{context:r,startTime:a}=e,i=Math.round(performance.now()-a),s=r.get("requestData");o.error((e=>{let t=ye(e.method,e.path,e.status.toString()),o=we(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${_e(e.e2eMs)}`].join(fe)})({method:r.req.method,path:r.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:n,e2eMs:i}))},cleanup(){let e=performance.now()-12e5;for(let[t,o]of this.completionCallbacks)o.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(()=>Ae.cleanup(),6e4);let $e,Se,Ee=Date.now();const Oe={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function Ce(){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):Oe;return{endpoint:e.replace(/\/$/,""),headers:t}}async function Ie(){if(!$e)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([$e.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}const Re=f.getTracer("copilot-api"),Ne=m.getMeter("copilot-api"),Pe=b.getLogger("copilot-api"),qe=Ne.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),De=Ne.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),je=Ne.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Me=Ne.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),Fe=Ne.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Ue=Ne.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),He=Ne.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Be=Ne.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Le=Ne.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),ze=Ne.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Je=Ne.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Ge=Ne.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Ke=Ne.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),We=Ne.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Ye=Ne.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ve=Ne.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Xe=Ne.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Ze=Ne.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Qe=Ne.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),et=Ne.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),tt=Ne.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),ot=Ne.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),nt=Ne.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),rt=Ne.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),at=Ne.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),it=Ne.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),st=Ne.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),lt=Ne.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),ct=Ne.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function ut(e,t,o,n,r){let a=f.getActiveSpan()?.spanContext()??r;Pe.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function pt(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:p.ERROR,message:o??n.message}),e.recordException(n)}function dt(e,t,o){pt(e,o),t&&t!==e&&pt(t,o)}function mt(e,t=""){let o={};if(null==e)return o;if("object"!=typeof e)return("string"==typeof e||"number"==typeof e||"boolean"==typeof e)&&t&&(o[t]=e),o;if(Array.isArray(e))return t&&(o[t]=JSON.stringify(e)),o;for(let[n,r]of Object.entries(e)){let e=t?`${t}.${n}`:n;void 0!==r&&"function"!=typeof r&&(null===r?o[e]="null":"object"!=typeof r||Array.isArray(r)?Array.isArray(r)?o[e]=JSON.stringify(r):("string"==typeof r||"number"==typeof r||"boolean"==typeof r)&&(o[e]=r):Object.assign(o,mt(r,e)))}return o}Ne.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!yt.getConnectivityStats().isOnline)}),Ne.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(yt.getConnectivityStats().consecutiveFailures)}),Ne.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(de.models?.data.length??0)}),Ne.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(Ae.completionCallbacks.size)}),Ne.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-Ee)/1e3)});const ft=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function ht(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();"authorization"===o&&e.setAttribute(`http.${t}.header.authorization.shape`,me(r)),ft.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function gt(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:l}=e,c=Re.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...l}});a&&ht(c,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return c.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();ft.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(c,e),Ke.add(1,{target:n,status_code:String(e.status)}),e.ok||c.setStatus({code:p.ERROR,message:`HTTP ${e.status}`}),{response:e,span:c}}catch(e){throw pt(c,e),c.end(),e}}async function _t(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,extraAttributes:d,dispatcher:m}=e,f=Re.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});ht(f,"request",a);try{let{statusCode:e,headers:t,body:u}=await R(o,{method:r,headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!ft.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Ke.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:p.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:u,span:f}}catch(e){throw pt(f,e),f.end(),e}}const yt=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(){o.debug("Starting connectivity monitor",{probeEndpoints:de.connectivity.probeEndpoints,fastInterval:de.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){o.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?de.connectivity.slowProbeInterval:de.connectivity.fastProbeInterval)+Math.random()*de.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=Re.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),de.connectivity.timeoutMs);try{let n=!1;for(let e of de.connectivity.probeEndpoints)try{let t=performance.now(),o=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...de.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,at.record(r,{endpoint:e,result:"success"});break}at.record(r,{endpoint:e,result:"failed"})}catch(t){this.endpointFailureStats[e]=(this.endpointFailureStats[e]||0)+1,o.debug(`Probe failed for ${e}:`,t)}this.updateConnectivityState(n);let r=n?"online":"offline";e.setAttribute("copilot_api.connectivity.result",r),e.setAttribute("copilot_api.connectivity.consecutive_failures",this.consecutiveFailures),this.lastSuccessfulEndpoint&&e.setAttribute("copilot_api.connectivity.successful_endpoint",this.lastSuccessfulEndpoint),Je.add(1,{result:n?"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&&o.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),Ge.add(1,{from:"offline",to:"online"}),ut(w.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(o.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),Ge.add(1,{from:"online",to:"offline"}),ut(w.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,o.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?de.connectivity.slowProbeInterval:de.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*de.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:de.connectivity.jitterMaxMs>0,connectionPooling:de.connectivity.connectionPooling,dnsCache:de.connectivity.dnsCache}}},wt=()=>({"content-type":"application/json",accept:"application/json"}),bt="0.48.1",kt=`copilot-chat/${bt}`,vt=`GitHubCopilotChat/${bt}`,xt=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`${Q.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=N("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(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},Tt=async(e,t)=>{e.machineId||=await xt(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(Q.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=q();return await a.writeFile(Q.SESSION_ID_PATH,e),await a.chmod(Q.SESSION_ID_PATH,384),e})()},At=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,$t=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=q(),n={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":kt,"User-Agent":vt,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":q(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},St=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const Et=(e,t,o)=>{let n=$t(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,a=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&St.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(","))r.add(e);if(o)for(let e of o)r.add(e);return r.size>0&&(n["anthropic-beta"]=[...r].join(",")),n},Ot="https://api.github.com",Ct=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":kt,"user-agent":vt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),It="https://github.com",Rt="01ab8ac9400c4e429b23",Nt=new WeakMap;function Pt(e){let t=e.req.raw,o=Nt.get(t);if(!o){let e=new AbortController;t.signal.aborted?e.abort(t.signal.reason):t.signal.addEventListener("abort",()=>e.abort(t.signal.reason),{once:!0}),Nt.set(t,e),o=e}return o}const qt=e=>Pt(e).signal;function Dt(e){Pt(e).abort()}function jt(e){return!!Pt(e).signal.aborted&&(e.get("requestSpan")?.setAttribute("copilot_api.client_aborted",!0),!0)}function Mt(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/images/")?"images":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const Ft=32768,Ut=[{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: ***"}],Ht=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Bt(e){let t=e;for(let{regex:e,mask:o}of Ut)t=t.replace(e,o);return t}const Lt=/[\w.%+#!$&*=?^~\x27-]+@[\w-]+(?:\.[\w-]+)+/g;function zt(e){return Bt(e).replaceAll(Lt,"<redacted-email>")}const Jt=new Map;function Gt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function Kt(e,t,o){let n=Bt(o),r=8*Ft,a=n.length>r,i=a?n.slice(0,r):n,s=N("sha256").update(n).digest("hex");if(i.length<=Ft)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=Ft)e.setAttribute(`${t}.part_${o/Ft}`,i.slice(o,o+Ft));e.setAttribute(`${t}.parts`,Math.ceil(i.length/Ft))}e.setAttribute(`${t}.bytes`,n.length),e.setAttribute(`${t}.sha256`,s),a&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,n.length-i.length))}function Wt(e,t){let o=function(e){if(Jt.size>=1e3&&!Jt.has(e)){let e=Jt.keys().next().value;void 0!==e&&Jt.delete(e)}let t,o=(Jt.get(e)??0)+1;return Jt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Ze.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",o),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===o)return{decision:o};if("suppressed"===o)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:o};let n=t.c.get("rawBody");n&&Kt(e,"copilot_api.incoming_request_body",n);let r=Yt(t.c.req.header());return r&&Kt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&Kt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Kt(e,"copilot_api.outgoing_headers",Yt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Kt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function Yt(e){let t={};for(let[o,n]of Object.entries(e))Ht.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Vt(){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 Xt(){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 Zt(){try{return!!(await a.stat(Q.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(Q.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Qt(e){let t=await async function(){let[e,t]=await Promise.all([Vt(),Zt()]);return{version:e,runtime:Xt(),paths:{APP_DIR:Q.APP_DIR,GITHUB_TOKEN_PATH:Q.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.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 eo=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})=>Qt({json:e.json})}),to=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",oo=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",no=new Set;let ro;function ao(e){if(de.errorReporting&&!(e.statusCode<500)&&!no.has(e.signature)){if(no.size>=1e3){let e=no.values().next().value;void 0!==e&&no.delete(e)}no.add(e.signature),async function(e){ro??=Vt();let t=await ro,o=Xt(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(zt(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:Mt(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(to,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":oo},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function io(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 so=new WeakSet;async function lo(e,{attempt:t,maxRetries:n,operation:r}){return!le()&&(io(e)&&t<n?(o.warn(`HTTP/2 connection error during ${r}, 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&&so.add(e)}(e),!1))}var co=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},uo=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function po(e,t){return setTimeout(()=>e.abort(new uo(t)),t)}function mo(e){return e instanceof uo||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof uo}const fo=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),ho=RegExp(`\\b(?:${[...fo].join("|")})\\b`);function go(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function _o(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=go(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function yo(e){let t=e.code;return"string"==typeof t?t:void 0}function wo(e){if(void 0===e.cause)return"";let t=_o(e);if(t===e)return"";let o=yo(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function bo(e){if(!(e instanceof Error))return!1;let{codes:t,messages:o}=function(e){let t=[],o=[],n=new Set,r=(e,a)=>{if(a>4||!(e instanceof Error)||n.has(e))return;n.add(e);let{code:i,errors:s,cause:l}=e;if("string"==typeof i&&t.push(i),o.push(e.message),Array.isArray(s))for(let e of s)r(e,a+1);r(l,a+1)};return r(e,0),{codes:t,messages:o}}(e);return!!t.some(e=>fo.has(e))||!(t.length>0)&&(!!o.some(e=>ho.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function ko(e){return e.req.path.startsWith("/v1/messages")}function vo(e,t){if(ko(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}const xo=/maximum context length|exceeds the context window/i;function To(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type?o.type=t.type:"string"==typeof t.code&&(o.type=t.code),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function Ao(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",zt(t.message)))}function $o(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=zt(e.message)),t}function So(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=f.getActiveSpan();if(!a)return;let i=Gt({endpointType:Mt(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});Wt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function Eo(e,t,o){let n=e.get("requestId"),r=Ae.completionCallbacks.get(n);r&&(Ae.logError(r,t,o),Ae.completionCallbacks.delete(n))}async function Oo(e,t){let o=f.getActiveSpan(),n=e.get("requestId"),r=Ae.completionCallbacks.get(n);r&&(Ae.logRateLimit(r,t.response),Ae.completionCallbacks.delete(n)),Ue.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=vo(a,e),s=To(i);return o?.setStatus({code:p.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),Ao(o,s),ut(w.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...$o(s)}),So({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,o)=>{Co.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const Co=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;async function Io(e,t){let o=f.getActiveSpan(),n=await t.response.text(),r=vo(n,e),a=To(r);Eo(e,t.response.status,a.message??t.message),o?.setStatus({code:p.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),Ao(o,a),ut(w.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...$o(a)}),So({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&ao({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Gt({endpointType:Mt(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=ko(e)?function(e){let t;try{let o=JSON.parse(e);t=o.error&&"object"==typeof o.error?o.error:o}catch{return}let o="string"==typeof t.message?t.message:"";if("context_length_exceeded"!==t.code&&"context_length_exceeded"!==t.type&&!xo.test(o))return;let n=/maximum context length is (\d+)/i.exec(o)?.[1],r=/(?:resulted in|requested) (\d+) tokens/i.exec(o)?.[1];return{type:"error",error:{type:"invalid_request_error",message:n&&r?`prompt is too long: ${r} tokens > ${n} maximum`:`prompt is too long: ${o||"context_length_exceeded"}`}}}(n):void 0;return i?e.json(i,400):e.json(r,t.response.status)}function Ro(e,t){(function(e){return"object"==typeof e&&!!e&&so.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",de.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function No(e){return bo(e)||function(e){return io(e)||e instanceof Error&&io(e.cause)}(e)}async function Po(e,t){return jt(e)?(Ae.completionCallbacks.delete(e.get("requestId")),new Response(null,{status:499})):async function(e,t){if(Ro(f.getActiveSpan(),t),t instanceof co&&429===t.response.status)return Oo(e,t);if(t instanceof SyntaxError){f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),ut(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 o=ko(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 Eo(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof co)return Io(e,t);if(mo(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Upstream request timed out"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","request_timeout");let n="Upstream request timed out (gateway timeout). Increase the timeout or retry.";ut(w.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=ko(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return Eo(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(No(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?_o(t):void 0,r=(n&&yo(n))??"none",a=n?.message??String(t);o?.setAttribute("copilot_api.transport_cause_code",r),o?.setAttribute("copilot_api.transport_cause_message",a);let i="Temporary upstream connection failure. Please retry.";ut(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":r,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=ko(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return Eo(e,503,t instanceof Error?`${t.message}${wo(t)}`:i),e.json(s,503)}(e,t);let n=f.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:p.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),ut(w.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),ao({route:e.req.path,statusCode:500,errorClass:r.name,signature:Gt({endpointType:Mt(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${wo(r)}`}),Eo(e,500,r.message),o.error(r);let a=ko(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}(e,t)}const qo=async()=>{let e=`${Ot}/copilot_internal/v2/token`,t=de.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await gt({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:Ct(de),signal:o.signal});try{if(!t.ok)throw new co("Failed to get Service token",t);return await t.json()}catch(e){throw pt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function Do(){let e=`${Ot}/user`,t=de.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await gt({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${de._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new co("Failed to get GitHub user",t);return await t.json()}catch(e){throw pt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}const jo=3e5,Mo=12e4;let Fo,Uo,Ho,Bo=null,Lo=0;function zo(e){Ho&&clearTimeout(Ho),Ho=setTimeout(()=>{Ko("scheduled").catch(e=>{o.warn("Foundry Entra token renewal failed; retrying:",e),zo(3e4)})},e),Ho.unref()}async function Jo(e){let t=Uo;if(!Fo||!t?.tokenScope)throw Error("Foundry Entra auth is not initialised");let o=Re.startSpan("copilot_api.foundry.entra_token",{kind:u.INTERNAL,attributes:{"copilot_api.foundry.token.trigger":e}},"upstream_401"===e?d.active():c);try{let e=await async function(e,t){let o=AbortSignal.timeout(Mo),n=new Promise((e,t)=>{o.addEventListener("abort",()=>{t(Error("Entra token request timed out after 120s"))},{once:!0})});return Promise.race([e.getToken(t,{abortSignal:o}),n])}(Fo,t.tokenScope);if(!e)throw Error(`No Entra token for scope ${t.tokenScope}`);o.setAttribute("copilot_api.foundry.token.expires_in_s",Math.round((e.expiresOnTimestamp-Date.now())/1e3)),t.bearerToken=e.token,t.bearerExpiresAt=e.expiresOnTimestamp,Lo=Date.now(),zo(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-jo;return Math.max(t-Date.now(),3e4)}(e))}catch(e){throw pt(o,function(e){let t=e instanceof Error?e:Error(String(e)),o=j(t.message),n=`… (truncated from ${o.length} chars)`,r=Error(o.length>2e3?o.slice(0,2e3-n.length)+n:o);return r.name=t.name,r}(e)),e}finally{o.end()}}async function Go(e,t){Uo=e,Fo=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await Jo("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 Ko(e="upstream_401"){return Bo??=Jo(e).finally(()=>{Bo=null}),Bo}let Wo=null;async function Yo(e){if("foundry"===de.provider){if("entra"!==de.foundry?.auth)return!1;let t=e?.outgoingHeaders?.Authorization;return async function(e=!1,t){let n=Uo?.bearerToken;if(void 0!==t&&t!==n)return!0;let r=Uo?.bearerExpiresAt,a=void 0!==r&&r-Date.now()>jo;if(e&&a)return!1;if(Date.now()-Lo<3e4)return!0;try{return await Ko(),!0}catch(e){return o.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 Wo||=qo().then(({token:e})=>{de._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{Wo=null}),await Wo,!0}function Vo(e,t="FOUNDRY_ENDPOINT"){let o,n=e.trim();try{o=new URL(n)}catch{throw Error(`${t} is not a valid URL: "${n}"`)}if("https:"!==o.protocol)throw Error(`${t} must use https, got: "${n}"`);let r=o.pathname.replace(/\/+$/,"").replace(/\/(?:openai|_an1)(?:\/v1)?$/i,"");return`${o.origin}${r}`}const Xo=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function Zo(e){let t=new URL(e),o=Xo.exec(t.hostname)?.[1];return o?`https://${o}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function Qo(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,o]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:o||t}});return t.length>0?t:void 0}function en(e){let t=e.FOUNDRY_ENDPOINT,o=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");let n=function(e,t){let o=e?.trim().toLowerCase();if(!o)return t?"key":"entra";if("key"!==o&&"entra"!==o)throw Error(`FOUNDRY_AUTH must be "key" or "entra", got: "${o}"`);if("key"===o&&!t)throw Error("FOUNDRY_AUTH=key requires FOUNDRY_API_KEY");return o}(e.FOUNDRY_AUTH,o),r=Vo(t),a=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:r,anthropicEndpoint:a?Vo(a,"FOUNDRY_ANTHROPIC_ENDPOINT"):Zo(r),auth:n,..."key"===n?{apiKey:o}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:Qo(e.FOUNDRY_DEPLOYMENTS)}}const tn=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},on=e=>({...tn(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),nn=e=>`${e.anthropicEndpoint}/anthropic`,rn=(e,t)=>({...tn(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),an=e=>"foundry"===e.provider;function sn(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const ln=e=>an(e)?(e=>`${e.endpoint}/openai/v1`)(sn(e)):At(e),cn=(e,t=!1)=>an(e)?on(sn(e)):$t(e,t),un=e=>an(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const pn=[{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}],dn={context:128e3,output:16384};function mn(e){return pn.find(({pattern:t})=>t.test(e))??dn}const fn=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,hn=e=>/^claude/i.test(e),gn=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function _n(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 yn(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=po(o,de.timeoutMs);try{let{response:n,span:r}=await gt({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:on(e),signal:o.signal});try{if(!n.ok)throw new co("Failed to list Foundry deployments",n);let e=(await n.json()).data.filter(e=>!e.status||"succeeded"===e.status).map(e=>({id:e.id,model:e.model}));return r.setAttribute("copilot_api.models_count",e.length),e}catch(e){throw pt(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function wn(e){return{object:"list",data:(e.deployments??await yn(e)).map(e=>function(e){let{model:t}=e;if(!fn.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:{}}}:hn(t)?_n(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):gn(t)?_n(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:mn(t)}):_n(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:mn(t)})}(e)).filter(e=>void 0!==e)}}const bn=()=>an(de)&&de.foundry?wn(de.foundry):vn(),kn=async()=>{try{return await bn()}catch(e){if(e instanceof co&&401===e.response.status){if(!await Yo(e))throw e;return bn()}throw e}},vn=async()=>{let e=`${ln(de)}/models`,t=cn(de),o=de.timeoutMs,n=new AbortController,r=po(n,o);try{let{response:o,span:r}=await gt({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new co("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw pt(r,e),e}finally{r.end()}}finally{clearTimeout(r)}},xn=e=>"embeddings"!==e.capabilities.type&&"image"!==e.capabilities.type,Tn=e=>xn(e)&&(e.supported_endpoints?.includes("/responses")??!0);const An=[{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"}],$n="claude-haiku-4.5",Sn={haiku:$n,"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 En=/^claude-/i;function On(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function Cn(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of An)if(t.pattern.test(e))return t.family;return null}(n),i=En.test(n),s=n.replace(/-\d{8}(?::.*)?$/,""),l=r?`-${r}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let o=On(e);for(let e of t)if(On(e.replace(/-\d{8}(?::.*)?$/,""))===o)return e}return a?function(e,t,o=null){let n=Sn[e];if(!n)return null;if(o){let e=`${n}-${o}`;if(t.includes(e))return e}if(t.includes(n))return n;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let n=o?`${e}-${o}`:e;if(t.includes(n))return n}return null}(a,t,r):null}const In=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Rn(e,t){if(!e||!t||0===t.length)return null;let o=function(e){return"max"===e?"xhigh":e}(e);if(t.includes(o))return o;let n=In.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=In.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}const Nn={messages:xn,responses:Tn,chat:e=>xn(e)&&(e.supported_endpoints?.some(e=>"/chat/completions"===e||"/responses"===e)??!0)};let Pn;const qn=new Map,Dn=new Map;function jn(e,t,o){let n=(e??t??"").trim().toLowerCase();if(""!==n&&"none"!==n){if("copilot"!==n)throw Error(`--fallback must be "copilot", got: "${n}"`);if("foundry"!==o)throw Error("--fallback copilot requires --provider foundry");return n}}async function Mn(){Pn=await ne({provider:"copilot"},kn)}const Fn=()=>void 0!==Pn;function Un(e,t=Date.now()){let o=qn.get(e);return void 0!==o&&(t<o||(qn.delete(e),!1))}function Hn(e,t=Date.now()){return{id:Dn.get(e)?.id??0,lapsed:!Un(e,t)}}function Bn(e,t,o={}){let n=o.now??Date.now(),r=o.sent??Hn(e,n),a=Dn.get(e)??{id:0,appliedMs:0},i=Math.max(function(e,t=Date.now()){let o=e.get("retry-after-ms");if(null!==o&&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 o=Date.parse(n);if(!Number.isNaN(o))return Math.max(0,o-t)}return 1e4}(t,n),5e3),s=r.lapsed?r.id+1:r.id;if(s>a.id){let t=Math.min(2*a.appliedMs,6e4);i=Math.max(i,t),Dn.set(e,{id:s,appliedMs:i})}else s===a.id&&a.appliedMs>0&&i>a.appliedMs&&Dn.set(e,{id:a.id,appliedMs:i});let l=Math.max(qn.get(e)??0,n+i);return qn.set(e,l),l-n}function Ln(e,t){let o=Dn.get(e);o&&t.lapsed&&t.id===o.id&&Dn.set(e,{id:o.id,appliedMs:0})}function zn(e){if(!Fn()||!an(de)||!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 Jn=new Set([429,408,500,502,503,504]);function Gn(e,t){let o=po(e,t),n=le()||ae()?po(e,9e4):void 0;return{headersArrived:()=>clearTimeout(n),clear:()=>{clearTimeout(o),clearTimeout(n)}}}function Kn(e,t){if(e instanceof co){let{status:t}=e.response;return Jn.has(t)&&void 0!==e.outgoingBody?`foundry_${t}`:void 0}if(t){if(mo(e))return"foundry_timeout";if(No(e))return"foundry_transport"}}const Wn={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 Yn(e,t,n){let r=Wn[t]??`returned ${t.slice(8)} for`;o.info(`Foundry ${r} ${e}; serving it from Copilot for ${Math.ceil(n/1e3)}s`)}function Vn(e,t,o){let{model:n,reason:r}=o,a=f.getActiveSpan();return a?.setAttribute("copilot_api.fallback.upstream","copilot"),a?.setAttribute("copilot_api.fallback.reason",r),a?.setAttribute("copilot_api.fallback.foundry_model",n),ne({provider:"copilot",models:Pn,rerun:"breaker_open"!==r,inStream:o.inStream},()=>t(e))}const Xn=()=>ce();!function(e){se=e}(e=>{let t=e;t.sent=Hn(t.model)});const Zn=new WeakMap;async function Qn(e,t,o){let n=t instanceof co?t.response:void 0,r=Bn(e,n?.headers??new Headers,{sent:o});return await(n?.body?.cancel()),r}function er(e,t,o){let{windowMs:n,attemptStart:r}=o,a=f.getActiveSpan();a?.setAttribute("copilot_api.fallback.retry_after_ms",n),void 0!==r&&a?.setAttribute("copilot_api.fallback.foundry_attempt_ms",Math.round(performance.now()-r)),Yn(e,t,n)}function tr(e){let t=ce();return void 0!==t&&Zn.has(t)&&!jt(e)}function or(){let e=ce(),t=e&&Zn.get(e);t&&(t.deferReset=!0)}function nr(){let e=Xn();e?.sent&&Zn.has(e)&&Ln(e.model,e.sent)}async function rr(e,t,o){let n=Xn(),r=n&&Zn.get(n);if(!n||!r)throw Error("Not in a Foundry attempt the fallback stands behind");Zn.delete(n);let{model:a}=n;return er(a,t,{windowMs:await Qn(a,o,n.sent??Hn(a)),attemptStart:n.start}),function(e){return ie.exit(e)}(()=>Vn(e,r.handler,{model:a,reason:t,inStream:!0}))}async function ar(e,t,o){if(!Fn()||!an(de))return o(e);let n=await async function(e){try{let t=await e.req.json();return"string"==typeof t.model?t.model:void 0}catch{return}}(e);if(!n||!function(e,t){let o=Pn?.data??[],n=o.map(e=>e.id),r=n.includes(e)?e:Cn(e,n),a=o.find(e=>e.id===r);return a&&Nn[t](a)?a.id:void 0}(n,t))return o(e);if(Un(n))return Vn(e,o,{model:n,reason:"breaker_open"});let r=Hn(n),a={model:n};Zn.set(a,{handler:o});try{let t=await function(e,t){return ie.run(e,t)}(a,()=>o(e)),r=a.sent,i=!0===Zn.get(a)?.deferReset;return t.ok&&r&&!i&&Ln(n,r),t}catch(t){let i=a.sent,s=Kn(t,void 0!==i);if(!s||(er(n,s,{windowMs:await Qn(n,t,i??r),attemptStart:a.start}),jt(e)))throw t;return Vn(e,o,{model:n,reason:s})}}const ir=e=>new Promise(t=>{setTimeout(t,e)}),sr=e=>null==e;async function lr({refreshFallback:e=!0}={}){let t=await kn();de.models=t,e&&Fn()&&await Mn().catch(e=>{o.warn("Failed to refresh the Copilot fallback models:",e)})}const cr=()=>{de._v1="1.140.0-insider"};var ur=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let pr,dr,mr,fr,hr,gr=!1,_r=!1,yr=!1;function wr(){return br()?hr:void 0}function br(){return void 0!==hr&&Date.now()-hr.at<6e4}function kr(){return yr?"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 vr=()=>a.readFile(Q.GITHUB_TOKEN_PATH,"utf8");function xr(e){let{span:t,error:n,reason:r,refreshStart:a,attempt:i}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";de._t1=void 0,hr={status:s,message:l,at:Date.now()},clearInterval(pr),pr=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Le.add(1,{reason:r,success:"false"}),ze.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:p.ERROR,message:n.message}),t.recordException(n),rt.record(performance.now()-a,{reason:r}),ut(w.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":i,"copilot_api.token_refresh.terminal_status":s})}function Tr(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;de._t1=void 0,o.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=n instanceof Error?n:Error(String(n));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:p.ERROR,message:s.message}),t.recordException(s),ze.add(1,{reason:r}),rt.record(performance.now()-a,{reason:r}),ut(w.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Ar=async(e=5,t=1e3,n="scheduled")=>gr?(o.debug("Token refresh already in progress, coalescing"),dr):(gr=!0,dr=Re.startActiveSpan("copilot_api.token.refresh",async r=>{let a=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let i=1;i<=e;i++)try{r.setAttribute("copilot_api.token_refresh.attempt",i),o.debug(`Refreshing Service token (${n}, attempt ${i}/${e})`);let{token:t,refresh_in:s}=await qo();return de._t1=t,hr=void 0,_r&&void 0===pr&&(o.info("Token refresh recovered, resuming scheduled refresh"),Sr(s)),o.debug("Service token refreshed successfully"),de.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Le.add(1,{reason:n,success:"true"}),rt.record(performance.now()-a,{reason:n}),void ut(w.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof co&&(401===s.response.status||403===s.response.status))return void xr({span:r,error:s,reason:n,refreshStart:a,attempt:i});let l=i===e;if(o.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),Le.add(1,{reason:n,success:"false"}),l)return void Tr({span:r,error:s,reason:n,refreshStart:a,maxRetries:e});let c=t*2**(i-1);o.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),gr=!1,dr=void 0}}),dr);async function $r(){return!!de._t1||!br()&&(void 0!==hr&&yr&&await async function(){if(dr)return;let e=(await vr().catch(()=>{}))?.trim();e&&e!==de._t2?.trim()&&(de._t2=e,o.info("Picked up re-authenticated Auth token from disk"),de.showToken&&o.info("Auth token:",e))}(),await Ar(3,250,"on-demand"),!!de._t1)}function Sr(e){pr&&clearInterval(pr);let t=Math.max(1e3*(e-60),6e4);pr=setInterval(()=>{Ar(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Er(e){try{let t=await vr();if(t&&!e?.force)return de._t2=t,yr=!0,de.showToken&&o.info("Auth token:",t),void await Or();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=de.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${It}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:Rt,scope:"user:email"}),signal:e.signal});if(!t.ok)throw new co("Failed to get device code",t);return await t.json()}finally{clearTimeout(o)}}();o.debug("Device code response:",n),o.info(`Please enter the code "${n.user_code}" at ${n.verification_uri}`);try{h.writeSync(n.user_code),o.success("Code copied to clipboard — opening browser...")}catch{o.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,o=y.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",g(t,[e],()=>{})}catch{}}(n.verification_uri);let r=await async function(e){let t=1e3*(e.interval+1);o.debug(`Polling access token with interval of ${t}ms`),o.start("Waiting for authorization...");let n=Date.now(),r=1e3*e.expires_in;for(;;){if(Date.now()-n>=r)throw new ur("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=de.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${It}/login/oauth/access_token`,{method:"POST",headers:wt(),body:JSON.stringify({client_id:Rt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await ir(t),o.error("Failed to poll access token:",await n.text());continue}let r=await n.json();if(o.debug("Polling access token response:",r),r.error){if("expired_token"===r.error)throw new ur("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new ur("Authorization was denied. Please run the command again and approve the request.");"authorization_pending"!==r.error&&"slow_down"!==r.error&&o.warn(`Unexpected auth error: ${r.error}`),await ir(t);continue}if(r.access_token)return r.access_token;await ir(t)}catch(e){if(e instanceof ur)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await ir(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(Q.GITHUB_TOKEN_PATH,e,{mode:384}))(r),de._t2=r,yr=!0,de.showToken&&o.info("Auth token:",r),await Or()}catch(e){throw e instanceof co?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Or(){let e=await Do();o.success(`Authenticated as ${e.login}`)}async function Cr(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),de.showToken=e.showToken,await ee(),await Er({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 Ir=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})=>Cr({verbose:e.verbose,showToken:e["show-token"]})}),Rr=.01,Nr=864e5,Pr=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),qr=new Intl.NumberFormat("en-US"),Dr=e=>Pr.format(e*Rr),jr=e=>e.credits_used??e.entitlement-e.remaining,Mr=(e,t,o)=>{let n=(e=>{let t=new Date(`${e}T00:00:00Z`);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-1,1))})(t),r=(o.getTime()-n.getTime())/Nr;if(r<.5)return;let a=jr(e),i=a*Rr/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Rr,c=new Date(n.getTime()+l/i*Nr);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Fr=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${qr.format(jr(e))} of ${qr.format(e.entitlement)} used`:"n/a",Ur=e=>e.padEnd(14),Hr=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Ur("AI credits")}unlimited`);else{let e=jr(o),t=o.percent_remaining;n.push(`${Ur("AI credits")}${Dr(e)} / ${Dr(o.entitlement)} ${t.toFixed(1)}% left`,`${Ur("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Ur("")}${qr.format(e)} of ${qr.format(o.entitlement)} credits`)}if(n.push("",`${Ur("Chat")}${Fr(e.quota_snapshots.chat)}`,`${Ur("Completions")}${Fr(e.quota_snapshots.completions)}`,"",`${Ur("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Nr)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=Mr(o,e.quota_reset_date,t);r&&n.push(`${Ur("Burn rate")}~${Pr.format(r.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")(r)}`);let a=o.overage_permitted?"permitted, "+(o.overage_count>0?`${qr.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Ur("Overage")}${a}`)}return n.join("\n")},Br=async()=>{let e=`${Ot}/copilot_internal/user`,t=de.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await gt({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:Ct(de),signal:o.signal});try{if(!t.ok)throw new co("Failed to get usage",t);return await t.json()}catch(e){throw pt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Lr=()=>y.stdout.write("[2J[H"),zr=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Jr=async()=>{let e=await Br();return Hr(e)},Gr=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 ee(),await Er(),!e.watch){try{o.box(await Jr())}catch(e){o.error("Failed to fetch usage:",e),y.exit(1)}y.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?o.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)&&o.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),n=y.stdout.isTTY,r=()=>y.exit(0);for(y.on("SIGINT",r),y.on("SIGTERM",r);;){try{let e=await Jr();n&&Lr(),o.box(e),o.log(zr(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Kr=D(g);async function Wr(){let e="win32"===y.platform?"where.exe":"which";try{return await Kr(e,["tailscale"]),!0}catch{return!1}}async function Yr(){try{let{stdout:e}=await Kr("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Vr(e){return e.replace(/\.$/,"")}async function Xr(){let e=await Yr();if(e?.Online)return Vr(e.DNSName)}const Zr=D(g),Qr=e=>`[1m${e}[0m`,ea=e=>`[2m${e}[0m`,ta=e=>`[36m${e}[0m`,oa=e=>`[32m${e}[0m`,na=e=>`[31m${e}[0m`,ra=e=>`[33m${e}[0m`,aa=ea(" ─────────────────────────────────────────────────────────────"),ia=s.join(Q.APP_DIR,"certs","tailscale"),sa=s.join(ia,"cert.pem"),la=s.join(ia,"key.pem"),ca={certDir:ia,certPath:sa,keyPath:la};function ua(){switch(y.platform){case"darwin":return[` ${ea("Install Tailscale for macOS:")}`,` ${ta("https://tailscale.com/download/mac")}`,` ${ea("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${ea("After installing, open the Tailscale app and sign in.")}`,` ${ea("Then re-run this command.")}`].join("\n");case"linux":return[` ${ea("Install Tailscale for Linux:")}`,` ${ta("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${ta("sudo tailscale up")}`,` ${ea("or")} ${ta("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${ea("Install Tailscale for Windows:")}`,` ${ta("https://tailscale.com/download/windows")}`,"",` ${ea("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${ea("Install Tailscale:")} ${ta("https://tailscale.com/download")}`}}function pa(){let e=[` ${na("Tailscale is not running.")}`];return"darwin"===y.platform?e.push(` ${ea("Open the Tailscale app from Applications and sign in.")}`,` ${ea("Download:")} ${ta("https://tailscale.com/download/mac")}`):"win32"===y.platform?e.push(` ${ea("Open the Tailscale app and sign in.")}`,` ${ea("Download:")} ${ta("https://tailscale.com/download/windows")}`):e.push(` ${ea("Connect with:")} ${ta("sudo tailscale up")}`),e.push("",` ${ea("Then re-run this command.")}`),e.join("\n")}async function da(){try{return await a.access(sa),await a.access(la),!0}catch{return!1}}function ma(e){console.log(""),console.log(aa),console.log(` ${Qr("Claude Cowork Setup")} ${ea("— Diagnostic")}`),console.log(aa),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?oa("✅"):"missing"===n.status?na("❌"):ra("❓");let r=n.detail?ea(` ${n.detail}`):"";t.push(` ${e} ${o}${r}`)}return t}(e))console.log(t);console.log("");let t=Object.values(e).filter(e=>"missing"===e.status);0===t.length?console.log(` ${oa("All checks passed.")}`):console.log(` ${na(`${t.length} issue(s).`)} Run ${ta("copilot-api cowork-setup install")} to fix.`),console.log("")}const fa={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},ha=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Wr();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return ma(e),console.log(""),console.log(ua()),void console.log("");let o=await Yr();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},ma(e),console.log(pa()),void console.log("");let n=Vr(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await da();e["tailscale-cert"]=r?{status:"ok",detail:sa}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),ma(e)}(),y.exit(0)}}),ga=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:fa},async run({args:e}){await async function(e){if(console.log(""),console.log(aa),console.log(` ${Qr("Claude Cowork Setup")} ${ea("— Install")}`),console.log(aa),console.log(""),!await Wr())return console.log(` ${na("Tailscale is not installed.")}`),console.log(""),console.log(ua()),console.log(""),console.log(` ${ea("After installing, run")} ${ta("tailscale up")} ${ea("to connect, then re-run this command.")}`),void console.log("");let t=await Yr();if(!t||!t.Online)return console.log(pa()),void console.log("");let n=Vr(t.DNSName);if(console.log(` ${ea("Tailscale hostname:")} ${Qr(n)}`),console.log(""),console.log(` ${Qr("Generating TLS certificate via Tailscale…")}`),console.log(` ${ea("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${ta(`$ tailscale cert --cert-file ${sa} --key-file ${la} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(ia,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Zr("tailscale",["cert","--cert-file",sa,"--key-file",la,n]),console.log(` ${oa("✓ Certificate generated")}`)}catch(e){let t=e instanceof Error?e.message:String(e);return void o.error(`Failed to generate cert: ${t}`)}console.log(""),console.log(aa),console.log(` ${Qr("Next steps")}`),console.log(aa),console.log(""),console.log(` ${Qr("1.")} Start the proxy:`),console.log(` ${ta("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Qr("2.")} In Cowork ${ea("→")} Settings ${ea("→")} Inference Provider, set:`),console.log(` ${Qr("inferenceGatewayBaseUrl")} = ${ta(`https://${n}:<port>`)}`),console.log(` ${ea("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Qr("3.")} Restart Cowork ${ea("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${ea("For Cowork's own configuration docs, see:")}`),console.log(` ${ta("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),_a=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:fa},async run({args:e}){await async function(e){if(console.log(""),console.log(aa),console.log(` ${Qr("Claude Cowork Setup")} ${ea("— Revert")}`),console.log(aa),console.log(""),await da())if(console.log(` ${Qr("Remove Tailscale cert files:")}`),console.log(` ${ea(sa)}`),console.log(` ${ea(la)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(ia,{recursive:!0}),console.log(` ${oa("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${ea("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.");else console.log(` ${ea("No Tailscale cert found. Nothing to revert.")}`),console.log("")}(e.yes),y.exit(0)}}),ya=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:ha,install:ga,revert:_a}}),wa=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function ba(e){if(!wa.test(e))return e;let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],a=r.match(/^\[[0-9;]*[a-z]/i);t+=a?r.slice(a[0].length):o+r}}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 ka(e){return"string"==typeof e?ba(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=ka(n);!t&&r!==n&&(t=e.slice(0,o)),t?.push(r)}return t??e}(e):e&&"object"==typeof e?function(e){let t,o=Object.entries(e),n="thinking"===e.type;for(let e=0;e<o.length;e++){let[r,a]=o[e],i=!n||"thinking"!==r&&"signature"!==r?ka(a):a;t||i===a&&"__proto__"!==r||(t=va({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=va({},o,o.length),t.properties={}),t??e}(e):e}function va(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const xa="x-copilot-api-self-test",Ta=q();const Aa=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function $a(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==e.capabilities.type&&"image"!==e.capabilities.type&&!function(e){let t=e.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e.id)}(e)&&!function(e){return"disabled"===e.policy?.state}(e)}function Sa(e){let t=2;return Aa.test(e.id)?t=0:"Anthropic"===e.vendor&&(t=1),2*t+ +!e.model_picker_enabled}const Ea=new Set(["model_not_supported","no_available_model_endpoints"]);function Oa(e,t){if(400!==e||!t)return!1;try{let e=JSON.parse(t).error?.code;return"string"==typeof e&&Ea.has(e)}catch{return!1}}let Ca;function Ia(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),a=t.res.status,i=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",a),n.setAttribute("copilot_api.model",i),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),function(e){let{heapUsed:t,rss:o}=process.memoryUsage();Ca??=H().heap_size_limit,e.setAttribute("copilot_api.process.heap_used_bytes",t),e.setAttribute("copilot_api.process.rss_bytes",o),e.setAttribute("copilot_api.process.heap_limit_bytes",Ca),e.setAttribute("copilot_api.process.uptime_s",Math.round(process.uptime()))}(n),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();ft.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:p.ERROR,message:`HTTP ${a}`})}function Ra(e){try{Ia(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:a,requestId:i}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:a};if(qe.add(1,d),Qe.record(s,d),c>=400&&De.add(1,{method:n,path:r,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&&(je.add(e.inputTokens,t),it.record(e.inputTokens,t)),e.outputTokens&&(Me.add(e.outputTokens,t),st.record(e.outputTokens,t)),e.cachedTokens&&Fe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&Ae.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}Ae.completionCallbacks.delete(e.requestId)}const Na=e=>e.includes("/images/edits")?104857600:33554432,Pa=async()=>{if(!re())return Re.startActiveSpan("copilot_api.approval.await",async e=>{let t=performance.now();try{let n=await o.prompt("Accept incoming request?",{type:"confirm"}),r=performance.now()-t;if(e.setAttribute("copilot_api.approval.wait_duration_ms",r),ct.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Ye.add(1,{result:"rejected"}),new co("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Ye.add(1,{result:"approved"})}finally{e.end()}})};async function qa(e){if(un(de)||await $r())return null;let t=wr();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${kr()}`,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 Da(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function ja(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 o=e.prompt_tokens_details?.cached_tokens;return void 0!==o&&(t["copilot_api.cached_tokens"]=o),t}(t))}var Ma=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Fa(e){if(!e||"string"!=typeof e)throw new Ma("Model name is required and must be a string");if("foundry"===de.provider)return e;if(!de.models?.data)throw new Ma("Models not available. Please try again later.",503);let t=de.models.data.map(e=>e.id);if(t.includes(e))return e;let o=Cn(e,t);if(!o)throw He.add(1,{requested_model:e}),new Ma(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Ua(e){let t=de.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===de.provider?gn(e):/gpt-[\d.]+-codex/i.test(e)}async function Ha(e){if(void 0===e.rateLimitSeconds||re())return;let t=e.rateLimitSeconds;return Re.startActiveSpan("copilot_api.rate_limit.check",async n=>{try{let r=Date.now();if(n.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let a=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute("copilot_api.rate_limit.elapsed_seconds",a),a>t)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let i=Math.ceil(t-a);if(n.setAttribute("copilot_api.rate_limit.wait_seconds",i),!e.rateLimitWait)throw n.setAttribute("copilot_api.rate_limit.action","rejected"),Ue.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new co("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Ue.add(1,{action:"waited",source:"local"}),ot.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await ir(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Ba=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function La(e){if(e instanceof Ba)return{type:e.type,message:e.message};if(e instanceof co){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 za(e,t){let{type:n,message:r}=La(t);try{await e.writeSSE({event:"error",data:JSON.stringify({type:"error",error:{type:n,message:r}})})}catch(e){o.debug("Failed to emit Anthropic stream error frame:",e)}}async function Ja(e,t){let{type:n,message:r}=La(t);try{await e.writeSSE({event:"error",data:JSON.stringify({error:{message:r,type:n}})})}catch(e){o.debug("Failed to emit OpenAI stream error frame:",e)}}function Ga(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 o=Number(t);if(!Number.isFinite(o))return null;let n=Math.floor(o);return n>0?n:null}return null}function Ka(e,t,o){return Math.min(Math.max(e,t),o)}function Wa(e,t=0){if(t>5||!e||"object"!=typeof e)return null;let o=e.error;if(!o||"object"!=typeof o)return null;let n=o.code;if("string"==typeof n)return n;let r=o.message;if("string"!=typeof r)return null;try{return Wa(JSON.parse(r),t+1)}catch{return null}}function Ya(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Ga(o.capabilities.supports.min_thinking_budget),r=Ga(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Ga(o.capabilities.limits?.max_output_tokens)??void 0}}function Va(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Ka(Ga(e.requestedBudget)??o,o,n),a=Ga(e.maxTokens);if(a||=r+1,t.maxOutputTokens&&a>t.maxOutputTokens&&(a=t.maxOutputTokens),a<=r){let e=Math.min(r,a-1);if(e>=o)r=e;else{let e=o+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:a};a=e,r=o}}return a<=r?{thinkingBudget:null,maxTokens:a}:{thinkingBudget:r,maxTokens:a}}function Xa(e,t){if(sr(e.thinking_budget))return e;let o=Ya(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Va({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:o});return null===n.thinkingBudget?{...e,max_tokens:n.maxTokens,thinking_budget:void 0}:{...e,max_tokens:n.maxTokens,thinking_budget:n.thinkingBudget}}function Za(e){return"invalid_thinking_budget"===Wa(e)}async function Qa(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(sr(t.thinking_budget)||!(o instanceof Error))return null;let a,i,s=o;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==r)a=r;else try{a=await s.response.clone().text()}catch{return null}try{i=JSON.parse(a)}catch{return null}if(!Za(i))return null;let l=Ya(n,t.model);return l?function(e,t){let o=Va({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:t});if(null===o.thinkingBudget)return{...e,max_tokens:o.maxTokens,thinking_budget:void 0};let n=o.thinkingBudget,r=Ga(e.thinking_budget);if(r&&r===o.thinkingBudget){let e=n+1;e<=t.bounds.max&&(!o.maxTokens||e<o.maxTokens)&&(n=e)}let a=o.maxTokens;if((!a||a<=n)&&(a=n+1),t.maxOutputTokens&&a>t.maxOutputTokens){if(!(t.maxOutputTokens>n))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};a=t.maxOutputTokens}return{...e,max_tokens:a,thinking_budget:n}}(t,l):{...t,thinking_budget:void 0}}function ei(e,t){let o=!1;return()=>{if(o)return;o=!0;let n=e.get("requestData")||{};n.upstreamTtfbMs=performance.now()-t,e.set("requestData",n)}}function ti(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const oi=new Map,ni=new Map,ri=new Set;let ai,ii,si;function li(e){return!e.closed&&!e.destroyed}function ci(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new I(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return oi.set(t,Date.now()),Xe.add(1,{event:"created",origin:e}),ut(w.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{o.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{o.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(n,r,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=ri.has(t);Xe.add(1,{event:"goaway",origin:e}),ut(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}),ni.delete(t),ri.delete(t),oi.delete(t),li(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function ui(e,t){if(!de.connectivity.h2)return;if(ai&&ai!==e&&function(){for(let e of[...ni.keys(),...ri])li(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});ni.clear(),ri.clear(),oi.clear()}(),ai=e,t?.fresh){let t=ci(e);return ri.add(t),t}let n=Date.now();for(let[t]of ni)if(n-(oi.get(t)??0)>=6e5)ni.delete(t),oi.delete(t),li(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Xe.add(1,{event:"rotated",origin:e}),ut(w.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(li(t))return ni.delete(t),ri.add(t),t;ni.delete(t),oi.delete(t)}let r=ci(e);return ri.add(r),r}function pi(e){e&&ri.delete(e)&&(li(e)?ni.set(e,Date.now()):oi.delete(e))}function di(){si||(si=setInterval(()=>{!function(){let e=Date.now(),t=de.connectivity.h2Keepalive,n=ni.size;for(let[r,a]of ni)e-a<6e4||t&&n<=1||(ni.delete(r),oi.delete(r),n--,li(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Xe.add(1,{event:"idle_reaped",origin:ai??""}),ut(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${ai}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":ai??""}))}()},3e4),si.unref())}function mi(){ii||(o.debug("Starting HTTP/2 keepalive (every 45s)"),ii=setInterval(()=>{(async function(){if(0===ni.size&&0===ri.size){if(ai){let e=ci(ai);ni.set(e,Date.now())}return}let e=[...ni.keys()];for(let t of e)ni.delete(t);await Promise.allSettled(e.map(async e=>{if(li(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:$t(de)});await n.dump(),Ve.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),ni.set(e,Date.now())}catch(t){Ve.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Xe.add(1,{event:"error",origin:ai??""}),oi.delete(e),li(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else oi.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),ii.unref(),di())}function fi(e,t){if(e instanceof ReadableStream)return new Response(e,t);let o,n=new ReadableStream({async pull(t){o??=e[Symbol.asyncIterator]();let n=await o.next();n.done?t.close():t.enqueue(n.value)},cancel(t){e.on("error",()=>{}),e.destroy(t instanceof Error?t:void 0)}});return new Response(n,t)}async function*hi(e,t){try{yield*L(e)}finally{!function(e){e instanceof ReadableStream||e.destroyed||(e.on("error",()=>{}),e.destroy())}(t)}}function gi(e){return e.max_completion_tokens??e.max_tokens}async function _i(e,t,o){try{if(!e.ok)throw new co("Failed to create chat completions",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&ja(t,n.usage),n}catch(e){throw pt(t,e),e}finally{t.end()}}const yi=e=>an(de)?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,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=gi(e);return null==i?a:{...a,max_completion_tokens:i}}(e,de.models),wi=e=>an(de)?e:ka(e),bi=async(e,t)=>{let n=wi(e),r=t?.signal;try{return await xi(n,r)}catch(e){if(e instanceof co&&401===e.response.status){if(!await Yo(e))throw e;return xi(n,r)}let t;if(e instanceof co)try{t=await e.response.clone().text()}catch{t=void 0}let a=await Qa({payload:n,error:e,models:de.models,errorBodyText:t});if(a)return e instanceof co&&void 0!==t&&o.warn(`Upstream rejected thinking_budget (status ${e.response.status}): ${t.slice(0,500)}`),o.warn("Adjusting thinking_budget payload and retrying once..."),await xi(wi(a),r);throw e}},ki=async(e,t)=>{let o=zn(e);return o?(t.setAttribute("copilot_api.foundry.throttled_stream",!0),t.setAttribute("copilot_api.upstream.effective_status",429),t.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(e.body?.cancel()),t.end(),o):(e.ok||t.end(),e.ok?void 0:e)};function vi(e,t){let o=()=>t.abort(e?.reason);return e?.aborted?o():e?.addEventListener("abort",o,{once:!0}),()=>e?.removeEventListener("abort",o)}async function xi(e,t){if(!un(de))throw Error("Service token not found");let o=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),n=e.messages.some(e=>["assistant","tool"].includes(e.role)),r={...cn(de,o),"X-Initiator":n?"agent":"user"},a=ln(de),i=`${a}/chat/completions`,s=de.timeoutMs,l=yi(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":gi(e)??0,"copilot_api.vision_enabled":o,"copilot_api.initiator":n?"agent":"user","copilot_api.upstream.provider":de.provider};for(let o=0;o<=1;o++){ue();let n=ui(a,{fresh:o>0}),l=new AbortController,p=Gn(l,s),d=vi(t,l);try{let{statusCode:t,headers:a,body:d,span:m}=await _t({spanName:"copilot POST /chat/completions",url:i,target:"chat_completions",headers:r,body:c,signal:l.signal,headersTimeout:s,bodyTimeout:3*s,extraAttributes:{...u,"copilot_api.h2.retry_attempt":o},dispatcher:n}).finally(p.headersArrived),f=fi(d,{status:t,headers:a});if(e.stream){let e=await ki(f,m);if(e)throw new co("Failed to create chat completions",e,{outgoingBody:c,outgoingHeaders:r});return{events:hi(f,d),span:m,release:()=>pi(n)}}try{return await _i(f,m,{outgoingBody:c,outgoingHeaders:r})}finally{pi(n)}}catch(e){if(pi(n),await lo(e,{attempt:o,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{p.clear(),d()}}throw Error("Unexpected: exhausted GOAWAY retries without result")}const Ti=new Map;const Ai=["none","minimal","low","medium","high","xhigh","max"];function $i(e,t){if(!e.reasoning)return e;if(0===t.length){let{reasoning:t,...o}=e;return o}let o=e.reasoning.effort;if(!o)return e;let n=function(e,t){if(t.includes(e))return e;let o=Ai.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=Ai.indexOf(e);if(-1===t)continue;let a=Math.abs(t-o);a<r&&(r=a,n=e)}return n??t[0]}(o,t);return n&&n!==o?{...e,reasoning:{...e.reasoning,effort:n}}:e}function Si(e,t){if(!e.reasoning)return null;let n=function(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}let{param:o,code:n,message:r=""}=t.error??{};if("reasoning.effort"===o||"reasoning"===o){if("unsupported_value"===n){let e=[...(/Supported values are:(.*)$/i.exec(r)?.[1]??"").matchAll(/\x27([^\x27]+)\x27/g)].map(e=>e[1]);return e.length>0?{kind:"unsupported_value",supported:e}:void 0}if("unsupported_parameter"===n)return{kind:"unsupported_parameter"}}}(t);if(!n)return null;let r="unsupported_value"===n.kind?n.supported:[];Ti.set(e.model,r);let a=$i(e,r);return a===e?null:(o.debug(`Foundry rejected reasoning.effort=${e.reasoning.effort} on ${e.model}; retrying with ${a.reasoning?.effort??"no reasoning"}`),a)}async function Ei(e,t,o){try{if(!e.ok)throw new co("Failed to create responses",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&ja(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens,prompt_tokens_details:n.usage.input_tokens_details}),n}catch(e){throw pt(t,e),e}finally{t.end()}}const Oi=async(e,t)=>{let o=an(de),n=o?function(e){let t=Ti.get(e.model);return t?$i(e,t):e}(e):e,r=!1,a=!1;for(;;)try{return t?.onAttempt?.(n),await Ii(n,t?.signal)}catch(e){if(!(e instanceof co))throw e;if(401===e.response.status&&!r){if(r=!0,!await Yo(e))throw e;continue}if(o&&400===e.response.status&&!a){a=!0;let t=Si(n,await e.response.clone().text().catch(()=>{}));if(t){n=t;continue}}throw e}};function Ci(e,t){let o,n=()=>{o?.destroy(e?.reason),t.abort(e?.reason)};return e?.aborted?n():e?.addEventListener("abort",n,{once:!0}),{attach:e=>o=e,dispose:()=>e?.removeEventListener("abort",n)}}const Ii=async(e,t)=>{if(!un(de))throw Error("Service token not found");let o=an(de)?e:ka(e),n={...cn(de),"X-Initiator":"agent"},r=ln(de),a=`${r}/responses`,i=de.timeoutMs,s=JSON.stringify(o),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":de.provider}))(o,i);for(let e=0;e<=1;e++){ue();let c=ui(r,{fresh:e>0}),u=new AbortController,d=Gn(u,i),m=Ci(t,u);try{let{statusCode:t,headers:r,body:f,span:h}=await _t({spanName:"copilot POST /responses",url:a,target:"responses",headers:n,body:s,signal:u.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:c}).finally(d.headersArrived);m.attach(f);let g=fi(f,{status:t,headers:r});if(o.stream){let e=zn(g);if(e&&(h.setAttribute("copilot_api.foundry.throttled_stream",!0),h.setAttribute("copilot_api.upstream.effective_status",429),h.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(g.body?.cancel())),!g.ok||e)throw h.end(),new co("Failed to create responses",e??g,{outgoingBody:s,outgoingHeaders:n});return{events:hi(g,f),span:h,release:()=>{m.dispose(),pi(c)}}}try{return await Ei(g,h,{outgoingBody:s,outgoingHeaders:n})}finally{m.dispose(),pi(c)}}catch(t){if(m.dispose(),pi(c),await lo(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{d.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Ri=e=>Object.hasOwn(e,"output");function Ni(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 Pi=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const qi=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 Di(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Pi(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Pi(`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=>Mi(e.content)).filter(Boolean).join("\n\n")||void 0}(e.messages),o=function(e){let t=[];for(let o of e)switch(o.role){case"user":{let e=Fi(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Mi(o.content);e&&t.push({type:"message",role:"assistant",content:[{type:"output_text",text:e}]});for(let e of o.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:o.tool_call_id??"",output:Mi(o.content)})}return t}(e.messages);if(0===o.length)throw new Pi("request has no translatable message content","invalid_request","messages");let n={model:e.model,input:o,store:!1};t&&(n.instructions=t);let r=e.max_completion_tokens??e.max_tokens;"number"==typeof r&&(n.max_output_tokens=Math.max(r,16)),e.stream&&(n.stream=!0),ji(e.temperature)&&(n.temperature=e.temperature),ji(e.top_p)&&(n.top_p=e.top_p),ji(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),ji(e.user)&&(n.user=e.user),e.reasoning_effort&&(n.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(n.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&&(n.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:o,schema:n,strict:r}=e.json_schema;return{type:"json_schema",name:t,description:o,schema:n,strict:r}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return a&&(n.text={format:a}),n}function ji(e){return null!=e}function Mi(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Fi(e){if("string"==typeof e)return e?[{type:"input_text",text:e}]:[];let t=[];for(let o of e??[])if("text"===o.type)o.text&&t.push({type:"input_text",text:o.text});else{if("image_url"!==o.type)throw new Pi(`content part type '${o.type}' is not supported for models served via the Responses API`,"unsupported_content_type","messages");t.push({type:"input_image",image_url:o.image_url.url,detail:"low"===o.image_url.detail?"low":"high"})}return t}function Ui(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 Hi(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 Bi(e,t,o=null){let n=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:n,logprobs:null,finish_reason:o}]}}function Li(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function zi(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Li(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Bi(t,{tool_calls:[{index:r,function:{arguments:o.arguments}}]})]):[];let a=function(e,t,o){let n=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,n),e.toolCallIndexByOutputIndex.set(o,n),n}(t,o.id,e.output_index),i=n?o.arguments:"";return i&&t.toolCallsWithArgs.add(a),[Bi(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Ji(e,t){let o=[Bi(e,{},Hi(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=Ui(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Gi(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:[Bi(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:zi(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Li(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Bi(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Ji(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 Ki="openai_responses";function Wi(e){let t=performance.now(),n=Re.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),Di(e)}finally{t.end()}});nt.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!qi.has(e)&&null!=t).map(([e])=>e)}(e);return r.length>0&&o.debug(`Dropped chat-only fields with no Responses API equivalent: ${r.join(", ")}`),n}function Yi(e){let t=performance.now(),o=Re.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",o=!1,n=[];for(let r of e.output)if("message"===r.type)for(let e of r.content)"output_text"===e.type?(t+=e.text,o=!0):"refusal"===e.type&&(t+=e.refusal,o=!0);else"function_call"===r.type&&n.push({id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments}});let r={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:o?t:null,...n.length>0&&{tool_calls:n}},logprobs:null,finish_reason:Hi(e,n.length>0)}]};return e.usage&&(r.usage=Ui(e.usage)),r}(e)}finally{t.end()}});return nt.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Vi(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=Ui(t.usage);a.tokenUsage=Da(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.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(Yi(t))}async function Xi(e,t,n){let r;try{r=Wi(t)}catch(t){if(t instanceof Pi)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}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),de.manualApprove&&!n.isSelfTest&&await Pa();let a=await qa(e);if(a)return a;let i=performance.now(),s=await Oi(r),l=performance.now()-i;if(et.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Ri(s))return Vi(e,s,l);let{events:c,span:u,release:p}=s,d=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return B(e,async t=>{let n=null,a=0,s=performance.now(),m=ei(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){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,We.add(1,{model:r.model,endpoint_type:Ki});let c=Ni(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Da(c),t._d1=l,e.set("requestData",t)}let u=Gi(s,d);if(u.error)throw new Ba(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:r.model,endpoint_type:Ki};tt.record(performance.now()-s,u),lt.record(a,u),ti(e,i)}catch(o){throw dt(u,e.get("requestSpan"),o),await Ja(t,o),o}finally{n&&ja(u,n),u.end(),p()}let f=e.get("requestId");f&&Ae.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Zi(e,t){if(!e.data)return e;try{let o=JSON.parse(e.data);if(o.usage&&t(o.usage),void 0!==o.usage?.prompt_tokens_details?.cached_tokens)return{...e,data:JSON.stringify({...o,usage:{...o.usage,prompt_tokens_details:void 0}})}}catch(t){o.warn("Failed to parse streaming chunk:",e.data.slice(0,200),t)}return e}async function Qi(e){let t=!0===e.get("isSelfTest");t||await Ha(de);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return Re.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Fa(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Be.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}(n)}catch(t){if(t instanceof Ma)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(Ua(n.model))return Xi(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),de.manualApprove&&!t&&await Pa(),"foundry"!==de.provider&&(n=function(e){if(!sr(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!sr(e.max_tokens))return e;let t=(de.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return o.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(n),n=Xa(n,de.models)),sr(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await qa(e);if(r)return r;let a=performance.now(),i=await bi(n),s=performance.now()-a;if(et.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),es(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Da(i.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return B(e,async t=>{let o={value:null},r=0,i=performance.now(),p=ei(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,We.add(1,{model:n.model,endpoint_type:"openai"}),i=Zi(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Da(t),n._d1=s,e.set("requestData",n)})),await t.writeSSE(i)}let c=performance.now()-i,u={model:n.model,endpoint_type:"openai"};if(tt.record(c,u),lt.record(r,u),ti(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Da(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw dt(c,e.get("requestSpan"),o),await Ja(t,o),o}finally{o.value&&ja(c,o.value),c.end(),u()}let d=e.get("requestId");d&&Ae.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const es=e=>Object.hasOwn(e,"choices"),ts=new F;ts.post("/",async e=>{try{return await ar(e,"chat",Qi)}catch(t){return await Po(e,t)}});const os=async e=>{if(!un(de))throw Error("Service token not found");let t=`${ln(de)}/embeddings`,o=cn(de),n=de.timeoutMs,r=new AbortController,a=po(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await gt({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1,"copilot_api.upstream.provider":de.provider}});try{if(!n.ok)throw new co("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw pt(a,e),e}finally{a.end()}}finally{clearTimeout(a)}},ns=new F;ns.post("/",async e=>{try{let t=await e.req.json();try{t.model=Fa(t.model)}catch(t){if(t instanceof Ma)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 o=await qa(e);if(o)return o;let n=performance.now(),r=await(async e=>{try{return await os(e)}catch(t){if(t instanceof co&&401===t.response.status){if(!await Yo(t))throw t;return os(e)}throw t}})(t),a=performance.now()-n;et.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Da(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await Po(e,t)}});const rs=new F;let as=null,is=null;rs.get("/",async e=>{let t,o=function(){if(an(de)){if(!un(de))return"missing";let e=de.foundry?.bearerExpiresAt;return void 0!==e&&e<=Date.now()?"expired":"valid"}let e=de._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let o=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),n=JSON.parse(atob(o)),r="object"==typeof n&&n&&"exp"in n&&"number"==typeof n.exp?n.exp:void 0;return void 0!==r&&1e3*r<Date.now()?"expired":"valid"}catch{return"expired"}}(),n=await async function(){let e=Date.now(),t=as;return t&&e-t.timestamp<3e4?{result:t.result}:is||(is=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${ln(de)}/models`,n=await fetch(t,{method:"GET",headers:cn(de),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return as={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return as={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),is=null}})(),is)}();t="valid"===o&&"reachable"===n.result?"ok":"valid"!==o&&"reachable"!==n.result?"unhealthy":"degraded";let r={status:t,copilot_token:o,upstream:n.result,version:"0.45.1",timestamp:(new Date).toISOString()};void 0!==n.latencyMs&&(r.upstream_latency_ms=n.latencyMs);let a="ok"===t?200:503;return e.json(r,a)});const ss=async(e,t)=>{if(!un(de))throw Error("Service token not found");let o=`${ln(de)}/v1/images/${e.operation}`,n={...cn(de),"Content-Type":e.contentType},r=new AbortController,a=po(r,de.timeoutMs),i=()=>r.abort(t?.reason);t?.aborted?i():t?.addEventListener("abort",i,{once:!0});try{let{response:t,span:a}=await gt({spanName:`copilot POST /v1/images/${e.operation}`,url:o,target:"images",method:"POST",headers:n,body:e.body,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.upstream.provider":de.provider}});try{if(!t.ok){let o=await t.text();throw new co(`Failed to create image ${e.operation}`,new Response(o,{status:t.status,statusText:t.statusText,headers:t.headers}),{outgoingHeaders:n})}let o=t.headers.get("content-type")??"application/json",r=await t.text();return{contentType:o,body:r,usage:ls(r)}}catch(e){throw pt(a,e),e}finally{a.end()}}finally{clearTimeout(a),t?.removeEventListener("abort",i)}};function ls(e){let t=/[{,]\s*"usage"\s*:\s*\{/g,o=-1;for(let n of e.matchAll(t))o=n.index+n[0].length-1;if(o<0)return;let n=0,r=!1;for(let t=o;t<e.length;t++){let a=e[t];if(r)"\\"===a?t++:'"'===a&&(r=!1);else if('"'===a)r=!0;else if("{"===a)n++;else if("}"===a&&0===--n)try{let n=JSON.parse(e.slice(o,t+1));return"object"==typeof n&&n?n:void 0}catch{return}}}const cs=new F,us=(e,t)=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error",code:"invalid_request"}},400)),ps=(e,t)=>e.json({error:{message:`Request body exceeds the ${t/1024/1024} MB limit.`,type:"invalid_request_error",code:"request_too_large"}},413),ds=(e,t)=>{try{return Fa(t)}catch(t){if(t instanceof Ma)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}},ms=async(e,t)=>{let o=e.req.raw.body;if(!o)return new Uint8Array;let n=o.getReader(),r=[],a=0;for(;;){let{done:e,value:o}=await n.read();if(e)break;if(a+=o.byteLength,a>t)return await n.cancel(),null;r.push(o)}let i=new Uint8Array(a),s=0;for(let e of r)i.set(e,s),s+=e.byteLength;return i},fs=async(e,t)=>{let o,n,r=Na(e.req.path),a=await ms(e,r);if(!a)return ps(e,r);try{o=new TextDecoder("utf8",{fatal:!0}).decode(a),n=JSON.parse(o)}catch{return us(e,"Request body must be valid JSON.")}if(!(e=>"object"==typeof e&&!!e&&!Array.isArray(e))(n))return us(e,"Request body must be a JSON object.");let i=ds(e,n.model);return i instanceof Response?i:{operation:t,model:i,body:n.model===i?o:JSON.stringify({...n,model:i}),contentType:"application/json"}},hs=e=>async t=>{try{if(an(de))return us(t,"Image endpoints are available only with the Copilot provider.");await Ha(de);let o="generations"===e?await fs(t,"generations"):await(async e=>{let t=e.req.header("content-type")??"",o=t.split(";")[0].trim().toLowerCase();if("application/json"===o)return fs(e,"edits");if("multipart/form-data"!==o)return us(e,"Image edits require a multipart/form-data or application/json body.");let n,r=Na(e.req.path),a=await ms(e,r);if(!a)return ps(e,r);try{n=await new Response(a,{headers:{"content-type":t}}).formData()}catch{return us(e,"Malformed multipart/form-data body.")}let i=ds(e,n.get("model"));if(i instanceof Response)return i;if(n.get("model")===i)return{operation:"edits",model:i,body:a,contentType:t};n.set("model",i);let s=new Response(n),l=s.headers.get("content-type")??t;return{operation:"edits",model:i,body:new Uint8Array(await s.arrayBuffer()),contentType:l}})(t);if(o instanceof Response)return o;t.set("requestData",{model:o.model});let n=await qa(t);if(n)return n;de.manualApprove&&await Pa();let r=performance.now(),a=await(async(e,t)=>{try{return await ss(e,t)}catch(o){if(o instanceof co&&401===o.response.status){if(!await Yo(o))throw o;return ss(e,t)}throw o}})(o,qt(t)),i=performance.now()-r;et.record(i,{model:o.model,target:"images",streaming:"false"});let s=t.get("requestData")||{};if(a.usage){let e=a.usage.input_tokens??0,t=a.usage.output_tokens??0;s.tokenUsage={inputTokens:e,outputTokens:t,totalTokens:a.usage.total_tokens??e+t}}return s._d1=i,t.set("requestData",s),new Response(a.body,{status:200,headers:{"content-type":a.contentType}})}catch(e){return await Po(t,e)}};function gs(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function _s(e){return!gs(e)}cs.post("/generations",hs("generations")),cs.post("/edits",hs("edits"));const ys=new z(G);let ws;const bs={...J["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function ks(e,t){try{return e.encode(t,[],[]).length}catch(e){return o.debug("count_tokens: tokenizer failed, using length/4",e),Math.ceil(t.length/4)}}function vs(e,t){let o=0;for(let n of e)switch(n.type){case"text":o+=t(n.text)*bs.contentMultiplier;break;case"tool_use":o+=t(n.name+JSON.stringify(n.input))*bs.contentMultiplier;break;case"tool_result":n.content&&(o+=t("string"==typeof n.content?n.content:JSON.stringify(n.content))*bs.contentMultiplier);break;case"thinking":o+=t(n.thinking)*bs.contentMultiplier;break;case"image":o+=1600}return o}function xs(e,t){let o=0,n=e.properties;if(!n)return o;let r=Object.entries(n);for(let[e,[n,a]]of r.entries()){if(o+=0===e?bs.perFirstProp:bs.perAdditionalProp,o+=t(n),a.description&&(o+=bs.perPropDesc+t(a.description)),a.enum&&Array.isArray(a.enum)){o+=bs.perEnum;for(let e of a.enum)o+=t(String(e))}if("object"===a.type&&a.properties&&(o+=bs.perNestedObject,o+=xs(a,t)),"array"===a.type&&a.items){let e=a.items;"object"===e.type&&e.properties&&(o+=bs.perArrayOfObjects,o+=xs(e,t))}}return o}const Ts={event:"ping",data:JSON.stringify({type:"ping"})};function As(e,t=15e3){let o,n=performance.now(),r=!1,a=()=>{if(r||e.aborted||e.closed)return void(o=void 0);let i=performance.now()-n;i>=t?(n=performance.now(),e.writeSSE(Ts).catch(()=>{}),o=setTimeout(a,t)):o=setTimeout(a,t-i)};return o=setTimeout(a,t),{writeSSE:async t=>{await e.writeSSE(t),n=performance.now()},stop:()=>{r=!0,clearTimeout(o),o=void 0}}}function $s(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")},n=e.thinking;if(n&&"object"==typeof n){let{type:e,budget_tokens:t}=n;"string"==typeof e&&(o["copilot_api.thinking.type"]=e),"number"==typeof t&&t&&(o["copilot_api.thinking.budget_tokens"]=t)}let r=e.output_config?.effort;return"string"==typeof r&&r&&(o["copilot_api.output_config.effort"]=r),o}function Ss(e,t,o){let n=$s(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Es=async(e,t,n)=>{try{return await Os(e,t)}catch(r){if(r instanceof co&&401===r.response.status){if(!await Yo(r))throw r;return Os(e,t)}if(r instanceof co&&400===r.response.status&&n?.onStructuredOutputFallback){let a;try{a=await r.response.clone().text()}catch{a=void 0}let i=n.onStructuredOutputFallback(e,a);if(i)return o.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${i.model}`),Os(i,t)}throw r}};const Os=async(e,t)=>{if(!un(de))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=an(de)&&de.foundry?{baseUrl:nn(de.foundry),headers:rn(de.foundry,t),cleanPayload:e}:function(e,t){let{metadata:o,...n}=e,r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...Et(de,t,r),"X-Initiator":"agent"};return{baseUrl:At(de),headers:a,cleanPayload:n}}(ka(e),t),a=`${o}/v1/messages`,i=de.timeoutMs,s=JSON.stringify(r),l=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"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":de.provider,...$s(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){ue();let t=ui(o,{fresh:e>0}),c=new AbortController,u=Gn(c,i);try{let{statusCode:o,headers:p,body:d,span:m}=await _t({spanName:"copilot POST /v1/messages",url:a,target:"anthropic_messages",headers:n,body:s,signal:c.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:t}).finally(u.headersArrived),f=fi(d,{status:o,headers:p});if(!f.ok)throw m.end(),new co("Failed to create anthropic messages",f,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:hi(f,d),span:m,release:()=>pi(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&&ja(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(),pi(t)}}catch(o){if(pi(t),await lo(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{u.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Cs=new Set(["resolveStreamComplete","requestId"]);function Is(e,t){if(!t)return e;let o=JSON.parse(e),n={...o.usage};for(let[e,o]of Object.entries(t))"number"==typeof o&&o>0&&!n[e]&&(n[e]=o);return JSON.stringify({...o,usage:n})}async function Rs(e,t,o){let{stream:n,client:r}=t,{reason:a,progress:i}=o,s=await async function(e){let t=e.req.raw,o=new Request(t.url,{method:t.method,headers:t.headers,body:JSON.stringify(await e.req.json()),signal:qt(e)}),n=new M(o,{env:e.env});for(let[t,o]of Object.entries(e.var))Cs.has(t)||n.set(t,o);return n}(e);try{let e,t=await async function(e,t,o){let n=await rr(e,t,o);if(n.ok&&n.body)return n;throw await(n.body?.cancel()),new co("Copilot fallback failed",n)}(s,a,o.failure);for await(let{event:o,data:n}of L(t))o&&void 0!==n&&"ping"!==o&&("message_start"===o&&i.messageStart?e=JSON.parse(n).message?.usage:await r.writeSSE({event:o,data:"message_delta"===o?Is(n,e):n}))}catch(t){if(jt(e))return;let o=e.get("requestSpan");throw o&&pt(o,t),await za(n,t),t}finally{e.set("requestData",s.get("requestData"))}}const Ns=24e4;var Ps=class extends uo{name="StreamHeadersTimeoutError"};function qs(){if(ae())return;let e=new AbortController,t=setTimeout(()=>{e.abort(new Ps(Ns))},Ns);return{signal:e.signal,clear:()=>clearTimeout(t)}}function Ds(e,t){e.get("requestSpan")?.setAttribute("copilot_api.stream.headers_wait_ms",Math.round(performance.now()-t))}async function js(e,t,o){let n=e.get("requestSpan");try{let r=await async function(e,t){let o,n=new Promise(e=>{o=setTimeout(()=>e(void 0),t)});try{return await Promise.race([e.then(e=>({value:e})),n])}finally{clearTimeout(o)}}(t,15e3);return n?.setAttribute("copilot_api.stream.early_commit",!r),r&&Ds(e,o),r}catch(t){throw n?.setAttribute("copilot_api.stream.early_commit",!1),Ds(e,o),t}}const Ms={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"},Fs=e=>Ms[e]??(e>=500?"api_error":"invalid_request_error");async function Us(e,t){let o=new M(e.req.raw,{env:e.env,path:e.req.path});for(let[t,n]of Object.entries(e.var))o.set(t,n);let n=await Po(o,t);if(499===n.status)return;if((e=>e instanceof Ps||e instanceof Error&&e.cause instanceof Ps)(t))return await(n.body?.cancel()),{type:"overloaded_error",message:"Upstream sent no response within 240s; retry"};let r=(await n.json().catch(()=>{}))?.error?.message??"Upstream request failed";return mo(t)?{type:"overloaded_error",message:r}:{type:Fs(n.status),message:r}}async function Hs(e,t,o){await t.client.writeSSE(Ts);try{let t=await o.pending;return Ds(e,o.start),t}catch(n){if(Ds(e,o.start),jt(e))return void Ae.completionCallbacks.delete(e.get("requestId"));let r=function(e,t){if(tr(e))return Kn(t,void 0!==Xn()?.sent)}(e,n);if(r)return void await Rs(e,t,{reason:r,progress:{messageStart:!1,content:!1,held:[]},failure:n});let a=await Us(e,n);return void(a&&await t.client.writeSSE({event:"error",data:JSON.stringify({type:"error",error:a})}))}}const Bs=new Set(["low","medium","high","max","xhigh"]),Ls=(e,t)=>!(!e||!t||e===t);function zs(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!Bs.has(t))return e;let n=de.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Rn(t,n);if(!r||!Bs.has(r))return e;let a=r;if(a===t)return e;o.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 Js(e,t,n){if("foundry"===de.provider)return zs(e);let r=t.includes(e.model)?e.model:Cn(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=Cn(e,t);return n&&o.context1m?function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,new Set(t)):null}(a.model,t,{context1m:n.context1m}),s=a;if(i&&i!==a.model){o.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 zs(s)}const Gs=e=>"object"==typeof e&&!!e&&!Array.isArray(e),Ks=["properties","patternProperties","$defs","definitions"],Ws=["items","additionalProperties","propertyNames","contains","not","if","then","else"],Ys=["anyOf","allOf","oneOf","prefixItems"];const Vs=()=>["string","number","boolean"].map(e=>({type:e})),Xs=()=>({anyOf:[...Vs(),{type:"array",items:{anyOf:Vs()}},{type:"object"}]}),Zs=e=>!0===e||Gs(e)&&0===Object.keys(e).length,Qs=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function el(e,t){let o={...e};for(let e of Ks){let n=o[e];Gs(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,Gs(o)?el(o,t):o])))}for(let e of Ws){let n=o[e];Gs(n)&&(o[e]=el(n,t))}for(let e of Ys){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>Gs(e)?el(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(Gs(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>Zs(e)?Xs().anyOf:Gs(e)?[e]:[]);if(0===o.length)return;let n=[...new Map(o.map(e=>[JSON.stringify(e),e]))].map(([,e])=>e);e.items=1===n.length?n[0]:{anyOf:n}}(o)),Qs(o)&&(!("items"in o)||Zs(o.items))&&(t.add("items"),o.items=Xs()),Zs(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function tl(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=nl(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function ol(e){return rl(nl(e))}function nl(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 rl(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function al(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>rl(e)).filter(Boolean).join("\n\n")}const il=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),sl=new Set(["text","image"]);function ll(e,t){if(Array.isArray(e?.content))for(let o of e.content){if(t.size>=20)return;let e=String(o?.type).slice(0,64);sl.has(e)||t.add(`block:tool_result:${e}`)}}const cl=new Set;function ul(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 o=function(e){let t=new Set;for(let o of e){if(t.size>=20)break;let e=String(o.role).slice(0,64),n=il.get(e);if(n){if(Array.isArray(o.content))for(let r of o.content){let o=String(r?.type).slice(0,64);if(n.has(o)||t.add(`block:${e}:${o}`),"tool_result"===o&&ll(r,t),t.size>=20)break}}else t.add(`role:${e}`)}return[...t].sort()}(t);if(0===o.length)return;e.setAttribute("copilot_api.translation.unknown_shapes",o.join(","));let n=function(e){let t=[];for(let o of e){if(cl.size>=100)break;cl.has(o)||(cl.add(o),t.push(o))}return t}(o);0!==n.length&&r.warn(`Request contains message shapes the translator does not handle (dropped): ${n.join(", ")}`)}const pl=e=>N("sha256").update(e).digest("hex").slice(0,12);function dl(e,t){e.setAttribute("copilot_api.translation.system_hash",pl(t.system)),e.setAttribute("copilot_api.translation.tools_hash",pl(JSON.stringify(t.tools??[])))}function ml(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function fl(e){return e.toLowerCase().startsWith("claude-")}function hl(e,t){let o={model:e.model,messages:gl(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:Tl(e.tools,e.model),tool_choice:Al(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Ya(t,o.model);if(r){let a="enabled"===n.type&&"number"==typeof n.budget_tokens?n.budget_tokens:function(e,t,o){let n=function(e,t){return"max"===e||"xhigh"===e?t:"medium"===e?8e3:"low"===e?1024:16e3}(e,o.max),r=Ga(t),a=r&&r>1?r-1:o.min;return Ka(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Xa({...o,thinking_budget:a},t)}}return o}function gl(e,t){let{leadingSystemTexts:o,messages:n}=tl(e),r=function(e,t){let o=al(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=ol(e);if(!t)break;_l(r)?a.push(t):yl(r,t);break}case"user":r.push(...wl(e));for(let e of a)yl(r,e);a=[];break;case"assistant":r.push(...bl(e))}for(let e of a)yl(r,e);return r}function _l(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function yl(e,t){let o=function(e){return e.trimStart().startsWith("<system-reminder>")?e:`<system-reminder>\n${e}\n</system-reminder>`}(t),n=e.at(-1);"user"===n?.role?Array.isArray(n.content)?n.content.push({type:"text",text:o}):n.content=n.content?`${n.content}\n\n${o}`:o:e.push({role:"user",content:o})}function wl(e){let t=[];if(Array.isArray(e.content)){let o=e.content.filter(e=>"tool_result"===e.type),n=e.content.filter(e=>"tool_result"!==e.type);for(let e of o)t.push({role:"tool",tool_call_id:e.tool_use_id,content:xl(e.content)});n.length>0&&t.push({role:"user",content:xl(n)})}else t.push({role:"user",content:xl(e.content)});return t}function bl(e){let t=function(e){return{reasoning_text:vl(e.reasoning_text),reasoning_opaque:vl(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:xl(e.content),...t}];let o=e.content.filter(e=>"tool_use"===e.type),n=e.content.filter(e=>"text"===e.type),r=e.content.filter(e=>"thinking"===e.type),a=[...n.map(e=>e.text),...r.map(e=>e.thinking)].join("\n\n");return o.length>0?[{role:"assistant",content:a||null,...t,tool_calls:o.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:"assistant",content:xl(e.content),...t}]}const kl=32768;function vl(e){if("string"==typeof e)return e.length<=kl?e:e.slice(0,kl)}function xl(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 o of e)switch(o.type){case"text":t.push({type:"text",text:o.text});break;case"thinking":t.push({type:"text",text:o.thinking});break;case"image":t.push({type:"image_url",image_url:{url:`data:${o.source.media_type};base64,${o.source.data}`}})}return t}function Tl(e,t){if(!e)return;let o=e.filter(_s),n=function(e){return e.toLowerCase().startsWith("gemini")}(t),r=new Set,a=o.map(e=>{let t=e.input_schema;if(n){let e=function(e){let t=new Set;return{schema:el(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)r.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return r.size>0&&f.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function Al(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 $l(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 Sl(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function El(e){return e?e.map(e=>{let t={};try{t=JSON.parse(e.function.arguments)}catch{r.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 Ol=new Set(["low","medium","high","max","xhigh"]);function Cl(e,t){let o=e.thinking;if(!o||"enabled"!==o.type)return e;let n=t?.data.find(t=>t.id===e.model);if(!n||!n.capabilities.supports.adaptive_thinking)return e;let r={...e,thinking:{type:"adaptive"}};if(!e.output_config?.effort){let t=(e=>null!==e&&Ol.has(e)?e:null)(Rn(function(e){return!e||e<=0?"medium":e<8e3?"low":e<24e3?"medium":"high"}(o.budget_tokens),n.capabilities.supports.reasoning_effort));t&&(r.output_config={...e.output_config,effort:t})}return r}function Il(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 o=t.cache_control;if("string"!=typeof o.type){let{cache_control:e,...o}=t;return o}let n={type:o.type};return void 0!==o.ttl&&(n.ttl=o.ttl),{...t,cache_control:n}}):e}const Rl=/[^\w-]/g;function Nl(e){return e.replaceAll(Rl,"_")}function Pl(e,t){let o=function(e,t){if(!e.output_config?.effort)return e;let o=t?.data.find(t=>t.id===e.model);if(!o)return e;let n=o.capabilities.supports.reasoning_effort;if(Array.isArray(n)&&n.length>0)return e;let{effort:r,...a}=e.output_config;if(0===Object.keys(a).length){let{output_config:t,...o}=e;return o}return{...e,output_config:a}}(e,t);return o=Cl(o,t),o=function(e,t){let o=e.max_tokens;if("number"!=typeof o)return e;let n=t?.data.find(t=>t.id===e.model);if(!n)return e;let r=n.capabilities.limits;if(!r)return e;let a=(!1===e.stream?r.max_non_streaming_output_tokens:void 0)??r.max_output_tokens;if("number"!=typeof a||a<=0)return e;let i=Math.max(Math.min(o,a),16);return i===o?e:{...e,max_tokens:i}}(o,t),o={...o,system:Il(o.system)},o=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:Nl(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Nl(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function ql(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 o=t;return"string"==typeof o.type?"enabled"!==o.type||void 0===o.budget_tokens||"number"==typeof o.budget_tokens&&Number.isFinite(o.budget_tokens)&&!(o.budget_tokens<=0)&&Number.isInteger(o.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 o=t;return void 0===o.effort||"string"==typeof o.effort?null:"output_config.effort must be a string"}(e)}function Dl(e,t,o=400){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function jl(e,t){return Re.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),Ss(n,t,e.req.header("anthropic-beta"));let r=Fa(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=ql(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)}):r===t.model?(n.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(n.setAttribute("copilot_api.model.was_mapped",!0),Be.add(1,{from_model:t.model,to_model:r}),o.debug(`Model mapping: '${t.model}' → '${r}'`),{ok:!0,payload:{...t,model:r}})}catch(t){if(t instanceof Ma)return{ok:!1,response:Dl(e,t.message,t.statusCode)};throw t}finally{n.end()}})}var Ml=class extends Ba{name="UpstreamIdleError";constructor(e){super("api_error",`Upstream sent nothing for ${Math.round(e/1e3)}s; stream aborted`)}};function Fl(e,t,o){let{leadingSystemTexts:n,messages:r}=tl(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=ol(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(Jl(e));break}case"user":t.push(...Gl(n),...o.map(e=>Jl(e))),o=[];break;case"assistant":t.push(...Yl(n))}return t.push(...o.map(e=>Jl(e))),t}(r);if(0===a.length)throw new co("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 al(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(_s).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,o){if("adaptive"===e.thinking?.type){let t=e.output_config?.effort??"high";return o&&"max"===t?{effort:"max"}:{effort:zl(t)}}if("enabled"===e.thinking?.type&&e.thinking.budget_tokens){let{effort:o}=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens),n=Rn(o,t);return{effort:Ll(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function Ul(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${N("sha256").update(o).digest("hex").slice(0,32)}`}function Hl(e){let t=e?.input_tokens??0,o=e?.input_tokens_details?.cached_tokens;return{input_tokens:void 0===o?t:Math.max(t-o,0),output_tokens:e?.output_tokens??0,...void 0===o?{}:{cache_read_input_tokens:o}}}const Bl=new Set(["low","medium","high","xhigh"]),Ll=e=>null!==e&&Bl.has(e);function zl(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Jl(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function Gl(e){if("string"==typeof e.content)return[{type:"message",role:"user",content:e.content}];let t=[],o=e.content.filter(e=>"tool_result"===e.type),n=e.content.filter(e=>"tool_result"!==e.type);for(let e of o)t.push(Wl(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)switch(t.type){case"text":e.push({type:"input_text",text:t.text});break;case"image":e.push(Kl(t))}t.push({type:"message",role:"user",content:e})}else{let e=n.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function Kl(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function Wl(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?Kl(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 Yl(e){if("string"==typeof e.content)return[{type:"message",role:"assistant",content:e.content}];let t=[],o=e.content.filter(e=>"text"===e.type),n=e.content.filter(e=>"thinking"===e.type),r=e.content.filter(e=>"tool_use"===e.type),a=[...o.map(e=>e.text),...n.map(e=>e.thinking)].join("\n\n");a&&t.push({type:"message",role:"assistant",content:a});for(let e of r)t.push({type:"function_call",call_id:e.id,name:e.name,arguments:JSON.stringify(e.input)});return t}function Vl(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 Xl(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Zl(e,t,o){e.messageStartSent||=(e.responseId=o?.responseId??e.responseId,e.model=o?.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 Ql(e,t){let o=[];switch(e.type){case"response.created":Zl(t,o,{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){Zl(t,o),Xl(t,o);let n=e.item;t.toolCalls[e.output_index]={call_id:n.call_id,name:n.name,_bi1:t.contentBlockIndex},o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"tool_use",id:n.call_id,name:n.name,input:{}}}),t.contentBlockOpen=!0}break;case"response.content_part.added":Zl(t,o),Xl(t,o),o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),t.contentBlockOpen=!0;break;case"response.output_text.delta":o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"response.content_part.done":Xl(t,o);break;case"response.function_call_arguments.delta":{let n=t.toolCalls[e.output_index];n&&o.push({type:"content_block_delta",index:n._bi1,delta:{type:"input_json_delta",partial_json:e.delta}});break}case"response.output_item.done":if("function_call"===e.item.type){let n=t.toolCalls[e.output_index];n&&t.contentBlockOpen&&(o.push({type:"content_block_stop",index:n._bi1}),t.contentBlockIndex++,t.contentBlockOpen=!1)}break;case"response.completed":{Xl(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage,a=Vl(e.response,n);t.terminalEvent=e.type,t.stopReason=a,o.push({type:"message_delta",delta:{stop_reason:a,stop_sequence:null},usage:Hl(r)},{type:"message_stop"});break}case"response.incomplete":{Zl(t,o),Xl(t,o);let n=e.response.usage,r=Vl(e.response,!1);t.terminalEvent=e.type,t.stopReason=r,o.push({type:"message_delta",delta:{stop_reason:r,stop_sequence:null},usage:Hl(n)},{type:"message_stop"});break}case"response.failed":Zl(t,o),Xl(t,o),t.terminalEvent=e.type,o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":Zl(t,o),Xl(t,o),t.terminalEvent=e.type,t.stopReason="end_turn",o.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":Zl(t,o),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"error":t.terminalEvent=e.type,o.push({type:"error",error:{type:e.code??"api_error",message:e.message??"Response generation failed"}})}return o}function ec(e,t,o){let n=t.reasoning?.effort,r=e.get("requestData")||{};r.reasoningEffort=n,r.effortClamped=Ls(o,n),e.set("requestData",r)}function tc(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function oc(e,t,n){let r=!1;for(let a of t){if(o.debug("Translated Anthropic event:",a),"error"===a.type)throw new Ba(a.error.type,a.error.message);if("message_start"===a.type){await e.writeSSE({event:a.type,data:JSON.stringify(a)}),n.messageStart=!0,r=!0;continue}let t="content_block_start"===a.type&&"text"===a.content_block.type&&!a.content_block.text,i="content_block_stop"===a.type&&n.held.length>0;if(n.content||!t&&!i){n.content=!0;for(let t of n.held.splice(0))await e.writeSSE({event:t.type,data:JSON.stringify(t)});await e.writeSSE({event:a.type,data:JSON.stringify(a)}),r=!0}else n.held.push(a)}return r}function nc(e){let t,o=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)||(o++,!1),forwarded:()=>{t=performance.now()},record:n=>{n.setAttribute("copilot_api.upstream.keepalive_count",o),void 0!==t&&n.setAttribute("copilot_api.stream.last_forward_ms",Math.round(t-e))}}}function rc(e){if(e)try{return JSON.parse(e)}catch(t){return void o.warn("Failed to parse streaming chunk:",e.slice(0,200),t)}}function ac(e,t){let o=performance.now()-t;return et.record(o,{model:e.model,target:"responses",streaming:String(!!e.stream)}),o}function ic(e,t){return B(e,async o=>{let n=As(o);o.onAbort(()=>{n.stop(),Dt(e)});try{await t({stream:o,client:n})}finally{n.stop();try{let t=e.get("requestId");t&&Ae.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}})}async function sc(e,t,n){o.debug("Streaming Responses API response");let r,{stream:a,client:i}=t,{events:s,span:l,release:c}=n.response,{model:u,copilotStart:p,_d1:d,upstreamIdle:m}=n,f=null,h=0,g=performance.now(),_=nc(g),y=ei(e,p),w={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}},b={messageStart:!1,content:!1,held:[]};try{for await(let t of async function*(e,t,o={}){let n,{idleMs:r=3e5,progress:a=()=>!0}=o,i=e[Symbol.asyncIterator](),s={idle:!1};try{for(;;){let e,o=new Promise((e,o)=>{n=setTimeout(()=>{s.idle=!0;let e=new Ml(r);t.abort(e),o(e)},r)});try{do{e=await Promise.race([i.next(),o])}while(!e.done&&!a(e.value))}finally{clearTimeout(n)}if(e.done)return;yield e.value}}finally{clearTimeout(n),s.idle||await(i.return?.())}}(s,m,{progress:_.progress})){y(),o.debug("Responses API raw stream event:",t);let n=rc(t.data);if(!n)continue;h++,We.add(1,{model:u,endpoint_type:"responses"});let r=Ni(n);if(r){f=r;let t=e.get("requestData")||{};t.tokenUsage=Da(f),t._d1=d,e.set("requestData",t)}await oc(i,Ql(n,w),b)&&_.forwarded()}(function(e){if(!e.terminalEvent)throw new Ba("api_error","Upstream stream ended before the response completed")})(w),nr();let t=performance.now()-g,n={model:u,endpoint_type:"responses"};tt.record(t,n),lt.record(h,n),ti(e,p)}catch(t){if(jt(e))return;if(b.content||!tr(e))throw function(e,t,o){if(!(t instanceof Ba))return;let n="stream_incomplete";t instanceof Ml?n="upstream_idle":o.terminalEvent&&(n="upstream_failure"),e?.setAttribute("copilot_api.error_type",n)}(e.get("requestSpan"),t,w),dt(l,e.get("requestSpan"),t),await za(a,t),t;r=t instanceof Ml?"foundry_stream_idle":"foundry_stream_failed",pt(l,t)}finally{f&&ja(l,f),_.record(l),r||function(e,t,o){e&&(tc(e,o?.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()}r&&await Rs(e,t,{reason:r,progress:b})}async function lc(e,t,r){let a=performance.now(),i=Re.startActiveSpan("copilot_api.translate.anthropic_to_responses",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),ul(o,t.messages);let n=Fl(t,de.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===de.provider,promptCacheKey:"foundry"===de.provider?Ul(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return dl(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});nt.record(performance.now()-a,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",i),e.set("requestData",{model:i.model,streaming:!!i.stream}),ec(e,i,r),de.manualApprove&&await Pa();let s=performance.now(),l=new AbortController,{pending:c,capped:u}=function(e,t,o){let n=t.stream?qs():void 0;return{pending:Oi(t,{onAttempt:t=>ec(e,t,o.requestedEffort),signal:AbortSignal.any([qt(e),o.upstreamIdle.signal,...n?[n.signal]:[]])}).finally(()=>n?.clear()),capped:void 0!==n}}(e,i,{requestedEffort:r,upstreamIdle:l});if(u&&!await js(e,c,s))return function(e,t,o){let{pending:n,copilotStart:r,upstreamIdle:a}=o;return or(),ic(e,async o=>{let i=await Hs(e,o,{pending:n,start:r});i&&!Ri(i)&&await sc(e,o,{response:i,model:t.model,copilotStart:r,_d1:ac(t,r),upstreamIdle:a})})}(e,i,{pending:c,copilotStart:s,upstreamIdle:l});let p=await c,d=ac(i,s);if(Ri(p)){let t=e.get("requestData")||{};if(tc(e.get("requestSpan"),p.usage?.output_tokens_details?.reasoning_tokens),p.usage&&(t.tokenUsage=Da({prompt_tokens:p.usage.input_tokens,completion_tokens:p.usage.output_tokens,total_tokens:p.usage.total_tokens,prompt_tokens_details:p.usage.input_tokens_details})),t._d1=d,t.upstreamTtfbMs=d,t.upstreamTotalMs=d,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(p).slice(-400)),"failed"===p.status)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:p.error?.code??"api_error",message:p.error?.message??"Response generation failed"}},500);let r=performance.now(),a=Re.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","responses_to_anthropic");let t=function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:Vl(e,o),stop_sequence:null,usage:Hl(e.usage)}}(p);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return nt.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}return or(),ic(e,t=>sc(e,t,{response:p,model:i.model,copilotStart:s,_d1:d,upstreamIdle:l}))}function cc(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 uc(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function pc(e,t){let o=[];if(0===e.choices.length)return o;let n=e.choices[0],{delta:r}=n;if(t.messageStartSent||=(o.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 r.reasoning_text&&""!==r.reasoning_text&&(cc(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"thinking_delta",thinking:r.reasoning_text}})),"string"==typeof r.reasoning_opaque&&""!==r.reasoning_opaque&&(cc(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),uc(t,o)),r.content&&(uc(t,o),function(e){return!!e.contentBlockOpen&&Object.values(e.toolCalls).some(t=>t._bi1===e.contentBlockIndex)}(t)&&(o.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:r.content}})),r.tool_calls){uc(t,o);for(let e of r.tool_calls){if(e.id&&e.function?.name){t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,!1);let n=t.contentBlockIndex;t.toolCalls[e.index]={id:e.id,name:e.function.name,_bi1:n},o.push({type:"content_block_start",index:n,content_block:{type:"tool_use",id:e.id,name:e.function.name,input:{}}}),t.contentBlockOpen=!0}if(e.function?.arguments){let n=t.toolCalls[e.index];n&&o.push({type:"content_block_delta",index:n._bi1,delta:{type:"input_json_delta",partial_json:e.function.arguments}})}}}return n.finish_reason&&(uc(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:ml(n.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:"message_stop"})),o}const dc=/structured_outputs|output_config\.format/i;function mc(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&dc.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Pl({...e,model:$n},o):null}var fc=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var hc=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const gc={tavily:async function(e,t,n){let r=function(e,t){let o={query:e,max_results:t?.maxResults??5};return t?.includeDomains?.length&&(o.include_domains=t.includeDomains),t?.excludeDomains?.length&&(o.exclude_domains=t.excludeDomains),o}(t,n);o.debug("Tavily search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await gt({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(r),signal:a.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.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),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw pt(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new hc:e}finally{clearTimeout(i)}},exa:async function(e,t,n){let r=function(e,t){let o={query:e,numResults:t?.maxResults??5,contents:{text:!0}};return t?.includeDomains?.length&&(o.includeDomains=t.includeDomains),t?.excludeDomains?.length&&(o.excludeDomains=t.excludeDomains),o}(t,n);o.debug("Exa search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await gt({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(r),signal:a.signal,extraAttributes:{"exa.max_results":n?.maxResults??5,"exa.has_include_domains":!!n?.includeDomains?.length,"exa.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("exa.results_count",e.results.length),o.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw pt(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new fc:e}finally{clearTimeout(i)}}},_c=["tavily","exa"];function yc(e){return"tavily"===e||"exa"===e}function wc(){return de.webSearchProviders.length>0}async function bc(e,t){return async function(e,t,n){let{providers:r,searchFns:a=gc}=n;if(0===r.length)throw Error("No web search provider configured");let i,s=[];for(let[n,l]of r.entries())try{let n=await a[l.name](l.key,e,t);return s.length>0&&o.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),n}catch(e){i=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);n!==r.length-1&&o.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${r[n+1].name}".`)}let l=i instanceof Error?i.message:String(i);throw o.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),i instanceof Error?i:Error("All web search providers failed")}(e,t,{providers:de.webSearchProviders})}function kc(e){let t=e.tools;return!(!t||1!==t.length)&&gs(t[0])}function vc(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function xc(e,t){let o=[{type:"web_search_tool_result_error",error_code:t.errorCode??"unavailable"}];return{type:"web_search_tool_result",tool_use_id:e,content:t.searchFailed?o:t.results}}async function Tc(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.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(!n)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 r=function(e){let t=e.tools?.[0];return t&&gs(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!wc())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await bc(n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains})).map(e=>({type:"web_search_result",url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString("base64"),page_age:null}))}catch(e){o.error("Web search failed:",e),s=!0,a??="unavailable"}let l={query:n,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:o}=e,n=`srvtoolu_${vc()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...xc(n,e)}];return{id:`msg_ws_${vc()}`,type:"message",role:"assistant",model:o,content:r,stop_reason:"end_turn",stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}(l));let c=function(e){let{query:t,model:o}=e,n=`srvtoolu_${vc()}`,r=`msg_ws_${vc()}`,a=[];return a.push({type:"message_start",message:{id:r,type:"message",role:"assistant",content:[],model:o,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:n,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:xc(n,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}),B(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}async function Ac(e){if(un(de)||await $r())return null;let t=wr();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${kr()}`}},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 $c(e,t){let o=t.model;return o&&"string"==typeof o?null:Dl(e,"Model name is required and must be a string")}function Sc(e,t){let o=performance.now()-t;return et.record(o,{model:e.model,target:"chat_completions",streaming:String(!!e.stream)}),o}function Ec(e,t){return B(e,async o=>{let n=As(o);o.onAbort(()=>{n.stop(),Dt(e)});try{await t({stream:o,client:n})}finally{n.stop(),e.get("resolveStreamComplete")?.()}})}async function Oc(e,t,o){let{pending:n,capped:r,copilotStart:a}=o;if(r&&!await js(e,n,a))return function(e,t,o){let{pending:n,copilotStart:r}=o;return or(),Ec(e,async o=>{let a=await Hs(e,o,{pending:n,start:r});if(a)Rc(a)||(nr(),await Cc(e,o,{response:a,model:t.model,copilotStart:r,_d1:Sc(t,r)}));else{let t=e.get("requestId");t&&Ae.executeCompletion(t)}})}(e,t,{pending:n,copilotStart:a})}async function Cc(e,t,n){o.debug("Streaming response from service");let{stream:r,client:a}=t,{events:i,span:s,release:l}=n.response,{model:c,copilotStart:u,_d1:p}=n,d=null,m=0,f=performance.now(),h=ei(e,u),g={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{for await(let t of i){if(h(),o.debug("Raw stream event:",t),"[DONE]"===t.data)break;if(!t.data)continue;let n;try{n=JSON.parse(t.data)}catch(e){o.warn("Failed to parse streaming chunk:",t.data.slice(0,200),e);continue}if(m++,We.add(1,{model:c,endpoint_type:"anthropic"}),n.usage){d=n.usage;let t=e.get("requestData")||{};t.tokenUsage=Da(d),t._d1=p,e.set("requestData",t)}let r=pc(n,g);for(let e of r)o.debug("Translated Anthropic event:",e),await a.writeSSE({event:e.type,data:JSON.stringify(e)})}let t=performance.now()-f,n={model:c,endpoint_type:"anthropic"};if(tt.record(t,n),lt.record(m,n),ti(e,u),d){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Da(d),t._d1=p,e.set("requestData",t))}}catch(t){throw dt(s,e.get("requestSpan"),t),await za(r,t),t}finally{d&&ja(s,d),s.end(),l()}let _=e.get("requestId");_&&Ae.executeCompletion(_)}async function Ic(e){let t=await e.req.json();if(kc(t))return $c(e,t)??Tc(e,t);await Ha(de),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=$c(e,t);if(a)return a;t=function(e,t){return Js(t,de.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=jl(e,t);if(!i.ok)return i.response;t=i.payload;let s=await Ac(e);if(s)return s;if(Ua(t.model))return lc(e,t,r);if(function(e){if("foundry"!==de.provider)return fl(e);let t=de.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:fl(e)}(t.model))return async function(e,t,o){let n="foundry"===de.provider,r=n?t:Pl(t,de.models),a={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},i=r.output_config?.effort;return e.set("requestData",{model:r.model,reasoningEffort:i,effortClamped:Ls(o,i),streaming:!!r.stream}),de.manualApprove&&await Pa(),Re.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",r.model),t.setAttribute("copilot_api.streaming",!!r.stream),Ss(t,r,a.anthropicBeta);try{let o=performance.now(),i=await Es(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=mc(e,o,de.models);return r&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",r.model)),r}}),s=performance.now()-o;if(et.record(s,{model:r.model,target:"anthropic_messages",streaming:String(!!r.stream)}),!r.stream){let o=i,n=o.usage;if(n){let t={input_tokens:n.input_tokens||0,output_tokens:n.output_tokens||0,cache_read_input_tokens:n.cache_read_input_tokens||0,cache_creation_input_tokens:n.cache_creation_input_tokens||0},o=e.get("requestData")||{};o.tokenUsage=Da(Nc(t)),o._d1=s,o.upstreamTtfbMs=s,o.upstreamTotalMs=s,e.set("requestData",o)}return t.end(),e.json(o)}let{events:l,span:c,release:u}=i;return B(e,async n=>{let a=0,i=performance.now(),s={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=ei(e,o);try{try{for await(let e of l)d(),!e.data||"[DONE]"===e.data||(a++,We.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),Pc(e.data,s)&&(p=!0)),await n.writeSSE(e);let e=performance.now()-i,t={model:r.model,endpoint_type:"anthropic_messages"};tt.record(e,t),lt.record(a,t)}catch(t){throw dt(c,e.get("requestSpan"),t),await za(n,t),t}finally{if(ti(e,o),p){let t=Nc(s);ja(c,t);let o=e.get("requestData")||{};o.tokenUsage=Da(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&Ae.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw pt(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=Re.startActiveSpan("copilot_api.translate.anthropic_to_openai",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),o.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),o.setAttribute("copilot_api.translation.has_system",!!t.system),o.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let n=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));o.setAttribute("copilot_api.translation.has_thinking",n),ul(o,t.messages);let r=hl(t,de.models),a=r.messages.at(0);return dl(o,{system:"system"===a?.role&&"string"==typeof a.content?a.content:"",tools:r.tools}),r}finally{o.end()}});nt.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=Xa(c,de.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:Ls(r,u),streaming:!!c.stream});let p=performance.now();de.manualApprove&&await Pa();let{pending:d,capped:m}=function(e,t){let o=t.stream?qs():void 0;return{pending:bi(t,o&&{signal:AbortSignal.any([qt(e),o.signal])}).finally(()=>o?.clear()),capped:void 0!==o}}(e,c),f=await Oc(e,c,{pending:d,capped:m,copilotStart:p});if(f)return f;let h=await d,g=Sc(c,p);if(Rc(h)){let t=e.get("requestData")||{};h.usage&&(t.tokenUsage=Da(h.usage)),t._d1=g,t.upstreamTtfbMs=g,t.upstreamTotalMs=g,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(h).slice(-400));let r=performance.now(),a=Re.startActiveSpan("copilot_api.translate.openai_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","openai_to_anthropic");let t=function(e){let t=[],o=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let a of e.choices){let e=Sl(a.message),i=$l(a.message.content),s=El(a.message.tool_calls);t.push(...e),o.push(...i),n.push(...s),("tool_calls"===a.finish_reason||"stop"===r)&&(r=a.finish_reason)}return{id:e.id,type:"message",role:"assistant",model:e.model,content:[...t,...o,...n],stop_reason:ml(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(h);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return nt.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}return Ec(e,t=>Cc(e,t,{response:h,model:c.model,copilotStart:p,_d1:g}))}const Rc=e=>Object.hasOwn(e,"choices");function Nc(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 Pc(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.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"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}const qc=new F;qc.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&kc(t)}catch{return!1}}(e)?await Ic(e):await ar(e,"messages",Ic)}catch(t){return await Po(e,t)}});const Dc=new F;function jc(e){return Re.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Fa(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Be.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function Mc(e,t){let o=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(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=Da(o),n._d1=t._d1,t.c.set("requestData",n)}Dc.get("/",async e=>{try{de.models||await lr();let t=de.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 Po(e,t)}});const Fc=new Set(["message","function_call","function_call_output"]),Uc=new Set(["type","name","description","parameters"]);async function Hc(e){if(!e)return!1;let t=e.sources;if(t&&t.length>0)return!1;let n=e.query??e.queries?.[0];return!(!n||!wc())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await bc(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Bc(e){if(wc())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Hc(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Lc(e){if(!wc())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 Hc(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function zc(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 Fc.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Jc(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 Gc(e,t){if(0===t.size)return e;try{let o=JSON.parse(e),n=o.type;if("response.output_item.added"===n||"response.output_item.done"===n){let e=o.item;if(e&&Jc(e,t))return JSON.stringify(o)}if("response.completed"===n){let n=o.response?.output;if(!n)return e;let r=!1;for(let e of n)Jc(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Kc(e){return null!=e}function Wc(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Yc(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Vc(e){let t={model:e.model},{input:o,droppedInputTypes:n}=function(e){if(!Array.isArray(e))return{input:e,droppedInputTypes:[]};let t=new Set,o=[];for(let n of e){if(!Wc(n)){o.push(n);continue}let e=zc(n);null===e?t.add(Yc(n.type)):o.push(e)}return{input:o,droppedInputTypes:[...t]}}(e.input);void 0!==o&&(t.input=o);for(let o of["previous_response_id","prompt","conversation","instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])Kc(e[o])&&(t[o]=e[o]);let r=new Set;if(Kc(e.tools)){let o=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 o=e.type;if("web_search"===o||o.startsWith("web_search_"))return{type:e.type};let n={};for(let t of Object.keys(e))Uc.has(t)&&(n[t]=e[t]);return"custom"===n.type&&(n.type="function",t.add(n.name),n.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),n}),customToolNames:t}}(e.tools);t.tools=o.tools,r=o.customToolNames}if(Kc(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Kc(o.effort)&&(t.reasoning.effort=o.effort),Kc(o.summary)&&(t.reasoning.summary=o.summary)}if(Kc(e.text)&&"object"==typeof e.text){let o=e.text;Kc(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Xc(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Zc(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.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",n.input.length),0===t.length||n.input.length>0||Kc(n.previous_response_id)||Kc(n.prompt)||Kc(n.conversation)?null:Xc(e,`input contains no supported items: every item was dropped (unsupported item types: ${r.join(", ")}). Provide at least one message, function_call or function_call_output item, or previous_response_id, prompt or conversation.`)}async function Qc(e){await Ha(de);let t=await e.req.json();if(!Wc(t))return Xc(e,"request body must be a JSON object");let n=function(e){return"foundry"===de.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:Vc(e)}(t),{customToolNames:r}=n,a=n.payload;o.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),r.size>0&&o.debug(`Custom tools detected: ${[...r].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:jc(t)}}catch(t){if(t instanceof Ma)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=Zc(e,t.input,n);if(s)return s;let l=await qa(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),de.manualApprove&&await Pa();let c=performance.now(),u=await Oi(a,{signal:qt(e)}),p=performance.now()-c;if(et.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),eu(u))return async function(e,t,o){await Bc(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Da({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})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return B(e,async t=>{t.onAbort(()=>Dt(e));let o={value:null},n=0,i=performance.now(),s=ei(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Gc(i.data,r);s=await Lc(s);let l=s===i.data?i:{...i,data:s};We.add(1,{model:a.model,endpoint_type:"responses"}),Mc(s,{usageRef:o,c:e,_d1:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};tt.record(l,u),lt.record(n,u),ti(e,c)}catch(o){if(jt(e))return;throw dt(m,e.get("requestSpan"),o),await Ja(t,o),o}finally{o.value&&ja(m,o.value),m.end(),f()}}finally{!function(e){try{let t=e.get("requestId");t&&Ae.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}(e)}})}const eu=e=>Object.hasOwn(e,"output"),tu=new F;tu.post("/",async e=>{try{return await ar(e,"responses",Qc)}catch(t){return await Po(e,t)}});const ou=new F;ou.get("/",e=>{try{return de.showToken?e.json({token:de._t1}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return o.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const nu=new F;nu.get("/",async e=>{try{let t=await Br();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const ru=new F;function au(e,t,o){let n=function(e){if(!e)return;try{let t=JSON.parse(e),o=t.error?.message??t.message;if("string"==typeof o&&o.length>0)return ba(o).slice(0,200)}catch{}let t=ba(e).trim();return t.length>0?t.slice(0,200):void 0}(t),r=n?` (upstream: ${n})`:"";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${r}.`;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${r}.`;case 400===e:return`Model '${o}' 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${r}.`;case 413===e:return`Request too large (HTTP 413)${r}.`;case 429===e:return`Rate limited upstream (HTTP 429) — wait and retry${r}.`;case 503===e:return`Service not ready (HTTP 503) — the model catalog or Service token is still warming up. Retry in a few seconds${r}.`;case e>=500:return`Upstream error (HTTP ${e})${r}.`;default:return`Unexpected response (HTTP ${e})${r}.`}}async function iu(e={}){let t=performance.now(),o=e.model&&function(e){let t=de.models?.data.find(t=>t.id===e);return void 0!==t&&$a(t)}(e.model)?[e.model]:function(e){return e.filter(e=>$a(e)).map((e,t)=>({id:e.id,rank:Sa(e),index:t})).sort((e,t)=>e.rank-t.rank||e.index-t.index).map(e=>e.id)}(de.models?.data??[]).slice(0,3);if(0===o.length)return{ok:!1,durationMs:0,reason:"No models available — the catalog is empty (upstream /models failed at startup). Check connectivity and authentication."};let n,r=e.timeoutMs??3e4,a=()=>Math.round(performance.now()-t),i=o[0],s=!1,l=e=>(i=e,async function(e,t){try{let o=await ru.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[xa]:Ta},body:JSON.stringify({model:e,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(o.ok)return{ok:!0,model:e,status:o.status,durationMs:t()};let n=await o.text().catch(()=>"");return{ok:!1,model:e,status:o.status,durationMs:t(),reason:au(o.status,n,e),detail:n.slice(0,400)||void 0,modelUnavailable:Oa(o.status,n)}}catch(o){let n=o instanceof Error?o.message:String(o);return{ok:!1,model:e,durationMs:t(),reason:`Request failed before a usable response: ${n}`,detail:n}}}(e,a)),c=(async()=>{let e=await async function(e,t,o=()=>!1){let n,r=[];for(let a of e){if(n){if(o())break;r.push(n.model)}if(n={model:a,result:await t(a)},n.result.ok||!n.result.modelUnavailable)break}return n?{result:n.result,skipped:r}:void 0}(o,l,()=>s);if(!e)throw Error("self-test had no candidate");let{modelUnavailable:t,...n}=e.result;return e.skipped.length>0?{...n,skipped:e.skipped}:n})(),u=new Promise(e=>{n=setTimeout(()=>{s=!0,e({ok:!1,model:i,durationMs:a(),reason:`Did not complete within ${r}ms. If you started with --manual, approve the request or use --no-smoke-test; otherwise the upstream may be slow or unreachable.`})},r)});try{return await Promise.race([c,u])}finally{n&&clearTimeout(n)}}ru.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=Mt(i),l=function(e){return e===Ta}(e.req.header(xa));e.set("requestId",r),e.set("isSelfTest",l),e.header("x-request-id",r);let c=Re.startSpan("copilot_api.handle_request",{kind:u.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":r,"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,o]of Object.entries(e.req.header())){let e=t.toLowerCase();ft.has(e)||"x-copilot-api-self-test"!==e&&c.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=e.req.raw.clone(),o=new Uint8Array(await t.arrayBuffer());e.set("rawBody",(new TextDecoder).decode(o.subarray(0,1048576)))}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let m,h=new Promise(e=>{m=e});e.set("streamComplete",h),e.set("resolveStreamComplete",m);let g=f.setSpan(d.active(),c);await d.with(g,async()=>{l||Ae.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw c.setStatus({code:p.ERROR,message:t.message}),c.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:c};_?.streaming&&e.res.status<400?h.then(()=>Ra(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{c.recordException(t),c.setStatus({code:p.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{c.end()}catch{}}):Ra(y)}),ru.use(U()),ru.use(async(e,t)=>{let o=e.req.header("content-length");if(o){let t=Number(o),n=Na(e.req.path);if(Number.isFinite(t)&&t>n)return r.warn(`Rejected oversized request: ${t} bytes on ${e.req.path} (UA: ${e.req.header("user-agent")??"unknown"})`),e.json({type:"error",error:{type:"request_too_large",message:`Request body exceeds ${n/1024/1024} MB limit (got ${t} bytes).`}},413)}await t()}),ru.get("/",e=>e.text("Server running")),ru.route("/health",rs),ru.route("/chat/completions",ts),ru.route("/models",Dc),ru.route("/embeddings",ns),ru.route("/usage",nu),ru.route("/token",ou),ru.route("/v1/chat/completions",ts),ru.route("/v1/models",Dc),ru.route("/v1/embeddings",ns),ru.route("/images",cs),ru.route("/v1/images",cs),ru.route("/v1/messages",qc),ru.post("/v1/messages/count_tokens",async function(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:"invalid_request_error",message:"Invalid JSON"}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let{name:o,tokenizer:n}=await async function(e){let t=de.models?.data.find(t=>t.id===e);return!t||"Anthropic"===t.vendor||hn(t.capabilities.family)||"o200k_base"!==t.capabilities.tokenizer?{name:"claude",tokenizer:ys}:(ws??=import("ai-tokenizer/encoding/o200k_base").then(e=>new z(e)),{name:"o200k_base",tokenizer:await ws})}(t.model),r=e=>ks(n,e),a=bs.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");a+=bs.perMessage+r(e)*bs.contentMultiplier}for(let e of t.messages)a+=bs.perMessage,a+=r(e.role),"string"==typeof e.content?a+=r(e.content)*bs.contentMultiplier:Array.isArray(e.content)&&(a+=vs(e.content,r));let i=t.tools?.filter(_s);i&&i.length>0&&(a+=function(e,t){let o=bs.toolsExist;for(let[n,r]of e.entries())n>0&&(o+=bs.perTool),o+=t(r.name),r.description&&(o+=bs.perDesc+t(r.description)),o+=xs(r.input_schema,t);return o}(i,r));let s=Math.round(a);"string"==typeof t.model&&e.set("requestData",{model:t.model,streaming:!1});let l=e.get("requestSpan");return l?.setAttribute("copilot_api.count_tokens.estimate",s),l?.setAttribute("copilot_api.count_tokens.tokenizer",o),e.json({input_tokens:s})}),ru.route("/v1/responses",tu),ru.route("/responses",tu),ru.onError((e,t)=>Po(t,e));const su=e=>`[1m${e}[0m`,lu=e=>`[2m${e}[0m`,cu=e=>`[32m${e}[0m`,uu=e=>`[31m${e}[0m`,pu=e=>`[33m${e}[0m`,du=lu(" ─────────────────────────────────────────────────────────────");function mu(e,t,o){console.log(` ${function(e){return"ok"===e?cu("✓"):"warn"===e?pu("⚠"):uu("✗")}(e)} ${su(t.padEnd(14))} ${o}`)}function fu(e){console.log(` ${lu("↳")} ${lu(e)}`)}function hu(e){return e instanceof co?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function gu(){let e=y.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(Q.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 _u(){try{await lr();let e=(de.models?.data.length??0)>0;return mu(e?"ok":"warn","Model catalog",e?function(){let e=de.models?.data??[],t={Claude:0,OpenAI:0,Gemini:0,Embedding:0};for(let o of e)o.id.startsWith("text-embedding")?t.Embedding++:"Anthropic"===o.vendor?t.Claude++:"Google"===o.vendor?t.Gemini++:t.OpenAI++;let o=Object.entries(t).filter(([,e])=>e>0).map(([e,t])=>`${e}: ${t}`);return`${e.length} models (${o.join(", ")})`}():"empty"),e}catch(e){return mu("fail","Model catalog",hu(e)),fu("Could not fetch /models — check connectivity/auth."),!1}}async function yu(e){de.accountType=e.accountType;let t=await Vt(),o=Xt();if(console.log(""),console.log(` ${su("COPILOT-API DOCTOR")} ${lu(`v${t}`)}`),console.log(du),mu("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await ee(),cr(),!await async function(){let e=await gu();if(e){de._t2=e.token,mu("ok","Auth token",`found (${e.source})`);try{let e=await Do();return await Tt(de,e.login),mu("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return mu("fail","GitHub auth",hu(e)),void fu("Token looks invalid/expired. Re-run `copilot-api auth`.")}}else mu("fail","Auth token","not found"),fu("Run `copilot-api auth` (or `copilot-api start`) to authenticate.")}())return console.log(du),console.log(` ${uu("✗")} ${su("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await qo();return de._t1=e,mu("ok","Service token","acquired"),!0}catch(e){let t=e instanceof co?e.response.status:0;return mu("fail","Service token",hu(e)),fu(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}}(),r=!!n&&await _u();await async function(){try{let e=await Br(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Dr(jr(t))} of ${Dr(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;mu("ok","Copilot plan",`${e.copilot_plan} · ${o} `+lu(`(resets ${e.quota_reset_date})`))}catch(e){mu("warn","Copilot plan",`unavailable (${hu(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await iu();return e.ok?(mu("ok","Generation",`works via ${e.model} ${lu(`(${e.durationMs}ms)`)}`),!0):(mu("fail","Generation",`${e.reason}${e.status?lu(` [HTTP ${e.status}]`):""}`),!1)}():mu("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let o of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let n=y.env[o];n&&("ANTHROPIC_BASE_URL"===o&&/\/v1\/*$/.test(n)&&(t="warn",e.push(`${o}=${n} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(n)&&(t="warn",e.push(`${o}=${n} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){mu(t,"Client config","potential base-URL issue");for(let t of e)fu(t)}else mu("ok","Client config","no base-URL issues detected");fu("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(du),a?(console.log(` ${cu("✓")} ${su("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${pu("⚠")} ${su("Some checks need attention")} — see the ${uu("✗")}/${pu("⚠")} lines above.`),console.log(""),2)}const wu=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 yu({accountType:e["account-type"]});y.exit(t)}});function bu(e){return{log(t,r){let a=o.level>=n.debug;if(t.level!==n.warn||a)for(let o of e)o.log(t,r)}}}let ku=!1;const vu="copilot-api-node20",xu=`https://registry.npmjs.org/${vu}/latest`,Tu=e=>`[1m${e}[0m`,Au=e=>`[33m${e}[0m`;async function $u(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(xu,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Su(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}let Eu,Ou;async function Cu(e){try{let[t,o]=await Promise.all([Vt(),$u(e)]);return"unknown"!==t&&o&&function(e,t){let o=e.split(".").map(Number),n=t.split(".").map(Number),r=Math.max(o.length,n.length);for(let e=0;e<r;e++){let t=o[e]??0,r=n[e]??0;if(t<r)return!0;if(t>r)return!1}return!1}(t,o)?{current:t,latest:o}:null}catch{return null}}function Iu(){if(!Eu||!Ou)return;let{signal:e}=Ou;Eu.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${vu}@latest`,n=Au("│"),r=` ${Tu("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${Tu(o)} to update`,i=" ".repeat(54),s=Au(`╭${"─".repeat(54)}╮`),l=Au(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${Su(r,54)}${n}`,`${n}${i}${n}`,`${n}${Su(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var Ru={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 Nu=262144,Pu="https://barazany.dev",qu=/^[a-z0-9][a-z0-9-]*$/i,Du=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function ju(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(Du," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function Mu(e){if("object"!=typeof e||!e)return null;let t=e,o=ju(t.title,100),n=ju(t.teaser??t.excerpt??t.description,120),r=function(e){if("string"!=typeof e||e.length>2048)return null;let t;try{t=new URL(e)}catch{return null}if(t.origin!==Pu||t.username||t.password)return null;let o=t.href;return/^[\x21-\x7E]+$/.test(o)?o:null}(t.url);if(null===r&&void 0===t.url&&"string"==typeof t.slug&&qu.test(t.slug)&&(r=`${Pu}/blog/${t.slug}`),!o||!n||null===r)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:o,teaser:n,url:r,date:a}:{title:o,teaser:n,url:r}}function Fu(e){let t=e;if(!Array.isArray(e)&&"object"==typeof e&&e&&(t=e.posts),!Array.isArray(t))return[];let o=[];for(let e of t){let t=Mu(e);t&&o.push(t)}let n=e=>e.date?Date.parse(e.date):-1/0;return o.sort((e,t)=>n(t)-n(e)).slice(0,3)}let Uu=null;function Hu(e){return s.join(e,"blog-posts.json")}function Bu(e=Q.APP_DIR){try{if(Uu&&Uu.length>0)return Uu;let t=function(e){try{let t=Hu(e);return K.statSync(t).size>Nu?[]:Fu(JSON.parse(K.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Fu(Ru)}catch{return[]}}function Lu(e){return e>-6e4&&e<864e5}async function zu(e){let t=new AbortController,o=setTimeout(()=>t.abort(),e);"object"==typeof o&&"unref"in o&&o.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 o=await async function(e,t){let o=Number(e.headers.get("content-length"));if(Number.isFinite(o)&&o>Nu)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>Nu?null:t}let n=e.body.getReader(),r=()=>{n.cancel().catch(()=>{})};t.addEventListener("abort",r,{once:!0});let a=[],i=0;try{for(;;){let{done:e,value:t}=await n.read();if(e)break;if(i+=t.byteLength,i>Nu)return await n.cancel().catch(()=>{}),null;a.push(t)}}finally{t.removeEventListener("abort",r)}return t.aborted?null:Buffer.concat(a).toString("utf8")}(e,t.signal);return null===o?[]:Fu(JSON.parse(o))}finally{clearTimeout(o)}}async function Ju(e={}){try{if("1"===y.env.COPILOT_API_NO_BLOG||"1"===y.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??Q.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=Hu(e),n=await K.promises.stat(o);if(n.size<=Nu){let e=await K.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Lu(t-n.fetchedAt)}return Lu(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await zu(e.timeoutMs??3e3);if(0===n.length)return;Uu=n,await async function(e,t,o){let n=Hu(e),r=`${n}.${y.pid}.tmp`;try{await K.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await K.promises.rename(r,n)}catch(e){throw await K.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function Gu(e){let t;try{({login:t}=await Ku(e))}catch(e){return void o.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await Mn(),o.info("Copilot fallback enabled for Foundry rate limits, errors and timeouts")}catch(e){o.error("Copilot fallback disabled: could not load the Copilot model list; serving from Foundry only.",e)}return t}async function Ku(e){e._t2&&o.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,n=e._t2||process.env.GH_TOKEN;n?(function(e){de._t2=e,yr=!1}(n),o.info("Using provided Auth token")):await Er();try{t=await Do(),await Tt(de,t.login)}catch(e){throw o.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 qo();de._t1=e,o.debug("Service token fetched successfully!"),de.showToken&&o.info("Service token:",e),_r=!0,Sr(t),yt.start(),mr=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Ar(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},fr=()=>{o.debug("Network connectivity lost")},yt.on("online",mr),yt.on("offline",fr)})(),t}function Wu(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=y;if("win32"===e){try{if(_(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=o.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),r=Object.entries(e).filter(([,e])=>void 0!==e);switch(n){case"powershell":o=r.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":o=r.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":o=r.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(" ");o=r.length>0?`export ${e}`:"";break}}return o&&t?`${o}${"cmd"===n?" & ":" && "}${t}`:o||t}function Yu(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 Vu=e=>`[1m${e}[0m`,Xu=e=>`[2m${e}[0m`,Zu=e=>`[36m${e}[0m`,Qu=e=>`[32m${e}[0m`,ep=e=>`[33m${e}[0m`,tp=e=>`[4m${e}[0m`,op=(e,t)=>`]8;;${e}\\${t}]8;;\\`,np="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",rp="https://github.com/johnib/copilot-api-issues/issues",ap=Xu(" ─────────────────────────────────────────────────────────────");function ip(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function sp(e){return e&&0!==e.length?e.join("·"):"—"}function lp(e){if(0===e.length)return[];let t=["",ap,` ${Vu("BARAZANY.DEV")} ${Xu("— Recent Posts")}`,ap,""];for(let[o,n]of e.entries()){let e=`${n.url}${np}`,r=op(e,Vu(tp(`[${o+1}]`)));t.push(` ${r} ${Zu(n.title)}`,` ${Xu("→")} ${Xu(n.teaser)}`,"")}return t.push(ap,` ${op(`https://barazany.dev/blog${np}`,"barazany.dev/blog")}`,ap),t}function cp(e){let t=[];de.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):de.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearchProviders.length>0?`${e.webSearchProviders.map(e=>(e=>e&&e[0].toUpperCase()+e.slice(1))(e)).join(Xu(" → "))} ${Qu("✓")}`:Xu("off"),n=["",` ${Vu("COPILOT-API")} ${Xu(`v${e.version}`)}`,ap,` ${Xu("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Xu("User")} ${e.user} ${Xu("·")} ${e.accountType}`];return de._v1&&n.push(` ${Xu("Client")} VSCode ${de._v1}`),n.push(` ${Xu("Network")} ${t.join(Xu(" · "))}`,` ${Xu("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Xu("Clipboard")} Claude Code command ${Qu("✓")}`),n.push(ap),n}function up(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Vu("Active")}`];if(e.model){let o=de.models?.data.find(t=>t.id===e.model),n=ip(o?.capabilities.limits?.max_context_window_tokens),r=sp(o?.capabilities.supports.reasoning_effort);t.push(` ${Zu(e.model.padEnd(32))} ${Xu("ctx")} ${Vu(n.padStart(5))} ${Xu("effort")} ${Xu(r)} ${ep("← main")}`)}if(e.smallModel){let o=de.models?.data.find(t=>t.id===e.smallModel),n=ip(o?.capabilities.limits?.max_context_window_tokens),r=sp(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Xu("ctx")} ${n.padStart(5)} ${Xu("effort")} ${Xu(r)} ${ep("← small")}`)}return t}function pp(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of de.models?.data??[]){let a=r.capabilities.limits?.max_context_window_tokens,i={id:r.id,ctx:a,effort:r.capabilities.supports.reasoning_effort};r.id.startsWith("text-embedding")?n.push(i):"Anthropic"===r.vendor?e.push(i):"Google"===r.vendor?o.push(i):t.push(i)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${Vu(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Zu("●"):Xu("·"),i=n?Zu(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?ip(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${sp(r.effort)}`;t.push(` ${a} ${i} ${Xu(s)}${Xu(l)}`)}}return t}function dp(){let e=rp.replace(/^https:\/\//,""),t=op(`${rp}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",ap,` ${Vu("FOUND A BUG?")} ${Xu("— Report it on GitHub")}`,ap,"",` ${Zu("→")} ${Zu(t)}`,` ${Xu("Bug reports, feature requests, and questions welcome.")}`,"",ap]}function mp(e){if(!e.endpoints)return[];let{scheme:t,port:o,hostname:n}=e.endpoints,r=n?`${t}://${n}:${o}`:`${t}://<your-tailscale-hostname>:${o}`,a=["",ap,` ${Vu("Claude Cowork")} ${Xu("— Settings → Inference Provider")}`,ap,"",` ${Xu("Paste into")} ${Vu("inferenceGatewayBaseUrl")}${Xu(":")}`,` ${Vu(Zu(r))}`];return n||a.push("",` ${Xu("Your Tailscale hostname is shown by:")} ${Zu("tailscale status --self")}`),a.push("",` ${Xu("Docs:")} ${Zu("https://claude.com/docs/cowork/3p/installation")}`),a}function fp(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",ap,` ${Vu("HTTPS")} ${Xu("— self-signed cert")}`,ap,"",` ${Xu("Cert")} ${t}`];switch(o.push("",` ${Vu("Trust this cert")} ${Xu("(one-time setup)")}`),y.platform){case"darwin":o.push(` ${Xu("macOS:")}`,` ${Zu("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Zu(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Xu("Windows (PowerShell as Administrator):")}`,` ${Zu(`Import-Certificate -FilePath "${t}" \``)}`,` ${Zu("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Xu("Linux (Debian/Ubuntu):")}`,` ${Zu(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Zu("sudo update-ca-certificates")}`,` ${Xu("Linux (Fedora/RHEL/Arch):")}`,` ${Zu(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Zu("sudo update-ca-trust")}`);break;default:o.push(` ${Xu("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Xu("Or, for Node CLIs only (no admin needed):")}`,` ${Zu(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,ap),o}function hp(e){let t=Math.floor(e/1e3),o=Math.floor(t/3600),n=Math.floor(t%3600/60);return o>0?`${o}h ${n}m`:n>0?`${n}m`:`${t}s`}async function gp(e,t){let o=mt({config:t,startupStage:"upstream_auth"},"copilot_api"),n=Re.startSpan("copilot_api.server.startup_failed",{kind:u.INTERNAL,attributes:o}),r=function(e){let t=new Set,o=e;for(let e=0;e<=4;e++){if(!(o instanceof Error)||t.has(o))return;if(o instanceof co)return o;t.add(o),o=go(o)}}(e);r&&(n.setAttribute("http.response.status_code",r.response.status),n.setAttribute("url.full",r.response.url)),pt(n,e),n.end();let a=e instanceof Error?e.message:String(e);ut(w.ERROR,"ERROR","Server startup failed",{...o,"exception.message":zt(r&&r!==e?`${a} (cause: ${r.message})`:a)}),await Ie()}const _p=s.join(Q.APP_DIR,"certs"),yp=s.join(_p,"cert.pem"),wp=s.join(_p,"key.pem"),bp=s.join(_p,"cert.meta.json");async function kp(e){try{return await a.readFile(e,"utf8")}catch{return}}async function vp(e){let t=await kp(yp),o=await kp(wp),n=await async function(){let e=await kp(bp);if(e)try{let t=JSON.parse(e);return Array.isArray(t.hosts)&&"string"==typeof t.notAfter?t:void 0}catch{return}}();if(!t||!o||!n)return!1;let r=new Set(n.hosts);for(let t of e)if(!r.has(t))return!1;let a=Date.parse(n.notAfter);return!Number.isNaN(a)&&a-Date.now()>2592e6}function xp(e){return 0!==V(e)}async function Tp(e){await a.mkdir(_p,{recursive:!0});let t=new Date,o=new Date;o.setDate(o.getDate()+825);let n=["127.0.0.1","::1"],r=new Set(["localhost"]),i=new Set(n);for(let t of e)xp(t)?i.add(t):r.add(t);let s=[...[...r].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))],l=await X([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:o,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(yp,l.cert,{mode:420}),await a.writeFile(wp,l.private,{mode:384}),await async function(e){await a.writeFile(bp,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:yp,keyPath:wp,generated:!0}}const Ap=[],$p=Date.now();let Sp="";function Ep(){let e=async(e,t=0)=>{let n=Re.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()-$p)/1e3}});for(let t of Ap)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=op("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",ap,` ${Vu("COPILOT-API")} ${Xu(`v${e}`)} ${Xu("·")} ${hp(t)} uptime`,ap,""," Check in from time to time on",` ${Zu(o)}`,"",ap,""];console.log(n.join("\n"))}(Sp,Date.now()-$p),y.exit(t)};y.on("SIGINT",()=>e("SIGINT")),y.on("SIGTERM",()=>e("SIGTERM")),y.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),y.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}const Op=e=>e.filter(e=>xn(e)).map(e=>e.id),Cp=e=>e.filter(e=>Tn(e)).map(e=>e.id);async function Ip(e,t,n){if(!e._cc1)return!1;de.models||(o.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."),y.exit(1));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.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,Op(de.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Op(de.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:Op(de.models.data)}));let s=Wu({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:r,ANTHROPIC_SMALL_FAST_MODEL:a,NODE_EXTRA_CA_CERTS:n?.certPath},"claude");try{return h.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function Rp(e){return e._t2?"cli_arg":y.env.GH_TOKEN?"env_var":"stored"}function Np(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=Re.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:mt({config:Yu(t,{version:o,_t3:Rp(t),foundryAuth:de.foundry?.auth}),runtime:n,identity:{_u1:r.login,machineId:de.machineId,sessionId:de.sessionId,_v1:de._v1},connectivity:de.connectivity,modelsCount:de.models?.data.length??0,startupDurationMs:Date.now()-$p},"copilot_api")});if(de.models?.data)for(let e of de.models.data)a.addEvent("copilot_api.model.available",mt(e,"model"));a.end(),ut(w.INFO,"INFO","Server started",mt({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:de.models?.data.length??0,startupDurationMs:Date.now()-$p},"copilot_api"))}async function Pp(e,t){try{return await async function(e){return"foundry"===e.provider?(de.foundry=en(process.env),de.connectivity.h2=!1,de.connectivity.h2Keepalive=!1,"entra"===de.foundry.auth&&await Go(de.foundry),o.info(`Using Microsoft Foundry upstream: ${de.foundry.endpoint} (${"entra"===de.foundry.auth?"Entra ID":"API key"} auth)`),{login:("copilot"===e.fallback?await Gu(e):void 0)??"foundry"}):Ku(e)}(e)}catch(o){throw await gp(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:Rp(e)}),o}}async function qp(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[o,n]=await Promise.all([a.readFile(e,"utf8"),a.readFile(t,"utf8")]);return{cert:o,key:n,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 vp(e)){let e=await kp(yp),t=await kp(wp);if(e&&t)return{cert:e,key:t,certPath:yp,keyPath:wp,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Tp(e)}(e.httpsHosts)}}async function Dp(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=ca;try{W(t),W(n)}catch{throw o.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:n}}(e);if(Ep(),Ap.push(()=>{o.debug("Cleaning up connectivity monitor"),yt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),_r=!1,pr&&=void clearInterval(pr),mr&&=void yt.off("online",mr),fr&&=void yt.off("offline",fr),dr=void 0,hr=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),ii&&=void clearInterval(ii),si&&=void clearInterval(si);let e=[...ni.keys(),...ri];ni.clear(),ri.clear(),oi.clear(),ai=void 0;for(let t of e)li(t)&&(Xe.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await Ie()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");de.provider=t.provider,de.accountType=t.accountType,de.manualApprove=t.manual,de.rateLimitSeconds=t.rateLimit,de.rateLimitWait=t.rateLimitWait,de.showToken=t.showToken,de.timeoutMs=t.timeout,de.connectivity.timeoutMs=t.connectTimeout,de.webSearchProviders=t.webSearchProviders,de.errorReporting=function(e){let t=y.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===y.env.COPILOT_H2_KEEPALIVE||"true"===y.env.COPILOT_H2_KEEPALIVE,t=e||"1"===y.env.COPILOT_H2||"true"===y.env.COPILOT_H2;de.connectivity.h2=t,de.connectivity.h2Keepalive=e}(),await ee(),Ju().catch(()=>{}),cr();let n=await Vt();Sp=n;let r=Xt();!function(e,t){t&&(Ee=t),Se=crypto.randomUUID();let o=T({[O]:"copilot-api",[C]:e,[E]:Se}),{endpoint:n,headers:r}=Ce();$e=new S({resource:o,traceExporter:new x({url:`${n}/v1/traces`,headers:r}),metricReader:new $({exporter:new v({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new A({exporter:new k({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),$e.start()}(n,$p);let a=await Pp(t,n);await async function(){try{return await lr({refreshFallback:!1}),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,n=e instanceof Error?e.message:"Unknown error occurred",r=void 0===t?"":` (HTTP ${t})`,a="foundry"===de.provider?"Foundry":"Copilot";return o.warn(`Could not fetch model list from ${a}${r}: ${n}. 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(()=>{lr().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{lr().then(()=>o.debug("Model list refreshed successfully")).catch(e=>{o.warn("Failed to refresh model list; keeping existing cache:",e)})},e);return t.unref(),()=>{clearInterval(t)}}();Ap.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),de.connectivity.h2&&(pi(ui(At(de))),de.connectivity.h2Keepalive&&mi()),Np({options:t,version:n,runtime:r,_u1:a});let s=await qp(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await Ip(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(de.models||(o.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."),y.exit(1)),e.model){let t=Cp(de.models.data);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);r=e.model}else r=await o.prompt("Select a model to use with Codex CLI",{type:"select",options:Cp(de.models.data)});let a=Wu({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return h.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,c,s);(function(e){let t=[...cp(e),...up(e),...pp(e),...dp(),"",...lp(Bu()),...mp(e),...fp(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:o,runtime:n,user:r,clipboardCopied:a,tls:i}=e,s=i?"https":"http";return{version:o,runtime:n,user:r,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 Xr()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),Iu(),Y({fetch:ru.fetch,port:t.port,hostname:t.hostname,tls:s?{cert:s.cert,key:s.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(l,t.hostname,t.port),t.smokeTest&&"copilot"===t.provider&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await iu({model:t});if(r.ok){let t=void 0===n||["::1","127.0.0.1","localhost"].includes(n)?`Point your client at ${e}`:`Point your client at ${e} — you bound ${n}, so from another machine/container replace \`localhost\` with this host's reachable IP/hostname.`;return o.success(`Self-test passed — generation works via ${r.model} (${r.durationMs}ms). ${t}`),void(r.skipped&&o.info(` Skipped models this account cannot use: ${r.skipped.join(", ")}`))}let a=r.status?` (HTTP ${r.status})`:"";o.warn(`Self-test FAILED${a}: ${r.reason??"unknown error"}`),r.detail&&o.info(` detail: ${ba(r.detail)}`),o.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){o.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(c,t.smallModel??t.model,t.hostname)}function jp(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Mp=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"],n=void 0===t?void 0:jp(t,"--rate-limit"),r=e.timeout,a=void 0===r?pe:jp(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:jp(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],y.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??y.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!yc(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${_c.join(", ")}`);let r=n.length>0?n:_c,a=new Set,i=n.length>0,s=[];for(let e of r){if(!yc(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||y.env.TAVILY_API_KEY,exaApiKey:y.env.EXA_API_KEY,order:u}),d=(y.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d,f=function(e,t){let o=(e??t??"copilot").trim().toLowerCase();if("copilot"===o||"foundry"===o)return o;throw Error(`--provider must be "copilot" or "foundry", got: "${o}"`)}(e.provider,y.env.COPILOT_API_PROVIDER);return Dp({provider:f,fallback:jn(e.fallback,y.env.COPILOT_API_FALLBACK,f),port:jp(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:n,rateLimitWait:e.wait,_t2:e["github-token"],_cc1:e["claude-code"],codex:e.codex,model:e.model,smallModel:e["small-model"],showToken:e["show-token"],timeout:a,connectTimeout:i,webSearchProviders:p,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!m})}});ku||(ku=!0,o.setReporters([bu(o.options.reporters)]));const Fp=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(Eu||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;Ou=e,Eu=Cu(e).catch(()=>null)})(),Fp||Iu();const Up=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Ir,start:Mp,"check-usage":Gr,debug:eo,doctor:wu,"cowork-setup":ya}});await t(Up),Fp||(Ou?.abort(),Ou=void 0,Eu=void 0);export{};
|
|
2
|
+
import{defineCommand as e,runMain as t}from"citty";import r,{LogLevels as o,consola as n}from"consola";import i from"node:fs/promises";import a from"node:os";import s from"node:path";import{AsyncLocalStorage as l}from"node:async_hooks";import{ROOT_CONTEXT as c,SpanKind as u,SpanStatusCode as p,context as d,metrics as m,trace as f}from"@opentelemetry/api";import h from"clipboardy";import{execFile as g,execSync as y}from"node:child_process";import _ from"node:process";import{SeverityNumber as b,logs as w}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 I}from"@opentelemetry/semantic-conventions";import{Client as C,request as R}from"undici";import{Buffer as P}from"node:buffer";import{createHash as q,randomBytes as N,randomUUID as M}from"node:crypto";import{promisify as j,stripVTControlCharacters as D}from"node:util";import{Context as L,Hono as B}from"hono";import{cors as F}from"hono/cors";import{getHeapStatistics as U}from"node:v8";import H,{accessSync as z,readFileSync as J}from"node:fs";import{streamSSE as G}from"hono/streaming";import{events as K}from"fetch-event-stream";import{Readable as W}from"node:stream";import{Tokenizer as Y,models as V}from"ai-tokenizer";import*as X from"ai-tokenizer/encoding/claude";import{serve as Z}from"srvx";import{isIP as Q}from"node:net";import{generate as ee}from"selfsigned";const te=s.join(a.homedir(),".local","share","copilot-api"),re={APP_DIR:te,GITHUB_TOKEN_PATH:s.join(te,"github_token"),MACHINE_ID_PATH:s.join(te,"machine_id"),SESSION_ID_PATH:s.join(te,"session_id")};async function oe(){await i.mkdir(re.APP_DIR,{recursive:!0}),await ne(re.GITHUB_TOKEN_PATH),await ne(re.SESSION_ID_PATH)}async function ne(e){try{await i.access(e,i.constants.W_OK)}catch{await i.writeFile(e,""),await i.chmod(e,384)}}const ie=new l;function ae(e,t){return ie.run(e,t)}const se=()=>!0===ie.getStore()?.rerun,le=()=>!0===ie.getStore()?.inStream,ce=new l;let ue;const pe=()=>void 0!==ce.getStore(),de=()=>ce.getStore();function me(){let e=ce.getStore();e&&(e.start??=performance.now(),ue?.(e))}const fe=6e5,he={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:fe,webSearchProviders:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}};async function ge(e,t,r=process.versions){if(!r.bun||"string"==typeof e||e instanceof Uint8Array)return e;if(t?.aborted)throw e.destroy(),t.reason;let o=()=>e.destroy(t?.reason);t?.addEventListener("abort",o,{once:!0});try{let t=[];for await(let r of e)t.push(r);return P.concat(t)}catch(e){throw t?.aborted?t.reason:e}finally{t?.removeEventListener("abort",o)}}function ye(e){let[t="",r=""]=e.trim().split(/\s+/,2),o=r&&"undefined"!==r&&"null"!==r?/^(?:ghu|gho|ghp|ghs|ghr|github_pat)_/.exec(r)?.[0]??"opaque":"missing";return`${t.toLowerCase()} ${o}`}!function(e){let t=e.provider,r=e.models;Object.defineProperties(e,{provider:{get:()=>ie.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=ie.getStore();return e?e.models:r},set:e=>{r=e},enumerable:!0,configurable:!0}})}(he);const _e=" │ ",be=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()},we=(e,t)=>e.padEnd(t),ve=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ke=(e,t,r)=>` --\x3e ${we(e,4)} ${we(t,21)} ${we(r,3)}`,xe=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return we(t,22)})(e.model??"—")+we(t,8)},Te=e=>{let t=e?.inputTokens??0,r=e?.cachedTokens??0,o=e?be(Math.max(t-r,0)):"—",n=e?be(e.outputTokens??0):"—",i=r?be(r):"—";return`↑${o.padStart(5)} ⚡${i.padStart(5)} ↓${n.padStart(5)}`},Ae=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${we("—",10)}`;let r=Math.round(e.inputTokens/t*100),o=be(e.inputTokens).padStart(5),n=`${r}%`;return`ctx ${o}${n.padStart(Math.max(10-o.length,n.length+1))}`},Se=e=>{if(void 0===e.ttfbMs)return`e2e ${ve(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${ve(e.ttfbMs)} → e2e ${ve(e.e2eMs)} ${t}`},$e=e=>e?he.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,Ee=e=>({...e?.inputTokens&&{"copilot_api.input_tokens":e.inputTokens},...e?.inputTokens&&{"copilot_api.fresh_input_tokens":Math.max(e.inputTokens-(e.cachedTokens??0),0)},...e?.outputTokens&&{"copilot_api.output_tokens":e.outputTokens},...e?.cachedTokens&&{"copilot_api.cached_tokens":e.cachedTokens}}),Oe={completionCallbacks:new Map,registerCompletion(e,t,r){this.completionCallbacks.set(e,{context:t,startTime:r,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(e){let{context:t,startTime:o}=e,n=Math.round(performance.now()-o),i=t.get("requestData"),a=i?.upstreamTotalMs??i?._d1,s=(e=>[ke(e.method,e.path,e.status),xe(e),Te(e.tokenUsage),Ae(e.tokenUsage,e.maxContextTokens),Se({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(_e))({method:t.req.method,path:t.req.path,status:t.res.status.toString(),model:i?.model,reasoningEffort:i?.reasoningEffort,effortClamped:i?.effortClamped,tokenUsage:i?.tokenUsage,maxContextTokens:$e(i?.model),ttfbMs:i?.upstreamTtfbMs,e2eMs:n});r.info(s),ft(b.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:r,duration:o,upstreamTotal:n}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":o,...r?.model&&{"copilot_api.model":r.model},...r?.reasoningEffort&&{"copilot_api.reasoning_effort":r.reasoningEffort},...r?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==r?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(r.upstreamTtfbMs)},...void 0!==n&&{"copilot_api.upstream_total_ms":Math.round(n),"copilot_api.copilot_duration_ms":Math.round(n)},...Ee(r?.tokenUsage)}})({c:t,requestData:i,duration:n,upstreamTotal:a}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:o,startTime:n}=e,i=Math.round(performance.now()-n),a=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=o.get("requestData");r.error((e=>[ke(e.method,e.path,"429"),xe(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${ve(e.e2eMs)}`].join(_e))({method:o.req.method,path:o.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:a,e2eMs:i}))},logError(e,t,o){let{context:n,startTime:i}=e,a=Math.round(performance.now()-i),s=n.get("requestData");r.error((e=>{let t=ke(e.method,e.path,e.status.toString()),r=xe(e),o=e.message.replaceAll(/\s+/g," ").trim();return[t,r,(o.length>37?`${o.slice(0,36)}…`:o).padEnd(37),`e2e ${ve(e.e2eMs)}`].join(_e)})({method:n.req.method,path:n.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:o,e2eMs:a}))},cleanup(){let e=performance.now()-12e5;for(let[t,r]of this.completionCallbacks)r.startTime<e&&this.completionCallbacks.delete(t);if(this.completionCallbacks.size>1e3){let e=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),t=e.slice(0,e.length-1e3);for(let[e]of t)this.completionCallbacks.delete(e)}}};setInterval(()=>Oe.cleanup(),6e4);let Ie,Ce,Re=Date.now();const Pe={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function qe(){let e=process.env.OTEL_EXPORTER_OTLP_ENDPOINT??"https://api.honeycomb.io",t=process.env.OTEL_EXPORTER_OTLP_HEADERS?function(e){return e?Object.fromEntries(e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf("=");return-1===t?[e,""]:[decodeURIComponent(e.slice(0,t)),decodeURIComponent(e.slice(t+1))]})):{}}(process.env.OTEL_EXPORTER_OTLP_HEADERS):Pe;return{endpoint:e.replace(/\/$/,""),headers:t}}async function 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=w.getLogger("copilot-api"),Le=je.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),Be=je.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),Fe=je.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Ue=je.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),He=je.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),ze=je.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Je=je.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ge=je.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Ke=je.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),We=je.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ye=je.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Ve=je.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Xe=je.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Ze=je.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Qe=je.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),et=je.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),tt=je.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),rt=je.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),ot=je.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),nt=je.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),it=je.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),at=je.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),st=je.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),lt=je.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),ct=je.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),ut=je.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),pt=je.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),dt=je.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),mt=je.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function ft(e,t,r,o,n){let i=f.getActiveSpan()?.spanContext()??n;De.emit({severityNumber:e,severityText:t,body:r,attributes:{...o,...i&&{"trace.id":i.traceId,"span.id":i.spanId}}})}function ht(e,t,r){let o=t instanceof Error?t:Error(String(t));e.setStatus({code:p.ERROR,message:r??o.message}),e.recordException(o)}function gt(e,t,r){ht(e,r),t&&t!==e&&ht(t,r)}function yt(e,t=""){let r={};if(null==e)return r;if("object"!=typeof e)return("string"==typeof e||"number"==typeof e||"boolean"==typeof e)&&t&&(r[t]=e),r;if(Array.isArray(e))return t&&(r[t]=JSON.stringify(e)),r;for(let[o,n]of Object.entries(e)){let e=t?`${t}.${o}`:o;void 0!==n&&"function"!=typeof n&&(null===n?r[e]="null":"object"!=typeof n||Array.isArray(n)?Array.isArray(n)?r[e]=JSON.stringify(n):("string"==typeof n||"number"==typeof n||"boolean"==typeof n)&&(r[e]=n):Object.assign(r,yt(n,e)))}return r}je.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!kt.getConnectivityStats().isOnline)}),je.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(kt.getConnectivityStats().consecutiveFailures)}),je.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(he.models?.data.length??0)}),je.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(Oe.completionCallbacks.size)}),je.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-Re)/1e3)});const _t=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function bt(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 wt(e){let{spanName:t,url:r,target:o,method:n="GET",headers:i,body:a,signal:s,extraAttributes:l}=e,c=Me.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":n,"url.full":r,"copilot_api.target":o,...l}});i&&bt(c,"request",i);try{let e=await fetch(r,{method:n,headers:i,body:a,signal:s});return c.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,r)=>{let o=r.toLowerCase();_t.has(o)||e.setAttribute(`http.response.header.${o}`,t)})}(c,e),Xe.add(1,{target:o,status_code:String(e.status)}),e.ok||c.setStatus({code:p.ERROR,message:`HTTP ${e.status}`}),{response:e,span:c}}catch(e){throw ht(c,e),c.end(),e}}async function vt(e){let{spanName:t,url:r,target:o,method:n="POST",headers:i,body:a,signal:s,headersTimeout:l,bodyTimeout:c,extraAttributes:d,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,...d}});bt(f,"request",i);try{let{statusCode:e,headers:t,body:u}=await R(r,{method:n,headers:i,body:await ge(a,s),signal:s,headersTimeout:l,bodyTimeout:c,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,r]of Object.entries(t)){let t=e.toLowerCase();void 0!==r&&!_t.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(r)?r.join(", "):r)}return Xe.add(1,{target:o,status_code:String(e)}),e>=400&&f.setStatus({code:p.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:u,span:f}}catch(e){throw ht(f,e),f.end(),e}}const kt=new class extends EventTarget{isOnline=!0;lastChecked=(new Date).toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){r.debug("Starting connectivity monitor",{probeEndpoints:he.connectivity.probeEndpoints,fastInterval:he.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){r.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?he.connectivity.slowProbeInterval:he.connectivity.fastProbeInterval)+Math.random()*he.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{r.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=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(b.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(b.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,r.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?he.connectivity.slowProbeInterval:he.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*he.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:he.connectivity.jitterMaxMs>0,connectionPooling:he.connectivity.connectionPooling,dnsCache:he.connectivity.dnsCache}}},xt=()=>({"content-type":"application/json",accept:"application/json"}),Tt="0.48.1",At=`copilot-chat/${Tt}`,St=`GitHubCopilotChat/${Tt}`,$t=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${re.MACHINE_ID_PATH}_${t}`})(e);try{let e=await i.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let r=(e=>{let t=q("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(a.hostname()),t.update(e),t.update(Date.now().toString()),t.update(N(16)),t.digest("hex")})(e);return await i.writeFile(t,r),await i.chmod(t,384),r},Et=async(e,t)=>{e.machineId||=await $t(t),e.sessionId||=await(async()=>{try{let e=await i.readFile(re.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=M();return await i.writeFile(re.SESSION_ID_PATH,e),await i.chmod(re.SESSION_ID_PATH,384),e})()},Ot=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,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":At,"User-Agent":St,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":r,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":M(),"X-Request-Id":r};return t&&(o["copilot-vision-request"]="true"),o},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,i=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(i)for(let e of i.split(","))n.add(e);if(r)for(let e of r)n.add(e);return n.size>0&&(o["anthropic-beta"]=[...n].join(",")),o},Pt="https://api.github.com",qt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":At,"user-agent":St,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),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("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const Ht=32768,zt=[{regex:/Bearer\s+[\w.-]{20,}/g,mask:"Bearer ***"},{regex:/\bghu_[A-Za-z0-9]{20,}/g,mask:"ghu_***"},{regex:/\bghp_[A-Za-z0-9]{20,}/g,mask:"ghp_***"},{regex:/\bgho_[A-Za-z0-9]{20,}/g,mask:"gho_***"},{regex:/\bghs_[A-Za-z0-9]{20,}/g,mask:"ghs_***"},{regex:/\bghr_[A-Za-z0-9]{20,}/g,mask:"ghr_***"},{regex:/\bsk-[A-Za-z0-9-]{20,}/g,mask:"sk-***"},{regex:/\bhcaik_[A-Za-z0-9]{20,}/g,mask:"hcaik_***"},{regex:/\bapi-key[\x22\x27]?\s*[:=]\s*[\x22\x27]?[\w-]{20,}/gi,mask:"api-key: ***"}],Jt=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Gt(e){let t=e;for(let{regex:e,mask:r}of zt)t=t.replace(e,r);return t}const Kt=/[\w.%+#!$&*=?^~\x27-]+@[\w-]+(?:\.[\w-]+)+/g;function Wt(e){return Gt(e).replaceAll(Kt,"<redacted-email>")}const Yt=new Map;function Vt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),r=e.upstreamErrorType??"unknown",o=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${r}:${o}:${t}`}function Xt(e,t,r){let o=Gt(r),n=8*Ht,i=o.length>n,a=i?o.slice(0,n):o,s=q("sha256").update(o).digest("hex");if(a.length<=Ht)e.setAttribute(t,a),e.setAttribute(`${t}.parts`,1);else{for(let r=0;r<a.length;r+=Ht)e.setAttribute(`${t}.part_${r/Ht}`,a.slice(r,r+Ht));e.setAttribute(`${t}.parts`,Math.ceil(a.length/Ht))}e.setAttribute(`${t}.bytes`,o.length),e.setAttribute(`${t}.sha256`,s),i&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,o.length-a.length))}function Zt(e,t){let r=function(e){if(Yt.size>=1e3&&!Yt.has(e)){let e=Yt.keys().next().value;void 0!==e&&Yt.delete(e)}let t,r=(Yt.get(e)??0)+1;return Yt.set(e,r),t=r<=2?"full":3===r?"suppressed":"drop",rt.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",r),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===r)return{decision:r};if("suppressed"===r)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:r};let o=t.c.get("rawBody");o&&Xt(e,"copilot_api.incoming_request_body",o);let n=Qt(t.c.req.header());return n&&Xt(e,"copilot_api.incoming_headers",n),void 0!==t.outgoingBody&&Xt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Xt(e,"copilot_api.outgoing_headers",Qt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Xt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:r}}function Qt(e){let t={};for(let[r,o]of Object.entries(e))Jt.has(r.toLowerCase())||(t[r]=o);return JSON.stringify(t)}async function er(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await i.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function tr(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:a.platform(),arch:a.arch()}}async function rr(){try{return!!(await i.stat(re.GITHUB_TOKEN_PATH)).isFile()&&(await i.readFile(re.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function or(e){let t=await async function(){let[e,t]=await Promise.all([er(),rr()]);return{version:e,runtime:tr(),paths:{APP_DIR:re.APP_DIR,GITHUB_TOKEN_PATH:re.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){r.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const nr=e({meta:{name:"debug",description:"Print debug information about the application"},args:{json:{type:"boolean",default:!1,description:"Output debug information as JSON"}},run:({args:e})=>or({json:e.json})}),ir=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",ar=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",sr=new Set;let lr;function cr(e){if(he.errorReporting&&!(e.statusCode<500)&&!sr.has(e.signature)){if(sr.size>=1e3){let e=sr.values().next().value;void 0!==e&&sr.delete(e)}sr.add(e.signature),async function(e){lr??=er();let t=await lr,r=tr(),o=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(Wt(e.upstreamErrorMessage)).slice(0,600),n={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:o,endpointType:Ut(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${r.platform}/${r.arch}`,runtime:`${r.name}/${r.version}`,timestamp:(new Date).toISOString()},i=new AbortController,a=setTimeout(()=>i.abort(),4e3);try{await fetch(ir,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":ar},body:JSON.stringify(n),signal:i.signal})}finally{clearTimeout(a)}}(e).catch(e=>{r.debug("Error report submission failed:",e)})}}function ur(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const pr=new WeakSet;async function dr(e,{attempt:t,maxRetries:o,operation:n}){return!pe()&&(ur(e)&&t<o?(r.warn(`HTTP/2 connection error during ${n}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&pr.add(e)}(e),!1))}var mr=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,r){super(e),this.response=t,this.outgoingBody=r?.outgoingBody,this.outgoingHeaders=r?.outgoingHeaders}},fr=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function hr(e,t){return setTimeout(()=>e.abort(new fr(t)),t)}function gr(e){return e instanceof fr||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof fr}const yr=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),_r=RegExp(`\\b(?:${[...yr].join("|")})\\b`);function br(e){let{cause:t,errors:r}=e;return t instanceof Error?t:Array.isArray(r)&&r[0]instanceof Error?r[0]:void 0}function wr(e){let t=e,r=new Set([t]);for(let e=0;e<4;e++){let e=br(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=wr(e);if(t===e)return"";let r=vr(t);return` (cause: ${r?`${r}: `:""}${t.message})`}function xr(e){if(!(e instanceof Error))return!1;let{codes:t,messages:r}=function(e){let t=[],r=[],o=new Set,n=(e,i)=>{if(i>4||!(e instanceof Error)||o.has(e))return;o.add(e);let{code:a,errors:s,cause:l}=e;if("string"==typeof a&&t.push(a),r.push(e.message),Array.isArray(s))for(let e of s)n(e,i+1);n(l,i+1)};return n(e,0),{codes:t,messages:r}}(e);return!!t.some(e=>yr.has(e))||!(t.length>0)&&(!!r.some(e=>_r.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Tr(e){return e.req.path.startsWith("/v1/messages")}function Ar(e,t){if(Tr(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}const Sr=/maximum context length|exceeds the context window/i;function $r(e){let t=e.error,r={};return t&&"object"==typeof t&&("string"==typeof t.type?r.type=t.type:"string"==typeof t.code&&(r.type=t.code),"string"==typeof t.message&&(r.message=t.message)),!r.message&&"string"==typeof e.message&&(r.message=e.message),r}function Er(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",Wt(t.message)))}function Or(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=Wt(e.message)),t}function Ir(e){let{c:t,error:r,errorText:o,upstream:n}=e,i=f.getActiveSpan();if(!i)return;let a=Vt({endpointType:Ut(t.req.path),statusCode:r.response.status,upstreamErrorType:n.type,model:t.get("requestData")?.model});Zt(i,{c:t,outgoingBody:r.outgoingBody,outgoingHeaders:r.outgoingHeaders,upstreamResponseBody:o,signatureKey:a})}function Cr(e,t,r){let o=e.get("requestId"),n=Oe.completionCallbacks.get(o);n&&(Oe.logError(n,t,r),Oe.completionCallbacks.delete(o))}async function Rr(e,t){let r=f.getActiveSpan(),o=e.get("requestId"),n=Oe.completionCallbacks.get(o);n&&(Oe.logRateLimit(n,t.response),Oe.completionCallbacks.delete(o)),ze.add(1,{action:"rejected",source:"upstream"});let i=await t.response.text(),a=Ar(i,e),s=$r(a);return r?.setStatus({code:p.ERROR,message:"Rate limited by upstream"}),r?.setAttribute("copilot_api.error_type","rate_limit_upstream"),Er(r,s),ft(b.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...Or(s)}),Ir({c:e,error:t,errorText:i,upstream:s}),function(e,t){t.headers.forEach((t,r)=>{Pr.test(r)&&e.header(r,t)})}(e,t.response),e.json(a,429)}const Pr=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;async function qr(e,t){let r=f.getActiveSpan(),o=await t.response.text(),n=Ar(o,e),i=$r(n);Cr(e,t.response.status,i.message??t.message),r?.setStatus({code:p.ERROR,message:t.message}),r?.recordException(t),r?.setAttribute("copilot_api.error_type","HTTPError"),Er(r,i),ft(b.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...Or(i)}),Ir({c:e,error:t,errorText:o,upstream:i}),t.response.status>=500&&cr({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Vt({endpointType:Ut(e.req.path),statusCode:t.response.status,upstreamErrorType:i.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:i.type,upstreamErrorMessage:i.message});let a=Tr(e)?function(e){let t;try{let r=JSON.parse(e);t=r.error&&"object"==typeof r.error?r.error:r}catch{return}let r="string"==typeof t.message?t.message:"";if("context_length_exceeded"!==t.code&&"context_length_exceeded"!==t.type&&!Sr.test(r))return;let o=/maximum context length is (\d+)/i.exec(r)?.[1],n=/(?:resulted in|requested) (\d+) tokens/i.exec(r)?.[1];return{type:"error",error:{type:"invalid_request_error",message:o&&n?`prompt is too long: ${n} tokens > ${o} maximum`:`prompt is too long: ${r||"context_length_exceeded"}`}}}(o):void 0;return a?e.json(a,400):e.json(n,t.response.status)}function Nr(e,t){(function(e){return"object"==typeof e&&!!e&&pr.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",he.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function Mr(e){return xr(e)||function(e){return ur(e)||e instanceof Error&&ur(e.cause)}(e)}async function jr(e,t){return Ft(e)?(Oe.completionCallbacks.delete(e.get("requestId")),new Response(null,{status:499})):async function(e,t){if(Nr(f.getActiveSpan(),t),t instanceof mr&&429===t.response.status)return Rr(e,t);if(t instanceof SyntaxError){f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),ft(b.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let r=Tr(e)?{type:"error",error:{type:"invalid_request_error",message:"Invalid JSON in request body"}}:{error:{message:"Invalid JSON in request body",type:"invalid_request_error"}};return Cr(e,400,"Invalid JSON in request body"),e.json(r,400)}if(t instanceof mr)return qr(e,t);if(gr(t))return function(e,t){let r=f.getActiveSpan();r?.setStatus({code:p.ERROR,message:"Upstream request timed out"}),t instanceof Error&&r?.recordException(t),r?.setAttribute("copilot_api.error_type","request_timeout");let o="Upstream request timed out (gateway timeout). Increase the timeout or retry.";ft(b.ERROR,"ERROR",o,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let n=Tr(e)?{type:"error",error:{type:"api_error",message:o}}:{error:{message:o,type:"timeout_error"}};return Cr(e,504,t instanceof Error?t.message:o),e.json(n,504)}(e,t);if(Mr(t))return function(e,t){let r=f.getActiveSpan();r?.setStatus({code:p.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&r?.recordException(t),r?.setAttribute("copilot_api.error_type","transient_transport");let o=t instanceof Error?wr(t):void 0,n=(o&&vr(o))??"none",i=o?.message??String(t);r?.setAttribute("copilot_api.transport_cause_code",n),r?.setAttribute("copilot_api.transport_cause_message",i);let a="Temporary upstream connection failure. Please retry.";ft(b.WARN,"WARN",a,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":n,"copilot_api.transport_cause_message":i}),e.header("Retry-After","1");let s=Tr(e)?{type:"error",error:{type:"api_error",message:a}}:{error:{message:a,type:"service_unavailable"}};return Cr(e,503,t instanceof Error?`${t.message}${kr(t)}`:a),e.json(s,503)}(e,t);let o=f.getActiveSpan(),n=t instanceof Error?t:Error(String(t));o?.setStatus({code:p.ERROR,message:n.message}),o?.recordException(n),o?.setAttribute("copilot_api.error_type",n.name),ft(b.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)}`}),Cr(e,500,n.message),r.error(n);let i=Tr(e)?{type:"error",error:{type:"api_error",message:n.message}}:{error:{message:n.message,type:"error"}};return e.json(i,500)}(e,t)}const Dr=async()=>{let e=`${Pt}/copilot_internal/v2/token`,t=he.timeoutMs,r=new AbortController,o=setTimeout(()=>r.abort(),t);try{let{response:t,span:o}=await wt({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:qt(he),signal:r.signal});try{if(!t.ok)throw new mr("Failed to get Service token",t);return await t.json()}catch(e){throw ht(o,e),e}finally{o.end()}}finally{clearTimeout(o)}};async function Lr(){let e=`${Pt}/user`,t=he.timeoutMs,r=new AbortController,o=setTimeout(()=>r.abort(),t);try{let{response:t,span:o}=await wt({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${he._t2}`,"content-type":"application/json",accept:"application/json"},signal:r.signal});try{if(!t.ok)throw new mr("Failed to get GitHub user",t);return await t.json()}catch(e){throw ht(o,e),e}finally{o.end()}}finally{clearTimeout(o)}}const Br=3e5,Fr=12e4;let Ur,Hr,zr,Jr=null,Gr=0;function Kr(e){zr&&clearTimeout(zr),zr=setTimeout(()=>{Vr("scheduled").catch(e=>{r.warn("Foundry Entra token renewal failed; retrying:",e),Kr(3e4)})},e),zr.unref()}async function Wr(e){let t=Hr;if(!Ur||!t?.tokenScope)throw Error("Foundry Entra auth is not initialised");let r=Me.startSpan("copilot_api.foundry.entra_token",{kind:u.INTERNAL,attributes:{"copilot_api.foundry.token.trigger":e}},"upstream_401"===e?d.active():c);try{let e=await async function(e,t){let r=AbortSignal.timeout(Fr),o=new Promise((e,t)=>{r.addEventListener("abort",()=>{t(Error("Entra token request timed out after 120s"))},{once:!0})});return Promise.race([e.getToken(t,{abortSignal:r}),o])}(Ur,t.tokenScope);if(!e)throw Error(`No Entra token for scope ${t.tokenScope}`);r.setAttribute("copilot_api.foundry.token.expires_in_s",Math.round((e.expiresOnTimestamp-Date.now())/1e3)),t.bearerToken=e.token,t.bearerExpiresAt=e.expiresOnTimestamp,Gr=Date.now(),Kr(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-Br;return Math.max(t-Date.now(),3e4)}(e))}catch(e){throw ht(r,function(e){let t=e instanceof Error?e:Error(String(e)),r=D(t.message),o=`… (truncated from ${r.length} chars)`,n=Error(r.length>2e3?r.slice(0,2e3-o.length)+o:r);return n.name=t.name,n}(e)),e}finally{r.end()}}async function Yr(e,t){Hr=e,Ur=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await Wr("startup")}catch(e){throw Error("Foundry Entra ID auth: could not get a token. Run `az login` (or set FOUNDRY_API_KEY for key auth). The identity needs the 'Cognitive Services OpenAI User' role (GPT) or 'Azure AI User' (Claude) on the resource.",{cause:e})}}function Vr(e="upstream_401"){return Jr??=Wr(e).finally(()=>{Jr=null}),Jr}let Xr=null;async function Zr(e){if("foundry"===he.provider){if("entra"!==he.foundry?.auth)return!1;let t=e?.outgoingHeaders?.Authorization;return async function(e=!1,t){let o=Hr?.bearerToken;if(void 0!==t&&t!==o)return!0;let n=Hr?.bearerExpiresAt,i=void 0!==n&&n-Date.now()>Br;if(e&&i)return!1;if(Date.now()-Gr<3e4)return!0;try{return await Vr(),!0}catch(e){return r.warn("Foundry Entra token renewal after a 401 failed:",e),!1}}(await async function(e){if(!e)return!1;let t=await e.response.clone().text().catch(()=>"");return/"code"\s*:\s*"PermissionDenied"/.test(t)}(e),t?.replace(/^Bearer /,""))}return Xr||=Dr().then(({token:e})=>{he._t1=e,r.debug("Service token refreshed on upstream 401")}).finally(()=>{Xr=null}),await Xr,!0}function Qr(e,t="FOUNDRY_ENDPOINT"){let r,o=e.trim();try{r=new URL(o)}catch{throw Error(`${t} is not a valid URL: "${o}"`)}if("https:"!==r.protocol)throw Error(`${t} must use https, got: "${o}"`);let n=r.pathname.replace(/\/+$/,"").replace(/\/(?:openai|_an1)(?:\/v1)?$/i,"");return`${r.origin}${n}`}const eo=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function to(e){let t=new URL(e),r=eo.exec(t.hostname)?.[1];return r?`https://${r}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function ro(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,r]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:r||t}});return t.length>0?t:void 0}function oo(e){let t=e.FOUNDRY_ENDPOINT,r=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");let o=function(e,t){let r=e?.trim().toLowerCase();if(!r)return t?"key":"entra";if("key"!==r&&"entra"!==r)throw Error(`FOUNDRY_AUTH must be "key" or "entra", got: "${r}"`);if("key"===r&&!t)throw Error("FOUNDRY_AUTH=key requires FOUNDRY_API_KEY");return r}(e.FOUNDRY_AUTH,r),n=Qr(t),i=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:n,anthropicEndpoint:i?Qr(i,"FOUNDRY_ANTHROPIC_ENDPOINT"):to(n),auth:o,..."key"===o?{apiKey:r}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:ro(e.FOUNDRY_DEPLOYMENTS)}}const no=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},io=e=>({...no(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),ao=e=>`${e.anthropicEndpoint}/anthropic`,so=(e,t)=>({...no(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),lo=e=>"foundry"===e.provider;function co(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const uo=e=>lo(e)?(e=>`${e.endpoint}/openai/v1`)(co(e)):Ot(e),po=(e,t=!1)=>lo(e)?io(co(e)):It(e,t),mo=e=>lo(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const fo=[{pattern:/^gpt-6/,context:105e4,output:128e3},{pattern:/^gpt-5/,context:4e5,output:128e3},{pattern:/^gpt-4\.1/,context:1047576,output:32768},{pattern:/^o\d/,context:2e5,output:1e5}],ho={context:128e3,output:16384};function go(e){return fo.find(({pattern:t})=>t.test(e))??ho}const yo=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,_o=e=>/^claude/i.test(e),bo=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function wo(e,t){return{id:e.id,name:e.id,object:"model",vendor:t.vendor,version:e.model,preview:!1,model_picker_enabled:!0,supported_endpoints:t.supported_endpoints,capabilities:{family:e.model,object:"model_capabilities",type:"chat",tokenizer:"o200k_base",limits:t.limits&&{max_context_window_tokens:t.limits.context,max_output_tokens:t.limits.output},supports:{tool_calls:!0,parallel_tool_calls:!0}}}}async function vo(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,r=new AbortController,o=hr(r,he.timeoutMs);try{let{response:o,span:n}=await wt({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:io(e),signal:r.signal});try{if(!o.ok)throw new mr("Failed to list Foundry deployments",o);let e=(await o.json()).data.filter(e=>!e.status||"succeeded"===e.status).map(e=>({id:e.id,model:e.model}));return n.setAttribute("copilot_api.models_count",e.length),e}catch(e){throw ht(n,e),e}finally{n.end()}}finally{clearTimeout(o)}}async function ko(e){return{object:"list",data:(e.deployments??await vo(e)).map(e=>function(e){let{model:t}=e;if(!yo.test(t))return(e=>/embedding/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/embeddings"],capabilities:{family:t,object:"model_capabilities",type:"embeddings",tokenizer:"cl100k_base",supports:{}}}:_o(t)?wo(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):bo(t)?wo(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:go(t)}):wo(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:go(t)})}(e)).filter(e=>void 0!==e)}}const xo=()=>lo(he)&&he.foundry?ko(he.foundry):Ao(),To=async()=>{try{return await xo()}catch(e){if(e instanceof mr&&401===e.response.status){if(!await Zr(e))throw e;return xo()}throw e}},Ao=async()=>{let e=`${uo(he)}/models`,t=po(he),r=he.timeoutMs,o=new AbortController,n=hr(o,r);try{let{response:r,span:n}=await wt({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:o.signal});try{if(!r.ok)throw new mr("Failed to get models",r);let e=await r.json();return n.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw ht(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},So=e=>"embeddings"!==e.capabilities.type&&"image"!==e.capabilities.type,$o=e=>So(e)&&(e.supported_endpoints?.includes("/responses")??!0);const Eo=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],Oo="claude-haiku-4.5",Io={haiku:Oo,"sonnet-4.6":"claude-sonnet-4.6","sonnet-4.5":"claude-sonnet-4.5","sonnet-4":"claude-sonnet-4","opus-4.7":"claude-opus-4.7","opus-4.6":"claude-opus-4.6","opus-4.5":"claude-opus-4.5",opus:"claude-opus-4.5"};const Co=/^claude-/i;function Ro(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function Po(e,t){if("string"!=typeof e)return null;let r=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[o,n]=function(e){let t=e.lastIndexOf("["),r=e.lastIndexOf("]");return-1!==t&&r===e.length-1&&r>t?[e.slice(0,t),e.slice(t+1,r)]:[e,null]}(r);if(t.includes(r))return r;if(n){let e=`${o}-${n}`.replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2");if(t.includes(e))return e}let i=function(e){for(let t of Eo)if(t.pattern.test(e))return t.family;return null}(o),a=Co.test(o),s=o.replace(/-\d{8}(?::.*)?$/,""),l=n?`-${n}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of a?c:[]){let r=Ro(e);for(let e of t)if(Ro(e.replace(/-\d{8}(?::.*)?$/,""))===r)return e}return i?function(e,t,r=null){let o=Io[e];if(!o)return null;if(r){let e=`${o}-${r}`;if(t.includes(e))return e}if(t.includes(o))return o;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let o=r?`${e}-${r}`:e;if(t.includes(o))return o}return null}(i,t,n):null}const qo=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function No(e,t){if(!e||!t||0===t.length)return null;let r=function(e){return"max"===e?"xhigh":e}(e);if(t.includes(r))return r;let o=qo.get(r);if(void 0===o)return t[0]??null;let n=null,i=1/0;for(let e of t){let t=qo.get(e);if(void 0===t)continue;let r=Math.abs(t-o);r<i&&(i=r,n=e)}return n}const Mo={messages:So,responses:$o,chat:e=>So(e)&&(e.supported_endpoints?.some(e=>"/chat/completions"===e||"/responses"===e)??!0)};let jo;const Do=new Map,Lo=new Map;function Bo(e,t,r){let o=(e??t??"").trim().toLowerCase();if(""!==o&&"none"!==o){if("copilot"!==o)throw Error(`--fallback must be "copilot", got: "${o}"`);if("foundry"!==r)throw Error("--fallback copilot requires --provider foundry");return o}}async function Fo(){jo=await ae({provider:"copilot"},To)}const Uo=()=>void 0!==jo;function Ho(e,t=Date.now()){let r=Do.get(e);return void 0!==r&&(t<r||(Do.delete(e),!1))}function zo(e,t=Date.now()){return{id:Lo.get(e)?.id??0,lapsed:!Ho(e,t)}}function Jo(e,t,r={}){let o=r.now??Date.now(),n=r.sent??zo(e,o),i=Lo.get(e)??{id:0,appliedMs:0},a=Math.max(function(e,t=Date.now()){let r=e.get("retry-after-ms");if(null!==r&&Number.isFinite(Number(r))&&Number(r)>=0)return Number(r);let o=e.get("retry-after");if(null!==o){let e=Number(o);if(""!==o.trim()&&Number.isFinite(e)&&e>=0)return 1e3*e;let r=Date.parse(o);if(!Number.isNaN(r))return Math.max(0,r-t)}return 1e4}(t,o),5e3),s=n.lapsed?n.id+1:n.id;if(s>i.id){let t=Math.min(2*i.appliedMs,6e4);a=Math.max(a,t),Lo.set(e,{id:s,appliedMs:a})}else s===i.id&&i.appliedMs>0&&a>i.appliedMs&&Lo.set(e,{id:i.id,appliedMs:a});let l=Math.max(Do.get(e)??0,o+a);return Do.set(e,l),l-o}function Go(e,t){let r=Lo.get(e);r&&t.lapsed&&t.id===r.id&&Lo.set(e,{id:r.id,appliedMs:0})}function Ko(e){if(!Uo()||!lo(he)||!e.ok)return;let{headers:t}=e;return t.has("retry-after")||t.has("retry-after-ms")?Response.json({error:{message:"Foundry rate-limited this request (HTTP 200 stream with retry-after).",type:"too_many_requests",code:"rate_limit_exceeded"}},{status:429,headers:t}):void 0}const Wo=new Set([429,408,500,502,503,504]);function Yo(e,t){let r=hr(e,t),o=pe()||le()?hr(e,9e4):void 0;return{headersArrived:()=>clearTimeout(o),clear:()=>{clearTimeout(r),clearTimeout(o)}}}function Vo(e,t){if(e instanceof mr){let{status:t}=e.response;return Wo.has(t)&&void 0!==e.outgoingBody?`foundry_${t}`:void 0}if(t){if(gr(e))return"foundry_timeout";if(Mr(e))return"foundry_transport"}}const Xo={foundry_429:"rate-limited",foundry_timeout:"timed out on",foundry_transport:"could not be reached for",foundry_stream_failed:"failed the stream for",foundry_stream_idle:"went silent on"};function Zo(e,t,o){let n=Xo[t]??`returned ${t.slice(8)} for`;r.info(`Foundry ${n} ${e}; serving it from Copilot for ${Math.ceil(o/1e3)}s`)}function Qo(e,t,r){let{model:o,reason:n}=r,i=f.getActiveSpan();return i?.setAttribute("copilot_api.fallback.upstream","copilot"),i?.setAttribute("copilot_api.fallback.reason",n),i?.setAttribute("copilot_api.fallback.foundry_model",o),ae({provider:"copilot",models:jo,rerun:"breaker_open"!==n,inStream:r.inStream},()=>t(e))}const en=()=>de();!function(e){ue=e}(e=>{let t=e;t.sent=zo(t.model)});const tn=new WeakMap;async function rn(e,t,r){let o=t instanceof mr?t.response:void 0,n=Jo(e,o?.headers??new Headers,{sent:r});return await(o?.body?.cancel()),n}function on(e,t,r){let{windowMs:o,attemptStart:n}=r,i=f.getActiveSpan();i?.setAttribute("copilot_api.fallback.retry_after_ms",o),void 0!==n&&i?.setAttribute("copilot_api.fallback.foundry_attempt_ms",Math.round(performance.now()-n)),Zo(e,t,o)}function nn(e){let t=de();return void 0!==t&&tn.has(t)&&!Ft(e)}function an(){let e=de(),t=e&&tn.get(e);t&&(t.deferReset=!0)}function sn(){let e=en();e?.sent&&tn.has(e)&&Go(e.model,e.sent)}async function ln(e,t,r){let o=en(),n=o&&tn.get(o);if(!o||!n)throw Error("Not in a Foundry attempt the fallback stands behind");tn.delete(o);let{model:i}=o;return on(i,t,{windowMs:await rn(i,r,o.sent??zo(i)),attemptStart:o.start}),function(e){return ce.exit(e)}(()=>Qo(e,n.handler,{model:i,reason:t,inStream:!0}))}async function cn(e,t,r){if(!Uo()||!lo(he))return r(e);let o=await async function(e){try{let t=await e.req.json();return"string"==typeof t.model?t.model:void 0}catch{return}}(e);if(!o||!function(e,t){let r=jo?.data??[],o=r.map(e=>e.id),n=o.includes(e)?e:Po(e,o),i=r.find(e=>e.id===n);return i&&Mo[t](i)?i.id:void 0}(o,t))return r(e);if(Ho(o))return Qo(e,r,{model:o,reason:"breaker_open"});let n=zo(o),i={model:o};tn.set(i,{handler:r});try{let t=await function(e,t){return ce.run(e,t)}(i,()=>r(e)),n=i.sent,a=!0===tn.get(i)?.deferReset;return t.ok&&n&&!a&&Go(o,n),t}catch(t){let a=i.sent,s=Vo(t,void 0!==a);if(!s||(on(o,s,{windowMs:await rn(o,t,a??n),attemptStart:i.start}),Ft(e)))throw t;return Qo(e,r,{model:o,reason:s})}}const un=e=>new Promise(t=>{setTimeout(t,e)}),pn=e=>null==e;async function dn({refreshFallback:e=!0}={}){let t=await To();he.models=t,e&&Uo()&&await Fo().catch(e=>{r.warn("Failed to refresh the Copilot fallback models:",e)})}const mn=()=>{he._v1="1.140.0-insider"};var fn=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let hn,gn,yn,_n,bn,wn=!1,vn=!1,kn=!1;function xn(){return Tn()?bn:void 0}function Tn(){return void 0!==bn&&Date.now()-bn.at<6e4}function An(){return kn?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const Sn=()=>i.readFile(re.GITHUB_TOKEN_PATH,"utf8");function $n(e){let{span:t,error:o,reason:n,refreshStart:i,attempt:a}=e,s=o.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";he._t1=void 0,bn={status:s,message:l,at:Date.now()},clearInterval(hn),hn=void 0,r.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Ke.add(1,{reason:n,success:"false"}),We.add(1,{reason:n}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:p.ERROR,message:o.message}),t.recordException(o),lt.record(performance.now()-i,{reason:n}),ft(b.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":a,"copilot_api.token_refresh.terminal_status":s})}function En(e){let{span:t,error:o,reason:n,refreshStart:i,maxRetries:a}=e;he._t1=void 0,r.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=o instanceof Error?o:Error(String(o));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:p.ERROR,message:s.message}),t.recordException(s),We.add(1,{reason:n}),lt.record(performance.now()-i,{reason:n}),ft(b.ERROR,"ERROR",`Token refresh failed after ${a} attempts (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempts":a})}const On=async(e=5,t=1e3,o="scheduled")=>wn?(r.debug("Token refresh already in progress, coalescing"),gn):(wn=!0,gn=Me.startActiveSpan("copilot_api.token.refresh",async n=>{let i=performance.now();n.setAttribute("copilot_api.token_refresh.reason",o),n.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let a=1;a<=e;a++)try{n.setAttribute("copilot_api.token_refresh.attempt",a),r.debug(`Refreshing Service token (${o}, attempt ${a}/${e})`);let{token:t,refresh_in:s}=await Dr();return he._t1=t,bn=void 0,vn&&void 0===hn&&(r.info("Token refresh recovered, resuming scheduled refresh"),Cn(s)),r.debug("Service token refreshed successfully"),he.showToken&&r.info("Refreshed Service token:",t),n.setAttribute("copilot_api.token_refresh.success",!0),Ke.add(1,{reason:o,success:"true"}),lt.record(performance.now()-i,{reason:o}),void ft(b.INFO,"INFO",`Token refreshed successfully (${o})`,{"copilot_api.token_refresh.reason":o,"copilot_api.token_refresh.attempt":a})}catch(s){if(s instanceof mr&&(401===s.response.status||403===s.response.status))return void $n({span:n,error:s,reason:o,refreshStart:i,attempt:a});let l=a===e;if(r.error(`Failed to refresh Service token (attempt ${a}/${e}):`,s),Ke.add(1,{reason:o,success:"false"}),l)return void En({span:n,error:s,reason:o,refreshStart:i,maxRetries:e});let c=t*2**(a-1);r.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{n.end(),wn=!1,gn=void 0}}),gn);async function In(){return!!he._t1||!Tn()&&(void 0!==bn&&kn&&await async function(){if(gn)return;let e=(await Sn().catch(()=>{}))?.trim();e&&e!==he._t2?.trim()&&(he._t2=e,r.info("Picked up re-authenticated Auth token from disk"),he.showToken&&r.info("Auth token:",e))}(),await On(3,250,"on-demand"),!!he._t1)}function Cn(e){hn&&clearInterval(hn);let t=Math.max(1e3*(e-60),6e4);hn=setInterval(()=>{On(5,1e3,"scheduled").catch(e=>{r.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Rn(e){try{let t=await Sn();if(t&&!e?.force)return he._t2=t,kn=!0,he.showToken&&r.info("Auth token:",t),void await Pn();r.info("Authentication required");let o=await async function(){let e=new AbortController,t=he.timeoutMs,r=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${Nt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:Mt,scope:"user:email"}),signal:e.signal});if(!t.ok)throw new mr("Failed to get device code",t);return await t.json()}finally{clearTimeout(r)}}();r.debug("Device code response:",o),r.info(`Please enter the code "${o.user_code}" at ${o.verification_uri}`);try{h.writeSync(o.user_code),r.success("Code copied to clipboard — opening browser...")}catch{r.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,r=_.platform;t="darwin"===r?"open":"win32"===r?"start":"xdg-open",g(t,[e],()=>{})}catch{}}(o.verification_uri);let n=await async function(e){let t=1e3*(e.interval+1);r.debug(`Polling access token with interval of ${t}ms`),r.start("Waiting for authorization...");let o=Date.now(),n=1e3*e.expires_in;for(;;){if(Date.now()-o>=n)throw new fn("Authorization timed out — the code expired. Please run the command again.");let i=new AbortController,a=he.timeoutMs,s=setTimeout(()=>{i.abort()},a);try{let o=await fetch(`${Nt}/login/oauth/access_token`,{method:"POST",headers:xt(),body:JSON.stringify({client_id:Mt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:i.signal});if(!o.ok){await un(t),r.error("Failed to poll access token:",await o.text());continue}let n=await o.json();if(r.debug("Polling access token response:",n),n.error){if("expired_token"===n.error)throw new fn("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===n.error)throw new fn("Authorization was denied. Please run the command again and approve the request.");"authorization_pending"!==n.error&&"slow_down"!==n.error&&r.warn(`Unexpected auth error: ${n.error}`),await un(t);continue}if(n.access_token)return n.access_token;await un(t)}catch(e){if(e instanceof fn)throw e;if(e instanceof Error&&"AbortError"===e.name){r.error("Access token polling timed out"),await un(t);continue}throw e}finally{clearTimeout(s)}}}(o);await(e=>i.writeFile(re.GITHUB_TOKEN_PATH,e,{mode:384}))(n),he._t2=n,kn=!0,he.showToken&&r.info("Auth token:",n),await Pn()}catch(e){throw e instanceof mr?(r.error("Failed to get Auth token:",await e.response.json()),e):(r.error("Failed to get Auth token:",e),e)}}async function Pn(){let e=await Lr();r.success(`Authenticated as ${e.login}`)}async function qn(e){e.verbose&&(r.level=5,r.info("Verbose logging enabled")),he.showToken=e.showToken,await oe(),await Rn({force:!0}),console.log("\n Get started:\n\n $ npx copilot-api-node20@latest start --claude-code\n $ npx copilot-api-node20@latest start --codex\n\n Full docs: https://www.npmjs.com/package/copilot-api-node20\n"),process.exit(0)}const Nn=e({meta:{name:"auth",description:"Run authentication flow"},args:{verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"show-token":{type:"boolean",default:!1,description:"Show token on auth"}},run:({args:e})=>qn({verbose:e.verbose,showToken:e["show-token"]})}),Mn=.01,jn=864e5,Dn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Ln=new Intl.NumberFormat("en-US"),Bn=e=>Dn.format(e*Mn),Fn=e=>e.credits_used??e.entitlement-e.remaining,Un=(e,t,r)=>{let o=(e=>{let t=new Date(`${e}T00:00:00Z`);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-1,1))})(t),n=(r.getTime()-o.getTime())/jn;if(n<.5)return;let i=Fn(e),a=i*Mn/n,s=i>=e.entitlement;if(s||a<=0)return{usdPerDay:a,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Mn,c=new Date(o.getTime()+l/a*jn);return{usdPerDay:a,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Hn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Ln.format(Fn(e))} of ${Ln.format(e.entitlement)} used`:"n/a",zn=e=>e.padEnd(14),Jn=(e,t=new Date)=>{let r=e.quota_snapshots.premium_interactions,o=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(r.unlimited)o.push(`${zn("AI credits")}unlimited`);else{let e=Fn(r),t=r.percent_remaining;o.push(`${zn("AI credits")}${Bn(e)} / ${Bn(r.entitlement)} ${t.toFixed(1)}% left`,`${zn("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${zn("")}${Ln.format(e)} of ${Ln.format(r.entitlement)} credits`)}if(o.push("",`${zn("Chat")}${Hn(e.quota_snapshots.chat)}`,`${zn("Completions")}${Hn(e.quota_snapshots.completions)}`,"",`${zn("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/jn)))(e.quota_reset_date,t)} days)`),!r.unlimited){let n=Un(r,e.quota_reset_date,t);n&&o.push(`${zn("Burn rate")}~${Dn.format(n.usdPerDay)}/day${(e=>e.exhausted?" — allowance already exhausted":e.exhaustsOn?` — on track to exhaust ${(e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}))(e.exhaustsOn)}`:" — within allowance")(n)}`);let i=r.overage_permitted?"permitted, "+(r.overage_count>0?`${Ln.format(r.overage_count)} used`:"none used"):"not permitted";o.push(`${zn("Overage")}${i}`)}return o.join("\n")},Gn=async()=>{let e=`${Pt}/copilot_internal/user`,t=he.timeoutMs,r=new AbortController,o=setTimeout(()=>r.abort(),t);try{let{response:t,span:o}=await wt({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:qt(he),signal:r.signal});try{if(!t.ok)throw new mr("Failed to get usage",t);return await t.json()}catch(e){throw ht(o,e),e}finally{o.end()}}finally{clearTimeout(o)}},Kn=()=>_.stdout.write("[2J[H"),Wn=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Yn=async()=>{let e=await Gn();return Jn(e)},Vn=e({meta:{name:"check-usage",description:"Show current usage/quota information"},args:{watch:{alias:"w",type:"boolean",default:!1,description:"Keep running and refresh the report on an interval"},interval:{alias:"i",type:"string",default:"60",description:"Seconds between refreshes in --watch mode (min 10)"}},async run({args:e}){if(await oe(),await Rn(),!e.watch){try{r.box(await Yn())}catch(e){r.error("Failed to fetch usage:",e),_.exit(1)}_.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?r.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&r.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),o=_.stdout.isTTY,n=()=>_.exit(0);for(_.on("SIGINT",n),_.on("SIGTERM",n);;){try{let e=await Yn();o&&Kn(),r.box(e),r.log(Wn(new Date,t))}catch(e){r.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Xn=j(g);async function Zn(){let e="win32"===_.platform?"where.exe":"which";try{return await Xn(e,["tailscale"]),!0}catch{return!1}}async function Qn(){try{let{stdout:e}=await Xn("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function ei(e){return e.replace(/\.$/,"")}async function ti(){let e=await Qn();if(e?.Online)return ei(e.DNSName)}const ri=j(g),oi=e=>`[1m${e}[0m`,ni=e=>`[2m${e}[0m`,ii=e=>`[36m${e}[0m`,ai=e=>`[32m${e}[0m`,si=e=>`[31m${e}[0m`,li=e=>`[33m${e}[0m`,ci=ni(" ─────────────────────────────────────────────────────────────"),ui=s.join(re.APP_DIR,"certs","tailscale"),pi=s.join(ui,"cert.pem"),di=s.join(ui,"key.pem"),mi={certDir:ui,certPath:pi,keyPath:di};function fi(){switch(_.platform){case"darwin":return[` ${ni("Install Tailscale for macOS:")}`,` ${ii("https://tailscale.com/download/mac")}`,` ${ni("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${ni("After installing, open the Tailscale app and sign in.")}`,` ${ni("Then re-run this command.")}`].join("\n");case"linux":return[` ${ni("Install Tailscale for Linux:")}`,` ${ii("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${ii("sudo tailscale up")}`,` ${ni("or")} ${ii("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${ni("Install Tailscale for Windows:")}`,` ${ii("https://tailscale.com/download/windows")}`,"",` ${ni("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${ni("Install Tailscale:")} ${ii("https://tailscale.com/download")}`}}function hi(){let e=[` ${si("Tailscale is not running.")}`];return"darwin"===_.platform?e.push(` ${ni("Open the Tailscale app from Applications and sign in.")}`,` ${ni("Download:")} ${ii("https://tailscale.com/download/mac")}`):"win32"===_.platform?e.push(` ${ni("Open the Tailscale app and sign in.")}`,` ${ni("Download:")} ${ii("https://tailscale.com/download/windows")}`):e.push(` ${ni("Connect with:")} ${ii("sudo tailscale up")}`),e.push("",` ${ni("Then re-run this command.")}`),e.join("\n")}async function gi(){try{return await i.access(pi),await i.access(di),!0}catch{return!1}}function yi(e){console.log(""),console.log(ci),console.log(` ${oi("Claude Cowork Setup")} ${ni("— Diagnostic")}`),console.log(ci),console.log("");for(let t of function(e){let t=[];for(let[r,o]of Object.entries(e)){let e;e="ok"===o.status?ai("✅"):"missing"===o.status?si("❌"):li("❓");let n=o.detail?ni(` ${o.detail}`):"";t.push(` ${e} ${r}${n}`)}return t}(e))console.log(t);console.log("");let t=Object.values(e).filter(e=>"missing"===e.status);0===t.length?console.log(` ${ai("All checks passed.")}`):console.log(` ${si(`${t.length} issue(s).`)} Run ${ii("copilot-api cowork-setup install")} to fix.`),console.log("")}const _i={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},bi=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Zn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return yi(e),console.log(""),console.log(fi()),void console.log("");let r=await Qn();if(!r||!r.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},yi(e),console.log(hi()),void console.log("");let o=ei(r.DNSName);e["tailscale-running"]={status:"ok",detail:o};let n=await gi();e["tailscale-cert"]=n?{status:"ok",detail:pi}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},n&&(e.ready={status:"ok",detail:`https://${o}:<port>`}),yi(e)}(),_.exit(0)}}),wi=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:_i},async run({args:e}){await async function(e){if(console.log(""),console.log(ci),console.log(` ${oi("Claude Cowork Setup")} ${ni("— Install")}`),console.log(ci),console.log(""),!await Zn())return console.log(` ${si("Tailscale is not installed.")}`),console.log(""),console.log(fi()),console.log(""),console.log(` ${ni("After installing, run")} ${ii("tailscale up")} ${ni("to connect, then re-run this command.")}`),void console.log("");let t=await Qn();if(!t||!t.Online)return console.log(hi()),void console.log("");let o=ei(t.DNSName);if(console.log(` ${ni("Tailscale hostname:")} ${oi(o)}`),console.log(""),console.log(` ${oi("Generating TLS certificate via Tailscale…")}`),console.log(` ${ni("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${ii(`$ tailscale cert --cert-file ${pi} --key-file ${di} ${o}`)}`),console.log(""),e||await r.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await i.mkdir(ui,{recursive:!0}),r.start("Generating certificate (this may take a few seconds)…"),await ri("tailscale",["cert","--cert-file",pi,"--key-file",di,o]),console.log(` ${ai("✓ Certificate generated")}`)}catch(e){let t=e instanceof Error?e.message:String(e);return void r.error(`Failed to generate cert: ${t}`)}console.log(""),console.log(ci),console.log(` ${oi("Next steps")}`),console.log(ci),console.log(""),console.log(` ${oi("1.")} Start the proxy:`),console.log(` ${ii("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${oi("2.")} In Cowork ${ni("→")} Settings ${ni("→")} Inference Provider, set:`),console.log(` ${oi("inferenceGatewayBaseUrl")} = ${ii(`https://${o}:<port>`)}`),console.log(` ${ni("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${oi("3.")} Restart Cowork ${ni("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${ni("For Cowork's own configuration docs, see:")}`),console.log(` ${ii("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else r.info("Skipped.")}(e.yes),_.exit(0)}}),vi=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:_i},async run({args:e}){await async function(e){if(console.log(""),console.log(ci),console.log(` ${oi("Claude Cowork Setup")} ${ni("— Revert")}`),console.log(ci),console.log(""),await gi())if(console.log(` ${oi("Remove Tailscale cert files:")}`),console.log(` ${ni(pi)}`),console.log(` ${ni(di)}`),console.log(""),e||await r.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await i.rm(ui,{recursive:!0}),console.log(` ${ai("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);r.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${ni("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else r.info("Skipped.");else console.log(` ${ni("No Tailscale cert found. Nothing to revert.")}`),console.log("")}(e.yes),_.exit(0)}}),ki=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:bi,install:wi,revert:vi}}),xi=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Ti(e){if(!xi.test(e))return e;let t=e,r=String.fromCodePoint(27),o=t.split(r);if(o.length>1){t=o[0];for(let e=1;e<o.length;e++){let n=o[e],i=n.match(/^\[[0-9;]*[a-z]/i);t+=i?n.slice(i[0].length):r+n}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function Ai(e){return"string"==typeof e?Ti(e):Array.isArray(e)?function(e){let t;for(let r=0;r<e.length;r++){let o=e[r],n=Ai(o);!t&&n!==o&&(t=e.slice(0,r)),t?.push(n)}return t??e}(e):e&&"object"==typeof e?function(e){let t,r=Object.entries(e),o="thinking"===e.type;for(let e=0;e<r.length;e++){let[n,i]=r[e],a=!o||"thinking"!==n&&"signature"!==n?Ai(i):i;t||a===i&&"__proto__"!==n||(t=Si({},r,e)),t&&(t[n]=a)}let n=t??e;return"object"===n.type&&!("properties"in n)&&(t??=Si({},r,r.length),t.properties={}),t??e}(e):e}function Si(e,t,r){for(let o=0;o<r;o++)e[t[o][0]]=t[o][1];return e}const $i="x-copilot-api-self-test",Ei=M();const Oi=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Ii(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==e.capabilities.type&&"image"!==e.capabilities.type&&!function(e){let t=e.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e.id)}(e)&&!function(e){return"disabled"===e.policy?.state}(e)}function Ci(e){let t=2;return Oi.test(e.id)?t=0:"Anthropic"===e.vendor&&(t=1),2*t+ +!e.model_picker_enabled}const Ri=new Set(["model_not_supported","no_available_model_endpoints"]);function Pi(e,t){if(400!==e||!t)return!1;try{let e=JSON.parse(t).error?.code;return"string"==typeof e&&Ri.has(e)}catch{return!1}}const qi="function"==typeof l.snapshot?l.snapshot():e=>e(),Ni=e=>{try{return J(e,"utf8")}catch{return}},Mi=e=>({read:Ni,root:"/sys/fs/cgroup",totalMem:a.totalmem(),rss:()=>process.memoryUsage.rss(),platform:process.platform,...e}),ji=(e,t)=>Number.isFinite(e)&&e>0&&e<t?e:void 0,Di=(e,t)=>{if(!e)return;let r=RegExp(`^${t}:? +(\\d+)`,"m").exec(e);return r?Number(r[1]):void 0};const Li=(e,t)=>{let r=e.root.replace(/\/+$/,""),o=r&&(t===r||t.startsWith(`${r}/`))?t.slice(r.length):t;return((e,t)=>{let r=t.split("/").filter(e=>e&&"."!==e&&".."!==e),o=[];for(let t=r.length;t>=0;t--)o.push([e,...r.slice(0,t)].join("/"));return o})(e.mountPoint,o)};function Bi(e={}){let t,r=Mi(e),o=function(e){let t=e.read("/proc/self/cgroup")??"",r=function(e){let t={v2:{root:"/",mountPoint:e.root},v1:{root:"/",mountPoint:`${e.root}/memory`}},r={v2:!1,v1:!1};for(let o of(e.read("/proc/self/mountinfo")??"").split("\n")){let e=o.split(" "),n=e.indexOf("-");if(n<5)continue;let i={root:e[3],mountPoint:e[4]},a=e[n+1];"cgroup2"!==a||r.v2?"cgroup"===a&&!r.v1&&(e[n+3]??"").split(",").includes("memory")&&(t.v1=i,r.v1=!0):(t.v2=i,r.v2=!0)}return t}(e),o=[{source:"cgroup_v2",dirs:Li(r.v2,/^0::(.*)$/m.exec(t)?.[1]??"/"),current:"memory.current",max:"memory.max",inactive:"inactive_file"},{source:"cgroup_v1",dirs:Li(r.v1,/^\d+:(?:[^:]*,)?memory(?:,[^:]*)?:(.*)$/m.exec(t)?.[1]??"/"),current:"memory.usage_in_bytes",max:"memory.limit_in_bytes",inactive:"total_inactive_file"}];for(let t of o){let r=[];for(let o of t.dirs){let n=Number(e.read(`${o}/${t.current}`));if(!Number.isFinite(n))continue;let i=e.read(`${o}/${t.max}`)?.trim(),a=Di(e.read(`${o}/memory.stat`),t.inactive);r.push({limit:void 0===i||"max"===i?void 0:ji(Number(i),e.totalMem),used:Math.max(0,n-(a??0))})}if(r.length>0)return{source:t.source,levels:r}}}(r);for(let e of o?.levels??[])void 0!==e.limit&&(!t||e.limit-e.used<t.limitBytes-t.usedBytes)&&(t={limitBytes:e.limit,usedBytes:e.used,source:o?.source??"host"});if(t)return t;let n=r.read("/proc/meminfo"),i=Di(n,"MemTotal"),a=Di(n,"MemAvailable");return"linux"===r.platform&&i&&void 0!==a?{limitBytes:1024*i,usedBytes:Math.max(0,1024*(i-a)),source:"host"}:{limitBytes:r.totalMem,usedBytes:r.rss(),source:"rss"}}const Fi=(e,t)=>{let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?r:t};var Ui=class{level="normal";last;timer;listeners=new Set;sampleListeners=new Set;thresholds;read;intervalMs;constructor(e={}){this.thresholds=e.thresholds??{low:Fi("COPILOT_API_IMAGES_PRESSURE_LOW",.7),high:Fi("COPILOT_API_IMAGES_PRESSURE_HIGH",.8),critical:Fi("COPILOT_API_IMAGES_PRESSURE_CRITICAL",.9)},this.read=e.read??(()=>Bi()),this.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(),qi(()=>{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.usedBytes/e.limitBytes,r=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"}(r,t,this.thresholds),this.last={level:this.level,usedBytes:e.usedBytes,limitBytes:e.limitBytes,ratio:t,source:e.source},this.level!==r){let o=e=>Math.round(e/1024/1024),i=`Image memory pressure ${r} -> ${this.level}: ${o(e.usedBytes)} of ${o(e.limitBytes)} MB (${Math.round(100*t)}%, ${e.source})`;"normal"===this.level?n.info(i):n.warn(i);for(let e of this.listeners)e(this.level,r)}return this.level}};const Hi=1048576,zi=8388608,Ji=e=>((e,t=1)=>Math.ceil(1*Math.min(Math.max(e,0),104857600)+5242880*Math.max(1,Math.floor(t))))(e??16777216)+zi;var Gi=class extends Error{reason;constructor(e){super(`Image request not admitted: ${e}`),this.reason=e,this.name="AdmissionRejectedError"}},Ki=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 Gi(e))}acquire(e,t){return t?.aborted?Promise.reject(new Gi("aborted")):e>this.fullBudget?Promise.reject(new Gi("too_large")):this.paused?Promise.reject(new Gi("memory_pressure")):0===this.queue.length&&this.fits(e)?Promise.resolve(this.grant(e)):this.queue.length>=this.options.maxQueue?Promise.reject(new Gi("queue_full")):new Promise((r,o)=>{let n=()=>{let e=this.queue.indexOf(s);return-1!==e&&(this.queue.splice(e,1),s.cleanup(),this.pump(),!0)},i=setTimeout(()=>{n()&&o(new Gi("queue_timeout"))},this.options.queueTimeoutMs),a=()=>{n()&&o(new Gi("aborted"))},s={weight:e,enqueuedAt:this.now(),resolve:r,reject:o,cleanup:()=>{clearTimeout(i),t?.removeEventListener("abort",a)}};t?.addEventListener("abort",a,{once:!0}),this.queue.push(s)})}fits(e){return!(this.inFlight>=this.options.maxConcurrent)&&this.inUse+Math.max(Math.ceil(e),0)<=this.budget}pump(){for(;!this.paused&&this.queue.length>0;){let e=this.queue[0];if(!this.fits(e.weight))return;this.queue.shift(),e.cleanup(),e.resolve(this.grant(e.weight))}}grant(e){let t=Math.max(Math.ceil(e),0);return this.inUse+=t,this.inFlight+=1,new Wi(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}},Wi=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 Yi=(e,t)=>{let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?Math.floor(r):t};function Vi(e,t,r=0){let o=Yi("COPILOT_API_IMAGES_MEMORY_BUDGET_MB",0)*Hi;if(o>0)return o;let n=e-Math.max(t,209715200)-Math.max(0,r)-268435456;return Math.max(0,Math.floor(.9*n))}const Xi=e=>Vi(e.limitBytes,Math.max(e.idleRssBytes,e.rssBytes-e.imageInUseBytes),e.usedBytes-e.rssBytes);var Zi=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&&qi(()=>{this.timer=setTimeout(()=>{this.timer=void 0,this.drain()},Math.ceil((1-this.tokens)*this.intervalMs))})}take(e){return e?.aborted?Promise.reject(new Gi("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 Gi("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 Qi;function ea(){if(Qi)return Qi;let e=Bi(),t=process.memoryUsage.rss(),r=Xi({limitBytes:e.limitBytes,usedBytes:e.usedBytes,rssBytes:t,idleRssBytes:t,imageInUseBytes:0}),o=new Ki({budgetBytes:r,ceilingBytes:Vi(e.limitBytes,t),maxConcurrent:Yi("COPILOT_API_IMAGES_MAX_CONCURRENT",30),maxQueue:Yi("COPILOT_API_IMAGES_MAX_QUEUE",32),queueTimeoutMs:Yi("COPILOT_API_IMAGES_QUEUE_TIMEOUT_MS",45e3)}),i=new Ui;return i.onChange(e=>ta(o,e)),i.onSample(e=>o.setBudgetBytes(Xi({limitBytes:e.limitBytes,usedBytes:e.usedBytes,rssBytes:process.memoryUsage.rss(),idleRssBytes:t,imageInUseBytes:o.stats().inUseBytes}))),n.info(`Image admission: budget ${Math.round(r/Hi)} MB of a ${Math.round(e.limitBytes/Hi)} MB limit (${e.source})`),Qi={gate:o,monitor:i,pacer:new Zi({burst:Yi("COPILOT_API_IMAGES_START_BURST",30),intervalMs:Yi("COPILOT_API_IMAGES_START_RATE",400)})},i.start(),ta(o,i.current),Qi}function ta(e,t){"critical"===t?(e.setPaused(!0),e.failQueued("memory_pressure"),e.setBudgetScale(.5)):(e.setBudgetScale(1),e.setPaused("high"===t))}let ra;function oa(e){let{heapUsed:t,rss:r,external:o,arrayBuffers:n}=process.memoryUsage();ra??=U().heap_size_limit,e.setAttribute("copilot_api.process.heap_used_bytes",t),e.setAttribute("copilot_api.process.rss_bytes",r),e.setAttribute("copilot_api.process.external_bytes",o),e.setAttribute("copilot_api.process.array_buffers_bytes",n);let i=Qi?.monitor.lastSample;i&&(e.setAttribute("copilot_api.process.memory_pressure",i.level),("cgroup_v2"===i.source||"cgroup_v1"===i.source)&&e.setAttribute("copilot_api.process.cgroup_working_set_bytes",i.usedBytes)),e.setAttribute("copilot_api.process.heap_limit_bytes",ra),e.setAttribute("copilot_api.process.uptime_s",Math.round(process.uptime()))}function na(e){try{!function(e){let{c:t,start:r,span:o}=e,n=t.get("requestData"),i=t.res.status,a=n?.model??"unknown",s=n?.streaming??!1,l=Math.round(performance.now()-r);if(o.setAttribute("http.status_code",i),o.setAttribute("copilot_api.model",a),o.setAttribute("copilot_api.streaming",s),o.setAttribute("copilot_api.duration_ms",l),oa(o),n?._d1&&o.setAttribute("copilot_api.copilot_duration_ms",n._d1),n?.tokenUsage){let e=n.tokenUsage;o.setAttribute("copilot_api.input_tokens",e.inputTokens),o.setAttribute("copilot_api.output_tokens",e.outputTokens),o.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&o.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let r=t.toLowerCase();_t.has(r)||o.setAttribute(`http.response.header.${r}`,e)}),i>=400&&o.setStatus({code:p.ERROR,message:`HTTP ${i}`})}(e)}catch(e){r.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:r,method:o,path:n,endpointType:i,requestId:a}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-r),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:o,path:n,status_code:String(c),model:u,streaming:String(p),endpoint_type:i};if(Le.add(1,d),ot.record(s,d),c>=400&&Be.add(1,{method:o,path:n,status_code:String(c),error_type:c>=500?"server_error":"client_error"}),l?.tokenUsage){let e=l.tokenUsage,t={model:u,endpoint_type:i};e.inputTokens&&(Fe.add(e.inputTokens,t),ut.record(e.inputTokens,t)),e.outputTokens&&(Ue.add(e.outputTokens,t),pt.record(e.outputTokens,t)),e.cachedTokens&&He.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&Oe.executeCompletion(a)}(e)}catch(e){r.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}Oe.completionCallbacks.delete(e.requestId)}const ia=3e4,aa=12e4,sa=new WeakMap,la=(e,t)=>{if(!e)return Promise.resolve();let r=sa.get(e);return r||(r=ca(e,t),sa.set(e,r)),r},ca=async(e,{read:t,limit:r,declared:o,deadline:n=performance.now()+aa})=>{let i=t;try{for(;;){let t=Math.min(ia,n-performance.now());if(t<=0||i>r||void 0!==o&&i>o)return void await ua(e);let a=await pa(e,t);if("timeout"===a)return void await ua(e);if(a.done)return;i+=a.value.byteLength}}catch{}},ua=async e=>{let t;try{await Promise.race([e.cancel().catch(()=>{}),new Promise(e=>{t=setTimeout(e,1e3)})])}finally{clearTimeout(t)}},pa=async(e,t)=>{let r;try{return await Promise.race([e.read(),new Promise(e=>{r=setTimeout(()=>e("timeout"),t)})])}finally{clearTimeout(r)}},da=(e,t,r)=>{let{body:o}=e;o&&!o.locked&&la(o.getReader(),{read:0,limit:t,declared:r})},ma=e=>e.includes("/images/edits")?104857600:33554432,fa=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})}),ha=async e=>{if(!se())return Me.startActiveSpan("copilot_api.approval.await",async t=>{let o=performance.now();try{let n,i=r.prompt("Accept incoming request?",{type:"confirm"});try{n=await Promise.race([i,fa(e)])}catch(r){throw e?.aborted&&(t.setAttribute("copilot_api.approval.result","aborted"),Qe.add(1,{result:"aborted"})),r}let a=performance.now()-o;if(t.setAttribute("copilot_api.approval.wait_duration_ms",a),mt.record(a),!n)throw t.setAttribute("copilot_api.approval.result","rejected"),Qe.add(1,{result:"rejected"}),new mr("Request rejected",Response.json({message:"Request rejected"},{status:403}));t.setAttribute("copilot_api.approval.result","approved"),Qe.add(1,{result:"approved"})}finally{t.end()}})};async function ga(e){if(mo(he)||await In())return null;let t=xn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${An()}`,type:"authentication_error"}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function ya(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 _a(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 ba=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function wa(e){if(!e||"string"!=typeof e)throw new ba("Model name is required and must be a string");if("foundry"===he.provider)return e;if(!he.models?.data)throw new ba("Models not available. Please try again later.",503);let t=he.models.data.map(e=>e.id);if(t.includes(e))return e;let r=Po(e,t);if(!r)throw Je.add(1,{requested_model:e}),new ba(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return r}function va(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?bo(e):/gpt-[\d.]+-codex/i.test(e)}async function ka(e){if(void 0===e.rateLimitSeconds||se())return;let t=e.rateLimitSeconds;return Me.startActiveSpan("copilot_api.rate_limit.check",async o=>{try{let n=Date.now();if(o.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=n,void o.setAttribute("copilot_api.rate_limit.action","allowed");let i=(n-e.lastRequestTimestamp)/1e3;if(o.setAttribute("copilot_api.rate_limit.elapsed_seconds",i),i>t)return e.lastRequestTimestamp=n,void o.setAttribute("copilot_api.rate_limit.action","allowed");let a=Math.ceil(t-i);if(o.setAttribute("copilot_api.rate_limit.wait_seconds",a),!e.rateLimitWait)throw o.setAttribute("copilot_api.rate_limit.action","rejected"),ze.add(1,{action:"rejected",source:"local"}),r.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new mr("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*a;o.setAttribute("copilot_api.rate_limit.action","waited"),ze.add(1,{action:"waited",source:"local"}),at.record(s,{source:"local"}),r.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await un(s),e.lastRequestTimestamp=n,r.info("Rate limit wait completed, proceeding with request")}finally{o.end()}})}var xa=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Ta(e){if(e instanceof xa)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 Aa(e,t){let{type:o,message:n}=Ta(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 Sa(e,t){let{type:o,message:n}=Ta(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 $a(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 Ea(e,t,r){return Math.min(Math.max(e,t),r)}function Oa(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 Oa(JSON.parse(n),t+1)}catch{return null}}function Ia(e,t){let r=e?.data.find(e=>e.id===t);if(!r)return null;let o=$a(r.capabilities.supports.min_thinking_budget),n=$a(r.capabilities.supports.max_thinking_budget);return!o||!n||n<=o?null:{bounds:{min:o,max:n-1},maxOutputTokens:$a(r.capabilities.limits?.max_output_tokens)??void 0}}function Ca(e){let{config:t}=e,r=t.bounds.min,o=t.bounds.max,n=Ea($a(e.requestedBudget)??r,r,o),i=$a(e.maxTokens);if(i||=n+1,t.maxOutputTokens&&i>t.maxOutputTokens&&(i=t.maxOutputTokens),i<=n){let e=Math.min(n,i-1);if(e>=r)n=e;else{let e=r+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:i};i=e,n=r}}return i<=n?{thinkingBudget:null,maxTokens:i}:{thinkingBudget:n,maxTokens:i}}function Ra(e,t){if(pn(e.thinking_budget))return e;let r=Ia(t,e.model);if(!r)return{...e,thinking_budget:void 0};let o=Ca({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 Pa(e){return"invalid_thinking_budget"===Oa(e)}async function qa(e){let{payload:t,error:r,models:o,errorBodyText:n}=e;if(pn(t.thinking_budget)||!(r instanceof Error))return null;let i,a,s=r;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==n)i=n;else try{i=await s.response.clone().text()}catch{return null}try{a=JSON.parse(i)}catch{return null}if(!Pa(a))return null;let l=Ia(o,t.model);return l?function(e,t){let r=Ca({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=$a(e.thinking_budget);if(n&&n===r.thinkingBudget){let e=o+1;e<=t.bounds.max&&(!r.maxTokens||e<r.maxTokens)&&(o=e)}let i=r.maxTokens;if((!i||i<=o)&&(i=o+1),t.maxOutputTokens&&i>t.maxOutputTokens){if(!(t.maxOutputTokens>o))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};i=t.maxOutputTokens}return{...e,max_tokens:i,thinking_budget:o}}(t,l):{...t,thinking_budget:void 0}}function Na(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 Ma(e,t){let r=e.get("requestData")||{};r.upstreamTotalMs=performance.now()-t,r._d1=r.upstreamTotalMs,e.set("requestData",r)}const ja=new Map,Da=new Map,La=new Set;let Ba,Fa,Ua;function Ha(e){return!e.closed&&!e.destroyed}function za(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 ja.set(t,Date.now()),tt.add(1,{event:"created",origin:e}),ft(b.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{r.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{r.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(o,n,i)=>{r.debug(`HTTP/2 client disconnected from ${e}:`,i.message);let a=La.has(t);tt.add(1,{event:"goaway",origin:e}),ft(a?b.WARN:b.DEBUG,a?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${i.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":i.message}),Da.delete(t),La.delete(t),ja.delete(t),Ha(t)&&t.close().catch(e=>{r.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Ja(e,t){if(!he.connectivity.h2)return;if(Ba&&Ba!==e&&function(){for(let e of[...Da.keys(),...La])Ha(e)&&e.close().catch(e=>{r.debug("Error closing HTTP/2 pool entry:",e)});Da.clear(),La.clear(),ja.clear()}(),Ba=e,t?.fresh){let t=za(e);return La.add(t),t}let o=Date.now();for(let[t]of Da)if(o-(ja.get(t)??0)>=6e5)Da.delete(t),ja.delete(t),Ha(t)&&t.close().catch(e=>{r.debug("Error closing rotated HTTP/2 client:",e)}),tt.add(1,{event:"rotated",origin:e}),ft(b.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Ha(t))return Da.delete(t),La.add(t),t;Da.delete(t),ja.delete(t)}let n=za(e);return La.add(n),n}function Ga(e){e&&La.delete(e)&&(Ha(e)?Da.set(e,Date.now()):ja.delete(e))}function Ka(){Ua||(Ua=setInterval(()=>{!function(){let e=Date.now(),t=he.connectivity.h2Keepalive,o=Da.size;for(let[n,i]of Da)e-i<6e4||t&&o<=1||(Da.delete(n),ja.delete(n),o--,Ha(n)&&n.close().catch(e=>{r.debug("Error closing idle HTTP/2 client:",e)}),tt.add(1,{event:"idle_reaped",origin:Ba??""}),ft(b.INFO,"INFO",`HTTP/2 idle connection reaped for ${Ba}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Ba??""}))}()},3e4),Ua.unref())}function Wa(){Fa||(r.debug("Starting HTTP/2 keepalive (every 45s)"),Fa=setInterval(()=>{(async function(){if(0===Da.size&&0===La.size){if(Ba){let e=za(Ba);Da.set(e,Date.now())}return}let e=[...Da.keys()];for(let t of e)Da.delete(t);await Promise.allSettled(e.map(async e=>{if(Ha(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}`),Da.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:Ba??""}),ja.delete(e),Ha(e)&&e.close().catch(e=>{r.debug("Error closing broken HTTP/2 client:",e)})}else ja.delete(e)}))})().catch(e=>{r.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Fa.unref(),Ka())}function Ya(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*Va(e,t){try{yield*K(e)}finally{Xa(t)}}function Xa(e){e instanceof ReadableStream||e.destroyed||(e.on("error",()=>{}),e.destroy())}function Za(e){return e.max_completion_tokens??e.max_tokens}async function Qa(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&&_a(t,o.usage),o}catch(e){throw ht(t,e),e}finally{t.end()}}const es=e=>lo(he)?e:function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...r}=e;return null==t?r:{...r,max_tokens:t}}let{max_tokens:r,max_completion_tokens:o,stop:n,...i}=e,a=Za(e);return null==a?i:{...i,max_completion_tokens:a}}(e,he.models),ts=e=>lo(he)?e:Ai(e),rs=async(e,t)=>{let o=ts(e),n=t?.signal;try{return await is(o,n)}catch(e){if(e instanceof mr&&401===e.response.status){if(!await Zr(e))throw e;return is(o,n)}let t;if(e instanceof mr)try{t=await e.response.clone().text()}catch{t=void 0}let i=await qa({payload:o,error:e,models:he.models,errorBodyText:t});if(i)return e instanceof mr&&void 0!==t&&r.warn(`Upstream rejected thinking_budget (status ${e.response.status}): ${t.slice(0,500)}`),r.warn("Adjusting thinking_budget payload and retrying once..."),await is(ts(i),n);throw e}},os=async(e,t)=>{let r=Ko(e);return r?(t.setAttribute("copilot_api.foundry.throttled_stream",!0),t.setAttribute("copilot_api.upstream.effective_status",429),t.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(e.body?.cancel()),t.end(),r):(e.ok||t.end(),e.ok?void 0:e)};function ns(e,t){let r=()=>t.abort(e?.reason);return e?.aborted?r():e?.addEventListener("abort",r,{once:!0}),()=>e?.removeEventListener("abort",r)}async function is(e,t){if(!mo(he))throw Error("Service token not found");let r=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),o=e.messages.some(e=>["assistant","tool"].includes(e.role)),n={...po(he,r),"X-Initiator":o?"agent":"user"},i=uo(he),a=`${i}/chat/completions`,s=he.timeoutMs,l=es(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":Za(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=Ja(i,{fresh:r>0}),l=new AbortController,p=Yo(l,s),d=ns(t,l);try{let{statusCode:t,headers:i,body:d,span:m}=await vt({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:c,signal:l.signal,headersTimeout:s,bodyTimeout:3*s,extraAttributes:{...u,"copilot_api.h2.retry_attempt":r},dispatcher:o}).finally(p.headersArrived),f=Ya(d,{status:t,headers:i});if(e.stream){let e=await os(f,m);if(e)throw new mr("Failed to create chat completions",e,{outgoingBody:c,outgoingHeaders:n});return{events:Va(f,d),span:m,release:()=>Ga(o)}}try{return await Qa(f,m,{outgoingBody:c,outgoingHeaders:n})}finally{Ga(o)}}catch(e){if(Ga(o),await dr(e,{attempt:r,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{p.clear(),d()}}throw Error("Unexpected: exhausted GOAWAY retries without result")}const as=new Map;const ss=["none","minimal","low","medium","high","xhigh","max"];function ls(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=ss.indexOf(e);if(-1===r)return t[0];let o,n=1/0;for(let e of t){let t=ss.indexOf(e);if(-1===t)continue;let i=Math.abs(t-r);i<n&&(n=i,o=e)}return o??t[0]}(r,t);return o&&o!==r?{...e,reasoning:{...e.reasoning,effort:o}}:e}function cs(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:[];as.set(e.model,n);let i=ls(e,n);return i===e?null:(r.debug(`Foundry rejected reasoning.effort=${e.reasoning.effort} on ${e.model}; retrying with ${i.reasoning?.effort??"no reasoning"}`),i)}async function us(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&&_a(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 ps=async(e,t)=>{let r=lo(he),o=r?function(e){let t=as.get(e.model);return t?ls(e,t):e}(e):e,n=!1,i=!1;for(;;)try{return t?.onAttempt?.(o),await ms(o,t?.signal)}catch(e){if(!(e instanceof mr))throw e;if(401===e.response.status&&!n){if(n=!0,!await Zr(e))throw e;continue}if(r&&400===e.response.status&&!i){i=!0;let t=cs(o,await e.response.clone().text().catch(()=>{}));if(t){o=t;continue}}throw e}};function ds(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 ms=async(e,t)=>{if(!mo(he))throw Error("Service token not found");let r=lo(he)?e:Ai(e),o={...po(he),"X-Initiator":"agent"},n=uo(he),i=`${n}/responses`,a=he.timeoutMs,s=JSON.stringify(r),l=((e,t)=>({"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":t,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.max_output_tokens":e.max_output_tokens??0,"copilot_api.api_type":"responses","copilot_api.upstream.provider":he.provider}))(r,a);for(let e=0;e<=1;e++){me();let c=Ja(n,{fresh:e>0}),u=new AbortController,d=Yo(u,a),m=ds(t,u);try{let{statusCode:t,headers:n,body:f,span:h}=await vt({spanName:"copilot POST /responses",url:i,target:"responses",headers:o,body:s,signal:u.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:c}).finally(d.headersArrived);m.attach(f);let g=Ya(f,{status:t,headers:n});if(r.stream){let e=Ko(g);if(e&&(h.setAttribute("copilot_api.foundry.throttled_stream",!0),h.setAttribute("copilot_api.upstream.effective_status",429),h.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(g.body?.cancel())),!g.ok||e)throw h.end(),new mr("Failed to create responses",e??g,{outgoingBody:s,outgoingHeaders:o});return{events:Va(g,f),span:h,release:()=>{m.dispose(),Ga(c)}}}try{return await us(g,h,{outgoingBody:s,outgoingHeaders:o})}finally{m.dispose(),Ga(c)}}catch(t){if(m.dispose(),Ga(c),await dr(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{d.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},fs=e=>Object.hasOwn(e,"output");function hs(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 gs=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,r=null){super(e),this.code=t,this.param=r}};const ys=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 gs(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new gs(`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=>ws(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=vs(r.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=ws(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:ws(r.content)})}return t}(e.messages);if(0===r.length)throw new gs("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),bs(e.temperature)&&(o.temperature=e.temperature),bs(e.top_p)&&(o.top_p=e.top_p),bs(e.parallel_tool_calls)&&(o.parallel_tool_calls=e.parallel_tool_calls),bs(e.user)&&(o.user=e.user),e.reasoning_effort&&(o.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(o.tools=e.tools.filter(e=>"function"===e.type).map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters}))),e.tool_choice&&(o.tool_choice="string"==typeof e.tool_choice?e.tool_choice:{type:"function",name:e.tool_choice.function.name});let i=function(e){if(e)switch(e.type){case"json_schema":{let{name:t,description:r,schema:o,strict:n}=e.json_schema;return{type:"json_schema",name:t,description:r,schema:o,strict:n}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return i&&(o.text={format:i}),o}function bs(e){return null!=e}function ws(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function vs(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 gs(`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 ks(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 xs(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 Ts(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 As(e,t,r){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(r)}function Ss(e,t){let r=e.item;if("function_call"!==r.type)return[];let o="response.output_item.done"===e.type,n=As(t,r.id,e.output_index);if(void 0!==n)return o&&!t.toolCallsWithArgs.has(n)&&r.arguments?(t.toolCallsWithArgs.add(n),[Ts(t,{tool_calls:[{index:n,function:{arguments:r.arguments}}]})]):[];let i=function(e,t,r){let o=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,o),e.toolCallIndexByOutputIndex.set(r,o),o}(t,r.id,e.output_index),a=o?r.arguments:"";return a&&t.toolCallsWithArgs.add(i),[Ts(t,{tool_calls:[{index:i,id:r.call_id,type:"function",function:{name:r.name,arguments:a}}]})]}function $s(e,t){let r=[Ts(e,{},xs(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:o,...n}=ks(t.usage);r.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:n})}return r}function Es(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:[Ts(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Ss(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let r=As(t,e.item_id,e.output_index);return void 0!==r&&e.delta?(t.toolCallsWithArgs.add(r),{chunks:[Ts(t,{tool_calls:[{index:r,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:$s(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 Os="openai_responses";function Is(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])=>!ys.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 Cs(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:xs(e,o.length>0)}]};return e.usage&&(n.usage=ks(e.usage)),n}(e)}finally{t.end()}});return st.record(performance.now()-t,{direction:"responses_to_openai"}),r}function Rs(e,t,n){let i=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...r}=ks(t.usage);i.tokenUsage=ya(r)}return i._d1=n,i.upstreamTtfbMs=n,i.upstreamTotalMs=n,e.set("requestData",i),r.level>=o.debug&&r.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(Cs(t))}async function Ps(e,t,o){let n;try{n=Is(t)}catch(t){if(t instanceof gs)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 ha();let i=await ga(e);if(i)return i;let a=performance.now(),s=await ps(n),l=performance.now()-a;if(nt.record(l,{model:n.model,target:"responses",streaming:String(!!n.stream)}),fs(s))return Rs(e,s,l);let{events:c,span:u,release:p}=s,d=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:n.model,includeUsage:!0===t.stream_options?.include_usage});return G(e,async t=>{let o=null,i=0,s=performance.now(),m=Na(e,a);try{try{for await(let a of c){if(m(),!a.data||"[DONE]"===a.data)continue;let s;try{s=JSON.parse(a.data)}catch(e){r.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}i++,Ze.add(1,{model:n.model,endpoint_type:Os});let c=hs(s);if(c){o=c;let t=e.get("requestData")||{};t.tokenUsage=ya(c),t._d1=l,e.set("requestData",t)}let u=Es(s,d);if(u.error)throw new xa(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:Os};it.record(performance.now()-s,u),dt.record(i,u),Ma(e,a)}catch(r){throw gt(u,e.get("requestSpan"),r),await Sa(t,r),r}finally{o&&_a(u,o),u.end(),p()}let f=e.get("requestId");f&&Oe.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function qs(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 Ns(e){let t=!0===e.get("isSelfTest");t||await ka(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=wa(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 ba)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(va(o.model))return Ps(e,o,{isSelfTest:t});e.set("requestData",{model:o.model,streaming:!!o.stream}),he.manualApprove&&!t&&await ha(),"foundry"!==he.provider&&(o=function(e){if(!pn(e.max_completion_tokens)){let{max_completion_tokens:t,...r}=e;return{...r,max_tokens:t}}if(!pn(e.max_tokens))return e;let t=(he.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return r.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(o),o=Ra(o,he.models)),pn(o.thinking_budget)||r.debug("Normalized thinking_budget to:",JSON.stringify(o.thinking_budget));let n=await ga(e);if(n)return n;let i=performance.now(),a=await rs(o),s=performance.now()-i;if(nt.record(s,{model:o.model,target:"chat_completions",streaming:String(!!o.stream)}),Ms(a)){let t=e.get("requestData")||{};return a.usage&&(t.tokenUsage=ya(a.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),r.debug("Non-streaming response:",JSON.stringify(a)),e.json(a)}let{events:l,span:c,release:u}=a;return G(e,async t=>{let r={value:null},n=0,a=performance.now(),p=Na(e,i);try{try{for await(let i of l){p();let a=i;i.data&&"[DONE]"!==i.data&&(n++,Ze.add(1,{model:o.model,endpoint_type:"openai"}),a=qs(i,t=>{r.value=t;let o=e.get("requestData")||{};o.tokenUsage=ya(t),o._d1=s,e.set("requestData",o)})),await t.writeSSE(a)}let c=performance.now()-a,u={model:o.model,endpoint_type:"openai"};if(it.record(c,u),dt.record(n,u),Ma(e,i),r.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=ya(r.value),t._d1=s,e.set("requestData",t))}}catch(r){throw gt(c,e.get("requestSpan"),r),await Sa(t,r),r}finally{r.value&&_a(c,r.value),c.end(),u()}let d=e.get("requestId");d&&Oe.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Ms=e=>Object.hasOwn(e,"choices"),js=new B;js.post("/",async e=>{try{return await cn(e,"chat",Ns)}catch(t){return await jr(e,t)}});const Ds=async e=>{if(!mo(he))throw Error("Service token not found");let t=`${uo(he)}/embeddings`,r=po(he),o=he.timeoutMs,n=new AbortController,i=hr(n,o),a=JSON.stringify(e);try{let{response:o,span:i}=await wt({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:r,body:a,signal:n.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1,"copilot_api.upstream.provider":he.provider}});try{if(!o.ok)throw new mr("Failed to create embeddings",o,{outgoingBody:a,outgoingHeaders:r});return await o.json()}catch(e){throw ht(i,e),e}finally{i.end()}}finally{clearTimeout(i)}},Ls=new B;Ls.post("/",async e=>{try{let t=await e.req.json();try{t.model=wa(t.model)}catch(t){if(t instanceof ba)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 ga(e);if(r)return r;let o=performance.now(),n=await(async e=>{try{return await Ds(e)}catch(t){if(t instanceof mr&&401===t.response.status){if(!await Zr(t))throw t;return Ds(e)}throw t}})(t),i=performance.now()-o;nt.record(i,{model:t.model,target:"embeddings",streaming:"false"});let a=e.get("requestData")||{};return a.tokenUsage=ya(n.usage),a._d1=i,e.set("requestData",a),e.json(n)}catch(t){return await jr(e,t)}});const Bs=new B;let Fs=null,Us=null;Bs.get("/",async e=>{let t,r=function(){if(lo(he)){if(!mo(he))return"missing";let e=he.foundry?.bearerExpiresAt;return void 0!==e&&e<=Date.now()?"expired":"valid"}let e=he._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let r=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),o=JSON.parse(atob(r)),n="object"==typeof o&&o&&"exp"in o&&"number"==typeof o.exp?o.exp:void 0;return void 0!==n&&1e3*n<Date.now()?"expired":"valid"}catch{return"expired"}}(),o=await async function(){let e=Date.now(),t=Fs;return t&&e-t.timestamp<3e4?{result:t.result}:Us||(Us=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),r=performance.now();try{let t=`${uo(he)}/models`,o=await fetch(t,{method:"GET",headers:po(he),signal:e.signal}),n=Math.round(performance.now()-r),i=o.ok?"reachable":"unreachable";return Fs={result:i,timestamp:Date.now()},{result:i,latencyMs:n}}catch{let e=Math.round(performance.now()-r);return Fs={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),Us=null}})(),Us)}();t="valid"===r&&"reachable"===o.result?"ok":"valid"!==r&&"reachable"!==o.result?"unhealthy":"degraded";let n={status:t,copilot_token:r,upstream:o.result,version:"0.46.0-preview.1",timestamp:(new Date).toISOString()};void 0!==o.latencyMs&&(n.upstream_latency_ms=o.latencyMs);let i="ok"===t?200:503;return e.json(n,i)});var Hs=class extends Error{upstream;constructor(e){super("Copilot rejected the token for a streamed image upload"),this.upstream=e,this.name="ImagesRetryLaterError"}};const zs=e=>"object"==typeof e&&"chunks"in e,Js=async()=>{let e=(e=>{let t=e&&/(?:^|;)exp=(\d+)/.exec(e)?.[1];return t?1e3*Number(t):void 0})(he._t1);void 0!==e&&e-Date.now()<3e5&&await Zr()},Gs=async(e,t,r)=>{let{status:o}=e.response;if(401===o&&!t.refreshed){if(t.refreshed=!0,!await Zr(e))throw e;if(!t.replayable)throw new Hs(e);return}if(429!==o||!t.replayable)throw e;let n=(e=>{let t=Number(e.headers.get("retry-after-ms"));if(Number.isFinite(t)&&t>0)return t;let r=e.headers.get("retry-after")??"",o=Number(r);if(r&&Number.isFinite(o)&&o>0)return 1e3*o;let n=Date.parse(r)-Date.now();return Number.isFinite(n)&&n>0?n:1e3})(e.response)+250*Math.random();if(t.attempts>=3||Date.now()-t.start+n>Math.min(1e4,he.timeoutMs))throw e;t.attempts++,await((e,t)=>new Promise((r,o)=>{if(t?.aborted)return void o(t.reason);let n=()=>{clearTimeout(i),o(t?.reason)},i=setTimeout(()=>{t?.removeEventListener("abort",n),r()},e);t?.addEventListener("abort",n,{once:!0})}))(n,r)},Ks=async(e,t,r)=>{if(!mo(he))throw Error("Service token not found");let o=`${uo(he)}/v1/images/${e.operation}`,n=new AbortController,i=Ys(n,t),{body:a,length:s}=Vs(e.body,n.signal,i),l=e.model?void 0:e.lateModel,c=Ws(e.contentType,s),{release:u}=i,p=!1;try{let s=await vt({spanName:`copilot POST /v1/images/${e.operation}`,url:o,target:"images",method:"POST",headers:c,body:a,signal:n.signal,headersTimeout:he.timeoutMs,bodyTimeout:he.timeoutMs,extraAttributes:{...e.model&&{"copilot_api.model":e.model},"copilot_api.upstream.provider":he.provider}}),{span:d}=s;s.body instanceof ReadableStream||i.attachBody(s.body);try{let o=Qs(s);if(!o.ok){let t=await o.text();throw new mr(`Failed to create image ${e.operation}`,new Response(t,{status:o.status,statusText:o.statusText,headers:o.headers}),{outgoingHeaders:c})}let n=o.headers.get("content-type")??"application/json",{stream:a,fail:m}=rl(o.body,(e,r,o)=>{void 0!==e&&(!o&&!t?.aborted)&&ht(d,e);let n=l?.();n&&d.setAttribute("copilot_api.model",n),void 0!==r&&d.setAttribute("copilot_api.images.total_nano_aiu",r),d.end(),u()},r);return i.onAbort(m),p=!0,{contentType:n,body:a}}catch(e){throw ht(d,e),e}finally{if(!p){let e=l?.();e&&d.setAttribute("copilot_api.model",e),d.end()}}}finally{p||u()}},Ws=(e,t)=>({...po(he),"Content-Type":e,...void 0!==t&&{"Content-Length":String(t)},"accept-encoding":"identity"}),Ys=(e,t)=>{let r,o,n=1,i=t=>{o?.(t),r?.on("error",()=>{}),r?.destroy(t),e.abort(t)},a=setTimeout(()=>i(new fr(he.timeoutMs)),he.timeoutMs),s=()=>i(t?.reason);return t?.aborted?s():t?.addEventListener("abort",s,{once:!0}),{hold:()=>{n++},release:()=>{--n>0||(clearTimeout(a),t?.removeEventListener("abort",s))},attachBody:e=>{r=e},onAbort:e=>{o=e}}},Vs=(e,t,r)=>{if("string"==typeof e)return{body:e,length:P.byteLength(e)};if(zs(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]=Xs,yield o,r?.()}e.length=0,yield*t}}(e),{objectMode:!1}),{rest:n}=e;r.hold();let i=!1,a=()=>{i||(i=!0,t.removeEventListener("abort",a),r.release(),n?.[Symbol.asyncIterator]().return?.(t.aborted?t.reason:void 0).catch(()=>{}))};return o.once("close",a),t.aborted?a():t.addEventListener("abort",a,{once:!0}),{body:o,length:e.length}}return{body:P.from(e.buffer,e.byteOffset,e.byteLength),length:e.byteLength}};const Xs=new Uint8Array,Zs=new Set([101,204,205,304]),Qs=({statusCode:e,headers:t,body:r})=>{let o={status:e,headers:t};return Zs.has(e)?(Xa(r),new Response(null,o)):Ya(r,o)},el=async(e,t)=>{let r;try{await Promise.race([e?.cancel(t).catch(()=>{}),new Promise(e=>{r=setTimeout(e,5e3)})])}finally{clearTimeout(r)}},tl=65536,rl=(e,t,r)=>{let o,n=e?.getReader(),i=new nl,a=!1,s=!1,l=(e,o=!1)=>{if(a)return;if(a=!0,void 0!==e)return t(e,void 0,o),void r?.({error:e,cancelled:o});let n=i.read();t(void 0,n.totalNanoAiu),r?.(n)};return{stream:new ReadableStream({start(e){o=e},async pull(e){let t;try{t=await(n?.read())}catch(t){return e.error(t),void(s||l(t))}!t||t.done?(e.close(),l()):(i.push(t.value),e.enqueue(t.value))},async cancel(e){let t=e instanceof ol,r=t?e.cause??e:e;try{await el(n,e)}finally{l(r instanceof Error?r:new DOMException("The client cancelled the image response.","AbortError"),!t)}}}),fail:e=>{if(a||s)return;s=!0;let t=e instanceof Error?e:Error(String(e));o.error(t),el(n,t).then(()=>l(t))}}};var ol=class extends Error{name="ImagesRouteCancel"},nl=class{head=new Uint8Array(tl);headLength=0;ring=new Uint8Array(tl);ringEnd=0;total=0;push(e){if(this.total+=e.byteLength,this.headLength<tl){let t=Math.min(e.byteLength,tl-this.headLength);this.head.set(e.subarray(0,t),this.headLength),this.headLength+=t}let t=e.byteLength>tl?e.subarray(e.byteLength-tl):e,r=Math.min(t.byteLength,tl-this.ringEnd);this.ring.set(t.subarray(0,r),this.ringEnd),this.ring.set(t.subarray(r),0),this.ringEnd=(this.ringEnd+t.byteLength)%tl}tail(){if(this.total<tl)return this.ring.subarray(0,this.total);let e=new Uint8Array(tl);return e.set(this.ring.subarray(this.ringEnd)),e.set(this.ring.subarray(0,this.ringEnd),tl-this.ringEnd),e}read(){let e,t=this.tail(),r=this.head.subarray(0,this.headLength);if(this.total<=tl)e=[[il(t),"end"]];else if(this.total<=2*tl){let o=new Uint8Array(this.total);o.set(r),o.set(t.subarray(2*tl-this.total),tl),e=[[il(o),"end"]]}else e=[[il(t),"end"],[il(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 il=e=>(new TextDecoder).decode(e),al=(e,[t,r],o)=>{let n=0,i=!1;for(let a=t;a<r;a++){let t=e[a];if(i)"\\"===t?a++:'"'===t&&(i=!1);else switch(t){case'"':i=!0;break;case"{":case"[":n+=o;break;case"}":case"]":n-=o}}return n};function 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 i=0,a=!1;for(let t=n;t<e.length;t++){let r=e[t];if(a)"\\"===r?t++:'"'===r&&(a=!1);else if('"'===r)a=!0;else if("{"===r)i++;else if("}"===r&&0===--i)try{let r=JSON.parse(e.slice(n,t+1));return"object"==typeof r&&r?r:void 0}catch{return}}}const ll=e=>e.header("Connection","close"),cl=e=>{let t=(e=>{let t=Number(e.req.header("content-length"));return{limit:ma(e.req.path),declaredLength:Number.isSafeInteger(t)&&t>=0?t:void 0}})(e),r=e.req.raw.body;(void 0!==t.declaredLength&&!((e,t)=>e<=t.limit&&(void 0===t.declaredLength||t.declaredLength<=t.limit&&e<=t.declaredLength))(0,t)||!pl(()=>((e,t)=>!e||e.locked?Promise.resolve():la(e.getReader(),{read:0,limit:t.limit,declared:t.declaredLength}))(r,t)))&&ll(e)};let ul=0;const pl=e=>!(ul>=(()=>{let e=Number(process.env.COPILOT_API_IMAGES_MAX_DRAINS);return Number.isFinite(e)&&e>=0?Math.floor(e):8})())&&(ul++,qi(()=>{e().finally(()=>{ul--})}),!0),dl={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."},ml=e=>(ll(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 fl=class extends Error{constructor(){super("The request body stopped arriving."),this.name="BodyIdleTimeoutError"}};const hl=async(e,t)=>{let r;try{await Promise.race([e.cancel(t).catch(()=>{}),new Promise(e=>{r=setTimeout(e,1e3)})])}finally{clearTimeout(r)}},gl=async(e,t)=>{let r,o;try{return await Promise.race([e.read(),new Promise((e,t)=>{r=setTimeout(()=>t(new fl),(()=>{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)}},yl=e=>{let t=0;return async()=>{let r=await(e=>ea().pacer.take(e))(e);t+=r,t>0&&f.getActiveSpan()?.setAttribute("copilot_api.images.start_wait_ms",t)}},_l=async(e,t,r)=>{try{return await async function(e,t){let{gate:r}=ea(),o=r.stats(),n=Me.startSpan("copilot_api.images.admission",{kind:u.INTERNAL,attributes:{"copilot_api.images.admission.weight_bytes":e,"copilot_api.images.admission.budget_bytes":o.budgetBytes,"copilot_api.images.admission.in_use_bytes":o.inUseBytes,"copilot_api.images.admission.in_flight":o.inFlight,"copilot_api.images.admission.queue_depth":o.queueDepth}}),i=performance.now();try{let o=await r.acquire(e,t);return n.setAttribute("copilot_api.images.admission.result","admitted"),o}catch(e){let t=e instanceof Gi?e.reason:"error";throw n.setAttribute("copilot_api.images.admission.result",t),"aborted"!==t&&n.setStatus({code:p.ERROR,message:t}),e}finally{n.setAttribute("copilot_api.images.admission.wait_ms",Math.round(performance.now()-i)),n.end()}}(((e,t)=>{let r=(e.req.header("content-type")??"").split(";")[0].trim().toLowerCase();if("edits"===t&&"multipart/form-data"===r)return 11534336;let o=Number(e.req.header("content-length"));return Ji(Number.isSafeInteger(o)&&o>=0?o:void 0)})(e,t),r)}catch(t){if(t instanceof Gi&&"aborted"!==t.reason)return cl(e),"too_large"===t.reason?(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)))(e):((e,t)=>{f.getActiveSpan()?.setAttribute("copilot_api.error_type","images_capacity");let r=ea().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)})(e,dl[t.reason]);throw t}},bl=(e,t)=>(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error",code:"invalid_request"}},400)),wl=(e,t)=>e.json({error:{message:`Request body exceeds the ${t/1024/1024} MB limit.`,type:"invalid_request_error",code:"request_too_large"}},413),vl=(e,t,r)=>{try{if(r)throw new ba(r);return wa(t)}catch(t){if(t instanceof ba)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}};var kl=class extends Error{constructor(e){super(e),this.name="JsonSyntaxError"}},xl=class extends Error{constructor(){super('Request body has more than one top-level "model" field.'),this.name="DuplicateModelError"}};const Tl=0,Al=1,Sl=2,$l=3,El=4,Ol=5,Il=6,Cl=7,Rl=8,Pl=9,ql=10,Nl=11,Ml=12,jl=13,Dl=14,Ll=15,Bl=16,Fl=17,Ul=18,Hl=19,zl=20,Jl=21,Gl=[239,187,191],Kl=[34,109,111,100,101,108,34],Wl=e=>32===e||10===e||13===e||9===e,Yl=e=>e>=48&&e<=57,Vl={[jl]:[Dl,Ll,-2,-2,-2,-2],[Dl]:[-1,-1,Bl,Ul,-1,-1],[Ll]:[Ll,Ll,Bl,Ul,-1,-1],[Bl]:[Fl,Fl,-2,-2,-2,-2],[Fl]:[Fl,Fl,-1,Ul,-1,-1],[Ul]:[zl,zl,-2,-2,Hl,-2],[Hl]:[zl,zl,-2,-2,-2,-2],[zl]:[zl,zl,-1,-1,-1,-1]};var Xl=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))}},Zl=class{state=Tl;stack=new Xl;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===Rl&&"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===Dl||this.state===Ll||this.state===Fl||this.state===zl)&&(this.state=Cl),this.state!==Cl&&this.fail("Unexpected end of JSON input")}fail(e){throw new kl(`${e} at byte ${this.offset}`)}step(e){switch(this.state){case Tl:return e===Gl[0]&&0===this.offset?(this.state=Jl,void(this.bomIndex=1)):(this.state=Al,void this.step(e));case Jl:return e!==Gl[this.bomIndex]&&this.fail("Unexpected token"),void(++this.bomIndex===Gl.length&&(this.state=Al));case Al:case Sl:if(Wl(e))return;return 93===e&&this.state===Sl?void this.closeContainer():void this.startValue(e);case $l:case El:if(Wl(e))return;return 125===e&&this.state===$l?void this.closeContainer():(34!==e&&this.fail("Expected a property name"),void this.beginString(1===this.stack.length?"key":"none",!0));case Ol:if(Wl(e))return;return 58!==e&&this.fail("Expected ':'"),void(this.state=Al);case Il:{if(Wl(e))return;let t=this.stack.top();return 44===e?void(this.state=t?El:Al):e===(t?125:93)?void this.closeContainer():void this.fail("Expected ',' or a close")}case Cl:return void(Wl(e)||this.fail("Unexpected non-whitespace after JSON"));case Rl:return void this.stringByte(e);case Pl: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=Rl));case ql:return(e=>Yl(e)||e>=97&&e<=102||e>=65&&e<=70)(e)||this.fail("Bad Unicode escape"),this.record(e),void(0===--this.hexLeft&&(this.state=Rl));case Nl: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=Rl));case Ml: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=$l);case 91:return this.stack.push(!1),void(this.state=Sl);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=jl);default:48===e?this.state=Dl:Yl(e)?this.state=Ll:this.fail("Unexpected token")}}beginLiteral(e){this.literal=e,this.literalIndex=1,this.state=Ml}beginString(e,t=!1){this.state=Rl,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=Pl):(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=Nl))}endString(){let e=this.stringRole;if(this.stringRole="none",this.stringIsKey){if(this.state=Ol,"key"!==e)return;if(!this.captureOverflow&&this.isModelKey(this.capture)){if(this.modelSeen)throw new xl;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!==Kl.length||!e.every((e,t)=>e===Kl[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?Cl:Il}closeContainer(){this.stack.pop(),this.endScalar()}numberByte(e){let t=Vl[this.state]?.[(e=>48===e?0:Yl(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 Ql=class extends Error{kind;constructor(e){super(`JSON request body rejected: ${e}`),this.kind=e,this.name="JsonBodyError"}},ec=class extends Error{constructor(){super("The JSON request body upload stopped before its end."),this.name="UploadCancelledError"}};const tc=async(e,t)=>{let r,o=new Zl,n=e?.getReader(),i=[],a=0,s=()=>r,l=(()=>{let e,t,r=new Promise((r,o)=>{e=r,t=o});return r.catch(()=>{}),{promise:r,resolve:e,reject:t}})(),c={reading:!1,stop:!1},u=()=>la(n,{read:a,limit:t.limit,declared:t.declaredLength,deadline:c.deadline}),p=()=>(l.reject(new ec),ac(c,n,u),Promise.resolve()),d=e=>{a+=e.byteLength},m=e=>{if(d(e),a>t.limit)throw r=new Ql("too-large");if(void 0!==t.declaredLength&&a>t.declaredLength)throw r=new Ql("length-mismatch");try{nc(o,e)}catch(e){throw r=e,e}},f=()=>{if(void 0!==t.declaredLength&&a!==t.declaredLength)throw r=new Ql("length-mismatch");try{o.end()}catch{throw r=new Ql("invalid-json")}if(!o.isObject)throw r=new Ql("not-object")},h=e=>({model:o.model,head:i,headLength:a,declaredLength:t.declaredLength,rest:e?.rest??null,cancel:p,failure:s,complete:e?l.promise:Promise.resolve(),idleMs:e?.idleMs??(()=>0),progress:e?.progress??(()=>{})});try{for(;;){let e=n?await n.read():{done:!0};if(e.done)return f(),h(void 0);if(m(e.value),rc(i,e.value),void 0!==o.model&&a!==t.declaredLength&&n)return h(lc(ic(n,{take:m,count:d,finish:f,settled:l,discard:u,control:c}),l))}}catch(e){throw l.reject(e),u(),e}},rc=(e,t)=>{if(e.length<256||t.byteLength>=16384)return void e.push(t);let r=e.at(-1),o=r&&oc.get(r);if(o&&r.byteLength+t.byteLength<=o.byteLength){o.set(t,r.byteLength);let n=o.subarray(0,r.byteLength+t.byteLength);return oc.set(n,o),void(e[e.length-1]=n)}let n=new Uint8Array(65536);n.set(t);let i=n.subarray(0,t.byteLength);oc.set(i,n),e.push(i)},oc=new WeakMap,nc=(e,t)=>{try{e.push(t)}catch(e){throw new Ql(e instanceof xl?"duplicate-model":"invalid-json")}};async function*ic(e,t){let r,{take:o,count:n,finish:i,settled:a,discard:s,control:l}=t,c=!1;try{for(;;){let t=await sc(e,l);if(l.stop)throw t.done||n(t.value),new ec;if(t.done)break;0!==t.value.byteLength&&(o(t.value),r&&(yield r),r=t.value)}i(),c=!0,r&&(yield r),a.resolve()}catch(e){throw a.reject(e),e}finally{c||(a.reject(new ec),s())}}const ac=(e,t,r)=>{e.stop=!0,e.reading?(e.deadline??=performance.now()+aa,e.watchdog??=setTimeout(()=>{t?.cancel().catch(()=>{})},Math.min(ia,aa))):r()},sc=(e,t)=>t.stop?Promise.reject(new ec):(t.reading=!0,e.read().finally(()=>{t.reading=!1,clearTimeout(t.watchdog)})),lc=(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 ec),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}},cc=(e,{start:t,end:r},o)=>{let n=[],i=0,a=!1;for(let s of e){let e=i,l=i+s.byteLength;i=l,l<=t||e>=r?(!a&&e>=r&&(n.push(o),a=!0),n.push(s)):(e<t&&n.push(s.subarray(0,t-e)),a||=(n.push(o),!0),l>r&&n.push(s.subarray(r-e)))}return a||n.push(o),n.filter(e=>e.byteLength>0)},uc=(e,t)=>{switch(("too-large"===t||"length-mismatch"===t)&&(e=>{e.header("Connection","close")})(e),t){case"too-large":return wl(e,ma(e.req.path));case"not-object":return bl(e,"Request body must be a JSON object.");case"duplicate-model":return bl(e,'Request body must have exactly one top-level "model" field.');case"length-mismatch":return bl(e,"The request body length does not match its Content-Length.");default:return bl(e,"Request body must be valid JSON.")}},pc=async(e,t,r=e.req.raw.body)=>{let o,n=(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{o=await tc(r,{limit:ma(e.req.path),declaredLength:n})}catch(t){if(t instanceof Ql)return uc(e,t.kind);throw t}let i=o.model,a="too-long"===i?.kind?vl(e,"","Model name is too long."):vl(e,"string"===i?.kind?i.value:void 0);if(a instanceof Response)return await o.cancel(),a;let{chunks:s,length:l}=((e,t,{model:r,declared:o})=>{let n=o??(e.rest?void 0:e.headLength);if(!t||t.value===r)return{chunks:e.head,length:n};let i=(new TextEncoder).encode(JSON.stringify(r));return{chunks:cc(e.head,t,i),length:void 0===n?void 0:n+i.byteLength-(t.end-t.start)}})(o,"string"===i?.kind?i:void 0,{model:a,declared:n});return{operation:t,model:a,body:null===o.rest&&1===s.length?s[0]:{chunks:s,rest:o.rest,length:l,progress:o.progress},contentType:"application/json",bodyFailure:e=>{let t=o.failure()?.kind;return t?uc(e,t):void 0},cancelBody:o.cancel,...o.rest&&{uploadComplete:o.complete,uploadIdleMs:o.idleMs}}};var dc=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=P.from("\r\n","latin1");carryStart=-2;headers="";inField=!1;valueStart=0;value=[];valueLength=0;name;limits;constructor(e,t,r){this.name=t,this.limits=r,this.delimiter=P.from(`\r\n--${e}`,"latin1"),this.maxHeaderBytes=r.maxHeaderBytes??16384,this.maxFieldBytes=r.maxFieldBytes??256,this.maxLineBytes=r.maxLineBytes??1024}get complete(){return"end"===this.state}push(e){let t=this.total;if(this.total+=e.byteLength,this.total>this.limits.maxBytes)throw new dc(`Request body exceeds the ${this.limits.maxBytes/1024/1024} MB limit.`,413);if("end"===this.state)return;let r=P.from(e.buffer,e.byteOffset,e.byteLength),o=this.carry.byteLength>0?P.concat([this.carry,r]):r,n=this.carry.byteLength>0?this.carryStart:t;this.carry=P.alloc(0),this.scan(o,n)}finish(){if("headers"!==this.state&&"end"!==this.state&&this.carry.byteLength>=this.delimiter.byteLength+2&&this.carry.subarray(0,this.delimiter.byteLength).equals(this.delimiter)&&/^--[ \t]*$/.test(this.carry.toString("latin1",this.delimiter.byteLength))&&("body"===this.state&&this.endPart(this.carryStart),this.state="end"),"end"!==this.state)throw new dc("Malformed multipart/form-data body.",400)}keep(e,t,r){this.carry=P.from(e.subarray(t)),this.carryStart=r+t}scan(e,t){let r=0;for(;-1!==r&&r<e.byteLength;){if("end"===this.state)return;r="headers"===this.state?this.scanHeaders(e,r,t):this.scanBody(e,r,t)}}scanBody(e,t,r){let o=t;for(;;){let n=e.indexOf(this.delimiter,o);if(-1===n){let n=hc(e,o,this.delimiter);return this.bodyBytes(e,t,e.byteLength-n),this.keep(e,e.byteLength-n,r),-1}let i=fc(e,n+this.delimiter.byteLength,this.maxLineBytes);if("not-delimiter"!==i)return this.bodyBytes(e,t,n),"more"===i?(this.keep(e,n,r),-1):("body"===this.state&&this.endPart(r+n),"close"===i?(this.state="end",-1):(this.state="headers",this.headers="",i));o=n+1}}scanHeaders(e,t,r){let o=this.maxHeaderBytes+4-this.headers.length,n=this.headers+e.toString("latin1",t,Math.min(e.byteLength,t+o)),i=n.startsWith("\r\n")?0:n.indexOf("\r\n\r\n");if(-1===i){if(n.length-4>=this.maxHeaderBytes)throw new dc("Multipart part headers are too large.",400);return this.headers=n,-1}let a=(0===i?2:i+4)-this.headers.length;return this.startPart(n.slice(0,i),r+t+a),t+a}startPart(e,t){this.headers="",this.state="body";let r=gc(e);if(r?.file&&r.name===this.name)throw new dc(`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 dc(`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 dc(`The multipart "${this.name}" field is too long.`,400);this.value.push(P.from(e.subarray(t,r)))}}endPart(e){this.inField&&(this.inField=!1,this.field={value:P.concat(this.value).toString("utf8"),start:this.valueStart,end:e},this.value=[])}};const fc=(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},hc=(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},gc=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=yc(r);return{name:"form-data"===r.split(";")[0].trim().toLowerCase()?o.get("name"):void 0,file:o.has("filename")||o.has("filename*")}}},yc=e=>{let t=new Map,r=e.indexOf(";");for(;-1!==r;){let o=e.indexOf("=",r+1);if(-1===o)break;let n=e.lastIndexOf(";",o);if(n>r){r=n;continue}let i=e.slice(r+1,o).trim().toLowerCase(),a=o+1;for(;" "===e[a]||"\t"===e[a];)a++;let s="";if('"'===e[a]){for(a++;a<e.length&&'"'!==e[a];a++)"\\"===e[a]&&a++,s+=e[a]??"";r=e.indexOf(";",a+1)}else r=e.indexOf(";",a),s=e.slice(a,-1===r?void 0:r).trim();t.has(i)||t.set(i,s)}return t},_c=new Uint8Array;var bc=class extends Error{constructor(){super("The early answer did not fit in the spool."),this.name="SpoolOverflowError"}};const wc=new B,vc=(e,t,r)=>{if(t instanceof fl)return ml(e);if(t instanceof xc){let r=vl(e,t.value);return r instanceof Response?r:bl(e,t.message)}return 413===t.status?wl(e,r):bl(e,t.message)};var kc=class extends Error{constructor(){super("The upload did not reach the upstream in full."),this.name="UploadStoppedError"}},xc=class extends Error{value;constructor(e){super("The multipart model field is missing or not valid."),this.name="ModelPartError",this.value=e}};const Tc=e=>{try{return wa(e)}catch(t){throw t instanceof ba?new xc(e):t}},Ac=async(e,t)=>{let r=(e=>{let t=yc(e).get("boundary");return t&&t.length<=70?t:void 0})(t),o=e.req.raw.body;if(!r||!o)return bl(e,"Malformed multipart/form-data body.");let n=ma(e.req.path),i=new mc(r,"model",{maxBytes:n}),a=Number(e.req.header("content-length")),s=Number.isSafeInteger(a)&&a>0,l=s?a:void 0,{reader:c,drain:u}=jc(o.getReader(),{limit:n,declared:l}),p=[],d=Lt(e),m=await $c({reader:c,drain:u,scanner:i,held:p,declared:l,signal:d});if("boolean"!=typeof m)return vc(e,m,n);let{field:f}=i;if(!m&&!f){let e={};return{...Sc({contentType:t,drain:u,body:{chunks:p,length:void 0},rest:t=>Ec({reader:c,drain:u,scanner:i,declared:l,signal:d,onError:t,onModel:t=>{e.model=t}}),model:""}),found:e,lateModel:()=>e.model}}let h=vl(e,f?.value??null);if(h instanceof Response)return m||u(),h;let g=p,y=0;return f&&f.value!==h&&(g=Oc(p,0,{...f,value:h}),y=P.byteLength(h)-(f.end-f.start)),m?(c.releaseLock(),{operation:"edits",model:h,contentType:t,body:{chunks:g,rest:null,length:p.reduce((e,t)=>e+t.byteLength,0)+y}}):Sc({contentType:t,drain:u,body:{chunks:g,length:s?a+y:void 0},rest:e=>Ec({reader:c,drain:u,scanner:i,declared:l,signal:d,onError:e}),model:h})},Sc=({contentType:e,drain:t,body:r,rest:o,model:n})=>{let i,a,s=new Promise((e,t)=>{a={resolve:e,reject:t}});s.catch(()=>{});let l,c=o(e=>i=e)[Symbol.asyncIterator](),u=!1,p={[Symbol.asyncIterator]:()=>p,next:async()=>{u=!0;try{let e=await c.next();return u=!1,l=Date.now(),e.done&&a.resolve(),e}catch(e){throw u=!1,a.reject(e),e}},return:async e=>((e=>{a.reject(e instanceof Error?e:new kc)})(e),await(c.return?.()),{done:!0,value:void 0})};return{operation:"edits",model:n,contentType:e,body:{chunks:r.chunks,length:r.length,rest:p,progress:()=>{l=Date.now()}},bodyFailure:e=>i&&vc(e,i,ma(e.req.path)),cancelBody:()=>(t(),Promise.resolve()),uploadComplete:s,uploadIdleMs:()=>u||void 0===l?0:Date.now()-l}},$c=async({reader:e,drain:t,scanner:r,held:o,declared:n,signal:i})=>{try{for(;;){let{done:t,value:a}=await gl(e,i);if(t)return r.finish(),void 0===n||r.total===n||new dc("The request body length does not match its Content-Length.",400);let s=r.complete;if(r.push(a),!s&&(o.push(a),!r.complete&&(r.field||!r.inField&&(r.fileBeforeField||r.total>1048576))))return!1}}catch(r){if(r instanceof fl)return await hl(e),r;if(t(),r instanceof dc)return r;throw r}};async function*Ec({reader:e,drain:t,scanner:r,declared:o,signal:n,onError:i,onModel:a}){let s=!1,l=[],c=0,u=void 0!==a;try{for(;;){let{done:t,value:i}=await gl(e,n);if(t){if(r.finish(),void 0!==o&&r.total!==o)throw new dc("The request body length does not match its Content-Length.",400);if(u)throw new xc(null);return void(s=!0)}let p=r.total;if(r.push(i),!u){yield i;continue}if(0===l.length&&(c=p),!r.field){r.inField?l.push(i):yield i;continue}l.push(i);let{field:d}=r,m=Tc(d.value);a?.(m);let f=m===d.value?l:Oc(l,c,{...d,value:m});l=[],u=!1,yield*f}}catch(e){throw(e=>e instanceof dc||e instanceof xc||e instanceof fl)(e)&&i(e),e}finally{s||t()}}const Oc=(e,t,{start:r,end:o,value:n})=>{if(r<t)throw new dc("Malformed multipart/form-data body.",400);let i=P.from(n,"utf8"),a=[],s=t,l=!1;for(let t of e){let e=s;s+=t.byteLength,s<=r||e>=o?(e>=o&&!l&&(a.push(i),l=!0),a.push(t)):(e<r&&a.push(t.subarray(0,r-e)),l||=(a.push(i),!0),s>o&&a.push(t.subarray(o-e)))}return l||a.push(i),a},Ic=3e4,Cc=1e3,Rc=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)),Pc=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)),qc=async(e,t,r)=>{if(!t.uploadComplete)return{body:r};let o=((e,t)=>{let r=e.getReader(),o={queue:[],next:0,size:0,done:!1,active:!0,dropped:!1},n=e=>{e.done||!e.value?o.done=!0:o.size+e.value.byteLength>t?o.dropped=!0:(o.queue.push(e.value),o.size+=e.value.byteLength)},i={},a=new Promise((e,t)=>{i.reject=t});a.catch(()=>{});let s=e=>{o.failure=e,o.done=!0,i.reject?.(e)},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 bc);if(o.next<o.queue.length){let t=o.queue[o.next];return o.queue[o.next++]=_c,void e.enqueue(t)}if(o.done)return void e.close();let{inflight:t}=o;if(!t)break;await t,l()}let t=await r.read();t.done?e.close():e.enqueue(t.value)},cancel:e=>r.cancel(e)})),cancel:async e=>{o.active=!1,await r.cancel(e).catch(()=>{})},full:()=>o.dropped||!o.done&&o.size>=t,dropped:()=>o.dropped,failure:a}})(r,Nc);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),Cc)});try{if(await Promise.race([r,n]))return!t.dropped()||"blocked"}finally{clearTimeout(o)}if(t.full())return"blocked";if((e.uploadIdleMs?.()??0)>=Ic)return"stalled"}})(t,o);if(!0!==n)return await o.cancel(new ol(`upload ${n}`)),await(t.cancelBody?.()),Dc(e,t),{failed:"stalled"===n?Pc(e):Rc(e),body:r}}catch(n){return await o.cancel(new ol("The upload failed.",{cause:n})),await(t.cancelBody?.()),Dc(e,t),{failed:t.bodyFailure?.(e)??(n instanceof kc||n instanceof ec?bl(e,"The request body did not reach the upstream in full."):await jr(e,n)),body:r}}return Dc(e,t),{body:o.release()}},Nc=zi;var Mc=class extends Error{constructor(){super("The client body is being drained."),this.name="BodyHandedOff"}};const jc=(e,t)=>{let r,o=0,n=!1;return{reader:{read:async()=>{if(n)throw new Mc;let t=e.read();r=t;let i=await t;return i.done||(o+=i.value.byteLength),i},cancel:t=>e.cancel(t),releaseLock:()=>e.releaseLock()},drain:()=>{n||(n=!0,(async()=>{let n=performance.now()+aa;r&&!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(ia,t-performance.now()))})])}finally{clearTimeout(r)}})(r,n)?await e.cancel().catch(()=>{}):await la(e,{read:o,...t,deadline:n})})())}}},Dc=(e,t)=>{let r=t.found?.model;if(!r)return;let o=e.get("requestData");o?o.model=r:e.set("requestData",{model:r})},Lc=async(e,t,r)=>(await(t?.cancelBody?.()),t&&Dc(e,t),t?.bodyFailure?.(e)||(r instanceof Hs?(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)?bl(e,"The request body length does not match its Content-Length."):jr(e,r))),Bc=(e,t,{signal:r,guard:o})=>{let n=()=>{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 gl(r,t);o.done?e.close():e.enqueue(o.value)}catch(t){t instanceof fl&&(o=!0),e.error(t),await hl(r)}},async cancel(e){await hl(r,e)}},{highWaterMark:0}),timedOut:()=>o}})(e.req.raw.body,r);return o.timedOut=t.timedOut,t.body};return"generations"===t?pc(e,"generations",n()):(async(e,t)=>{let r=e.req.header("content-type")??"",o=r.split(";")[0].trim().toLowerCase();return"application/json"===o?pc(e,"edits",t()):"multipart/form-data"===o?Ac(e,r):bl(e,"Image edits require a multipart/form-data or application/json body.")})(e,n)},Fc=e=>async t=>{let r,o,n={timedOut:()=>!1},i=!1;try{if(lo(he))return bl(t,"Image endpoints are available only with the Copilot provider.");await ka(he);let a=Lt(t),s=await _l(t,e,a);if(s instanceof Response)return s;o=s;let l=await Bc(t,e,{signal:a,guard:n});if(l instanceof Response)return l;r=l,t.set("requestData",r.model?{model:r.model}:{});let c=await ga(t);if(c)return await(r.cancelBody?.()),c;he.manualApprove&&await ha(a);let u=((e,t)=>{let r={...e.get("requestData"),deferFinalize:!0};e.set("requestData",r);let o=e.get("requestSpan"),n=e.get("resolveStreamComplete"),i=Lt(e),a=performance.now();return e=>{try{if(void 0===e.error){let o=performance.now()-a;if(nt.record(o,{model:r.model||t,target:"images",streaming:"false"}),e.usage){let t=e.usage.input_tokens??0,o=e.usage.output_tokens??0;r.tokenUsage={inputTokens:t,outputTokens:o,totalTokens:e.usage.total_tokens??t+o}}r._d1=o}else e.cancelled||i.aborted?o?.setAttribute("copilot_api.client_aborted",!0):o&&ht(o,e.error)}finally{n?.()}}})(t,r.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:yl(t)},clientEnded:o.clientEnded}})(s,a,u),d=await(async(e,t,r={})=>{let{onBodyEnd:o,beforeAttempt:n}=r,i=!zs(e.body)||null===e.body.rest;i||await Js();let a={replayable:i,attempts:1,refreshed:!1,start:Date.now()};for(;;)try{return await(n?.()),await Ks(e,t,o)}catch(e){if(!(e instanceof mr))throw e;await Gs(e,a,t)}})(r,a,p.hooks),m=await qc(t,r,d.body);return m.failed?m.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 hl(r,e),t()}})})(m.body,p.clientEnded),{status:200,headers:{"content-type":d.contentType}}))}catch(e){return n.timedOut()?(await(r?.cancelBody?.()),ml(t)):await Lc(t,r,e)}finally{i||o?.release()}},Uc=e=>async t=>{let r=await e(t);if(r.status>=400){let e=Number(t.req.header("content-length"));da(t.req.raw,ma(t.req.path),Number.isSafeInteger(e)&&e>=0?e:void 0)}return r};function Hc(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function zc(e){return!Hc(e)}wc.post("/generations",Uc(Fc("generations"))),wc.post("/edits",Uc(Fc("edits")));const Jc=new Y(X);let Gc;const Kc={...V["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Wc(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 Yc(e,t){let r=0;for(let o of e)switch(o.type){case"text":r+=t(o.text)*Kc.contentMultiplier;break;case"tool_use":r+=t(o.name+JSON.stringify(o.input))*Kc.contentMultiplier;break;case"tool_result":o.content&&(r+=t("string"==typeof o.content?o.content:JSON.stringify(o.content))*Kc.contentMultiplier);break;case"thinking":r+=t(o.thinking)*Kc.contentMultiplier;break;case"image":r+=1600}return r}function Vc(e,t){let r=0,o=e.properties;if(!o)return r;let n=Object.entries(o);for(let[e,[o,i]]of n.entries()){if(r+=0===e?Kc.perFirstProp:Kc.perAdditionalProp,r+=t(o),i.description&&(r+=Kc.perPropDesc+t(i.description)),i.enum&&Array.isArray(i.enum)){r+=Kc.perEnum;for(let e of i.enum)r+=t(String(e))}if("object"===i.type&&i.properties&&(r+=Kc.perNestedObject,r+=Vc(i,t)),"array"===i.type&&i.items){let e=i.items;"object"===e.type&&e.properties&&(r+=Kc.perArrayOfObjects,r+=Vc(e,t))}}return r}const Xc={event:"ping",data:JSON.stringify({type:"ping"})};function Zc(e,t=15e3){let r,o=performance.now(),n=!1,i=()=>{if(n||e.aborted||e.closed)return void(r=void 0);let a=performance.now()-o;a>=t?(o=performance.now(),e.writeSSE(Xc).catch(()=>{}),r=setTimeout(i,t)):r=setTimeout(i,t-a)};return r=setTimeout(i,t),{writeSSE:async t=>{await e.writeSSE(t),o=performance.now()},stop:()=>{n=!0,clearTimeout(r),r=void 0}}}function Qc(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 eu(e,t,r){let o=Qc(t,r);for(let[t,r]of Object.entries(o))void 0!==r&&e.setAttribute(t,r)}const tu=async(e,t,o)=>{try{return await ru(e,t)}catch(n){if(n instanceof mr&&401===n.response.status){if(!await Zr(n))throw n;return ru(e,t)}if(n instanceof mr&&400===n.response.status&&o?.onStructuredOutputFallback){let i;try{i=await n.response.clone().text()}catch{i=void 0}let a=o.onStructuredOutputFallback(e,i);if(a)return r.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${a.model}`),ru(a,t)}throw n}};const ru=async(e,t)=>{if(!mo(he))throw Error("Service token not found");let{baseUrl:r,headers:o,cleanPayload:n}=lo(he)&&he.foundry?{baseUrl:ao(he.foundry),headers:so(he.foundry,t),cleanPayload:e}:function(e,t){let{metadata:r,...o}=e,n=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(o),i={...Rt(he,t,n),"X-Initiator":"agent"};return{baseUrl:Ot(he),headers:i,cleanPayload:o}}(Ai(e),t),i=`${r}/v1/messages`,a=he.timeoutMs,s=JSON.stringify(n),l=function(e,t,r){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":r,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough","copilot_api.upstream.provider":he.provider,...Qc(e,t?.anthropicBeta)}}(n,t,a);for(let e=0;e<=1;e++){me();let t=Ja(r,{fresh:e>0}),c=new AbortController,u=Yo(c,a);try{let{statusCode:r,headers:p,body:d,span:m}=await vt({spanName:"copilot POST /v1/messages",url:i,target:"anthropic_messages",headers:o,body:s,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:t}).finally(u.headersArrived),f=Ya(d,{status:r,headers:p});if(!f.ok)throw m.end(),new mr("Failed to create anthropic messages",f,{outgoingBody:s,outgoingHeaders:o});if(n.stream)return{events:Va(f,d),span:m,release:()=>Ga(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&&_a(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(),Ga(t)}}catch(r){if(Ga(t),await dr(r,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw r}finally{u.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ou=new Set(["resolveStreamComplete","requestId"]);function nu(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 iu(e,t,r){let{stream:o,client:n}=t,{reason:i,progress:a}=r,s=await async function(e){let t=e.req.raw,r=new Request(t.url,{method:t.method,headers:t.headers,body:JSON.stringify(await e.req.json()),signal:Lt(e)}),o=new L(r,{env:e.env});for(let[t,r]of Object.entries(e.var))ou.has(t)||o.set(t,r);return o}(e);try{let e,t=await async function(e,t,r){let o=await ln(e,t,r);if(o.ok&&o.body)return o;throw await(o.body?.cancel()),new mr("Copilot fallback failed",o)}(s,i,r.failure);for await(let{event:r,data:o}of K(t))r&&void 0!==o&&"ping"!==r&&("message_start"===r&&a.messageStart?e=JSON.parse(o).message?.usage:await n.writeSSE({event:r,data:"message_delta"===r?nu(o,e):o}))}catch(t){if(Ft(e))return;let r=e.get("requestSpan");throw r&&ht(r,t),await Aa(o,t),t}finally{e.set("requestData",s.get("requestData"))}}const au=24e4;var su=class extends fr{name="StreamHeadersTimeoutError"};function lu(){if(le())return;let e=new AbortController,t=setTimeout(()=>{e.abort(new su(au))},au);return{signal:e.signal,clear:()=>clearTimeout(t)}}function cu(e,t){e.get("requestSpan")?.setAttribute("copilot_api.stream.headers_wait_ms",Math.round(performance.now()-t))}async function uu(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&&cu(e,r),n}catch(t){throw o?.setAttribute("copilot_api.stream.early_commit",!1),cu(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"},du=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 jr(r,t);if(499===o.status)return;if((e=>e instanceof su||e instanceof Error&&e.cause instanceof su)(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:du(o.status),message:n}}async function fu(e,t,r){await t.client.writeSSE(Xc);try{let t=await r.pending;return cu(e,r.start),t}catch(o){if(cu(e,r.start),Ft(e))return void Oe.completionCallbacks.delete(e.get("requestId"));let n=function(e,t){if(nn(e))return Vo(t,void 0!==en()?.sent)}(e,o);if(n)return void await iu(e,t,{reason:n,progress:{messageStart:!1,content:!1,held:[]},failure:o});let i=await mu(e,o);return void(i&&await t.client.writeSSE({event:"error",data:JSON.stringify({type:"error",error:i})}))}}const hu=new Set(["low","medium","high","max","xhigh"]),gu=(e,t)=>!(!e||!t||e===t);function yu(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!hu.has(t))return e;let o=he.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,n=No(t,o);if(!n||!hu.has(n))return e;let i=n;if(i===t)return e;r.debug(`Effort clamp: ${t} → ${i}`);let a=f.getActiveSpan();return a?.setAttribute("copilot_api.effort.requested",t),a?.setAttribute("copilot_api.effort.clamped_to",i),{...e,output_config:{...e.output_config,effort:i}}}function _u(e,t,o){if("foundry"===he.provider)return yu(e);let n=t.includes(e.model)?e.model:Po(e.model,t)??e.model,i=n===e.model?e:{...e,model:n},a=function(e,t,r={}){let o=Po(e,t);return o&&r.context1m?function(e,t){let r=`${e}-1m`;if(t.has(r))return r;let o=`${e}-1m-`;for(let e of t)if(e.startsWith(o))return e;return null}(o,new Set(t)):null}(i.model,t,{context1m:o.context1m}),s=i;if(a&&a!==i.model){r.debug(`Resolved model variant: ${i.model} → ${a}`);let e=f.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",i.model),e?.setAttribute("copilot_api.model.variant_resolved_to",a),s={...i,model:a}}return yu(s)}const bu=e=>"object"==typeof e&&!!e&&!Array.isArray(e),wu=["properties","patternProperties","$defs","definitions"],vu=["items","additionalProperties","propertyNames","contains","not","if","then","else"],ku=["anyOf","allOf","oneOf","prefixItems"];const xu=()=>["string","number","boolean"].map(e=>({type:e})),Tu=()=>({anyOf:[...xu(),{type:"array",items:{anyOf:xu()}},{type:"object"}]}),Au=e=>!0===e||bu(e)&&0===Object.keys(e).length,Su=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function $u(e,t){let r={...e};for(let e of wu){let o=r[e];bu(o)&&(r[e]=Object.fromEntries(Object.entries(o).map(([e,r])=>[e,bu(r)?$u(r,t):r])))}for(let e of vu){let o=r[e];bu(o)&&(r[e]=$u(o,t))}for(let e of ku){let o=r[e];Array.isArray(o)&&(r[e]=o.map(e=>bu(e)?$u(e,t):e))}return"prefixItems"in r&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(bu(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let r=t.flatMap(e=>Au(e)?Tu().anyOf:bu(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)),Su(r)&&(!("items"in r)||Au(r.items))&&(t.add("items"),r.items=Tu()),Au(r.additionalProperties)&&(t.add("additionalProperties"),delete r.additionalProperties),r}function Eu(e){let t=[],r=[];for(let o of e)switch(o.role){case"system":{if(r.length>0){r.push(o);break}let e=Iu(o);e&&t.push(e);break}case"user":case"assistant":r.push(o)}return{leadingSystemTexts:t,messages:r}}function Ou(e){return Cu(Iu(e))}function Iu(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 Cu(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function Ru(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>Cu(e)).filter(Boolean).join("\n\n")}const Pu=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),qu=new Set(["text","image"]);function Nu(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);qu.has(e)||t.add(`block:tool_result:${e}`)}}const Mu=new Set;function ju(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=Pu.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&&Nu(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(Mu.size>=100)break;Mu.has(r)||(Mu.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 Du=e=>q("sha256").update(e).digest("hex").slice(0,12);function Lu(e,t){e.setAttribute("copilot_api.translation.system_hash",Du(t.system)),e.setAttribute("copilot_api.translation.tools_hash",Du(JSON.stringify(t.tools??[])))}function Bu(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Fu(e){return e.toLowerCase().startsWith("claude-")}function Uu(e,t){let r={model:e.model,messages:Hu(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:Xu(e.tools,e.model),tool_choice:Zu(e.tool_choice)},o=e.thinking;if("enabled"===o?.type||"adaptive"===o?.type){let n=Ia(t,r.model);if(n){let i="enabled"===o.type&&"number"==typeof o.budget_tokens?o.budget_tokens:function(e,t,r){let o=function(e,t){return"max"===e||"xhigh"===e?t:"medium"===e?8e3:"low"===e?1024:16e3}(e,r.max),n=$a(t),i=n&&n>1?n-1:r.min;return Ea(Math.min(o,i),r.min,r.max)}(e.output_config?.effort??"high",r.max_tokens,n.bounds);r=Ra({...r,thinking_budget:i},t)}}return r}function Hu(e,t){let{leadingSystemTexts:r,messages:o}=Eu(e),n=function(e,t){let r=Ru(e,t);return r?[{role:"system",content:r}]:[]}(t,r),i=[];for(let e of o)switch(e.role){case"system":{let t=Ou(e);if(!t)break;zu(n)?i.push(t):Ju(n,t);break}case"user":n.push(...Gu(e));for(let e of i)Ju(n,e);i=[];break;case"assistant":n.push(...Ku(e))}for(let e of i)Ju(n,e);return n}function zu(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function Ju(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 Gu(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:Vu(e.content)});o.length>0&&t.push({role:"user",content:Vu(o)})}else t.push({role:"user",content:Vu(e.content)});return t}function Ku(e){let t=function(e){return{reasoning_text:Yu(e.reasoning_text),reasoning_opaque:Yu(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Vu(e.content),...t}];let r=e.content.filter(e=>"tool_use"===e.type),o=e.content.filter(e=>"text"===e.type),n=e.content.filter(e=>"thinking"===e.type),i=[...o.map(e=>e.text),...n.map(e=>e.thinking)].join("\n\n");return r.length>0?[{role:"assistant",content:i||null,...t,tool_calls:r.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:"assistant",content:Vu(e.content),...t}]}const Wu=32768;function Yu(e){if("string"==typeof e)return e.length<=Wu?e:e.slice(0,Wu)}function Vu(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 Xu(e,t){if(!e)return;let r=e.filter(zc),o=function(e){return e.toLowerCase().startsWith("gemini")}(t),n=new Set,i=r.map(e=>{let t=e.input_schema;if(o){let e=function(e){let t=new Set;return{schema:$u(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)n.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return n.size>0&&f.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...n].sort().join(",")),i}function Zu(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 Qu(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 ep(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function tp(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 rp=new Set(["low","medium","high","max","xhigh"]);function op(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&&rp.has(e)?e:null)(No(function(e){return!e||e<=0?"medium":e<8e3?"low":e<24e3?"medium":"high"}(r.budget_tokens),o.capabilities.supports.reasoning_effort));t&&(n.output_config={...e.output_config,effort:t})}return n}function np(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 ip=/[^\w-]/g;function ap(e){return e.replaceAll(ip,"_")}function sp(e,t){let r=function(e,t){if(!e.output_config?.effort)return e;let r=t?.data.find(t=>t.id===e.model);if(!r)return e;let o=r.capabilities.supports.reasoning_effort;if(Array.isArray(o)&&o.length>0)return e;let{effort:n,...i}=e.output_config;if(0===Object.keys(i).length){let{output_config:t,...r}=e;return r}return{...e,output_config:i}}(e,t);return r=op(r,t),r=function(e,t){let r=e.max_tokens;if("number"!=typeof r)return e;let o=t?.data.find(t=>t.id===e.model);if(!o)return e;let n=o.capabilities.limits;if(!n)return e;let i=(!1===e.stream?n.max_non_streaming_output_tokens:void 0)??n.max_output_tokens;if("number"!=typeof i||i<=0)return e;let a=Math.max(Math.min(r,i),16);return a===r?e:{...e,max_tokens:a}}(r,t),r={...r,system:np(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:ap(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:ap(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(r),r}function lp(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 cp(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 up(e,t){return Me.startActiveSpan("copilot_api.model.validate",o=>{try{o.setAttribute("copilot_api.model.requested",t.model),eu(o,t,e.req.header("anthropic-beta"));let n=wa(t.model);o.setAttribute("copilot_api.model.normalized",n);let i=lp(t);return i?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:i}},400)}):n===t.model?(o.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(o.setAttribute("copilot_api.model.was_mapped",!0),Ge.add(1,{from_model:t.model,to_model:n}),r.debug(`Model mapping: '${t.model}' → '${n}'`),{ok:!0,payload:{...t,model:n}})}catch(t){if(t instanceof ba)return{ok:!1,response:cp(e,t.message,t.statusCode)};throw t}finally{o.end()}})}var pp=class extends xa{name="UpstreamIdleError";constructor(e){super("api_error",`Upstream sent nothing for ${Math.round(e/1e3)}s; stream aborted`)}};function dp(e,t,r){let{leadingSystemTexts:o,messages:n}=Eu(e.messages),i=function(e){let t=[],r=[];for(let o of e)switch(o.role){case"system":{let e=Ou(o);if(!e)break;"function_call"===t.at(-1)?.type?r.push(e):t.push(_p(e));break}case"user":t.push(...bp(o),...r.map(e=>_p(e))),r=[];break;case"assistant":t.push(...kp(o))}return t.push(...r.map(e=>_p(e))),t}(n);if(0===i.length)throw new mr("request has no translatable message content",Response.json({type:"error",error:{type:"invalid_request_error",message:"request has no translatable message content"}},{status:400}));let a={model:e.model,input:i,max_output_tokens:Math.max(e.max_tokens,16),stream:e.stream,temperature:e.temperature,top_p:e.top_p,store:!1,user:e.metadata?.user_id?.slice(0,64)},s=function(e,t){return Ru(e,t)||null}(e.system,o);s&&(a.instructions=s),e.tools?.length&&(a.tools=e.tools.filter(zc).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(a.tool_choice=function(e){switch(e.type){case"auto":return"auto";case"any":return"required";case"none":return"none";case"tool":return e.name?{type:"function",name:e.name}:void 0;default:return}}(e.tool_choice));let l=function(e,t,r){if("adaptive"===e.thinking?.type){let t=e.output_config?.effort??"high";return r&&"max"===t?{effort:"max"}:{effort:yp(t)}}if("enabled"===e.thinking?.type&&e.thinking.budget_tokens){let{effort:r}=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens),o=No(r,t);return{effort:gp(o)?o:r}}}(e,t,r?.keepMax??!1);return l&&(a.reasoning=l),r?.promptCacheKey&&(a.prompt_cache_key=r.promptCacheKey),a}function mp(e,t){let r=e?.trim()||t?.trim();if(r)return`cc-${q("sha256").update(r).digest("hex").slice(0,32)}`}function fp(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 hp=new Set(["low","medium","high","xhigh"]),gp=e=>null!==e&&hp.has(e);function yp(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function _p(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function bp(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(vp(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(wp(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 wp(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function vp(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?wp(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 kp(e){if("string"==typeof e.content)return[{type:"message",role:"assistant",content:e.content}];let t=[],r=e.content.filter(e=>"text"===e.type),o=e.content.filter(e=>"thinking"===e.type),n=e.content.filter(e=>"tool_use"===e.type),i=[...r.map(e=>e.text),...o.map(e=>e.thinking)].join("\n\n");i&&t.push({type:"message",role:"assistant",content:i});for(let e of n)t.push({type:"function_call",call_id:e.id,name:e.name,arguments:JSON.stringify(e.input)});return t}function xp(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 Tp(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Ap(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 Sp(e,t){let r=[];switch(e.type){case"response.created":Ap(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){Ap(t,r),Tp(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":Ap(t,r),Tp(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":Tp(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":{Tp(t,r);let o=e.response.output.some(e=>"function_call"===e.type),n=e.response.usage,i=xp(e.response,o);t.terminalEvent=e.type,t.stopReason=i,r.push({type:"message_delta",delta:{stop_reason:i,stop_sequence:null},usage:fp(n)},{type:"message_stop"});break}case"response.incomplete":{Ap(t,r),Tp(t,r);let o=e.response.usage,n=xp(e.response,!1);t.terminalEvent=e.type,t.stopReason=n,r.push({type:"message_delta",delta:{stop_reason:n,stop_sequence:null},usage:fp(o)},{type:"message_stop"});break}case"response.failed":Ap(t,r),Tp(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":Ap(t,r),Tp(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":Ap(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 $p(e,t,r){let o=t.reasoning?.effort,n=e.get("requestData")||{};n.reasoningEffort=o,n.effortClamped=gu(r,o),e.set("requestData",n)}function Ep(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function Op(e,t,o){let n=!1;for(let i of t){if(r.debug("Translated Anthropic event:",i),"error"===i.type)throw new xa(i.error.type,i.error.message);if("message_start"===i.type){await e.writeSSE({event:i.type,data:JSON.stringify(i)}),o.messageStart=!0,n=!0;continue}let t="content_block_start"===i.type&&"text"===i.content_block.type&&!i.content_block.text,a="content_block_stop"===i.type&&o.held.length>0;if(o.content||!t&&!a){o.content=!0;for(let t of o.held.splice(0))await e.writeSSE({event:t.type,data:JSON.stringify(t)});await e.writeSSE({event:i.type,data:JSON.stringify(i)}),n=!0}else o.held.push(i)}return n}function Ip(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 Cp(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 Rp(e,t){let r=performance.now()-t;return nt.record(r,{model:e.model,target:"responses",streaming:String(!!e.stream)}),r}function Pp(e,t){return G(e,async r=>{let o=Zc(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 qp(e,t,o){r.debug("Streaming Responses API response");let n,{stream:i,client:a}=t,{events:s,span:l,release:c}=o.response,{model:u,copilotStart:p,_d1:d,upstreamIdle:m}=o,f=null,h=0,g=performance.now(),y=Ip(g),_=Na(e,p),b={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}},w={messageStart:!1,content:!1,held:[]};try{for await(let t of async function*(e,t,r={}){let o,{idleMs:n=3e5,progress:i=()=>!0}=r,a=e[Symbol.asyncIterator](),s={idle:!1};try{for(;;){let e,r=new Promise((e,r)=>{o=setTimeout(()=>{s.idle=!0;let e=new pp(n);t.abort(e),r(e)},n)});try{do{e=await Promise.race([a.next(),r])}while(!e.done&&!i(e.value))}finally{clearTimeout(o)}if(e.done)return;yield e.value}}finally{clearTimeout(o),s.idle||await(a.return?.())}}(s,m,{progress:y.progress})){_(),r.debug("Responses API raw stream event:",t);let o=Cp(t.data);if(!o)continue;h++,Ze.add(1,{model:u,endpoint_type:"responses"});let n=hs(o);if(n){f=n;let t=e.get("requestData")||{};t.tokenUsage=ya(f),t._d1=d,e.set("requestData",t)}await Op(a,Sp(o,b),w)&&y.forwarded()}(function(e){if(!e.terminalEvent)throw new xa("api_error","Upstream stream ended before the response completed")})(b),sn();let t=performance.now()-g,o={model:u,endpoint_type:"responses"};it.record(t,o),dt.record(h,o),Ma(e,p)}catch(t){if(Ft(e))return;if(w.content||!nn(e))throw function(e,t,r){if(!(t instanceof xa))return;let o="stream_incomplete";t instanceof pp?o="upstream_idle":r.terminalEvent&&(o="upstream_failure"),e?.setAttribute("copilot_api.error_type",o)}(e.get("requestSpan"),t,b),gt(l,e.get("requestSpan"),t),await Aa(i,t),t;n=t instanceof pp?"foundry_stream_idle":"foundry_stream_failed",ht(l,t)}finally{f&&_a(l,f),y.record(l),n||function(e,t,r){e&&(Ep(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"),b,f),l.end(),c()}n&&await iu(e,t,{reason:n,progress:w})}async function Np(e,t,n){let i=performance.now(),a=Me.startActiveSpan("copilot_api.translate.anthropic_to_responses",r=>{try{r.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),r.setAttribute("copilot_api.translation.message_count",t.messages.length),ju(r,t.messages);let o=dp(t,he.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===he.provider,promptCacheKey:"foundry"===he.provider?mp(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return Lu(r,{system:o.instructions??"",tools:o.tools}),o}finally{r.end()}});st.record(performance.now()-i,{direction:"anthropic_to_responses"}),r.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),$p(e,a,n),he.manualApprove&&await ha();let s=performance.now(),l=new AbortController,{pending:c,capped:u}=function(e,t,r){let o=t.stream?lu():void 0;return{pending:ps(t,{onAttempt:t=>$p(e,t,r.requestedEffort),signal:AbortSignal.any([Lt(e),r.upstreamIdle.signal,...o?[o.signal]:[]])}).finally(()=>o?.clear()),capped:void 0!==o}}(e,a,{requestedEffort:n,upstreamIdle:l});if(u&&!await uu(e,c,s))return function(e,t,r){let{pending:o,copilotStart:n,upstreamIdle:i}=r;return an(),Pp(e,async r=>{let a=await fu(e,r,{pending:o,start:n});a&&!fs(a)&&await qp(e,r,{response:a,model:t.model,copilotStart:n,_d1:Rp(t,n),upstreamIdle:i})})}(e,a,{pending:c,copilotStart:s,upstreamIdle:l});let p=await c,d=Rp(a,s);if(fs(p)){let t=e.get("requestData")||{};if(Ep(e.get("requestSpan"),p.usage?.output_tokens_details?.reasoning_tokens),p.usage&&(t.tokenUsage=ya({prompt_tokens:p.usage.input_tokens,completion_tokens:p.usage.output_tokens,total_tokens:p.usage.total_tokens,prompt_tokens_details:p.usage.input_tokens_details})),t._d1=d,t.upstreamTtfbMs=d,t.upstreamTotalMs=d,e.set("requestData",t),r.level>=o.debug&&r.debug("Non-streaming Responses API response:",JSON.stringify(p).slice(-400)),"failed"===p.status)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:p.error?.code??"api_error",message:p.error?.message??"Response generation failed"}},500);let n=performance.now(),i=Me.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","responses_to_anthropic");let t=function(e){let t=[],r=!1;for(let o of e.output)if("message"===o.type)for(let e of o.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===o.type){r=!0;let e={};try{e=JSON.parse(o.arguments)}catch{}t.push({type:"tool_use",id:o.call_id,name:o.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:xp(e,r),stop_sequence:null,usage:fp(e.usage)}}(p);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return st.record(performance.now()-n,{direction:"responses_to_anthropic"}),e.json(i)}return an(),Pp(e,t=>qp(e,t,{response:p,model:a.model,copilotStart:s,_d1:d,upstreamIdle:l}))}function Mp(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 jp(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Dp(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&&(Mp(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&&(Mp(t,r),r.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:n.reasoning_opaque}}),jp(t,r)),n.content&&(jp(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){jp(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&&(jp(t,r),t.contentBlockOpen&&=(r.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),r.push({type:"message_delta",delta:{stop_reason:Bu(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 Bp(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)?sp({...e,model:Oo},r):null}var Fp=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Up=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 i=new AbortController,a=setTimeout(()=>i.abort(),15e3);try{let{response:t,span:a}=await wt({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(n),signal:i.signal,extraAttributes:{"tavily.max_results":o?.maxResults??5,"tavily.has_include_domains":!!o?.includeDomains?.length,"tavily.has_exclude_domains":!!o?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return a.setAttribute("tavily.results_count",e.results.length),r.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw ht(a,e),e}finally{a.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Up:e}finally{clearTimeout(a)}},exa:async function(e,t,o){let n=function(e,t){let r={query:e,numResults:t?.maxResults??5,contents:{text:!0}};return t?.includeDomains?.length&&(r.includeDomains=t.includeDomains),t?.excludeDomains?.length&&(r.excludeDomains=t.excludeDomains),r}(t,o);r.debug("Exa search request:",JSON.stringify(n));let i=new AbortController,a=setTimeout(()=>i.abort(),15e3);try{let{response:t,span:a}=await wt({spanName:"exa POST /search",url:"https://api.exa.ai/search",target:"exa_search",method:"POST",headers:{"Content-Type":"application/json","x-api-key":e},body:JSON.stringify(n),signal:i.signal,extraAttributes:{"exa.max_results":o?.maxResults??5,"exa.has_include_domains":!!o?.includeDomains?.length,"exa.has_exclude_domains":!!o?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return a.setAttribute("exa.results_count",e.results.length),r.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw ht(a,e),e}finally{a.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Fp:e}finally{clearTimeout(a)}}},zp=["tavily","exa"];function Jp(e){return"tavily"===e||"exa"===e}function Gp(){return he.webSearchProviders.length>0}async function Kp(e,t){return async function(e,t,o){let{providers:n,searchFns:i=Hp}=o;if(0===n.length)throw Error("No web search provider configured");let a,s=[];for(let[o,l]of n.entries())try{let o=await i[l.name](l.key,e,t);return s.length>0&&r.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),o}catch(e){a=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);o!==n.length-1&&r.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${n[o+1].name}".`)}let l=a instanceof Error?a.message:String(a);throw r.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),a instanceof Error?a:Error("All web search providers failed")}(e,t,{providers:he.webSearchProviders})}function Wp(e){let t=e.tools;return!(!t||1!==t.length)&&Hc(t[0])}function Yp(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Vp(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&&Hc(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);r.info(`Web search intercepted: "${o}"`);let i,a=[],s=!1;try{if(!Gp())throw s=!0,i="unavailable",Error("No web search provider configured");a=(await Kp(o,{maxResults:Math.min(n.maxResults,10),includeDomains:n.allowedDomains,excludeDomains:n.blockedDomains})).map(e=>({type:"web_search_result",url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString("base64"),page_age:null}))}catch(e){r.error("Web search failed:",e),s=!0,i??="unavailable"}let l={query:o,results:a,model:t.model,searchFailed:s,errorCode:i};if(!t.stream)return e.set("requestData",{model:t.model,streaming:!1}),e.json(function(e){let{query:t,model:r}=e,o=`srvtoolu_${Yp()}`,n=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:o,name:"web_search",input:{query:t}},{...Vp(o,e)}];return{id:`msg_ws_${Yp()}`,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_${Yp()}`,n=`msg_ws_${Yp()}`,i=[];return i.push({type:"message_start",message:{id:n,type:"message",role:"assistant",content:[],model:r,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:"content_block_start",index:0,content_block:{type:"text",text:""}},{type:"content_block_delta",index:0,delta:{type:"text_delta",text:"I'll search for that."}},{type:"content_block_stop",index:0},{type:"content_block_start",index:1,content_block:{type:"server_tool_use",id:o,name:"web_search",input:{}}},{type:"content_block_delta",index:1,delta:{type:"input_json_delta",partial_json:JSON.stringify({query:t})}},{type:"content_block_stop",index:1},{type:"content_block_start",index:2,content_block:Vp(o,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),i}(l);return e.set("requestData",{model:t.model,streaming:!0}),G(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}async function Zp(e){if(mo(he)||await In())return null;let t=xn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${An()}`}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function Qp(e,t){let r=t.model;return r&&"string"==typeof r?null:cp(e,"Model name is required and must be a string")}function ed(e,t){let r=performance.now()-t;return nt.record(r,{model:e.model,target:"chat_completions",streaming:String(!!e.stream)}),r}function td(e,t){return G(e,async r=>{let o=Zc(r);r.onAbort(()=>{o.stop(),Bt(e)});try{await t({stream:r,client:o})}finally{o.stop(),e.get("resolveStreamComplete")?.()}})}async function rd(e,t,r){let{pending:o,capped:n,copilotStart:i}=r;if(n&&!await uu(e,o,i))return function(e,t,r){let{pending:o,copilotStart:n}=r;return an(),td(e,async r=>{let i=await fu(e,r,{pending:o,start:n});if(i)id(i)||(sn(),await od(e,r,{response:i,model:t.model,copilotStart:n,_d1:ed(t,n)}));else{let t=e.get("requestId");t&&Oe.executeCompletion(t)}})}(e,t,{pending:o,copilotStart:i})}async function od(e,t,o){r.debug("Streaming response from service");let{stream:n,client:i}=t,{events:a,span:s,release:l}=o.response,{model:c,copilotStart:u,_d1:p}=o,d=null,m=0,f=performance.now(),h=Na(e,u),g={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{for await(let t of a){if(h(),r.debug("Raw stream event:",t),"[DONE]"===t.data)break;if(!t.data)continue;let o;try{o=JSON.parse(t.data)}catch(e){r.warn("Failed to parse streaming chunk:",t.data.slice(0,200),e);continue}if(m++,Ze.add(1,{model:c,endpoint_type:"anthropic"}),o.usage){d=o.usage;let t=e.get("requestData")||{};t.tokenUsage=ya(d),t._d1=p,e.set("requestData",t)}let n=Dp(o,g);for(let e of n)r.debug("Translated Anthropic event:",e),await i.writeSSE({event:e.type,data:JSON.stringify(e)})}let t=performance.now()-f,o={model:c,endpoint_type:"anthropic"};if(it.record(t,o),dt.record(m,o),Ma(e,u),d){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=ya(d),t._d1=p,e.set("requestData",t))}}catch(t){throw gt(s,e.get("requestSpan"),t),await Aa(n,t),t}finally{d&&_a(s,d),s.end(),l()}let y=e.get("requestId");y&&Oe.executeCompletion(y)}async function nd(e){let t=await e.req.json();if(Wp(t))return Qp(e,t)??Xp(e,t);await ka(he),r.debug("Anthropic request payload:",t);let n=t.output_config?.effort,i=Qp(e,t);if(i)return i;t=function(e,t){return _u(t,he.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let a=up(e,t);if(!a.ok)return a.response;t=a.payload;let s=await Zp(e);if(s)return s;if(va(t.model))return Np(e,t,n);if(function(e){if("foundry"!==he.provider)return Fu(e);let t=he.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:Fu(e)}(t.model))return async function(e,t,r){let o="foundry"===he.provider,n=o?t:sp(t,he.models),i={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},a=n.output_config?.effort;return e.set("requestData",{model:n.model,reasoningEffort:a,effortClamped:gu(r,a),streaming:!!n.stream}),he.manualApprove&&await ha(),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),eu(t,n,i.anthropicBeta);try{let r=performance.now(),a=await tu(n,i,{onStructuredOutputFallback:(e,r)=>{if(o)return null;let n=Bp(e,r,he.models);return n&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",n.model)),n}}),s=performance.now()-r;if(nt.record(s,{model:n.model,target:"anthropic_messages",streaming:String(!!n.stream)}),!n.stream){let r=a,o=r.usage;if(o){let t={input_tokens:o.input_tokens||0,output_tokens:o.output_tokens||0,cache_read_input_tokens:o.cache_read_input_tokens||0,cache_creation_input_tokens:o.cache_creation_input_tokens||0},r=e.get("requestData")||{};r.tokenUsage=ya(ad(t)),r._d1=s,r.upstreamTtfbMs=s,r.upstreamTotalMs=s,e.set("requestData",r)}return t.end(),e.json(r)}let{events:l,span:c,release:u}=a;return G(e,async o=>{let i=0,a=performance.now(),s={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=Na(e,r);try{try{for await(let e of l)d(),!e.data||"[DONE]"===e.data||(i++,Ze.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),sd(e.data,s)&&(p=!0)),await o.writeSSE(e);let e=performance.now()-a,t={model:n.model,endpoint_type:"anthropic_messages"};it.record(e,t),dt.record(i,t)}catch(t){throw gt(c,e.get("requestSpan"),t),await Aa(o,t),t}finally{if(Ma(e,r),p){let t=ad(s);_a(c,t);let r=e.get("requestData")||{};r.tokenUsage=ya(t),e.set("requestData",r)}c.end(),u()}let t=e.get("requestId");t&&Oe.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw ht(t,e),t.end(),e}})}(e,t,n);let l=performance.now(),c=Me.startActiveSpan("copilot_api.translate.anthropic_to_openai",r=>{try{r.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),r.setAttribute("copilot_api.translation.message_count",t.messages.length),r.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),r.setAttribute("copilot_api.translation.has_system",!!t.system),r.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let o=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));r.setAttribute("copilot_api.translation.has_thinking",o),ju(r,t.messages);let n=Uu(t,he.models),i=n.messages.at(0);return Lu(r,{system:"system"===i?.role&&"string"==typeof i.content?i.content:"",tools:n.tools}),n}finally{r.end()}});st.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=Ra(c,he.models),r.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:gu(n,u),streaming:!!c.stream});let p=performance.now();he.manualApprove&&await ha();let{pending:d,capped:m}=function(e,t){let r=t.stream?lu():void 0;return{pending:rs(t,r&&{signal:AbortSignal.any([Lt(e),r.signal])}).finally(()=>r?.clear()),capped:void 0!==r}}(e,c),f=await rd(e,c,{pending:d,capped:m,copilotStart:p});if(f)return f;let h=await d,g=ed(c,p);if(id(h)){let t=e.get("requestData")||{};h.usage&&(t.tokenUsage=ya(h.usage)),t._d1=g,t.upstreamTtfbMs=g,t.upstreamTotalMs=g,e.set("requestData",t),r.level>=o.debug&&r.debug("Non-streaming response:",JSON.stringify(h).slice(-400));let n=performance.now(),i=Me.startActiveSpan("copilot_api.translate.openai_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","openai_to_anthropic");let t=function(e){let t=[],r=[],o=[],n=null;n=e.choices[0]?.finish_reason??n;for(let i of e.choices){let e=ep(i.message),a=Qu(i.message.content),s=tp(i.message.tool_calls);t.push(...e),r.push(...a),o.push(...s),("tool_calls"===i.finish_reason||"stop"===n)&&(n=i.finish_reason)}return{id:e.id,type:"message",role:"assistant",model:e.model,content:[...t,...r,...o],stop_reason:Bu(n),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(h);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return st.record(performance.now()-n,{direction:"openai_to_anthropic"}),r.debug("Translated Anthropic response:",i),e.json(i)}return td(e,t=>od(e,t,{response:h,model:c.model,copilotStart:p,_d1:g}))}const id=e=>Object.hasOwn(e,"choices");function ad(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 sd(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 ld=new B;ld.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&Wp(t)}catch{return!1}}(e)?await nd(e):await cn(e,"messages",nd)}catch(t){return await jr(e,t)}});const cd=new B;function ud(e){return Me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let o=wa(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 pd(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=ya(r),o._d1=t._d1,t.c.set("requestData",o)}cd.get("/",async e=>{try{he.models||await dn();let t=he.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await jr(e,t)}});const dd=new Set(["message","function_call","function_call_output"]),md=new Set(["type","name","description","parameters"]);async function fd(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||!Gp())&&(r.info(`Enriching web search: "${o}"`),e.sources=(await Kp(o,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function hd(e){if(Gp())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await fd(e.action)}}catch(e){r.error("Failed to enrich non-streaming web search:",e)}}async function gd(e){if(!Gp())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 fd(e.action))return JSON.stringify(t)}}catch(e){r.error("Failed to enrich web search:",e)}return e}function yd(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 dd.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function _d(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 bd(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&&_d(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)_d(e,t)&&(n=!0);if(n)return JSON.stringify(r)}}catch{}return e}function wd(e){return null!=e}function vd(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function kd(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function xd(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(!vd(o)){r.push(o);continue}let e=yd(o);null===e?t.add(kd(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"])wd(e[r])&&(t[r]=e[r]);let n=new Set;if(wd(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))md.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(wd(e.reasoning)&&"object"==typeof e.reasoning){let r=e.reasoning;t.reasoning={},wd(r.effort)&&(t.reasoning.effort=r.effort),wd(r.summary)&&(t.reasoning.summary=r.summary)}if(wd(e.text)&&"object"==typeof e.text){let r=e.text;wd(r.format)&&(t.text={format:r.format})}return{payload:t,customToolNames:n,droppedInputTypes:o}}function Td(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Ad(e,t,r){let{payload:o,droppedInputTypes:n}=r;if(!Array.isArray(t)||!Array.isArray(o.input))return null;let i=f.getActiveSpan();return i?.setAttribute("copilot_api.responses.input_items_in",t.length),i?.setAttribute("copilot_api.responses.input_items_out",o.input.length),0===t.length||o.input.length>0||wd(o.previous_response_id)||wd(o.prompt)||wd(o.conversation)?null:Td(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 Sd(e){await ka(he);let t=await e.req.json();if(!vd(t))return Td(e,"request body must be a JSON object");let o=function(e){return"foundry"===he.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:xd(e)}(t),{customToolNames:n}=o,i=o.payload;r.debug(`Responses API [${Array.isArray(i.input)?i.input.length:1} items]`),n.size>0&&r.debug(`Custom tools detected: ${[...n].join(", ")}`);let a=function(e,t){try{return{ok:!0,payload:ud(t)}}catch(t){if(t instanceof ba)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,i);if(!a.ok)return a.response;i=a.payload;let s=Ad(e,t.input,o);if(s)return s;let l=await ga(e);if(l)return l;e.set("requestData",{model:i.model,reasoningEffort:i.reasoning?.effort,streaming:!!i.stream}),he.manualApprove&&await ha();let c=performance.now(),u=await ps(i,{signal:Lt(e)}),p=performance.now()-c;if(nt.record(p,{model:i.model,target:"responses",streaming:String(!!i.stream)}),$d(u))return async function(e,t,r){await hd(t);let o=e.get("requestData")||{};return t.usage&&(o.tokenUsage=ya({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens,prompt_tokens_details:t.usage.input_tokens_details})),o._d1=r,o.upstreamTtfbMs=r,o.upstreamTotalMs=r,e.set("requestData",o),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return G(e,async t=>{t.onAbort(()=>Bt(e));let r={value:null},o=0,a=performance.now(),s=Na(e,c);try{try{for await(let a of d)if(s(),a.data&&"[DONE]"!==a.data){o++;let s=bd(a.data,n);s=await gd(s);let l=s===a.data?a:{...a,data:s};Ze.add(1,{model:i.model,endpoint_type:"responses"}),pd(s,{usageRef:r,c:e,_d1:p}),await t.writeSSE(l)}else await t.writeSSE(a);let l=performance.now()-a,u={model:i.model,endpoint_type:"responses"};it.record(l,u),dt.record(o,u),Ma(e,c)}catch(r){if(Ft(e))return;throw gt(m,e.get("requestSpan"),r),await Sa(t,r),r}finally{r.value&&_a(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 $d=e=>Object.hasOwn(e,"output"),Ed=new B;Ed.post("/",async e=>{try{return await cn(e,"responses",Sd)}catch(t){return await jr(e,t)}});const Od=new B;Od.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 Id=new B;Id.get("/",async e=>{try{let t=await Gn();return e.json(t)}catch(t){return r.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Cd=new B;function Rd(e,t,r){let o=function(e){if(!e)return;try{let t=JSON.parse(e),r=t.error?.message??t.message;if("string"==typeof r&&r.length>0)return Ti(r).slice(0,200)}catch{}let t=Ti(e).trim();return t.length>0?t.slice(0,200):void 0}(t),n=o?` (upstream: ${o})`:"";switch(!0){case 401===e:case 403===e:return`Authentication/entitlement failed (HTTP ${e}). Your GitHub Copilot subscription may be inactive, or the Auth token is invalid. Run \`copilot-api auth\` to re-authenticate; if it persists, this account has no active Copilot access${n}.`;case 402===e:return`Premium monthly quota exhausted (HTTP 402). Switch to a non-premium model (e.g. claude-haiku-4.5) or wait for the monthly quota reset${n}.`;case 400===e:return`Model '${r}' was rejected (HTTP 400). On individual plans only some models are entitled — try claude-haiku-4.5, or run \`copilot-api doctor\` to see what works${n}.`;case 413===e:return`Request too large (HTTP 413)${n}.`;case 429===e:return`Rate limited upstream (HTTP 429) — wait and retry${n}.`;case 503===e:return`Service not ready (HTTP 503) — the model catalog or Service token is still warming up. Retry in a few seconds${n}.`;case e>=500:return`Upstream error (HTTP ${e})${n}.`;default:return`Unexpected response (HTTP ${e})${n}.`}}async function Pd(e={}){let t=performance.now(),r=e.model&&function(e){let t=he.models?.data.find(t=>t.id===e);return void 0!==t&&Ii(t)}(e.model)?[e.model]:function(e){return e.filter(e=>Ii(e)).map((e,t)=>({id:e.id,rank:Ci(e),index:t})).sort((e,t)=>e.rank-t.rank||e.index-t.index).map(e=>e.id)}(he.models?.data??[]).slice(0,3);if(0===r.length)return{ok:!1,durationMs:0,reason:"No models available — the catalog is empty (upstream /models failed at startup). Check connectivity and authentication."};let o,n=e.timeoutMs??3e4,i=()=>Math.round(performance.now()-t),a=r[0],s=!1,l=e=>(a=e,async function(e,t){try{let r=await Cd.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[$i]:Ei},body:JSON.stringify({model:e,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(r.ok)return{ok:!0,model:e,status:r.status,durationMs:t()};let o=await r.text().catch(()=>"");return{ok:!1,model:e,status:r.status,durationMs:t(),reason:Rd(r.status,o,e),detail:o.slice(0,400)||void 0,modelUnavailable:Pi(r.status,o)}}catch(r){let o=r instanceof Error?r.message:String(r);return{ok:!1,model:e,durationMs:t(),reason:`Request failed before a usable response: ${o}`,detail:o}}}(e,i)),c=(async()=>{let e=await async function(e,t,r=()=>!1){let o,n=[];for(let i of e){if(o){if(r())break;n.push(o.model)}if(o={model:i,result:await t(i)},o.result.ok||!o.result.modelUnavailable)break}return o?{result:o.result,skipped:n}:void 0}(r,l,()=>s);if(!e)throw Error("self-test had no candidate");let{modelUnavailable:t,...o}=e.result;return e.skipped.length>0?{...o,skipped:e.skipped}:o})(),u=new Promise(e=>{o=setTimeout(()=>{s=!0,e({ok:!1,model:a,durationMs:i(),reason:`Did not complete within ${n}ms. If you started with --manual, approve the request or use --no-smoke-test; otherwise the upstream may be slow or unreachable.`})},n)});try{return await Promise.race([c,u])}finally{o&&clearTimeout(o)}}Cd.use(async(e,t)=>{let o=performance.now(),n=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,i=e.req.method,a=e.req.path,s=Ut(a),l=function(e){return e===Ei}(e.req.header($i));e.set("requestId",n),e.set("isSelfTest",l),e.header("x-request-id",n);let c=Me.startSpan("copilot_api.handle_request",{kind:u.SERVER,attributes:{"http.method":i,"http.url":e.req.url,"http.route":a,"copilot_api.request_id":n,"copilot_api.endpoint_type":s}});e.set("requestSpan",c),e.set("requestTraceContext",c.spanContext()),l&&c.setAttribute("copilot_api.self_test",!0);for(let[t,r]of Object.entries(e.req.header())){let e=t.toLowerCase();_t.has(e)||"x-copilot-api-self-test"!==e&&c.setAttribute(`http.request.header.${e}`,r)}await async function(e,t){let{method:o,path:n,endpointType:i}=t;if("POST"===o&&("anthropic"===i||"openai"===i||"embeddings"===i||n.includes("/responses")))try{let t=e.req.raw.clone(),r=new Uint8Array(await t.arrayBuffer());e.set("rawBody",(new TextDecoder).decode(r.subarray(0,1048576)))}catch(e){r.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:i,path:a,endpointType:s});let m,h=new Promise(e=>{m=e});e.set("streamComplete",h),e.set("resolveStreamComplete",m);let g=f.setSpan(d.active(),c);await d.with(g,async()=>{l||Oe.registerCompletion(n,e,o);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw c.setStatus({code:p.ERROR,message:t.message}),c.recordException(t),e}});let y=e.get("requestData"),_={c:e,start:o,method:i,path:a,endpointType:s,requestId:n,span:c};(y?.streaming||y?.deferFinalize)&&e.res.status<400?h.then(()=>na(_)).catch(e=>{r.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{c.recordException(t),c.setStatus({code:p.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{c.end()}catch{}}):na(_)}),Cd.use(F()),Cd.use(async(e,t)=>{let r=e.req.header("content-length");if(r){let t=Number(r),o=ma(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"})`),da(e.req.raw,o,t),e.json({type:"error",error:{type:"request_too_large",message:`Request body exceeds ${o/1024/1024} MB limit (got ${t} bytes).`}},413)}await t()}),Cd.get("/",e=>e.text("Server running")),Cd.route("/health",Bs),Cd.route("/chat/completions",js),Cd.route("/models",cd),Cd.route("/embeddings",Ls),Cd.route("/usage",Id),Cd.route("/token",Od),Cd.route("/v1/chat/completions",js),Cd.route("/v1/models",cd),Cd.route("/v1/embeddings",Ls),Cd.route("/images",wc),Cd.route("/v1/images",wc),Cd.route("/v1/messages",ld),Cd.post("/v1/messages/count_tokens",async function(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:"invalid_request_error",message:"Invalid JSON"}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let{name:r,tokenizer:o}=await async function(e){let t=he.models?.data.find(t=>t.id===e);return!t||"Anthropic"===t.vendor||_o(t.capabilities.family)||"o200k_base"!==t.capabilities.tokenizer?{name:"claude",tokenizer:Jc}:(Gc??=import("ai-tokenizer/encoding/o200k_base").then(e=>new Y(e)),{name:"o200k_base",tokenizer:await Gc})}(t.model),n=e=>Wc(o,e),i=Kc.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");i+=Kc.perMessage+n(e)*Kc.contentMultiplier}for(let e of t.messages)i+=Kc.perMessage,i+=n(e.role),"string"==typeof e.content?i+=n(e.content)*Kc.contentMultiplier:Array.isArray(e.content)&&(i+=Yc(e.content,n));let a=t.tools?.filter(zc);a&&a.length>0&&(i+=function(e,t){let r=Kc.toolsExist;for(let[o,n]of e.entries())o>0&&(r+=Kc.perTool),r+=t(n.name),n.description&&(r+=Kc.perDesc+t(n.description)),r+=Vc(n.input_schema,t);return r}(a,n));let s=Math.round(i);"string"==typeof t.model&&e.set("requestData",{model:t.model,streaming:!1});let l=e.get("requestSpan");return l?.setAttribute("copilot_api.count_tokens.estimate",s),l?.setAttribute("copilot_api.count_tokens.tokenizer",r),e.json({input_tokens:s})}),Cd.route("/v1/responses",Ed),Cd.route("/responses",Ed),Cd.onError((e,t)=>jr(t,e));const qd=e=>`[1m${e}[0m`,Nd=e=>`[2m${e}[0m`,Md=e=>`[32m${e}[0m`,jd=e=>`[31m${e}[0m`,Dd=e=>`[33m${e}[0m`,Ld=Nd(" ─────────────────────────────────────────────────────────────");function Bd(e,t,r){console.log(` ${function(e){return"ok"===e?Md("✓"):"warn"===e?Dd("⚠"):jd("✗")}(e)} ${qd(t.padEnd(14))} ${r}`)}function Fd(e){console.log(` ${Nd("↳")} ${Nd(e)}`)}function Ud(e){return e instanceof mr?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function Hd(){let e=_.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await i.readFile(re.GITHUB_TOKEN_PATH,"utf8")).trim();return e.length>0?e:void 0}catch{return}}();return t?{token:t,source:"stored file"}:void 0}async function zd(){try{await dn();let e=(he.models?.data.length??0)>0;return Bd(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 Bd("fail","Model catalog",Ud(e)),Fd("Could not fetch /models — check connectivity/auth."),!1}}async function Jd(e){he.accountType=e.accountType;let t=await er(),r=tr();if(console.log(""),console.log(` ${qd("COPILOT-API DOCTOR")} ${Nd(`v${t}`)}`),console.log(Ld),Bd("ok","Runtime",`${r.name} ${r.version} (${r.platform}-${r.arch})`),await oe(),mn(),!await async function(){let e=await Hd();if(e){he._t2=e.token,Bd("ok","Auth token",`found (${e.source})`);try{let e=await Lr();return await Et(he,e.login),Bd("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return Bd("fail","GitHub auth",Ud(e)),void Fd("Token looks invalid/expired. Re-run `copilot-api auth`.")}}else Bd("fail","Auth token","not found"),Fd("Run `copilot-api auth` (or `copilot-api start`) to authenticate.")}())return console.log(Ld),console.log(` ${jd("✗")} ${qd("Authentication failed")} — cannot continue.`),console.log(""),1;let o=await async function(){try{let{token:e}=await Dr();return he._t1=e,Bd("ok","Service token","acquired"),!0}catch(e){let t=e instanceof mr?e.response.status:0;return Bd("fail","Service token",Ud(e)),Fd(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 zd();await async function(){try{let e=await Gn(),t=e.quota_snapshots.premium_interactions,r=t.unlimited?"credits unlimited":`credits ${Bn(Fn(t))} of ${Bn(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;Bd("ok","Copilot plan",`${e.copilot_plan} · ${r} `+Nd(`(resets ${e.quota_reset_date})`))}catch(e){Bd("warn","Copilot plan",`unavailable (${Ud(e)})`)}}();let i=!1;return o&&n?i=await async function(){let e=await Pd();return e.ok?(Bd("ok","Generation",`works via ${e.model} ${Nd(`(${e.durationMs}ms)`)}`),!0):(Bd("fail","Generation",`${e.reason}${e.status?Nd(` [HTTP ${e.status}]`):""}`),!1)}():Bd("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){Bd(t,"Client config","potential base-URL issue");for(let t of e)Fd(t)}else Bd("ok","Client config","no base-URL issues detected");Fd("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(Ld),i?(console.log(` ${Md("✓")} ${qd("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Dd("⚠")} ${qd("Some checks need attention")} — see the ${jd("✗")}/${Dd("⚠")} lines above.`),console.log(""),2)}const Gd=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 Jd({accountType:e["account-type"]});_.exit(t)}});function Kd(e){return{log(t,n){let i=r.level>=o.debug;if(t.level!==o.warn||i)for(let r of e)r.log(t,n)}}}let Wd=!1;const Yd="copilot-api-node20",Vd=`https://registry.npmjs.org/${Yd}/latest`,Xd=e=>`[1m${e}[0m`,Zd=e=>`[33m${e}[0m`;async function Qd(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Vd,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function em(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 tm,rm;async function om(e){try{let[t,r]=await Promise.all([er(),Qd(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 nm(){if(!tm||!rm)return;let{signal:e}=rm;tm.then(t=>{t&&!e.aborted&&function(e,t){let r=`npx ${Yd}@latest`,o=Zd("│"),n=` ${Xd("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,i=` Run ${Xd(r)} to update`,a=" ".repeat(54),s=Zd(`╭${"─".repeat(54)}╮`),l=Zd(`╰${"─".repeat(54)}╯`),c=["",s,`${o}${a}${o}`,`${o}${em(n,54)}${o}`,`${o}${a}${o}`,`${o}${em(i,54)}${o}`,`${o}${a}${o}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var im={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 am=262144,sm="https://barazany.dev",lm=/^[a-z0-9][a-z0-9-]*$/i,cm=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function um(e,t){if("string"!=typeof e)return"";let r=e.replaceAll(cm," ").replaceAll(/\s+/g," ").trim(),o=Array.from(r);return o.length<=t?r:`${o.slice(0,t-1).join("").trimEnd()}…`}function pm(e){if("object"!=typeof e||!e)return null;let t=e,r=um(t.title,100),o=um(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!==sm||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=`${sm}/blog/${t.slug}`),!r||!o||null===n)return null;let i=function(e){if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e))return Number.isFinite(Date.parse(e))?e.slice(0,10):void 0}(t.date);return i?{title:r,teaser:o,url:n,date:i}:{title:r,teaser:o,url:n}}function dm(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=pm(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 mm=null;function fm(e){return s.join(e,"blog-posts.json")}function hm(e=re.APP_DIR){try{if(mm&&mm.length>0)return mm;let t=function(e){try{let t=fm(e);return H.statSync(t).size>am?[]:dm(JSON.parse(H.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:dm(im)}catch{return[]}}function gm(e){return e>-6e4&&e<864e5}async function ym(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>am)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>am?null:t}let o=e.body.getReader(),n=()=>{o.cancel().catch(()=>{})};t.addEventListener("abort",n,{once:!0});let i=[],a=0;try{for(;;){let{done:e,value:t}=await o.read();if(e)break;if(a+=t.byteLength,a>am)return await o.cancel().catch(()=>{}),null;i.push(t)}}finally{t.removeEventListener("abort",n)}return t.aborted?null:Buffer.concat(i).toString("utf8")}(e,t.signal);return null===r?[]:dm(JSON.parse(r))}finally{clearTimeout(r)}}async function _m(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=fm(e),o=await H.promises.stat(r);if(o.size<=am){let e=await H.promises.readFile(r),o=JSON.parse(e.toString("utf8"));if("number"==typeof o.fetchedAt)return gm(t-o.fetchedAt)}return gm(t-o.mtimeMs)}catch{return!1}}(t,r))return;let o=await ym(e.timeoutMs??3e3);if(0===o.length)return;mm=o,await async function(e,t,r){let o=fm(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 bm(e){let t;try{({login:t}=await wm(e))}catch(e){return void r.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await Fo(),r.info("Copilot fallback enabled for Foundry rate limits, errors and timeouts")}catch(e){r.error("Copilot fallback disabled: could not load the Copilot model list; serving from Foundry only.",e)}return t}async function wm(e){e._t2&&r.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let t,o=e._t2||process.env.GH_TOKEN;o?(function(e){he._t2=e,kn=!1}(o),r.info("Using provided Auth token")):await Rn();try{t=await Lr(),await Et(he,t.login)}catch(e){throw r.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}return await(async()=>{let{token:e,refresh_in:t}=await Dr();he._t1=e,r.debug("Service token fetched successfully!"),he.showToken&&r.info("Service token:",e),vn=!0,Cn(t),kt.start(),yn=()=>{r.debug("Network connectivity restored, attempting immediate token refresh"),On(3,500,"network-restored").catch(e=>{r.error("Unexpected error in network-restored token refresh:",e)})},_n=()=>{r.debug("Network connectivity lost")},kt.on("online",yn),kt.on("offline",_n)})(),t}function 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 km(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 xm=e=>`[1m${e}[0m`,Tm=e=>`[2m${e}[0m`,Am=e=>`[36m${e}[0m`,Sm=e=>`[32m${e}[0m`,$m=e=>`[33m${e}[0m`,Em=e=>`[4m${e}[0m`,Om=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Im="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Cm="https://github.com/johnib/copilot-api-issues/issues",Rm=Tm(" ─────────────────────────────────────────────────────────────");function Pm(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function qm(e){return e&&0!==e.length?e.join("·"):"—"}function Nm(e){if(0===e.length)return[];let t=["",Rm,` ${xm("BARAZANY.DEV")} ${Tm("— Recent Posts")}`,Rm,""];for(let[r,o]of e.entries()){let e=`${o.url}${Im}`,n=Om(e,xm(Em(`[${r+1}]`)));t.push(` ${n} ${Am(o.title)}`,` ${Tm("→")} ${Tm(o.teaser)}`,"")}return t.push(Rm,` ${Om(`https://barazany.dev/blog${Im}`,"barazany.dev/blog")}`,Rm),t}function Mm(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(Tm(" → "))} ${Sm("✓")}`:Tm("off"),o=["",` ${xm("COPILOT-API")} ${Tm(`v${e.version}`)}`,Rm,` ${Tm("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Tm("User")} ${e.user} ${Tm("·")} ${e.accountType}`];return he._v1&&o.push(` ${Tm("Client")} VSCode ${he._v1}`),o.push(` ${Tm("Network")} ${t.join(Tm(" · "))}`,` ${Tm("Search")} ${r}`),e.clipboardCopied&&o.push(` ${Tm("Clipboard")} Claude Code command ${Sm("✓")}`),o.push(Rm),o}function jm(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${xm("Active")}`];if(e.model){let r=he.models?.data.find(t=>t.id===e.model),o=Pm(r?.capabilities.limits?.max_context_window_tokens),n=qm(r?.capabilities.supports.reasoning_effort);t.push(` ${Am(e.model.padEnd(32))} ${Tm("ctx")} ${xm(o.padStart(5))} ${Tm("effort")} ${Tm(n)} ${$m("← main")}`)}if(e.smallModel){let r=he.models?.data.find(t=>t.id===e.smallModel),o=Pm(r?.capabilities.limits?.max_context_window_tokens),n=qm(r?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Tm("ctx")} ${o.padStart(5)} ${Tm("effort")} ${Tm(n)} ${$m("← small")}`)}return t}function Dm(e){let t=[];for(let[r,o]of function(){let e=[],t=[],r=[],o=[];for(let n of he.models?.data??[]){let i=n.capabilities.limits?.max_context_window_tokens,a={id:n.id,ctx:i,effort:n.capabilities.supports.reasoning_effort};n.id.startsWith("text-embedding")?o.push(a):"Anthropic"===n.vendor?e.push(a):"Google"===n.vendor?r.push(a):t.push(a)}return[["Claude",e],["OpenAI",t],["Gemini",r],["Embedding",o]]}())if(0!==o.length){t.push("",` ${xm(r)}`);for(let n of o){let o=n.id===e.model||n.id===e.smallModel,i=o?Am("●"):Tm("·"),a=o?Am(n.id.padEnd(34)):n.id.padEnd(34),s=n.ctx?Pm(n.ctx).padStart(5):"".padStart(5),l="Embedding"===r?"":` ${qm(n.effort)}`;t.push(` ${i} ${a} ${Tm(s)}${Tm(l)}`)}}return t}function Lm(){let e=Cm.replace(/^https:\/\//,""),t=Om(`${Cm}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Rm,` ${xm("FOUND A BUG?")} ${Tm("— Report it on GitHub")}`,Rm,"",` ${Am("→")} ${Am(t)}`,` ${Tm("Bug reports, feature requests, and questions welcome.")}`,"",Rm]}function Bm(e){if(!e.endpoints)return[];let{scheme:t,port:r,hostname:o}=e.endpoints,n=o?`${t}://${o}:${r}`:`${t}://<your-tailscale-hostname>:${r}`,i=["",Rm,` ${xm("Claude Cowork")} ${Tm("— Settings → Inference Provider")}`,Rm,"",` ${Tm("Paste into")} ${xm("inferenceGatewayBaseUrl")}${Tm(":")}`,` ${xm(Am(n))}`];return o||i.push("",` ${Tm("Your Tailscale hostname is shown by:")} ${Am("tailscale status --self")}`),i.push("",` ${Tm("Docs:")} ${Am("https://claude.com/docs/cowork/3p/installation")}`),i}function Fm(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,r=["",Rm,` ${xm("HTTPS")} ${Tm("— self-signed cert")}`,Rm,"",` ${Tm("Cert")} ${t}`];switch(r.push("",` ${xm("Trust this cert")} ${Tm("(one-time setup)")}`),_.platform){case"darwin":r.push(` ${Tm("macOS:")}`,` ${Am("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Am(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":r.push(` ${Tm("Windows (PowerShell as Administrator):")}`,` ${Am(`Import-Certificate -FilePath "${t}" \``)}`,` ${Am("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":r.push(` ${Tm("Linux (Debian/Ubuntu):")}`,` ${Am(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Am("sudo update-ca-certificates")}`,` ${Tm("Linux (Fedora/RHEL/Arch):")}`,` ${Am(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Am("sudo update-ca-trust")}`);break;default:r.push(` ${Tm("(Unknown platform — see Node fallback below.)")}`)}return r.push("",` ${Tm("Or, for Node CLIs only (no admin needed):")}`,` ${Am(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Rm),r}function Um(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 Hm(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=br(r)}}(e);n&&(o.setAttribute("http.response.status_code",n.response.status),o.setAttribute("url.full",n.response.url)),ht(o,e),o.end();let i=e instanceof Error?e.message:String(e);ft(b.ERROR,"ERROR","Server startup failed",{...r,"exception.message":Wt(n&&n!==e?`${i} (cause: ${n.message})`:i)}),await Ne()}const zm=s.join(re.APP_DIR,"certs"),Jm=s.join(zm,"cert.pem"),Gm=s.join(zm,"key.pem"),Km=s.join(zm,"cert.meta.json");async function Wm(e){try{return await i.readFile(e,"utf8")}catch{return}}async function Ym(e){let t=await Wm(Jm),r=await Wm(Gm),o=await async function(){let e=await Wm(Km);if(e)try{let t=JSON.parse(e);return Array.isArray(t.hosts)&&"string"==typeof t.notAfter?t:void 0}catch{return}}();if(!t||!r||!o)return!1;let n=new Set(o.hosts);for(let t of e)if(!n.has(t))return!1;let i=Date.parse(o.notAfter);return!Number.isNaN(i)&&i-Date.now()>2592e6}function Vm(e){return 0!==Q(e)}async function Xm(e){await i.mkdir(zm,{recursive:!0});let t=new Date,r=new Date;r.setDate(r.getDate()+825);let o=["127.0.0.1","::1"],n=new Set(["localhost"]),a=new Set(o);for(let t of e)Vm(t)?a.add(t):n.add(t);let s=[...[...n].map(e=>({type:2,value:e})),...[...a].map(e=>({type:7,ip:e}))],l=await ee([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:r,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:s}]});return await i.writeFile(Jm,l.cert,{mode:420}),await i.writeFile(Gm,l.private,{mode:384}),await async function(e){await i.writeFile(Km,JSON.stringify(e,null,2),{mode:420})}({hosts:[...n,...a].sort(),notAfter:r.toISOString()}),{cert:l.cert,key:l.private,certPath:Jm,keyPath:Gm,generated:!0}}const Zm=[],Qm=Date.now();let ef="";function tf(){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()-Qm)/1e3}});for(let t of Zm)try{await t()}catch(e){r.error("Error during cleanup:",e)}o.end(),function(e,t){let r=Om("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),o=["",Rm,` ${xm("COPILOT-API")} ${Tm(`v${e}`)} ${Tm("·")} ${Um(t)} uptime`,Rm,""," Check in from time to time on",` ${Am(r)}`,"",Rm,""];console.log(o.join("\n"))}(ef,Date.now()-Qm),_.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=>So(e)).map(e=>e.id),of=e=>e.filter(e=>$o(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,i,a=function(e,t,o){if(e&&t){if(!o.includes(e))throw r.info(`Available services: \n${o.join("\n")}`),Error(`Invalid model: ${e}`);if(!o.includes(t))throw r.info(`Available services: \n${o.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,rf(he.models.data));a?(n=a.model,i=a.smallModel):(n=await r.prompt("Select a model to use",{type:"select",options:rf(he.models.data)}),i=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:i,NODE_EXTRA_CA_CERTS:o?.certPath},"claude");try{return h.writeSync(s),!0}catch{return r.warn("Failed to copy to clipboard. Here is the command:"),r.log(s),!1}}function af(e){return e._t2?"cli_arg":_.env.GH_TOKEN?"env_var":"stored"}function sf(e){let{options:t,version:r,runtime:o,_u1:n}=e,i=Me.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:yt({config:km(t,{version:r,_t3:af(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()-Qm},"copilot_api")});if(he.models?.data)for(let e of he.models.data)i.addEvent("copilot_api.model.available",yt(e,"model"));i.end(),ft(b.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()-Qm},"copilot_api"))}async function lf(e,t){try{return await async function(e){return"foundry"===e.provider?(he.foundry=oo(process.env),he.connectivity.h2=!1,he.connectivity.h2Keepalive=!1,"entra"===he.foundry.auth&&await Yr(he.foundry),r.info(`Using Microsoft Foundry upstream: ${he.foundry.endpoint} (${"entra"===he.foundry.auth?"Entra ID":"API key"} auth)`),{login:("copilot"===e.fallback?await bm(e):void 0)??"foundry"}):wm(e)}(e)}catch(r){throw await Hm(r,{version:t,provider:e.provider,accountType:e.accountType,_t3:af(e)}),r}}async function cf(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[r,o]=await Promise.all([i.readFile(e,"utf8"),i.readFile(t,"utf8")]);return{cert:r,key:o,certPath:e,keyPath:t,generated:!1}}(e.httpsCert,e.httpsKey);if(e.httpsCert||e.httpsKey)throw Error("Both --https-cert and --https-key must be provided together");return async function(e=[]){if(await Ym(e)){let e=await Wm(Jm),t=await Wm(Gm);if(e&&t)return{cert:e,key:t,certPath:Jm,keyPath:Gm,generated:!1}}return r.info("Generating new self-signed TLS certificate…"),Xm(e)}(e.httpsHosts)}}async function uf(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:o}=mi;try{z(t),z(o)}catch{throw r.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:o}}(e);if(tf(),Zm.push(()=>{r.debug("Cleaning up connectivity monitor"),kt.stop()},()=>{r.debug("Cleaning up token management"),r.debug("Cleaning up token management"),vn=!1,hn&&=void clearInterval(hn),yn&&=void kt.off("online",yn),_n&&=void kt.off("offline",_n),gn=void 0,bn=void 0},async()=>{r.debug("Cleaning up HTTP/2 client"),await async function(){r.debug("Stopping HTTP/2 pool"),Fa&&=void clearInterval(Fa),Ua&&=void clearInterval(Ua);let e=[...Da.keys(),...La];Da.clear(),La.clear(),ja.clear(),Ba=void 0;for(let t of e)Ha(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(),_m().catch(()=>{}),mn();let o=await er();ef=o;let n=tr();!function(e,t){t&&(Re=t),Ce=crypto.randomUUID();let r=T({[O]:"copilot-api",[I]:e,[E]:Ce}),{endpoint:o,headers:n}=qe();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 A({exporter:new v({url:`${o}/v1/logs`,headers:n})})],instrumentations:[]}),Ie.start()}(o,Qm);let i=await lf(t,o);await async function(){try{return await dn({refreshFallback:!1}),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,o=e instanceof Error?e.message:"Unknown error occurred",n=void 0===t?"":` (HTTP ${t})`,i="foundry"===he.provider?"Foundry":"Copilot";return r.warn(`Could not fetch model list from ${i}${n}: ${o}. This is likely a transient network or authentication issue. The proxy will start anyway; model listing endpoints may return empty until the cache is populated.`),!1}}()||function(e){let t=setTimeout(()=>{dn().then(()=>{r.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let a=function(e=18e5){let t=setInterval(()=>{dn().then(()=>r.debug("Model list refreshed successfully")).catch(e=>{r.warn("Failed to refresh model list; keeping existing cache:",e)})},e);return t.unref(),()=>{clearInterval(t)}}();Zm.push(()=>{r.debug("Cleaning up model refresh interval"),a()}),he.connectivity.h2&&(Ga(Ja(Ot(he))),he.connectivity.h2Keepalive&&Wa()),sf({options:t,version:o,runtime:n,_u1:i});let s=await cf(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=of(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:of(he.models.data)});let i=vm({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:o?.certPath},`codex --model ${n}`);try{return h.writeSync(i),!0}catch{return r.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),r.log(i),!1}}(t,c,s);(function(e){let t=[...Mm(e),...jm(e),...Dm(e),...Lm(),"",...Nm(hm()),...Bm(e),...Fm(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:r,runtime:o,user:n,clipboardCopied:i,tls:a}=e,s=a?"https":"http";return{version:r,runtime:o,user:n,accountType:t.accountType,port:t.port,timeout:t.timeout,webSearchProviders:t.webSearchProviders.map(e=>e.name),model:t.model,smallModel:t.smallModel,clipboardCopied:i,https:a?{certPath:a.certPath,keyPath:a.keyPath,generated:a.generated,selfSigned:!t.httpsCert}:void 0,endpoints:t.claudeCowork?{scheme:s,port:t.port,hostname:await ti()}:void 0}}({options:t,version:o,runtime:n,user:i.login,clipboardCopied:u,tls:s})),nm(),Z({fetch:Cd.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 Pd({model:t});if(n.ok){let t=void 0===o||["::1","127.0.0.1","localhost"].includes(o)?`Point your client at ${e}`:`Point your client at ${e} — you bound ${o}, so from another machine/container replace \`localhost\` with this host's reachable IP/hostname.`;return r.success(`Self-test passed — generation works via ${n.model} (${n.durationMs}ms). ${t}`),void(n.skipped&&r.info(` Skipped models this account cannot use: ${n.skipped.join(", ")}`))}let i=n.status?` (HTTP ${n.status})`:"";r.warn(`Self-test FAILED${i}: ${n.reason??"unknown error"}`),n.detail&&r.info(` detail: ${Ti(n.detail)}`),r.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){r.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(c,t.smallModel??t.model,t.hostname)}function pf(e,t){let r=Number.parseInt(e,10);if(Number.isNaN(r))throw Error(`${t} must be a number, got: "${e}"`);return r}const df=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:pf(t,"--rate-limit"),n=e.timeout,i=void 0===n?fe:pf(n,"--timeout"),a=function(e,t){let r=e??t,o=void 0===r?15e3:pf(r,"--connect-timeout");if(o<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${o}`);return o}(e["connect-timeout"],_.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??_.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&r.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},o=(e.order??[]).map(e=>e.toLowerCase());for(let e of o)if(!Jp(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${zp.join(", ")}`);let n=o.length>0?o:zp,i=new Set,a=o.length>0,s=[];for(let e of n){if(!Jp(e)||i.has(e))continue;i.add(e);let o=t[e];o?s.push({name:e,key:o}):a&&r.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||_.env.TAVILY_API_KEY,exaApiKey:_.env.EXA_API_KEY,order:u}),d=(_.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d,f=function(e,t){let r=(e??t??"copilot").trim().toLowerCase();if("copilot"===r||"foundry"===r)return r;throw Error(`--provider must be "copilot" or "foundry", got: "${r}"`)}(e.provider,_.env.COPILOT_API_PROVIDER);return uf({provider:f,fallback:Bo(e.fallback,_.env.COPILOT_API_FALLBACK,f),port:pf(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:o,rateLimitWait:e.wait,_t2:e["github-token"],_cc1:e["claude-code"],codex:e.codex,model:e.model,smallModel:e["small-model"],showToken:e["show-token"],timeout:i,connectTimeout:a,webSearchProviders:p,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!m})}});Wd||(Wd=!0,r.setReporters([Kd(r.options.reporters)]));const mf=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(tm||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;rm=e,tm=om(e).catch(()=>null)})(),mf||nm();const ff=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Nn,start:df,"check-usage":Vn,debug:nr,doctor:Gd,"cowork-setup":ki}});await t(ff),mf||(rm?.abort(),rm=void 0,tm=void 0);export{};
|