copilot-api-node20 0.42.4 → 0.42.5

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 k}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as w}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 x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as T}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}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 R,randomUUID as P}from"node:crypto";import{promisify as N}from"node:util";import{Hono as q}from"hono";import{cors as j}from"hono/cors";import{streamSSE as D}from"hono/streaming";import{events as M}from"fetch-event-stream";import{Tokenizer as H,models as B}from"ai-tokenizer";import*as U from"ai-tokenizer/encoding/claude";import{accessSync as F}from"node:fs";import{serve as L}from"srvx";import{isIP as G}from"node:net";import{generate as J}from"selfsigned";const W=s.join(i.homedir(),".local","share","copilot-api"),z={APP_DIR:W,GITHUB_TOKEN_PATH:s.join(W,"github_token"),MACHINE_ID_PATH:s.join(W,"machine_id"),SESSION_ID_PATH:s.join(W,"session_id")};async function K(){await a.mkdir(z.APP_DIR,{recursive:!0}),await V(z.GITHUB_TOKEN_PATH),await V(z.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),ze(_.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"}),ke=ge.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),we=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"}),xe=ge.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Te=ge.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),$e=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"}),Re=ge.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Pe=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)"}),je=ge.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),De=ge.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Me=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"}),Ue=ge.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Fe=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"}),Je=ge.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),We=ge.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function ze(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 Ke(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){Ke(e,o),t&&t!==e&&Ke(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 Ke(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 Ke(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,Fe.record(r,{endpoint:e,result:"success"});break}Fe.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"}),ze(_.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"}),ze(_.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`${z.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(R(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(z.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=P();return await a.writeFile(z.SESSION_ID_PATH,e),await a.chmod(z.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=P(),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":P(),"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,kt=[{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_***"}],wt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);function bt(e){let t=e;for(let{regex:e,mask:o}of kt)t=t.replace(e,o);return t}const vt=new Map;function xt(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 Tt(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 $t(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&&Tt(e,"copilot_api.incoming_request_body",n);let r=At(t.c.req.header());return r&&Tt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&Tt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Tt(e,"copilot_api.outgoing_headers",At(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Tt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function At(e){let t={};for(let[o,n]of Object.entries(e))wt.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(z.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(z.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:z.APP_DIR,GITHUB_TOKEN_PATH:z.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})}),Rt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Pt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Nt=new Set;let qt;function jt(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(Rt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Pt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function Dt(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const Mt=new WeakSet;function Ht(e){return"object"==typeof e&&!!e&&Mt.has(e)}async function Bt(e,{attempt:t,maxRetries:n,operation:r}){return!!Dt(e)&&(t>=n?(function(e){"object"==typeof e&&e&&Mt.add(e)}(e),!1):(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0))}var Ut=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Ft=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Lt(e,t){return setTimeout(()=>e.abort(new Ft(t)),t)}const Gt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Jt=RegExp(`\\b(?:${[...Gt].join("|")})\\b`);function Wt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function zt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Wt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function Kt(e){let t=e.code;return"string"==typeof t?t:void 0}function Vt(e){if(void 0===e.cause)return"";let t=zt(e);if(t===e)return"";let o=Kt(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function Yt(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=>Gt.has(e))||!(t.length>0)&&(!!o.some(e=>Jt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Xt(e){return e.req.path.startsWith("/v1/messages")}function Zt(e,t){if(Xt(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 Qt(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 eo(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 to(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 oo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=xt({endpointType:_t(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});$t(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function no(e,t,o){let n=e.get("requestId"),r=ce.completionCallbacks.get(n);r&&(ce.logError(r,t,o),ce.completionCallbacks.delete(n))}function ro(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"),function(e,t){Ht(t)&&e?.setAttribute("copilot_api.transport_reason","h2_retry_exhausted")}(o,t);let n=t instanceof Error?zt(t):void 0,r=(n&&Kt(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.";ze(_.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=Xt(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return no(e,503,t instanceof Error?`${t.message}${Vt(t)}`:i),e.json(s,503)}function ao(e){return Ht(e)||Yt(e)||function(e){return Dt(e)||e instanceof Error&&Dt(e.cause)}(e)}async function io(e,t){if(t instanceof Ut&&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)),xe.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=Zt(a,e),s=Qt(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),eo(o,s),ze(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...to(s)}),oo({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"),ze(_.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=Xt(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 no(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Ut)return async function(e,t){let o=d.getActiveSpan(),n=await t.response.text(),r=Zt(n,e),a=Qt(r);return no(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"),eo(o,a),ze(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...to(a)}),oo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&jt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:xt({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 Ft||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Ft}(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.";ze(_.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=Xt(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return no(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(ao(t))return ro(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),ze(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),jt({route:e.req.path,statusCode:500,errorClass:r.name,signature:xt({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(r)}`}),no(e,500,r.message),o.error(r);let a=Xt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const so=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 Ut("Failed to get Service token",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function lo(){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 Ut("Failed to get GitHub user",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let co=null;function uo(){return co||=so().then(({token:e})=>{X._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{co=null}),co}const po=async()=>{let e=`${lt(X)}/models`,t=ct(X),o=X.timeoutMs,n=new AbortController,r=Lt(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 Ut("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Ke(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const mo=e=>new Promise(t=>{setTimeout(t,e)}),fo=e=>null==e;async function ho(){let e=await(async()=>{try{return await po()}catch(e){if(e instanceof Ut&&401===e.response.status)return await uo(),po();throw e}})();X.models=e}const go=()=>{X._v1="1.140.0-insider"};var _o=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let yo,ko,wo,bo,vo,xo=!1,To=!1,$o=!1;function Ao(){return So()?vo:void 0}function So(){return void 0!==vo&&Date.now()-vo.at<6e4}function Eo(){return $o?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const Co=()=>a.readFile(z.GITHUB_TOKEN_PATH,"utf8");function Oo(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,vo={status:s,message:l,at:Date.now()},clearInterval(yo),yo=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),Ue.record(performance.now()-a,{reason:r}),ze(_.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 Io(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}),Ue.record(performance.now()-a,{reason:r}),ze(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Ro=async(e=5,t=1e3,n="scheduled")=>xo?(o.debug("Token refresh already in progress, coalescing"),ko):(xo=!0,ko=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,refresh_in:s}=await so();return X._t1=t,vo=void 0,To&&void 0===yo&&(o.info("Token refresh recovered, resuming scheduled refresh"),No(s)),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"}),Ue.record(performance.now()-a,{reason:n}),void ze(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Ut&&(401===s.response.status||403===s.response.status))return void Oo({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 Io({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(),xo=!1,ko=void 0}}),ko);async function Po(){return!!X._t1||!So()&&(void 0!==vo&&$o&&await async function(){if(ko)return;let e=(await Co().catch(()=>{}))?.trim();e&&e!==X._t2?.trim()&&(X._t2=e,o.info("Picked up re-authenticated Auth token from disk"),X.showToken&&o.info("Auth token:",e))}(),await Ro(3,250,"on-demand"),!!X._t1)}function No(e){yo&&clearInterval(yo);let t=Math.max(1e3*(e-60),6e4);yo=setInterval(()=>{Ro(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function qo(e){try{let t=await Co();if(t&&!e?.force)return X._t2=t,$o=!0,X.showToken&&o.info("Auth token:",t),void await jo();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 Ut("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 _o("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 mo(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 _o("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new _o("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 mo(t);continue}if(r.access_token)return r.access_token;await mo(t)}catch(e){if(e instanceof _o)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await mo(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(z.GITHUB_TOKEN_PATH,e,{mode:384}))(r),X._t2=r,$o=!0,X.showToken&&o.info("Auth token:",r),await jo()}catch(e){throw e instanceof Ut?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function jo(){let e=await lo();o.success(`Authenticated as ${e.login}`)}async function Do(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),X.showToken=e.showToken,await K(),await qo({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 Mo=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})=>Do({verbose:e.verbose,showToken:e["show-token"]})}),Ho=.01,Bo=864e5,Uo=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Fo=new Intl.NumberFormat("en-US"),Lo=e=>Uo.format(e*Ho),Go=e=>e.credits_used??e.entitlement-e.remaining,Jo=(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())/Bo;if(r<.5)return;let a=Go(e),i=a*Ho/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Ho,c=new Date(n.getTime()+l/i*Bo);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Wo=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Fo.format(Go(e))} of ${Fo.format(e.entitlement)} used`:"n/a",zo=e=>e.padEnd(14),Ko=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${zo("AI credits")}unlimited`);else{let e=Go(o),t=o.percent_remaining;n.push(`${zo("AI credits")}${Lo(e)} / ${Lo(o.entitlement)} ${t.toFixed(1)}% left`,`${zo("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${zo("")}${Fo.format(e)} of ${Fo.format(o.entitlement)} credits`)}if(n.push("",`${zo("Chat")}${Wo(e.quota_snapshots.chat)}`,`${zo("Completions")}${Wo(e.quota_snapshots.completions)}`,"",`${zo("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Bo)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=Jo(o,e.quota_reset_date,t);r&&n.push(`${zo("Burn rate")}~${Uo.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?`${Fo.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${zo("Overage")}${a}`)}return n.join("\n")},Vo=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 Ut("Failed to get usage",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Yo=()=>g.stdout.write(""),Xo=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Zo=async()=>{let e=await Vo();return Ko(e)},Qo=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 K(),await qo(),!e.watch){try{o.box(await Zo())}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 Zo();n&&Yo(),o.box(e),o.log(Xo(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),en=N(f);async function tn(){let e="win32"===g.platform?"where.exe":"which";try{return await en(e,["tailscale"]),!0}catch{return!1}}async function on(){try{let{stdout:e}=await en("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function nn(e){return e.replace(/\.$/,"")}async function rn(){let e=await on();if(e?.Online)return nn(e.DNSName)}const an=N(f),sn=e=>`${e}`,ln=e=>`${e}`,cn=e=>`${e}`,un=e=>`${e}`,pn=e=>`${e}`,dn=e=>`${e}`,mn=ln(" ─────────────────────────────────────────────────────────────"),fn=s.join(z.APP_DIR,"certs","tailscale"),hn=s.join(fn,"cert.pem"),gn=s.join(fn,"key.pem"),_n={certDir:fn,certPath:hn,keyPath:gn};function yn(){switch(g.platform){case"darwin":return[` ${ln("Install Tailscale for macOS:")}`,` ${cn("https://tailscale.com/download/mac")}`,` ${ln("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`,` ${ln("Then re-run this command.")}`].join("\n");case"linux":return[` ${ln("Install Tailscale for Linux:")}`,` ${cn("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${cn("sudo tailscale up")}`,` ${ln("or")} ${cn("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${ln("Install Tailscale for Windows:")}`,` ${cn("https://tailscale.com/download/windows")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${ln("Install Tailscale:")} ${cn("https://tailscale.com/download")}`}}function kn(){let e=[` ${pn("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${ln("Open the Tailscale app from Applications and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${ln("Open the Tailscale app and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/windows")}`):e.push(` ${ln("Connect with:")} ${cn("sudo tailscale up")}`),e.push("",` ${ln("Then re-run this command.")}`),e.join("\n")}async function wn(){try{return await a.access(hn),await a.access(gn),!0}catch{return!1}}function bn(e){console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Diagnostic")}`),console.log(mn),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?un("✅"):"missing"===n.status?pn("❌"):dn("❓");let r=n.detail?ln(` ${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(` ${un("All checks passed.")}`):console.log(` ${pn(`${t.length} issue(s).`)} Run ${cn("copilot-api cowork-setup install")} to fix.`),console.log("")}const vn={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},xn=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await tn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return bn(e),console.log(""),console.log(yn()),void console.log("");let o=await on();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},bn(e),console.log(kn()),void console.log("");let n=nn(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await wn();e["tailscale-cert"]=r?{status:"ok",detail:hn}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),bn(e)}(),g.exit(0)}}),Tn=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Install")}`),console.log(mn),console.log(""),!await tn())return console.log(` ${pn("Tailscale is not installed.")}`),console.log(""),console.log(yn()),console.log(""),console.log(` ${ln("After installing, run")} ${cn("tailscale up")} ${ln("to connect, then re-run this command.")}`),void console.log("");let t=await on();if(!t||!t.Online)return console.log(kn()),void console.log("");let n=nn(t.DNSName);if(console.log(` ${ln("Tailscale hostname:")} ${sn(n)}`),console.log(""),console.log(` ${sn("Generating TLS certificate via Tailscale…")}`),console.log(` ${ln("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${cn(`$ tailscale cert --cert-file ${hn} --key-file ${gn} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(fn,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await an("tailscale",["cert","--cert-file",hn,"--key-file",gn,n]),console.log(` ${un("✓ 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(mn),console.log(` ${sn("Next steps")}`),console.log(mn),console.log(""),console.log(` ${sn("1.")} Start the proxy:`),console.log(` ${cn("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${sn("2.")} In Cowork ${ln("→")} Settings ${ln("→")} Inference Provider, set:`),console.log(` ${sn("inferenceGatewayBaseUrl")} = ${cn(`https://${n}:<port>`)}`),console.log(` ${ln("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${sn("3.")} Restart Cowork ${ln("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${ln("For Cowork's own configuration docs, see:")}`),console.log(` ${cn("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),$n=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Revert")}`),console.log(mn),console.log(""),!await wn())return console.log(` ${ln("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${sn("Remove Tailscale cert files:")}`),console.log(` ${ln(hn)}`),console.log(` ${ln(gn)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(fn,{recursive:!0}),console.log(` ${un("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${ln("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),An=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:xn,install:Tn,revert:$n}});function Sn(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 En(e){if("string"==typeof e)return Sn(e);if(Array.isArray(e))return e.map(e=>En(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?En(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}const Cn="x-copilot-api-self-test",On=P();const In=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Rn(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 Pn(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),je.record(s,d),c>=400&&ke.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&&(we.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 Nn=1048576;const qn=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),We.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Re.add(1,{result:"rejected"}),new Ut("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Re.add(1,{result:"approved"})}finally{e.end()}});async function jn(e){if(X._t1||await Po())return null;let t=Ao();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))}function Dn(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 Mn(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 Hn=[{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"}],Bn="claude-haiku-4.5",Un={haiku:Bn,"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 Fn(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of Hn)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=Un[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 Ln=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Gn(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=Ln.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=Ln.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var Jn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Wn(e){if(!e||"string"!=typeof e)throw new Jn("Model name is required and must be a string");if(!X.models?.data)throw new Jn("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=Fn(e,t);if(!o)throw Te.add(1,{requested_model:e}),new Jn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function zn(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)}async function Kn(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"),xe.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Ut("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),xe.add(1,{action:"waited",source:"local"}),He.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await mo(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Vn=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Yn(e){if(e instanceof Vn)return{type:e.type,message:e.message};if(e instanceof Ut){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 Xn(e,t){let{type:n,message:r}=Yn(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 Zn(e,t){let{type:n,message:r}=Yn(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 er(e,t,o){return Math.min(Math.max(e,t),o)}function tr(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 tr(JSON.parse(r),t+1)}catch{return null}}function or(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 nr(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=er(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 rr(e,t){if(fo(e.thinking_budget))return e;let o=or(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=nr({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 ar(e){return"invalid_thinking_budget"===tr(e)}async function ir(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(fo(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(!ar(i))return null;let l=or(n,t.model);return l?function(e,t){let o=nr({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 sr(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 lr(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const cr=new Map,ur=new Map,pr=new Set;let dr,mr,fr;function hr(e){return!e.closed&&!e.destroyed}function gr(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 cr.set(t,Date.now()),Ne.add(1,{event:"created",origin:e}),ze(_.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=pr.has(t);Ne.add(1,{event:"goaway",origin:e}),ze(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}),ur.delete(t),pr.delete(t),cr.delete(t),hr(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function _r(e,t){if(!X.connectivity.h2)return;if(dr&&dr!==e&&function(){for(let e of[...ur.keys(),...pr])hr(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});ur.clear(),pr.clear(),cr.clear()}(),dr=e,t?.fresh){let t=gr(e);return pr.add(t),t}let n=Date.now();for(let[t]of ur)if(n-(cr.get(t)??0)>=6e5)ur.delete(t),cr.delete(t),hr(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ne.add(1,{event:"rotated",origin:e}),ze(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(hr(t))return ur.delete(t),pr.add(t),t;ur.delete(t),cr.delete(t)}let r=gr(e);return pr.add(r),r}function yr(e){e&&pr.delete(e)&&(hr(e)?ur.set(e,Date.now()):cr.delete(e))}function kr(){fr||(fr=setInterval(()=>{!function(){let e=Date.now(),t=X.connectivity.h2Keepalive,n=ur.size;for(let[r,a]of ur)e-a<6e4||t&&n<=1||(ur.delete(r),cr.delete(r),n--,hr(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ne.add(1,{event:"idle_reaped",origin:dr??""}),ze(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${dr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":dr??""}))}()},3e4),fr.unref())}function wr(){mr||(o.debug("Starting HTTP/2 keepalive (every 45s)"),mr=setInterval(()=>{(async function(){if(0===ur.size&&0===pr.size){if(dr){let e=gr(dr);ur.set(e,Date.now())}return}let e=[...ur.keys()];for(let t of e)ur.delete(t);await Promise.allSettled(e.map(async e=>{if(hr(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:ct(X)});await n.dump(),Pe.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),ur.set(e,Date.now())}catch(t){Pe.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ne.add(1,{event:"error",origin:dr??""}),cr.delete(e),hr(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else cr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),mr.unref(),kr())}function br(e){return e.max_completion_tokens??e.max_tokens}async function vr(e,t,o){try{if(!e.ok)throw new Ut("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&&Mn(t,n.usage),n}catch(e){throw Ke(t,e),e}finally{t.end()}}const xr=async e=>{let t=En(e);try{return await Tr(t)}catch(e){if(e instanceof Ut&&401===e.response.status)return await uo(),Tr(t);let n;if(e instanceof Ut)try{n=await e.response.clone().text()}catch{n=void 0}let r=await ir({payload:t,error:e,models:X.models,errorBodyText:n});if(r)return e instanceof Ut&&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 Tr(En(r));throw e}},Tr=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)),o=e.messages.some(e=>["assistant","tool"].includes(e.role)),n={...ct(X,t),"X-Initiator":o?"agent":"user"},r=lt(X),a=`${r}/chat/completions`,i=X.timeoutMs,s=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=br(e);return null==i?a:{...a,max_completion_tokens:i}}(e,X.models),l=JSON.stringify(s),c={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":i,"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":br(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=_r(r,{fresh:t>0}),s=new AbortController,u=Lt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await et({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}),m=new Response(p,{status:r,headers:u});if(e.stream){if(!m.ok)throw d.end(),new Ut("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:M(m),span:d,release:()=>yr(o)}}try{return await vr(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{yr(o)}}catch(e){if(yr(o),await Bt(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function $r(e,t,o){try{if(!e.ok)throw new Ut("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&&Mn(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Ke(t,e),e}finally{t.end()}}const Ar=async e=>{try{return await Sr(e)}catch(t){if(t instanceof Ut&&401===t.response.status)return await uo(),Sr(e);throw t}},Sr=async e=>{if(!X._t1)throw Error("Service token not found");let t=En(e),o={...ct(X),"X-Initiator":"agent"},n=lt(X),r=`${n}/responses`,a=X.timeoutMs,i=JSON.stringify(t),s={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":a,"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 l=_r(n,{fresh:e>0}),c=new AbortController,u=Lt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await et({spanName:"copilot POST /responses",url:r,target:"responses",headers:o,body:i,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...s,"copilot_api.h2.retry_attempt":e},dispatcher:l}),m=new Response(p,{status:n,headers:u});if(t.stream){if(!m.ok)throw d.end(),new Ut("Failed to create responses",m,{outgoingBody:i,outgoingHeaders:o});return{events:M(m),span:d,release:()=>yr(l)}}try{return await $r(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{yr(l)}}catch(t){if(yr(l),await Bt(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Er=e=>Object.hasOwn(e,"output");function Cr(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}var Or=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const Ir=new Set(["model","messages","max_tokens","max_completion_tokens","temperature","top_p","stream","stream_options","tools","tool_choice","parallel_tool_calls","user","reasoning_effort","response_format"]);function Rr(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Or(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Or(`logprobs is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","logprobs")}(e);let t=function(e){return e.filter(e=>"system"===e.role||"developer"===e.role).map(e=>Nr(e.content)).filter(Boolean).join("\n\n")||void 0}(e.messages),o=function(e){let t=[];for(let o of e)switch(o.role){case"user":{let e=qr(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Nr(o.content);e&&t.push({type:"message",role:"assistant",content:[{type:"output_text",text:e}]});for(let e of o.tool_calls??[])t.push({type:"function_call",call_id:e.id,name:e.function.name,arguments:e.function.arguments});break}case"tool":t.push({type:"function_call_output",call_id:o.tool_call_id??"",output:Nr(o.content)})}return t}(e.messages);if(0===o.length)throw new Or("request has no translatable message content","invalid_request","messages");let n={model:e.model,input:o,store:!1};t&&(n.instructions=t);let r=e.max_completion_tokens??e.max_tokens;"number"==typeof r&&(n.max_output_tokens=Math.max(r,16)),e.stream&&(n.stream=!0),Pr(e.temperature)&&(n.temperature=e.temperature),Pr(e.top_p)&&(n.top_p=e.top_p),Pr(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),Pr(e.user)&&(n.user=e.user),e.reasoning_effort&&(n.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(n.tools=e.tools.filter(e=>"function"===e.type).map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters}))),e.tool_choice&&(n.tool_choice="string"==typeof e.tool_choice?e.tool_choice:{type:"function",name:e.tool_choice.function.name});let a=function(e){if(e)switch(e.type){case"json_schema":{let{name:t,description:o,schema:n,strict:r}=e.json_schema;return{type:"json_schema",name:t,description:o,schema:n,strict:r}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return a&&(n.text={format:a}),n}function Pr(e){return null!=e}function Nr(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function qr(e){if("string"==typeof e)return e?[{type:"input_text",text:e}]:[];let t=[];for(let o of e??[])"text"===o.type?o.text&&t.push({type:"input_text",text:o.text}):t.push({type:"input_image",image_url:o.image_url.url,detail:"low"===o.image_url.detail?"low":"high"});return t}function jr(e){let t={prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens};return void 0!==e.input_tokens_details?.cached_tokens&&(t.prompt_tokens_details={cached_tokens:e.input_tokens_details.cached_tokens}),void 0!==e.output_tokens_details?.reasoning_tokens&&(t.completion_tokens_details={reasoning_tokens:e.output_tokens_details.reasoning_tokens}),t}function Dr(e,t){if("incomplete"===e.status){let t=e.incomplete_details?.reason;if("content_filter"===t)return"content_filter";if("max_output_tokens"===t)return"length"}return t?"tool_calls":"stop"}function Mr(e,t,o=null){let n=e.roleSent?t:{role:"assistant",...t};return e.roleSent=!0,{id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[{index:0,delta:n,logprobs:null,finish_reason:o}]}}function Hr(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Br(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Hr(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Mr(t,{tool_calls:[{index:r,function:{arguments:o.arguments}}]})]):[];let a=function(e,t,o){let n=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,n),e.toolCallIndexByOutputIndex.set(o,n),n}(t,o.id,e.output_index),i=n?o.arguments:"";return i&&t.toolCallsWithArgs.add(a),[Mr(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Ur(e,t){let o=[Mr(e,{},Dr(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=jr(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Fr(e,t){switch(e.type){case"response.created":case"response.in_progress":return t.id=e.response.id||t.id,t.model=e.response.model||t.model,e.response.created_at&&(t.created=e.response.created_at),{chunks:[]};case"response.output_text.delta":case"response.refusal.delta":return e.delta?{chunks:[Mr(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Br(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Hr(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Mr(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Ur(t,e.response),done:!0};case"response.failed":return{chunks:[],error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}};case"error":return{chunks:[],error:{type:e.code??"api_error",message:e.message??"Response generation failed"}};default:return{chunks:[]}}}const Lr="openai_responses";function Gr(e){let t=performance.now(),n=he.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),Rr(e)}finally{t.end()}});Be.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!Ir.has(e)&&null!=t).map(([e])=>e)}(e);return r.length>0&&o.debug(`Dropped chat-only fields with no Responses API equivalent: ${r.join(", ")}`),n}function Jr(e){let t=performance.now(),o=he.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",o=!1,n=[];for(let r of e.output)if("message"===r.type)for(let e of r.content)"output_text"===e.type?(t+=e.text,o=!0):"refusal"===e.type&&(t+=e.refusal,o=!0);else"function_call"===r.type&&n.push({id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments}});let r={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:o?t:null,...n.length>0&&{tool_calls:n}},logprobs:null,finish_reason:Dr(e,n.length>0)}]};return e.usage&&(r.usage=jr(e.usage)),r}(e)}finally{t.end()}});return Be.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Wr(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=jr(t.usage);a.tokenUsage=Dn(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(Jr(t))}async function zr(e,t,n){let r;try{r=Gr(t)}catch(t){if(t instanceof Or)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),X.manualApprove&&!n.isSelfTest&&await qn();let a=await jn(e);if(a)return a;let i=performance.now(),s=await Ar(r),l=performance.now()-i;if(De.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Er(s))return Wr(e,s,l);let{events:c,span:u,release:p}=s,m=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return D(e,async t=>{let n=null,a=0,s=performance.now(),d=sr(e,i);try{try{for await(let i of c){if(d(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Ie.add(1,{model:r.model,endpoint_type:Lr});let c=Cr(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Dn(c),t._d1=l,e.set("requestData",t)}let u=Fr(s,m);if(u.error)throw new Vn(u.error.type,u.error.message);for(let e of u.chunks)await t.writeSSE({data:JSON.stringify(e)});u.done&&await t.writeSSE({data:"[DONE]"})}let u={model:r.model,endpoint_type:Lr};Me.record(performance.now()-s,u),Je.record(a,u),lr(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await Zn(t,o),o}finally{n&&Mn(u,n),u.end(),p()}let f=e.get("requestId");f&&ce.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Kr(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 Vr(e){let t=!0===e.get("isSelfTest");t||await Kn(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=Wn(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),$e.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 Jn)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(zn(n.model))return zr(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),X.manualApprove&&!t&&await qn(),n=function(e){if(!fo(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!fo(e.max_tokens))return e;let t=(X.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return o.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(n),n=rr(n,X.models),fo(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await jn(e);if(r)return r;let a=performance.now(),i=await xr(n),s=performance.now()-a;if(De.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Yr(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Dn(i.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return D(e,async t=>{let o={value:null},r=0,i=performance.now(),p=sr(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Ie.add(1,{model:n.model,endpoint_type:"openai"}),i=Kr(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Dn(t),n._d1=s,e.set("requestData",n)})),await t.writeSSE(i)}let c=performance.now()-i,u={model:n.model,endpoint_type:"openai"};if(Me.record(c,u),Je.record(r,u),lr(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Dn(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw Ve(c,e.get("requestSpan"),o),await Zn(t,o),o}finally{o.value&&Mn(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ce.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Yr=e=>Object.hasOwn(e,"choices"),Xr=new q;Xr.post("/",async e=>{try{return await Vr(e)}catch(t){return await io(e,t)}});const Zr=new q;Zr.post("/",async e=>{try{let t=await e.req.json();try{t.model=Wn(t.model)}catch(t){if(t instanceof Jn)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=await jn(e);if(o)return o;let n=performance.now(),r=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=Lt(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 Ut("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Ke(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),a=performance.now()-n;De.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Dn(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await io(e,t)}});const Qr=new q;let ea=null,ta=null;function oa(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function na(e){return!oa(e)}Qr.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=ea;return t&&e-t.timestamp<3e4?{result:t.result}:ta||(ta=(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 ea={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return ea={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),ta=null}})(),ta)}();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.4",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 ra=new H(U),aa={...B["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function ia(e){try{return ra.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function sa(e){let t=0;for(let o of e)switch(o.type){case"text":t+=ia(o.text)*aa.contentMultiplier;break;case"tool_use":t+=ia(o.name+JSON.stringify(o.input))*aa.contentMultiplier;break;case"tool_result":o.content&&(t+=ia("string"==typeof o.content?o.content:JSON.stringify(o.content))*aa.contentMultiplier);break;case"thinking":t+=ia(o.thinking)*aa.contentMultiplier;break;case"image":t+=1600}return t}function la(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?aa.perFirstProp:aa.perAdditionalProp,t+=ia(o),r.description&&(t+=aa.perPropDesc+ia(r.description)),r.enum&&Array.isArray(r.enum)){t+=aa.perEnum;for(let e of r.enum)t+=ia(String(e))}if("object"===r.type&&r.properties&&(t+=aa.perNestedObject,t+=la(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=aa.perArrayOfObjects,t+=la(e))}}return t}function ca(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 ua(e,t,o){let n=ca(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const pa=async(e,t,n)=>{try{return await da(e,t)}catch(r){if(r instanceof Ut&&401===r.response.status)return await uo(),da(e,t);if(r instanceof Ut&&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}`),da(i,t)}throw r}};const da=async(e,t)=>{if(!X._t1)throw Error("Service token not found");let{metadata:o,...n}=En(e),r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...pt(X,t,r),"X-Initiator":"agent"},i=lt(X),s=`${i}/v1/messages`,l=X.timeoutMs,c=JSON.stringify(n),u=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",...ca(e,t?.anthropicBeta)}}(n,t,l);for(let e=0;e<=1;e++){let t=_r(i,{fresh:e>0}),r=new AbortController,p=Lt(r,l);try{let{statusCode:o,headers:i,body:p,span:d}=await et({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:a,body:c,signal:r.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(p,{status:o,headers:i});if(!m.ok)throw d.end(),new Ut("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:a});if(n.stream)return{events:M(m),span:d,release:()=>yr(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&&Mn(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(),yr(t)}}catch(o){if(yr(t),await Bt(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ma=new Set(["low","medium","high","max","xhigh"]);function fa(e,t,n){let r=t.includes(e.model)?e.model:Fn(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=Fn(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=Gn(t,n);if(!r||!ma.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 ha(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function ga(e,t){let o={model:e.model,messages:_a(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:va(e.tools),tool_choice:xa(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=or(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 er(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=rr({...o,thinking_budget:a},t)}}return o}function _a(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:ya(e)}]:[{role:"system",content:ya(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:ba(e.content)});n.length>0&&t.push({role:"user",content:ba(n)})}else t.push({role:"user",content:ba(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:wa(e.reasoning_text),reasoning_opaque:wa(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:ba(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:ba(e.content),...t}]}(e));return[...o,...n]}function ya(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const ka=32768;function wa(e){if("string"==typeof e)return e.length<=ka?e:e.slice(0,ka)}function ba(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 va(e){if(e)return e.filter(na).map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function xa(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 Ta(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 $a(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Aa(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 Sa=new Set(["low","medium","high","max","xhigh"]);function Ea(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&&Sa.has(e)?e:null)(Gn(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 Ca(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 Oa=/[^\w-]/g;function Ia(e){return e.replaceAll(Oa,"_")}function Ra(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=Ea(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:Ca(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:Ia(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Ia(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Pa(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 Na(e,t,o=400){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function qa(e,t){return he.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),ua(n,t,e.req.header("anthropic-beta"));let r=Wn(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Pa(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),$e.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 Jn)return{ok:!1,response:Na(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function ja(e){let t=function(e){let t=[];for(let o of e)"user"===o.role?t.push(...Ma(o)):t.push(...Ba(o));return t}(e.messages);if(0===t.length)throw new Ut("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(na).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:Da(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 Da(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Ma(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(Ha(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}`,detail:"high"});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 Ha(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 Ba(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 Ua(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 Fa(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function La(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 Ga(e,t){let o=[];switch(e.type){case"response.created":La(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){La(t,o),Fa(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":La(t,o),Fa(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":Fa(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":{Fa(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:Ua(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":{La(t,o),Fa(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":La(t,o),Fa(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":La(t,o),Fa(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":La(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 Ja(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 Wa(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function za(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&&(Ja(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&&(Ja(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Wa(t,o)),r.content&&(Wa(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){Wa(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&&(Wa(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:ha(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 Ka=/structured_outputs|output_config\.format/i;function Va(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Ka.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Ra({...e,model:Bn},o):null}var Ya=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Xa=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const Za={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 Ke(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Xa: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 Ke(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Ya:e}finally{clearTimeout(i)}}},Qa=["tavily","exa"];function ei(e){return"tavily"===e||"exa"===e}function ti(){return X.webSearchProviders.length>0}async function oi(e,t){return async function(e,t,n){let{providers:r,searchFns:a=Za}=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 ni(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function ri(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function ai(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&&oa(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(!ti())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await oi(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_${ni()}`,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:ri(e)}];return{id:`msg_ws_${ni()}`,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_${ni()}`,r=`msg_ws_${ni()}`,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:ri(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}),D(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const ii=(e,t)=>!(!e||!t||e===t);async function si(e){if(X._t1||await Po())return null;let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Eo()}`}},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))}function li(e,t){let o=t.model;return o&&"string"==typeof o?null:Na(e,"Model name is required and must be a string")}async function ci(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&oa(t[0])}(t))return li(e,t)??ai(e,t);await Kn(X),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=li(e,t);if(a)return a;t=function(e,t){return fa(t,X.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=qa(e,t);if(!i.ok)return i.response;t=i.payload;let s=await si(e);if(s)return s;if(zn(t.model))return mi(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t,o){let n=Ra(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:ii(o,a),streaming:!!n.stream}),X.manualApprove&&await qn(),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),ua(t,n,r.anthropicBeta);try{let o=performance.now(),a=await pa(n,r,{onStructuredOutputFallback:(e,o)=>{let n=Va(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(De.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=Dn(pi(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 D(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=sr(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"}),di(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"};Me.record(e,t),Je.record(a,t)}catch(t){throw Ve(l,e.get("requestSpan"),t),await Xn(r,t),t}finally{if(lr(e,o),p){let t=pi(u);Mn(l,t);let o=e.get("requestData")||{};o.tokenUsage=Dn(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 Ke(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=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),ga(t,X.models)}finally{o.end()}});Be.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=rr(c,X.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:ii(r,u),streaming:!!c.stream});let p=performance.now();X.manualApprove&&await qn();let d=await xr(c),m=performance.now()-p;if(De.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),ui(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=Dn(d.usage)),t._d1=m,t.upstreamTtfbMs=m,t.upstreamTotalMs=m,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(d).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=$a(a.message),i=Ta(a.message.content),s=Aa(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:ha(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(d);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return 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:f,span:h,release:g}=d;return D(e,async t=>{let n=null,r=0,a=performance.now(),i=sr(e,p),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of f){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let l;try{l=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:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=Dn(n),t._d1=m,e.set("requestData",t)}let u=za(l,s);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let l=performance.now()-a,u={model:c.model,endpoint_type:"anthropic"};if(Me.record(l,u),Je.record(r,u),lr(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Dn(n),t._d1=m,e.set("requestData",t))}}catch(o){throw Ve(h,e.get("requestSpan"),o),await Xn(t,o),o}finally{n&&Mn(h,n),h.end(),g()}let l=e.get("requestId");l&&ce.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const ui=e=>Object.hasOwn(e,"choices");function pi(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 di(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 mi(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),ja(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 qn();let i=performance.now(),s=await Ar(a),l=performance.now()-i;if(De.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Er(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Dn({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)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:Ua(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 D(e,async t=>{let n=null,r=0,s=performance.now(),d=sr(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=Cr(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Dn(n),t._d1=l,e.set("requestData",t)}let u=Ga(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"};Me.record(u,p),Je.record(r,p),lr(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await Xn(t,o),o}finally{n&&Mn(u,n),u.end(),p()}let f=e.get("requestId");f&&ce.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const fi=new q;fi.post("/",async e=>{try{return await ci(e)}catch(t){return await io(e,t)}});const hi=new q;function gi(e){return he.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Wn(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),$e.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 _i(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=Dn(o),n._d1=t._d1,t.c.set("requestData",n)}hi.get("/",async e=>{try{X.models||await ho();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 io(e,t)}});const yi=new Set(["message","function_call","function_call_output"]),ki=new Set(["type","name","description","parameters"]);async function wi(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||!ti())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await oi(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function bi(e){if(ti())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await wi(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function vi(e){if(!ti())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 wi(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function xi(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 yi.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Ti(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 $i(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&&Ti(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)Ti(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Ai(e){return null!=e}function Si(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Ei(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Ci(e){let t={model:e.model},{input:o,droppedInputTypes:n}=function(e){if(!Array.isArray(e))return{input:e,droppedInputTypes:[]};let t=new Set,o=[];for(let n of e){if(!Si(n)){o.push(n);continue}let e=xi(n);null===e?t.add(Ei(n.type)):o.push(e)}return{input:o,droppedInputTypes:[...t]}}(e.input);void 0!==o&&(t.input=o);for(let o of["previous_response_id","prompt","conversation","instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])Ai(e[o])&&(t[o]=e[o]);let r=new Set;if(Ai(e.tools)){let o=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let o=e.type;if("web_search"===o||o.startsWith("web_search_"))return{type:e.type};let n={};for(let t of Object.keys(e))ki.has(t)&&(n[t]=e[t]);return"custom"===n.type&&(n.type="function",t.add(n.name),n.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),n}),customToolNames:t}}(e.tools);t.tools=o.tools,r=o.customToolNames}if(Ai(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Ai(o.effort)&&(t.reasoning.effort=o.effort),Ai(o.summary)&&(t.reasoning.summary=o.summary)}if(Ai(e.text)&&"object"==typeof e.text){let o=e.text;Ai(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Oi(e,t){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Ii(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=d.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||Ai(n.previous_response_id)||Ai(n.prompt)||Ai(n.conversation)?null:Oi(e,`input contains no supported items: every item was dropped (unsupported item types: ${r.join(", ")}). Provide at least one message, function_call or function_call_output item, or previous_response_id, prompt or conversation.`)}async function Ri(e){if(X._t1)return null;if(!await Po()){let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Eo()}`,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 Pi(e){await Kn(X);let t=await e.req.json();if(!Si(t))return Oi(e,"request body must be a JSON object");let n=Ci(t),{customToolNames:r}=n,a=n.payload;o.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),r.size>0&&o.debug(`Custom tools detected: ${[...r].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:gi(t)}}catch(t){if(t instanceof Jn)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,a);if(!i.ok)return i.response;a=i.payload;let s=Ii(e,t.input,n);if(s)return s;let l=await Ri(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),X.manualApprove&&await qn();let c=performance.now(),u=await Ar(a),p=performance.now()-c;if(De.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Ni(u))return async function(e,t,o){await bi(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Dn({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,u,p);let{events:d,span:m,release:f}=u;return D(e,async t=>{let o={value:null},n=0,i=performance.now(),s=sr(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=$i(i.data,r);s=await vi(s);let l=s===i.data?i:{...i,data:s};Ie.add(1,{model:a.model,endpoint_type:"responses"}),_i(s,{usageRef:o,c:e,_d1:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};Me.record(l,u),Je.record(n,u),lr(e,c)}catch(o){throw Ve(m,e.get("requestSpan"),o),await Zn(t,o),o}finally{o.value&&Mn(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ce.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Ni=e=>Object.hasOwn(e,"output"),qi=new q;qi.post("/",async e=>{try{return await Pi(e)}catch(t){return await io(e,t)}});const ji=new q;ji.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 Di=new q;Di.get("/",async e=>{try{let t=await Vo();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Mi=new q;function Hi(){return function(e){let t=e.filter(e=>Rn(e));if(0===t.length)return;let o=t.find(e=>In.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(X.models?.data??[])}function Bi(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 Sn(o).slice(0,200)}catch{}let t=Sn(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 Ui(e={}){let t=performance.now(),o=e.model&&function(e){let t=X.models?.data.find(t=>t.id===e);return void 0!==t&&Rn(t)}(e.model)?e.model:Hi();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 Mi.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[Cn]:On},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:Bi(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)}}Mi.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===On}(e.req.header(Cn));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>Nn?t.slice(0,Nn):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(()=>Pn(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{}}):Pn(y)}),Mi.use(j()),Mi.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()}),Mi.get("/",e=>e.text("Server running")),Mi.route("/health",Qr),Mi.route("/chat/completions",Xr),Mi.route("/models",hi),Mi.route("/embeddings",Zr),Mi.route("/usage",Di),Mi.route("/token",ji),Mi.route("/v1/chat/completions",Xr),Mi.route("/v1/models",hi),Mi.route("/v1/embeddings",Zr),Mi.route("/v1/messages",fi),Mi.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=aa.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=aa.perMessage+ia(e)*aa.contentMultiplier}for(let e of t.messages)o+=aa.perMessage,o+=ia(e.role),"string"==typeof e.content?o+=ia(e.content)*aa.contentMultiplier:Array.isArray(e.content)&&(o+=sa(e.content));let n=t.tools?.filter(na);return n&&n.length>0&&(o+=function(e){let t=aa.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=aa.perTool),t+=ia(n.name),n.description&&(t+=aa.perDesc+ia(n.description)),t+=la(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),Mi.route("/v1/responses",qi),Mi.route("/responses",qi),Mi.onError((e,t)=>io(t,e));const Fi=e=>`${e}`,Li=e=>`${e}`,Gi=e=>`${e}`,Ji=e=>`${e}`,Wi=e=>`${e}`,zi=Li(" ─────────────────────────────────────────────────────────────");function Ki(e,t,o){console.log(` ${function(e){return"ok"===e?Gi("✓"):"warn"===e?Wi("⚠"):Ji("✗")}(e)} ${Fi(t.padEnd(14))} ${o}`)}function Vi(e){console.log(` ${Li("↳")} ${Li(e)}`)}function Yi(e){return e instanceof Ut?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function Xi(){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(z.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 Zi(){try{await ho();let e=(X.models?.data.length??0)>0;return Ki(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 Ki("fail","Model catalog",Yi(e)),Vi("Could not fetch /models — check connectivity/auth."),!1}}async function Qi(e){X.accountType=e.accountType;let t=await St(),o=Et();if(console.log(""),console.log(` ${Fi("COPILOT-API DOCTOR")} ${Li(`v${t}`)}`),console.log(zi),Ki("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await K(),go(),!await async function(){let e=await Xi();if(!e)return Ki("fail","Auth token","not found"),void Vi("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");X._t2=e.token,Ki("ok","Auth token",`found (${e.source})`);try{let e=await lo();return await st(X,e.login),Ki("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return Ki("fail","GitHub auth",Yi(e)),void Vi("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(zi),console.log(` ${Ji("✗")} ${Fi("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await so();return X._t1=e,Ki("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Ut?e.response.status:0;return Ki("fail","Service token",Yi(e)),Vi(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 Zi();await async function(){try{let e=await Vo(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Lo(Go(t))} of ${Lo(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;Ki("ok","Copilot plan",`${e.copilot_plan} · ${o} `+Li(`(resets ${e.quota_reset_date})`))}catch(e){Ki("warn","Copilot plan",`unavailable (${Yi(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Ui();return e.ok?(Ki("ok","Generation",`works via ${e.model} ${Li(`(${e.durationMs}ms)`)}`),!0):(Ki("fail","Generation",`${e.reason}${e.status?Li(` [HTTP ${e.status}]`):""}`),!1)}():Ki("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){Ki(t,"Client config","potential base-URL issue");for(let t of e)Vi(t)}else Ki("ok","Client config","no base-URL issues detected");Vi("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(zi),a?(console.log(` ${Gi("✓")} ${Fi("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Wi("⚠")} ${Fi("Some checks need attention")} — see the ${Ji("✗")}/${Wi("⚠")} lines above.`),console.log(""),2)}const es=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 Qi({accountType:e["account-type"]});g.exit(t)}});function ts(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 os=!1;const ns="copilot-api-node20",rs=`https://registry.npmjs.org/${ns}/latest`,as=e=>`${e}`,is=e=>`${e}`;async function ss(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(rs,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function ls(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 cs(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 us=e=>`${e}`,ps=e=>`${e}`,ds=e=>`${e}`,ms=e=>`${e}`,fs=e=>`${e}`,hs=e=>`${e}`,gs=(e,t)=>`]8;;${e}\\${t}]8;;\\`,_s="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",ys="https://github.com/johnib/copilot-api-issues/issues",ks=ps(" ─────────────────────────────────────────────────────────────");function ws(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function bs(e){return e&&0!==e.length?e.join("·"):"—"}const vs=[{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 xs(e){if(0===e.length)return[];let t=["",ks,` ${us("BARAZANY.DEV")} ${ps("— Recent Posts")}`,ks,""];for(let[o,n]of e.entries()){let e=`${n.url}${_s}`,r=gs(e,us(hs(`[${o+1}]`)));t.push(` ${r} ${ds(n.title)}`,` ${ps("→")} ${ps(n.teaser)}`,"")}return t.push(ks,` ${gs(`https://barazany.dev/blog${_s}`,"barazany.dev/blog")}`,ks),t}function Ts(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(ps(" → "))} ${ms("✓")}`:ps("off"),n=["",` ${us("COPILOT-API")} ${ps(`v${e.version}`)}`,ks,` ${ps("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${ps("User")} ${e.user} ${ps("·")} ${e.accountType}`];return X._v1&&n.push(` ${ps("Client")} VSCode ${X._v1}`),n.push(` ${ps("Network")} ${t.join(ps(" · "))}`,` ${ps("Search")} ${o}`),e.clipboardCopied&&n.push(` ${ps("Clipboard")} Claude Code command ${ms("✓")}`),n.push(ks),n}function $s(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${us("Active")}`];if(e.model){let o=X.models?.data.find(t=>t.id===e.model),n=ws(o?.capabilities.limits?.max_context_window_tokens),r=bs(o?.capabilities.supports.reasoning_effort);t.push(` ${ds(e.model.padEnd(32))} ${ps("ctx")} ${us(n.padStart(5))} ${ps("effort")} ${ps(r)} ${fs("← main")}`)}if(e.smallModel){let o=X.models?.data.find(t=>t.id===e.smallModel),n=ws(o?.capabilities.limits?.max_context_window_tokens),r=bs(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${ps("ctx")} ${n.padStart(5)} ${ps("effort")} ${ps(r)} ${fs("← small")}`)}return t}function As(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("",` ${us(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?ds("●"):ps("·"),i=n?ds(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?ws(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${bs(r.effort)}`;t.push(` ${a} ${i} ${ps(s)}${ps(l)}`)}}return t}function Ss(){let e=ys.replace(/^https:\/\//,""),t=gs(`${ys}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",ks,` ${us("FOUND A BUG?")} ${ps("— Report it on GitHub")}`,ks,"",` ${ds("→")} ${ds(t)}`,` ${ps("Bug reports, feature requests, and questions welcome.")}`,"",ks]}function Es(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=["",ks,` ${us("Claude Cowork")} ${ps("— Settings → Inference Provider")}`,ks,"",` ${ps("Paste into")} ${us("inferenceGatewayBaseUrl")}${ps(":")}`,` ${us(ds(r))}`];return n||a.push("",` ${ps("Your Tailscale hostname is shown by:")} ${ds("tailscale status --self")}`),a.push("",` ${ps("Docs:")} ${ds("https://claude.com/docs/cowork/3p/installation")}`),a}function Cs(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",ks,` ${us("HTTPS")} ${ps("— self-signed cert")}`,ks,"",` ${ps("Cert")} ${t}`];switch(o.push("",` ${us("Trust this cert")} ${ps("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${ps("macOS:")}`,` ${ds("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${ds(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${ps("Windows (PowerShell as Administrator):")}`,` ${ds(`Import-Certificate -FilePath "${t}" \``)}`,` ${ds("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${ps("Linux (Debian/Ubuntu):")}`,` ${ds(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${ds("sudo update-ca-certificates")}`,` ${ps("Linux (Fedora/RHEL/Arch):")}`,` ${ds(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${ds("sudo update-ca-trust")}`);break;default:o.push(` ${ps("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${ps("Or, for Node CLIs only (no admin needed):")}`,` ${ds(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,ks),o}function Os(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 Is=s.join(z.APP_DIR,"certs"),Rs=s.join(Is,"cert.pem"),Ps=s.join(Is,"key.pem"),Ns=s.join(Is,"cert.meta.json");async function qs(e){try{return await a.readFile(e,"utf8")}catch{return}}async function js(e){let t=await qs(Rs),o=await qs(Ps),n=await async function(){let e=await qs(Ns);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 Ds(e){return 0!==G(e)}async function Ms(e){await a.mkdir(Is,{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)Ds(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 J([{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(Rs,l.cert,{mode:420}),await a.writeFile(Ps,l.private,{mode:384}),await async function(e){await a.writeFile(Ns,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:Rs,keyPath:Ps,generated:!0}}const Hs=[],Bs=Date.now();let Us="";function Fs(){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()-Bs)/1e3}});for(let t of Hs)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=gs("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",ks,` ${us("COPILOT-API")} ${ps(`v${e}`)} ${ps("·")} ${Os(t)} uptime`,ks,""," Check in from time to time on",` ${ds(o)}`,"",ks,""];console.log(n.join("\n"))}(Us,Date.now()-Bs),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 Ls(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function Gs(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:Ls(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()-Bs},"copilot_api")});if(X.models?.data)for(let e of X.models.data)a.addEvent("copilot_api.model.available",Ye(e,"model"));a.end(),ze(_.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()-Bs},"copilot_api"))}async function Js(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 js(e)){let e=await qs(Rs),t=await qs(Ps);if(e&&t)return{cert:e,key:t,certPath:Rs,keyPath:Ps,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Ms(e)}(e.httpsHosts)}}async function Ws(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=_n;try{F(t),F(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(Fs(),Hs.push(()=>{o.debug("Cleaning up connectivity monitor"),tt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),To=!1,yo&&=void clearInterval(yo),wo&&=void tt.off("online",wo),bo&&=void tt.off("offline",bo),ko=void 0,vo=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),mr&&=void clearInterval(mr),fr&&=void clearInterval(fr);let e=[...ur.keys(),...pr];ur.clear(),pr.clear(),cr.clear(),dr=void 0;for(let t of e)hr(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 K(),go();let n=await St();Us=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 $({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new T({exporter:new w({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x({exporter:new k({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),ue.start()})(n,Bs),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?(function(e){X._t2=e,$o=!1}(i),o.info("Using provided Auth token")):await qo();try{a=await lo(),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 so();X._t1=e,o.debug("Service token fetched successfully!"),X.showToken&&o.info("Service token:",e),To=!0,No(t),tt.start(),wo=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Ro(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},bo=()=>{o.debug("Network connectivity lost")},tt.on("online",wo),tt.on("offline",bo)})(),await async function(){try{return await ho(),!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(()=>{ho().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{ho().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)}}();Hs.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),X.connectivity.h2&&(yr(_r(lt(X))),X.connectivity.h2Keepalive&&wr()),Gs({options:t,version:n,runtime:r,_u1:a});let l=await Js(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=cs({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=cs({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=[...Ts(e),...$s(e),...As(e),...Ss(),"",...xs(vs),...Es(e),...Cs(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 rn()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),L({fetch:Mi.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 Ui({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: ${Sn(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 zs(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Ks=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:zs(t,"--rate-limit"),r=e.timeout,a=void 0===r?Y:zs(r,"--timeout"),i=e["connect-timeout"]??g.env.COPILOT_CONNECT_TIMEOUT_MS,s=void 0===i?15e3:zs(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(!ei(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${Qa.join(", ")}`);let r=n.length>0?n:Qa,a=new Set,i=n.length>0,s=[];for(let e of r){if(!ei(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 Ws({port:zs(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})}});os||(os=!0,o.setReporters([ts(o.options.reporters)])),await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([St(),ss()]);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 ${ns}@latest`,n=is("│"),r=` ${as("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,a=` Run ${as(o)} to update`,i=" ".repeat(54),s=is(`╭${"─".repeat(54)}╮`),l=is(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${ls(r,54)}${n}`,`${n}${i}${n}`,`${n}${ls(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(e,t)}catch{}}();const Vs=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Mo,start:Ks,"check-usage":Qo,debug:It,doctor:es,"cowork-setup":An}});await t(Vs);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 x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as T}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}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 R,randomUUID as P}from"node:crypto";import{promisify as N}from"node:util";import{Hono as q}from"hono";import{cors as j}from"hono/cors";import{streamSSE as D}from"hono/streaming";import{events as M}from"fetch-event-stream";import{Tokenizer as H,models as B}from"ai-tokenizer";import*as U from"ai-tokenizer/encoding/claude";import{accessSync as F}from"node:fs";import{serve as L}from"srvx";import{isIP as G}from"node:net";import{generate as J}from"selfsigned";const W=s.join(i.homedir(),".local","share","copilot-api"),z={APP_DIR:W,GITHUB_TOKEN_PATH:s.join(W,"github_token"),MACHINE_ID_PATH:s.join(W,"machine_id"),SESSION_ID_PATH:s.join(W,"session_id")};async function K(){await a.mkdir(z.APP_DIR,{recursive:!0}),await V(z.GITHUB_TOKEN_PATH),await V(z.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),ze(_.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"}),xe=ge.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Te=ge.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),$e=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"}),Re=ge.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Pe=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)"}),je=ge.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),De=ge.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Me=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"}),Ue=ge.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Fe=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"}),Je=ge.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),We=ge.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function ze(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 Ke(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){Ke(e,o),t&&t!==e&&Ke(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 Ke(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 Ke(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,Fe.record(r,{endpoint:e,result:"success"});break}Fe.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"}),ze(_.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"}),ze(_.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`${z.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(R(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(z.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=P();return await a.writeFile(z.SESSION_ID_PATH,e),await a.chmod(z.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=P(),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":P(),"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 xt(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 Tt(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 $t(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&&Tt(e,"copilot_api.incoming_request_body",n);let r=At(t.c.req.header());return r&&Tt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&Tt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Tt(e,"copilot_api.outgoing_headers",At(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Tt(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(z.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(z.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:z.APP_DIR,GITHUB_TOKEN_PATH:z.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})}),Rt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Pt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Nt=new Set;let qt;function jt(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(Rt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Pt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function Dt(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const Mt=new WeakSet;function Ht(e){return"object"==typeof e&&!!e&&Mt.has(e)}async function Bt(e,{attempt:t,maxRetries:n,operation:r}){return!!Dt(e)&&(t>=n?(function(e){"object"==typeof e&&e&&Mt.add(e)}(e),!1):(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0))}var Ut=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Ft=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Lt(e,t){return setTimeout(()=>e.abort(new Ft(t)),t)}const Gt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Jt=RegExp(`\\b(?:${[...Gt].join("|")})\\b`);function Wt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function zt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Wt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function Kt(e){let t=e.code;return"string"==typeof t?t:void 0}function Vt(e){if(void 0===e.cause)return"";let t=zt(e);if(t===e)return"";let o=Kt(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function Yt(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=>Gt.has(e))||!(t.length>0)&&(!!o.some(e=>Jt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Xt(e){return e.req.path.startsWith("/v1/messages")}function Zt(e,t){if(Xt(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 Qt(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 eo(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 to(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 oo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=xt({endpointType:_t(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});$t(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function no(e,t,o){let n=e.get("requestId"),r=ce.completionCallbacks.get(n);r&&(ce.logError(r,t,o),ce.completionCallbacks.delete(n))}function ro(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"),function(e,t){Ht(t)&&e?.setAttribute("copilot_api.transport_reason","h2_retry_exhausted")}(o,t);let n=t instanceof Error?zt(t):void 0,r=(n&&Kt(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.";ze(_.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=Xt(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return no(e,503,t instanceof Error?`${t.message}${Vt(t)}`:i),e.json(s,503)}function ao(e){return Ht(e)||Yt(e)||function(e){return Dt(e)||e instanceof Error&&Dt(e.cause)}(e)}async function io(e,t){if(t instanceof Ut&&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)),xe.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=Zt(a,e),s=Qt(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),eo(o,s),ze(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...to(s)}),oo({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"),ze(_.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=Xt(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 no(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Ut)return async function(e,t){let o=d.getActiveSpan(),n=await t.response.text(),r=Zt(n,e),a=Qt(r);return no(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"),eo(o,a),ze(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...to(a)}),oo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&jt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:xt({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 Ft||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Ft}(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.";ze(_.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=Xt(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return no(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(ao(t))return ro(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),ze(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),jt({route:e.req.path,statusCode:500,errorClass:r.name,signature:xt({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(r)}`}),no(e,500,r.message),o.error(r);let a=Xt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const so=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 Ut("Failed to get Service token",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function lo(){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 Ut("Failed to get GitHub user",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let co=null;function uo(){return co||=so().then(({token:e})=>{X._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{co=null}),co}const po=async()=>{let e=`${lt(X)}/models`,t=ct(X),o=X.timeoutMs,n=new AbortController,r=Lt(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 Ut("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Ke(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const mo=e=>new Promise(t=>{setTimeout(t,e)}),fo=e=>null==e;async function ho(){let e=await(async()=>{try{return await po()}catch(e){if(e instanceof Ut&&401===e.response.status)return await uo(),po();throw e}})();X.models=e}const go=()=>{X._v1="1.140.0-insider"};var _o=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let yo,wo,ko,bo,vo,xo=!1,To=!1,$o=!1;function Ao(){return So()?vo:void 0}function So(){return void 0!==vo&&Date.now()-vo.at<6e4}function Eo(){return $o?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const Co=()=>a.readFile(z.GITHUB_TOKEN_PATH,"utf8");function Oo(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,vo={status:s,message:l,at:Date.now()},clearInterval(yo),yo=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),Ue.record(performance.now()-a,{reason:r}),ze(_.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 Io(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}),Ue.record(performance.now()-a,{reason:r}),ze(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Ro=async(e=5,t=1e3,n="scheduled")=>xo?(o.debug("Token refresh already in progress, coalescing"),wo):(xo=!0,wo=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,refresh_in:s}=await so();return X._t1=t,vo=void 0,To&&void 0===yo&&(o.info("Token refresh recovered, resuming scheduled refresh"),No(s)),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"}),Ue.record(performance.now()-a,{reason:n}),void ze(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Ut&&(401===s.response.status||403===s.response.status))return void Oo({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 Io({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(),xo=!1,wo=void 0}}),wo);async function Po(){return!!X._t1||!So()&&(void 0!==vo&&$o&&await async function(){if(wo)return;let e=(await Co().catch(()=>{}))?.trim();e&&e!==X._t2?.trim()&&(X._t2=e,o.info("Picked up re-authenticated Auth token from disk"),X.showToken&&o.info("Auth token:",e))}(),await Ro(3,250,"on-demand"),!!X._t1)}function No(e){yo&&clearInterval(yo);let t=Math.max(1e3*(e-60),6e4);yo=setInterval(()=>{Ro(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function qo(e){try{let t=await Co();if(t&&!e?.force)return X._t2=t,$o=!0,X.showToken&&o.info("Auth token:",t),void await jo();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 Ut("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 _o("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 mo(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 _o("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new _o("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 mo(t);continue}if(r.access_token)return r.access_token;await mo(t)}catch(e){if(e instanceof _o)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await mo(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(z.GITHUB_TOKEN_PATH,e,{mode:384}))(r),X._t2=r,$o=!0,X.showToken&&o.info("Auth token:",r),await jo()}catch(e){throw e instanceof Ut?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function jo(){let e=await lo();o.success(`Authenticated as ${e.login}`)}async function Do(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),X.showToken=e.showToken,await K(),await qo({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 Mo=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})=>Do({verbose:e.verbose,showToken:e["show-token"]})}),Ho=.01,Bo=864e5,Uo=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Fo=new Intl.NumberFormat("en-US"),Lo=e=>Uo.format(e*Ho),Go=e=>e.credits_used??e.entitlement-e.remaining,Jo=(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())/Bo;if(r<.5)return;let a=Go(e),i=a*Ho/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Ho,c=new Date(n.getTime()+l/i*Bo);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Wo=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Fo.format(Go(e))} of ${Fo.format(e.entitlement)} used`:"n/a",zo=e=>e.padEnd(14),Ko=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${zo("AI credits")}unlimited`);else{let e=Go(o),t=o.percent_remaining;n.push(`${zo("AI credits")}${Lo(e)} / ${Lo(o.entitlement)} ${t.toFixed(1)}% left`,`${zo("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${zo("")}${Fo.format(e)} of ${Fo.format(o.entitlement)} credits`)}if(n.push("",`${zo("Chat")}${Wo(e.quota_snapshots.chat)}`,`${zo("Completions")}${Wo(e.quota_snapshots.completions)}`,"",`${zo("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Bo)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=Jo(o,e.quota_reset_date,t);r&&n.push(`${zo("Burn rate")}~${Uo.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?`${Fo.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${zo("Overage")}${a}`)}return n.join("\n")},Vo=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 Ut("Failed to get usage",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Yo=()=>g.stdout.write(""),Xo=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Zo=async()=>{let e=await Vo();return Ko(e)},Qo=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 K(),await qo(),!e.watch){try{o.box(await Zo())}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 Zo();n&&Yo(),o.box(e),o.log(Xo(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),en=N(f);async function tn(){let e="win32"===g.platform?"where.exe":"which";try{return await en(e,["tailscale"]),!0}catch{return!1}}async function on(){try{let{stdout:e}=await en("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function nn(e){return e.replace(/\.$/,"")}async function rn(){let e=await on();if(e?.Online)return nn(e.DNSName)}const an=N(f),sn=e=>`${e}`,ln=e=>`${e}`,cn=e=>`${e}`,un=e=>`${e}`,pn=e=>`${e}`,dn=e=>`${e}`,mn=ln(" ─────────────────────────────────────────────────────────────"),fn=s.join(z.APP_DIR,"certs","tailscale"),hn=s.join(fn,"cert.pem"),gn=s.join(fn,"key.pem"),_n={certDir:fn,certPath:hn,keyPath:gn};function yn(){switch(g.platform){case"darwin":return[` ${ln("Install Tailscale for macOS:")}`,` ${cn("https://tailscale.com/download/mac")}`,` ${ln("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`,` ${ln("Then re-run this command.")}`].join("\n");case"linux":return[` ${ln("Install Tailscale for Linux:")}`,` ${cn("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${cn("sudo tailscale up")}`,` ${ln("or")} ${cn("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${ln("Install Tailscale for Windows:")}`,` ${cn("https://tailscale.com/download/windows")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${ln("Install Tailscale:")} ${cn("https://tailscale.com/download")}`}}function wn(){let e=[` ${pn("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${ln("Open the Tailscale app from Applications and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${ln("Open the Tailscale app and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/windows")}`):e.push(` ${ln("Connect with:")} ${cn("sudo tailscale up")}`),e.push("",` ${ln("Then re-run this command.")}`),e.join("\n")}async function kn(){try{return await a.access(hn),await a.access(gn),!0}catch{return!1}}function bn(e){console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Diagnostic")}`),console.log(mn),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?un("✅"):"missing"===n.status?pn("❌"):dn("❓");let r=n.detail?ln(` ${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(` ${un("All checks passed.")}`):console.log(` ${pn(`${t.length} issue(s).`)} Run ${cn("copilot-api cowork-setup install")} to fix.`),console.log("")}const vn={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},xn=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await tn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return bn(e),console.log(""),console.log(yn()),void console.log("");let o=await on();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},bn(e),console.log(wn()),void console.log("");let n=nn(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await kn();e["tailscale-cert"]=r?{status:"ok",detail:hn}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),bn(e)}(),g.exit(0)}}),Tn=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Install")}`),console.log(mn),console.log(""),!await tn())return console.log(` ${pn("Tailscale is not installed.")}`),console.log(""),console.log(yn()),console.log(""),console.log(` ${ln("After installing, run")} ${cn("tailscale up")} ${ln("to connect, then re-run this command.")}`),void console.log("");let t=await on();if(!t||!t.Online)return console.log(wn()),void console.log("");let n=nn(t.DNSName);if(console.log(` ${ln("Tailscale hostname:")} ${sn(n)}`),console.log(""),console.log(` ${sn("Generating TLS certificate via Tailscale…")}`),console.log(` ${ln("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${cn(`$ tailscale cert --cert-file ${hn} --key-file ${gn} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(fn,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await an("tailscale",["cert","--cert-file",hn,"--key-file",gn,n]),console.log(` ${un("✓ 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(mn),console.log(` ${sn("Next steps")}`),console.log(mn),console.log(""),console.log(` ${sn("1.")} Start the proxy:`),console.log(` ${cn("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${sn("2.")} In Cowork ${ln("→")} Settings ${ln("→")} Inference Provider, set:`),console.log(` ${sn("inferenceGatewayBaseUrl")} = ${cn(`https://${n}:<port>`)}`),console.log(` ${ln("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${sn("3.")} Restart Cowork ${ln("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${ln("For Cowork's own configuration docs, see:")}`),console.log(` ${cn("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),$n=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Revert")}`),console.log(mn),console.log(""),!await kn())return console.log(` ${ln("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${sn("Remove Tailscale cert files:")}`),console.log(` ${ln(hn)}`),console.log(` ${ln(gn)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(fn,{recursive:!0}),console.log(` ${un("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${ln("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),An=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:xn,install:Tn,revert:$n}});function Sn(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 En(e){if("string"==typeof e)return Sn(e);if(Array.isArray(e))return e.map(e=>En(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?En(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}const Cn="x-copilot-api-self-test",On=P();const In=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Rn(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 Pn(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),je.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 Nn=1048576;const qn=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),We.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Re.add(1,{result:"rejected"}),new Ut("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Re.add(1,{result:"approved"})}finally{e.end()}});async function jn(e){if(X._t1||await Po())return null;let t=Ao();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))}function Dn(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 Mn(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 Hn=[{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"}],Bn="claude-haiku-4.5",Un={haiku:Bn,"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 Fn(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of Hn)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=Un[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 Ln=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Gn(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=Ln.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=Ln.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var Jn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Wn(e){if(!e||"string"!=typeof e)throw new Jn("Model name is required and must be a string");if(!X.models?.data)throw new Jn("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=Fn(e,t);if(!o)throw Te.add(1,{requested_model:e}),new Jn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function zn(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)}async function Kn(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"),xe.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Ut("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),xe.add(1,{action:"waited",source:"local"}),He.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await mo(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Vn=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Yn(e){if(e instanceof Vn)return{type:e.type,message:e.message};if(e instanceof Ut){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 Xn(e,t){let{type:n,message:r}=Yn(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 Zn(e,t){let{type:n,message:r}=Yn(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 er(e,t,o){return Math.min(Math.max(e,t),o)}function tr(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 tr(JSON.parse(r),t+1)}catch{return null}}function or(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 nr(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=er(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 rr(e,t){if(fo(e.thinking_budget))return e;let o=or(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=nr({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 ar(e){return"invalid_thinking_budget"===tr(e)}async function ir(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(fo(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(!ar(i))return null;let l=or(n,t.model);return l?function(e,t){let o=nr({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 sr(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 lr(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const cr=new Map,ur=new Map,pr=new Set;let dr,mr,fr;function hr(e){return!e.closed&&!e.destroyed}function gr(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 cr.set(t,Date.now()),Ne.add(1,{event:"created",origin:e}),ze(_.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=pr.has(t);Ne.add(1,{event:"goaway",origin:e}),ze(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}),ur.delete(t),pr.delete(t),cr.delete(t),hr(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function _r(e,t){if(!X.connectivity.h2)return;if(dr&&dr!==e&&function(){for(let e of[...ur.keys(),...pr])hr(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});ur.clear(),pr.clear(),cr.clear()}(),dr=e,t?.fresh){let t=gr(e);return pr.add(t),t}let n=Date.now();for(let[t]of ur)if(n-(cr.get(t)??0)>=6e5)ur.delete(t),cr.delete(t),hr(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ne.add(1,{event:"rotated",origin:e}),ze(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(hr(t))return ur.delete(t),pr.add(t),t;ur.delete(t),cr.delete(t)}let r=gr(e);return pr.add(r),r}function yr(e){e&&pr.delete(e)&&(hr(e)?ur.set(e,Date.now()):cr.delete(e))}function wr(){fr||(fr=setInterval(()=>{!function(){let e=Date.now(),t=X.connectivity.h2Keepalive,n=ur.size;for(let[r,a]of ur)e-a<6e4||t&&n<=1||(ur.delete(r),cr.delete(r),n--,hr(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ne.add(1,{event:"idle_reaped",origin:dr??""}),ze(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${dr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":dr??""}))}()},3e4),fr.unref())}function kr(){mr||(o.debug("Starting HTTP/2 keepalive (every 45s)"),mr=setInterval(()=>{(async function(){if(0===ur.size&&0===pr.size){if(dr){let e=gr(dr);ur.set(e,Date.now())}return}let e=[...ur.keys()];for(let t of e)ur.delete(t);await Promise.allSettled(e.map(async e=>{if(hr(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:ct(X)});await n.dump(),Pe.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),ur.set(e,Date.now())}catch(t){Pe.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ne.add(1,{event:"error",origin:dr??""}),cr.delete(e),hr(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else cr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),mr.unref(),wr())}function br(e){return e.max_completion_tokens??e.max_tokens}async function vr(e,t,o){try{if(!e.ok)throw new Ut("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&&Mn(t,n.usage),n}catch(e){throw Ke(t,e),e}finally{t.end()}}const xr=async e=>{let t=En(e);try{return await Tr(t)}catch(e){if(e instanceof Ut&&401===e.response.status)return await uo(),Tr(t);let n;if(e instanceof Ut)try{n=await e.response.clone().text()}catch{n=void 0}let r=await ir({payload:t,error:e,models:X.models,errorBodyText:n});if(r)return e instanceof Ut&&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 Tr(En(r));throw e}},Tr=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)),o=e.messages.some(e=>["assistant","tool"].includes(e.role)),n={...ct(X,t),"X-Initiator":o?"agent":"user"},r=lt(X),a=`${r}/chat/completions`,i=X.timeoutMs,s=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=br(e);return null==i?a:{...a,max_completion_tokens:i}}(e,X.models),l=JSON.stringify(s),c={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":i,"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":br(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=_r(r,{fresh:t>0}),s=new AbortController,u=Lt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await et({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}),m=new Response(p,{status:r,headers:u});if(e.stream){if(!m.ok)throw d.end(),new Ut("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:M(m),span:d,release:()=>yr(o)}}try{return await vr(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{yr(o)}}catch(e){if(yr(o),await Bt(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function $r(e,t,o){try{if(!e.ok)throw new Ut("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&&Mn(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Ke(t,e),e}finally{t.end()}}const Ar=async e=>{try{return await Sr(e)}catch(t){if(t instanceof Ut&&401===t.response.status)return await uo(),Sr(e);throw t}},Sr=async e=>{if(!X._t1)throw Error("Service token not found");let t=En(e),o={...ct(X),"X-Initiator":"agent"},n=lt(X),r=`${n}/responses`,a=X.timeoutMs,i=JSON.stringify(t),s={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":a,"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 l=_r(n,{fresh:e>0}),c=new AbortController,u=Lt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await et({spanName:"copilot POST /responses",url:r,target:"responses",headers:o,body:i,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...s,"copilot_api.h2.retry_attempt":e},dispatcher:l}),m=new Response(p,{status:n,headers:u});if(t.stream){if(!m.ok)throw d.end(),new Ut("Failed to create responses",m,{outgoingBody:i,outgoingHeaders:o});return{events:M(m),span:d,release:()=>yr(l)}}try{return await $r(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{yr(l)}}catch(t){if(yr(l),await Bt(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Er=e=>Object.hasOwn(e,"output");function Cr(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}var Or=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const Ir=new Set(["model","messages","max_tokens","max_completion_tokens","temperature","top_p","stream","stream_options","tools","tool_choice","parallel_tool_calls","user","reasoning_effort","response_format"]);function Rr(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Or(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Or(`logprobs is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","logprobs")}(e);let t=function(e){return e.filter(e=>"system"===e.role||"developer"===e.role).map(e=>Nr(e.content)).filter(Boolean).join("\n\n")||void 0}(e.messages),o=function(e){let t=[];for(let o of e)switch(o.role){case"user":{let e=qr(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Nr(o.content);e&&t.push({type:"message",role:"assistant",content:[{type:"output_text",text:e}]});for(let e of o.tool_calls??[])t.push({type:"function_call",call_id:e.id,name:e.function.name,arguments:e.function.arguments});break}case"tool":t.push({type:"function_call_output",call_id:o.tool_call_id??"",output:Nr(o.content)})}return t}(e.messages);if(0===o.length)throw new Or("request has no translatable message content","invalid_request","messages");let n={model:e.model,input:o,store:!1};t&&(n.instructions=t);let r=e.max_completion_tokens??e.max_tokens;"number"==typeof r&&(n.max_output_tokens=Math.max(r,16)),e.stream&&(n.stream=!0),Pr(e.temperature)&&(n.temperature=e.temperature),Pr(e.top_p)&&(n.top_p=e.top_p),Pr(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),Pr(e.user)&&(n.user=e.user),e.reasoning_effort&&(n.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(n.tools=e.tools.filter(e=>"function"===e.type).map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters}))),e.tool_choice&&(n.tool_choice="string"==typeof e.tool_choice?e.tool_choice:{type:"function",name:e.tool_choice.function.name});let a=function(e){if(e)switch(e.type){case"json_schema":{let{name:t,description:o,schema:n,strict:r}=e.json_schema;return{type:"json_schema",name:t,description:o,schema:n,strict:r}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return a&&(n.text={format:a}),n}function Pr(e){return null!=e}function Nr(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function qr(e){if("string"==typeof e)return e?[{type:"input_text",text:e}]:[];let t=[];for(let o of e??[])if("text"===o.type)o.text&&t.push({type:"input_text",text:o.text});else{if("image_url"!==o.type)throw new Or(`content part type '${o.type}' is not supported for models served via the Responses API`,"unsupported_content_type","messages");t.push({type:"input_image",image_url:o.image_url.url,detail:"low"===o.image_url.detail?"low":"high"})}return t}function jr(e){let t={prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens};return void 0!==e.input_tokens_details?.cached_tokens&&(t.prompt_tokens_details={cached_tokens:e.input_tokens_details.cached_tokens}),void 0!==e.output_tokens_details?.reasoning_tokens&&(t.completion_tokens_details={reasoning_tokens:e.output_tokens_details.reasoning_tokens}),t}function Dr(e,t){if("incomplete"===e.status){let t=e.incomplete_details?.reason;if("content_filter"===t)return"content_filter";if("max_output_tokens"===t)return"length"}return t?"tool_calls":"stop"}function Mr(e,t,o=null){let n=e.roleSent?t:{role:"assistant",...t};return e.roleSent=!0,{id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[{index:0,delta:n,logprobs:null,finish_reason:o}]}}function Hr(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Br(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Hr(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Mr(t,{tool_calls:[{index:r,function:{arguments:o.arguments}}]})]):[];let a=function(e,t,o){let n=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,n),e.toolCallIndexByOutputIndex.set(o,n),n}(t,o.id,e.output_index),i=n?o.arguments:"";return i&&t.toolCallsWithArgs.add(a),[Mr(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Ur(e,t){let o=[Mr(e,{},Dr(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=jr(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Fr(e,t){switch(e.type){case"response.created":case"response.in_progress":return t.id=e.response.id||t.id,t.model=e.response.model||t.model,e.response.created_at&&(t.created=e.response.created_at),{chunks:[]};case"response.output_text.delta":case"response.refusal.delta":return e.delta?{chunks:[Mr(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Br(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Hr(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Mr(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Ur(t,e.response),done:!0};case"response.failed":return{chunks:[],error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}};case"error":return{chunks:[],error:{type:e.code??"api_error",message:e.message??"Response generation failed"}};default:return{chunks:[]}}}const Lr="openai_responses";function Gr(e){let t=performance.now(),n=he.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),Rr(e)}finally{t.end()}});Be.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!Ir.has(e)&&null!=t).map(([e])=>e)}(e);return r.length>0&&o.debug(`Dropped chat-only fields with no Responses API equivalent: ${r.join(", ")}`),n}function Jr(e){let t=performance.now(),o=he.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",o=!1,n=[];for(let r of e.output)if("message"===r.type)for(let e of r.content)"output_text"===e.type?(t+=e.text,o=!0):"refusal"===e.type&&(t+=e.refusal,o=!0);else"function_call"===r.type&&n.push({id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments}});let r={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:o?t:null,...n.length>0&&{tool_calls:n}},logprobs:null,finish_reason:Dr(e,n.length>0)}]};return e.usage&&(r.usage=jr(e.usage)),r}(e)}finally{t.end()}});return Be.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Wr(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=jr(t.usage);a.tokenUsage=Dn(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(Jr(t))}async function zr(e,t,n){let r;try{r=Gr(t)}catch(t){if(t instanceof Or)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),X.manualApprove&&!n.isSelfTest&&await qn();let a=await jn(e);if(a)return a;let i=performance.now(),s=await Ar(r),l=performance.now()-i;if(De.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Er(s))return Wr(e,s,l);let{events:c,span:u,release:p}=s,m=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return D(e,async t=>{let n=null,a=0,s=performance.now(),d=sr(e,i);try{try{for await(let i of c){if(d(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Ie.add(1,{model:r.model,endpoint_type:Lr});let c=Cr(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Dn(c),t._d1=l,e.set("requestData",t)}let u=Fr(s,m);if(u.error)throw new Vn(u.error.type,u.error.message);for(let e of u.chunks)await t.writeSSE({data:JSON.stringify(e)});u.done&&await t.writeSSE({data:"[DONE]"})}let u={model:r.model,endpoint_type:Lr};Me.record(performance.now()-s,u),Je.record(a,u),lr(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await Zn(t,o),o}finally{n&&Mn(u,n),u.end(),p()}let f=e.get("requestId");f&&ce.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Kr(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 Vr(e){let t=!0===e.get("isSelfTest");t||await Kn(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=Wn(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),$e.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 Jn)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(zn(n.model))return zr(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),X.manualApprove&&!t&&await qn(),n=function(e){if(!fo(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!fo(e.max_tokens))return e;let t=(X.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return o.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(n),n=rr(n,X.models),fo(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await jn(e);if(r)return r;let a=performance.now(),i=await xr(n),s=performance.now()-a;if(De.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Yr(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Dn(i.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return D(e,async t=>{let o={value:null},r=0,i=performance.now(),p=sr(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Ie.add(1,{model:n.model,endpoint_type:"openai"}),i=Kr(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Dn(t),n._d1=s,e.set("requestData",n)})),await t.writeSSE(i)}let c=performance.now()-i,u={model:n.model,endpoint_type:"openai"};if(Me.record(c,u),Je.record(r,u),lr(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Dn(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw Ve(c,e.get("requestSpan"),o),await Zn(t,o),o}finally{o.value&&Mn(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ce.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Yr=e=>Object.hasOwn(e,"choices"),Xr=new q;Xr.post("/",async e=>{try{return await Vr(e)}catch(t){return await io(e,t)}});const Zr=new q;Zr.post("/",async e=>{try{let t=await e.req.json();try{t.model=Wn(t.model)}catch(t){if(t instanceof Jn)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=await jn(e);if(o)return o;let n=performance.now(),r=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=Lt(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 Ut("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Ke(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),a=performance.now()-n;De.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Dn(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await io(e,t)}});const Qr=new q;let ea=null,ta=null;function oa(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function na(e){return!oa(e)}Qr.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=ea;return t&&e-t.timestamp<3e4?{result:t.result}:ta||(ta=(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 ea={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return ea={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),ta=null}})(),ta)}();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.5",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 ra=new H(U),aa={...B["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function ia(e){try{return ra.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function sa(e){let t=0;for(let o of e)switch(o.type){case"text":t+=ia(o.text)*aa.contentMultiplier;break;case"tool_use":t+=ia(o.name+JSON.stringify(o.input))*aa.contentMultiplier;break;case"tool_result":o.content&&(t+=ia("string"==typeof o.content?o.content:JSON.stringify(o.content))*aa.contentMultiplier);break;case"thinking":t+=ia(o.thinking)*aa.contentMultiplier;break;case"image":t+=1600}return t}function la(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?aa.perFirstProp:aa.perAdditionalProp,t+=ia(o),r.description&&(t+=aa.perPropDesc+ia(r.description)),r.enum&&Array.isArray(r.enum)){t+=aa.perEnum;for(let e of r.enum)t+=ia(String(e))}if("object"===r.type&&r.properties&&(t+=aa.perNestedObject,t+=la(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=aa.perArrayOfObjects,t+=la(e))}}return t}function ca(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 ua(e,t,o){let n=ca(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const pa=async(e,t,n)=>{try{return await da(e,t)}catch(r){if(r instanceof Ut&&401===r.response.status)return await uo(),da(e,t);if(r instanceof Ut&&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}`),da(i,t)}throw r}};const da=async(e,t)=>{if(!X._t1)throw Error("Service token not found");let{metadata:o,...n}=En(e),r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...pt(X,t,r),"X-Initiator":"agent"},i=lt(X),s=`${i}/v1/messages`,l=X.timeoutMs,c=JSON.stringify(n),u=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",...ca(e,t?.anthropicBeta)}}(n,t,l);for(let e=0;e<=1;e++){let t=_r(i,{fresh:e>0}),r=new AbortController,p=Lt(r,l);try{let{statusCode:o,headers:i,body:p,span:d}=await et({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:a,body:c,signal:r.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(p,{status:o,headers:i});if(!m.ok)throw d.end(),new Ut("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:a});if(n.stream)return{events:M(m),span:d,release:()=>yr(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&&Mn(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(),yr(t)}}catch(o){if(yr(t),await Bt(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ma=new Set(["low","medium","high","max","xhigh"]);function fa(e,t,n){let r=t.includes(e.model)?e.model:Fn(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=Fn(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=Gn(t,n);if(!r||!ma.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 ha(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function ga(e,t){let o={model:e.model,messages:_a(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:va(e.tools),tool_choice:xa(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=or(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 er(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=rr({...o,thinking_budget:a},t)}}return o}function _a(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:ya(e)}]:[{role:"system",content:ya(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:ba(e.content)});n.length>0&&t.push({role:"user",content:ba(n)})}else t.push({role:"user",content:ba(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:ka(e.reasoning_text),reasoning_opaque:ka(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:ba(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:ba(e.content),...t}]}(e));return[...o,...n]}function ya(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const wa=32768;function ka(e){if("string"==typeof e)return e.length<=wa?e:e.slice(0,wa)}function ba(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 va(e){if(e)return e.filter(na).map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function xa(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 Ta(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 $a(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Aa(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 Sa=new Set(["low","medium","high","max","xhigh"]);function Ea(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&&Sa.has(e)?e:null)(Gn(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 Ca(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 Oa=/[^\w-]/g;function Ia(e){return e.replaceAll(Oa,"_")}function Ra(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=Ea(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:Ca(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:Ia(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Ia(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Pa(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 Na(e,t,o=400){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function qa(e,t){return he.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),ua(n,t,e.req.header("anthropic-beta"));let r=Wn(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Pa(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),$e.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 Jn)return{ok:!1,response:Na(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function ja(e){let t=function(e){let t=[];for(let o of e)"user"===o.role?t.push(...Ma(o)):t.push(...Ba(o));return t}(e.messages);if(0===t.length)throw new Ut("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(na).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:Da(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 Da(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Ma(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(Ha(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}`,detail:"high"});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 Ha(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 Ba(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 Ua(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 Fa(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function La(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 Ga(e,t){let o=[];switch(e.type){case"response.created":La(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){La(t,o),Fa(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":La(t,o),Fa(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":Fa(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":{Fa(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:Ua(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":{La(t,o),Fa(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":La(t,o),Fa(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":La(t,o),Fa(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":La(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 Ja(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 Wa(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function za(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&&(Ja(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&&(Ja(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Wa(t,o)),r.content&&(Wa(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){Wa(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&&(Wa(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:ha(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 Ka=/structured_outputs|output_config\.format/i;function Va(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Ka.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Ra({...e,model:Bn},o):null}var Ya=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Xa=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const Za={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 Ke(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Xa: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 Ke(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Ya:e}finally{clearTimeout(i)}}},Qa=["tavily","exa"];function ei(e){return"tavily"===e||"exa"===e}function ti(){return X.webSearchProviders.length>0}async function oi(e,t){return async function(e,t,n){let{providers:r,searchFns:a=Za}=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 ni(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function ri(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function ai(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&&oa(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(!ti())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await oi(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_${ni()}`,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:ri(e)}];return{id:`msg_ws_${ni()}`,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_${ni()}`,r=`msg_ws_${ni()}`,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:ri(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}),D(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const ii=(e,t)=>!(!e||!t||e===t);async function si(e){if(X._t1||await Po())return null;let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Eo()}`}},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))}function li(e,t){let o=t.model;return o&&"string"==typeof o?null:Na(e,"Model name is required and must be a string")}async function ci(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&oa(t[0])}(t))return li(e,t)??ai(e,t);await Kn(X),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=li(e,t);if(a)return a;t=function(e,t){return fa(t,X.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=qa(e,t);if(!i.ok)return i.response;t=i.payload;let s=await si(e);if(s)return s;if(zn(t.model))return mi(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t,o){let n=Ra(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:ii(o,a),streaming:!!n.stream}),X.manualApprove&&await qn(),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),ua(t,n,r.anthropicBeta);try{let o=performance.now(),a=await pa(n,r,{onStructuredOutputFallback:(e,o)=>{let n=Va(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(De.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=Dn(pi(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 D(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=sr(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"}),di(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"};Me.record(e,t),Je.record(a,t)}catch(t){throw Ve(l,e.get("requestSpan"),t),await Xn(r,t),t}finally{if(lr(e,o),p){let t=pi(u);Mn(l,t);let o=e.get("requestData")||{};o.tokenUsage=Dn(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 Ke(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=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),ga(t,X.models)}finally{o.end()}});Be.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=rr(c,X.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:ii(r,u),streaming:!!c.stream});let p=performance.now();X.manualApprove&&await qn();let d=await xr(c),m=performance.now()-p;if(De.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),ui(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=Dn(d.usage)),t._d1=m,t.upstreamTtfbMs=m,t.upstreamTotalMs=m,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(d).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=$a(a.message),i=Ta(a.message.content),s=Aa(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:ha(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(d);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return 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:f,span:h,release:g}=d;return D(e,async t=>{let n=null,r=0,a=performance.now(),i=sr(e,p),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of f){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let l;try{l=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:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=Dn(n),t._d1=m,e.set("requestData",t)}let u=za(l,s);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let l=performance.now()-a,u={model:c.model,endpoint_type:"anthropic"};if(Me.record(l,u),Je.record(r,u),lr(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Dn(n),t._d1=m,e.set("requestData",t))}}catch(o){throw Ve(h,e.get("requestSpan"),o),await Xn(t,o),o}finally{n&&Mn(h,n),h.end(),g()}let l=e.get("requestId");l&&ce.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const ui=e=>Object.hasOwn(e,"choices");function pi(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 di(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 mi(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),ja(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 qn();let i=performance.now(),s=await Ar(a),l=performance.now()-i;if(De.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Er(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Dn({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)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:Ua(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 D(e,async t=>{let n=null,r=0,s=performance.now(),d=sr(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=Cr(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Dn(n),t._d1=l,e.set("requestData",t)}let u=Ga(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"};Me.record(u,p),Je.record(r,p),lr(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await Xn(t,o),o}finally{n&&Mn(u,n),u.end(),p()}let f=e.get("requestId");f&&ce.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const fi=new q;fi.post("/",async e=>{try{return await ci(e)}catch(t){return await io(e,t)}});const hi=new q;function gi(e){return he.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Wn(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),$e.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 _i(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=Dn(o),n._d1=t._d1,t.c.set("requestData",n)}hi.get("/",async e=>{try{X.models||await ho();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 io(e,t)}});const yi=new Set(["message","function_call","function_call_output"]),wi=new Set(["type","name","description","parameters"]);async function ki(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||!ti())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await oi(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function bi(e){if(ti())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await ki(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function vi(e){if(!ti())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 ki(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function xi(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 yi.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Ti(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 $i(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&&Ti(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)Ti(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Ai(e){return null!=e}function Si(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Ei(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Ci(e){let t={model:e.model},{input:o,droppedInputTypes:n}=function(e){if(!Array.isArray(e))return{input:e,droppedInputTypes:[]};let t=new Set,o=[];for(let n of e){if(!Si(n)){o.push(n);continue}let e=xi(n);null===e?t.add(Ei(n.type)):o.push(e)}return{input:o,droppedInputTypes:[...t]}}(e.input);void 0!==o&&(t.input=o);for(let o of["previous_response_id","prompt","conversation","instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])Ai(e[o])&&(t[o]=e[o]);let r=new Set;if(Ai(e.tools)){let o=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let o=e.type;if("web_search"===o||o.startsWith("web_search_"))return{type:e.type};let n={};for(let t of Object.keys(e))wi.has(t)&&(n[t]=e[t]);return"custom"===n.type&&(n.type="function",t.add(n.name),n.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),n}),customToolNames:t}}(e.tools);t.tools=o.tools,r=o.customToolNames}if(Ai(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Ai(o.effort)&&(t.reasoning.effort=o.effort),Ai(o.summary)&&(t.reasoning.summary=o.summary)}if(Ai(e.text)&&"object"==typeof e.text){let o=e.text;Ai(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Oi(e,t){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Ii(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=d.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||Ai(n.previous_response_id)||Ai(n.prompt)||Ai(n.conversation)?null:Oi(e,`input contains no supported items: every item was dropped (unsupported item types: ${r.join(", ")}). Provide at least one message, function_call or function_call_output item, or previous_response_id, prompt or conversation.`)}async function Ri(e){if(X._t1)return null;if(!await Po()){let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Eo()}`,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 Pi(e){await Kn(X);let t=await e.req.json();if(!Si(t))return Oi(e,"request body must be a JSON object");let n=Ci(t),{customToolNames:r}=n,a=n.payload;o.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),r.size>0&&o.debug(`Custom tools detected: ${[...r].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:gi(t)}}catch(t){if(t instanceof Jn)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,a);if(!i.ok)return i.response;a=i.payload;let s=Ii(e,t.input,n);if(s)return s;let l=await Ri(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),X.manualApprove&&await qn();let c=performance.now(),u=await Ar(a),p=performance.now()-c;if(De.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Ni(u))return async function(e,t,o){await bi(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Dn({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,u,p);let{events:d,span:m,release:f}=u;return D(e,async t=>{let o={value:null},n=0,i=performance.now(),s=sr(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=$i(i.data,r);s=await vi(s);let l=s===i.data?i:{...i,data:s};Ie.add(1,{model:a.model,endpoint_type:"responses"}),_i(s,{usageRef:o,c:e,_d1:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};Me.record(l,u),Je.record(n,u),lr(e,c)}catch(o){throw Ve(m,e.get("requestSpan"),o),await Zn(t,o),o}finally{o.value&&Mn(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ce.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Ni=e=>Object.hasOwn(e,"output"),qi=new q;qi.post("/",async e=>{try{return await Pi(e)}catch(t){return await io(e,t)}});const ji=new q;ji.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 Di=new q;Di.get("/",async e=>{try{let t=await Vo();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Mi=new q;function Hi(){return function(e){let t=e.filter(e=>Rn(e));if(0===t.length)return;let o=t.find(e=>In.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(X.models?.data??[])}function Bi(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 Sn(o).slice(0,200)}catch{}let t=Sn(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 Ui(e={}){let t=performance.now(),o=e.model&&function(e){let t=X.models?.data.find(t=>t.id===e);return void 0!==t&&Rn(t)}(e.model)?e.model:Hi();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 Mi.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[Cn]:On},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:Bi(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)}}Mi.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===On}(e.req.header(Cn));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>Nn?t.slice(0,Nn):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(()=>Pn(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{}}):Pn(y)}),Mi.use(j()),Mi.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()}),Mi.get("/",e=>e.text("Server running")),Mi.route("/health",Qr),Mi.route("/chat/completions",Xr),Mi.route("/models",hi),Mi.route("/embeddings",Zr),Mi.route("/usage",Di),Mi.route("/token",ji),Mi.route("/v1/chat/completions",Xr),Mi.route("/v1/models",hi),Mi.route("/v1/embeddings",Zr),Mi.route("/v1/messages",fi),Mi.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=aa.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=aa.perMessage+ia(e)*aa.contentMultiplier}for(let e of t.messages)o+=aa.perMessage,o+=ia(e.role),"string"==typeof e.content?o+=ia(e.content)*aa.contentMultiplier:Array.isArray(e.content)&&(o+=sa(e.content));let n=t.tools?.filter(na);return n&&n.length>0&&(o+=function(e){let t=aa.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=aa.perTool),t+=ia(n.name),n.description&&(t+=aa.perDesc+ia(n.description)),t+=la(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),Mi.route("/v1/responses",qi),Mi.route("/responses",qi),Mi.onError((e,t)=>io(t,e));const Fi=e=>`${e}`,Li=e=>`${e}`,Gi=e=>`${e}`,Ji=e=>`${e}`,Wi=e=>`${e}`,zi=Li(" ─────────────────────────────────────────────────────────────");function Ki(e,t,o){console.log(` ${function(e){return"ok"===e?Gi("✓"):"warn"===e?Wi("⚠"):Ji("✗")}(e)} ${Fi(t.padEnd(14))} ${o}`)}function Vi(e){console.log(` ${Li("↳")} ${Li(e)}`)}function Yi(e){return e instanceof Ut?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function Xi(){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(z.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 Zi(){try{await ho();let e=(X.models?.data.length??0)>0;return Ki(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 Ki("fail","Model catalog",Yi(e)),Vi("Could not fetch /models — check connectivity/auth."),!1}}async function Qi(e){X.accountType=e.accountType;let t=await St(),o=Et();if(console.log(""),console.log(` ${Fi("COPILOT-API DOCTOR")} ${Li(`v${t}`)}`),console.log(zi),Ki("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await K(),go(),!await async function(){let e=await Xi();if(!e)return Ki("fail","Auth token","not found"),void Vi("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");X._t2=e.token,Ki("ok","Auth token",`found (${e.source})`);try{let e=await lo();return await st(X,e.login),Ki("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return Ki("fail","GitHub auth",Yi(e)),void Vi("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(zi),console.log(` ${Ji("✗")} ${Fi("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await so();return X._t1=e,Ki("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Ut?e.response.status:0;return Ki("fail","Service token",Yi(e)),Vi(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 Zi();await async function(){try{let e=await Vo(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Lo(Go(t))} of ${Lo(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;Ki("ok","Copilot plan",`${e.copilot_plan} · ${o} `+Li(`(resets ${e.quota_reset_date})`))}catch(e){Ki("warn","Copilot plan",`unavailable (${Yi(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Ui();return e.ok?(Ki("ok","Generation",`works via ${e.model} ${Li(`(${e.durationMs}ms)`)}`),!0):(Ki("fail","Generation",`${e.reason}${e.status?Li(` [HTTP ${e.status}]`):""}`),!1)}():Ki("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){Ki(t,"Client config","potential base-URL issue");for(let t of e)Vi(t)}else Ki("ok","Client config","no base-URL issues detected");Vi("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(zi),a?(console.log(` ${Gi("✓")} ${Fi("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Wi("⚠")} ${Fi("Some checks need attention")} — see the ${Ji("✗")}/${Wi("⚠")} lines above.`),console.log(""),2)}const es=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 Qi({accountType:e["account-type"]});g.exit(t)}});function ts(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 os=!1;const ns="copilot-api-node20",rs=`https://registry.npmjs.org/${ns}/latest`,as=e=>`${e}`,is=e=>`${e}`;async function ss(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(rs,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function ls(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 cs(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 us=e=>`${e}`,ps=e=>`${e}`,ds=e=>`${e}`,ms=e=>`${e}`,fs=e=>`${e}`,hs=e=>`${e}`,gs=(e,t)=>`]8;;${e}\\${t}]8;;\\`,_s="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",ys="https://github.com/johnib/copilot-api-issues/issues",ws=ps(" ─────────────────────────────────────────────────────────────");function ks(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function bs(e){return e&&0!==e.length?e.join("·"):"—"}const vs=[{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 xs(e){if(0===e.length)return[];let t=["",ws,` ${us("BARAZANY.DEV")} ${ps("— Recent Posts")}`,ws,""];for(let[o,n]of e.entries()){let e=`${n.url}${_s}`,r=gs(e,us(hs(`[${o+1}]`)));t.push(` ${r} ${ds(n.title)}`,` ${ps("→")} ${ps(n.teaser)}`,"")}return t.push(ws,` ${gs(`https://barazany.dev/blog${_s}`,"barazany.dev/blog")}`,ws),t}function Ts(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(ps(" → "))} ${ms("✓")}`:ps("off"),n=["",` ${us("COPILOT-API")} ${ps(`v${e.version}`)}`,ws,` ${ps("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${ps("User")} ${e.user} ${ps("·")} ${e.accountType}`];return X._v1&&n.push(` ${ps("Client")} VSCode ${X._v1}`),n.push(` ${ps("Network")} ${t.join(ps(" · "))}`,` ${ps("Search")} ${o}`),e.clipboardCopied&&n.push(` ${ps("Clipboard")} Claude Code command ${ms("✓")}`),n.push(ws),n}function $s(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${us("Active")}`];if(e.model){let o=X.models?.data.find(t=>t.id===e.model),n=ks(o?.capabilities.limits?.max_context_window_tokens),r=bs(o?.capabilities.supports.reasoning_effort);t.push(` ${ds(e.model.padEnd(32))} ${ps("ctx")} ${us(n.padStart(5))} ${ps("effort")} ${ps(r)} ${fs("← main")}`)}if(e.smallModel){let o=X.models?.data.find(t=>t.id===e.smallModel),n=ks(o?.capabilities.limits?.max_context_window_tokens),r=bs(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${ps("ctx")} ${n.padStart(5)} ${ps("effort")} ${ps(r)} ${fs("← small")}`)}return t}function As(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("",` ${us(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?ds("●"):ps("·"),i=n?ds(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?ks(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${bs(r.effort)}`;t.push(` ${a} ${i} ${ps(s)}${ps(l)}`)}}return t}function Ss(){let e=ys.replace(/^https:\/\//,""),t=gs(`${ys}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",ws,` ${us("FOUND A BUG?")} ${ps("— Report it on GitHub")}`,ws,"",` ${ds("→")} ${ds(t)}`,` ${ps("Bug reports, feature requests, and questions welcome.")}`,"",ws]}function Es(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=["",ws,` ${us("Claude Cowork")} ${ps("— Settings → Inference Provider")}`,ws,"",` ${ps("Paste into")} ${us("inferenceGatewayBaseUrl")}${ps(":")}`,` ${us(ds(r))}`];return n||a.push("",` ${ps("Your Tailscale hostname is shown by:")} ${ds("tailscale status --self")}`),a.push("",` ${ps("Docs:")} ${ds("https://claude.com/docs/cowork/3p/installation")}`),a}function Cs(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",ws,` ${us("HTTPS")} ${ps("— self-signed cert")}`,ws,"",` ${ps("Cert")} ${t}`];switch(o.push("",` ${us("Trust this cert")} ${ps("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${ps("macOS:")}`,` ${ds("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${ds(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${ps("Windows (PowerShell as Administrator):")}`,` ${ds(`Import-Certificate -FilePath "${t}" \``)}`,` ${ds("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${ps("Linux (Debian/Ubuntu):")}`,` ${ds(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${ds("sudo update-ca-certificates")}`,` ${ps("Linux (Fedora/RHEL/Arch):")}`,` ${ds(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${ds("sudo update-ca-trust")}`);break;default:o.push(` ${ps("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${ps("Or, for Node CLIs only (no admin needed):")}`,` ${ds(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,ws),o}function Os(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 Is=s.join(z.APP_DIR,"certs"),Rs=s.join(Is,"cert.pem"),Ps=s.join(Is,"key.pem"),Ns=s.join(Is,"cert.meta.json");async function qs(e){try{return await a.readFile(e,"utf8")}catch{return}}async function js(e){let t=await qs(Rs),o=await qs(Ps),n=await async function(){let e=await qs(Ns);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 Ds(e){return 0!==G(e)}async function Ms(e){await a.mkdir(Is,{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)Ds(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 J([{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(Rs,l.cert,{mode:420}),await a.writeFile(Ps,l.private,{mode:384}),await async function(e){await a.writeFile(Ns,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:Rs,keyPath:Ps,generated:!0}}const Hs=[],Bs=Date.now();let Us="";function Fs(){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()-Bs)/1e3}});for(let t of Hs)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=gs("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",ws,` ${us("COPILOT-API")} ${ps(`v${e}`)} ${ps("·")} ${Os(t)} uptime`,ws,""," Check in from time to time on",` ${ds(o)}`,"",ws,""];console.log(n.join("\n"))}(Us,Date.now()-Bs),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 Ls(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function Gs(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:Ls(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()-Bs},"copilot_api")});if(X.models?.data)for(let e of X.models.data)a.addEvent("copilot_api.model.available",Ye(e,"model"));a.end(),ze(_.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()-Bs},"copilot_api"))}async function Js(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 js(e)){let e=await qs(Rs),t=await qs(Ps);if(e&&t)return{cert:e,key:t,certPath:Rs,keyPath:Ps,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Ms(e)}(e.httpsHosts)}}async function Ws(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=_n;try{F(t),F(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(Fs(),Hs.push(()=>{o.debug("Cleaning up connectivity monitor"),tt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),To=!1,yo&&=void clearInterval(yo),ko&&=void tt.off("online",ko),bo&&=void tt.off("offline",bo),wo=void 0,vo=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),mr&&=void clearInterval(mr),fr&&=void clearInterval(fr);let e=[...ur.keys(),...pr];ur.clear(),pr.clear(),cr.clear(),dr=void 0;for(let t of e)hr(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 K(),go();let n=await St();Us=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 $({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new T({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x({exporter:new w({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),ue.start()})(n,Bs),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?(function(e){X._t2=e,$o=!1}(i),o.info("Using provided Auth token")):await qo();try{a=await lo(),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 so();X._t1=e,o.debug("Service token fetched successfully!"),X.showToken&&o.info("Service token:",e),To=!0,No(t),tt.start(),ko=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Ro(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},bo=()=>{o.debug("Network connectivity lost")},tt.on("online",ko),tt.on("offline",bo)})(),await async function(){try{return await ho(),!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(()=>{ho().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{ho().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)}}();Hs.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),X.connectivity.h2&&(yr(_r(lt(X))),X.connectivity.h2Keepalive&&kr()),Gs({options:t,version:n,runtime:r,_u1:a});let l=await Js(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=cs({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=cs({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=[...Ts(e),...$s(e),...As(e),...Ss(),"",...xs(vs),...Es(e),...Cs(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 rn()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),L({fetch:Mi.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 Ui({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: ${Sn(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 zs(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Ks=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:zs(t,"--rate-limit"),r=e.timeout,a=void 0===r?Y:zs(r,"--timeout"),i=e["connect-timeout"]??g.env.COPILOT_CONNECT_TIMEOUT_MS,s=void 0===i?15e3:zs(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(!ei(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${Qa.join(", ")}`);let r=n.length>0?n:Qa,a=new Set,i=n.length>0,s=[];for(let e of r){if(!ei(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 Ws({port:zs(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})}});os||(os=!0,o.setReporters([ts(o.options.reporters)])),await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([St(),ss()]);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 ${ns}@latest`,n=is("│"),r=` ${as("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,a=` Run ${as(o)} to update`,i=" ".repeat(54),s=is(`╭${"─".repeat(54)}╮`),l=is(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${ls(r,54)}${n}`,`${n}${i}${n}`,`${n}${ls(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(e,t)}catch{}}();const Vs=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Mo,start:Ks,"check-usage":Qo,debug:It,doctor:es,"cowork-setup":An}});await t(Vs);export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "copilot-api-node20",
3
- "version": "0.42.4",
3
+ "version": "0.42.5",
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",