copilot-api-node20 0.42.1 → 0.42.2

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{SpanKind as l,SpanStatusCode as c,context as u,metrics as p,trace as d}from"@opentelemetry/api";import m from"clipboardy";import{execFile as f,execSync as h}from"node:child_process";import g from"node:process";import{SeverityNumber as _,logs as y}from"@opentelemetry/api-logs";import{OTLPLogExporter as w}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as b}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as T}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as $}from"@opentelemetry/sdk-metrics";import{NodeSDK as x}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as A,ATTR_SERVICE_NAME as S,ATTR_SERVICE_VERSION as E}from"@opentelemetry/semantic-conventions";import{Client as C,request as O}from"undici";import{createHash as I,randomBytes as P,randomUUID as R}from"node:crypto";import{promisify as N}from"node:util";import{Hono as q}from"hono";import{cors as D}from"hono/cors";import{streamSSE as M}from"hono/streaming";import{events as j}from"fetch-event-stream";import{Tokenizer as H,models as B}from"ai-tokenizer";import*as F from"ai-tokenizer/encoding/claude";import{accessSync as U}from"node:fs";import{serve as L}from"srvx";import{isIP as G}from"node:net";import{generate as z}from"selfsigned";const J=s.join(i.homedir(),".local","share","copilot-api"),K={APP_DIR:J,GITHUB_TOKEN_PATH:s.join(J,"github_token"),MACHINE_ID_PATH:s.join(J,"machine_id"),SESSION_ID_PATH:s.join(J,"session_id")};async function W(){await a.mkdir(K.APP_DIR,{recursive:!0}),await V(K.GITHUB_TOKEN_PATH),await V(K.SESSION_ID_PATH)}async function V(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const Y=6e5,X={accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:Y,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}},Z=" │ ",Q=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()},ee=(e,t)=>e.padEnd(t),te=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),oe=(e,t,o)=>` --\x3e ${ee(e,4)} ${ee(t,21)} ${ee(o,3)}`,ne=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return ee(t,22)})(e.model??"—")+ee(t,8)},re=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?Q(Math.max(t-o,0)):"—",r=e?Q(e.outputTokens??0):"—",a=o?Q(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},ae=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${ee("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=Q(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},ie=e=>{if(void 0===e.ttfbMs)return`e2e ${te(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${te(e.ttfbMs)} → e2e ${te(e.e2eMs)} ${t}`},se=e=>e?X.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,le=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}}),ce={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=>[oe(e.method,e.path,e.status),ne(e),re(e.tokenUsage),ae(e.tokenUsage,e.maxContextTokens),ie({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(Z))({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:se(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),Ke(_.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)},...le(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.warn((e=>[oe(e.method,e.path,"429"),ne(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${te(e.e2eMs)}`].join(Z))({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=oe(e.method,e.path,e.status.toString()),o=ne(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${te(e.e2eMs)}`].join(Z)})({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(()=>ce.cleanup(),6e4);let ue,pe,de=Date.now();const me={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function fe(){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):me;return{endpoint:e.replace(/\/$/,""),headers:t}}const he=d.getTracer("copilot-api"),ge=p.getMeter("copilot-api"),_e=y.getLogger("copilot-api"),ye=ge.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),we=ge.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),ke=ge.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),be=ge.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),ve=ge.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Te=ge.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),$e=ge.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),xe=ge.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Ae=ge.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Se=ge.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ee=ge.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Ce=ge.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Oe=ge.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Ie=ge.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Pe=ge.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Re=ge.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Ne=ge.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),qe=ge.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),De=ge.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Me=ge.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),je=ge.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),He=ge.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Be=ge.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Fe=ge.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Ue=ge.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Le=ge.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Ge=ge.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),ze=ge.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),Je=ge.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function Ke(e,t,o,n,r){let a=d.getActiveSpan()?.spanContext()??r;_e.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function We(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:c.ERROR,message:o??n.message}),e.recordException(n)}function Ve(e,t,o){We(e,o),t&&t!==e&&We(t,o)}function Ye(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,Ye(r,e)))}return o}ge.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!tt.getConnectivityStats().isOnline)}),ge.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(tt.getConnectivityStats().consecutiveFailures)}),ge.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(X.models?.data.length??0)}),ge.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ce.completionCallbacks.size)}),ge.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-de)/1e3)});const Xe=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","proxy-authorization"]);function Ze(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Xe.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function Qe(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:u}=e,p=he.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&Ze(p,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();Xe.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),Oe.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:c.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw We(p,e),p.end(),e}}async function et(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=he.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Ze(f,"request",a);try{let{statusCode:e,headers:t,body:l}=await O(o,{method:r,headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!Xe.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Oe.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:c.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:l,span:f}}catch(e){throw We(f,e),f.end(),e}}const tt=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:X.connectivity.probeEndpoints,fastInterval:X.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?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval)+Math.random()*X.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=he.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),X.connectivity.timeoutMs);try{let n=!1;for(let e of X.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",...X.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Ue.record(r,{endpoint:e,result:"success"});break}Ue.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),Ee.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")),Ce.add(1,{from:"offline",to:"online"}),Ke(_.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")),Ce.add(1,{from:"online",to:"offline"}),Ke(_.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?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*X.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:X.connectivity.jitterMaxMs>0,connectionPooling:X.connectivity.connectionPooling,dnsCache:X.connectivity.dnsCache}}},ot=()=>({"content-type":"application/json",accept:"application/json"}),nt="0.48.1",rt=`copilot-chat/${nt}`,at=`GitHubCopilotChat/${nt}`,it=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`${K.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=I("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},st=async(e,t)=>{e.machineId||=await it(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(K.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(K.SESSION_ID_PATH,e),await a.chmod(K.SESSION_ID_PATH,384),e})()},lt=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,ct=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=R(),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":rt,"User-Agent":at,"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":R(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},ut=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const pt=(e,t,o)=>{let n=ct(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&&ut.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},dt="https://api.github.com",mt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":rt,"user-agent":at,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),ft="https://github.com",ht="01ab8ac9400c4e429b23",gt=["user:email"].join(" ");function _t(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 yt=32768,wt=[{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_***"}],kt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);function bt(e){let t=e;for(let{regex:e,mask:o}of wt)t=t.replace(e,o);return t}const vt=new Map;function Tt(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 $t(e,t,o){let n=bt(o),r=8*yt,a=n.length>r,i=a?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(i.length<=yt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=yt)e.setAttribute(`${t}.part_${o/yt}`,i.slice(o,o+yt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/yt))}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 xt(e,t){let o=function(e){if(vt.size>=1e3&&!vt.has(e)){let e=vt.keys().next().value;void 0!==e&&vt.delete(e)}let t,o=(vt.get(e)??0)+1;return vt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",qe.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&&$t(e,"copilot_api.incoming_request_body",n);let r=At(t.c.req.header());return r&&$t(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&$t(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&$t(e,"copilot_api.outgoing_headers",At(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&$t(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function At(e){let t={};for(let[o,n]of Object.entries(e))kt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function St(){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 Et(){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 Ct(){try{return!!(await a.stat(K.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(K.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Ot(e){let t=await async function(){let[e,t]=await Promise.all([St(),Ct()]);return{version:e,runtime:Et(),paths:{APP_DIR:K.APP_DIR,GITHUB_TOKEN_PATH:K.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 It=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})=>Ot({json:e.json})}),Pt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Rt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Nt=new Set;let qt;function Dt(e){if(X.errorReporting&&!(e.statusCode<500)&&!Nt.has(e.signature)){if(Nt.size>=1e3){let e=Nt.values().next().value;void 0!==e&&Nt.delete(e)}Nt.add(e.signature),async function(e){qt??=St();let t=await qt,o=Et(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(bt(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:_t(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(Pt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Rt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}var Mt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},jt=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Ht(e,t){return setTimeout(()=>e.abort(new jt(t)),t)}const Bt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EPIPE","ECONNRESET"]),Ft=RegExp(`\\b(?:${[...Bt].join("|")})\\b`);function Ut(e){return e instanceof Error?e.code:void 0}function Lt(e){return e.req.path.startsWith("/v1/messages")}function Gt(e,t){if(Lt(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"}}}}function zt(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 Jt(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",t.message))}function Kt(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=e.message),t}function Wt(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=Tt({endpointType:_t(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});xt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function Vt(e,t,o){let n=e.get("requestId"),r=ce.completionCallbacks.get(n);r&&(ce.logError(r,t,o),ce.completionCallbacks.delete(n))}async function Yt(e,t){if(t instanceof Mt&&429===t.response.status)return async function(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=ce.completionCallbacks.get(n);r&&(ce.logRateLimit(r,t.response),ce.completionCallbacks.delete(n)),Te.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=Gt(a,e),s=zt(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),Jt(o,s),Ke(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...Kt(s)}),Wt({c:e,error:t,errorText:a,upstream:s}),e.json(i,429)}(e,t);if(t instanceof SyntaxError){d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),Ke(_.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=Lt(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 Vt(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Mt)return async function(e,t){let o=d.getActiveSpan(),n=await t.response.text(),r=Gt(n,e),a=zt(r);return Vt(e,t.response.status,a.message??t.message),o?.setStatus({code:c.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),Jt(o,a),Ke(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...Kt(a)}),Wt({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&Dt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Tt({endpointType:_t(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}),e.json(r,t.response.status)}(e,t);if(function(e){return e instanceof jt||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof jt}(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.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.";Ke(_.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=Lt(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return Vt(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(function(e){if(!(e instanceof Error))return!1;let t=e.cause,o=Ut(e)??Ut(t);return o?Bt.has(o):Ft.test(e.message)||t instanceof Error&&Ft.test(t.message)}(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n="Temporary upstream connection failure. Please retry.";Ke(_.WARN,"WARN",n,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport"}),e.header("Retry-After","1");let r=Lt(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"service_unavailable"}};return Vt(e,503,t instanceof Error?t.message:n),e.json(r,503)}(e,t);let n=d.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:c.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),Ke(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Dt({route:e.req.path,statusCode:500,errorClass:r.name,signature:Tt({endpointType:_t(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:r.message}),Vt(e,500,r.message),o.error(r);let a=Lt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const Xt=async()=>{let e=`${dt}/copilot_internal/v2/token`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Qe({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:mt(X),signal:o.signal});try{if(!t.ok)throw new Mt("Failed to get Service token",t);return await t.json()}catch(e){throw We(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function Zt(){let e=`${dt}/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Qe({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${X._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Mt("Failed to get GitHub user",t);return await t.json()}catch(e){throw We(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let Qt=null;function eo(){return Qt||=Xt().then(({token:e})=>{X._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{Qt=null}),Qt}const to=async()=>{let e=`${lt(X)}/models`,t=ct(X),o=X.timeoutMs,n=new AbortController,r=Ht(n,o);try{let{response:o,span:r}=await Qe({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Mt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw We(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const oo=e=>new Promise(t=>{setTimeout(t,e)}),no=e=>null==e;async function ro(){let e=await(async()=>{try{return await to()}catch(e){if(e instanceof Mt&&401===e.response.status)return await eo(),to();throw e}})();X.models=e}const ao=()=>{X._v1="1.140.0-insider"};var io=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let so,lo,co,uo,po,mo=!1;function fo(){return ho()?po:void 0}function ho(){return void 0!==po&&Date.now()-po.at<6e4}function go(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";X._t1=void 0,po={status:s,message:l,at:Date.now()},clearInterval(so),so=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Ae.add(1,{reason:r,success:"false"}),Se.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:c.ERROR,message:n.message}),t.recordException(n),Fe.record(performance.now()-a,{reason:r}),Ke(_.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 _o(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;X._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:c.ERROR,message:s.message}),t.recordException(s),Se.add(1,{reason:r}),Fe.record(performance.now()-a,{reason:r}),Ke(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const yo=async(e=5,t=1e3,n="scheduled")=>mo?(o.debug("Token refresh already in progress, coalescing"),lo):(mo=!0,lo=he.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}=await Xt();return X._t1=t,po=void 0,o.debug("Service token refreshed successfully"),X.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Ae.add(1,{reason:n,success:"true"}),Fe.record(performance.now()-a,{reason:n}),void Ke(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Mt&&(401===s.response.status||403===s.response.status))return void go({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),Ae.add(1,{reason:n,success:"false"}),l)return void _o({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(),mo=!1,lo=void 0}}),lo);async function wo(){return!!X._t1||!ho()&&(await yo(3,250,"on-demand"),!!X._t1)}async function ko(e){try{let t=await a.readFile(K.GITHUB_TOKEN_PATH,"utf8");if(t&&!e?.force)return X._t2=t,X.showToken&&o.info("Auth token:",t),void await bo();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=X.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${ft}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:ht,scope:gt}),signal:e.signal});if(!t.ok)throw new Mt("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{m.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=g.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",f(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 io("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=X.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${ft}/login/oauth/access_token`,{method:"POST",headers:ot(),body:JSON.stringify({client_id:ht,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await oo(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 io("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new io("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 oo(t);continue}if(r.access_token)return r.access_token;await oo(t)}catch(e){if(e instanceof io)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await oo(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(K.GITHUB_TOKEN_PATH,e,{mode:384}))(r),X._t2=r,X.showToken&&o.info("Auth token:",r),await bo()}catch(e){throw e instanceof Mt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function bo(){let e=await Zt();o.success(`Authenticated as ${e.login}`)}async function vo(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),X.showToken=e.showToken,await W(),await ko({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 To=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})=>vo({verbose:e.verbose,showToken:e["show-token"]})}),$o=.01,xo=864e5,Ao=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),So=new Intl.NumberFormat("en-US"),Eo=e=>Ao.format(e*$o),Co=e=>e.credits_used??e.entitlement-e.remaining,Oo=(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())/xo;if(r<.5)return;let a=Co(e),i=a*$o/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*$o,c=new Date(n.getTime()+l/i*xo);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Io=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${So.format(Co(e))} of ${So.format(e.entitlement)} used`:"n/a",Po=e=>e.padEnd(14),Ro=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Po("AI credits")}unlimited`);else{let e=Co(o),t=o.percent_remaining;n.push(`${Po("AI credits")}${Eo(e)} / ${Eo(o.entitlement)} ${t.toFixed(1)}% left`,`${Po("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Po("")}${So.format(e)} of ${So.format(o.entitlement)} credits`)}if(n.push("",`${Po("Chat")}${Io(e.quota_snapshots.chat)}`,`${Po("Completions")}${Io(e.quota_snapshots.completions)}`,"",`${Po("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/xo)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=Oo(o,e.quota_reset_date,t);r&&n.push(`${Po("Burn rate")}~${Ao.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?`${So.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Po("Overage")}${a}`)}return n.join("\n")},No=async()=>{let e=`${dt}/copilot_internal/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Qe({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:mt(X),signal:o.signal});try{if(!t.ok)throw new Mt("Failed to get usage",t);return await t.json()}catch(e){throw We(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},qo=()=>g.stdout.write(""),Do=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Mo=async()=>{let e=await No();return Ro(e)},jo=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 W(),await ko(),!e.watch){try{o.box(await Mo())}catch(e){o.error("Failed to fetch usage:",e),g.exit(1)}g.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=g.stdout.isTTY,r=()=>g.exit(0);for(g.on("SIGINT",r),g.on("SIGTERM",r);;){try{let e=await Mo();n&&qo(),o.box(e),o.log(Do(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Ho=N(f);async function Bo(){let e="win32"===g.platform?"where.exe":"which";try{return await Ho(e,["tailscale"]),!0}catch{return!1}}async function Fo(){try{let{stdout:e}=await Ho("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Uo(e){return e.replace(/\.$/,"")}async function Lo(){let e=await Fo();if(e?.Online)return Uo(e.DNSName)}const Go=N(f),zo=e=>`${e}`,Jo=e=>`${e}`,Ko=e=>`${e}`,Wo=e=>`${e}`,Vo=e=>`${e}`,Yo=e=>`${e}`,Xo=Jo(" ─────────────────────────────────────────────────────────────"),Zo=s.join(K.APP_DIR,"certs","tailscale"),Qo=s.join(Zo,"cert.pem"),en=s.join(Zo,"key.pem"),tn={certDir:Zo,certPath:Qo,keyPath:en};function on(){switch(g.platform){case"darwin":return[` ${Jo("Install Tailscale for macOS:")}`,` ${Ko("https://tailscale.com/download/mac")}`,` ${Jo("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${Jo("After installing, open the Tailscale app and sign in.")}`,` ${Jo("Then re-run this command.")}`].join("\n");case"linux":return[` ${Jo("Install Tailscale for Linux:")}`,` ${Ko("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Ko("sudo tailscale up")}`,` ${Jo("or")} ${Ko("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${Jo("Install Tailscale for Windows:")}`,` ${Ko("https://tailscale.com/download/windows")}`,"",` ${Jo("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${Jo("Install Tailscale:")} ${Ko("https://tailscale.com/download")}`}}function nn(){let e=[` ${Vo("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${Jo("Open the Tailscale app from Applications and sign in.")}`,` ${Jo("Download:")} ${Ko("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${Jo("Open the Tailscale app and sign in.")}`,` ${Jo("Download:")} ${Ko("https://tailscale.com/download/windows")}`):e.push(` ${Jo("Connect with:")} ${Ko("sudo tailscale up")}`),e.push("",` ${Jo("Then re-run this command.")}`),e.join("\n")}async function rn(){try{return await a.access(Qo),await a.access(en),!0}catch{return!1}}function an(e){console.log(""),console.log(Xo),console.log(` ${zo("Claude Cowork Setup")} ${Jo("— Diagnostic")}`),console.log(Xo),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?Wo("✅"):"missing"===n.status?Vo("❌"):Yo("❓");let r=n.detail?Jo(` ${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(` ${Wo("All checks passed.")}`):console.log(` ${Vo(`${t.length} issue(s).`)} Run ${Ko("copilot-api cowork-setup install")} to fix.`),console.log("")}const sn={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},ln=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Bo();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return an(e),console.log(""),console.log(on()),void console.log("");let o=await Fo();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},an(e),console.log(nn()),void console.log("");let n=Uo(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await rn();e["tailscale-cert"]=r?{status:"ok",detail:Qo}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),an(e)}(),g.exit(0)}}),cn=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:sn},async run({args:e}){await async function(e){if(console.log(""),console.log(Xo),console.log(` ${zo("Claude Cowork Setup")} ${Jo("— Install")}`),console.log(Xo),console.log(""),!await Bo())return console.log(` ${Vo("Tailscale is not installed.")}`),console.log(""),console.log(on()),console.log(""),console.log(` ${Jo("After installing, run")} ${Ko("tailscale up")} ${Jo("to connect, then re-run this command.")}`),void console.log("");let t=await Fo();if(!t||!t.Online)return console.log(nn()),void console.log("");let n=Uo(t.DNSName);if(console.log(` ${Jo("Tailscale hostname:")} ${zo(n)}`),console.log(""),console.log(` ${zo("Generating TLS certificate via Tailscale…")}`),console.log(` ${Jo("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Ko(`$ tailscale cert --cert-file ${Qo} --key-file ${en} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(Zo,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Go("tailscale",["cert","--cert-file",Qo,"--key-file",en,n]),console.log(` ${Wo("✓ 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(Xo),console.log(` ${zo("Next steps")}`),console.log(Xo),console.log(""),console.log(` ${zo("1.")} Start the proxy:`),console.log(` ${Ko("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${zo("2.")} In Cowork ${Jo("→")} Settings ${Jo("→")} Inference Provider, set:`),console.log(` ${zo("inferenceGatewayBaseUrl")} = ${Ko(`https://${n}:<port>`)}`),console.log(` ${Jo("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${zo("3.")} Restart Cowork ${Jo("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${Jo("For Cowork's own configuration docs, see:")}`),console.log(` ${Ko("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),un=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:sn},async run({args:e}){await async function(e){if(console.log(""),console.log(Xo),console.log(` ${zo("Claude Cowork Setup")} ${Jo("— Revert")}`),console.log(Xo),console.log(""),!await rn())return console.log(` ${Jo("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${zo("Remove Tailscale cert files:")}`),console.log(` ${Jo(Qo)}`),console.log(` ${Jo(en)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(Zo,{recursive:!0}),console.log(` ${Wo("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${Jo("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),pn=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:ln,install:cn,revert:un}});function dn(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 mn(e){if("string"==typeof e)return dn(e);if(Array.isArray(e))return e.map(e=>mn(e));if(e&&"object"==typeof e){let t={},o="thinking"===e.type;for(let[n,r]of Object.entries(e))t[n]=!o||"thinking"!==n&&"signature"!==n?mn(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}const fn="x-copilot-api-self-test",hn=R();const gn=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function _n(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)}function yn(e){try{!function(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),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();Xe.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:c.ERROR,message:`HTTP ${a}`})}(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(ye.add(1,d),De.record(s,d),c>=400&&we.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&&(ke.add(e.inputTokens,t),Le.record(e.inputTokens,t)),e.outputTokens&&(be.add(e.outputTokens,t),Ge.record(e.outputTokens,t)),e.cachedTokens&&ve.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ce.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const wn=1048576;const kn=async()=>he.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),Je.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Pe.add(1,{result:"rejected"}),new Mt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Pe.add(1,{result:"approved"})}finally{e.end()}});function bn(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 vn(e,t){void 0!==t.prompt_tokens&&e.setAttribute("copilot_api.input_tokens",t.prompt_tokens),void 0!==t.completion_tokens&&e.setAttribute("copilot_api.output_tokens",t.completion_tokens),void 0!==t.total_tokens&&e.setAttribute("copilot_api.total_tokens",t.total_tokens)}const Tn=[{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",xn={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"};function An(e,t){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)\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of Tn)if(t.pattern.test(e))return t.family;return null}(n);if(!a)return null;let i=n.replace(/-\d{8}(?::.*)?$/,""),s=r?`-${r}`:"";for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,""),o=`${i}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2")===o)return e}return function(e,t,o=null){let n=xn[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)}const Sn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function En(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=Sn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=Sn.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var Cn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function On(e){if(!e||"string"!=typeof e)throw new Cn("Model name is required and must be a string");if(!X.models?.data)throw new Cn("Models not available. Please try again later.",503);let t=X.models.data.map(e=>e.id);if(t.includes(e))return e;let o=An(e,t);if(!o)throw $e.add(1,{requested_model:e}),new Cn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}async function In(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return he.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"),Te.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Mt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Te.add(1,{action:"waited",source:"local"}),He.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await oo(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function Pn(e){if(e instanceof Mt){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 Rn(e,t){let{type:n,message:r}=Pn(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 Nn(e,t){let{type:n,message:r}=Pn(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 qn(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 Dn(e,t,o){return Math.min(Math.max(e,t),o)}function Mn(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 Mn(JSON.parse(r),t+1)}catch{return null}}function jn(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=qn(o.capabilities.supports.min_thinking_budget),r=qn(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:qn(o.capabilities.limits?.max_output_tokens)??void 0}}function Hn(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Dn(qn(e.requestedBudget)??o,o,n),a=qn(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 Bn(e,t){if(no(e.thinking_budget))return e;let o=jn(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Hn({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 Fn(e){return"invalid_thinking_budget"===Mn(e)}async function Un(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(no(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(!Fn(i))return null;let l=jn(n,t.model);return l?function(e,t){let o=Hn({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=qn(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 Ln(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 Gn(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const zn=new Map,Jn=new Map,Kn=new Set;let Wn,Vn,Yn;function Xn(e){return!e.closed&&!e.destroyed}function Zn(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new C(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return zn.set(t,Date.now()),Ne.add(1,{event:"created",origin:e}),Ke(_.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=Kn.has(t);Ne.add(1,{event:"goaway",origin:e}),Ke(i?_.WARN:_.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}),Jn.delete(t),Kn.delete(t),zn.delete(t),Xn(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Qn(e){if(!X.connectivity.h2)return;Wn&&Wn!==e&&function(){for(let e of[...Jn.keys(),...Kn])Xn(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Jn.clear(),Kn.clear(),zn.clear()}(),Wn=e;let t=Date.now();for(let[n]of Jn)if(t-(zn.get(n)??0)>=6e5)Jn.delete(n),zn.delete(n),Xn(n)&&n.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ne.add(1,{event:"rotated",origin:e}),Ke(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Xn(n))return Jn.delete(n),Kn.add(n),n;Jn.delete(n),zn.delete(n)}let n=Zn(e);return Kn.add(n),n}function er(e){e&&Kn.delete(e)&&(Xn(e)?Jn.set(e,Date.now()):zn.delete(e))}function tr(){Yn||(Yn=setInterval(()=>{!function(){let e=Date.now(),t=X.connectivity.h2Keepalive,n=Jn.size;for(let[r,a]of Jn)e-a<6e4||t&&n<=1||(Jn.delete(r),zn.delete(r),n--,Xn(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ne.add(1,{event:"idle_reaped",origin:Wn??""}),Ke(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${Wn}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Wn??""}))}()},3e4),Yn.unref())}function or(){Vn||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Vn=setInterval(()=>{(async function(){if(0===Jn.size&&0===Kn.size){if(Wn){let e=Zn(Wn);Jn.set(e,Date.now())}return}let e=[...Jn.keys()];for(let t of e)Jn.delete(t);await Promise.allSettled(e.map(async e=>{if(Xn(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:ct(X)});await n.dump(),Re.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Jn.set(e,Date.now())}catch(t){Re.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ne.add(1,{event:"error",origin:Wn??""}),zn.delete(e),Xn(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else zn.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Vn.unref(),tr())}function nr(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)}async function rr(){return new Promise(e=>setTimeout(e,100))}async function ar(e,t,o){try{if(!e.ok)throw new Mt("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&&vn(t,n.usage),n}catch(e){throw We(t,e),e}finally{t.end()}}const ir=async e=>{let t=mn(e);try{return await sr(t)}catch(e){if(e instanceof Mt&&401===e.response.status)return await eo(),sr(t);let n;if(e instanceof Mt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Un({payload:t,error:e,models:X.models,errorBodyText:n});if(r)return e instanceof Mt&&void 0!==n&&o.warn(`Upstream rejected thinking_budget (status ${e.response.status}): ${n.slice(0,500)}`),o.warn("Adjusting thinking_budget payload and retrying once..."),await sr(mn(r));throw e}},sr=async e=>{if(!X._t1)throw Error("Service token not found");let t=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={...ct(X,t),"X-Initiator":n?"agent":"user"},a=lt(X),i=`${a}/chat/completions`,s=X.timeoutMs,l=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t))return{...e};let{max_tokens:o,stop:n,...r}=e;return null==o?{...r}:{...r,max_completion_tokens:o}}(e,X.models),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":e.max_tokens??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":n?"agent":"user"};for(let t=0;t<=1;t++){let n=Qn(a),l=new AbortController,p=Ht(l,s);try{let{statusCode:o,headers:a,body:p,span:d}=await et({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":t},dispatcher:n}),m=new Response(p,{status:o,headers:a});if(e.stream){if(!m.ok)throw d.end(),new Mt("Failed to create chat completions",m,{outgoingBody:c,outgoingHeaders:r});return{events:j(m),span:d,release:()=>er(n)}}try{return await ar(m,d,{outgoingBody:c,outgoingHeaders:r})}finally{er(n)}}catch(e){if(er(n),nr(e)&&t<1){o.warn(`HTTP/2 connection error during chat completions, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await rr();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function lr(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 cr(e){let t=!0===e.get("isSelfTest");t||await In(X);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return he.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=On(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),xe.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 Cn)return d.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(e.set("requestData",{model:n.model,streaming:!!n.stream}),X.manualApprove&&!t&&await kn(),no(n.max_tokens)){let e=X.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(n.max_tokens))}n=Bn(n,X.models),no(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=performance.now(),a=await ir(n),i=performance.now()-r;if(Me.record(i,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),ur(a)){let t=e.get("requestData")||{};return a.usage&&(t.tokenUsage=bn(a.usage)),t._d1=i,t.upstreamTtfbMs=i,t.upstreamTotalMs=i,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(a)),e.json(a)}let{events:s,span:l,release:c}=a;return M(e,async t=>{let o={value:null},a=0,u=performance.now(),p=Ln(e,r);try{try{for await(let r of s){p();let s=r;r.data&&"[DONE]"!==r.data&&(a++,Ie.add(1,{model:n.model,endpoint_type:"openai"}),s=lr(r,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=bn(t),n._d1=i,e.set("requestData",n)})),await t.writeSSE(s)}let l=performance.now()-u,c={model:n.model,endpoint_type:"openai"};if(je.record(l,c),ze.record(a,c),Gn(e,r),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=bn(o.value),t._d1=i,e.set("requestData",t))}}catch(o){throw Ve(l,e.get("requestSpan"),o),await Nn(t,o),o}finally{o.value&&vn(l,o.value),l.end(),c()}let d=e.get("requestId");d&&ce.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const ur=e=>Object.hasOwn(e,"choices"),pr=new q;pr.post("/",async e=>{try{return await cr(e)}catch(t){return await Yt(e,t)}});const dr=new q;dr.post("/",async e=>{try{let t=await e.req.json();try{t.model=On(t.model)}catch(t){if(t instanceof Cn)return d.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=performance.now(),n=await(async e=>{if(!X._t1)throw Error("Service token not found");let t=`${lt(X)}/embeddings`,o=ct(X),n=X.timeoutMs,r=new AbortController,a=Ht(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await Qe({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}});try{if(!n.ok)throw new Mt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw We(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),r=performance.now()-o;Me.record(r,{model:t.model,target:"embeddings",streaming:"false"});let a=e.get("requestData")||{};return a.tokenUsage=bn(n.usage),a._d1=r,e.set("requestData",a),e.json(n)}catch(t){return await Yt(e,t)}});const mr=new q;let fr=null,hr=null;function gr(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function _r(e){return!gr(e)}mr.get("/",async e=>{let t,o=function(){let e=X._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=fr;return t&&e-t.timestamp<3e4?{result:t.result}:hr||(hr=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${lt(X)}/models`,n=await fetch(t,{method:"GET",headers:ct(X),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return fr={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return fr={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),hr=null}})(),hr)}();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.42.1",timestamp:(new Date).toISOString()};void 0!==n.latencyMs&&(r.upstream_latency_ms=n.latencyMs);let a="ok"===t?200:503;return e.json(r,a)});const yr=new H(F),wr={...B["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function kr(e){return yr.encode(e).length}function br(e){let t=0;for(let o of e)switch(o.type){case"text":t+=kr(o.text)*wr.contentMultiplier;break;case"tool_use":t+=kr(o.name+JSON.stringify(o.input))*wr.contentMultiplier;break;case"tool_result":o.content&&(t+=kr("string"==typeof o.content?o.content:JSON.stringify(o.content))*wr.contentMultiplier);break;case"thinking":t+=kr(o.thinking)*wr.contentMultiplier;break;case"image":t+=1600}return t}function vr(e){let t=0,o=e.properties;if(!o)return t;let n=Object.entries(o);for(let[e,[o,r]]of n.entries()){if(t+=0===e?wr.perFirstProp:wr.perAdditionalProp,t+=kr(o),r.description&&(t+=wr.perPropDesc+kr(r.description)),r.enum&&Array.isArray(r.enum)){t+=wr.perEnum;for(let e of r.enum)t+=kr(String(e))}if("object"===r.type&&r.properties&&(t+=wr.perNestedObject,t+=vr(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=wr.perArrayOfObjects,t+=vr(e))}}return t}function Tr(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")};return e.thinking&&(o["copilot_api.thinking.type"]=e.thinking.type,"budget_tokens"in e.thinking&&e.thinking.budget_tokens&&(o["copilot_api.thinking.budget_tokens"]=e.thinking.budget_tokens)),e.output_config?.effort&&(o["copilot_api.output_config.effort"]=e.output_config.effort),o}function $r(e,t,o){let n=Tr(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const xr=async(e,t,n)=>{try{return await Ar(e,t)}catch(r){if(r instanceof Mt&&401===r.response.status)return await eo(),Ar(e,t);if(r instanceof Mt&&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}`),Ar(i,t)}throw r}};const Ar=async(e,t)=>{if(!X._t1)throw Error("Service token not found");let{metadata:n,...r}=mn(e),a=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(r),i={...pt(X,t,a),"X-Initiator":"agent"},s=lt(X),l=`${s}/v1/messages`,c=X.timeoutMs,u=JSON.stringify(r),p=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",...Tr(e,t?.anthropicBeta)}}(r,t,c);for(let e=0;e<=1;e++){let t=Qn(s),a=new AbortController,d=Ht(a,c);try{let{statusCode:o,headers:n,body:s,span:d}=await et({spanName:"copilot POST /v1/messages",url:l,target:"anthropic_messages",headers:i,body:u,signal:a.signal,headersTimeout:c,bodyTimeout:3*c,extraAttributes:{...p,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(s,{status:o,headers:n});if(!m.ok)throw d.end(),new Mt("Failed to create anthropic messages",m,{outgoingBody:u,outgoingHeaders:i});if(r.stream)return{events:j(m),span:d,release:()=>er(t)};try{let e=await m.json();"string"==typeof e.id&&d.setAttribute("copilot_api.response.id",e.id);let t=e.usage;return t&&vn(d,{prompt_tokens:t.input_tokens??0,completion_tokens:t.output_tokens??0,total_tokens:(t.input_tokens??0)+(t.output_tokens??0)}),e}finally{d.end(),er(t)}}catch(n){if(er(t),nr(n)&&e<1){o.warn(`HTTP/2 connection error during anthropic messages, retrying (attempt ${e+1}): ${n instanceof Error?n.message:String(n)}`),await rr();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Sr(e,t,o){try{if(!e.ok)throw new Mt("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&&vn(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw We(t,e),e}finally{t.end()}}const Er=async e=>{try{return await Cr(e)}catch(t){if(t instanceof Mt&&401===t.response.status)return await eo(),Cr(e);throw t}},Cr=async e=>{if(!X._t1)throw Error("Service token not found");let t=mn(e),n={...ct(X),"X-Initiator":"agent"},r=lt(X),a=`${r}/responses`,i=X.timeoutMs,s=JSON.stringify(t),l={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":i,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let c=Qn(r),u=new AbortController,p=Ht(u,i);try{let{statusCode:o,headers:r,body:p,span:d}=await et({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}),m=new Response(p,{status:o,headers:r});if(t.stream){if(!m.ok)throw d.end(),new Mt("Failed to create responses",m,{outgoingBody:s,outgoingHeaders:n});return{events:j(m),span:d,release:()=>er(c)}}try{return await Sr(m,d,{outgoingBody:s,outgoingHeaders:n})}finally{er(c)}}catch(t){if(er(c),nr(t)&&e<1){o.warn(`HTTP/2 connection error during responses, retrying (attempt ${e+1}): ${t instanceof Error?t.message:String(t)}`),await rr();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Or=new Set(["low","medium","high","max","xhigh"]);function Ir(e,t,n){let r=t.includes(e.model)?e.model:An(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=An(e,t);if(!n)return null;let r=new Set(t);if(o.context1m){let e=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,r);if(e)return e}if(o.effort){let e=function(e,t,o){let n=null;if("high"===o?n="high":("max"===o||"xhigh"===o)&&(n="xhigh"),!n)return null;let r=`${e}-${n}`;return t.has(r)?r:null}(n,r,o.effort);if(e)return e}return null}(a.model,t,{context1m:n.context1m,effort:a.output_config?.effort}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=d.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 function(e){let t=e.output_config?.effort;if(!t)return e;let n=X.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=En(t,n);if(!r||!Or.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=d.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}}}(s)}function Pr(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Rr(e,t){let o={model:e.model,messages:Nr(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:Hr(e.tools),tool_choice:Br(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=jn(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:"high"===e?16e3:"medium"===e?8e3:1024}(e,o.max),r=qn(t),a=r&&r>1?r-1:o.min;return Dn(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Bn({...o,thinking_budget:a},t)}}return o}function Nr(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:qr(e)}]:[{role:"system",content:qr(e.map(e=>e.text).join("\n\n"))}]:[]}(t),n=e.flatMap(e=>"user"===e.role?function(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:jr(e.content)});n.length>0&&t.push({role:"user",content:jr(n)})}else t.push({role:"user",content:jr(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:Mr(e.reasoning_text),reasoning_opaque:Mr(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:jr(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:jr(e.content),...t}]}(e));return[...o,...n]}function qr(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const Dr=32768;function Mr(e){if("string"==typeof e)return e.length<=Dr?e:e.slice(0,Dr)}function jr(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 Hr(e){if(e)return e.filter(_r).map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Br(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 Fr(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 Ur(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Lr(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 Gr=new Set(["low","medium","high","max","xhigh"]);function zr(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&&Gr.has(e)?e:null)(En(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 Jr(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 Kr=/[^\w-]/g;function Wr(e){return e.replaceAll(Kr,"_")}function Vr(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=zr(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:Jr(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:Wr(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Wr(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Yr(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t)return"thinking must be an object";let o=t,n=new Set(["enabled","adaptive","disabled"]);return"string"==typeof o.type&&n.has(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 one of: enabled, adaptive, disabled"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t)return"output_config must be an object";let o=t;if(void 0===o.effort)return null;let n=new Set(["low","medium","high","max","xhigh"]);return"string"==typeof o.effort&&n.has(o.effort)?null:"output_config.effort must be one of: low, medium, high, max, xhigh"}(e)}function Xr(e,t){return he.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),$r(n,t,e.req.header("anthropic-beta"));let r=On(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Yr(t);return a?(d.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),xe.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 Cn)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:t.message}},t.statusCode)};throw t}finally{n.end()}})}function Zr(e){let t=function(e){let t=[];for(let o of e)"user"===o.role?t.push(...ea(o)):t.push(...oa(o));return t}(e.messages);if(0===t.length)throw new Mt("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 o={model:e.model,input:t,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)},n=function(e){return e?function(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}("string"==typeof e?e:e.map(e=>e.text).join("\n\n")):null}(e.system);return n&&(o.instructions=n),e.tools?.length&&(o.tools=e.tools.filter(_r).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(o.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)),"adaptive"===e.thinking?.type?o.reasoning={effort:Qr(e.output_config?.effort??"high")}:"enabled"===e.thinking?.type&&e.thinking.budget_tokens&&(o.reasoning=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens)),o}function Qr(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function ea(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(ta(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)"text"===t.type?e.push({type:"input_text",text:t.text}):e.push({type:"input_image",image_url:`data:${t.source.media_type};base64,${t.source.data}`});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 ta(e){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 oa(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 na(e,t){if(t)return"tool_use";switch(e){case"completed":case"cancelled":case"failed":return"end_turn";case"incomplete":return"max_tokens";default:return null}}function ra(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function aa(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 ia(e,t){let o=[];switch(e.type){case"response.created":aa(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){aa(t,o),ra(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":aa(t,o),ra(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":ra(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":{ra(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:na(e.response.status,n),stop_sequence:null},usage:{input_tokens:r?.input_tokens??0,output_tokens:r?.output_tokens??0}},{type:"message_stop"});break}case"response.incomplete":{aa(t,o),ra(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:{input_tokens:n?.input_tokens??0,output_tokens:n?.output_tokens??0}},{type:"message_stop"});break}case"response.failed":aa(t,o),ra(t,o),o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":aa(t,o),ra(t,o),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":aa(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}})}return o}function sa(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 la(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function ca(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&&(sa(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&&(sa(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),la(t,o)),r.content&&(la(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){la(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&&(la(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Pr(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 ua=/structured_outputs|output_config\.format/i;function pa(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&ua.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Vr({...e,model:$n},o):null}var da=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var ma=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const fa={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 Qe({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 We(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new ma: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 Qe({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 We(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new da:e}finally{clearTimeout(i)}}},ha=["tavily","exa"];function ga(e){return"tavily"===e||"exa"===e}function _a(){return X.webSearchProviders.length>0}async function ya(e,t){return async function(e,t,n){let{providers:r,searchFns:a=fa}=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:X.webSearchProviders})}function wa(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function ka(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function ba(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&&gr(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(!_a())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await ya(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_${wa()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{type:"web_search_tool_result",tool_use_id:n,content:ka(e)}];return{id:`msg_ws_${wa()}`,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_${wa()}`,r=`msg_ws_${wa()}`,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:{type:"web_search_tool_result",tool_use_id:n,content:ka(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}),M(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const va=(e,t)=>!(!e||!t||e===t);async function Ta(e){if(X._t1||await wo())return null;let t=fo();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; re-authenticate with \`copilot-api auth\`, then restart the proxy`}},401)):(d.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))}async function $a(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&gr(t[0])}(t))return ba(e,t);await In(X),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort;t=function(e,t){return Ir(t,X.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let a=Xr(e,t);if(!a.ok)return a.response;t=a.payload;let i=await Ta(e);if(i)return i;if(function(e){let t=X.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e)}(t.model))return Oa(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t,o){let n=Vr(t,X.models),r={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},a=n.output_config?.effort;return e.set("requestData",{model:n.model,reasoningEffort:a,effortClamped:va(o,a),streaming:!!n.stream}),X.manualApprove&&await kn(),he.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",n.model),t.setAttribute("copilot_api.streaming",!!n.stream),$r(t,n,r.anthropicBeta);try{let o=performance.now(),a=await xr(n,r,{onStructuredOutputFallback:(e,o)=>{let n=pa(e,o,X.models);return n&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",n.model)),n}}),i=performance.now()-o;if(Me.record(i,{model:n.model,target:"anthropic_messages",streaming:String(!!n.stream)}),!n.stream){let o=a,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=bn(Ea(t)),o._d1=i,o.upstreamTtfbMs=i,o.upstreamTotalMs=i,e.set("requestData",o)}return t.end(),e.json(o)}let{events:s,span:l,release:c}=a;return M(e,async r=>{let a=0,i=performance.now(),u={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=Ln(e,o);try{try{for await(let e of s)d(),e.data&&"[DONE]"!==e.data?(a++,Ie.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),Ca(e.data,u)&&(p=!0),await r.writeSSE(e)):await r.writeSSE(e);let e=performance.now()-i,t={model:n.model,endpoint_type:"anthropic_messages"};je.record(e,t),ze.record(a,t)}catch(t){throw Ve(l,e.get("requestSpan"),t),await Rn(r,t),t}finally{if(Gn(e,o),p){let t=Ea(u);vn(l,t);let o=e.get("requestData")||{};o.tokenUsage=bn(t),e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&ce.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw We(t,e),t.end(),e}})}(e,t,r);let s=performance.now(),l=he.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=>"image"===e.type)),r=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));return o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),Rr(t,X.models)}finally{o.end()}});Be.record(performance.now()-s,{direction:"anthropic_to_openai"}),l=Bn(l,X.models),o.debug("Translated OpenAI request payload:",l);let c=t.output_config?.effort;e.set("requestData",{model:l.model,reasoningEffort:c,effortClamped:va(r,c),streaming:!!l.stream});let u=performance.now();X.manualApprove&&await kn();let p=await ir(l),d=performance.now()-u;if(Me.record(d,{model:l.model,target:"chat_completions",streaming:String(!!l.stream)}),Aa(p)){let t=e.get("requestData")||{};p.usage&&(t.tokenUsage=bn(p.usage)),t._d1=d,t.upstreamTtfbMs=d,t.upstreamTotalMs=d,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(p).slice(-400));let r=performance.now(),a=he.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=Ur(a.message),i=Fr(a.message.content),s=Lr(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:Pr(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(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 Be.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}o.debug("Streaming response from service");let{events:m,span:f,release:h}=p;return M(e,async t=>{let n=null,r=0,a=performance.now(),i=Ln(e,u),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of m){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let c;try{c=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,Ie.add(1,{model:l.model,endpoint_type:"anthropic"}),c.usage){n=c.usage;let t=e.get("requestData")||{};t.tokenUsage=bn(n),t._d1=d,e.set("requestData",t)}let u=ca(c,s);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let c=performance.now()-a,p={model:l.model,endpoint_type:"anthropic"};if(je.record(c,p),ze.record(r,p),Gn(e,u),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=bn(n),t._d1=d,e.set("requestData",t))}}catch(o){throw Ve(f,e.get("requestSpan"),o),await Rn(t,o),o}finally{n&&vn(f,n),f.end(),h()}let c=e.get("requestId");c&&ce.executeCompletion(c)}finally{e.get("resolveStreamComplete")?.()}})}function xa(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}:null}const Aa=e=>Object.hasOwn(e,"choices"),Sa=e=>Object.hasOwn(e,"output");function Ea(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 Ca(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}async function Oa(e,t){let r=performance.now(),a=he.startActiveSpan("copilot_api.translate.anthropic_to_responses",e=>{try{return e.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),e.setAttribute("copilot_api.translation.message_count",t.messages.length),Zr(t)}finally{e.end()}});Be.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),X.manualApprove&&await kn();let i=performance.now(),s=await Er(a),l=performance.now()-i;if(Me.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Sa(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=bn({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens})),t._d1=l,t.upstreamTtfbMs=l,t.upstreamTotalMs=l,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(s).slice(-400)),"failed"===s.status)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:s.error?.code??"api_error",message:s.error?.message??"Response generation failed"}},500);let r=performance.now(),a=he.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)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:na(e.status,o),stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}(s)}finally{e.end()}});return Be.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return M(e,async t=>{let n=null,r=0,s=performance.now(),d=Ln(e,i),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let i of c){if(d(),o.debug("Responses API raw stream event:",i),!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}r++,Ie.add(1,{model:a.model,endpoint_type:"responses"});let c=xa(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=bn(n),t._d1=l,e.set("requestData",t)}let u=ia(s,m);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let u=performance.now()-s,p={model:a.model,endpoint_type:"responses"};je.record(u,p),ze.record(r,p),Gn(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await Rn(t,o),o}finally{n&&vn(u,n),u.end(),p()}let f=e.get("requestId");f&&ce.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const Ia=new q;Ia.post("/",async e=>{try{return await $a(e)}catch(t){return await Yt(e,t)}});const Pa=new q;function Ra(e){return he.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=On(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),xe.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 Na(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}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=bn(o),n._d1=t._d1,t.c.set("requestData",n)}Pa.get("/",async e=>{try{X.models||await ro();let t=X.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 Yt(e,t)}});const qa=new Set(["message","function_call","function_call_output"]),Da=new Set(["type","name","description","parameters"]);async function Ma(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||!_a())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await ya(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function ja(e){if(_a())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Ma(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Ha(e){if(!_a())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 Ma(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Ba(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 Fa(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&&Ba(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)Ba(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Ua(e){return null!=e}function La(e){let t=e.input,o="string"==typeof t?t:t.map(e=>function(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 qa.has(e.type)||"web_search_call"===e.type?e:null}}(e)).filter(e=>null!==e),n={model:e.model,input:o};for(let t of["instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])Ua(e[t])&&(n[t]=e[t]);let r=new Set;if(Ua(e.tools)){let t=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))Da.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);n.tools=t.tools,r=t.customToolNames}if(Ua(e.reasoning)&&"object"==typeof e.reasoning){let t=e.reasoning;n.reasoning={},Ua(t.effort)&&(n.reasoning.effort=t.effort),Ua(t.summary)&&(n.reasoning.summary=t.summary)}if(Ua(e.text)&&"object"==typeof e.text){let t=e.text;Ua(t.format)&&(n.text={format:t.format})}return{payload:n,customToolNames:r}}async function Ga(e){if(X._t1)return null;if(!await wo()){let t=fo();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; re-authenticate with \`copilot-api auth\`, then restart the proxy`,type:"authentication_error"}},401)):(d.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))}return null}async function za(e){await In(X);let{payload:t,customToolNames:n}=La(await e.req.json()),r=t;o.debug(`Responses API [${Array.isArray(r.input)?r.input.length:1} items]`),n.size>0&&o.debug(`Custom tools detected: ${[...n].join(", ")}`);let a=function(e,t){try{return{ok:!0,payload:Ra(t)}}catch(t){if(t instanceof Cn)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,r);if(!a.ok)return a.response;r=a.payload;let i=await Ga(e);if(i)return i;e.set("requestData",{model:r.model,reasoningEffort:r.reasoning?.effort,streaming:!!r.stream}),X.manualApprove&&await kn();let s=performance.now(),l=await Er(r),c=performance.now()-s;if(Me.record(c,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Ja(l))return async function(e,t,o){await ja(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=bn({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,l,c);let{events:u,span:p,release:d}=l;return M(e,async t=>{let o={value:null},a=0,i=performance.now(),l=Ln(e,s);try{try{for await(let i of u)if(l(),i.data&&"[DONE]"!==i.data){a++;let s=Fa(i.data,n);s=await Ha(s);let l=s===i.data?i:{...i,data:s};Ie.add(1,{model:r.model,endpoint_type:"responses"}),Na(s,{usageRef:o,c:e,_d1:c}),await t.writeSSE(l)}else await t.writeSSE(i);let p=performance.now()-i,d={model:r.model,endpoint_type:"responses"};je.record(p,d),ze.record(a,d),Gn(e,s)}catch(o){throw Ve(p,e.get("requestSpan"),o),await Nn(t,o),o}finally{o.value&&vn(p,o.value),p.end(),d()}let m=e.get("requestId");m&&ce.executeCompletion(m)}finally{e.get("resolveStreamComplete")?.()}})}const Ja=e=>Object.hasOwn(e,"output"),Ka=new q;Ka.post("/",async e=>{try{return await za(e)}catch(t){return await Yt(e,t)}});const Wa=new q;Wa.get("/",e=>{try{return X.showToken?e.json({token:X._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 Va=new q;Va.get("/",async e=>{try{let t=await No();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Ya=new q;function Xa(){return function(e){let t=e.filter(e=>_n(e));if(0===t.length)return;let o=t.find(e=>gn.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(X.models?.data??[])}function Za(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 dn(o).slice(0,200)}catch{}let t=dn(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 Qa(e={}){let t=performance.now(),o=e.model&&function(e){let t=X.models?.data.find(t=>t.id===e);return void 0!==t&&_n(t)}(e.model)?e.model:Xa();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 Ya.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[fn]:hn},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:Za(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)}}Ya.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=_t(i),p=function(e){return e===hn}(e.req.header(fn));e.set("requestId",r),e.set("isSelfTest",p),e.header("x-request-id",r);let m=he.startSpan("copilot_api.handle_request",{kind:l.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",m),e.set("requestTraceContext",m.spanContext()),p&&m.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Xe.has(e)||"x-copilot-api-self-test"!==e&&m.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=await e.req.raw.clone().text();e.set("rawBody",t.length>wn?t.slice(0,wn):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let f,h=new Promise(e=>{f=e});e.set("streamComplete",h),e.set("resolveStreamComplete",f);let g=d.setSpan(u.active(),m);await u.with(g,async()=>{p||ce.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw m.setStatus({code:c.ERROR,message:t.message}),m.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:m};_?.streaming&&e.res.status<400?h.then(()=>yn(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{m.recordException(t),m.setStatus({code:c.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{m.end()}catch{}}):yn(y)}),Ya.use(D()),Ya.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()}),Ya.get("/",e=>e.text("Server running")),Ya.route("/health",mr),Ya.route("/chat/completions",pr),Ya.route("/models",Pa),Ya.route("/embeddings",dr),Ya.route("/usage",Va),Ya.route("/token",Wa),Ya.route("/v1/chat/completions",pr),Ya.route("/v1/models",Pa),Ya.route("/v1/embeddings",dr),Ya.route("/v1/messages",Ia),Ya.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 o=wr.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=wr.perMessage+kr(e)*wr.contentMultiplier}for(let e of t.messages)o+=wr.perMessage,o+=kr(e.role),"string"==typeof e.content?o+=kr(e.content)*wr.contentMultiplier:Array.isArray(e.content)&&(o+=br(e.content));let n=t.tools?.filter(_r);return n&&n.length>0&&(o+=function(e){let t=wr.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=wr.perTool),t+=kr(n.name),n.description&&(t+=wr.perDesc+kr(n.description)),t+=vr(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),Ya.route("/v1/responses",Ka),Ya.route("/responses",Ka),Ya.onError((e,t)=>Yt(t,e));const ei=e=>`${e}`,ti=e=>`${e}`,oi=e=>`${e}`,ni=e=>`${e}`,ri=e=>`${e}`,ai=ti(" ─────────────────────────────────────────────────────────────");function ii(e,t,o){console.log(` ${function(e){return"ok"===e?oi("✓"):"warn"===e?ri("⚠"):ni("✗")}(e)} ${ei(t.padEnd(14))} ${o}`)}function si(e){console.log(` ${ti("↳")} ${ti(e)}`)}function li(e){return e instanceof Mt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function ci(){let e=g.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(K.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 ui(){try{await ro();let e=(X.models?.data.length??0)>0;return ii(e?"ok":"warn","Model catalog",e?function(){let e=X.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 ii("fail","Model catalog",li(e)),si("Could not fetch /models — check connectivity/auth."),!1}}async function pi(e){X.accountType=e.accountType;let t=await St(),o=Et();if(console.log(""),console.log(` ${ei("COPILOT-API DOCTOR")} ${ti(`v${t}`)}`),console.log(ai),ii("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await W(),ao(),!await async function(){let e=await ci();if(!e)return ii("fail","Auth token","not found"),void si("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");X._t2=e.token,ii("ok","Auth token",`found (${e.source})`);try{let e=await Zt();return await st(X,e.login),ii("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return ii("fail","GitHub auth",li(e)),void si("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(ai),console.log(` ${ni("✗")} ${ei("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await Xt();return X._t1=e,ii("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Mt?e.response.status:0;return ii("fail","Service token",li(e)),si(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 ui();await async function(){try{let e=await No(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Eo(Co(t))} of ${Eo(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;ii("ok","Copilot plan",`${e.copilot_plan} · ${o} `+ti(`(resets ${e.quota_reset_date})`))}catch(e){ii("warn","Copilot plan",`unavailable (${li(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Qa();return e.ok?(ii("ok","Generation",`works via ${e.model} ${ti(`(${e.durationMs}ms)`)}`),!0):(ii("fail","Generation",`${e.reason}${e.status?ti(` [HTTP ${e.status}]`):""}`),!1)}():ii("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=g.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){ii(t,"Client config","potential base-URL issue");for(let t of e)si(t)}else ii("ok","Client config","no base-URL issues detected");si("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(ai),a?(console.log(` ${oi("✓")} ${ei("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${ri("⚠")} ${ei("Some checks need attention")} — see the ${ni("✗")}/${ri("⚠")} lines above.`),console.log(""),2)}const di=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 pi({accountType:e["account-type"]});g.exit(t)}});function mi(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 fi=!1;const hi="copilot-api-node20",gi=`https://registry.npmjs.org/${hi}/latest`,_i=e=>`${e}`,yi=e=>`${e}`;async function wi(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(gi,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function ki(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}function bi(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=g;if("win32"===e){try{if(h(`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}const vi=e=>`${e}`,Ti=e=>`${e}`,$i=e=>`${e}`,xi=e=>`${e}`,Ai=e=>`${e}`,Si=e=>`${e}`,Ei=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Ci="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Oi="https://github.com/johnib/copilot-api-issues/issues",Ii=Ti(" ─────────────────────────────────────────────────────────────");function Pi(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Ri(e){return e&&0!==e.length?e.join("·"):"—"}const Ni=[{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"},{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"},{title:"Claude Code's Compaction Engine: What the Source Code Actually Reveals",teaser:"What's actually running beneath every long session.",url:"https://barazany.dev/blog/claude-codes-compaction-engine"}];function qi(e){if(0===e.length)return[];let t=["",Ii,` ${vi("BARAZANY.DEV")} ${Ti("— Recent Posts")}`,Ii,""];for(let[o,n]of e.entries()){let e=`${n.url}${Ci}`,r=Ei(e,vi(Si(`[${o+1}]`)));t.push(` ${r} ${$i(n.title)}`,` ${Ti("→")} ${Ti(n.teaser)}`,"")}return t.push(Ii,` ${Ei(`https://barazany.dev/blog${Ci}`,"barazany.dev/blog")}`,Ii),t}function Di(e){let t=[];X.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):X.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(Ti(" → "))} ${xi("✓")}`:Ti("off"),n=["",` ${vi("COPILOT-API")} ${Ti(`v${e.version}`)}`,Ii,` ${Ti("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Ti("User")} ${e.user} ${Ti("·")} ${e.accountType}`];return X._v1&&n.push(` ${Ti("Client")} VSCode ${X._v1}`),n.push(` ${Ti("Network")} ${t.join(Ti(" · "))}`,` ${Ti("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Ti("Clipboard")} Claude Code command ${xi("✓")}`),n.push(Ii),n}function Mi(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${vi("Active")}`];if(e.model){let o=X.models?.data.find(t=>t.id===e.model),n=Pi(o?.capabilities.limits?.max_context_window_tokens),r=Ri(o?.capabilities.supports.reasoning_effort);t.push(` ${$i(e.model.padEnd(32))} ${Ti("ctx")} ${vi(n.padStart(5))} ${Ti("effort")} ${Ti(r)} ${Ai("← main")}`)}if(e.smallModel){let o=X.models?.data.find(t=>t.id===e.smallModel),n=Pi(o?.capabilities.limits?.max_context_window_tokens),r=Ri(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Ti("ctx")} ${n.padStart(5)} ${Ti("effort")} ${Ti(r)} ${Ai("← small")}`)}return t}function ji(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of X.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("",` ${vi(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?$i("●"):Ti("·"),i=n?$i(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Pi(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Ri(r.effort)}`;t.push(` ${a} ${i} ${Ti(s)}${Ti(l)}`)}}return t}function Hi(){let e=Oi.replace(/^https:\/\//,""),t=Ei(`${Oi}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Ii,` ${vi("FOUND A BUG?")} ${Ti("— Report it on GitHub")}`,Ii,"",` ${$i("→")} ${$i(t)}`,` ${Ti("Bug reports, feature requests, and questions welcome.")}`,"",Ii]}function Bi(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=["",Ii,` ${vi("Claude Cowork")} ${Ti("— Settings → Inference Provider")}`,Ii,"",` ${Ti("Paste into")} ${vi("inferenceGatewayBaseUrl")}${Ti(":")}`,` ${vi($i(r))}`];return n||a.push("",` ${Ti("Your Tailscale hostname is shown by:")} ${$i("tailscale status --self")}`),a.push("",` ${Ti("Docs:")} ${$i("https://claude.com/docs/cowork/3p/installation")}`),a}function Fi(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Ii,` ${vi("HTTPS")} ${Ti("— self-signed cert")}`,Ii,"",` ${Ti("Cert")} ${t}`];switch(o.push("",` ${vi("Trust this cert")} ${Ti("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${Ti("macOS:")}`,` ${$i("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${$i(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Ti("Windows (PowerShell as Administrator):")}`,` ${$i(`Import-Certificate -FilePath "${t}" \``)}`,` ${$i("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Ti("Linux (Debian/Ubuntu):")}`,` ${$i(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${$i("sudo update-ca-certificates")}`,` ${Ti("Linux (Fedora/RHEL/Arch):")}`,` ${$i(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${$i("sudo update-ca-trust")}`);break;default:o.push(` ${Ti("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Ti("Or, for Node CLIs only (no admin needed):")}`,` ${$i(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Ii),o}function Ui(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`}const Li=s.join(K.APP_DIR,"certs"),Gi=s.join(Li,"cert.pem"),zi=s.join(Li,"key.pem"),Ji=s.join(Li,"cert.meta.json");async function Ki(e){try{return await a.readFile(e,"utf8")}catch{return}}async function Wi(e){let t=await Ki(Gi),o=await Ki(zi),n=await async function(){let e=await Ki(Ji);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 Vi(e){return 0!==G(e)}async function Yi(e){await a.mkdir(Li,{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)Vi(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 z([{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(Gi,l.cert,{mode:420}),await a.writeFile(zi,l.private,{mode:384}),await async function(e){await a.writeFile(Ji,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:Gi,keyPath:zi,generated:!0}}const Xi=[],Zi=Date.now();let Qi="";function es(){let e=async(e,t=0)=>{let n=he.startSpan("copilot_api.server.shutdown",{kind:l.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-Zi)/1e3}});for(let t of Xi)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Ei("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Ii,` ${vi("COPILOT-API")} ${Ti(`v${e}`)} ${Ti("·")} ${Ui(t)} uptime`,Ii,""," Check in from time to time on",` ${$i(o)}`,"",Ii,""];console.log(n.join("\n"))}(Qi,Date.now()-Zi),g.exit(t)};g.on("SIGINT",()=>e("SIGINT")),g.on("SIGTERM",()=>e("SIGTERM")),g.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),g.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}function ts(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function os(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=he.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Ye({config:{version:o,port:t.port,accountType:t.accountType,verbose:t.verbose,manualApprove:t.manual,rateLimitSeconds:t.rateLimit??0,rateLimitWait:t.rateLimitWait,timeoutMs:t.timeout,showToken:t.showToken,_cc1:t._cc1,model:t.model,smallModel:t.smallModel,_t3:ts(t)},runtime:n,identity:{_u1:r.login,machineId:X.machineId,sessionId:X.sessionId,_v1:X._v1},connectivity:X.connectivity,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-Zi},"copilot_api")});if(X.models?.data)for(let e of X.models.data)a.addEvent("copilot_api.model.available",Ye(e,"model"));a.end(),Ke(_.INFO,"INFO","Server started",Ye({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-Zi},"copilot_api"))}async function ns(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 Wi(e)){let e=await Ki(Gi),t=await Ki(zi);if(e&&t)return{cert:e,key:t,certPath:Gi,keyPath:zi,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Yi(e)}(e.httpsHosts)}}async function rs(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=tn;try{U(t),U(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(es(),Xi.push(()=>{o.debug("Cleaning up connectivity monitor"),tt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),so&&=void clearInterval(so),co&&=void tt.off("online",co),uo&&=void tt.off("offline",uo),lo=void 0,po=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),Vn&&=void clearInterval(Vn),Yn&&=void clearInterval(Yn);let e=[...Jn.keys(),...Kn];Jn.clear(),Kn.clear(),zn.clear(),Wn=void 0;for(let t of e)Xn(t)&&(Ne.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!ue)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([ue.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");X.accountType=t.accountType,X.manualApprove=t.manual,X.rateLimitSeconds=t.rateLimit,X.rateLimitWait=t.rateLimitWait,X.showToken=t.showToken,X.timeoutMs=t.timeout,X.connectivity.timeoutMs=t.connectTimeout,X.webSearchProviders=t.webSearchProviders,X.errorReporting=function(e){let t=g.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===g.env.COPILOT_H2_KEEPALIVE||"true"===g.env.COPILOT_H2_KEEPALIVE,t=e||"1"===g.env.COPILOT_H2||"true"===g.env.COPILOT_H2;X.connectivity.h2=t,X.connectivity.h2Keepalive=e}(),await W(),ao();let n=await St();Qi=n;let r=Et();(function(e,t){t&&(de=t),pe=crypto.randomUUID();let o=v({[S]:"copilot-api",[E]:e,[A]:pe}),{endpoint:n,headers:r}=fe();ue=new x({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new $({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new T({exporter:new w({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),ue.start()})(n,Zi),t._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 a,i=t._t2||g.env.GH_TOKEN;i?(X._t2=i,o.info("Using provided Auth token")):await ko();try{a=await Zt(),await st(X,a.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}await(async()=>{let{token:e,refresh_in:t}=await Xt();X._t1=e,o.debug("Service token fetched successfully!"),X.showToken&&o.info("Service token:",e),so=setInterval(()=>{yo(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),tt.start(),co=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),yo(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},uo=()=>{o.debug("Network connectivity lost")},tt.on("online",co),tt.on("offline",uo)})(),await async function(){try{return await ro(),!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})`;return o.warn(`Could not fetch model list from Copilot${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(()=>{ro().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{ro().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)}}();Xi.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),X.connectivity.h2&&(er(Qn(lt(X))),X.connectivity.h2Keepalive&&or()),os({options:t,version:n,runtime:r,_u1:a});let l=await ns(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await async function(e,t,n){if(!e._cc1)return!1;let r,a;if(X.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."),g.exit(1)),e.model&&e.smallModel){let t=X.models.data.map(e=>e.id);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);if(!t.includes(e.smallModel))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid small model: ${e.smallModel}`);r=e.model,a=e.smallModel}else{if(e.model||e.smallModel)throw Error("Both --model and --small-model must be specified for model selection");r=await o.prompt("Select a model to use",{type:"select",options:X.models.data.map(e=>e.id)}),a=await o.prompt("Select a small model to use",{type:"select",options:X.models.data.map(e=>e.id)})}let i=bi({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 m.writeSync(i),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(i),!1}}(t,u,l)||await async function(e,t,n){if(!e.codex)return!1;let r;if(X.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."),g.exit(1)),e.model){let t=X.models.data.map(e=>e.id);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:X.models.data.map(e=>e.id)});let a=bi({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return m.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,u,l);(function(e){let t=[...Di(e),...Mi(e),...ji(e),...Hi(),"",...qi(Ni),...Bi(e),...Fi(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 Lo()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),L({fetch:Ya.fetch,port:t.port,hostname:t.hostname,tls:l?{cert:l.cert,key:l.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(c,t.hostname,t.port),t.smokeTest&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await Qa({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: ${dn(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))}}(u,t.smallModel??t.model,t.hostname)}function as(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const is=e({meta:{name:"start",description:"Start the API server"},args:{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:as(t,"--rate-limit"),r=e.timeout,a=void 0===r?Y:as(r,"--timeout"),i=e["connect-timeout"]??g.env.COPILOT_CONNECT_TIMEOUT_MS,s=void 0===i?15e3:as(i,"--connect-timeout");if(s<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${s}`);let l=e["https-hosts"],c=l?l.split(",").map(e=>e.trim()).filter(Boolean):[],u=e["web-search-provider"]??g.env.WEB_SEARCH_PROVIDER,p=u?u.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 d=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!ga(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${ha.join(", ")}`);let r=n.length>0?n:ha,a=new Set,i=n.length>0,s=[];for(let e of r){if(!ga(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"]||g.env.TAVILY_API_KEY,exaApiKey:g.env.EXA_API_KEY,order:p}),m=(g.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),f=""!==m&&"0"!==m&&"false"!==m;return rs({port:as(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:s,webSearchProviders:d,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:c,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!f})}});fi||(fi=!0,o.setReporters([mi(o.options.reporters)])),await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([St(),wi()]);if("unknown"===e||!t||!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}(e,t))return;!function(e,t){let o=`npx ${hi}@latest`,n=yi("│"),r=` ${_i("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,a=` Run ${_i(o)} to update`,i=" ".repeat(54),s=yi(`╭${"─".repeat(54)}╮`),l=yi(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${ki(r,54)}${n}`,`${n}${i}${n}`,`${n}${ki(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(e,t)}catch{}}();const ss=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:To,start:is,"check-usage":jo,debug:It,doctor:di,"cowork-setup":pn}});await t(ss);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{SpanKind as l,SpanStatusCode as c,context as u,metrics as p,trace as d}from"@opentelemetry/api";import m from"clipboardy";import{execFile as f,execSync as h}from"node:child_process";import g from"node:process";import{SeverityNumber as _,logs as y}from"@opentelemetry/api-logs";import{OTLPLogExporter as w}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as b}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as T}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as $}from"@opentelemetry/sdk-metrics";import{NodeSDK as x}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as A,ATTR_SERVICE_NAME as S,ATTR_SERVICE_VERSION as E}from"@opentelemetry/semantic-conventions";import{Client as C,request as O}from"undici";import{createHash as I,randomBytes as P,randomUUID as R}from"node:crypto";import{promisify as N}from"node:util";import{Hono as q}from"hono";import{cors as D}from"hono/cors";import{streamSSE as M}from"hono/streaming";import{events as j}from"fetch-event-stream";import{Tokenizer as H,models as B}from"ai-tokenizer";import*as F from"ai-tokenizer/encoding/claude";import{accessSync as U}from"node:fs";import{serve as L}from"srvx";import{isIP as G}from"node:net";import{generate as z}from"selfsigned";const J=s.join(i.homedir(),".local","share","copilot-api"),K={APP_DIR:J,GITHUB_TOKEN_PATH:s.join(J,"github_token"),MACHINE_ID_PATH:s.join(J,"machine_id"),SESSION_ID_PATH:s.join(J,"session_id")};async function W(){await a.mkdir(K.APP_DIR,{recursive:!0}),await V(K.GITHUB_TOKEN_PATH),await V(K.SESSION_ID_PATH)}async function V(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const Y=6e5,X={accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:Y,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}},Z=" │ ",Q=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()},ee=(e,t)=>e.padEnd(t),te=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),oe=(e,t,o)=>` --\x3e ${ee(e,4)} ${ee(t,21)} ${ee(o,3)}`,ne=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return ee(t,22)})(e.model??"—")+ee(t,8)},re=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?Q(Math.max(t-o,0)):"—",r=e?Q(e.outputTokens??0):"—",a=o?Q(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},ae=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${ee("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=Q(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},ie=e=>{if(void 0===e.ttfbMs)return`e2e ${te(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${te(e.ttfbMs)} → e2e ${te(e.e2eMs)} ${t}`},se=e=>e?X.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,le=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}}),ce={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=>[oe(e.method,e.path,e.status),ne(e),re(e.tokenUsage),ae(e.tokenUsage,e.maxContextTokens),ie({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(Z))({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:se(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),Ke(_.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)},...le(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.warn((e=>[oe(e.method,e.path,"429"),ne(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${te(e.e2eMs)}`].join(Z))({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=oe(e.method,e.path,e.status.toString()),o=ne(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${te(e.e2eMs)}`].join(Z)})({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(()=>ce.cleanup(),6e4);let ue,pe,de=Date.now();const me={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function fe(){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):me;return{endpoint:e.replace(/\/$/,""),headers:t}}const he=d.getTracer("copilot-api"),ge=p.getMeter("copilot-api"),_e=y.getLogger("copilot-api"),ye=ge.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),we=ge.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),ke=ge.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),be=ge.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),ve=ge.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Te=ge.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),$e=ge.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),xe=ge.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Ae=ge.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Se=ge.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ee=ge.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Ce=ge.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Oe=ge.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Ie=ge.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Pe=ge.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Re=ge.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Ne=ge.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),qe=ge.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),De=ge.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Me=ge.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),je=ge.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),He=ge.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Be=ge.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Fe=ge.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Ue=ge.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Le=ge.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Ge=ge.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),ze=ge.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),Je=ge.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function Ke(e,t,o,n,r){let a=d.getActiveSpan()?.spanContext()??r;_e.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function We(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:c.ERROR,message:o??n.message}),e.recordException(n)}function Ve(e,t,o){We(e,o),t&&t!==e&&We(t,o)}function Ye(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,Ye(r,e)))}return o}ge.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!tt.getConnectivityStats().isOnline)}),ge.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(tt.getConnectivityStats().consecutiveFailures)}),ge.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(X.models?.data.length??0)}),ge.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ce.completionCallbacks.size)}),ge.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-de)/1e3)});const Xe=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","proxy-authorization"]);function Ze(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Xe.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function Qe(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:u}=e,p=he.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&Ze(p,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();Xe.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),Oe.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:c.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw We(p,e),p.end(),e}}async function et(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=he.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Ze(f,"request",a);try{let{statusCode:e,headers:t,body:l}=await O(o,{method:r,headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!Xe.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Oe.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:c.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:l,span:f}}catch(e){throw We(f,e),f.end(),e}}const tt=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:X.connectivity.probeEndpoints,fastInterval:X.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?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval)+Math.random()*X.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=he.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),X.connectivity.timeoutMs);try{let n=!1;for(let e of X.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",...X.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Ue.record(r,{endpoint:e,result:"success"});break}Ue.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),Ee.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")),Ce.add(1,{from:"offline",to:"online"}),Ke(_.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")),Ce.add(1,{from:"online",to:"offline"}),Ke(_.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?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*X.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:X.connectivity.jitterMaxMs>0,connectionPooling:X.connectivity.connectionPooling,dnsCache:X.connectivity.dnsCache}}},ot=()=>({"content-type":"application/json",accept:"application/json"}),nt="0.48.1",rt=`copilot-chat/${nt}`,at=`GitHubCopilotChat/${nt}`,it=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`${K.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=I("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},st=async(e,t)=>{e.machineId||=await it(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(K.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(K.SESSION_ID_PATH,e),await a.chmod(K.SESSION_ID_PATH,384),e})()},lt=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,ct=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=R(),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":rt,"User-Agent":at,"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":R(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},ut=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const pt=(e,t,o)=>{let n=ct(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&&ut.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},dt="https://api.github.com",mt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":rt,"user-agent":at,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),ft="https://github.com",ht="01ab8ac9400c4e429b23",gt=["user:email"].join(" ");function _t(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 yt=32768,wt=[{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_***"}],kt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);function bt(e){let t=e;for(let{regex:e,mask:o}of wt)t=t.replace(e,o);return t}const vt=new Map;function Tt(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 $t(e,t,o){let n=bt(o),r=8*yt,a=n.length>r,i=a?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(i.length<=yt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=yt)e.setAttribute(`${t}.part_${o/yt}`,i.slice(o,o+yt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/yt))}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 xt(e,t){let o=function(e){if(vt.size>=1e3&&!vt.has(e)){let e=vt.keys().next().value;void 0!==e&&vt.delete(e)}let t,o=(vt.get(e)??0)+1;return vt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",qe.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&&$t(e,"copilot_api.incoming_request_body",n);let r=At(t.c.req.header());return r&&$t(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&$t(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&$t(e,"copilot_api.outgoing_headers",At(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&$t(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function At(e){let t={};for(let[o,n]of Object.entries(e))kt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function St(){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 Et(){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 Ct(){try{return!!(await a.stat(K.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(K.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Ot(e){let t=await async function(){let[e,t]=await Promise.all([St(),Ct()]);return{version:e,runtime:Et(),paths:{APP_DIR:K.APP_DIR,GITHUB_TOKEN_PATH:K.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 It=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})=>Ot({json:e.json})}),Pt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Rt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Nt=new Set;let qt;function Dt(e){if(X.errorReporting&&!(e.statusCode<500)&&!Nt.has(e.signature)){if(Nt.size>=1e3){let e=Nt.values().next().value;void 0!==e&&Nt.delete(e)}Nt.add(e.signature),async function(e){qt??=St();let t=await qt,o=Et(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(bt(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:_t(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(Pt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Rt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}var Mt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},jt=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Ht(e,t){return setTimeout(()=>e.abort(new jt(t)),t)}const Bt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Ft=RegExp(`\\b(?:${[...Bt].join("|")})\\b`);function Ut(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function Lt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Ut(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function Gt(e){let t=e.code;return"string"==typeof t?t:void 0}function zt(e){if(void 0===e.cause)return"";let t=Lt(e);if(t===e)return"";let o=Gt(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function Jt(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=>Bt.has(e))||!(t.length>0)&&(!!o.some(e=>Ft.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Kt(e){return e.req.path.startsWith("/v1/messages")}function Wt(e,t){if(Kt(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"}}}}function Vt(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 Yt(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",t.message))}function Xt(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=e.message),t}function Zt(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=Tt({endpointType:_t(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});xt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function Qt(e,t,o){let n=e.get("requestId"),r=ce.completionCallbacks.get(n);r&&(ce.logError(r,t,o),ce.completionCallbacks.delete(n))}async function eo(e,t){if(t instanceof Mt&&429===t.response.status)return async function(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=ce.completionCallbacks.get(n);r&&(ce.logRateLimit(r,t.response),ce.completionCallbacks.delete(n)),Te.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=Wt(a,e),s=Vt(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),Yt(o,s),Ke(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...Xt(s)}),Zt({c:e,error:t,errorText:a,upstream:s}),e.json(i,429)}(e,t);if(t instanceof SyntaxError){d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),Ke(_.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=Kt(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 Qt(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Mt)return async function(e,t){let o=d.getActiveSpan(),n=await t.response.text(),r=Wt(n,e),a=Vt(r);return Qt(e,t.response.status,a.message??t.message),o?.setStatus({code:c.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),Yt(o,a),Ke(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...Xt(a)}),Zt({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&Dt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Tt({endpointType:_t(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}),e.json(r,t.response.status)}(e,t);if(function(e){return e instanceof jt||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof jt}(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.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.";Ke(_.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=Kt(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return Qt(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(Jt(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.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?Lt(t):void 0,r=(n&&Gt(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.";Ke(_.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=Kt(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return Qt(e,503,t instanceof Error?`${t.message}${zt(t)}`:i),e.json(s,503)}(e,t);let n=d.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:c.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),Ke(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Dt({route:e.req.path,statusCode:500,errorClass:r.name,signature:Tt({endpointType:_t(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${zt(r)}`}),Qt(e,500,r.message),o.error(r);let a=Kt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const to=async()=>{let e=`${dt}/copilot_internal/v2/token`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Qe({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:mt(X),signal:o.signal});try{if(!t.ok)throw new Mt("Failed to get Service token",t);return await t.json()}catch(e){throw We(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function oo(){let e=`${dt}/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Qe({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${X._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Mt("Failed to get GitHub user",t);return await t.json()}catch(e){throw We(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let no=null;function ro(){return no||=to().then(({token:e})=>{X._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{no=null}),no}const ao=async()=>{let e=`${lt(X)}/models`,t=ct(X),o=X.timeoutMs,n=new AbortController,r=Ht(n,o);try{let{response:o,span:r}=await Qe({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Mt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw We(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const io=e=>new Promise(t=>{setTimeout(t,e)}),so=e=>null==e;async function lo(){let e=await(async()=>{try{return await ao()}catch(e){if(e instanceof Mt&&401===e.response.status)return await ro(),ao();throw e}})();X.models=e}const co=()=>{X._v1="1.140.0-insider"};var uo=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let po,mo,fo,ho,go,_o=!1;function yo(){return wo()?go:void 0}function wo(){return void 0!==go&&Date.now()-go.at<6e4}function ko(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";X._t1=void 0,go={status:s,message:l,at:Date.now()},clearInterval(po),po=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Ae.add(1,{reason:r,success:"false"}),Se.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:c.ERROR,message:n.message}),t.recordException(n),Fe.record(performance.now()-a,{reason:r}),Ke(_.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 bo(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;X._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:c.ERROR,message:s.message}),t.recordException(s),Se.add(1,{reason:r}),Fe.record(performance.now()-a,{reason:r}),Ke(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const vo=async(e=5,t=1e3,n="scheduled")=>_o?(o.debug("Token refresh already in progress, coalescing"),mo):(_o=!0,mo=he.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}=await to();return X._t1=t,go=void 0,o.debug("Service token refreshed successfully"),X.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Ae.add(1,{reason:n,success:"true"}),Fe.record(performance.now()-a,{reason:n}),void Ke(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Mt&&(401===s.response.status||403===s.response.status))return void ko({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),Ae.add(1,{reason:n,success:"false"}),l)return void bo({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(),_o=!1,mo=void 0}}),mo);async function To(){return!!X._t1||!wo()&&(await vo(3,250,"on-demand"),!!X._t1)}async function $o(e){try{let t=await a.readFile(K.GITHUB_TOKEN_PATH,"utf8");if(t&&!e?.force)return X._t2=t,X.showToken&&o.info("Auth token:",t),void await xo();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=X.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${ft}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:ht,scope:gt}),signal:e.signal});if(!t.ok)throw new Mt("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{m.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=g.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",f(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 uo("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=X.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${ft}/login/oauth/access_token`,{method:"POST",headers:ot(),body:JSON.stringify({client_id:ht,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await io(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 uo("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new uo("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 io(t);continue}if(r.access_token)return r.access_token;await io(t)}catch(e){if(e instanceof uo)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await io(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(K.GITHUB_TOKEN_PATH,e,{mode:384}))(r),X._t2=r,X.showToken&&o.info("Auth token:",r),await xo()}catch(e){throw e instanceof Mt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function xo(){let e=await oo();o.success(`Authenticated as ${e.login}`)}async function Ao(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),X.showToken=e.showToken,await W(),await $o({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 So=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})=>Ao({verbose:e.verbose,showToken:e["show-token"]})}),Eo=.01,Co=864e5,Oo=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Io=new Intl.NumberFormat("en-US"),Po=e=>Oo.format(e*Eo),Ro=e=>e.credits_used??e.entitlement-e.remaining,No=(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())/Co;if(r<.5)return;let a=Ro(e),i=a*Eo/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Eo,c=new Date(n.getTime()+l/i*Co);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},qo=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Io.format(Ro(e))} of ${Io.format(e.entitlement)} used`:"n/a",Do=e=>e.padEnd(14),Mo=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Do("AI credits")}unlimited`);else{let e=Ro(o),t=o.percent_remaining;n.push(`${Do("AI credits")}${Po(e)} / ${Po(o.entitlement)} ${t.toFixed(1)}% left`,`${Do("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Do("")}${Io.format(e)} of ${Io.format(o.entitlement)} credits`)}if(n.push("",`${Do("Chat")}${qo(e.quota_snapshots.chat)}`,`${Do("Completions")}${qo(e.quota_snapshots.completions)}`,"",`${Do("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Co)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=No(o,e.quota_reset_date,t);r&&n.push(`${Do("Burn rate")}~${Oo.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?`${Io.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Do("Overage")}${a}`)}return n.join("\n")},jo=async()=>{let e=`${dt}/copilot_internal/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Qe({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:mt(X),signal:o.signal});try{if(!t.ok)throw new Mt("Failed to get usage",t);return await t.json()}catch(e){throw We(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Ho=()=>g.stdout.write(""),Bo=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Fo=async()=>{let e=await jo();return Mo(e)},Uo=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 W(),await $o(),!e.watch){try{o.box(await Fo())}catch(e){o.error("Failed to fetch usage:",e),g.exit(1)}g.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=g.stdout.isTTY,r=()=>g.exit(0);for(g.on("SIGINT",r),g.on("SIGTERM",r);;){try{let e=await Fo();n&&Ho(),o.box(e),o.log(Bo(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Lo=N(f);async function Go(){let e="win32"===g.platform?"where.exe":"which";try{return await Lo(e,["tailscale"]),!0}catch{return!1}}async function zo(){try{let{stdout:e}=await Lo("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Jo(e){return e.replace(/\.$/,"")}async function Ko(){let e=await zo();if(e?.Online)return Jo(e.DNSName)}const Wo=N(f),Vo=e=>`${e}`,Yo=e=>`${e}`,Xo=e=>`${e}`,Zo=e=>`${e}`,Qo=e=>`${e}`,en=e=>`${e}`,tn=Yo(" ─────────────────────────────────────────────────────────────"),on=s.join(K.APP_DIR,"certs","tailscale"),nn=s.join(on,"cert.pem"),rn=s.join(on,"key.pem"),an={certDir:on,certPath:nn,keyPath:rn};function sn(){switch(g.platform){case"darwin":return[` ${Yo("Install Tailscale for macOS:")}`,` ${Xo("https://tailscale.com/download/mac")}`,` ${Yo("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${Yo("After installing, open the Tailscale app and sign in.")}`,` ${Yo("Then re-run this command.")}`].join("\n");case"linux":return[` ${Yo("Install Tailscale for Linux:")}`,` ${Xo("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Xo("sudo tailscale up")}`,` ${Yo("or")} ${Xo("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${Yo("Install Tailscale for Windows:")}`,` ${Xo("https://tailscale.com/download/windows")}`,"",` ${Yo("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${Yo("Install Tailscale:")} ${Xo("https://tailscale.com/download")}`}}function ln(){let e=[` ${Qo("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${Yo("Open the Tailscale app from Applications and sign in.")}`,` ${Yo("Download:")} ${Xo("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${Yo("Open the Tailscale app and sign in.")}`,` ${Yo("Download:")} ${Xo("https://tailscale.com/download/windows")}`):e.push(` ${Yo("Connect with:")} ${Xo("sudo tailscale up")}`),e.push("",` ${Yo("Then re-run this command.")}`),e.join("\n")}async function cn(){try{return await a.access(nn),await a.access(rn),!0}catch{return!1}}function un(e){console.log(""),console.log(tn),console.log(` ${Vo("Claude Cowork Setup")} ${Yo("— Diagnostic")}`),console.log(tn),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?Zo("✅"):"missing"===n.status?Qo("❌"):en("❓");let r=n.detail?Yo(` ${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(` ${Zo("All checks passed.")}`):console.log(` ${Qo(`${t.length} issue(s).`)} Run ${Xo("copilot-api cowork-setup install")} to fix.`),console.log("")}const pn={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},dn=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Go();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return un(e),console.log(""),console.log(sn()),void console.log("");let o=await zo();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},un(e),console.log(ln()),void console.log("");let n=Jo(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await cn();e["tailscale-cert"]=r?{status:"ok",detail:nn}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),un(e)}(),g.exit(0)}}),mn=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:pn},async run({args:e}){await async function(e){if(console.log(""),console.log(tn),console.log(` ${Vo("Claude Cowork Setup")} ${Yo("— Install")}`),console.log(tn),console.log(""),!await Go())return console.log(` ${Qo("Tailscale is not installed.")}`),console.log(""),console.log(sn()),console.log(""),console.log(` ${Yo("After installing, run")} ${Xo("tailscale up")} ${Yo("to connect, then re-run this command.")}`),void console.log("");let t=await zo();if(!t||!t.Online)return console.log(ln()),void console.log("");let n=Jo(t.DNSName);if(console.log(` ${Yo("Tailscale hostname:")} ${Vo(n)}`),console.log(""),console.log(` ${Vo("Generating TLS certificate via Tailscale…")}`),console.log(` ${Yo("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Xo(`$ tailscale cert --cert-file ${nn} --key-file ${rn} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(on,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Wo("tailscale",["cert","--cert-file",nn,"--key-file",rn,n]),console.log(` ${Zo("✓ 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(tn),console.log(` ${Vo("Next steps")}`),console.log(tn),console.log(""),console.log(` ${Vo("1.")} Start the proxy:`),console.log(` ${Xo("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Vo("2.")} In Cowork ${Yo("→")} Settings ${Yo("→")} Inference Provider, set:`),console.log(` ${Vo("inferenceGatewayBaseUrl")} = ${Xo(`https://${n}:<port>`)}`),console.log(` ${Yo("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Vo("3.")} Restart Cowork ${Yo("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${Yo("For Cowork's own configuration docs, see:")}`),console.log(` ${Xo("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),fn=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:pn},async run({args:e}){await async function(e){if(console.log(""),console.log(tn),console.log(` ${Vo("Claude Cowork Setup")} ${Yo("— Revert")}`),console.log(tn),console.log(""),!await cn())return console.log(` ${Yo("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${Vo("Remove Tailscale cert files:")}`),console.log(` ${Yo(nn)}`),console.log(` ${Yo(rn)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(on,{recursive:!0}),console.log(` ${Zo("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${Yo("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),hn=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:dn,install:mn,revert:fn}});function gn(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 _n(e){if("string"==typeof e)return gn(e);if(Array.isArray(e))return e.map(e=>_n(e));if(e&&"object"==typeof e){let t={},o="thinking"===e.type;for(let[n,r]of Object.entries(e))t[n]=!o||"thinking"!==n&&"signature"!==n?_n(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}const yn="x-copilot-api-self-test",wn=R();const kn=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function bn(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)}function vn(e){try{!function(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),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();Xe.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:c.ERROR,message:`HTTP ${a}`})}(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(ye.add(1,d),De.record(s,d),c>=400&&we.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&&(ke.add(e.inputTokens,t),Le.record(e.inputTokens,t)),e.outputTokens&&(be.add(e.outputTokens,t),Ge.record(e.outputTokens,t)),e.cachedTokens&&ve.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ce.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const Tn=1048576;const $n=async()=>he.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),Je.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Pe.add(1,{result:"rejected"}),new Mt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Pe.add(1,{result:"approved"})}finally{e.end()}});function xn(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 An(e,t){void 0!==t.prompt_tokens&&e.setAttribute("copilot_api.input_tokens",t.prompt_tokens),void 0!==t.completion_tokens&&e.setAttribute("copilot_api.output_tokens",t.completion_tokens),void 0!==t.total_tokens&&e.setAttribute("copilot_api.total_tokens",t.total_tokens)}const Sn=[{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"}],En="claude-haiku-4.5",Cn={haiku:En,"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"};function On(e,t){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)\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of Sn)if(t.pattern.test(e))return t.family;return null}(n);if(!a)return null;let i=n.replace(/-\d{8}(?::.*)?$/,""),s=r?`-${r}`:"";for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,""),o=`${i}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2")===o)return e}return function(e,t,o=null){let n=Cn[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)}const In=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Pn(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}var Rn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Nn(e){if(!e||"string"!=typeof e)throw new Rn("Model name is required and must be a string");if(!X.models?.data)throw new Rn("Models not available. Please try again later.",503);let t=X.models.data.map(e=>e.id);if(t.includes(e))return e;let o=On(e,t);if(!o)throw $e.add(1,{requested_model:e}),new Rn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}async function qn(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return he.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"),Te.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Mt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Te.add(1,{action:"waited",source:"local"}),He.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await io(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function Dn(e){if(e instanceof Mt){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 Mn(e,t){let{type:n,message:r}=Dn(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 jn(e,t){let{type:n,message:r}=Dn(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 Hn(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 Bn(e,t,o){return Math.min(Math.max(e,t),o)}function Fn(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 Fn(JSON.parse(r),t+1)}catch{return null}}function Un(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Hn(o.capabilities.supports.min_thinking_budget),r=Hn(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Hn(o.capabilities.limits?.max_output_tokens)??void 0}}function Ln(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Bn(Hn(e.requestedBudget)??o,o,n),a=Hn(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 Gn(e,t){if(so(e.thinking_budget))return e;let o=Un(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Ln({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 zn(e){return"invalid_thinking_budget"===Fn(e)}async function Jn(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(so(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(!zn(i))return null;let l=Un(n,t.model);return l?function(e,t){let o=Ln({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=Hn(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 Kn(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 Wn(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const Vn=new Map,Yn=new Map,Xn=new Set;let Zn,Qn,er;function tr(e){return!e.closed&&!e.destroyed}function or(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new C(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return Vn.set(t,Date.now()),Ne.add(1,{event:"created",origin:e}),Ke(_.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=Xn.has(t);Ne.add(1,{event:"goaway",origin:e}),Ke(i?_.WARN:_.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}),Yn.delete(t),Xn.delete(t),Vn.delete(t),tr(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function nr(e){if(!X.connectivity.h2)return;Zn&&Zn!==e&&function(){for(let e of[...Yn.keys(),...Xn])tr(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Yn.clear(),Xn.clear(),Vn.clear()}(),Zn=e;let t=Date.now();for(let[n]of Yn)if(t-(Vn.get(n)??0)>=6e5)Yn.delete(n),Vn.delete(n),tr(n)&&n.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ne.add(1,{event:"rotated",origin:e}),Ke(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(tr(n))return Yn.delete(n),Xn.add(n),n;Yn.delete(n),Vn.delete(n)}let n=or(e);return Xn.add(n),n}function rr(e){e&&Xn.delete(e)&&(tr(e)?Yn.set(e,Date.now()):Vn.delete(e))}function ar(){er||(er=setInterval(()=>{!function(){let e=Date.now(),t=X.connectivity.h2Keepalive,n=Yn.size;for(let[r,a]of Yn)e-a<6e4||t&&n<=1||(Yn.delete(r),Vn.delete(r),n--,tr(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ne.add(1,{event:"idle_reaped",origin:Zn??""}),Ke(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${Zn}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Zn??""}))}()},3e4),er.unref())}function ir(){Qn||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Qn=setInterval(()=>{(async function(){if(0===Yn.size&&0===Xn.size){if(Zn){let e=or(Zn);Yn.set(e,Date.now())}return}let e=[...Yn.keys()];for(let t of e)Yn.delete(t);await Promise.allSettled(e.map(async e=>{if(tr(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:ct(X)});await n.dump(),Re.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Yn.set(e,Date.now())}catch(t){Re.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ne.add(1,{event:"error",origin:Zn??""}),Vn.delete(e),tr(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Vn.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Qn.unref(),ar())}function sr(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)}async function lr(){return new Promise(e=>setTimeout(e,100))}async function cr(e,t,o){try{if(!e.ok)throw new Mt("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&&An(t,n.usage),n}catch(e){throw We(t,e),e}finally{t.end()}}const ur=async e=>{let t=_n(e);try{return await pr(t)}catch(e){if(e instanceof Mt&&401===e.response.status)return await ro(),pr(t);let n;if(e instanceof Mt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Jn({payload:t,error:e,models:X.models,errorBodyText:n});if(r)return e instanceof Mt&&void 0!==n&&o.warn(`Upstream rejected thinking_budget (status ${e.response.status}): ${n.slice(0,500)}`),o.warn("Adjusting thinking_budget payload and retrying once..."),await pr(_n(r));throw e}},pr=async e=>{if(!X._t1)throw Error("Service token not found");let t=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={...ct(X,t),"X-Initiator":n?"agent":"user"},a=lt(X),i=`${a}/chat/completions`,s=X.timeoutMs,l=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t))return{...e};let{max_tokens:o,stop:n,...r}=e;return null==o?{...r}:{...r,max_completion_tokens:o}}(e,X.models),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":e.max_tokens??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":n?"agent":"user"};for(let t=0;t<=1;t++){let n=nr(a),l=new AbortController,p=Ht(l,s);try{let{statusCode:o,headers:a,body:p,span:d}=await et({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":t},dispatcher:n}),m=new Response(p,{status:o,headers:a});if(e.stream){if(!m.ok)throw d.end(),new Mt("Failed to create chat completions",m,{outgoingBody:c,outgoingHeaders:r});return{events:j(m),span:d,release:()=>rr(n)}}try{return await cr(m,d,{outgoingBody:c,outgoingHeaders:r})}finally{rr(n)}}catch(e){if(rr(n),sr(e)&&t<1){o.warn(`HTTP/2 connection error during chat completions, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await lr();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function dr(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 mr(e){let t=!0===e.get("isSelfTest");t||await qn(X);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return he.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Nn(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),xe.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 Rn)return d.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(e.set("requestData",{model:n.model,streaming:!!n.stream}),X.manualApprove&&!t&&await $n(),so(n.max_tokens)){let e=X.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(n.max_tokens))}n=Gn(n,X.models),so(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=performance.now(),a=await ur(n),i=performance.now()-r;if(Me.record(i,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),fr(a)){let t=e.get("requestData")||{};return a.usage&&(t.tokenUsage=xn(a.usage)),t._d1=i,t.upstreamTtfbMs=i,t.upstreamTotalMs=i,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(a)),e.json(a)}let{events:s,span:l,release:c}=a;return M(e,async t=>{let o={value:null},a=0,u=performance.now(),p=Kn(e,r);try{try{for await(let r of s){p();let s=r;r.data&&"[DONE]"!==r.data&&(a++,Ie.add(1,{model:n.model,endpoint_type:"openai"}),s=dr(r,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=xn(t),n._d1=i,e.set("requestData",n)})),await t.writeSSE(s)}let l=performance.now()-u,c={model:n.model,endpoint_type:"openai"};if(je.record(l,c),ze.record(a,c),Wn(e,r),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=xn(o.value),t._d1=i,e.set("requestData",t))}}catch(o){throw Ve(l,e.get("requestSpan"),o),await jn(t,o),o}finally{o.value&&An(l,o.value),l.end(),c()}let d=e.get("requestId");d&&ce.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const fr=e=>Object.hasOwn(e,"choices"),hr=new q;hr.post("/",async e=>{try{return await mr(e)}catch(t){return await eo(e,t)}});const gr=new q;gr.post("/",async e=>{try{let t=await e.req.json();try{t.model=Nn(t.model)}catch(t){if(t instanceof Rn)return d.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=performance.now(),n=await(async e=>{if(!X._t1)throw Error("Service token not found");let t=`${lt(X)}/embeddings`,o=ct(X),n=X.timeoutMs,r=new AbortController,a=Ht(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await Qe({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}});try{if(!n.ok)throw new Mt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw We(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),r=performance.now()-o;Me.record(r,{model:t.model,target:"embeddings",streaming:"false"});let a=e.get("requestData")||{};return a.tokenUsage=xn(n.usage),a._d1=r,e.set("requestData",a),e.json(n)}catch(t){return await eo(e,t)}});const _r=new q;let yr=null,wr=null;function kr(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function br(e){return!kr(e)}_r.get("/",async e=>{let t,o=function(){let e=X._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=yr;return t&&e-t.timestamp<3e4?{result:t.result}:wr||(wr=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${lt(X)}/models`,n=await fetch(t,{method:"GET",headers:ct(X),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return yr={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return yr={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),wr=null}})(),wr)}();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.42.2",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 vr=new H(F),Tr={...B["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function $r(e){return vr.encode(e).length}function xr(e){let t=0;for(let o of e)switch(o.type){case"text":t+=$r(o.text)*Tr.contentMultiplier;break;case"tool_use":t+=$r(o.name+JSON.stringify(o.input))*Tr.contentMultiplier;break;case"tool_result":o.content&&(t+=$r("string"==typeof o.content?o.content:JSON.stringify(o.content))*Tr.contentMultiplier);break;case"thinking":t+=$r(o.thinking)*Tr.contentMultiplier;break;case"image":t+=1600}return t}function Ar(e){let t=0,o=e.properties;if(!o)return t;let n=Object.entries(o);for(let[e,[o,r]]of n.entries()){if(t+=0===e?Tr.perFirstProp:Tr.perAdditionalProp,t+=$r(o),r.description&&(t+=Tr.perPropDesc+$r(r.description)),r.enum&&Array.isArray(r.enum)){t+=Tr.perEnum;for(let e of r.enum)t+=$r(String(e))}if("object"===r.type&&r.properties&&(t+=Tr.perNestedObject,t+=Ar(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=Tr.perArrayOfObjects,t+=Ar(e))}}return t}function Sr(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")};return e.thinking&&(o["copilot_api.thinking.type"]=e.thinking.type,"budget_tokens"in e.thinking&&e.thinking.budget_tokens&&(o["copilot_api.thinking.budget_tokens"]=e.thinking.budget_tokens)),e.output_config?.effort&&(o["copilot_api.output_config.effort"]=e.output_config.effort),o}function Er(e,t,o){let n=Sr(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Cr=async(e,t,n)=>{try{return await Or(e,t)}catch(r){if(r instanceof Mt&&401===r.response.status)return await ro(),Or(e,t);if(r instanceof Mt&&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}`),Or(i,t)}throw r}};const Or=async(e,t)=>{if(!X._t1)throw Error("Service token not found");let{metadata:n,...r}=_n(e),a=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(r),i={...pt(X,t,a),"X-Initiator":"agent"},s=lt(X),l=`${s}/v1/messages`,c=X.timeoutMs,u=JSON.stringify(r),p=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",...Sr(e,t?.anthropicBeta)}}(r,t,c);for(let e=0;e<=1;e++){let t=nr(s),a=new AbortController,d=Ht(a,c);try{let{statusCode:o,headers:n,body:s,span:d}=await et({spanName:"copilot POST /v1/messages",url:l,target:"anthropic_messages",headers:i,body:u,signal:a.signal,headersTimeout:c,bodyTimeout:3*c,extraAttributes:{...p,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(s,{status:o,headers:n});if(!m.ok)throw d.end(),new Mt("Failed to create anthropic messages",m,{outgoingBody:u,outgoingHeaders:i});if(r.stream)return{events:j(m),span:d,release:()=>rr(t)};try{let e=await m.json();"string"==typeof e.id&&d.setAttribute("copilot_api.response.id",e.id);let t=e.usage;return t&&An(d,{prompt_tokens:t.input_tokens??0,completion_tokens:t.output_tokens??0,total_tokens:(t.input_tokens??0)+(t.output_tokens??0)}),e}finally{d.end(),rr(t)}}catch(n){if(rr(t),sr(n)&&e<1){o.warn(`HTTP/2 connection error during anthropic messages, retrying (attempt ${e+1}): ${n instanceof Error?n.message:String(n)}`),await lr();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Ir(e,t,o){try{if(!e.ok)throw new Mt("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&&An(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw We(t,e),e}finally{t.end()}}const Pr=async e=>{try{return await Rr(e)}catch(t){if(t instanceof Mt&&401===t.response.status)return await ro(),Rr(e);throw t}},Rr=async e=>{if(!X._t1)throw Error("Service token not found");let t=_n(e),n={...ct(X),"X-Initiator":"agent"},r=lt(X),a=`${r}/responses`,i=X.timeoutMs,s=JSON.stringify(t),l={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":i,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let c=nr(r),u=new AbortController,p=Ht(u,i);try{let{statusCode:o,headers:r,body:p,span:d}=await et({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}),m=new Response(p,{status:o,headers:r});if(t.stream){if(!m.ok)throw d.end(),new Mt("Failed to create responses",m,{outgoingBody:s,outgoingHeaders:n});return{events:j(m),span:d,release:()=>rr(c)}}try{return await Ir(m,d,{outgoingBody:s,outgoingHeaders:n})}finally{rr(c)}}catch(t){if(rr(c),sr(t)&&e<1){o.warn(`HTTP/2 connection error during responses, retrying (attempt ${e+1}): ${t instanceof Error?t.message:String(t)}`),await lr();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Nr=new Set(["low","medium","high","max","xhigh"]);function qr(e,t,n){let r=t.includes(e.model)?e.model:On(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=On(e,t);if(!n)return null;let r=new Set(t);if(o.context1m){let e=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,r);if(e)return e}if(o.effort){let e=function(e,t,o){let n=null;if("high"===o?n="high":("max"===o||"xhigh"===o)&&(n="xhigh"),!n)return null;let r=`${e}-${n}`;return t.has(r)?r:null}(n,r,o.effort);if(e)return e}return null}(a.model,t,{context1m:n.context1m,effort:a.output_config?.effort}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=d.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 function(e){let t=e.output_config?.effort;if(!t)return e;let n=X.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Pn(t,n);if(!r||!Nr.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=d.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}}}(s)}function Dr(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Mr(e,t){let o={model:e.model,messages:jr(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:Lr(e.tools),tool_choice:Gr(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Un(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:"high"===e?16e3:"medium"===e?8e3:1024}(e,o.max),r=Hn(t),a=r&&r>1?r-1:o.min;return Bn(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Gn({...o,thinking_budget:a},t)}}return o}function jr(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:Hr(e)}]:[{role:"system",content:Hr(e.map(e=>e.text).join("\n\n"))}]:[]}(t),n=e.flatMap(e=>"user"===e.role?function(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:Ur(e.content)});n.length>0&&t.push({role:"user",content:Ur(n)})}else t.push({role:"user",content:Ur(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:Fr(e.reasoning_text),reasoning_opaque:Fr(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Ur(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:Ur(e.content),...t}]}(e));return[...o,...n]}function Hr(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const Br=32768;function Fr(e){if("string"==typeof e)return e.length<=Br?e:e.slice(0,Br)}function Ur(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 Lr(e){if(e)return e.filter(br).map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Gr(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 zr(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 Jr(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Kr(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 Wr=new Set(["low","medium","high","max","xhigh"]);function Vr(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&&Wr.has(e)?e:null)(Pn(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 Yr(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 Xr=/[^\w-]/g;function Zr(e){return e.replaceAll(Xr,"_")}function Qr(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=Vr(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:Yr(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:Zr(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Zr(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function ea(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t)return"thinking must be an object";let o=t,n=new Set(["enabled","adaptive","disabled"]);return"string"==typeof o.type&&n.has(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 one of: enabled, adaptive, disabled"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t)return"output_config must be an object";let o=t;if(void 0===o.effort)return null;let n=new Set(["low","medium","high","max","xhigh"]);return"string"==typeof o.effort&&n.has(o.effort)?null:"output_config.effort must be one of: low, medium, high, max, xhigh"}(e)}function ta(e,t){return he.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),Er(n,t,e.req.header("anthropic-beta"));let r=Nn(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=ea(t);return a?(d.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),xe.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 Rn)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:t.message}},t.statusCode)};throw t}finally{n.end()}})}function oa(e){let t=function(e){let t=[];for(let o of e)"user"===o.role?t.push(...ra(o)):t.push(...ia(o));return t}(e.messages);if(0===t.length)throw new Mt("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 o={model:e.model,input:t,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)},n=function(e){return e?function(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}("string"==typeof e?e:e.map(e=>e.text).join("\n\n")):null}(e.system);return n&&(o.instructions=n),e.tools?.length&&(o.tools=e.tools.filter(br).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(o.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)),"adaptive"===e.thinking?.type?o.reasoning={effort:na(e.output_config?.effort??"high")}:"enabled"===e.thinking?.type&&e.thinking.budget_tokens&&(o.reasoning=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens)),o}function na(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function ra(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(aa(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)"text"===t.type?e.push({type:"input_text",text:t.text}):e.push({type:"input_image",image_url:`data:${t.source.media_type};base64,${t.source.data}`});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 aa(e){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 ia(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 sa(e,t){if(t)return"tool_use";switch(e){case"completed":case"cancelled":case"failed":return"end_turn";case"incomplete":return"max_tokens";default:return null}}function la(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function ca(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 ua(e,t){let o=[];switch(e.type){case"response.created":ca(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){ca(t,o),la(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":ca(t,o),la(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":la(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":{la(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:sa(e.response.status,n),stop_sequence:null},usage:{input_tokens:r?.input_tokens??0,output_tokens:r?.output_tokens??0}},{type:"message_stop"});break}case"response.incomplete":{ca(t,o),la(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:{input_tokens:n?.input_tokens??0,output_tokens:n?.output_tokens??0}},{type:"message_stop"});break}case"response.failed":ca(t,o),la(t,o),o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":ca(t,o),la(t,o),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":ca(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}})}return o}function pa(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 da(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function ma(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&&(pa(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&&(pa(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),da(t,o)),r.content&&(da(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){da(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&&(da(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Dr(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 fa=/structured_outputs|output_config\.format/i;function ha(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&fa.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Qr({...e,model:En},o):null}var ga=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var _a=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const ya={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 Qe({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 We(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new _a: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 Qe({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 We(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new ga:e}finally{clearTimeout(i)}}},wa=["tavily","exa"];function ka(e){return"tavily"===e||"exa"===e}function ba(){return X.webSearchProviders.length>0}async function va(e,t){return async function(e,t,n){let{providers:r,searchFns:a=ya}=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:X.webSearchProviders})}function Ta(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function $a(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function xa(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&&kr(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(!ba())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await va(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_${Ta()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{type:"web_search_tool_result",tool_use_id:n,content:$a(e)}];return{id:`msg_ws_${Ta()}`,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_${Ta()}`,r=`msg_ws_${Ta()}`,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:{type:"web_search_tool_result",tool_use_id:n,content:$a(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}),M(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const Aa=(e,t)=>!(!e||!t||e===t);async function Sa(e){if(X._t1||await To())return null;let t=yo();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; re-authenticate with \`copilot-api auth\`, then restart the proxy`}},401)):(d.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))}async function Ea(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&kr(t[0])}(t))return xa(e,t);await qn(X),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort;t=function(e,t){return qr(t,X.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let a=ta(e,t);if(!a.ok)return a.response;t=a.payload;let i=await Sa(e);if(i)return i;if(function(e){let t=X.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e)}(t.model))return Na(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t,o){let n=Qr(t,X.models),r={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},a=n.output_config?.effort;return e.set("requestData",{model:n.model,reasoningEffort:a,effortClamped:Aa(o,a),streaming:!!n.stream}),X.manualApprove&&await $n(),he.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",n.model),t.setAttribute("copilot_api.streaming",!!n.stream),Er(t,n,r.anthropicBeta);try{let o=performance.now(),a=await Cr(n,r,{onStructuredOutputFallback:(e,o)=>{let n=ha(e,o,X.models);return n&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",n.model)),n}}),i=performance.now()-o;if(Me.record(i,{model:n.model,target:"anthropic_messages",streaming:String(!!n.stream)}),!n.stream){let o=a,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=xn(Pa(t)),o._d1=i,o.upstreamTtfbMs=i,o.upstreamTotalMs=i,e.set("requestData",o)}return t.end(),e.json(o)}let{events:s,span:l,release:c}=a;return M(e,async r=>{let a=0,i=performance.now(),u={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=Kn(e,o);try{try{for await(let e of s)d(),e.data&&"[DONE]"!==e.data?(a++,Ie.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),Ra(e.data,u)&&(p=!0),await r.writeSSE(e)):await r.writeSSE(e);let e=performance.now()-i,t={model:n.model,endpoint_type:"anthropic_messages"};je.record(e,t),ze.record(a,t)}catch(t){throw Ve(l,e.get("requestSpan"),t),await Mn(r,t),t}finally{if(Wn(e,o),p){let t=Pa(u);An(l,t);let o=e.get("requestData")||{};o.tokenUsage=xn(t),e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&ce.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw We(t,e),t.end(),e}})}(e,t,r);let s=performance.now(),l=he.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=>"image"===e.type)),r=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));return o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),Mr(t,X.models)}finally{o.end()}});Be.record(performance.now()-s,{direction:"anthropic_to_openai"}),l=Gn(l,X.models),o.debug("Translated OpenAI request payload:",l);let c=t.output_config?.effort;e.set("requestData",{model:l.model,reasoningEffort:c,effortClamped:Aa(r,c),streaming:!!l.stream});let u=performance.now();X.manualApprove&&await $n();let p=await ur(l),d=performance.now()-u;if(Me.record(d,{model:l.model,target:"chat_completions",streaming:String(!!l.stream)}),Oa(p)){let t=e.get("requestData")||{};p.usage&&(t.tokenUsage=xn(p.usage)),t._d1=d,t.upstreamTtfbMs=d,t.upstreamTotalMs=d,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(p).slice(-400));let r=performance.now(),a=he.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=Jr(a.message),i=zr(a.message.content),s=Kr(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:Dr(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(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 Be.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}o.debug("Streaming response from service");let{events:m,span:f,release:h}=p;return M(e,async t=>{let n=null,r=0,a=performance.now(),i=Kn(e,u),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of m){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let c;try{c=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,Ie.add(1,{model:l.model,endpoint_type:"anthropic"}),c.usage){n=c.usage;let t=e.get("requestData")||{};t.tokenUsage=xn(n),t._d1=d,e.set("requestData",t)}let u=ma(c,s);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let c=performance.now()-a,p={model:l.model,endpoint_type:"anthropic"};if(je.record(c,p),ze.record(r,p),Wn(e,u),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=xn(n),t._d1=d,e.set("requestData",t))}}catch(o){throw Ve(f,e.get("requestSpan"),o),await Mn(t,o),o}finally{n&&An(f,n),f.end(),h()}let c=e.get("requestId");c&&ce.executeCompletion(c)}finally{e.get("resolveStreamComplete")?.()}})}function Ca(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}:null}const Oa=e=>Object.hasOwn(e,"choices"),Ia=e=>Object.hasOwn(e,"output");function Pa(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 Ra(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}async function Na(e,t){let r=performance.now(),a=he.startActiveSpan("copilot_api.translate.anthropic_to_responses",e=>{try{return e.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),e.setAttribute("copilot_api.translation.message_count",t.messages.length),oa(t)}finally{e.end()}});Be.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),X.manualApprove&&await $n();let i=performance.now(),s=await Pr(a),l=performance.now()-i;if(Me.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Ia(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=xn({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens})),t._d1=l,t.upstreamTtfbMs=l,t.upstreamTotalMs=l,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(s).slice(-400)),"failed"===s.status)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:s.error?.code??"api_error",message:s.error?.message??"Response generation failed"}},500);let r=performance.now(),a=he.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)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:sa(e.status,o),stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}(s)}finally{e.end()}});return Be.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return M(e,async t=>{let n=null,r=0,s=performance.now(),d=Kn(e,i),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let i of c){if(d(),o.debug("Responses API raw stream event:",i),!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}r++,Ie.add(1,{model:a.model,endpoint_type:"responses"});let c=Ca(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=xn(n),t._d1=l,e.set("requestData",t)}let u=ua(s,m);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let u=performance.now()-s,p={model:a.model,endpoint_type:"responses"};je.record(u,p),ze.record(r,p),Wn(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await Mn(t,o),o}finally{n&&An(u,n),u.end(),p()}let f=e.get("requestId");f&&ce.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const qa=new q;qa.post("/",async e=>{try{return await Ea(e)}catch(t){return await eo(e,t)}});const Da=new q;function Ma(e){return he.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Nn(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),xe.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 ja(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}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=xn(o),n._d1=t._d1,t.c.set("requestData",n)}Da.get("/",async e=>{try{X.models||await lo();let t=X.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 eo(e,t)}});const Ha=new Set(["message","function_call","function_call_output"]),Ba=new Set(["type","name","description","parameters"]);async function Fa(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||!ba())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await va(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Ua(e){if(ba())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Fa(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function La(e){if(!ba())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 Fa(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Ga(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 za(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&&Ga(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)Ga(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Ja(e){return null!=e}function Ka(e){let t=e.input,o="string"==typeof t?t:t.map(e=>function(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 Ha.has(e.type)||"web_search_call"===e.type?e:null}}(e)).filter(e=>null!==e),n={model:e.model,input:o};for(let t of["instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])Ja(e[t])&&(n[t]=e[t]);let r=new Set;if(Ja(e.tools)){let t=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))Ba.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);n.tools=t.tools,r=t.customToolNames}if(Ja(e.reasoning)&&"object"==typeof e.reasoning){let t=e.reasoning;n.reasoning={},Ja(t.effort)&&(n.reasoning.effort=t.effort),Ja(t.summary)&&(n.reasoning.summary=t.summary)}if(Ja(e.text)&&"object"==typeof e.text){let t=e.text;Ja(t.format)&&(n.text={format:t.format})}return{payload:n,customToolNames:r}}async function Wa(e){if(X._t1)return null;if(!await To()){let t=yo();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; re-authenticate with \`copilot-api auth\`, then restart the proxy`,type:"authentication_error"}},401)):(d.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))}return null}async function Va(e){await qn(X);let{payload:t,customToolNames:n}=Ka(await e.req.json()),r=t;o.debug(`Responses API [${Array.isArray(r.input)?r.input.length:1} items]`),n.size>0&&o.debug(`Custom tools detected: ${[...n].join(", ")}`);let a=function(e,t){try{return{ok:!0,payload:Ma(t)}}catch(t){if(t instanceof Rn)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,r);if(!a.ok)return a.response;r=a.payload;let i=await Wa(e);if(i)return i;e.set("requestData",{model:r.model,reasoningEffort:r.reasoning?.effort,streaming:!!r.stream}),X.manualApprove&&await $n();let s=performance.now(),l=await Pr(r),c=performance.now()-s;if(Me.record(c,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Ya(l))return async function(e,t,o){await Ua(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=xn({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,l,c);let{events:u,span:p,release:d}=l;return M(e,async t=>{let o={value:null},a=0,i=performance.now(),l=Kn(e,s);try{try{for await(let i of u)if(l(),i.data&&"[DONE]"!==i.data){a++;let s=za(i.data,n);s=await La(s);let l=s===i.data?i:{...i,data:s};Ie.add(1,{model:r.model,endpoint_type:"responses"}),ja(s,{usageRef:o,c:e,_d1:c}),await t.writeSSE(l)}else await t.writeSSE(i);let p=performance.now()-i,d={model:r.model,endpoint_type:"responses"};je.record(p,d),ze.record(a,d),Wn(e,s)}catch(o){throw Ve(p,e.get("requestSpan"),o),await jn(t,o),o}finally{o.value&&An(p,o.value),p.end(),d()}let m=e.get("requestId");m&&ce.executeCompletion(m)}finally{e.get("resolveStreamComplete")?.()}})}const Ya=e=>Object.hasOwn(e,"output"),Xa=new q;Xa.post("/",async e=>{try{return await Va(e)}catch(t){return await eo(e,t)}});const Za=new q;Za.get("/",e=>{try{return X.showToken?e.json({token:X._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 Qa=new q;Qa.get("/",async e=>{try{let t=await jo();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const ei=new q;function ti(){return function(e){let t=e.filter(e=>bn(e));if(0===t.length)return;let o=t.find(e=>kn.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(X.models?.data??[])}function oi(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 gn(o).slice(0,200)}catch{}let t=gn(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 ni(e={}){let t=performance.now(),o=e.model&&function(e){let t=X.models?.data.find(t=>t.id===e);return void 0!==t&&bn(t)}(e.model)?e.model:ti();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 ei.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[yn]:wn},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:oi(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)}}ei.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=_t(i),p=function(e){return e===wn}(e.req.header(yn));e.set("requestId",r),e.set("isSelfTest",p),e.header("x-request-id",r);let m=he.startSpan("copilot_api.handle_request",{kind:l.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",m),e.set("requestTraceContext",m.spanContext()),p&&m.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Xe.has(e)||"x-copilot-api-self-test"!==e&&m.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=await e.req.raw.clone().text();e.set("rawBody",t.length>Tn?t.slice(0,Tn):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let f,h=new Promise(e=>{f=e});e.set("streamComplete",h),e.set("resolveStreamComplete",f);let g=d.setSpan(u.active(),m);await u.with(g,async()=>{p||ce.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw m.setStatus({code:c.ERROR,message:t.message}),m.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:m};_?.streaming&&e.res.status<400?h.then(()=>vn(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{m.recordException(t),m.setStatus({code:c.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{m.end()}catch{}}):vn(y)}),ei.use(D()),ei.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()}),ei.get("/",e=>e.text("Server running")),ei.route("/health",_r),ei.route("/chat/completions",hr),ei.route("/models",Da),ei.route("/embeddings",gr),ei.route("/usage",Qa),ei.route("/token",Za),ei.route("/v1/chat/completions",hr),ei.route("/v1/models",Da),ei.route("/v1/embeddings",gr),ei.route("/v1/messages",qa),ei.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 o=Tr.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=Tr.perMessage+$r(e)*Tr.contentMultiplier}for(let e of t.messages)o+=Tr.perMessage,o+=$r(e.role),"string"==typeof e.content?o+=$r(e.content)*Tr.contentMultiplier:Array.isArray(e.content)&&(o+=xr(e.content));let n=t.tools?.filter(br);return n&&n.length>0&&(o+=function(e){let t=Tr.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=Tr.perTool),t+=$r(n.name),n.description&&(t+=Tr.perDesc+$r(n.description)),t+=Ar(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),ei.route("/v1/responses",Xa),ei.route("/responses",Xa),ei.onError((e,t)=>eo(t,e));const ri=e=>`${e}`,ai=e=>`${e}`,ii=e=>`${e}`,si=e=>`${e}`,li=e=>`${e}`,ci=ai(" ─────────────────────────────────────────────────────────────");function ui(e,t,o){console.log(` ${function(e){return"ok"===e?ii("✓"):"warn"===e?li("⚠"):si("✗")}(e)} ${ri(t.padEnd(14))} ${o}`)}function pi(e){console.log(` ${ai("↳")} ${ai(e)}`)}function di(e){return e instanceof Mt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function mi(){let e=g.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(K.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 fi(){try{await lo();let e=(X.models?.data.length??0)>0;return ui(e?"ok":"warn","Model catalog",e?function(){let e=X.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 ui("fail","Model catalog",di(e)),pi("Could not fetch /models — check connectivity/auth."),!1}}async function hi(e){X.accountType=e.accountType;let t=await St(),o=Et();if(console.log(""),console.log(` ${ri("COPILOT-API DOCTOR")} ${ai(`v${t}`)}`),console.log(ci),ui("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await W(),co(),!await async function(){let e=await mi();if(!e)return ui("fail","Auth token","not found"),void pi("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");X._t2=e.token,ui("ok","Auth token",`found (${e.source})`);try{let e=await oo();return await st(X,e.login),ui("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return ui("fail","GitHub auth",di(e)),void pi("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(ci),console.log(` ${si("✗")} ${ri("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await to();return X._t1=e,ui("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Mt?e.response.status:0;return ui("fail","Service token",di(e)),pi(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 fi();await async function(){try{let e=await jo(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Po(Ro(t))} of ${Po(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;ui("ok","Copilot plan",`${e.copilot_plan} · ${o} `+ai(`(resets ${e.quota_reset_date})`))}catch(e){ui("warn","Copilot plan",`unavailable (${di(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await ni();return e.ok?(ui("ok","Generation",`works via ${e.model} ${ai(`(${e.durationMs}ms)`)}`),!0):(ui("fail","Generation",`${e.reason}${e.status?ai(` [HTTP ${e.status}]`):""}`),!1)}():ui("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=g.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){ui(t,"Client config","potential base-URL issue");for(let t of e)pi(t)}else ui("ok","Client config","no base-URL issues detected");pi("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(ci),a?(console.log(` ${ii("✓")} ${ri("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${li("⚠")} ${ri("Some checks need attention")} — see the ${si("✗")}/${li("⚠")} lines above.`),console.log(""),2)}const gi=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 hi({accountType:e["account-type"]});g.exit(t)}});function _i(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 yi=!1;const wi="copilot-api-node20",ki=`https://registry.npmjs.org/${wi}/latest`,bi=e=>`${e}`,vi=e=>`${e}`;async function Ti(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(ki,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function $i(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}function xi(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=g;if("win32"===e){try{if(h(`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}const Ai=e=>`${e}`,Si=e=>`${e}`,Ei=e=>`${e}`,Ci=e=>`${e}`,Oi=e=>`${e}`,Ii=e=>`${e}`,Pi=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Ri="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Ni="https://github.com/johnib/copilot-api-issues/issues",qi=Si(" ─────────────────────────────────────────────────────────────");function Di(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Mi(e){return e&&0!==e.length?e.join("·"):"—"}const ji=[{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"},{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"},{title:"Claude Code's Compaction Engine: What the Source Code Actually Reveals",teaser:"What's actually running beneath every long session.",url:"https://barazany.dev/blog/claude-codes-compaction-engine"}];function Hi(e){if(0===e.length)return[];let t=["",qi,` ${Ai("BARAZANY.DEV")} ${Si("— Recent Posts")}`,qi,""];for(let[o,n]of e.entries()){let e=`${n.url}${Ri}`,r=Pi(e,Ai(Ii(`[${o+1}]`)));t.push(` ${r} ${Ei(n.title)}`,` ${Si("→")} ${Si(n.teaser)}`,"")}return t.push(qi,` ${Pi(`https://barazany.dev/blog${Ri}`,"barazany.dev/blog")}`,qi),t}function Bi(e){let t=[];X.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):X.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(Si(" → "))} ${Ci("✓")}`:Si("off"),n=["",` ${Ai("COPILOT-API")} ${Si(`v${e.version}`)}`,qi,` ${Si("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Si("User")} ${e.user} ${Si("·")} ${e.accountType}`];return X._v1&&n.push(` ${Si("Client")} VSCode ${X._v1}`),n.push(` ${Si("Network")} ${t.join(Si(" · "))}`,` ${Si("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Si("Clipboard")} Claude Code command ${Ci("✓")}`),n.push(qi),n}function Fi(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Ai("Active")}`];if(e.model){let o=X.models?.data.find(t=>t.id===e.model),n=Di(o?.capabilities.limits?.max_context_window_tokens),r=Mi(o?.capabilities.supports.reasoning_effort);t.push(` ${Ei(e.model.padEnd(32))} ${Si("ctx")} ${Ai(n.padStart(5))} ${Si("effort")} ${Si(r)} ${Oi("← main")}`)}if(e.smallModel){let o=X.models?.data.find(t=>t.id===e.smallModel),n=Di(o?.capabilities.limits?.max_context_window_tokens),r=Mi(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Si("ctx")} ${n.padStart(5)} ${Si("effort")} ${Si(r)} ${Oi("← small")}`)}return t}function Ui(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of X.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("",` ${Ai(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Ei("●"):Si("·"),i=n?Ei(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Di(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Mi(r.effort)}`;t.push(` ${a} ${i} ${Si(s)}${Si(l)}`)}}return t}function Li(){let e=Ni.replace(/^https:\/\//,""),t=Pi(`${Ni}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",qi,` ${Ai("FOUND A BUG?")} ${Si("— Report it on GitHub")}`,qi,"",` ${Ei("→")} ${Ei(t)}`,` ${Si("Bug reports, feature requests, and questions welcome.")}`,"",qi]}function Gi(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=["",qi,` ${Ai("Claude Cowork")} ${Si("— Settings → Inference Provider")}`,qi,"",` ${Si("Paste into")} ${Ai("inferenceGatewayBaseUrl")}${Si(":")}`,` ${Ai(Ei(r))}`];return n||a.push("",` ${Si("Your Tailscale hostname is shown by:")} ${Ei("tailscale status --self")}`),a.push("",` ${Si("Docs:")} ${Ei("https://claude.com/docs/cowork/3p/installation")}`),a}function zi(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",qi,` ${Ai("HTTPS")} ${Si("— self-signed cert")}`,qi,"",` ${Si("Cert")} ${t}`];switch(o.push("",` ${Ai("Trust this cert")} ${Si("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${Si("macOS:")}`,` ${Ei("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Ei(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Si("Windows (PowerShell as Administrator):")}`,` ${Ei(`Import-Certificate -FilePath "${t}" \``)}`,` ${Ei("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Si("Linux (Debian/Ubuntu):")}`,` ${Ei(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Ei("sudo update-ca-certificates")}`,` ${Si("Linux (Fedora/RHEL/Arch):")}`,` ${Ei(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Ei("sudo update-ca-trust")}`);break;default:o.push(` ${Si("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Si("Or, for Node CLIs only (no admin needed):")}`,` ${Ei(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,qi),o}function Ji(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`}const Ki=s.join(K.APP_DIR,"certs"),Wi=s.join(Ki,"cert.pem"),Vi=s.join(Ki,"key.pem"),Yi=s.join(Ki,"cert.meta.json");async function Xi(e){try{return await a.readFile(e,"utf8")}catch{return}}async function Zi(e){let t=await Xi(Wi),o=await Xi(Vi),n=await async function(){let e=await Xi(Yi);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 Qi(e){return 0!==G(e)}async function es(e){await a.mkdir(Ki,{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)Qi(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 z([{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(Wi,l.cert,{mode:420}),await a.writeFile(Vi,l.private,{mode:384}),await async function(e){await a.writeFile(Yi,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:Wi,keyPath:Vi,generated:!0}}const ts=[],os=Date.now();let ns="";function rs(){let e=async(e,t=0)=>{let n=he.startSpan("copilot_api.server.shutdown",{kind:l.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-os)/1e3}});for(let t of ts)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Pi("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",qi,` ${Ai("COPILOT-API")} ${Si(`v${e}`)} ${Si("·")} ${Ji(t)} uptime`,qi,""," Check in from time to time on",` ${Ei(o)}`,"",qi,""];console.log(n.join("\n"))}(ns,Date.now()-os),g.exit(t)};g.on("SIGINT",()=>e("SIGINT")),g.on("SIGTERM",()=>e("SIGTERM")),g.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),g.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}function as(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function is(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=he.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Ye({config:{version:o,port:t.port,accountType:t.accountType,verbose:t.verbose,manualApprove:t.manual,rateLimitSeconds:t.rateLimit??0,rateLimitWait:t.rateLimitWait,timeoutMs:t.timeout,showToken:t.showToken,_cc1:t._cc1,model:t.model,smallModel:t.smallModel,_t3:as(t)},runtime:n,identity:{_u1:r.login,machineId:X.machineId,sessionId:X.sessionId,_v1:X._v1},connectivity:X.connectivity,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-os},"copilot_api")});if(X.models?.data)for(let e of X.models.data)a.addEvent("copilot_api.model.available",Ye(e,"model"));a.end(),Ke(_.INFO,"INFO","Server started",Ye({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-os},"copilot_api"))}async function ss(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 Zi(e)){let e=await Xi(Wi),t=await Xi(Vi);if(e&&t)return{cert:e,key:t,certPath:Wi,keyPath:Vi,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),es(e)}(e.httpsHosts)}}async function ls(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=an;try{U(t),U(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(rs(),ts.push(()=>{o.debug("Cleaning up connectivity monitor"),tt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),po&&=void clearInterval(po),fo&&=void tt.off("online",fo),ho&&=void tt.off("offline",ho),mo=void 0,go=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),Qn&&=void clearInterval(Qn),er&&=void clearInterval(er);let e=[...Yn.keys(),...Xn];Yn.clear(),Xn.clear(),Vn.clear(),Zn=void 0;for(let t of e)tr(t)&&(Ne.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!ue)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([ue.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");X.accountType=t.accountType,X.manualApprove=t.manual,X.rateLimitSeconds=t.rateLimit,X.rateLimitWait=t.rateLimitWait,X.showToken=t.showToken,X.timeoutMs=t.timeout,X.connectivity.timeoutMs=t.connectTimeout,X.webSearchProviders=t.webSearchProviders,X.errorReporting=function(e){let t=g.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===g.env.COPILOT_H2_KEEPALIVE||"true"===g.env.COPILOT_H2_KEEPALIVE,t=e||"1"===g.env.COPILOT_H2||"true"===g.env.COPILOT_H2;X.connectivity.h2=t,X.connectivity.h2Keepalive=e}(),await W(),co();let n=await St();ns=n;let r=Et();(function(e,t){t&&(de=t),pe=crypto.randomUUID();let o=v({[S]:"copilot-api",[E]:e,[A]:pe}),{endpoint:n,headers:r}=fe();ue=new x({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new $({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new T({exporter:new w({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),ue.start()})(n,os),t._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 a,i=t._t2||g.env.GH_TOKEN;i?(X._t2=i,o.info("Using provided Auth token")):await $o();try{a=await oo(),await st(X,a.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}await(async()=>{let{token:e,refresh_in:t}=await to();X._t1=e,o.debug("Service token fetched successfully!"),X.showToken&&o.info("Service token:",e),po=setInterval(()=>{vo(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),tt.start(),fo=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),vo(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},ho=()=>{o.debug("Network connectivity lost")},tt.on("online",fo),tt.on("offline",ho)})(),await async function(){try{return await lo(),!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})`;return o.warn(`Could not fetch model list from Copilot${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(()=>{lo().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{lo().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)}}();ts.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),X.connectivity.h2&&(rr(nr(lt(X))),X.connectivity.h2Keepalive&&ir()),is({options:t,version:n,runtime:r,_u1:a});let l=await ss(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await async function(e,t,n){if(!e._cc1)return!1;let r,a;if(X.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."),g.exit(1)),e.model&&e.smallModel){let t=X.models.data.map(e=>e.id);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);if(!t.includes(e.smallModel))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid small model: ${e.smallModel}`);r=e.model,a=e.smallModel}else{if(e.model||e.smallModel)throw Error("Both --model and --small-model must be specified for model selection");r=await o.prompt("Select a model to use",{type:"select",options:X.models.data.map(e=>e.id)}),a=await o.prompt("Select a small model to use",{type:"select",options:X.models.data.map(e=>e.id)})}let i=xi({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 m.writeSync(i),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(i),!1}}(t,u,l)||await async function(e,t,n){if(!e.codex)return!1;let r;if(X.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."),g.exit(1)),e.model){let t=X.models.data.map(e=>e.id);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:X.models.data.map(e=>e.id)});let a=xi({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return m.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,u,l);(function(e){let t=[...Bi(e),...Fi(e),...Ui(e),...Li(),"",...Hi(ji),...Gi(e),...zi(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 Ko()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),L({fetch:ei.fetch,port:t.port,hostname:t.hostname,tls:l?{cert:l.cert,key:l.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(c,t.hostname,t.port),t.smokeTest&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await ni({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: ${gn(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))}}(u,t.smallModel??t.model,t.hostname)}function cs(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const us=e({meta:{name:"start",description:"Start the API server"},args:{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:cs(t,"--rate-limit"),r=e.timeout,a=void 0===r?Y:cs(r,"--timeout"),i=e["connect-timeout"]??g.env.COPILOT_CONNECT_TIMEOUT_MS,s=void 0===i?15e3:cs(i,"--connect-timeout");if(s<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${s}`);let l=e["https-hosts"],c=l?l.split(",").map(e=>e.trim()).filter(Boolean):[],u=e["web-search-provider"]??g.env.WEB_SEARCH_PROVIDER,p=u?u.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 d=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!ka(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${wa.join(", ")}`);let r=n.length>0?n:wa,a=new Set,i=n.length>0,s=[];for(let e of r){if(!ka(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"]||g.env.TAVILY_API_KEY,exaApiKey:g.env.EXA_API_KEY,order:p}),m=(g.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),f=""!==m&&"0"!==m&&"false"!==m;return ls({port:cs(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:s,webSearchProviders:d,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:c,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!f})}});yi||(yi=!0,o.setReporters([_i(o.options.reporters)])),await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([St(),Ti()]);if("unknown"===e||!t||!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}(e,t))return;!function(e,t){let o=`npx ${wi}@latest`,n=vi("│"),r=` ${bi("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,a=` Run ${bi(o)} to update`,i=" ".repeat(54),s=vi(`╭${"─".repeat(54)}╮`),l=vi(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${$i(r,54)}${n}`,`${n}${i}${n}`,`${n}${$i(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(e,t)}catch{}}();const ps=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:So,start:us,"check-usage":Uo,debug:It,doctor:gi,"cowork-setup":hn}});await t(ps);export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "copilot-api-node20",
3
- "version": "0.42.1",
3
+ "version": "0.42.2",
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",