copilot-api-node20 0.44.0-preview.25 → 0.44.0-preview.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.mjs +1 -1
  2. package/package.json +1 -1
package/dist/main.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{defineCommand as e,runMain as t}from"citty";import 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;const se=()=>void 0!==ie.getStore(),le=()=>ie.getStore();function ce(){let e=ie.getStore();e&&(e.start??=performance.now(),e.onSend?.())}const ue=6e5,pe={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:ue,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 de(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}})}(pe);const me=" │ ",fe=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()},he=(e,t)=>e.padEnd(t),ge=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),_e=(e,t,o)=>` --\x3e ${he(e,4)} ${he(t,21)} ${he(o,3)}`,ye=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return he(t,22)})(e.model??"—")+he(t,8)},we=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?fe(Math.max(t-o,0)):"—",r=e?fe(e.outputTokens??0):"—",a=o?fe(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},be=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${he("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=fe(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},ke=e=>{if(void 0===e.ttfbMs)return`e2e ${ge(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${ge(e.ttfbMs)} → e2e ${ge(e.e2eMs)} ${t}`},ve=e=>e?pe.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,xe=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}}),Te={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=>[_e(e.method,e.path,e.status),ye(e),we(e.tokenUsage),be(e.tokenUsage,e.maxContextTokens),ke({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(me))({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:ve(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),ct(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)},...xe(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=>[_e(e.method,e.path,"429"),ye(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${ge(e.e2eMs)}`].join(me))({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=_e(e.method,e.path,e.status.toString()),o=ye(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${ge(e.e2eMs)}`].join(me)})({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(()=>Te.cleanup(),6e4);let Ae,$e,Se=Date.now();const Ee={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function Oe(){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):Ee;return{endpoint:e.replace(/\/$/,""),headers:t}}async function Ce(){if(!Ae)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([Ae.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 Ie=f.getTracer("copilot-api"),Re=m.getMeter("copilot-api"),Ne=b.getLogger("copilot-api"),Pe=Re.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),qe=Re.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),De=Re.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),je=Re.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),Me=Re.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Fe=Re.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Ue=Re.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),He=Re.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Be=Re.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Le=Re.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),ze=Re.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Je=Re.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Ge=Re.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Ke=Re.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),We=Re.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ye=Re.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Ve=Re.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Xe=Re.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Ze=Re.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Qe=Re.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),et=Re.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),tt=Re.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),ot=Re.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),nt=Re.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),rt=Re.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),at=Re.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),it=Re.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),st=Re.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),lt=Re.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function ct(e,t,o,n,r){let a=f.getActiveSpan()?.spanContext()??r;Ne.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function ut(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 pt(e,t,o){ut(e,o),t&&t!==e&&ut(t,o)}function dt(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,dt(r,e)))}return o}Re.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!_t.getConnectivityStats().isOnline)}),Re.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(_t.getConnectivityStats().consecutiveFailures)}),Re.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(pe.models?.data.length??0)}),Re.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(Te.completionCallbacks.size)}),Re.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-Se)/1e3)});const mt=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function ft(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();"authorization"===o&&e.setAttribute(`http.${t}.header.authorization.shape`,de(r)),!mt.has(o)&&e.setAttribute(`http.${t}.header.${o}`,r)}}async function ht(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:l}=e,c=Ie.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...l}});a&&ft(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();mt.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(c,e),Ge.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 ut(c,e),c.end(),e}}async function gt(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=Ie.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});ft(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&&!mt.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Ge.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 ut(f,e),f.end(),e}}const _t=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:pe.connectivity.probeEndpoints,fastInterval:pe.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?pe.connectivity.slowProbeInterval:pe.connectivity.fastProbeInterval)+Math.random()*pe.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=Ie.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),pe.connectivity.timeoutMs);try{let n=!1;for(let e of pe.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",...pe.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,rt.record(r,{endpoint:e,result:"success"});break}rt.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),ze.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")),Je.add(1,{from:"offline",to:"online"}),ct(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")),Je.add(1,{from:"online",to:"offline"}),ct(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?pe.connectivity.slowProbeInterval:pe.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*pe.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:pe.connectivity.jitterMaxMs>0,connectionPooling:pe.connectivity.connectionPooling,dnsCache:pe.connectivity.dnsCache}}},yt=()=>({"content-type":"application/json",accept:"application/json"}),wt="0.48.1",bt=`copilot-chat/${wt}`,kt=`GitHubCopilotChat/${wt}`,vt=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},xt=async(e,t)=>{e.machineId||=await vt(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})()},Tt=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,At=(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":bt,"User-Agent":kt,"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},$t=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const St=(e,t,o)=>{let n=At(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&&$t.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},Et="https://api.github.com",Ot=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":bt,"user-agent":kt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),Ct="https://github.com",It="01ab8ac9400c4e429b23",Rt=["user:email"].join(" "),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("/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",Xe.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(pe.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!se()&&(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=Te.completionCallbacks.get(n);r&&(Te.logError(r,t,o),Te.completionCallbacks.delete(n))}async function Oo(e,t){let o=f.getActiveSpan(),n=e.get("requestId"),r=Te.completionCallbacks.get(n);r&&(Te.logRateLimit(r,t.response),Te.completionCallbacks.delete(n)),Fe.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),ct(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),ct(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",pe.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)?(Te.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"),ct(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.";ct(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.";ct(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),ct(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=`${Et}/copilot_internal/v2/token`,t=pe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await ht({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:Ot(pe),signal:o.signal});try{if(!t.ok)throw new co("Failed to get Service token",t);return await t.json()}catch(e){throw ut(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function Do(){let e=`${Et}/user`,t=pe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await ht({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${pe._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 ut(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=Ie.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 ut(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"===pe.provider){if("entra"!==pe.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})=>{pe._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)):Tt(e),cn=(e,t=!1)=>an(e)?on(sn(e)):At(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,pe.timeoutMs);try{let{response:n,span:r}=await ht({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 ut(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(pe)&&pe.foundry?wn(pe.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(pe)}/models`,t=cn(pe),o=pe.timeoutMs,n=new AbortController,r=po(n,o);try{let{response:o,span:r}=await ht({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 ut(r,e),e}finally{r.end()}}finally{clearTimeout(r)}},xn=e=>"embeddings"!==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&&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(pe)||!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=se()||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=new WeakMap;async function Zn(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 Qn(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 er(e){let t=le();return void 0!==t&&Xn.has(t)&&!jt(e)}function tr(){let e=le(),t=e&&Xn.get(e);t&&(t.deferReset=!0)}function or(){let e=le(),t=e&&Xn.get(e),o=t?.sent();t&&o&&Ln(t.model,o)}async function nr(e,t,o){let n=le(),r=n&&Xn.get(n);if(!n||!r)throw Error("Not in a Foundry attempt the fallback stands behind");Xn.delete(n);let{model:a,handler:i}=r;return Qn(a,t,{windowMs:await Zn(a,o,r.sent()??Hn(a)),attemptStart:n.start}),function(e){return ie.exit(e)}(()=>Vn(e,i,{model:a,reason:t,inStream:!0}))}async function rr(e,t,o){if(!Fn()||!an(pe))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),{attempt:a,sent:i}=function(e,t){let o,n={onSend:()=>{o=Hn(e)}},r=()=>o;return Xn.set(n,{model:e,handler:t,sent:r}),{attempt:n,sent:r}}(n,o);try{let t=await function(e,t){return ie.run(e,t)}(a,()=>o(e)),r=i(),s=!0===Xn.get(a)?.deferReset;return t.ok&&r&&!s&&Ln(n,r),t}catch(t){let s=i(),l=Kn(t,void 0!==s);if(!l||(Qn(n,l,{windowMs:await Zn(n,t,s??r),attemptStart:a.start}),jt(e)))throw t;return Vn(e,o,{model:n,reason:l})}}const ar=e=>new Promise(t=>{setTimeout(t,e)}),ir=e=>null==e;async function sr({refreshFallback:e=!0}={}){let t=await kn();pe.models=t,e&&Fn()&&await Mn().catch(e=>{o.warn("Failed to refresh the Copilot fallback models:",e)})}const lr=()=>{pe._v1="1.140.0-insider"};var cr=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let ur,pr,dr,mr,fr,hr=!1,gr=!1,_r=!1;function yr(){return wr()?fr:void 0}function wr(){return void 0!==fr&&Date.now()-fr.at<6e4}function br(){return _r?"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 kr=()=>a.readFile(Q.GITHUB_TOKEN_PATH,"utf8");function vr(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";pe._t1=void 0,fr={status:s,message:l,at:Date.now()},clearInterval(ur),ur=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Be.add(1,{reason:r,success:"false"}),Le.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),nt.record(performance.now()-a,{reason:r}),ct(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 xr(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;pe._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),Le.add(1,{reason:r}),nt.record(performance.now()-a,{reason:r}),ct(w.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Tr=async(e=5,t=1e3,n="scheduled")=>hr?(o.debug("Token refresh already in progress, coalescing"),pr):(hr=!0,pr=Ie.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 pe._t1=t,fr=void 0,gr&&void 0===ur&&(o.info("Token refresh recovered, resuming scheduled refresh"),$r(s)),o.debug("Service token refreshed successfully"),pe.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Be.add(1,{reason:n,success:"true"}),nt.record(performance.now()-a,{reason:n}),void ct(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 vr({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),Be.add(1,{reason:n,success:"false"}),l)return void xr({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(),hr=!1,pr=void 0}}),pr);async function Ar(){return!!pe._t1||!wr()&&(void 0!==fr&&_r&&await async function(){if(pr)return;let e=(await kr().catch(()=>{}))?.trim();e&&e!==pe._t2?.trim()&&(pe._t2=e,o.info("Picked up re-authenticated Auth token from disk"),pe.showToken&&o.info("Auth token:",e))}(),await Tr(3,250,"on-demand"),!!pe._t1)}function $r(e){ur&&clearInterval(ur);let t=Math.max(1e3*(e-60),6e4);ur=setInterval(()=>{Tr(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Sr(e){try{let t=await kr();if(t&&!e?.force)return pe._t2=t,_r=!0,pe.showToken&&o.info("Auth token:",t),void await Er();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=pe.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${Ct}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:It,scope:Rt}),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 cr("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=pe.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${Ct}/login/oauth/access_token`,{method:"POST",headers:yt(),body:JSON.stringify({client_id:It,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await ar(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 cr("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new cr("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 ar(t);continue}if(r.access_token)return r.access_token;await ar(t)}catch(e){if(e instanceof cr)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await ar(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(Q.GITHUB_TOKEN_PATH,e,{mode:384}))(r),pe._t2=r,_r=!0,pe.showToken&&o.info("Auth token:",r),await Er()}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 Er(){let e=await Do();o.success(`Authenticated as ${e.login}`)}async function Or(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),pe.showToken=e.showToken,await ee(),await Sr({force:!0}),console.log([""," Get started:",""," $ npx copilot-api-node20@latest start --claude-code"," $ npx copilot-api-node20@latest start --codex",""," Full docs: https://www.npmjs.com/package/copilot-api-node20",""].join("\n")),process.exit(0)}const Cr=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})=>Or({verbose:e.verbose,showToken:e["show-token"]})}),Ir=.01,Rr=864e5,Nr=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Pr=new Intl.NumberFormat("en-US"),qr=e=>Nr.format(e*Ir),Dr=e=>e.credits_used??e.entitlement-e.remaining,jr=(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())/Rr;if(r<.5)return;let a=Dr(e),i=a*Ir/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Ir,c=new Date(n.getTime()+l/i*Rr);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Mr=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Pr.format(Dr(e))} of ${Pr.format(e.entitlement)} used`:"n/a",Fr=e=>e.padEnd(14),Ur=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Fr("AI credits")}unlimited`);else{let e=Dr(o),t=o.percent_remaining;n.push(`${Fr("AI credits")}${qr(e)} / ${qr(o.entitlement)} ${t.toFixed(1)}% left`,`${Fr("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Fr("")}${Pr.format(e)} of ${Pr.format(o.entitlement)} credits`)}if(n.push("",`${Fr("Chat")}${Mr(e.quota_snapshots.chat)}`,`${Fr("Completions")}${Mr(e.quota_snapshots.completions)}`,"",`${Fr("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Rr)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=jr(o,e.quota_reset_date,t);r&&n.push(`${Fr("Burn rate")}~${Nr.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?`${Pr.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Fr("Overage")}${a}`)}return n.join("\n")},Hr=async()=>{let e=`${Et}/copilot_internal/user`,t=pe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await ht({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:Ot(pe),signal:o.signal});try{if(!t.ok)throw new co("Failed to get usage",t);return await t.json()}catch(e){throw ut(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Br=()=>y.stdout.write(""),Lr=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,zr=async()=>{let e=await Hr();return Ur(e)},Jr=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 Sr(),!e.watch){try{o.box(await zr())}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 zr();n&&Br(),o.box(e),o.log(Lr(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Gr=D(g);async function Kr(){let e="win32"===y.platform?"where.exe":"which";try{return await Gr(e,["tailscale"]),!0}catch{return!1}}async function Wr(){try{let{stdout:e}=await Gr("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Yr(e){return e.replace(/\.$/,"")}async function Vr(){let e=await Wr();if(e?.Online)return Yr(e.DNSName)}const Xr=D(g),Zr=e=>`${e}`,Qr=e=>`${e}`,ea=e=>`${e}`,ta=e=>`${e}`,oa=e=>`${e}`,na=e=>`${e}`,ra=Qr(" ─────────────────────────────────────────────────────────────"),aa=s.join(Q.APP_DIR,"certs","tailscale"),ia=s.join(aa,"cert.pem"),sa=s.join(aa,"key.pem"),la={certDir:aa,certPath:ia,keyPath:sa};function ca(){switch(y.platform){case"darwin":return[` ${Qr("Install Tailscale for macOS:")}`,` ${ea("https://tailscale.com/download/mac")}`,` ${Qr("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${Qr("After installing, open the Tailscale app and sign in.")}`,` ${Qr("Then re-run this command.")}`].join("\n");case"linux":return[` ${Qr("Install Tailscale for Linux:")}`,` ${ea("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${ea("sudo tailscale up")}`,` ${Qr("or")} ${ea("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${Qr("Install Tailscale for Windows:")}`,` ${ea("https://tailscale.com/download/windows")}`,"",` ${Qr("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${Qr("Install Tailscale:")} ${ea("https://tailscale.com/download")}`}}function ua(){let e=[` ${oa("Tailscale is not running.")}`];return"darwin"===y.platform?e.push(` ${Qr("Open the Tailscale app from Applications and sign in.")}`,` ${Qr("Download:")} ${ea("https://tailscale.com/download/mac")}`):"win32"===y.platform?e.push(` ${Qr("Open the Tailscale app and sign in.")}`,` ${Qr("Download:")} ${ea("https://tailscale.com/download/windows")}`):e.push(` ${Qr("Connect with:")} ${ea("sudo tailscale up")}`),e.push("",` ${Qr("Then re-run this command.")}`),e.join("\n")}async function pa(){try{return await a.access(ia),await a.access(sa),!0}catch{return!1}}function da(e){console.log(""),console.log(ra),console.log(` ${Zr("Claude Cowork Setup")} ${Qr("— Diagnostic")}`),console.log(ra),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?ta("✅"):"missing"===n.status?oa("❌"):na("❓");let r=n.detail?Qr(` ${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(` ${ta("All checks passed.")}`):console.log(` ${oa(`${t.length} issue(s).`)} Run ${ea("copilot-api cowork-setup install")} to fix.`),console.log("")}const ma={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},fa=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Kr();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return da(e),console.log(""),console.log(ca()),void console.log("");let o=await Wr();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},da(e),console.log(ua()),void console.log("");let n=Yr(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await pa();e["tailscale-cert"]=r?{status:"ok",detail:ia}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),da(e)}(),y.exit(0)}}),ha=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:ma},async run({args:e}){await async function(e){if(console.log(""),console.log(ra),console.log(` ${Zr("Claude Cowork Setup")} ${Qr("— Install")}`),console.log(ra),console.log(""),!await Kr())return console.log(` ${oa("Tailscale is not installed.")}`),console.log(""),console.log(ca()),console.log(""),console.log(` ${Qr("After installing, run")} ${ea("tailscale up")} ${Qr("to connect, then re-run this command.")}`),void console.log("");let t=await Wr();if(!t||!t.Online)return console.log(ua()),void console.log("");let n=Yr(t.DNSName);if(console.log(` ${Qr("Tailscale hostname:")} ${Zr(n)}`),console.log(""),console.log(` ${Zr("Generating TLS certificate via Tailscale…")}`),console.log(` ${Qr("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${ea(`$ tailscale cert --cert-file ${ia} --key-file ${sa} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(aa,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Xr("tailscale",["cert","--cert-file",ia,"--key-file",sa,n]),console.log(` ${ta("✓ 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(ra),console.log(` ${Zr("Next steps")}`),console.log(ra),console.log(""),console.log(` ${Zr("1.")} Start the proxy:`),console.log(` ${ea("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Zr("2.")} In Cowork ${Qr("→")} Settings ${Qr("→")} Inference Provider, set:`),console.log(` ${Zr("inferenceGatewayBaseUrl")} = ${ea(`https://${n}:<port>`)}`),console.log(` ${Qr("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Zr("3.")} Restart Cowork ${Qr("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${Qr("For Cowork's own configuration docs, see:")}`),console.log(` ${ea("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),ga=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:ma},async run({args:e}){await async function(e){if(console.log(""),console.log(ra),console.log(` ${Zr("Claude Cowork Setup")} ${Qr("— Revert")}`),console.log(ra),console.log(""),!await pa())return console.log(` ${Qr("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${Zr("Remove Tailscale cert files:")}`),console.log(` ${Qr(ia)}`),console.log(` ${Qr(sa)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(aa,{recursive:!0}),console.log(` ${ta("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${Qr("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),_a=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:fa,install:ha,revert:ga}}),ya=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function wa(e){if(!ya.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 ba(e){return"string"==typeof e?wa(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=ba(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?ba(a):a;!t&&(i!==a||"__proto__"===r)&&(t=ka({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=ka({},o,o.length),t.properties={}),t??e}(e):e}function ka(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const va="x-copilot-api-self-test",xa=q();const Ta=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Aa(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==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)}let $a;function Sa(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();$a??=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",$a),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();mt.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:p.ERROR,message:`HTTP ${a}`})}function Ea(e){try{Sa(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(Pe.add(1,d),Ze.record(s,d),c>=400&&qe.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&&(De.add(e.inputTokens,t),at.record(e.inputTokens,t)),e.outputTokens&&(je.add(e.outputTokens,t),it.record(e.outputTokens,t)),e.cachedTokens&&Me.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&Te.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}Te.completionCallbacks.delete(e.requestId)}const Oa=async()=>{if(!re())return Ie.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),lt.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),We.add(1,{result:"rejected"}),new co("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),We.add(1,{result:"approved"})}finally{e.end()}})};async function Ca(e){if(un(pe)||await Ar())return null;let t=yr();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${br()}`,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 Ia(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 Ra(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 Na=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Pa(e){if(!e||"string"!=typeof e)throw new Na("Model name is required and must be a string");if("foundry"===pe.provider)return e;if(!pe.models?.data)throw new Na("Models not available. Please try again later.",503);let t=pe.models.data.map(e=>e.id);if(t.includes(e))return e;let o=Cn(e,t);if(!o)throw Ue.add(1,{requested_model:e}),new Na(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function qa(e){let t=pe.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===pe.provider?gn(e):/gpt-[\d.]+-codex/i.test(e)}async function Da(e){if(void 0===e.rateLimitSeconds||re())return;let t=e.rateLimitSeconds;return Ie.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"),Fe.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"),Fe.add(1,{action:"waited",source:"local"}),tt.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await ar(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var ja=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Ma(e){if(e instanceof ja)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 Fa(e,t){let{type:n,message:r}=Ma(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 Ua(e,t){let{type:n,message:r}=Ma(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 Ha(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 Ba(e,t,o){return Math.min(Math.max(e,t),o)}function La(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 La(JSON.parse(r),t+1)}catch{return null}}function za(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Ha(o.capabilities.supports.min_thinking_budget),r=Ha(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Ha(o.capabilities.limits?.max_output_tokens)??void 0}}function Ja(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Ba(Ha(e.requestedBudget)??o,o,n),a=Ha(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 Ga(e,t){if(ir(e.thinking_budget))return e;let o=za(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Ja({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 Ka(e){return"invalid_thinking_budget"===La(e)}async function Wa(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(ir(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(!Ka(i))return null;let l=za(n,t.model);return l?function(e,t){let o=Ja({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=Ha(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 Ya(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 Va(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const Xa=new Map,Za=new Map,Qa=new Set;let ei,ti,oi;function ni(e){return!e.closed&&!e.destroyed}function ri(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 Xa.set(t,Date.now()),Ve.add(1,{event:"created",origin:e}),ct(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=Qa.has(t);Ve.add(1,{event:"goaway",origin:e}),ct(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}),Za.delete(t),Qa.delete(t),Xa.delete(t),ni(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function ai(e,t){if(!pe.connectivity.h2)return;if(ei&&ei!==e&&function(){for(let e of[...Za.keys(),...Qa])ni(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Za.clear(),Qa.clear(),Xa.clear()}(),ei=e,t?.fresh){let t=ri(e);return Qa.add(t),t}let n=Date.now();for(let[t]of Za)if(n-(Xa.get(t)??0)>=6e5)Za.delete(t),Xa.delete(t),ni(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ve.add(1,{event:"rotated",origin:e}),ct(w.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(ni(t))return Za.delete(t),Qa.add(t),t;Za.delete(t),Xa.delete(t)}let r=ri(e);return Qa.add(r),r}function ii(e){e&&Qa.delete(e)&&(ni(e)?Za.set(e,Date.now()):Xa.delete(e))}function si(){oi||(oi=setInterval(()=>{!function(){let e=Date.now(),t=pe.connectivity.h2Keepalive,n=Za.size;for(let[r,a]of Za)e-a<6e4||t&&n<=1||(Za.delete(r),Xa.delete(r),n--,ni(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ve.add(1,{event:"idle_reaped",origin:ei??""}),ct(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${ei}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":ei??""}))}()},3e4),oi.unref())}function li(){ti||(o.debug("Starting HTTP/2 keepalive (every 45s)"),ti=setInterval(()=>{(async function(){if(0===Za.size&&0===Qa.size){if(ei){let e=ri(ei);Za.set(e,Date.now())}return}let e=[...Za.keys()];for(let t of e)Za.delete(t);await Promise.allSettled(e.map(async e=>{if(ni(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:At(pe)});await n.dump(),Ye.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Za.set(e,Date.now())}catch(t){Ye.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ve.add(1,{event:"error",origin:ei??""}),Xa.delete(e),ni(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Xa.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),ti.unref(),si())}function ci(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)}function ui(e){return e.max_completion_tokens??e.max_tokens}async function pi(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&&Ra(t,n.usage),n}catch(e){throw ut(t,e),e}finally{t.end()}}const di=e=>an(pe)?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=ui(e);return null==i?a:{...a,max_completion_tokens:i}}(e,pe.models),mi=e=>an(pe)?e:ba(e),fi=async(e,t)=>{let n=mi(e),r=t?.signal;try{return await _i(n,r)}catch(e){if(e instanceof co&&401===e.response.status){if(!await Yo(e))throw e;return _i(n,r)}let t;if(e instanceof co)try{t=await e.response.clone().text()}catch{t=void 0}let a=await Wa({payload:n,error:e,models:pe.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 _i(mi(a),r);throw e}},hi=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 gi(e,t){let o=()=>t.abort(e?.reason);return e?.aborted?o():e?.addEventListener("abort",o,{once:!0}),()=>e?.removeEventListener("abort",o)}async function _i(e,t){if(!un(pe))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(pe,o),"X-Initiator":n?"agent":"user"},a=ln(pe),i=`${a}/chat/completions`,s=pe.timeoutMs,l=di(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":ui(e)??0,"copilot_api.vision_enabled":o,"copilot_api.initiator":n?"agent":"user","copilot_api.upstream.provider":pe.provider};for(let o=0;o<=1;o++){ce();let n=ai(a,{fresh:o>0}),l=new AbortController,p=Gn(l,s),d=gi(t,l);try{let{statusCode:t,headers:a,body:d,span:m}=await gt({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=ci(d,{status:t,headers:a});if(e.stream){let e=await hi(f,m);if(e)throw new co("Failed to create chat completions",e,{outgoingBody:c,outgoingHeaders:r});return{events:L(f),span:m,release:()=>ii(n)}}try{return await pi(f,m,{outgoingBody:c,outgoingHeaders:r})}finally{ii(n)}}catch(e){if(ii(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 yi=new Map;const wi=["none","minimal","low","medium","high","xhigh","max"];function bi(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=wi.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=wi.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 ki(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:[];yi.set(e.model,r);let a=bi(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 vi(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&&Ra(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 ut(t,e),e}finally{t.end()}}const xi=async(e,t)=>{let o=an(pe),n=o?function(e){let t=yi.get(e.model);return t?bi(e,t):e}(e):e,r=!1,a=!1;for(;;)try{return t?.onAttempt?.(n),await Ai(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=ki(n,await e.response.clone().text().catch(()=>{}));if(t){n=t;continue}}throw e}};function Ti(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 Ai=async(e,t)=>{if(!un(pe))throw Error("Service token not found");let o=an(pe)?e:ba(e),n={...cn(pe),"X-Initiator":"agent"},r=ln(pe),a=`${r}/responses`,i=pe.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":pe.provider}))(o,i);for(let e=0;e<=1;e++){ce();let c=ai(r,{fresh:e>0}),u=new AbortController,d=Gn(u,i),m=Ti(t,u);try{let{statusCode:t,headers:r,body:f,span:h}=await gt({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=ci(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:L(g),span:h,release:()=>{m.dispose(),ii(c)}}}try{return await vi(g,h,{outgoingBody:s,outgoingHeaders:n})}finally{m.dispose(),ii(c)}}catch(t){if(m.dispose(),ii(c),await lo(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{d.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},$i=e=>Object.hasOwn(e,"output");function Si(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 Ei=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const Oi=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 Ci(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Ei(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Ei(`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=>Ri(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=Ni(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Ri(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:Ri(o.content)})}return t}(e.messages);if(0===o.length)throw new Ei("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),Ii(e.temperature)&&(n.temperature=e.temperature),Ii(e.top_p)&&(n.top_p=e.top_p),Ii(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),Ii(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 Ii(e){return null!=e}function Ri(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Ni(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 Ei(`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 Pi(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 qi(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 Di(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 ji(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Mi(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=ji(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Di(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),[Di(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Fi(e,t){let o=[Di(e,{},qi(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=Pi(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Ui(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:[Di(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Mi(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=ji(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Di(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Fi(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 Hi="openai_responses";function Bi(e){let t=performance.now(),n=Ie.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),Ci(e)}finally{t.end()}});ot.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!Oi.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 Li(e){let t=performance.now(),o=Ie.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:qi(e,n.length>0)}]};return e.usage&&(r.usage=Pi(e.usage)),r}(e)}finally{t.end()}});return ot.record(performance.now()-t,{direction:"responses_to_openai"}),o}function zi(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=Pi(t.usage);a.tokenUsage=Ia(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(Li(t))}async function Ji(e,t,n){let r;try{r=Bi(t)}catch(t){if(t instanceof Ei)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}),pe.manualApprove&&!n.isSelfTest&&await Oa();let a=await Ca(e);if(a)return a;let i=performance.now(),s=await xi(r),l=performance.now()-i;if(Qe.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),$i(s))return zi(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=Ya(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++,Ke.add(1,{model:r.model,endpoint_type:Hi});let c=Si(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Ia(c),t._d1=l,e.set("requestData",t)}let u=Ui(s,d);if(u.error)throw new ja(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:Hi};et.record(performance.now()-s,u),st.record(a,u),Va(e,i)}catch(o){throw pt(u,e.get("requestSpan"),o),await Ua(t,o),o}finally{n&&Ra(u,n),u.end(),p()}let f=e.get("requestId");f&&Te.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Gi(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 Ki(e){let t=!0===e.get("isSelfTest");t||await Da(pe);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return Ie.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Pa(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),He.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 Na)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(qa(n.model))return Ji(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),pe.manualApprove&&!t&&await Oa(),"foundry"!==pe.provider&&(n=function(e){if(!ir(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!ir(e.max_tokens))return e;let t=(pe.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=Ga(n,pe.models)),ir(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Ca(e);if(r)return r;let a=performance.now(),i=await fi(n),s=performance.now()-a;if(Qe.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Wi(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Ia(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=Ya(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Ke.add(1,{model:n.model,endpoint_type:"openai"}),i=Gi(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Ia(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(et.record(c,u),st.record(r,u),Va(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Ia(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw pt(c,e.get("requestSpan"),o),await Ua(t,o),o}finally{o.value&&Ra(c,o.value),c.end(),u()}let d=e.get("requestId");d&&Te.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Wi=e=>Object.hasOwn(e,"choices"),Yi=new F;Yi.post("/",async e=>{try{return await rr(e,"chat",Ki)}catch(t){return await Po(e,t)}});const Vi=async e=>{if(!un(pe))throw Error("Service token not found");let t=`${ln(pe)}/embeddings`,o=cn(pe),n=pe.timeoutMs,r=new AbortController,a=po(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await ht({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":pe.provider}});try{if(!n.ok)throw new co("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw ut(a,e),e}finally{a.end()}}finally{clearTimeout(a)}},Xi=new F;Xi.post("/",async e=>{try{let t=await e.req.json();try{t.model=Pa(t.model)}catch(t){if(t instanceof Na)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 Ca(e);if(o)return o;let n=performance.now(),r=await(async e=>{try{return await Vi(e)}catch(t){if(t instanceof co&&401===t.response.status){if(!await Yo(t))throw t;return Vi(e)}throw t}})(t),a=performance.now()-n;Qe.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Ia(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await Po(e,t)}});const Zi=new F;let Qi=null,es=null;function ts(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function os(e){return!ts(e)}Zi.get("/",async e=>{let t,o=function(){if(an(pe)){if(!un(pe))return"missing";let e=pe.foundry?.bearerExpiresAt;return void 0!==e&&e<=Date.now()?"expired":"valid"}let e=pe._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=Qi;return t&&e-t.timestamp<3e4?{result:t.result}:es||(es=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${ln(pe)}/models`,n=await fetch(t,{method:"GET",headers:cn(pe),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Qi={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Qi={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),es=null}})(),es)}();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.44.0-preview.25",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 ns=new z(G);let rs;const as={...J["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function is(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 ss(e,t){let o=0;for(let n of e)switch(n.type){case"text":o+=t(n.text)*as.contentMultiplier;break;case"tool_use":o+=t(n.name+JSON.stringify(n.input))*as.contentMultiplier;break;case"tool_result":n.content&&(o+=t("string"==typeof n.content?n.content:JSON.stringify(n.content))*as.contentMultiplier);break;case"thinking":o+=t(n.thinking)*as.contentMultiplier;break;case"image":o+=1600}return o}function ls(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?as.perFirstProp:as.perAdditionalProp,o+=t(n),a.description&&(o+=as.perPropDesc+t(a.description)),a.enum&&Array.isArray(a.enum)){o+=as.perEnum;for(let e of a.enum)o+=t(String(e))}if("object"===a.type&&a.properties&&(o+=as.perNestedObject,o+=ls(a,t)),"array"===a.type&&a.items){let e=a.items;"object"===e.type&&e.properties&&(o+=as.perArrayOfObjects,o+=ls(e,t))}}return o}const cs={event:"ping",data:JSON.stringify({type:"ping"})};function us(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(cs).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 ps(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 ds(e,t,o){let n=ps(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const ms=async(e,t,n)=>{try{return await fs(e,t)}catch(r){if(r instanceof co&&401===r.response.status){if(!await Yo(r))throw r;return fs(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}`),fs(i,t)}throw r}};const fs=async(e,t)=>{if(!un(pe))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=an(pe)&&pe.foundry?{baseUrl:nn(pe.foundry),headers:rn(pe.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={...St(pe,t,r),"X-Initiator":"agent"};return{baseUrl:Tt(pe),headers:a,cleanPayload:n}}(ba(e),t),a=`${o}/v1/messages`,i=pe.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":pe.provider,...ps(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){ce();let t=ai(o,{fresh:e>0}),c=new AbortController,u=Gn(c,i);try{let{statusCode:o,headers:p,body:d,span:m}=await gt({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=ci(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:L(f),span:m,release:()=>ii(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&&Ra(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(),ii(t)}}catch(o){if(ii(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")},hs=new Set(["resolveStreamComplete","requestId"]);function gs(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 _s(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))hs.has(t)||n.set(t,o);return n}(e);try{let e,t=await async function(e,t,o){let n=await nr(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))if(o&&void 0!==n&&"ping"!==o){if("message_start"===o&&i.messageStart){e=JSON.parse(n).message?.usage;continue}await r.writeSSE({event:o,data:"message_delta"===o?gs(n,e):n})}}catch(t){if(jt(e))return;let o=e.get("requestSpan");throw o&&ut(o,t),await Fa(n,t),t}finally{e.set("requestData",s.get("requestData"))}}const ys=24e4;var ws=class extends uo{name="StreamHeadersTimeoutError"};function bs(){if(ae())return;let e=new AbortController,t=setTimeout(()=>{e.abort(new ws(ys))},ys);return{signal:e.signal,clear:()=>clearTimeout(t)}}function ks(e,t){e.get("requestSpan")?.setAttribute("copilot_api.stream.headers_wait_ms",Math.round(performance.now()-t))}async function vs(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&&ks(e,o),r}catch(t){throw n?.setAttribute("copilot_api.stream.early_commit",!1),ks(e,o),t}}const xs={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"},Ts=e=>xs[e]??(e>=500?"api_error":"invalid_request_error");async function As(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 ws||e instanceof Error&&e.cause instanceof ws)(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:Ts(n.status),message:r}}async function $s(e,t,o){await t.client.writeSSE(cs);try{let t=await o.pending;return ks(e,o.start),t}catch(n){if(ks(e,o.start),jt(e))return void Te.completionCallbacks.delete(e.get("requestId"));let r=function(e,t){if(!er(e))return;let o=le();return Kn(t,void 0!==(o&&Xn.get(o)?.sent()))}(e,n);if(r)return void await _s(e,t,{reason:r,progress:{messageStart:!1,content:!1,held:[]},failure:n});let a=await As(e,n);return void(a&&await t.client.writeSSE({event:"error",data:JSON.stringify({type:"error",error:a})}))}}const Ss=new Set(["low","medium","high","max","xhigh"]),Es=(e,t)=>!(!e||!t||e===t);function Os(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!Ss.has(t))return e;let n=pe.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Rn(t,n);if(!r||!Ss.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 Cs(e,t,n){if("foundry"===pe.provider)return Os(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 Os(s)}const Is=e=>"object"==typeof e&&!!e&&!Array.isArray(e),Rs=["properties","patternProperties","$defs","definitions"],Ns=["items","additionalProperties","propertyNames","contains","not","if","then","else"],Ps=["anyOf","allOf","oneOf","prefixItems"];const qs=()=>["string","number","boolean"].map(e=>({type:e})),Ds=()=>({anyOf:[...qs(),{type:"array",items:{anyOf:qs()}},{type:"object"}]}),js=e=>!0===e||Is(e)&&0===Object.keys(e).length,Ms=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function Fs(e,t){let o={...e};for(let e of Rs){let n=o[e];Is(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,Is(o)?Fs(o,t):o])))}for(let e of Ns){let n=o[e];Is(n)&&(o[e]=Fs(n,t))}for(let e of Ps){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>Is(e)?Fs(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(Is(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>js(e)?Ds().anyOf:Is(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)),Ms(o)&&(!("items"in o)||js(o.items))&&(t.add("items"),o.items=Ds()),js(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function Us(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=Bs(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function Hs(e){return Ls(Bs(e))}function Bs(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 Ls(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function zs(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>Ls(e)).filter(Boolean).join("\n\n")}const Js=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),Gs=new Set(["text","image"]);function Ks(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);Gs.has(e)||t.add(`block:tool_result:${e}`)}}const Ws=new Set;function Ys(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=Js.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&&Ks(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(Ws.size>=100)break;Ws.has(o)||(Ws.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 Vs=e=>N("sha256").update(e).digest("hex").slice(0,12);function Xs(e,t){e.setAttribute("copilot_api.translation.system_hash",Vs(t.system)),e.setAttribute("copilot_api.translation.tools_hash",Vs(JSON.stringify(t.tools??[])))}function Zs(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Qs(e){return e.toLowerCase().startsWith("claude-")}function el(e,t){let o={model:e.model,messages:tl(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:cl(e.tools,e.model),tool_choice:ul(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=za(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=Ha(t),a=r&&r>1?r-1:o.min;return Ba(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Ga({...o,thinking_budget:a},t)}}return o}function tl(e,t){let{leadingSystemTexts:o,messages:n}=Us(e),r=function(e,t){let o=zs(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=Hs(e);if(!t)break;ol(r)?a.push(t):nl(r,t);break}case"user":r.push(...rl(e));for(let e of a)nl(r,e);a=[];break;case"assistant":r.push(...al(e))}for(let e of a)nl(r,e);return r}function ol(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function nl(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 rl(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:ll(e.content)});n.length>0&&t.push({role:"user",content:ll(n)})}else t.push({role:"user",content:ll(e.content)});return t}function al(e){let t=function(e){return{reasoning_text:sl(e.reasoning_text),reasoning_opaque:sl(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:ll(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:ll(e.content),...t}]}const il=32768;function sl(e){if("string"==typeof e)return e.length<=il?e:e.slice(0,il)}function ll(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 cl(e,t){if(!e)return;let o=e.filter(os),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:Fs(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 ul(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 pl(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 dl(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function ml(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 fl=new Set(["low","medium","high","max","xhigh"]);function hl(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&&fl.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 gl(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 _l=/[^\w-]/g;function yl(e){return e.replaceAll(_l,"_")}function wl(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=hl(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:gl(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:yl(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:yl(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function bl(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 kl(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 vl(e,t){return Ie.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),ds(n,t,e.req.header("anthropic-beta"));let r=Pa(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=bl(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),He.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 Na)return{ok:!1,response:kl(e,t.message,t.statusCode)};throw t}finally{n.end()}})}var xl=class extends ja{name="UpstreamIdleError";constructor(e){super("api_error",`Upstream sent nothing for ${Math.round(e/1e3)}s; stream aborted`)}};function Tl(e,t,o){let{leadingSystemTexts:n,messages:r}=Us(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=Hs(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(Cl(e));break}case"user":t.push(...Il(n),...o.map(e=>Cl(e))),o=[];break;case"assistant":t.push(...Pl(n))}return t.push(...o.map(e=>Cl(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 zs(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(os).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:Ol(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:El(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function Al(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${N("sha256").update(o).digest("hex").slice(0,32)}`}function $l(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 Sl=new Set(["low","medium","high","xhigh"]),El=e=>null!==e&&Sl.has(e);function Ol(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Cl(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function Il(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(Nl(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(Rl(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 Rl(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function Nl(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?Rl(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 Pl(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 ql(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 Dl(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function jl(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 Ml(e,t){let o=[];switch(e.type){case"response.created":jl(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){jl(t,o),Dl(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":jl(t,o),Dl(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":Dl(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":{Dl(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage,a=ql(e.response,n);t.terminalEvent=e.type,t.stopReason=a,o.push({type:"message_delta",delta:{stop_reason:a,stop_sequence:null},usage:$l(r)},{type:"message_stop"});break}case"response.incomplete":{jl(t,o),Dl(t,o);let n=e.response.usage,r=ql(e.response,!1);t.terminalEvent=e.type,t.stopReason=r,o.push({type:"message_delta",delta:{stop_reason:r,stop_sequence:null},usage:$l(n)},{type:"message_stop"});break}case"response.failed":jl(t,o),Dl(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":jl(t,o),Dl(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":jl(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 Fl(e,t,o){let n=t.reasoning?.effort,r=e.get("requestData")||{};r.reasoningEffort=n,r.effortClamped=Es(o,n),e.set("requestData",r)}function Ul(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function Hl(e,t,n){let r=!1;for(let a of t){if(o.debug("Translated Anthropic event:",a),"error"===a.type)throw new ja(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 Bl(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 Ll(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 zl(e,t){let o=performance.now()-t;return Qe.record(o,{model:e.model,target:"responses",streaming:String(!!e.stream)}),o}function Jl(e,t){return B(e,async o=>{let n=us(o);o.onAbort(()=>{n.stop(),Dt(e)});try{await t({stream:o,client:n})}finally{n.stop();try{let t=e.get("requestId");t&&Te.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}})}async function Gl(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(),_=Bl(g),y=Ya(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 xl(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=Ll(t.data);if(!n)continue;h++,Ke.add(1,{model:u,endpoint_type:"responses"});let r=Si(n);if(r){f=r;let t=e.get("requestData")||{};t.tokenUsage=Ia(f),t._d1=d,e.set("requestData",t)}await Hl(i,Ml(n,w),b)&&_.forwarded()}(function(e){if(!e.terminalEvent)throw new ja("api_error","Upstream stream ended before the response completed")})(w),or();let t=performance.now()-g,n={model:u,endpoint_type:"responses"};et.record(t,n),st.record(h,n),Va(e,p)}catch(t){if(jt(e))return;if(b.content||!er(e))throw function(e,t,o){if(!(t instanceof ja))return;let n="stream_incomplete";t instanceof xl?n="upstream_idle":o.terminalEvent&&(n="upstream_failure"),e?.setAttribute("copilot_api.error_type",n)}(e.get("requestSpan"),t,w),pt(l,e.get("requestSpan"),t),await Fa(a,t),t;r=t instanceof xl?"foundry_stream_idle":"foundry_stream_failed",ut(l,t)}finally{f&&Ra(l,f),_.record(l),r||function(e,t,o){e&&(Ul(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 _s(e,t,{reason:r,progress:b})}async function Kl(e,t,r){let a=performance.now(),i=Ie.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),Ys(o,t.messages);let n=Tl(t,pe.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===pe.provider,promptCacheKey:"foundry"===pe.provider?Al(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return Xs(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});ot.record(performance.now()-a,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",i),e.set("requestData",{model:i.model,streaming:!!i.stream}),Fl(e,i,r),pe.manualApprove&&await Oa();let s=performance.now(),l=new AbortController,{pending:c,capped:u}=function(e,t,o){let n=t.stream?bs():void 0;return{pending:xi(t,{onAttempt:t=>Fl(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 vs(e,c,s))return function(e,t,o){let{pending:n,copilotStart:r,upstreamIdle:a}=o;return tr(),Jl(e,async o=>{let i=await $s(e,o,{pending:n,start:r});i&&!$i(i)&&await Gl(e,o,{response:i,model:t.model,copilotStart:r,_d1:zl(t,r),upstreamIdle:a})})}(e,i,{pending:c,copilotStart:s,upstreamIdle:l});let p=await c,d=zl(i,s);if($i(p)){let t=e.get("requestData")||{};if(Ul(e.get("requestSpan"),p.usage?.output_tokens_details?.reasoning_tokens),p.usage&&(t.tokenUsage=Ia({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=Ie.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:ql(e,o),stop_sequence:null,usage:$l(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 ot.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}return tr(),Jl(e,t=>Gl(e,t,{response:p,model:i.model,copilotStart:s,_d1:d,upstreamIdle:l}))}function Wl(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 Yl(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Vl(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&&(Wl(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&&(Wl(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Yl(t,o)),r.content&&(Yl(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){Yl(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&&(Yl(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Zs(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 Xl=/structured_outputs|output_config\.format/i;function Zl(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Xl.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?wl({...e,model:$n},o):null}var Ql=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var ec=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const tc={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 ht({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 ut(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new ec: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 ht({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 ut(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Ql:e}finally{clearTimeout(i)}}},oc=["tavily","exa"];function nc(e){return"tavily"===e||"exa"===e}function rc(){return pe.webSearchProviders.length>0}async function ac(e,t){return async function(e,t,n){let{providers:r,searchFns:a=tc}=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:pe.webSearchProviders})}function ic(e){let t=e.tools;return!(!t||1!==t.length)&&ts(t[0])}function sc(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function lc(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 cc(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&&ts(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(!rc())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await ac(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_${sc()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...lc(n,e)}];return{id:`msg_ws_${sc()}`,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_${sc()}`,r=`msg_ws_${sc()}`,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:lc(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 uc(e){if(un(pe)||await Ar())return null;let t=yr();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${br()}`}},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 pc(e,t){let o=t.model;return o&&"string"==typeof o?null:kl(e,"Model name is required and must be a string")}function dc(e,t){let o=performance.now()-t;return Qe.record(o,{model:e.model,target:"chat_completions",streaming:String(!!e.stream)}),o}function mc(e,t){return B(e,async o=>{let n=us(o);o.onAbort(()=>{n.stop(),Dt(e)});try{await t({stream:o,client:n})}finally{n.stop(),e.get("resolveStreamComplete")?.()}})}async function fc(e,t,o){let{pending:n,capped:r,copilotStart:a}=o;if(r&&!await vs(e,n,a))return function(e,t,o){let{pending:n,copilotStart:r}=o;return tr(),mc(e,async o=>{let a=await $s(e,o,{pending:n,start:r});if(!a){let t=e.get("requestId");return void(t&&Te.executeCompletion(t))}_c(a)||(or(),await hc(e,o,{response:a,model:t.model,copilotStart:r,_d1:dc(t,r)}))})}(e,t,{pending:n,copilotStart:a})}async function hc(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=Ya(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++,Ke.add(1,{model:c,endpoint_type:"anthropic"}),n.usage){d=n.usage;let t=e.get("requestData")||{};t.tokenUsage=Ia(d),t._d1=p,e.set("requestData",t)}let r=Vl(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(et.record(t,n),st.record(m,n),Va(e,u),d){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Ia(d),t._d1=p,e.set("requestData",t))}}catch(t){throw pt(s,e.get("requestSpan"),t),await Fa(r,t),t}finally{d&&Ra(s,d),s.end(),l()}let _=e.get("requestId");_&&Te.executeCompletion(_)}async function gc(e){let t=await e.req.json();if(ic(t))return pc(e,t)??cc(e,t);await Da(pe),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=pc(e,t);if(a)return a;t=function(e,t){return Cs(t,pe.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=vl(e,t);if(!i.ok)return i.response;t=i.payload;let s=await uc(e);if(s)return s;if(qa(t.model))return Kl(e,t,r);if(function(e){if("foundry"!==pe.provider)return Qs(e);let t=pe.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:Qs(e)}(t.model))return async function(e,t,o){let n="foundry"===pe.provider,r=n?t:wl(t,pe.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:Es(o,i),streaming:!!r.stream}),pe.manualApprove&&await Oa(),Ie.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),ds(t,r,a.anthropicBeta);try{let o=performance.now(),i=await ms(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=Zl(e,o,pe.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(Qe.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=Ia(yc(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=Ya(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,Ke.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),wc(e.data,s)&&(p=!0),await n.writeSSE(e)):await n.writeSSE(e);let e=performance.now()-i,t={model:r.model,endpoint_type:"anthropic_messages"};et.record(e,t),st.record(a,t)}catch(t){throw pt(c,e.get("requestSpan"),t),await Fa(n,t),t}finally{if(Va(e,o),p){let t=yc(s);Ra(c,t);let o=e.get("requestData")||{};o.tokenUsage=Ia(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&Te.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw ut(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=Ie.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),Ys(o,t.messages);let r=el(t,pe.models),a=r.messages.at(0);return Xs(o,{system:"system"===a?.role&&"string"==typeof a.content?a.content:"",tools:r.tools}),r}finally{o.end()}});ot.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=Ga(c,pe.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:Es(r,u),streaming:!!c.stream});let p=performance.now();pe.manualApprove&&await Oa();let{pending:d,capped:m}=function(e,t){let o=t.stream?bs():void 0;return{pending:fi(t,o&&{signal:AbortSignal.any([qt(e),o.signal])}).finally(()=>o?.clear()),capped:void 0!==o}}(e,c),f=await fc(e,c,{pending:d,capped:m,copilotStart:p});if(f)return f;let h=await d,g=dc(c,p);if(_c(h)){let t=e.get("requestData")||{};h.usage&&(t.tokenUsage=Ia(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=Ie.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=dl(a.message),i=pl(a.message.content),s=ml(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:Zs(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 ot.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}return mc(e,t=>hc(e,t,{response:h,model:c.model,copilotStart:p,_d1:g}))}const _c=e=>Object.hasOwn(e,"choices");function yc(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 wc(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 bc=new F;bc.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&ic(t)}catch{return!1}}(e)?await gc(e):await rr(e,"messages",gc)}catch(t){return await Po(e,t)}});const kc=new F;function vc(e){return Ie.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Pa(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),He.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 xc(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=Ia(o),n._d1=t._d1,t.c.set("requestData",n)}kc.get("/",async e=>{try{pe.models||await sr();let t=pe.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 Tc=new Set(["message","function_call","function_call_output"]),Ac=new Set(["type","name","description","parameters"]);async function $c(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||!rc())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await ac(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Sc(e){if(rc())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await $c(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Ec(e){if(!rc())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 $c(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Oc(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 Tc.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Cc(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 Ic(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&&Cc(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)Cc(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Rc(e){return null!=e}function Nc(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Pc(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function qc(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(!Nc(n)){o.push(n);continue}let e=Oc(n);null===e?t.add(Pc(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"])Rc(e[o])&&(t[o]=e[o]);let r=new Set;if(Rc(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))Ac.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(Rc(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Rc(o.effort)&&(t.reasoning.effort=o.effort),Rc(o.summary)&&(t.reasoning.summary=o.summary)}if(Rc(e.text)&&"object"==typeof e.text){let o=e.text;Rc(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Dc(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function jc(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||Rc(n.previous_response_id)||Rc(n.prompt)||Rc(n.conversation)?null:Dc(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 Mc(e){await Da(pe);let t=await e.req.json();if(!Nc(t))return Dc(e,"request body must be a JSON object");let n=function(e){return"foundry"===pe.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:qc(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:vc(t)}}catch(t){if(t instanceof Na)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=jc(e,t.input,n);if(s)return s;let l=await Ca(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),pe.manualApprove&&await Oa();let c=performance.now(),u=await xi(a,{signal:qt(e)}),p=performance.now()-c;if(Qe.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Fc(u))return async function(e,t,o){await Sc(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Ia({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=Ya(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Ic(i.data,r);s=await Ec(s);let l=s===i.data?i:{...i,data:s};Ke.add(1,{model:a.model,endpoint_type:"responses"}),xc(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"};et.record(l,u),st.record(n,u),Va(e,c)}catch(o){if(jt(e))return;throw pt(m,e.get("requestSpan"),o),await Ua(t,o),o}finally{o.value&&Ra(m,o.value),m.end(),f()}}finally{!function(e){try{let t=e.get("requestId");t&&Te.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}(e)}})}const Fc=e=>Object.hasOwn(e,"output"),Uc=new F;Uc.post("/",async e=>{try{return await rr(e,"responses",Mc)}catch(t){return await Po(e,t)}});const Hc=new F;Hc.get("/",e=>{try{return pe.showToken?e.json({token:pe._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 Bc=new F;Bc.get("/",async e=>{try{let t=await Hr();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Lc=new F;function zc(){return function(e){let t=e.filter(e=>Aa(e));if(0===t.length)return;let o=t.find(e=>Ta.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(pe.models?.data??[])}function Jc(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 wa(o).slice(0,200)}catch{}let t=wa(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 Gc(e={}){let t=performance.now(),o=e.model&&function(e){let t=pe.models?.data.find(t=>t.id===e);return void 0!==t&&Aa(t)}(e.model)?e.model:zc();if(!o)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=(async()=>{try{let e=await Lc.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[va]:xa},body:JSON.stringify({model:o,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(e.ok)return{ok:!0,model:o,status:e.status,durationMs:a()};let t=await e.text().catch(()=>"");return{ok:!1,model:o,status:e.status,durationMs:a(),reason:Jc(e.status,t,o),detail:t.slice(0,400)||void 0}}catch(e){let t=e instanceof Error?e.message:String(e);return{ok:!1,model:o,durationMs:a(),reason:`Request failed before a usable response: ${t}`,detail:t}}})(),s=new Promise(e=>{n=setTimeout(()=>{e({ok:!1,model:o,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([i,s])}finally{n&&clearTimeout(n)}}Lc.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===xa}(e.req.header(va));e.set("requestId",r),e.set("isSelfTest",l),e.header("x-request-id",r);let c=Ie.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();mt.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||Te.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(()=>Ea(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{}}):Ea(y)}),Lc.use(U()),Lc.use(async(e,t)=>{let o=e.req.header("content-length");if(o){let t=Number(o);if(Number.isFinite(t)&&t>33554432)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 32 MB limit (got ${t} bytes).`}},413)}await t()}),Lc.get("/",e=>e.text("Server running")),Lc.route("/health",Zi),Lc.route("/chat/completions",Yi),Lc.route("/models",kc),Lc.route("/embeddings",Xi),Lc.route("/usage",Bc),Lc.route("/token",Hc),Lc.route("/v1/chat/completions",Yi),Lc.route("/v1/models",kc),Lc.route("/v1/embeddings",Xi),Lc.route("/v1/messages",bc),Lc.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=pe.models?.data.find(t=>t.id===e);return!t||"Anthropic"===t.vendor||hn(t.capabilities.family)||"o200k_base"!==t.capabilities.tokenizer?{name:"claude",tokenizer:ns}:(rs??=import("ai-tokenizer/encoding/o200k_base").then(e=>new z(e)),{name:"o200k_base",tokenizer:await rs})}(t.model),r=e=>is(n,e),a=as.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");a+=as.perMessage+r(e)*as.contentMultiplier}for(let e of t.messages)a+=as.perMessage,a+=r(e.role),"string"==typeof e.content?a+=r(e.content)*as.contentMultiplier:Array.isArray(e.content)&&(a+=ss(e.content,r));let i=t.tools?.filter(os);i&&i.length>0&&(a+=function(e,t){let o=as.toolsExist;for(let[n,r]of e.entries())n>0&&(o+=as.perTool),o+=t(r.name),r.description&&(o+=as.perDesc+t(r.description)),o+=ls(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})}),Lc.route("/v1/responses",Uc),Lc.route("/responses",Uc),Lc.onError((e,t)=>Po(t,e));const Kc=e=>`${e}`,Wc=e=>`${e}`,Yc=e=>`${e}`,Vc=e=>`${e}`,Xc=e=>`${e}`,Zc=Wc(" ─────────────────────────────────────────────────────────────");function Qc(e,t,o){console.log(` ${function(e){return"ok"===e?Yc("✓"):"warn"===e?Xc("⚠"):Vc("✗")}(e)} ${Kc(t.padEnd(14))} ${o}`)}function eu(e){console.log(` ${Wc("↳")} ${Wc(e)}`)}function tu(e){return e instanceof co?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function ou(){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 nu(){try{await sr();let e=(pe.models?.data.length??0)>0;return Qc(e?"ok":"warn","Model catalog",e?function(){let e=pe.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 Qc("fail","Model catalog",tu(e)),eu("Could not fetch /models — check connectivity/auth."),!1}}async function ru(e){pe.accountType=e.accountType;let t=await Vt(),o=Xt();if(console.log(""),console.log(` ${Kc("COPILOT-API DOCTOR")} ${Wc(`v${t}`)}`),console.log(Zc),Qc("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await ee(),lr(),!await async function(){let e=await ou();if(!e)return Qc("fail","Auth token","not found"),void eu("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");pe._t2=e.token,Qc("ok","Auth token",`found (${e.source})`);try{let e=await Do();return await xt(pe,e.login),Qc("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return Qc("fail","GitHub auth",tu(e)),void eu("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(Zc),console.log(` ${Vc("✗")} ${Kc("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await qo();return pe._t1=e,Qc("ok","Service token","acquired"),!0}catch(e){let t=e instanceof co?e.response.status:0;return Qc("fail","Service token",tu(e)),eu(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 nu();await async function(){try{let e=await Hr(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${qr(Dr(t))} of ${qr(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;Qc("ok","Copilot plan",`${e.copilot_plan} · ${o} `+Wc(`(resets ${e.quota_reset_date})`))}catch(e){Qc("warn","Copilot plan",`unavailable (${tu(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Gc();return e.ok?(Qc("ok","Generation",`works via ${e.model} ${Wc(`(${e.durationMs}ms)`)}`),!0):(Qc("fail","Generation",`${e.reason}${e.status?Wc(` [HTTP ${e.status}]`):""}`),!1)}():Qc("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){Qc(t,"Client config","potential base-URL issue");for(let t of e)eu(t)}else Qc("ok","Client config","no base-URL issues detected");eu("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(Zc),a?(console.log(` ${Yc("✓")} ${Kc("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Xc("⚠")} ${Kc("Some checks need attention")} — see the ${Vc("✗")}/${Xc("⚠")} lines above.`),console.log(""),2)}const au=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 ru({accountType:e["account-type"]});y.exit(t)}});function iu(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 su=!1;const lu="copilot-api-node20",cu=`https://registry.npmjs.org/${lu}/latest`,uu=e=>`${e}`,pu=e=>`${e}`;async function du(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(cu,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function mu(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 fu,hu;async function gu(e){try{let[t,o]=await Promise.all([Vt(),du(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 _u(){if(!fu||!hu)return;let{signal:e}=hu;fu.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${lu}@latest`,n=pu("│"),r=` ${uu("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,a=` Run ${uu(o)} to update`,i=" ".repeat(54),s=pu(`╭${"─".repeat(54)}╮`),l=pu(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${mu(r,54)}${n}`,`${n}${i}${n}`,`${n}${mu(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var yu={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 wu=262144,bu="https://barazany.dev",ku=/^[a-z0-9][a-z0-9-]*$/i,vu=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function xu(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(vu," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function Tu(e){if("object"!=typeof e||!e)return null;let t=e,o=xu(t.title,100),n=xu(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!==bu||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&&ku.test(t.slug)&&(r=`${bu}/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 Au(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=Tu(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 $u=null;function Su(e){return s.join(e,"blog-posts.json")}function Eu(e=Q.APP_DIR){try{if($u&&$u.length>0)return $u;let t=function(e){try{let t=Su(e);return K.statSync(t).size>wu?[]:Au(JSON.parse(K.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Au(yu)}catch{return[]}}function Ou(e){return e>-6e4&&e<864e5}async function Cu(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>wu)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>wu?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>wu)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?[]:Au(JSON.parse(o))}finally{clearTimeout(o)}}async function Iu(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=Su(e),n=await K.promises.stat(o);if(n.size<=wu){let e=await K.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Ou(t-n.fetchedAt)}return Ou(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await Cu(e.timeoutMs??3e3);if(0===n.length)return;$u=n,await async function(e,t,o){let n=Su(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 Ru(e){let t;try{({login:t}=await Nu(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 Nu(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){pe._t2=e,_r=!1}(n),o.info("Using provided Auth token")):await Sr();try{t=await Do(),await xt(pe,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();pe._t1=e,o.debug("Service token fetched successfully!"),pe.showToken&&o.info("Service token:",e),gr=!0,$r(t),_t.start(),dr=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Tr(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},mr=()=>{o.debug("Network connectivity lost")},_t.on("online",dr),_t.on("offline",mr)})(),t}function Pu(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 qu(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 Du=e=>`${e}`,ju=e=>`${e}`,Mu=e=>`${e}`,Fu=e=>`${e}`,Uu=e=>`${e}`,Hu=e=>`${e}`,Bu=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Lu="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",zu="https://github.com/johnib/copilot-api-issues/issues",Ju=ju(" ─────────────────────────────────────────────────────────────");function Gu(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Ku(e){return e&&0!==e.length?e.join("·"):"—"}function Wu(e){if(0===e.length)return[];let t=["",Ju,` ${Du("BARAZANY.DEV")} ${ju("— Recent Posts")}`,Ju,""];for(let[o,n]of e.entries()){let e=`${n.url}${Lu}`,r=Bu(e,Du(Hu(`[${o+1}]`)));t.push(` ${r} ${Mu(n.title)}`,` ${ju("→")} ${ju(n.teaser)}`,"")}return t.push(Ju,` ${Bu(`https://barazany.dev/blog${Lu}`,"barazany.dev/blog")}`,Ju),t}function Yu(e){let t=[];pe.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):pe.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(ju(" → "))} ${Fu("✓")}`:ju("off"),n=["",` ${Du("COPILOT-API")} ${ju(`v${e.version}`)}`,Ju,` ${ju("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${ju("User")} ${e.user} ${ju("·")} ${e.accountType}`];return pe._v1&&n.push(` ${ju("Client")} VSCode ${pe._v1}`),n.push(` ${ju("Network")} ${t.join(ju(" · "))}`,` ${ju("Search")} ${o}`),e.clipboardCopied&&n.push(` ${ju("Clipboard")} Claude Code command ${Fu("✓")}`),n.push(Ju),n}function Vu(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Du("Active")}`];if(e.model){let o=pe.models?.data.find(t=>t.id===e.model),n=Gu(o?.capabilities.limits?.max_context_window_tokens),r=Ku(o?.capabilities.supports.reasoning_effort);t.push(` ${Mu(e.model.padEnd(32))} ${ju("ctx")} ${Du(n.padStart(5))} ${ju("effort")} ${ju(r)} ${Uu("← main")}`)}if(e.smallModel){let o=pe.models?.data.find(t=>t.id===e.smallModel),n=Gu(o?.capabilities.limits?.max_context_window_tokens),r=Ku(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${ju("ctx")} ${n.padStart(5)} ${ju("effort")} ${ju(r)} ${Uu("← small")}`)}return t}function Xu(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of pe.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("",` ${Du(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Mu("●"):ju("·"),i=n?Mu(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Gu(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Ku(r.effort)}`;t.push(` ${a} ${i} ${ju(s)}${ju(l)}`)}}return t}function Zu(){let e=zu.replace(/^https:\/\//,""),t=Bu(`${zu}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Ju,` ${Du("FOUND A BUG?")} ${ju("— Report it on GitHub")}`,Ju,"",` ${Mu("→")} ${Mu(t)}`,` ${ju("Bug reports, feature requests, and questions welcome.")}`,"",Ju]}function Qu(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=["",Ju,` ${Du("Claude Cowork")} ${ju("— Settings → Inference Provider")}`,Ju,"",` ${ju("Paste into")} ${Du("inferenceGatewayBaseUrl")}${ju(":")}`,` ${Du(Mu(r))}`];return n||a.push("",` ${ju("Your Tailscale hostname is shown by:")} ${Mu("tailscale status --self")}`),a.push("",` ${ju("Docs:")} ${Mu("https://claude.com/docs/cowork/3p/installation")}`),a}function ep(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Ju,` ${Du("HTTPS")} ${ju("— self-signed cert")}`,Ju,"",` ${ju("Cert")} ${t}`];switch(o.push("",` ${Du("Trust this cert")} ${ju("(one-time setup)")}`),y.platform){case"darwin":o.push(` ${ju("macOS:")}`,` ${Mu("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Mu(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${ju("Windows (PowerShell as Administrator):")}`,` ${Mu(`Import-Certificate -FilePath "${t}" \``)}`,` ${Mu("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${ju("Linux (Debian/Ubuntu):")}`,` ${Mu(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Mu("sudo update-ca-certificates")}`,` ${ju("Linux (Fedora/RHEL/Arch):")}`,` ${Mu(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Mu("sudo update-ca-trust")}`);break;default:o.push(` ${ju("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${ju("Or, for Node CLIs only (no admin needed):")}`,` ${Mu(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Ju),o}function tp(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 op(e,t){let o=dt({config:t,startupStage:"upstream_auth"},"copilot_api"),n=Ie.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)),ut(n,e),n.end();let a=e instanceof Error?e.message:String(e);ct(w.ERROR,"ERROR","Server startup failed",{...o,"exception.message":zt(r&&r!==e?`${a} (cause: ${r.message})`:a)}),await Ce()}const np=s.join(Q.APP_DIR,"certs"),rp=s.join(np,"cert.pem"),ap=s.join(np,"key.pem"),ip=s.join(np,"cert.meta.json");async function sp(e){try{return await a.readFile(e,"utf8")}catch{return}}async function lp(e){let t=await sp(rp),o=await sp(ap),n=await async function(){let e=await sp(ip);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 cp(e){return 0!==V(e)}async function up(e){await a.mkdir(np,{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)cp(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(rp,l.cert,{mode:420}),await a.writeFile(ap,l.private,{mode:384}),await async function(e){await a.writeFile(ip,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:rp,keyPath:ap,generated:!0}}const pp=[],dp=Date.now();let mp="";function fp(){let e=async(e,t=0)=>{let n=Ie.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()-dp)/1e3}});for(let t of pp)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Bu("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Ju,` ${Du("COPILOT-API")} ${ju(`v${e}`)} ${ju("·")} ${tp(t)} uptime`,Ju,""," Check in from time to time on",` ${Mu(o)}`,"",Ju,""];console.log(n.join("\n"))}(mp,Date.now()-dp),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 hp=e=>e.filter(e=>xn(e)).map(e=>e.id),gp=e=>e.filter(e=>Tn(e)).map(e=>e.id);async function _p(e,t,n){if(!e._cc1)return!1;pe.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,hp(pe.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:hp(pe.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:hp(pe.models.data)}));let s=Pu({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 yp(e){return e._t2?"cli_arg":y.env.GH_TOKEN?"env_var":"stored"}function wp(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=Ie.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:dt({config:qu(t,{version:o,_t3:yp(t),foundryAuth:pe.foundry?.auth}),runtime:n,identity:{_u1:r.login,machineId:pe.machineId,sessionId:pe.sessionId,_v1:pe._v1},connectivity:pe.connectivity,modelsCount:pe.models?.data.length??0,startupDurationMs:Date.now()-dp},"copilot_api")});if(pe.models?.data)for(let e of pe.models.data)a.addEvent("copilot_api.model.available",dt(e,"model"));a.end(),ct(w.INFO,"INFO","Server started",dt({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:pe.models?.data.length??0,startupDurationMs:Date.now()-dp},"copilot_api"))}async function bp(e,t){try{return await async function(e){return"foundry"===e.provider?(pe.foundry=en(process.env),pe.connectivity.h2=!1,pe.connectivity.h2Keepalive=!1,"entra"===pe.foundry.auth&&await Go(pe.foundry),o.info(`Using Microsoft Foundry upstream: ${pe.foundry.endpoint} (${"entra"===pe.foundry.auth?"Entra ID":"API key"} auth)`),{login:("copilot"===e.fallback?await Ru(e):void 0)??"foundry"}):Nu(e)}(e)}catch(o){throw await op(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:yp(e)}),o}}async function kp(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 lp(e)){let e=await sp(rp),t=await sp(ap);if(e&&t)return{cert:e,key:t,certPath:rp,keyPath:ap,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),up(e)}(e.httpsHosts)}}async function vp(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=la;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(fp(),pp.push(()=>{o.debug("Cleaning up connectivity monitor"),_t.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),gr=!1,ur&&=void clearInterval(ur),dr&&=void _t.off("online",dr),mr&&=void _t.off("offline",mr),pr=void 0,fr=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),ti&&=void clearInterval(ti),oi&&=void clearInterval(oi);let e=[...Za.keys(),...Qa];Za.clear(),Qa.clear(),Xa.clear(),ei=void 0;for(let t of e)ni(t)&&(Ve.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await Ce()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");pe.provider=t.provider,pe.accountType=t.accountType,pe.manualApprove=t.manual,pe.rateLimitSeconds=t.rateLimit,pe.rateLimitWait=t.rateLimitWait,pe.showToken=t.showToken,pe.timeoutMs=t.timeout,pe.connectivity.timeoutMs=t.connectTimeout,pe.webSearchProviders=t.webSearchProviders,pe.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;pe.connectivity.h2=t,pe.connectivity.h2Keepalive=e}(),await ee(),Iu().catch(()=>{}),lr();let n=await Vt();mp=n;let r=Xt();!function(e,t){t&&(Se=t),$e=crypto.randomUUID();let o=T({[O]:"copilot-api",[C]:e,[E]:$e}),{endpoint:n,headers:r}=Oe();Ae=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:[]}),Ae.start()}(n,dp);let a=await bp(t,n);await async function(){try{return await sr({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"===pe.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(()=>{sr().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{sr().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)}}();pp.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),pe.connectivity.h2&&(ii(ai(Tt(pe))),pe.connectivity.h2Keepalive&&li()),wp({options:t,version:n,runtime:r,_u1:a});let s=await kp(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await _p(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(pe.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=gp(pe.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:gp(pe.models.data)});let a=Pu({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=[...Yu(e),...Vu(e),...Xu(e),...Zu(),"",...Wu(Eu()),...Qu(e),...ep(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 Vr()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),_u(),Y({fetch:Lc.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 Gc({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 void o.success(`Self-test passed — generation works via ${r.model} (${r.durationMs}ms). ${t}`)}let a=r.status?` (HTTP ${r.status})`:"";o.warn(`Self-test FAILED${a}: ${r.reason??"unknown error"}`),r.detail&&o.info(` detail: ${wa(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 xp(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Tp=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" re-sends a Foundry-rate-limited (429) request to GitHub Copilot and keeps that model on Copilot until Foundry\'s retry-after passes. 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:xp(t,"--rate-limit"),r=e.timeout,a=void 0===r?ue:xp(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:xp(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(!nc(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${oc.join(", ")}`);let r=n.length>0?n:oc,a=new Set,i=n.length>0,s=[];for(let e of r){if(!nc(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 vp({provider:f,fallback:jn(e.fallback,y.env.COPILOT_API_FALLBACK,f),port:xp(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})}});su||(su=!0,o.setReporters([iu(o.options.reporters)]));const Ap=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(fu||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;hu=e,fu=gu(e).catch(()=>null)})(),Ap||_u();const $p=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Cr,start:Tp,"check-usage":Jr,debug:eo,doctor:au,"cowork-setup":_a}});await t($p),Ap||(hu?.abort(),hu=void 0,fu=void 0);export{};
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=["user:email"].join(" "),Pt=new WeakMap;function qt(e){let t=e.req.raw,o=Pt.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}),Pt.set(t,e),o=e}return o}const Dt=e=>qt(e).signal;function jt(e){qt(e).abort()}function Mt(e){return!!qt(e).signal.aborted&&(e.get("requestSpan")?.setAttribute("copilot_api.client_aborted",!0),!0)}function Ft(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const Ut=32768,Ht=[{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: ***"}],Bt=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Lt(e){let t=e;for(let{regex:e,mask:o}of Ht)t=t.replace(e,o);return t}const zt=/[\w.%+#!$&*=?^~\x27-]+@[\w-]+(?:\.[\w-]+)+/g;function Jt(e){return Lt(e).replaceAll(zt,"<redacted-email>")}const Gt=new Map;function Kt(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 Wt(e,t,o){let n=Lt(o),r=8*Ut,a=n.length>r,i=a?n.slice(0,r):n,s=N("sha256").update(n).digest("hex");if(i.length<=Ut)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=Ut)e.setAttribute(`${t}.part_${o/Ut}`,i.slice(o,o+Ut));e.setAttribute(`${t}.parts`,Math.ceil(i.length/Ut))}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 Yt(e,t){let o=function(e){if(Gt.size>=1e3&&!Gt.has(e)){let e=Gt.keys().next().value;void 0!==e&&Gt.delete(e)}let t,o=(Gt.get(e)??0)+1;return Gt.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&&Wt(e,"copilot_api.incoming_request_body",n);let r=Vt(t.c.req.header());return r&&Wt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&Wt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Wt(e,"copilot_api.outgoing_headers",Vt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Wt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function Vt(e){let t={};for(let[o,n]of Object.entries(e))Bt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Xt(){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 Zt(){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 Qt(){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 eo(e){let t=await async function(){let[e,t]=await Promise.all([Xt(),Qt()]);return{version:e,runtime:Zt(),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 to=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})=>eo({json:e.json})}),oo=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",no=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",ro=new Set;let ao;function io(e){if(de.errorReporting&&!(e.statusCode<500)&&!ro.has(e.signature)){if(ro.size>=1e3){let e=ro.values().next().value;void 0!==e&&ro.delete(e)}ro.add(e.signature),async function(e){ao??=Xt();let t=await ao,o=Zt(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(Jt(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:Ft(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(oo,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":no},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function so(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 lo=new WeakSet;async function co(e,{attempt:t,maxRetries:n,operation:r}){return!le()&&(so(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&&lo.add(e)}(e),!1))}var uo=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},po=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function mo(e,t){return setTimeout(()=>e.abort(new po(t)),t)}function fo(e){return e instanceof po||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof po}const ho=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),go=RegExp(`\\b(?:${[...ho].join("|")})\\b`);function _o(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function yo(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=_o(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function wo(e){let t=e.code;return"string"==typeof t?t:void 0}function bo(e){if(void 0===e.cause)return"";let t=yo(e);if(t===e)return"";let o=wo(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function ko(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=>ho.has(e))||!(t.length>0)&&(!!o.some(e=>go.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function vo(e){return e.req.path.startsWith("/v1/messages")}function xo(e,t){if(vo(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 To=/maximum context length|exceeds the context window/i;function Ao(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 $o(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",Jt(t.message)))}function So(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=Jt(e.message)),t}function Eo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=f.getActiveSpan();if(!a)return;let i=Kt({endpointType:Ft(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});Yt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function Oo(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 Co(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=xo(a,e),s=Ao(i);return o?.setStatus({code:p.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),$o(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",...So(s)}),Eo({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,o)=>{Io.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const Io=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;async function Ro(e,t){let o=f.getActiveSpan(),n=await t.response.text(),r=xo(n,e),a=Ao(r);Oo(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"),$o(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",...So(a)}),Eo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&io({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Kt({endpointType:Ft(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=vo(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&&!To.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 No(e,t){(function(e){return"object"==typeof e&&!!e&&lo.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",de.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function Po(e){return ko(e)||function(e){return so(e)||e instanceof Error&&so(e.cause)}(e)}async function qo(e,t){return Mt(e)?(Ae.completionCallbacks.delete(e.get("requestId")),new Response(null,{status:499})):async function(e,t){if(No(f.getActiveSpan(),t),t instanceof uo&&429===t.response.status)return Co(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=vo(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 Oo(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof uo)return Ro(e,t);if(fo(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=vo(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return Oo(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(Po(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?yo(t):void 0,r=(n&&wo(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=vo(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return Oo(e,503,t instanceof Error?`${t.message}${bo(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}),io({route:e.req.path,statusCode:500,errorClass:r.name,signature:Kt({endpointType:Ft(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${bo(r)}`}),Oo(e,500,r.message),o.error(r);let a=vo(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}(e,t)}const Do=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 uo("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 jo(){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 uo("Failed to get GitHub user",t);return await t.json()}catch(e){throw pt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}const Mo=3e5,Fo=12e4;let Uo,Ho,Bo,Lo=null,zo=0;function Jo(e){Bo&&clearTimeout(Bo),Bo=setTimeout(()=>{Wo("scheduled").catch(e=>{o.warn("Foundry Entra token renewal failed; retrying:",e),Jo(3e4)})},e),Bo.unref()}async function Go(e){let t=Ho;if(!Uo||!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(Fo),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])}(Uo,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,zo=Date.now(),Jo(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-Mo;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 Ko(e,t){Ho=e,Uo=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await Go("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 Wo(e="upstream_401"){return Lo??=Go(e).finally(()=>{Lo=null}),Lo}let Yo=null;async function Vo(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=Ho?.bearerToken;if(void 0!==t&&t!==n)return!0;let r=Ho?.bearerExpiresAt,a=void 0!==r&&r-Date.now()>Mo;if(e&&a)return!1;if(Date.now()-zo<3e4)return!0;try{return await Wo(),!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 Yo||=Do().then(({token:e})=>{de._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{Yo=null}),await Yo,!0}function Xo(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 Zo=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function Qo(e){let t=new URL(e),o=Zo.exec(t.hostname)?.[1];return o?`https://${o}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function en(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 tn(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=Xo(t),a=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:r,anthropicEndpoint:a?Xo(a,"FOUNDRY_ANTHROPIC_ENDPOINT"):Qo(r),auth:n,..."key"===n?{apiKey:o}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:en(e.FOUNDRY_DEPLOYMENTS)}}const on=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},nn=e=>({...on(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),rn=e=>`${e.anthropicEndpoint}/anthropic`,an=(e,t)=>({...on(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),sn=e=>"foundry"===e.provider;function ln(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const cn=e=>sn(e)?(e=>`${e.endpoint}/openai/v1`)(ln(e)):At(e),un=(e,t=!1)=>sn(e)?nn(ln(e)):$t(e,t),pn=e=>sn(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const dn=[{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}],mn={context:128e3,output:16384};function fn(e){return dn.find(({pattern:t})=>t.test(e))??mn}const hn=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,gn=e=>/^claude/i.test(e),_n=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function yn(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 wn(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=mo(o,de.timeoutMs);try{let{response:n,span:r}=await gt({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:nn(e),signal:o.signal});try{if(!n.ok)throw new uo("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 bn(e){return{object:"list",data:(e.deployments??await wn(e)).map(e=>function(e){let{model:t}=e;if(!hn.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:{}}}:gn(t)?yn(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):_n(t)?yn(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:fn(t)}):yn(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:fn(t)})}(e)).filter(e=>void 0!==e)}}const kn=()=>sn(de)&&de.foundry?bn(de.foundry):xn(),vn=async()=>{try{return await kn()}catch(e){if(e instanceof uo&&401===e.response.status){if(!await Vo(e))throw e;return kn()}throw e}},xn=async()=>{let e=`${cn(de)}/models`,t=un(de),o=de.timeoutMs,n=new AbortController,r=mo(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 uo("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)}},Tn=e=>"embeddings"!==e.capabilities.type,An=e=>Tn(e)&&(e.supported_endpoints?.includes("/responses")??!0);const $n=[{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"}],Sn="claude-haiku-4.5",En={haiku:Sn,"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 On=/^claude-/i;function Cn(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function In(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 $n)if(t.pattern.test(e))return t.family;return null}(n),i=On.test(n),s=n.replace(/-\d{8}(?::.*)?$/,""),l=r?`-${r}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let o=Cn(e);for(let e of t)if(Cn(e.replace(/-\d{8}(?::.*)?$/,""))===o)return e}return a?function(e,t,o=null){let n=En[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 Rn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Nn(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=Rn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=Rn.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}const Pn={messages:Tn,responses:An,chat:e=>Tn(e)&&(e.supported_endpoints?.some(e=>"/chat/completions"===e||"/responses"===e)??!0)};let qn;const Dn=new Map,jn=new Map;function Mn(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 Fn(){qn=await ne({provider:"copilot"},vn)}const Un=()=>void 0!==qn;function Hn(e,t=Date.now()){let o=Dn.get(e);return void 0!==o&&(t<o||(Dn.delete(e),!1))}function Bn(e,t=Date.now()){return{id:jn.get(e)?.id??0,lapsed:!Hn(e,t)}}function Ln(e,t,o={}){let n=o.now??Date.now(),r=o.sent??Bn(e,n),a=jn.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),jn.set(e,{id:s,appliedMs:i})}else s===a.id&&i>a.appliedMs&&jn.set(e,{id:a.id,appliedMs:i});let l=Math.max(Dn.get(e)??0,n+i);return Dn.set(e,l),l-n}function zn(e,t){let o=jn.get(e);o&&t.lapsed&&t.id===o.id&&jn.set(e,{id:o.id,appliedMs:0})}function Jn(e){if(!Un()||!sn(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 Gn=new Set([429,408,500,502,503,504]);function Kn(e,t){let o=mo(e,t),n=le()||ae()?mo(e,9e4):void 0;return{headersArrived:()=>clearTimeout(n),clear:()=>{clearTimeout(o),clearTimeout(n)}}}function Wn(e,t){if(e instanceof uo){let{status:t}=e.response;return Gn.has(t)&&void 0!==e.outgoingBody?`foundry_${t}`:void 0}if(t){if(fo(e))return"foundry_timeout";if(Po(e))return"foundry_transport"}}const Yn={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 Vn(e,t,n){let r=Yn[t]??`returned ${t.slice(8)} for`;o.info(`Foundry ${r} ${e}; serving it from Copilot for ${Math.ceil(n/1e3)}s`)}function Xn(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:qn,rerun:"breaker_open"!==r,inStream:o.inStream},()=>t(e))}const Zn=()=>ce();!function(e){se=e}(e=>{let t=e;t.sent=Bn(t.model)});const Qn=new WeakMap;async function er(e,t,o){let n=t instanceof uo?t.response:void 0,r=Ln(e,n?.headers??new Headers,{sent:o});return await(n?.body?.cancel()),r}function tr(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)),Vn(e,t,n)}function or(e){let t=ce();return void 0!==t&&Qn.has(t)&&!Mt(e)}function nr(){let e=ce(),t=e&&Qn.get(e);t&&(t.deferReset=!0)}function rr(){let e=Zn();e?.sent&&Qn.has(e)&&zn(e.model,e.sent)}async function ar(e,t,o){let n=Zn(),r=n&&Qn.get(n);if(!n||!r)throw Error("Not in a Foundry attempt the fallback stands behind");Qn.delete(n);let{model:a}=n;return tr(a,t,{windowMs:await er(a,o,n.sent??Bn(a)),attemptStart:n.start}),function(e){return ie.exit(e)}(()=>Xn(e,r.handler,{model:a,reason:t,inStream:!0}))}async function ir(e,t,o){if(!Un()||!sn(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=qn?.data??[],n=o.map(e=>e.id),r=n.includes(e)?e:In(e,n),a=o.find(e=>e.id===r);return a&&Pn[t](a)?a.id:void 0}(n,t))return o(e);if(Hn(n))return Xn(e,o,{model:n,reason:"breaker_open"});let r=Bn(n),a={model:n};Qn.set(a,{handler:o});try{let t=await function(e,t){return ie.run(e,t)}(a,()=>o(e)),r=a.sent,i=!0===Qn.get(a)?.deferReset;return t.ok&&r&&!i&&zn(n,r),t}catch(t){let i=a.sent,s=Wn(t,void 0!==i);if(!s||(tr(n,s,{windowMs:await er(n,t,i??r),attemptStart:a.start}),Mt(e)))throw t;return Xn(e,o,{model:n,reason:s})}}const sr=e=>new Promise(t=>{setTimeout(t,e)}),lr=e=>null==e;async function cr({refreshFallback:e=!0}={}){let t=await vn();de.models=t,e&&Un()&&await Fn().catch(e=>{o.warn("Failed to refresh the Copilot fallback models:",e)})}const ur=()=>{de._v1="1.140.0-insider"};var pr=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let dr,mr,fr,hr,gr,_r=!1,yr=!1,wr=!1;function br(){return kr()?gr:void 0}function kr(){return void 0!==gr&&Date.now()-gr.at<6e4}function vr(){return wr?"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 xr=()=>a.readFile(Q.GITHUB_TOKEN_PATH,"utf8");function Tr(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,gr={status:s,message:l,at:Date.now()},clearInterval(dr),dr=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 Ar(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 $r=async(e=5,t=1e3,n="scheduled")=>_r?(o.debug("Token refresh already in progress, coalescing"),mr):(_r=!0,mr=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 Do();return de._t1=t,gr=void 0,yr&&void 0===dr&&(o.info("Token refresh recovered, resuming scheduled refresh"),Er(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 uo&&(401===s.response.status||403===s.response.status))return void Tr({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 Ar({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(),_r=!1,mr=void 0}}),mr);async function Sr(){return!!de._t1||!kr()&&(void 0!==gr&&wr&&await async function(){if(mr)return;let e=(await xr().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 $r(3,250,"on-demand"),!!de._t1)}function Er(e){dr&&clearInterval(dr);let t=Math.max(1e3*(e-60),6e4);dr=setInterval(()=>{$r(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Or(e){try{let t=await xr();if(t&&!e?.force)return de._t2=t,wr=!0,de.showToken&&o.info("Auth token:",t),void await Cr();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:Nt}),signal:e.signal});if(!t.ok)throw new uo("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 pr("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 sr(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 pr("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new pr("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 sr(t);continue}if(r.access_token)return r.access_token;await sr(t)}catch(e){if(e instanceof pr)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await sr(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(Q.GITHUB_TOKEN_PATH,e,{mode:384}))(r),de._t2=r,wr=!0,de.showToken&&o.info("Auth token:",r),await Cr()}catch(e){throw e instanceof uo?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Cr(){let e=await jo();o.success(`Authenticated as ${e.login}`)}async function Ir(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),de.showToken=e.showToken,await ee(),await Or({force:!0}),console.log([""," Get started:",""," $ npx copilot-api-node20@latest start --claude-code"," $ npx copilot-api-node20@latest start --codex",""," Full docs: https://www.npmjs.com/package/copilot-api-node20",""].join("\n")),process.exit(0)}const Rr=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})=>Ir({verbose:e.verbose,showToken:e["show-token"]})}),Nr=.01,Pr=864e5,qr=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Dr=new Intl.NumberFormat("en-US"),jr=e=>qr.format(e*Nr),Mr=e=>e.credits_used??e.entitlement-e.remaining,Fr=(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())/Pr;if(r<.5)return;let a=Mr(e),i=a*Nr/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Nr,c=new Date(n.getTime()+l/i*Pr);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Ur=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Dr.format(Mr(e))} of ${Dr.format(e.entitlement)} used`:"n/a",Hr=e=>e.padEnd(14),Br=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Hr("AI credits")}unlimited`);else{let e=Mr(o),t=o.percent_remaining;n.push(`${Hr("AI credits")}${jr(e)} / ${jr(o.entitlement)} ${t.toFixed(1)}% left`,`${Hr("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Hr("")}${Dr.format(e)} of ${Dr.format(o.entitlement)} credits`)}if(n.push("",`${Hr("Chat")}${Ur(e.quota_snapshots.chat)}`,`${Hr("Completions")}${Ur(e.quota_snapshots.completions)}`,"",`${Hr("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Pr)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=Fr(o,e.quota_reset_date,t);r&&n.push(`${Hr("Burn rate")}~${qr.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?`${Dr.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Hr("Overage")}${a}`)}return n.join("\n")},Lr=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 uo("Failed to get usage",t);return await t.json()}catch(e){throw pt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},zr=()=>y.stdout.write(""),Jr=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Gr=async()=>{let e=await Lr();return Br(e)},Kr=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 Or(),!e.watch){try{o.box(await Gr())}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 Gr();n&&zr(),o.box(e),o.log(Jr(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Wr=D(g);async function Yr(){let e="win32"===y.platform?"where.exe":"which";try{return await Wr(e,["tailscale"]),!0}catch{return!1}}async function Vr(){try{let{stdout:e}=await Wr("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Xr(e){return e.replace(/\.$/,"")}async function Zr(){let e=await Vr();if(e?.Online)return Xr(e.DNSName)}const Qr=D(g),ea=e=>`${e}`,ta=e=>`${e}`,oa=e=>`${e}`,na=e=>`${e}`,ra=e=>`${e}`,aa=e=>`${e}`,ia=ta(" ─────────────────────────────────────────────────────────────"),sa=s.join(Q.APP_DIR,"certs","tailscale"),la=s.join(sa,"cert.pem"),ca=s.join(sa,"key.pem"),ua={certDir:sa,certPath:la,keyPath:ca};function pa(){switch(y.platform){case"darwin":return[` ${ta("Install Tailscale for macOS:")}`,` ${oa("https://tailscale.com/download/mac")}`,` ${ta("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${ta("After installing, open the Tailscale app and sign in.")}`,` ${ta("Then re-run this command.")}`].join("\n");case"linux":return[` ${ta("Install Tailscale for Linux:")}`,` ${oa("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${oa("sudo tailscale up")}`,` ${ta("or")} ${oa("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${ta("Install Tailscale for Windows:")}`,` ${oa("https://tailscale.com/download/windows")}`,"",` ${ta("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${ta("Install Tailscale:")} ${oa("https://tailscale.com/download")}`}}function da(){let e=[` ${ra("Tailscale is not running.")}`];return"darwin"===y.platform?e.push(` ${ta("Open the Tailscale app from Applications and sign in.")}`,` ${ta("Download:")} ${oa("https://tailscale.com/download/mac")}`):"win32"===y.platform?e.push(` ${ta("Open the Tailscale app and sign in.")}`,` ${ta("Download:")} ${oa("https://tailscale.com/download/windows")}`):e.push(` ${ta("Connect with:")} ${oa("sudo tailscale up")}`),e.push("",` ${ta("Then re-run this command.")}`),e.join("\n")}async function ma(){try{return await a.access(la),await a.access(ca),!0}catch{return!1}}function fa(e){console.log(""),console.log(ia),console.log(` ${ea("Claude Cowork Setup")} ${ta("— Diagnostic")}`),console.log(ia),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?na("✅"):"missing"===n.status?ra("❌"):aa("❓");let r=n.detail?ta(` ${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(` ${na("All checks passed.")}`):console.log(` ${ra(`${t.length} issue(s).`)} Run ${oa("copilot-api cowork-setup install")} to fix.`),console.log("")}const ha={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},ga=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Yr();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return fa(e),console.log(""),console.log(pa()),void console.log("");let o=await Vr();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},fa(e),console.log(da()),void console.log("");let n=Xr(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await ma();e["tailscale-cert"]=r?{status:"ok",detail:la}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),fa(e)}(),y.exit(0)}}),_a=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:ha},async run({args:e}){await async function(e){if(console.log(""),console.log(ia),console.log(` ${ea("Claude Cowork Setup")} ${ta("— Install")}`),console.log(ia),console.log(""),!await Yr())return console.log(` ${ra("Tailscale is not installed.")}`),console.log(""),console.log(pa()),console.log(""),console.log(` ${ta("After installing, run")} ${oa("tailscale up")} ${ta("to connect, then re-run this command.")}`),void console.log("");let t=await Vr();if(!t||!t.Online)return console.log(da()),void console.log("");let n=Xr(t.DNSName);if(console.log(` ${ta("Tailscale hostname:")} ${ea(n)}`),console.log(""),console.log(` ${ea("Generating TLS certificate via Tailscale…")}`),console.log(` ${ta("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${oa(`$ tailscale cert --cert-file ${la} --key-file ${ca} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(sa,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Qr("tailscale",["cert","--cert-file",la,"--key-file",ca,n]),console.log(` ${na("✓ 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(ia),console.log(` ${ea("Next steps")}`),console.log(ia),console.log(""),console.log(` ${ea("1.")} Start the proxy:`),console.log(` ${oa("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${ea("2.")} In Cowork ${ta("→")} Settings ${ta("→")} Inference Provider, set:`),console.log(` ${ea("inferenceGatewayBaseUrl")} = ${oa(`https://${n}:<port>`)}`),console.log(` ${ta("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${ea("3.")} Restart Cowork ${ta("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${ta("For Cowork's own configuration docs, see:")}`),console.log(` ${oa("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),ya=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:ha},async run({args:e}){await async function(e){if(console.log(""),console.log(ia),console.log(` ${ea("Claude Cowork Setup")} ${ta("— Revert")}`),console.log(ia),console.log(""),!await ma())return console.log(` ${ta("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${ea("Remove Tailscale cert files:")}`),console.log(` ${ta(la)}`),console.log(` ${ta(ca)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(sa,{recursive:!0}),console.log(` ${na("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${ta("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),wa=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:ga,install:_a,revert:ya}}),ba=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function ka(e){if(!ba.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 va(e){return"string"==typeof e?ka(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=va(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?va(a):a;!t&&(i!==a||"__proto__"===r)&&(t=xa({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=xa({},o,o.length),t.properties={}),t??e}(e):e}function xa(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const Ta="x-copilot-api-self-test",Aa=q();const $a=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Sa(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==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)}let Ea;function Oa(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();Ea??=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",Ea),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 Ca(e){try{Oa(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 Ia=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 uo("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 Ra(e){if(pn(de)||await Sr())return null;let t=br();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${vr()}`,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 Na(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 Pa(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 qa=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Da(e){if(!e||"string"!=typeof e)throw new qa("Model name is required and must be a string");if("foundry"===de.provider)return e;if(!de.models?.data)throw new qa("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=In(e,t);if(!o)throw He.add(1,{requested_model:e}),new qa(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function ja(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?_n(e):/gpt-[\d.]+-codex/i.test(e)}async function Ma(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 uo("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 sr(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Fa=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Ua(e){if(e instanceof Fa)return{type:e.type,message:e.message};if(e instanceof uo){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 Ha(e,t){let{type:n,message:r}=Ua(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 Ba(e,t){let{type:n,message:r}=Ua(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 La(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 za(e,t,o){return Math.min(Math.max(e,t),o)}function Ja(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 Ja(JSON.parse(r),t+1)}catch{return null}}function Ga(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=La(o.capabilities.supports.min_thinking_budget),r=La(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:La(o.capabilities.limits?.max_output_tokens)??void 0}}function Ka(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=za(La(e.requestedBudget)??o,o,n),a=La(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 Wa(e,t){if(lr(e.thinking_budget))return e;let o=Ga(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Ka({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 Ya(e){return"invalid_thinking_budget"===Ja(e)}async function Va(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(lr(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(!Ya(i))return null;let l=Ga(n,t.model);return l?function(e,t){let o=Ka({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=La(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 Xa(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 Za(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const Qa=new Map,ei=new Map,ti=new Set;let oi,ni,ri;function ai(e){return!e.closed&&!e.destroyed}function ii(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 Qa.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=ti.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}),ei.delete(t),ti.delete(t),Qa.delete(t),ai(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function si(e,t){if(!de.connectivity.h2)return;if(oi&&oi!==e&&function(){for(let e of[...ei.keys(),...ti])ai(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});ei.clear(),ti.clear(),Qa.clear()}(),oi=e,t?.fresh){let t=ii(e);return ti.add(t),t}let n=Date.now();for(let[t]of ei)if(n-(Qa.get(t)??0)>=6e5)ei.delete(t),Qa.delete(t),ai(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(ai(t))return ei.delete(t),ti.add(t),t;ei.delete(t),Qa.delete(t)}let r=ii(e);return ti.add(r),r}function li(e){e&&ti.delete(e)&&(ai(e)?ei.set(e,Date.now()):Qa.delete(e))}function ci(){ri||(ri=setInterval(()=>{!function(){let e=Date.now(),t=de.connectivity.h2Keepalive,n=ei.size;for(let[r,a]of ei)e-a<6e4||t&&n<=1||(ei.delete(r),Qa.delete(r),n--,ai(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Xe.add(1,{event:"idle_reaped",origin:oi??""}),ut(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${oi}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":oi??""}))}()},3e4),ri.unref())}function ui(){ni||(o.debug("Starting HTTP/2 keepalive (every 45s)"),ni=setInterval(()=>{(async function(){if(0===ei.size&&0===ti.size){if(oi){let e=ii(oi);ei.set(e,Date.now())}return}let e=[...ei.keys()];for(let t of e)ei.delete(t);await Promise.allSettled(e.map(async e=>{if(ai(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}`),ei.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:oi??""}),Qa.delete(e),ai(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Qa.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),ni.unref(),ci())}function pi(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*di(e,t){try{yield*L(e)}finally{!function(e){e instanceof ReadableStream||e.destroyed||(e.on("error",()=>{}),e.destroy())}(t)}}function mi(e){return e.max_completion_tokens??e.max_tokens}async function fi(e,t,o){try{if(!e.ok)throw new uo("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&&Pa(t,n.usage),n}catch(e){throw pt(t,e),e}finally{t.end()}}const hi=e=>sn(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=mi(e);return null==i?a:{...a,max_completion_tokens:i}}(e,de.models),gi=e=>sn(de)?e:va(e),_i=async(e,t)=>{let n=gi(e),r=t?.signal;try{return await bi(n,r)}catch(e){if(e instanceof uo&&401===e.response.status){if(!await Vo(e))throw e;return bi(n,r)}let t;if(e instanceof uo)try{t=await e.response.clone().text()}catch{t=void 0}let a=await Va({payload:n,error:e,models:de.models,errorBodyText:t});if(a)return e instanceof uo&&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 bi(gi(a),r);throw e}},yi=async(e,t)=>{let o=Jn(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 wi(e,t){let o=()=>t.abort(e?.reason);return e?.aborted?o():e?.addEventListener("abort",o,{once:!0}),()=>e?.removeEventListener("abort",o)}async function bi(e,t){if(!pn(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={...un(de,o),"X-Initiator":n?"agent":"user"},a=cn(de),i=`${a}/chat/completions`,s=de.timeoutMs,l=hi(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":mi(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=si(a,{fresh:o>0}),l=new AbortController,p=Kn(l,s),d=wi(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=pi(d,{status:t,headers:a});if(e.stream){let e=await yi(f,m);if(e)throw new uo("Failed to create chat completions",e,{outgoingBody:c,outgoingHeaders:r});return{events:di(f,d),span:m,release:()=>li(n)}}try{return await fi(f,m,{outgoingBody:c,outgoingHeaders:r})}finally{li(n)}}catch(e){if(li(n),await co(e,{attempt:o,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{p.clear(),d()}}throw Error("Unexpected: exhausted GOAWAY retries without result")}const ki=new Map;const vi=["none","minimal","low","medium","high","xhigh","max"];function xi(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=vi.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=vi.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 Ti(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:[];ki.set(e.model,r);let a=xi(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 Ai(e,t,o){try{if(!e.ok)throw new uo("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&&Pa(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 $i=async(e,t)=>{let o=sn(de),n=o?function(e){let t=ki.get(e.model);return t?xi(e,t):e}(e):e,r=!1,a=!1;for(;;)try{return t?.onAttempt?.(n),await Ei(n,t?.signal)}catch(e){if(!(e instanceof uo))throw e;if(401===e.response.status&&!r){if(r=!0,!await Vo(e))throw e;continue}if(o&&400===e.response.status&&!a){a=!0;let t=Ti(n,await e.response.clone().text().catch(()=>{}));if(t){n=t;continue}}throw e}};function Si(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 Ei=async(e,t)=>{if(!pn(de))throw Error("Service token not found");let o=sn(de)?e:va(e),n={...un(de),"X-Initiator":"agent"},r=cn(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=si(r,{fresh:e>0}),u=new AbortController,d=Kn(u,i),m=Si(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=pi(f,{status:t,headers:r});if(o.stream){let e=Jn(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 uo("Failed to create responses",e??g,{outgoingBody:s,outgoingHeaders:n});return{events:di(g,f),span:h,release:()=>{m.dispose(),li(c)}}}try{return await Ai(g,h,{outgoingBody:s,outgoingHeaders:n})}finally{m.dispose(),li(c)}}catch(t){if(m.dispose(),li(c),await co(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{d.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Oi=e=>Object.hasOwn(e,"output");function Ci(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 Ii=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const Ri=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 Ni(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Ii(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Ii(`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=>qi(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=Di(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=qi(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:qi(o.content)})}return t}(e.messages);if(0===o.length)throw new Ii("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),Pi(e.temperature)&&(n.temperature=e.temperature),Pi(e.top_p)&&(n.top_p=e.top_p),Pi(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),Pi(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 Pi(e){return null!=e}function qi(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Di(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 Ii(`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 ji(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 Mi(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 Fi(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 Ui(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Hi(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Ui(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Fi(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),[Fi(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Bi(e,t){let o=[Fi(e,{},Mi(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=ji(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Li(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:[Fi(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Hi(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Ui(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Fi(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Bi(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 zi="openai_responses";function Ji(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),Ni(e)}finally{t.end()}});nt.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!Ri.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 Gi(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:Mi(e,n.length>0)}]};return e.usage&&(r.usage=ji(e.usage)),r}(e)}finally{t.end()}});return nt.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Ki(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=ji(t.usage);a.tokenUsage=Na(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(Gi(t))}async function Wi(e,t,n){let r;try{r=Ji(t)}catch(t){if(t instanceof Ii)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 Ia();let a=await Ra(e);if(a)return a;let i=performance.now(),s=await $i(r),l=performance.now()-i;if(et.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Oi(s))return Ki(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=Xa(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:zi});let c=Ci(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Na(c),t._d1=l,e.set("requestData",t)}let u=Li(s,d);if(u.error)throw new Fa(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:zi};tt.record(performance.now()-s,u),lt.record(a,u),Za(e,i)}catch(o){throw dt(u,e.get("requestSpan"),o),await Ba(t,o),o}finally{n&&Pa(u,n),u.end(),p()}let f=e.get("requestId");f&&Ae.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Yi(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 Vi(e){let t=!0===e.get("isSelfTest");t||await Ma(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=Da(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 qa)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(ja(n.model))return Wi(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),de.manualApprove&&!t&&await Ia(),"foundry"!==de.provider&&(n=function(e){if(!lr(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!lr(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=Wa(n,de.models)),lr(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Ra(e);if(r)return r;let a=performance.now(),i=await _i(n),s=performance.now()-a;if(et.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Xi(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Na(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=Xa(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=Yi(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Na(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),Za(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Na(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw dt(c,e.get("requestSpan"),o),await Ba(t,o),o}finally{o.value&&Pa(c,o.value),c.end(),u()}let d=e.get("requestId");d&&Ae.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Xi=e=>Object.hasOwn(e,"choices"),Zi=new F;Zi.post("/",async e=>{try{return await ir(e,"chat",Vi)}catch(t){return await qo(e,t)}});const Qi=async e=>{if(!pn(de))throw Error("Service token not found");let t=`${cn(de)}/embeddings`,o=un(de),n=de.timeoutMs,r=new AbortController,a=mo(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 uo("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)}},es=new F;es.post("/",async e=>{try{let t=await e.req.json();try{t.model=Da(t.model)}catch(t){if(t instanceof qa)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 Ra(e);if(o)return o;let n=performance.now(),r=await(async e=>{try{return await Qi(e)}catch(t){if(t instanceof uo&&401===t.response.status){if(!await Vo(t))throw t;return Qi(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=Na(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await qo(e,t)}});const ts=new F;let os=null,ns=null;function rs(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function as(e){return!rs(e)}ts.get("/",async e=>{let t,o=function(){if(sn(de)){if(!pn(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=os;return t&&e-t.timestamp<3e4?{result:t.result}:ns||(ns=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${cn(de)}/models`,n=await fetch(t,{method:"GET",headers:un(de),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return os={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return os={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),ns=null}})(),ns)}();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.44.0-preview.26",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 is=new z(G);let ss;const ls={...J["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function cs(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 us(e,t){let o=0;for(let n of e)switch(n.type){case"text":o+=t(n.text)*ls.contentMultiplier;break;case"tool_use":o+=t(n.name+JSON.stringify(n.input))*ls.contentMultiplier;break;case"tool_result":n.content&&(o+=t("string"==typeof n.content?n.content:JSON.stringify(n.content))*ls.contentMultiplier);break;case"thinking":o+=t(n.thinking)*ls.contentMultiplier;break;case"image":o+=1600}return o}function ps(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?ls.perFirstProp:ls.perAdditionalProp,o+=t(n),a.description&&(o+=ls.perPropDesc+t(a.description)),a.enum&&Array.isArray(a.enum)){o+=ls.perEnum;for(let e of a.enum)o+=t(String(e))}if("object"===a.type&&a.properties&&(o+=ls.perNestedObject,o+=ps(a,t)),"array"===a.type&&a.items){let e=a.items;"object"===e.type&&e.properties&&(o+=ls.perArrayOfObjects,o+=ps(e,t))}}return o}const ds={event:"ping",data:JSON.stringify({type:"ping"})};function ms(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(ds).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 fs(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 hs(e,t,o){let n=fs(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const gs=async(e,t,n)=>{try{return await _s(e,t)}catch(r){if(r instanceof uo&&401===r.response.status){if(!await Vo(r))throw r;return _s(e,t)}if(r instanceof uo&&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}`),_s(i,t)}throw r}};const _s=async(e,t)=>{if(!pn(de))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=sn(de)&&de.foundry?{baseUrl:rn(de.foundry),headers:an(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}}(va(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,...fs(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){ue();let t=si(o,{fresh:e>0}),c=new AbortController,u=Kn(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=pi(d,{status:o,headers:p});if(!f.ok)throw m.end(),new uo("Failed to create anthropic messages",f,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:di(f,d),span:m,release:()=>li(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&&Pa(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(),li(t)}}catch(o){if(li(t),await co(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{u.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ys=new Set(["resolveStreamComplete","requestId"]);function ws(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 bs(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:Dt(e)}),n=new M(o,{env:e.env});for(let[t,o]of Object.entries(e.var))ys.has(t)||n.set(t,o);return n}(e);try{let e,t=await async function(e,t,o){let n=await ar(e,t,o);if(n.ok&&n.body)return n;throw await(n.body?.cancel()),new uo("Copilot fallback failed",n)}(s,a,o.failure);for await(let{event:o,data:n}of L(t))if(o&&void 0!==n&&"ping"!==o){if("message_start"===o&&i.messageStart){e=JSON.parse(n).message?.usage;continue}await r.writeSSE({event:o,data:"message_delta"===o?ws(n,e):n})}}catch(t){if(Mt(e))return;let o=e.get("requestSpan");throw o&&pt(o,t),await Ha(n,t),t}finally{e.set("requestData",s.get("requestData"))}}const ks=24e4;var vs=class extends po{name="StreamHeadersTimeoutError"};function xs(){if(ae())return;let e=new AbortController,t=setTimeout(()=>{e.abort(new vs(ks))},ks);return{signal:e.signal,clear:()=>clearTimeout(t)}}function Ts(e,t){e.get("requestSpan")?.setAttribute("copilot_api.stream.headers_wait_ms",Math.round(performance.now()-t))}async function As(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&&Ts(e,o),r}catch(t){throw n?.setAttribute("copilot_api.stream.early_commit",!1),Ts(e,o),t}}const $s={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"},Ss=e=>$s[e]??(e>=500?"api_error":"invalid_request_error");async function Es(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 qo(o,t);if(499===n.status)return;if((e=>e instanceof vs||e instanceof Error&&e.cause instanceof vs)(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 fo(t)?{type:"overloaded_error",message:r}:{type:Ss(n.status),message:r}}async function Os(e,t,o){await t.client.writeSSE(ds);try{let t=await o.pending;return Ts(e,o.start),t}catch(n){if(Ts(e,o.start),Mt(e))return void Ae.completionCallbacks.delete(e.get("requestId"));let r=function(e,t){if(or(e))return Wn(t,void 0!==Zn()?.sent)}(e,n);if(r)return void await bs(e,t,{reason:r,progress:{messageStart:!1,content:!1,held:[]},failure:n});let a=await Es(e,n);return void(a&&await t.client.writeSSE({event:"error",data:JSON.stringify({type:"error",error:a})}))}}const Cs=new Set(["low","medium","high","max","xhigh"]),Is=(e,t)=>!(!e||!t||e===t);function Rs(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!Cs.has(t))return e;let n=de.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Nn(t,n);if(!r||!Cs.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 Ns(e,t,n){if("foundry"===de.provider)return Rs(e);let r=t.includes(e.model)?e.model:In(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=In(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 Rs(s)}const Ps=e=>"object"==typeof e&&!!e&&!Array.isArray(e),qs=["properties","patternProperties","$defs","definitions"],Ds=["items","additionalProperties","propertyNames","contains","not","if","then","else"],js=["anyOf","allOf","oneOf","prefixItems"];const Ms=()=>["string","number","boolean"].map(e=>({type:e})),Fs=()=>({anyOf:[...Ms(),{type:"array",items:{anyOf:Ms()}},{type:"object"}]}),Us=e=>!0===e||Ps(e)&&0===Object.keys(e).length,Hs=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function Bs(e,t){let o={...e};for(let e of qs){let n=o[e];Ps(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,Ps(o)?Bs(o,t):o])))}for(let e of Ds){let n=o[e];Ps(n)&&(o[e]=Bs(n,t))}for(let e of js){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>Ps(e)?Bs(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(Ps(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>Us(e)?Fs().anyOf:Ps(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)),Hs(o)&&(!("items"in o)||Us(o.items))&&(t.add("items"),o.items=Fs()),Us(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function Ls(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=Js(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function zs(e){return Gs(Js(e))}function Js(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 Gs(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function Ks(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>Gs(e)).filter(Boolean).join("\n\n")}const Ws=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),Ys=new Set(["text","image"]);function Vs(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);Ys.has(e)||t.add(`block:tool_result:${e}`)}}const Xs=new Set;function Zs(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=Ws.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&&Vs(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(Xs.size>=100)break;Xs.has(o)||(Xs.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 Qs=e=>N("sha256").update(e).digest("hex").slice(0,12);function el(e,t){e.setAttribute("copilot_api.translation.system_hash",Qs(t.system)),e.setAttribute("copilot_api.translation.tools_hash",Qs(JSON.stringify(t.tools??[])))}function tl(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function ol(e){return e.toLowerCase().startsWith("claude-")}function nl(e,t){let o={model:e.model,messages:rl(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:dl(e.tools,e.model),tool_choice:ml(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Ga(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=La(t),a=r&&r>1?r-1:o.min;return za(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Wa({...o,thinking_budget:a},t)}}return o}function rl(e,t){let{leadingSystemTexts:o,messages:n}=Ls(e),r=function(e,t){let o=Ks(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=zs(e);if(!t)break;al(r)?a.push(t):il(r,t);break}case"user":r.push(...sl(e));for(let e of a)il(r,e);a=[];break;case"assistant":r.push(...ll(e))}for(let e of a)il(r,e);return r}function al(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function il(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 sl(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:pl(e.content)});n.length>0&&t.push({role:"user",content:pl(n)})}else t.push({role:"user",content:pl(e.content)});return t}function ll(e){let t=function(e){return{reasoning_text:ul(e.reasoning_text),reasoning_opaque:ul(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:pl(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:pl(e.content),...t}]}const cl=32768;function ul(e){if("string"==typeof e)return e.length<=cl?e:e.slice(0,cl)}function pl(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 dl(e,t){if(!e)return;let o=e.filter(as),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:Bs(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 ml(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 fl(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 hl(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function gl(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 _l=new Set(["low","medium","high","max","xhigh"]);function yl(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&&_l.has(e)?e:null)(Nn(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 wl(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 bl=/[^\w-]/g;function kl(e){return e.replaceAll(bl,"_")}function vl(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=yl(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:wl(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:kl(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:kl(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function xl(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 Tl(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 Al(e,t){return Re.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),hs(n,t,e.req.header("anthropic-beta"));let r=Da(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=xl(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 qa)return{ok:!1,response:Tl(e,t.message,t.statusCode)};throw t}finally{n.end()}})}var $l=class extends Fa{name="UpstreamIdleError";constructor(e){super("api_error",`Upstream sent nothing for ${Math.round(e/1e3)}s; stream aborted`)}};function Sl(e,t,o){let{leadingSystemTexts:n,messages:r}=Ls(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=zs(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(Nl(e));break}case"user":t.push(...Pl(n),...o.map(e=>Nl(e))),o=[];break;case"assistant":t.push(...jl(n))}return t.push(...o.map(e=>Nl(e))),t}(r);if(0===a.length)throw new uo("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 Ks(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(as).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:Rl(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=Nn(o,t);return{effort:Il(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function El(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${N("sha256").update(o).digest("hex").slice(0,32)}`}function Ol(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 Cl=new Set(["low","medium","high","xhigh"]),Il=e=>null!==e&&Cl.has(e);function Rl(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Nl(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function Pl(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(Dl(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(ql(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 ql(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function Dl(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?ql(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 jl(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 Ml(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 Fl(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Ul(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 Hl(e,t){let o=[];switch(e.type){case"response.created":Ul(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){Ul(t,o),Fl(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":Ul(t,o),Fl(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":Fl(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":{Fl(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage,a=Ml(e.response,n);t.terminalEvent=e.type,t.stopReason=a,o.push({type:"message_delta",delta:{stop_reason:a,stop_sequence:null},usage:Ol(r)},{type:"message_stop"});break}case"response.incomplete":{Ul(t,o),Fl(t,o);let n=e.response.usage,r=Ml(e.response,!1);t.terminalEvent=e.type,t.stopReason=r,o.push({type:"message_delta",delta:{stop_reason:r,stop_sequence:null},usage:Ol(n)},{type:"message_stop"});break}case"response.failed":Ul(t,o),Fl(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":Ul(t,o),Fl(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":Ul(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 Bl(e,t,o){let n=t.reasoning?.effort,r=e.get("requestData")||{};r.reasoningEffort=n,r.effortClamped=Is(o,n),e.set("requestData",r)}function Ll(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function zl(e,t,n){let r=!1;for(let a of t){if(o.debug("Translated Anthropic event:",a),"error"===a.type)throw new Fa(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 Jl(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 Gl(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 Kl(e,t){let o=performance.now()-t;return et.record(o,{model:e.model,target:"responses",streaming:String(!!e.stream)}),o}function Wl(e,t){return B(e,async o=>{let n=ms(o);o.onAbort(()=>{n.stop(),jt(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 Yl(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(),_=Jl(g),y=Xa(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 $l(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=Gl(t.data);if(!n)continue;h++,We.add(1,{model:u,endpoint_type:"responses"});let r=Ci(n);if(r){f=r;let t=e.get("requestData")||{};t.tokenUsage=Na(f),t._d1=d,e.set("requestData",t)}await zl(i,Hl(n,w),b)&&_.forwarded()}(function(e){if(!e.terminalEvent)throw new Fa("api_error","Upstream stream ended before the response completed")})(w),rr();let t=performance.now()-g,n={model:u,endpoint_type:"responses"};tt.record(t,n),lt.record(h,n),Za(e,p)}catch(t){if(Mt(e))return;if(b.content||!or(e))throw function(e,t,o){if(!(t instanceof Fa))return;let n="stream_incomplete";t instanceof $l?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 Ha(a,t),t;r=t instanceof $l?"foundry_stream_idle":"foundry_stream_failed",pt(l,t)}finally{f&&Pa(l,f),_.record(l),r||function(e,t,o){e&&(Ll(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 bs(e,t,{reason:r,progress:b})}async function Vl(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),Zs(o,t.messages);let n=Sl(t,de.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===de.provider,promptCacheKey:"foundry"===de.provider?El(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return el(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}),Bl(e,i,r),de.manualApprove&&await Ia();let s=performance.now(),l=new AbortController,{pending:c,capped:u}=function(e,t,o){let n=t.stream?xs():void 0;return{pending:$i(t,{onAttempt:t=>Bl(e,t,o.requestedEffort),signal:AbortSignal.any([Dt(e),o.upstreamIdle.signal,...n?[n.signal]:[]])}).finally(()=>n?.clear()),capped:void 0!==n}}(e,i,{requestedEffort:r,upstreamIdle:l});if(u&&!await As(e,c,s))return function(e,t,o){let{pending:n,copilotStart:r,upstreamIdle:a}=o;return nr(),Wl(e,async o=>{let i=await Os(e,o,{pending:n,start:r});i&&!Oi(i)&&await Yl(e,o,{response:i,model:t.model,copilotStart:r,_d1:Kl(t,r),upstreamIdle:a})})}(e,i,{pending:c,copilotStart:s,upstreamIdle:l});let p=await c,d=Kl(i,s);if(Oi(p)){let t=e.get("requestData")||{};if(Ll(e.get("requestSpan"),p.usage?.output_tokens_details?.reasoning_tokens),p.usage&&(t.tokenUsage=Na({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:Ml(e,o),stop_sequence:null,usage:Ol(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 nr(),Wl(e,t=>Yl(e,t,{response:p,model:i.model,copilotStart:s,_d1:d,upstreamIdle:l}))}function Xl(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 Zl(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Ql(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&&(Xl(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&&(Xl(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Zl(t,o)),r.content&&(Zl(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){Zl(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&&(Zl(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:tl(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 ec=/structured_outputs|output_config\.format/i;function tc(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&ec.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?vl({...e,model:Sn},o):null}var oc=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var nc=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const rc={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 nc: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 oc:e}finally{clearTimeout(i)}}},ac=["tavily","exa"];function ic(e){return"tavily"===e||"exa"===e}function sc(){return de.webSearchProviders.length>0}async function lc(e,t){return async function(e,t,n){let{providers:r,searchFns:a=rc}=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 cc(e){let t=e.tools;return!(!t||1!==t.length)&&rs(t[0])}function uc(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function pc(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 dc(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&&rs(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(!sc())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await lc(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_${uc()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...pc(n,e)}];return{id:`msg_ws_${uc()}`,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_${uc()}`,r=`msg_ws_${uc()}`,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:pc(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 mc(e){if(pn(de)||await Sr())return null;let t=br();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${vr()}`}},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 fc(e,t){let o=t.model;return o&&"string"==typeof o?null:Tl(e,"Model name is required and must be a string")}function hc(e,t){let o=performance.now()-t;return et.record(o,{model:e.model,target:"chat_completions",streaming:String(!!e.stream)}),o}function gc(e,t){return B(e,async o=>{let n=ms(o);o.onAbort(()=>{n.stop(),jt(e)});try{await t({stream:o,client:n})}finally{n.stop(),e.get("resolveStreamComplete")?.()}})}async function _c(e,t,o){let{pending:n,capped:r,copilotStart:a}=o;if(r&&!await As(e,n,a))return function(e,t,o){let{pending:n,copilotStart:r}=o;return nr(),gc(e,async o=>{let a=await Os(e,o,{pending:n,start:r});if(!a){let t=e.get("requestId");return void(t&&Ae.executeCompletion(t))}bc(a)||(rr(),await yc(e,o,{response:a,model:t.model,copilotStart:r,_d1:hc(t,r)}))})}(e,t,{pending:n,copilotStart:a})}async function yc(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=Xa(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=Na(d),t._d1=p,e.set("requestData",t)}let r=Ql(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),Za(e,u),d){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Na(d),t._d1=p,e.set("requestData",t))}}catch(t){throw dt(s,e.get("requestSpan"),t),await Ha(r,t),t}finally{d&&Pa(s,d),s.end(),l()}let _=e.get("requestId");_&&Ae.executeCompletion(_)}async function wc(e){let t=await e.req.json();if(cc(t))return fc(e,t)??dc(e,t);await Ma(de),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=fc(e,t);if(a)return a;t=function(e,t){return Ns(t,de.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Al(e,t);if(!i.ok)return i.response;t=i.payload;let s=await mc(e);if(s)return s;if(ja(t.model))return Vl(e,t,r);if(function(e){if("foundry"!==de.provider)return ol(e);let t=de.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:ol(e)}(t.model))return async function(e,t,o){let n="foundry"===de.provider,r=n?t:vl(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:Is(o,i),streaming:!!r.stream}),de.manualApprove&&await Ia(),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),hs(t,r,a.anthropicBeta);try{let o=performance.now(),i=await gs(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=tc(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=Na(kc(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=Xa(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"}),vc(e.data,s)&&(p=!0),await n.writeSSE(e)):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 Ha(n,t),t}finally{if(Za(e,o),p){let t=kc(s);Pa(c,t);let o=e.get("requestData")||{};o.tokenUsage=Na(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),Zs(o,t.messages);let r=nl(t,de.models),a=r.messages.at(0);return el(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=Wa(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:Is(r,u),streaming:!!c.stream});let p=performance.now();de.manualApprove&&await Ia();let{pending:d,capped:m}=function(e,t){let o=t.stream?xs():void 0;return{pending:_i(t,o&&{signal:AbortSignal.any([Dt(e),o.signal])}).finally(()=>o?.clear()),capped:void 0!==o}}(e,c),f=await _c(e,c,{pending:d,capped:m,copilotStart:p});if(f)return f;let h=await d,g=hc(c,p);if(bc(h)){let t=e.get("requestData")||{};h.usage&&(t.tokenUsage=Na(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=hl(a.message),i=fl(a.message.content),s=gl(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:tl(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 gc(e,t=>yc(e,t,{response:h,model:c.model,copilotStart:p,_d1:g}))}const bc=e=>Object.hasOwn(e,"choices");function kc(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 vc(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 xc=new F;xc.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&cc(t)}catch{return!1}}(e)?await wc(e):await ir(e,"messages",wc)}catch(t){return await qo(e,t)}});const Tc=new F;function Ac(e){return Re.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Da(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 $c(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=Na(o),n._d1=t._d1,t.c.set("requestData",n)}Tc.get("/",async e=>{try{de.models||await cr();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 qo(e,t)}});const Sc=new Set(["message","function_call","function_call_output"]),Ec=new Set(["type","name","description","parameters"]);async function Oc(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||!sc())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await lc(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Cc(e){if(sc())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Oc(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Ic(e){if(!sc())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 Oc(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Rc(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 Sc.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Nc(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 Pc(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&&Nc(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)Nc(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function qc(e){return null!=e}function Dc(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function jc(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Mc(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(!Dc(n)){o.push(n);continue}let e=Rc(n);null===e?t.add(jc(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"])qc(e[o])&&(t[o]=e[o]);let r=new Set;if(qc(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))Ec.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(qc(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},qc(o.effort)&&(t.reasoning.effort=o.effort),qc(o.summary)&&(t.reasoning.summary=o.summary)}if(qc(e.text)&&"object"==typeof e.text){let o=e.text;qc(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Fc(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Uc(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||qc(n.previous_response_id)||qc(n.prompt)||qc(n.conversation)?null:Fc(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 Hc(e){await Ma(de);let t=await e.req.json();if(!Dc(t))return Fc(e,"request body must be a JSON object");let n=function(e){return"foundry"===de.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:Mc(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:Ac(t)}}catch(t){if(t instanceof qa)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=Uc(e,t.input,n);if(s)return s;let l=await Ra(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),de.manualApprove&&await Ia();let c=performance.now(),u=await $i(a,{signal:Dt(e)}),p=performance.now()-c;if(et.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Bc(u))return async function(e,t,o){await Cc(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Na({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(()=>jt(e));let o={value:null},n=0,i=performance.now(),s=Xa(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Pc(i.data,r);s=await Ic(s);let l=s===i.data?i:{...i,data:s};We.add(1,{model:a.model,endpoint_type:"responses"}),$c(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),Za(e,c)}catch(o){if(Mt(e))return;throw dt(m,e.get("requestSpan"),o),await Ba(t,o),o}finally{o.value&&Pa(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 Bc=e=>Object.hasOwn(e,"output"),Lc=new F;Lc.post("/",async e=>{try{return await ir(e,"responses",Hc)}catch(t){return await qo(e,t)}});const zc=new F;zc.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 Jc=new F;Jc.get("/",async e=>{try{let t=await Lr();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Gc=new F;function Kc(){return function(e){let t=e.filter(e=>Sa(e));if(0===t.length)return;let o=t.find(e=>$a.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(de.models?.data??[])}function Wc(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 ka(o).slice(0,200)}catch{}let t=ka(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 Yc(e={}){let t=performance.now(),o=e.model&&function(e){let t=de.models?.data.find(t=>t.id===e);return void 0!==t&&Sa(t)}(e.model)?e.model:Kc();if(!o)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=(async()=>{try{let e=await Gc.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[Ta]:Aa},body:JSON.stringify({model:o,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(e.ok)return{ok:!0,model:o,status:e.status,durationMs:a()};let t=await e.text().catch(()=>"");return{ok:!1,model:o,status:e.status,durationMs:a(),reason:Wc(e.status,t,o),detail:t.slice(0,400)||void 0}}catch(e){let t=e instanceof Error?e.message:String(e);return{ok:!1,model:o,durationMs:a(),reason:`Request failed before a usable response: ${t}`,detail:t}}})(),s=new Promise(e=>{n=setTimeout(()=>{e({ok:!1,model:o,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([i,s])}finally{n&&clearTimeout(n)}}Gc.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=Ft(i),l=function(e){return e===Aa}(e.req.header(Ta));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(()=>Ca(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{}}):Ca(y)}),Gc.use(U()),Gc.use(async(e,t)=>{let o=e.req.header("content-length");if(o){let t=Number(o);if(Number.isFinite(t)&&t>33554432)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 32 MB limit (got ${t} bytes).`}},413)}await t()}),Gc.get("/",e=>e.text("Server running")),Gc.route("/health",ts),Gc.route("/chat/completions",Zi),Gc.route("/models",Tc),Gc.route("/embeddings",es),Gc.route("/usage",Jc),Gc.route("/token",zc),Gc.route("/v1/chat/completions",Zi),Gc.route("/v1/models",Tc),Gc.route("/v1/embeddings",es),Gc.route("/v1/messages",xc),Gc.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||gn(t.capabilities.family)||"o200k_base"!==t.capabilities.tokenizer?{name:"claude",tokenizer:is}:(ss??=import("ai-tokenizer/encoding/o200k_base").then(e=>new z(e)),{name:"o200k_base",tokenizer:await ss})}(t.model),r=e=>cs(n,e),a=ls.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");a+=ls.perMessage+r(e)*ls.contentMultiplier}for(let e of t.messages)a+=ls.perMessage,a+=r(e.role),"string"==typeof e.content?a+=r(e.content)*ls.contentMultiplier:Array.isArray(e.content)&&(a+=us(e.content,r));let i=t.tools?.filter(as);i&&i.length>0&&(a+=function(e,t){let o=ls.toolsExist;for(let[n,r]of e.entries())n>0&&(o+=ls.perTool),o+=t(r.name),r.description&&(o+=ls.perDesc+t(r.description)),o+=ps(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})}),Gc.route("/v1/responses",Lc),Gc.route("/responses",Lc),Gc.onError((e,t)=>qo(t,e));const Vc=e=>`${e}`,Xc=e=>`${e}`,Zc=e=>`${e}`,Qc=e=>`${e}`,eu=e=>`${e}`,tu=Xc(" ─────────────────────────────────────────────────────────────");function ou(e,t,o){console.log(` ${function(e){return"ok"===e?Zc("✓"):"warn"===e?eu("⚠"):Qc("✗")}(e)} ${Vc(t.padEnd(14))} ${o}`)}function nu(e){console.log(` ${Xc("↳")} ${Xc(e)}`)}function ru(e){return e instanceof uo?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function au(){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 iu(){try{await cr();let e=(de.models?.data.length??0)>0;return ou(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 ou("fail","Model catalog",ru(e)),nu("Could not fetch /models — check connectivity/auth."),!1}}async function su(e){de.accountType=e.accountType;let t=await Xt(),o=Zt();if(console.log(""),console.log(` ${Vc("COPILOT-API DOCTOR")} ${Xc(`v${t}`)}`),console.log(tu),ou("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await ee(),ur(),!await async function(){let e=await au();if(!e)return ou("fail","Auth token","not found"),void nu("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");de._t2=e.token,ou("ok","Auth token",`found (${e.source})`);try{let e=await jo();return await Tt(de,e.login),ou("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return ou("fail","GitHub auth",ru(e)),void nu("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(tu),console.log(` ${Qc("✗")} ${Vc("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await Do();return de._t1=e,ou("ok","Service token","acquired"),!0}catch(e){let t=e instanceof uo?e.response.status:0;return ou("fail","Service token",ru(e)),nu(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 iu();await async function(){try{let e=await Lr(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${jr(Mr(t))} of ${jr(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;ou("ok","Copilot plan",`${e.copilot_plan} · ${o} `+Xc(`(resets ${e.quota_reset_date})`))}catch(e){ou("warn","Copilot plan",`unavailable (${ru(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Yc();return e.ok?(ou("ok","Generation",`works via ${e.model} ${Xc(`(${e.durationMs}ms)`)}`),!0):(ou("fail","Generation",`${e.reason}${e.status?Xc(` [HTTP ${e.status}]`):""}`),!1)}():ou("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){ou(t,"Client config","potential base-URL issue");for(let t of e)nu(t)}else ou("ok","Client config","no base-URL issues detected");nu("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(tu),a?(console.log(` ${Zc("✓")} ${Vc("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${eu("⚠")} ${Vc("Some checks need attention")} — see the ${Qc("✗")}/${eu("⚠")} lines above.`),console.log(""),2)}const lu=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 su({accountType:e["account-type"]});y.exit(t)}});function cu(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 uu=!1;const pu="copilot-api-node20",du=`https://registry.npmjs.org/${pu}/latest`,mu=e=>`${e}`,fu=e=>`${e}`;async function hu(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(du,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function gu(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 _u,yu;async function wu(e){try{let[t,o]=await Promise.all([Xt(),hu(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 bu(){if(!_u||!yu)return;let{signal:e}=yu;_u.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${pu}@latest`,n=fu("│"),r=` ${mu("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,a=` Run ${mu(o)} to update`,i=" ".repeat(54),s=fu(`╭${"─".repeat(54)}╮`),l=fu(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${gu(r,54)}${n}`,`${n}${i}${n}`,`${n}${gu(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var ku={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 vu=262144,xu="https://barazany.dev",Tu=/^[a-z0-9][a-z0-9-]*$/i,Au=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function $u(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(Au," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function Su(e){if("object"!=typeof e||!e)return null;let t=e,o=$u(t.title,100),n=$u(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!==xu||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&&Tu.test(t.slug)&&(r=`${xu}/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 Eu(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=Su(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 Ou=null;function Cu(e){return s.join(e,"blog-posts.json")}function Iu(e=Q.APP_DIR){try{if(Ou&&Ou.length>0)return Ou;let t=function(e){try{let t=Cu(e);return K.statSync(t).size>vu?[]:Eu(JSON.parse(K.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Eu(ku)}catch{return[]}}function Ru(e){return e>-6e4&&e<864e5}async function Nu(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>vu)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>vu?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>vu)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?[]:Eu(JSON.parse(o))}finally{clearTimeout(o)}}async function Pu(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=Cu(e),n=await K.promises.stat(o);if(n.size<=vu){let e=await K.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Ru(t-n.fetchedAt)}return Ru(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await Nu(e.timeoutMs??3e3);if(0===n.length)return;Ou=n,await async function(e,t,o){let n=Cu(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 qu(e){let t;try{({login:t}=await Du(e))}catch(e){return void o.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await Fn(),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 Du(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,wr=!1}(n),o.info("Using provided Auth token")):await Or();try{t=await jo(),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 Do();de._t1=e,o.debug("Service token fetched successfully!"),de.showToken&&o.info("Service token:",e),yr=!0,Er(t),yt.start(),fr=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),$r(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},hr=()=>{o.debug("Network connectivity lost")},yt.on("online",fr),yt.on("offline",hr)})(),t}function ju(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 Mu(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 Fu=e=>`${e}`,Uu=e=>`${e}`,Hu=e=>`${e}`,Bu=e=>`${e}`,Lu=e=>`${e}`,zu=e=>`${e}`,Ju=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Gu="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Ku="https://github.com/johnib/copilot-api-issues/issues",Wu=Uu(" ─────────────────────────────────────────────────────────────");function Yu(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Vu(e){return e&&0!==e.length?e.join("·"):"—"}function Xu(e){if(0===e.length)return[];let t=["",Wu,` ${Fu("BARAZANY.DEV")} ${Uu("— Recent Posts")}`,Wu,""];for(let[o,n]of e.entries()){let e=`${n.url}${Gu}`,r=Ju(e,Fu(zu(`[${o+1}]`)));t.push(` ${r} ${Hu(n.title)}`,` ${Uu("→")} ${Uu(n.teaser)}`,"")}return t.push(Wu,` ${Ju(`https://barazany.dev/blog${Gu}`,"barazany.dev/blog")}`,Wu),t}function Zu(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(Uu(" → "))} ${Bu("✓")}`:Uu("off"),n=["",` ${Fu("COPILOT-API")} ${Uu(`v${e.version}`)}`,Wu,` ${Uu("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Uu("User")} ${e.user} ${Uu("·")} ${e.accountType}`];return de._v1&&n.push(` ${Uu("Client")} VSCode ${de._v1}`),n.push(` ${Uu("Network")} ${t.join(Uu(" · "))}`,` ${Uu("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Uu("Clipboard")} Claude Code command ${Bu("✓")}`),n.push(Wu),n}function Qu(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Fu("Active")}`];if(e.model){let o=de.models?.data.find(t=>t.id===e.model),n=Yu(o?.capabilities.limits?.max_context_window_tokens),r=Vu(o?.capabilities.supports.reasoning_effort);t.push(` ${Hu(e.model.padEnd(32))} ${Uu("ctx")} ${Fu(n.padStart(5))} ${Uu("effort")} ${Uu(r)} ${Lu("← main")}`)}if(e.smallModel){let o=de.models?.data.find(t=>t.id===e.smallModel),n=Yu(o?.capabilities.limits?.max_context_window_tokens),r=Vu(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Uu("ctx")} ${n.padStart(5)} ${Uu("effort")} ${Uu(r)} ${Lu("← small")}`)}return t}function ep(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("",` ${Fu(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Hu("●"):Uu("·"),i=n?Hu(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Yu(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Vu(r.effort)}`;t.push(` ${a} ${i} ${Uu(s)}${Uu(l)}`)}}return t}function tp(){let e=Ku.replace(/^https:\/\//,""),t=Ju(`${Ku}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Wu,` ${Fu("FOUND A BUG?")} ${Uu("— Report it on GitHub")}`,Wu,"",` ${Hu("→")} ${Hu(t)}`,` ${Uu("Bug reports, feature requests, and questions welcome.")}`,"",Wu]}function op(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=["",Wu,` ${Fu("Claude Cowork")} ${Uu("— Settings → Inference Provider")}`,Wu,"",` ${Uu("Paste into")} ${Fu("inferenceGatewayBaseUrl")}${Uu(":")}`,` ${Fu(Hu(r))}`];return n||a.push("",` ${Uu("Your Tailscale hostname is shown by:")} ${Hu("tailscale status --self")}`),a.push("",` ${Uu("Docs:")} ${Hu("https://claude.com/docs/cowork/3p/installation")}`),a}function np(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Wu,` ${Fu("HTTPS")} ${Uu("— self-signed cert")}`,Wu,"",` ${Uu("Cert")} ${t}`];switch(o.push("",` ${Fu("Trust this cert")} ${Uu("(one-time setup)")}`),y.platform){case"darwin":o.push(` ${Uu("macOS:")}`,` ${Hu("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Hu(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Uu("Windows (PowerShell as Administrator):")}`,` ${Hu(`Import-Certificate -FilePath "${t}" \``)}`,` ${Hu("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Uu("Linux (Debian/Ubuntu):")}`,` ${Hu(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Hu("sudo update-ca-certificates")}`,` ${Uu("Linux (Fedora/RHEL/Arch):")}`,` ${Hu(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Hu("sudo update-ca-trust")}`);break;default:o.push(` ${Uu("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Uu("Or, for Node CLIs only (no admin needed):")}`,` ${Hu(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Wu),o}function rp(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 ap(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 uo)return o;t.add(o),o=_o(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":Jt(r&&r!==e?`${a} (cause: ${r.message})`:a)}),await Ie()}const ip=s.join(Q.APP_DIR,"certs"),sp=s.join(ip,"cert.pem"),lp=s.join(ip,"key.pem"),cp=s.join(ip,"cert.meta.json");async function up(e){try{return await a.readFile(e,"utf8")}catch{return}}async function pp(e){let t=await up(sp),o=await up(lp),n=await async function(){let e=await up(cp);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 dp(e){return 0!==V(e)}async function mp(e){await a.mkdir(ip,{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)dp(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(sp,l.cert,{mode:420}),await a.writeFile(lp,l.private,{mode:384}),await async function(e){await a.writeFile(cp,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:sp,keyPath:lp,generated:!0}}const fp=[],hp=Date.now();let gp="";function _p(){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()-hp)/1e3}});for(let t of fp)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Ju("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Wu,` ${Fu("COPILOT-API")} ${Uu(`v${e}`)} ${Uu("·")} ${rp(t)} uptime`,Wu,""," Check in from time to time on",` ${Hu(o)}`,"",Wu,""];console.log(n.join("\n"))}(gp,Date.now()-hp),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 yp=e=>e.filter(e=>Tn(e)).map(e=>e.id),wp=e=>e.filter(e=>An(e)).map(e=>e.id);async function bp(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,yp(de.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:yp(de.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:yp(de.models.data)}));let s=ju({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 kp(e){return e._t2?"cli_arg":y.env.GH_TOKEN?"env_var":"stored"}function vp(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=Re.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:mt({config:Mu(t,{version:o,_t3:kp(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()-hp},"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()-hp},"copilot_api"))}async function xp(e,t){try{return await async function(e){return"foundry"===e.provider?(de.foundry=tn(process.env),de.connectivity.h2=!1,de.connectivity.h2Keepalive=!1,"entra"===de.foundry.auth&&await Ko(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 qu(e):void 0)??"foundry"}):Du(e)}(e)}catch(o){throw await ap(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:kp(e)}),o}}async function Tp(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 pp(e)){let e=await up(sp),t=await up(lp);if(e&&t)return{cert:e,key:t,certPath:sp,keyPath:lp,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),mp(e)}(e.httpsHosts)}}async function Ap(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=ua;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(_p(),fp.push(()=>{o.debug("Cleaning up connectivity monitor"),yt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),yr=!1,dr&&=void clearInterval(dr),fr&&=void yt.off("online",fr),hr&&=void yt.off("offline",hr),mr=void 0,gr=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),ni&&=void clearInterval(ni),ri&&=void clearInterval(ri);let e=[...ei.keys(),...ti];ei.clear(),ti.clear(),Qa.clear(),oi=void 0;for(let t of e)ai(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(),Pu().catch(()=>{}),ur();let n=await Xt();gp=n;let r=Zt();!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,hp);let a=await xp(t,n);await async function(){try{return await cr({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(()=>{cr().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{cr().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)}}();fp.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),de.connectivity.h2&&(li(si(At(de))),de.connectivity.h2Keepalive&&ui()),vp({options:t,version:n,runtime:r,_u1:a});let s=await Tp(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await bp(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=wp(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:wp(de.models.data)});let a=ju({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=[...Zu(e),...Qu(e),...ep(e),...tp(),"",...Xu(Iu()),...op(e),...np(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 Zr()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),bu(),Y({fetch:Gc.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 Yc({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 void o.success(`Self-test passed — generation works via ${r.model} (${r.durationMs}ms). ${t}`)}let a=r.status?` (HTTP ${r.status})`:"";o.warn(`Self-test FAILED${a}: ${r.reason??"unknown error"}`),r.detail&&o.info(` detail: ${ka(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 $p(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Sp=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" re-sends a Foundry-rate-limited (429) request to GitHub Copilot and keeps that model on Copilot until Foundry\'s retry-after passes. 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:$p(t,"--rate-limit"),r=e.timeout,a=void 0===r?pe:$p(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:$p(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(!ic(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${ac.join(", ")}`);let r=n.length>0?n:ac,a=new Set,i=n.length>0,s=[];for(let e of r){if(!ic(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 Ap({provider:f,fallback:Mn(e.fallback,y.env.COPILOT_API_FALLBACK,f),port:$p(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})}});uu||(uu=!0,o.setReporters([cu(o.options.reporters)]));const Ep=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(_u||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;yu=e,_u=wu(e).catch(()=>null)})(),Ep||bu();const Op=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Rr,start:Sp,"check-usage":Kr,debug:to,doctor:lu,"cowork-setup":wa}});await t(Op),Ep||(yu?.abort(),yu=void 0,_u=void 0);export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "copilot-api-node20",
3
- "version": "0.44.0-preview.25",
3
+ "version": "0.44.0-preview.26",
4
4
  "description": "Turn GitHub Copilot into OpenAI/Anthropic API compatible server. Usable with Claude Code! (Node v20+ fork)",
5
5
  "keywords": [
6
6
  "proxy",