copilot-api-node20 0.44.0-preview.6 → 0.44.0-preview.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.mjs +1 -1
- package/package.json +1 -1
package/dist/main.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{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 O,request as C}from"undici";import{createHash as I,randomBytes as P,randomUUID as R}from"node:crypto";import{promisify as N}from"node:util";import{Hono as q}from"hono";import{cors as D}from"hono/cors";import{streamSSE as j}from"hono/streaming";import{events as M}from"fetch-event-stream";import{Tokenizer as F,models as H}from"ai-tokenizer";import*as U from"ai-tokenizer/encoding/claude";import B,{accessSync as L}from"node:fs";import{serve as z}from"srvx";import{isIP as G}from"node:net";import{generate as K}from"selfsigned";const J=s.join(i.homedir(),".local","share","copilot-api"),W={APP_DIR:J,GITHUB_TOKEN_PATH:s.join(J,"github_token"),MACHINE_ID_PATH:s.join(J,"machine_id"),SESSION_ID_PATH:s.join(J,"session_id")};async function Y(){await a.mkdir(W.APP_DIR,{recursive:!0}),await V(W.GITHUB_TOKEN_PATH),await V(W.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 X=6e5,Z={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:X,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}},Q=" │ ",ee=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()},te=(e,t)=>e.padEnd(t),oe=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ne=(e,t,o)=>` --\x3e ${te(e,4)} ${te(t,21)} ${te(o,3)}`,re=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return te(t,22)})(e.model??"—")+te(t,8)},ae=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ee(Math.max(t-o,0)):"—",r=e?ee(e.outputTokens??0):"—",a=o?ee(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},ie=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${te("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ee(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},se=e=>{if(void 0===e.ttfbMs)return`e2e ${oe(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${oe(e.ttfbMs)} → e2e ${oe(e.e2eMs)} ${t}`},le=e=>e?Z.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,ce=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}}),ue={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=>[ne(e.method,e.path,e.status),re(e),ae(e.tokenUsage),ie(e.tokenUsage,e.maxContextTokens),se({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(Q))({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:le(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),We(_.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)},...ce(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=>[ne(e.method,e.path,"429"),re(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${oe(e.e2eMs)}`].join(Q))({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=ne(e.method,e.path,e.status.toString()),o=re(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${oe(e.e2eMs)}`].join(Q)})({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(()=>ue.cleanup(),6e4);let pe,de,me=Date.now();const fe={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function he(){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):fe;return{endpoint:e.replace(/\/$/,""),headers:t}}const ge=d.getTracer("copilot-api"),_e=p.getMeter("copilot-api"),ye=y.getLogger("copilot-api"),we=_e.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),ke=_e.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),be=_e.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),ve=_e.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),xe=_e.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Te=_e.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),$e=_e.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ae=_e.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Se=_e.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Ee=_e.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Oe=_e.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Ce=_e.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Ie=_e.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Pe=_e.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Re=_e.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ne=_e.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),qe=_e.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),De=_e.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),je=_e.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Me=_e.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Fe=_e.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),He=_e.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Ue=_e.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Be=_e.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Le=_e.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),ze=_e.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Ge=_e.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Ke=_e.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),Je=_e.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function We(e,t,o,n,r){let a=d.getActiveSpan()?.spanContext()??r;ye.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function Ye(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){Ye(e,o),t&&t!==e&&Ye(t,o)}function Xe(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,Xe(r,e)))}return o}_e.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!ot.getConnectivityStats().isOnline)}),_e.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(ot.getConnectivityStats().consecutiveFailures)}),_e.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(Z.models?.data.length??0)}),_e.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ue.completionCallbacks.size)}),_e.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-me)/1e3)});const Ze=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function Qe(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Ze.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function et(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:u}=e,p=ge.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&Qe(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();Ze.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),Ie.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 Ye(p,e),p.end(),e}}async function tt(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=ge.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Qe(f,"request",a);try{let{statusCode:e,headers:t,body:l}=await C(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&&!Ze.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Ie.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 Ye(f,e),f.end(),e}}const ot=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:Z.connectivity.probeEndpoints,fastInterval:Z.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?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval)+Math.random()*Z.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ge.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),Z.connectivity.timeoutMs);try{let n=!1;for(let e of Z.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",...Z.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Le.record(r,{endpoint:e,result:"success"});break}Le.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),Oe.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"}),We(_.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"}),We(_.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?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*Z.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:Z.connectivity.jitterMaxMs>0,connectionPooling:Z.connectivity.connectionPooling,dnsCache:Z.connectivity.dnsCache}}},nt=()=>({"content-type":"application/json",accept:"application/json"}),rt="0.48.1",at=`copilot-chat/${rt}`,it=`GitHubCopilotChat/${rt}`,st=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`${W.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=I("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},lt=async(e,t)=>{e.machineId||=await st(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(W.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(W.SESSION_ID_PATH,e),await a.chmod(W.SESSION_ID_PATH,384),e})()},ct=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,ut=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=R(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":at,"User-Agent":it,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":R(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},pt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const dt=(e,t,o)=>{let n=ut(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&&pt.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},mt="https://api.github.com",ft=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":at,"user-agent":it,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),ht="https://github.com",gt="01ab8ac9400c4e429b23",_t=["user:email"].join(" ");function yt(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 wt=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_***"},{regex:/\bapi-key["']?\s*[:=]\s*["']?[\w-]{20,}/gi,mask:"api-key: ***"}],bt=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function vt(e){let t=e;for(let{regex:e,mask:o}of kt)t=t.replace(e,o);return t}const xt=new Map;function Tt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function $t(e,t,o){let n=vt(o),r=8*wt,a=n.length>r,i=a?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(i.length<=wt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=wt)e.setAttribute(`${t}.part_${o/wt}`,i.slice(o,o+wt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/wt))}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 At(e,t){let o=function(e){if(xt.size>=1e3&&!xt.has(e)){let e=xt.keys().next().value;void 0!==e&&xt.delete(e)}let t,o=(xt.get(e)??0)+1;return xt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",De.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",o),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===o)return{decision:o};if("suppressed"===o)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:o};let n=t.c.get("rawBody");n&&$t(e,"copilot_api.incoming_request_body",n);let r=St(t.c.req.header());return r&&$t(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&$t(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&$t(e,"copilot_api.outgoing_headers",St(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&$t(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function St(e){let t={};for(let[o,n]of Object.entries(e))bt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Et(){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 Ot(){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(W.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(W.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function It(e){let t=await async function(){let[e,t]=await Promise.all([Et(),Ct()]);return{version:e,runtime:Ot(),paths:{APP_DIR:W.APP_DIR,GITHUB_TOKEN_PATH:W.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 Pt=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})=>It({json:e.json})}),Rt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Nt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",qt=new Set;let Dt;function jt(e){if(Z.errorReporting&&!(e.statusCode<500)&&!qt.has(e.signature)){if(qt.size>=1e3){let e=qt.values().next().value;void 0!==e&&qt.delete(e)}qt.add(e.signature),async function(e){Dt??=Et();let t=await Dt,o=Ot(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(vt(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:yt(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":Nt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function Mt(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 Ft=new WeakSet;async function Ht(e,{attempt:t,maxRetries:n,operation:r}){return Mt(e)&&t<n?(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&Ft.add(e)}(e),!1)}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}},Bt=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Lt(e,t){return setTimeout(()=>e.abort(new Bt(t)),t)}const zt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Gt=RegExp(`\\b(?:${[...zt].join("|")})\\b`);function Kt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function Jt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Kt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function Wt(e){let t=e.code;return"string"==typeof t?t:void 0}function Yt(e){if(void 0===e.cause)return"";let t=Jt(e);if(t===e)return"";let o=Wt(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function Vt(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=>zt.has(e))||!(t.length>0)&&(!!o.some(e=>Gt.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=Tt({endpointType:yt(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});At(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function no(e,t,o){let n=e.get("requestId"),r=ue.completionCallbacks.get(n);r&&(ue.logError(r,t,o),ue.completionCallbacks.delete(n))}async function ro(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=ue.completionCallbacks.get(n);r&&(ue.logRateLimit(r,t.response),ue.completionCallbacks.delete(n)),Te.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),We(_.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}),function(e,t){t.headers.forEach((t,o)=>{ao.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const ao=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;function io(e,t){(function(e){return"object"==typeof e&&!!e&&Ft.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",Z.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function so(e){return Vt(e)||function(e){return Mt(e)||e instanceof Error&&Mt(e.cause)}(e)}async function lo(e,t){if(io(d.getActiveSpan(),t),t instanceof Ut&&429===t.response.status)return ro(e,t);if(t instanceof SyntaxError){d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),We(_.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),We(_.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:Tt({endpointType:yt(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 Bt||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Bt}(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.";We(_.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(so(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?Jt(t):void 0,r=(n&&Wt(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.";We(_.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}${Yt(t)}`:i),e.json(s,503)}(e,t);let n=d.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:c.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),We(_.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:Tt({endpointType:yt(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${Yt(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 co=async()=>{let e=`${mt}/copilot_internal/v2/token`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:ft(Z),signal:o.signal});try{if(!t.ok)throw new Ut("Failed to get Service token",t);return await t.json()}catch(e){throw Ye(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function uo(){let e=`${mt}/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${Z.githubToken}`,"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 Ye(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let po=null;function mo(){return"foundry"===Z.provider?Promise.resolve():(po||=co().then(({token:e})=>{Z.copilotToken=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{po=null}),po)}function fo(e,t="FOUNDRY_ENDPOINT"){let o,n=e.trim();try{o=new URL(n)}catch{throw Error(`${t} is not a valid URL: "${n}"`)}if("https:"!==o.protocol)throw Error(`${t} must use https, got: "${n}"`);let r=o.pathname.replace(/\/+$/,"").replace(/\/(?:\u006f\u0070\u0065\u006e\u0061\u0069|\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063)(?:\/v1)?$/i,"");return`${o.origin}${r}`}const ho=/^([\w-]+)\.(?:\u006f\u0070\u0065\u006e\u0061\u0069\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function go(e){let t=new URL(e),o=ho.exec(t.hostname)?.[1];return o?`https://${o}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function _o(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,o]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:o||t}});return t.length>0?t:void 0}const yo=e=>({"api-key":e.apiKey,"Content-Type":"application/json",accept:"*/*"}),wo=e=>`${e.anthropicEndpoint}/anthropic`,ko=(e,t)=>({"x-api-key":e.apiKey,"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),bo=e=>"foundry"===e.provider;function vo(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const xo=e=>bo(e)?(e=>`${e.endpoint}/openai/v1`)(vo(e)):ct(e),To=(e,t=!1)=>bo(e)?yo(vo(e)):ut(e,t),$o=e=>bo(e)?!!e.foundry?.apiKey:!!e.copilotToken;function Ao(e,t){let o=(e??t??"copilot").trim().toLowerCase();if("copilot"===o||"foundry"===o)return o;throw Error(`--provider must be "copilot" or "foundry", got: "${o}"`)}const So=[{pattern:/^gpt-6/,context:105e4,output:128e3},{pattern:/^gpt-5/,context:4e5,output:128e3},{pattern:/^gpt-4\.1/,context:1047576,output:32768},{pattern:/^o\d/,context:2e5,output:1e5}],Eo={context:128e3,output:16384};function Oo(e){return So.find(({pattern:t})=>t.test(e))??Eo}const Co=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,Io=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function Po(e,t){return{id:e.id,name:e.id,object:"model",vendor:t.vendor,version:e.model,preview:!1,model_picker_enabled:!0,supported_endpoints:t.supported_endpoints,capabilities:{family:e.model,object:"model_capabilities",type:"chat",tokenizer:"o200k_base",limits:t.limits&&{max_context_window_tokens:t.limits.context,max_output_tokens:t.limits.output},supports:{tool_calls:!0,parallel_tool_calls:!0}}}}async function Ro(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=Lt(o,Z.timeoutMs);try{let{response:n,span:r}=await et({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:yo(e),signal:o.signal});try{if(!n.ok)throw new Ut("Failed to list Foundry deployments",n);let e=(await n.json()).data.filter(e=>!e.status||"succeeded"===e.status).map(e=>({id:e.id,model:e.model}));return r.setAttribute("copilot_api.models_count",e.length),e}catch(e){throw Ye(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function No(e){return{object:"list",data:(e.deployments??await Ro(e)).map(e=>function(e){let{model:t}=e;if(!Co.test(t))return(e=>/embedding/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/embeddings"],capabilities:{family:t,object:"model_capabilities",type:"embeddings",tokenizer:"cl100k_base",supports:{}}}:(e=>/^\u0063\u006c\u0061\u0075\u0064\u0065/i.test(e))(t)?Po(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):Io(t)?Po(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:Oo(t)}):Po(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:Oo(t)})}(e)).filter(e=>void 0!==e)}}const qo=async()=>{let e=`${xo(Z)}/models`,t=To(Z),o=Z.timeoutMs,n=new AbortController,r=Lt(n,o);try{let{response:o,span:r}=await et({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 Ye(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const Do=e=>new Promise(t=>{setTimeout(t,e)}),jo=e=>null==e;async function Mo(){let e=await(async()=>{if(bo(Z)&&Z.foundry)return No(Z.foundry);try{return await qo()}catch(e){if(e instanceof Ut&&401===e.response.status)return await mo(),qo();throw e}})();Z.models=e}const Fo=()=>{Z.vsCodeVersion="1.140.0-insider"};var Ho=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Uo,Bo,Lo,zo,Go,Ko=!1,Jo=!1,Wo=!1;function Yo(){return Vo()?Go:void 0}function Vo(){return void 0!==Go&&Date.now()-Go.at<6e4}function Xo(){return Wo?"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 Zo=()=>a.readFile(W.GITHUB_TOKEN_PATH,"utf8");function Qo(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";Z.copilotToken=void 0,Go={status:s,message:l,at:Date.now()},clearInterval(Uo),Uo=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Se.add(1,{reason:r,success:"false"}),Ee.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),Be.record(performance.now()-a,{reason:r}),We(_.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 en(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;Z.copilotToken=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),Ee.add(1,{reason:r}),Be.record(performance.now()-a,{reason:r}),We(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const tn=async(e=5,t=1e3,n="scheduled")=>Ko?(o.debug("Token refresh already in progress, coalescing"),Bo):(Ko=!0,Bo=ge.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 co();return Z.copilotToken=t,Go=void 0,Jo&&void 0===Uo&&(o.info("Token refresh recovered, resuming scheduled refresh"),nn(s)),o.debug("Service token refreshed successfully"),Z.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Se.add(1,{reason:n,success:"true"}),Be.record(performance.now()-a,{reason:n}),void We(_.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 Qo({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),Se.add(1,{reason:n,success:"false"}),l)return void en({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(),Ko=!1,Bo=void 0}}),Bo);async function on(){return!!Z.copilotToken||!Vo()&&(void 0!==Go&&Wo&&await async function(){if(Bo)return;let e=(await Zo().catch(()=>{}))?.trim();e&&e!==Z.githubToken?.trim()&&(Z.githubToken=e,o.info("Picked up re-authenticated Auth token from disk"),Z.showToken&&o.info("Auth token:",e))}(),await tn(3,250,"on-demand"),!!Z.copilotToken)}function nn(e){Uo&&clearInterval(Uo);let t=Math.max(1e3*(e-60),6e4);Uo=setInterval(()=>{tn(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function rn(e){try{let t=await Zo();if(t&&!e?.force)return Z.githubToken=t,Wo=!0,Z.showToken&&o.info("Auth token:",t),void await an();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=Z.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${ht}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:gt,scope:_t}),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 Ho("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=Z.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${ht}/login/oauth/access_token`,{method:"POST",headers:nt(),body:JSON.stringify({client_id:gt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await Do(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 Ho("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Ho("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 Do(t);continue}if(r.access_token)return r.access_token;await Do(t)}catch(e){if(e instanceof Ho)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await Do(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(W.GITHUB_TOKEN_PATH,e,{mode:384}))(r),Z.githubToken=r,Wo=!0,Z.showToken&&o.info("Auth token:",r),await an()}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 an(){let e=await uo();o.success(`Authenticated as ${e.login}`)}async function sn(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),Z.showToken=e.showToken,await Y(),await rn({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 ln=e({meta:{name:"auth",description:"Run authentication flow"},args:{verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"show-token":{type:"boolean",default:!1,description:"Show token on auth"}},run:({args:e})=>sn({verbose:e.verbose,showToken:e["show-token"]})}),cn=.01,un=864e5,pn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),dn=new Intl.NumberFormat("en-US"),mn=e=>pn.format(e*cn),fn=e=>e.credits_used??e.entitlement-e.remaining,hn=(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())/un;if(r<.5)return;let a=fn(e),i=a*cn/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*cn,c=new Date(n.getTime()+l/i*un);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},gn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${dn.format(fn(e))} of ${dn.format(e.entitlement)} used`:"n/a",_n=e=>e.padEnd(14),yn=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${_n("AI credits")}unlimited`);else{let e=fn(o),t=o.percent_remaining;n.push(`${_n("AI credits")}${mn(e)} / ${mn(o.entitlement)} ${t.toFixed(1)}% left`,`${_n("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${_n("")}${dn.format(e)} of ${dn.format(o.entitlement)} credits`)}if(n.push("",`${_n("Chat")}${gn(e.quota_snapshots.chat)}`,`${_n("Completions")}${gn(e.quota_snapshots.completions)}`,"",`${_n("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/un)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=hn(o,e.quota_reset_date,t);r&&n.push(`${_n("Burn rate")}~${pn.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?`${dn.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${_n("Overage")}${a}`)}return n.join("\n")},wn=async()=>{let e=`${mt}/copilot_internal/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:ft(Z),signal:o.signal});try{if(!t.ok)throw new Ut("Failed to get usage",t);return await t.json()}catch(e){throw Ye(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},kn=()=>g.stdout.write("[2J[H"),bn=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,vn=async()=>{let e=await wn();return yn(e)},xn=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 Y(),await rn(),!e.watch){try{o.box(await vn())}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 vn();n&&kn(),o.box(e),o.log(bn(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Tn=N(f);async function $n(){let e="win32"===g.platform?"where.exe":"which";try{return await Tn(e,["tailscale"]),!0}catch{return!1}}async function An(){try{let{stdout:e}=await Tn("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Sn(e){return e.replace(/\.$/,"")}async function En(){let e=await An();if(e?.Online)return Sn(e.DNSName)}const On=N(f),Cn=e=>`[1m${e}[0m`,In=e=>`[2m${e}[0m`,Pn=e=>`[36m${e}[0m`,Rn=e=>`[32m${e}[0m`,Nn=e=>`[31m${e}[0m`,qn=e=>`[33m${e}[0m`,Dn=In(" ─────────────────────────────────────────────────────────────"),jn=s.join(W.APP_DIR,"certs","tailscale"),Mn=s.join(jn,"cert.pem"),Fn=s.join(jn,"key.pem"),Hn={certDir:jn,certPath:Mn,keyPath:Fn};function Un(){switch(g.platform){case"darwin":return[` ${In("Install Tailscale for macOS:")}`,` ${Pn("https://tailscale.com/download/mac")}`,` ${In("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${In("After installing, open the Tailscale app and sign in.")}`,` ${In("Then re-run this command.")}`].join("\n");case"linux":return[` ${In("Install Tailscale for Linux:")}`,` ${Pn("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Pn("sudo tailscale up")}`,` ${In("or")} ${Pn("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${In("Install Tailscale for Windows:")}`,` ${Pn("https://tailscale.com/download/windows")}`,"",` ${In("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${In("Install Tailscale:")} ${Pn("https://tailscale.com/download")}`}}function Bn(){let e=[` ${Nn("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${In("Open the Tailscale app from Applications and sign in.")}`,` ${In("Download:")} ${Pn("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${In("Open the Tailscale app and sign in.")}`,` ${In("Download:")} ${Pn("https://tailscale.com/download/windows")}`):e.push(` ${In("Connect with:")} ${Pn("sudo tailscale up")}`),e.push("",` ${In("Then re-run this command.")}`),e.join("\n")}async function Ln(){try{return await a.access(Mn),await a.access(Fn),!0}catch{return!1}}function zn(e){console.log(""),console.log(Dn),console.log(` ${Cn("Claude Cowork Setup")} ${In("— Diagnostic")}`),console.log(Dn),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?Rn("✅"):"missing"===n.status?Nn("❌"):qn("❓");let r=n.detail?In(` ${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(` ${Rn("All checks passed.")}`):console.log(` ${Nn(`${t.length} issue(s).`)} Run ${Pn("copilot-api cowork-setup install")} to fix.`),console.log("")}const Gn={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},Kn=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await $n();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return zn(e),console.log(""),console.log(Un()),void console.log("");let o=await An();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},zn(e),console.log(Bn()),void console.log("");let n=Sn(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await Ln();e["tailscale-cert"]=r?{status:"ok",detail:Mn}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),zn(e)}(),g.exit(0)}}),Jn=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:Gn},async run({args:e}){await async function(e){if(console.log(""),console.log(Dn),console.log(` ${Cn("Claude Cowork Setup")} ${In("— Install")}`),console.log(Dn),console.log(""),!await $n())return console.log(` ${Nn("Tailscale is not installed.")}`),console.log(""),console.log(Un()),console.log(""),console.log(` ${In("After installing, run")} ${Pn("tailscale up")} ${In("to connect, then re-run this command.")}`),void console.log("");let t=await An();if(!t||!t.Online)return console.log(Bn()),void console.log("");let n=Sn(t.DNSName);if(console.log(` ${In("Tailscale hostname:")} ${Cn(n)}`),console.log(""),console.log(` ${Cn("Generating TLS certificate via Tailscale…")}`),console.log(` ${In("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Pn(`$ tailscale cert --cert-file ${Mn} --key-file ${Fn} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(jn,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await On("tailscale",["cert","--cert-file",Mn,"--key-file",Fn,n]),console.log(` ${Rn("✓ 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(Dn),console.log(` ${Cn("Next steps")}`),console.log(Dn),console.log(""),console.log(` ${Cn("1.")} Start the proxy:`),console.log(` ${Pn("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Cn("2.")} In Cowork ${In("→")} Settings ${In("→")} Inference Provider, set:`),console.log(` ${Cn("inferenceGatewayBaseUrl")} = ${Pn(`https://${n}:<port>`)}`),console.log(` ${In("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Cn("3.")} Restart Cowork ${In("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${In("For Cowork's own configuration docs, see:")}`),console.log(` ${Pn("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),Wn=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:Gn},async run({args:e}){await async function(e){if(console.log(""),console.log(Dn),console.log(` ${Cn("Claude Cowork Setup")} ${In("— Revert")}`),console.log(Dn),console.log(""),!await Ln())return console.log(` ${In("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${Cn("Remove Tailscale cert files:")}`),console.log(` ${In(Mn)}`),console.log(` ${In(Fn)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(jn,{recursive:!0}),console.log(` ${Rn("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${In("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),Yn=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:Kn,install:Jn,revert:Wn}}),Vn=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Xn(e){if(!Vn.test(e))return e;let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],a=r.match(/^\[[0-9;]*[a-z]/i);t+=a?r.slice(a[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function Zn(e){return"string"==typeof e?Xn(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=Zn(n);!t&&r!==n&&(t=e.slice(0,o)),t?.push(r)}return t??e}(e):e&&"object"==typeof e?function(e){let t,o=Object.entries(e),n="thinking"===e.type;for(let e=0;e<o.length;e++){let[r,a]=o[e],i=!n||"thinking"!==r&&"signature"!==r?Zn(a):a;!t&&(i!==a||"__proto__"===r)&&(t=Qn({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=Qn({},o,o.length),t.properties={}),t??e}(e):e}function Qn(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const er="x-copilot-api-self-test",tr=R();const or=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function nr(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 rr(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();Ze.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(we.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&&(be.add(e.inputTokens,t),ze.record(e.inputTokens,t)),e.outputTokens&&(ve.add(e.outputTokens,t),Ge.record(e.outputTokens,t)),e.cachedTokens&&xe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ue.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const ar=1048576;const ir=async()=>ge.startActiveSpan("copilot_api.approval.await",async e=>{let t=performance.now();try{let n=await o.prompt("Accept incoming request?",{type:"confirm"}),r=performance.now()-t;if(e.setAttribute("copilot_api.approval.wait_duration_ms",r),Je.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),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 sr(e){if($o(Z)||await on())return null;let t=Yo();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Xo()}`,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 lr(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 cr(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 ur=[{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"}],pr="claude-haiku-4.5",dr={haiku:pr,"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 mr(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 ur)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=dr[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 fr=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function hr(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=fr.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=fr.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var gr=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function _r(e){if(!e||"string"!=typeof e)throw new gr("Model name is required and must be a string");if("foundry"===Z.provider)return e;if(!Z.models?.data)throw new gr("Models not available. Please try again later.",503);let t=Z.models.data.map(e=>e.id);if(t.includes(e))return e;let o=mr(e,t);if(!o)throw $e.add(1,{requested_model:e}),new gr(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function yr(e){let t=Z.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===Z.provider?Io(e):/gpt-[\d.]+-codex/i.test(e)}async function wr(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return ge.startActiveSpan("copilot_api.rate_limit.check",async n=>{try{let r=Date.now();if(n.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let a=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute("copilot_api.rate_limit.elapsed_seconds",a),a>t)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let i=Math.ceil(t-a);if(n.setAttribute("copilot_api.rate_limit.wait_seconds",i),!e.rateLimitWait)throw n.setAttribute("copilot_api.rate_limit.action","rejected"),Te.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Ut("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Te.add(1,{action:"waited",source:"local"}),He.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await Do(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var kr=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function br(e){if(e instanceof kr)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 vr(e,t){let{type:n,message:r}=br(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 xr(e,t){let{type:n,message:r}=br(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 Tr(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 $r(e,t,o){return Math.min(Math.max(e,t),o)}function Ar(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 Ar(JSON.parse(r),t+1)}catch{return null}}function Sr(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Tr(o.capabilities.supports.min_thinking_budget),r=Tr(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Tr(o.capabilities.limits?.max_output_tokens)??void 0}}function Er(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=$r(Tr(e.requestedBudget)??o,o,n),a=Tr(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 Or(e,t){if(jo(e.thinking_budget))return e;let o=Sr(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Er({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 Cr(e){return"invalid_thinking_budget"===Ar(e)}async function Ir(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(jo(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(!Cr(i))return null;let l=Sr(n,t.model);return l?function(e,t){let o=Er({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=Tr(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 Pr(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 Rr(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const Nr=new Map,qr=new Map,Dr=new Set;let jr,Mr,Fr;function Hr(e){return!e.closed&&!e.destroyed}function Ur(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new O(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return Nr.set(t,Date.now()),qe.add(1,{event:"created",origin:e}),We(_.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=Dr.has(t);qe.add(1,{event:"goaway",origin:e}),We(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}),qr.delete(t),Dr.delete(t),Nr.delete(t),Hr(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Br(e,t){if(!Z.connectivity.h2)return;if(jr&&jr!==e&&function(){for(let e of[...qr.keys(),...Dr])Hr(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});qr.clear(),Dr.clear(),Nr.clear()}(),jr=e,t?.fresh){let t=Ur(e);return Dr.add(t),t}let n=Date.now();for(let[t]of qr)if(n-(Nr.get(t)??0)>=6e5)qr.delete(t),Nr.delete(t),Hr(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),qe.add(1,{event:"rotated",origin:e}),We(_.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 qr.delete(t),Dr.add(t),t;qr.delete(t),Nr.delete(t)}let r=Ur(e);return Dr.add(r),r}function Lr(e){e&&Dr.delete(e)&&(Hr(e)?qr.set(e,Date.now()):Nr.delete(e))}function zr(){Fr||(Fr=setInterval(()=>{!function(){let e=Date.now(),t=Z.connectivity.h2Keepalive,n=qr.size;for(let[r,a]of qr)e-a<6e4||t&&n<=1||(qr.delete(r),Nr.delete(r),n--,Hr(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),qe.add(1,{event:"idle_reaped",origin:jr??""}),We(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${jr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":jr??""}))}()},3e4),Fr.unref())}function Gr(){Mr||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Mr=setInterval(()=>{(async function(){if(0===qr.size&&0===Dr.size){if(jr){let e=Ur(jr);qr.set(e,Date.now())}return}let e=[...qr.keys()];for(let t of e)qr.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:ut(Z)});await n.dump(),Ne.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),qr.set(e,Date.now())}catch(t){Ne.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),qe.add(1,{event:"error",origin:jr??""}),Nr.delete(e),Hr(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Nr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Mr.unref(),zr())}function Kr(e){return e.max_completion_tokens??e.max_tokens}async function Jr(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&&cr(t,n.usage),n}catch(e){throw Ye(t,e),e}finally{t.end()}}const Wr=e=>bo(Z)?e:function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=Kr(e);return null==i?a:{...a,max_completion_tokens:i}}(e,Z.models),Yr=e=>bo(Z)?e:Zn(e),Vr=async e=>{let t=Yr(e);try{return await Xr(t)}catch(e){if(e instanceof Ut&&401===e.response.status)return await mo(),Xr(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:Z.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 Xr(Yr(r));throw e}},Xr=async e=>{if(!$o(Z))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={...To(Z,t),"X-Initiator":o?"agent":"user"},r=xo(Z),a=`${r}/chat/completions`,i=Z.timeoutMs,s=Wr(e),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":Kr(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=Br(r,{fresh:t>0}),s=new AbortController,u=Lt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await tt({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:()=>Lr(o)}}try{return await Jr(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{Lr(o)}}catch(e){if(Lr(o),await Ht(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Zr=new Map;const Qr=["none","minimal","low","medium","high","xhigh","max"];function ea(e,t){if(!e.reasoning)return e;if(0===t.length){let{reasoning:t,...o}=e;return o}let o=e.reasoning.effort;if(!o)return e;let n=function(e,t){if(t.includes(e))return e;let o=Qr.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=Qr.indexOf(e);if(-1===t)continue;let a=Math.abs(t-o);a<r&&(r=a,n=e)}return n??t[0]}(o,t);return n&&n!==o?{...e,reasoning:{...e.reasoning,effort:n}}:e}function ta(e,t){if(!e.reasoning)return null;let n=function(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}let{param:o,code:n,message:r=""}=t.error??{};if("reasoning.effort"===o||"reasoning"===o){if("unsupported_value"===n){let e=[...(/Supported values are:(.*)$/i.exec(r)?.[1]??"").matchAll(/'([^']+)'/g)].map(e=>e[1]);return e.length>0?{kind:"unsupported_value",supported:e}:void 0}if("unsupported_parameter"===n)return{kind:"unsupported_parameter"}}}(t);if(!n)return null;let r="unsupported_value"===n.kind?n.supported:[];Zr.set(e.model,r);let a=ea(e,r);return a===e?null:(o.debug(`Foundry rejected reasoning.effort=${e.reasoning.effort} on ${e.model}; retrying with ${a.reasoning?.effort??"no reasoning"}`),a)}async function oa(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&&cr(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens,prompt_tokens_details:n.usage.input_tokens_details}),n}catch(e){throw Ye(t,e),e}finally{t.end()}}const na=async e=>{let t=bo(Z),o=t?function(e){let t=Zr.get(e.model);return t?ea(e,t):e}(e):e;try{return await ra(o)}catch(e){if(e instanceof Ut&&401===e.response.status)return await mo(),ra(o);if(t&&e instanceof Ut&&400===e.response.status){let t=ta(o,await e.response.clone().text().catch(()=>{}));if(t)return ra(t)}throw e}},ra=async e=>{if(!$o(Z))throw Error("Service token not found");let t=bo(Z)?e:Zn(e),o={...To(Z),"X-Initiator":"agent"},n=xo(Z),r=`${n}/responses`,a=Z.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=Br(n,{fresh:e>0}),c=new AbortController,u=Lt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await tt({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:()=>Lr(l)}}try{return await oa(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{Lr(l)}}catch(t){if(Lr(l),await Ht(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},aa=e=>Object.hasOwn(e,"output");function ia(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens,...t.input_tokens_details&&{prompt_tokens_details:{cached_tokens:t.input_tokens_details.cached_tokens}}}:null}var sa=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const la=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 ca(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new sa(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new sa(`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=>pa(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=da(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=pa(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:pa(o.content)})}return t}(e.messages);if(0===o.length)throw new sa("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),ua(e.temperature)&&(n.temperature=e.temperature),ua(e.top_p)&&(n.top_p=e.top_p),ua(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),ua(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 ua(e){return null!=e}function pa(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function da(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 sa(`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 ma(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 fa(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 ha(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 ga(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function _a(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=ga(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[ha(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),[ha(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function ya(e,t){let o=[ha(e,{},fa(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=ma(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function wa(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:[ha(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:_a(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=ga(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[ha(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:ya(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 ka="openai_responses";function ba(e){let t=performance.now(),n=ge.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),ca(e)}finally{t.end()}});Ue.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!la.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 va(e){let t=performance.now(),o=ge.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:fa(e,n.length>0)}]};return e.usage&&(r.usage=ma(e.usage)),r}(e)}finally{t.end()}});return Ue.record(performance.now()-t,{direction:"responses_to_openai"}),o}function xa(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=ma(t.usage);a.tokenUsage=lr(o)}return a.copilotDuration=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(va(t))}async function Ta(e,t,n){let r;try{r=ba(t)}catch(t){if(t instanceof sa)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}),Z.manualApprove&&!n.isSelfTest&&await ir();let a=await sr(e);if(a)return a;let i=performance.now(),s=await na(r),l=performance.now()-i;if(Me.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),aa(s))return xa(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 j(e,async t=>{let n=null,a=0,s=performance.now(),d=Pr(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++,Pe.add(1,{model:r.model,endpoint_type:ka});let c=ia(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=lr(c),t.copilotDuration=l,e.set("requestData",t)}let u=wa(s,m);if(u.error)throw new kr(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:ka};Fe.record(performance.now()-s,u),Ke.record(a,u),Rr(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await xr(t,o),o}finally{n&&cr(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function $a(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 Aa(e){let t=!0===e.get("isSelfTest");t||await wr(Z);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return ge.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=_r(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),Ae.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 gr)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(yr(n.model))return Ta(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),Z.manualApprove&&!t&&await ir(),"foundry"!==Z.provider&&(n=function(e){if(!jo(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!jo(e.max_tokens))return e;let t=(Z.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=Or(n,Z.models)),jo(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await sr(e);if(r)return r;let a=performance.now(),i=await Vr(n),s=performance.now()-a;if(Me.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Sa(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=lr(i.usage)),t.copilotDuration=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 j(e,async t=>{let o={value:null},r=0,i=performance.now(),p=Pr(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Pe.add(1,{model:n.model,endpoint_type:"openai"}),i=$a(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=lr(t),n.copilotDuration=s,e.set("requestData",n)})),await t.writeSSE(i)}let c=performance.now()-i,u={model:n.model,endpoint_type:"openai"};if(Fe.record(c,u),Ke.record(r,u),Rr(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=lr(o.value),t.copilotDuration=s,e.set("requestData",t))}}catch(o){throw Ve(c,e.get("requestSpan"),o),await xr(t,o),o}finally{o.value&&cr(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ue.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Sa=e=>Object.hasOwn(e,"choices"),Ea=new q;Ea.post("/",async e=>{try{return await Aa(e)}catch(t){return await lo(e,t)}});const Oa=new q;Oa.post("/",async e=>{try{let t=await e.req.json();try{t.model=_r(t.model)}catch(t){if(t instanceof gr)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 sr(e);if(o)return o;let n=performance.now(),r=await(async e=>{if(!$o(Z))throw Error("Service token not found");let t=`${xo(Z)}/embeddings`,o=To(Z),n=Z.timeoutMs,r=new AbortController,a=Lt(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await et({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 Ye(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),a=performance.now()-n;Me.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=lr(r.usage),i.copilotDuration=a,e.set("requestData",i),e.json(r)}catch(t){return await lo(e,t)}});const Ca=new q;let Ia=null,Pa=null;function Ra(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function Na(e){return!Ra(e)}Ca.get("/",async e=>{let t,o=function(){if(bo(Z))return $o(Z)?"valid":"missing";let e=Z.copilotToken;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=Ia;return t&&e-t.timestamp<3e4?{result:t.result}:Pa||(Pa=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${xo(Z)}/models`,n=await fetch(t,{method:"GET",headers:To(Z),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Ia={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Ia={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),Pa=null}})(),Pa)}();t="valid"===o&&"reachable"===n.result?"ok":"valid"!==o&&"reachable"!==n.result?"unhealthy":"degraded";let r={status:t,copilot_token:o,upstream:n.result,version:"0.44.0-preview.6",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 qa=new F(U),Da={...H["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function ja(e){try{return qa.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function Ma(e){let t=0;for(let o of e)switch(o.type){case"text":t+=ja(o.text)*Da.contentMultiplier;break;case"tool_use":t+=ja(o.name+JSON.stringify(o.input))*Da.contentMultiplier;break;case"tool_result":o.content&&(t+=ja("string"==typeof o.content?o.content:JSON.stringify(o.content))*Da.contentMultiplier);break;case"thinking":t+=ja(o.thinking)*Da.contentMultiplier;break;case"image":t+=1600}return t}function Fa(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?Da.perFirstProp:Da.perAdditionalProp,t+=ja(o),r.description&&(t+=Da.perPropDesc+ja(r.description)),r.enum&&Array.isArray(r.enum)){t+=Da.perEnum;for(let e of r.enum)t+=ja(String(e))}if("object"===r.type&&r.properties&&(t+=Da.perNestedObject,t+=Fa(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=Da.perArrayOfObjects,t+=Fa(e))}}return t}function Ha(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=Ha(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Ba=async(e,t,n)=>{try{return await La(e,t)}catch(r){if(r instanceof Ut&&401===r.response.status)return await mo(),La(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}`),La(i,t)}throw r}};const La=async(e,t)=>{if(!$o(Z))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=bo(Z)&&Z.foundry?{baseUrl:wo(Z.foundry),headers:ko(Z.foundry,t),cleanPayload:e}:function(e,t){let{metadata:o,...n}=e,r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...dt(Z,t,r),"X-Initiator":"agent"};return{baseUrl:ct(Z),headers:a,cleanPayload:n}}(Zn(e),t),a=`${o}/v1/messages`,i=Z.timeoutMs,s=JSON.stringify(r),l=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",...Ha(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){let t=Br(o,{fresh:e>0}),c=new AbortController,u=Lt(c,i);try{let{statusCode:o,headers:u,body:p,span:d}=await tt({spanName:"copilot POST /v1/messages",url:a,target:"anthropic_messages",headers:n,body:s,signal:c.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(p,{status:o,headers:u});if(!m.ok)throw d.end(),new Ut("Failed to create anthropic messages",m,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:M(m),span:d,release:()=>Lr(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&&cr(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(),Lr(t)}}catch(o){if(Lr(t),await Ht(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},za=new Set(["low","medium","high","max","xhigh"]);function Ga(e){let t=e.output_config?.effort;if(!t)return e;let n=Z.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=hr(t,n);if(!r||!za.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}}}function Ka(e,t,n){if("foundry"===Z.provider)return Ga(e);let r=t.includes(e.model)?e.model:mr(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=mr(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 Ga(s)}const Ja=e=>"object"==typeof e&&!!e&&!Array.isArray(e),Wa=["properties","patternProperties","$defs","definitions"],Ya=["items","additionalProperties","propertyNames","contains","not","if","then","else"],Va=["anyOf","allOf","oneOf","prefixItems"];const Xa=()=>["string","number","boolean"].map(e=>({type:e})),Za=()=>({anyOf:[...Xa(),{type:"array",items:{anyOf:Xa()}},{type:"object"}]}),Qa=e=>!0===e||Ja(e)&&0===Object.keys(e).length,ei=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function ti(e,t){let o={...e};for(let e of Wa){let n=o[e];Ja(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,Ja(o)?ti(o,t):o])))}for(let e of Ya){let n=o[e];Ja(n)&&(o[e]=ti(n,t))}for(let e of Va){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>Ja(e)?ti(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(Ja(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>Qa(e)?Za().anyOf:Ja(e)?[e]:[]);if(0===o.length)return;let n=[...new Map(o.map(e=>[JSON.stringify(e),e]))].map(([,e])=>e);e.items=1===n.length?n[0]:{anyOf:n}}(o)),ei(o)&&(!("items"in o)||Qa(o.items))&&(t.add("items"),o.items=Za()),Qa(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function oi(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=ri(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function ni(e){return ai(ri(e))}function ri(e){return"string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.flatMap(e=>"text"===e.type&&"string"==typeof e.text?[e.text]:[]).join("\n\n"):""}function ai(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function ii(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>ai(e)).filter(Boolean).join("\n\n")}const si=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),li=new Set(["text","image"]);function ci(e,t){if(Array.isArray(e?.content))for(let o of e.content){if(t.size>=20)return;let e=String(o?.type).slice(0,64);li.has(e)||t.add(`block:tool_result:${e}`)}}const ui=new Set;function pi(e,t){e.setAttribute("copilot_api.translation.system_message_count",t.filter(e=>"system"===e.role).length);let o=function(e){let t=new Set;for(let o of e){if(t.size>=20)break;let e=String(o.role).slice(0,64),n=si.get(e);if(n){if(Array.isArray(o.content))for(let r of o.content){let o=String(r?.type).slice(0,64);if(n.has(o)||t.add(`block:${e}:${o}`),"tool_result"===o&&ci(r,t),t.size>=20)break}}else t.add(`role:${e}`)}return[...t].sort()}(t);if(0===o.length)return;e.setAttribute("copilot_api.translation.unknown_shapes",o.join(","));let n=function(e){let t=[];for(let o of e){if(ui.size>=100)break;ui.has(o)||(ui.add(o),t.push(o))}return t}(o);0!==n.length&&r.warn(`Request contains message shapes the translator does not handle (dropped): ${n.join(", ")}`)}const di=e=>I("sha256").update(e).digest("hex").slice(0,12);function mi(e,t){e.setAttribute("copilot_api.translation.system_hash",di(t.system)),e.setAttribute("copilot_api.translation.tools_hash",di(JSON.stringify(t.tools??[])))}function fi(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function hi(e){return e.toLowerCase().startsWith("claude-")}function gi(e,t){let o={model:e.model,messages:_i(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:$i(e.tools,e.model),tool_choice:Ai(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Sr(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=Tr(t),a=r&&r>1?r-1:o.min;return $r(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Or({...o,thinking_budget:a},t)}}return o}function _i(e,t){let{leadingSystemTexts:o,messages:n}=oi(e),r=function(e,t){let o=ii(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=ni(e);if(!t)break;yi(r)?a.push(t):wi(r,t);break}case"user":r.push(...ki(e));for(let e of a)wi(r,e);a=[];break;case"assistant":r.push(...bi(e))}for(let e of a)wi(r,e);return r}function yi(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function wi(e,t){let o=function(e){return e.trimStart().startsWith("<system-reminder>")?e:`<system-reminder>\n${e}\n</system-reminder>`}(t),n=e.at(-1);"user"===n?.role?Array.isArray(n.content)?n.content.push({type:"text",text:o}):n.content=n.content?`${n.content}\n\n${o}`:o:e.push({role:"user",content:o})}function ki(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:Ti(e.content)});n.length>0&&t.push({role:"user",content:Ti(n)})}else t.push({role:"user",content:Ti(e.content)});return t}function bi(e){let t=function(e){return{reasoning_text:xi(e.reasoning_text),reasoning_opaque:xi(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Ti(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:Ti(e.content),...t}]}const vi=32768;function xi(e){if("string"==typeof e)return e.length<=vi?e:e.slice(0,vi)}function Ti(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 $i(e,t){if(!e)return;let o=e.filter(Na),n=function(e){return e.toLowerCase().startsWith("gemini")}(t),r=new Set,a=o.map(e=>{let t=e.input_schema;if(n){let e=function(e){let t=new Set;return{schema:ti(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)r.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return r.size>0&&d.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function Ai(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 Si(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 Ei(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Oi(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 Ci=new Set(["low","medium","high","max","xhigh"]);function Ii(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&&Ci.has(e)?e:null)(hr(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 Pi(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 Ri=/[^\w-]/g;function Ni(e){return e.replaceAll(Ri,"_")}function qi(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=Ii(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:Pi(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:Ni(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Ni(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Di(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 ji(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 Mi(e,t){return ge.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=_r(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Di(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),Ae.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 gr)return{ok:!1,response:ji(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function Fi(e,t,o){let{leadingSystemTexts:n,messages:r}=oi(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=ni(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(Gi(e));break}case"user":t.push(...Ki(n),...o.map(e=>Gi(e))),o=[];break;case"assistant":t.push(...Wi(n))}return t.push(...o.map(e=>Gi(e))),t}(r);if(0===a.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 i={model:e.model,input:a,max_output_tokens:Math.max(e.max_tokens,16),stream:e.stream,temperature:e.temperature,top_p:e.top_p,store:!1,user:e.metadata?.user_id?.slice(0,64)},s=function(e,t){return ii(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(Na).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(i.tool_choice=function(e){switch(e.type){case"auto":return"auto";case"any":return"required";case"none":return"none";case"tool":return e.name?{type:"function",name:e.name}:void 0;default:return}}(e.tool_choice));let l=function(e,t,o){if("adaptive"===e.thinking?.type){let t=e.output_config?.effort??"high";return o&&"max"===t?{effort:"max"}:{effort:zi(t)}}if("enabled"===e.thinking?.type&&e.thinking.budget_tokens){let{effort:o}=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens),n=hr(o,t);return{effort:Li(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function Hi(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${I("sha256").update(o).digest("hex").slice(0,32)}`}function Ui(e){let t=e?.input_tokens??0,o=e?.input_tokens_details?.cached_tokens;return{input_tokens:void 0===o?t:Math.max(t-o,0),output_tokens:e?.output_tokens??0,...void 0===o?{}:{cache_read_input_tokens:o}}}const Bi=new Set(["low","medium","high","xhigh"]),Li=e=>null!==e&&Bi.has(e);function zi(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Gi(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function Ki(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(Ji(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)switch(t.type){case"text":e.push({type:"input_text",text:t.text});break;case"image":e.push({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 Ji(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 Wi(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 Yi(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 Vi(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Xi(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 Zi(e,t){let o=[];switch(e.type){case"response.created":Xi(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){Xi(t,o),Vi(t,o);let n=e.item;t.toolCalls[e.output_index]={call_id:n.call_id,name:n.name,anthropicBlockIndex: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":Xi(t,o),Vi(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":Vi(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.anthropicBlockIndex,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.anthropicBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1)}break;case"response.completed":{Vi(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:Yi(e.response.status,n),stop_sequence:null},usage:Ui(r)},{type:"message_stop"});break}case"response.incomplete":{Xi(t,o),Vi(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:Ui(n)},{type:"message_stop"});break}case"response.failed":Xi(t,o),Vi(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":Xi(t,o),Vi(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":Xi(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 Qi(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 es(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function ts(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&&(Qi(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&&(Qi(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),es(t,o)),r.content&&(es(t,o),function(e){return!!e.contentBlockOpen&&Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===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){es(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,anthropicBlockIndex: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.anthropicBlockIndex,delta:{type:"input_json_delta",partial_json:e.function.arguments}})}}}return n.finish_reason&&(es(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:fi(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 os=/structured_outputs|output_config\.format/i;function ns(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&os.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?qi({...e,model:pr},o):null}var rs=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var as=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const is={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 et({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 Ye(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new as: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 et({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 Ye(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new rs:e}finally{clearTimeout(i)}}},ss=["tavily","exa"];function ls(e){return"tavily"===e||"exa"===e}function cs(){return Z.webSearchProviders.length>0}async function us(e,t){return async function(e,t,n){let{providers:r,searchFns:a=is}=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:Z.webSearchProviders})}function ps(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function ds(e,t){let o=[{type:"web_search_tool_result_error",error_code:t.errorCode??"unavailable"}];return{type:"web_search_tool_result",tool_use_id:e,content:t.searchFailed?o:t.results}}async function ms(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&&Ra(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(!cs())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await us(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_${ps()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...ds(n,e)}];return{id:`msg_ws_${ps()}`,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_${ps()}`,r=`msg_ws_${ps()}`,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:ds(n,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),j(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const fs=(e,t)=>!(!e||!t||e===t);async function hs(e){if($o(Z)||await on())return null;let t=Yo();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Xo()}`}},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 gs(e,t){let o=t.model;return o&&"string"==typeof o?null:ji(e,"Model name is required and must be a string")}async function _s(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&Ra(t[0])}(t))return gs(e,t)??ms(e,t);await wr(Z),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=gs(e,t);if(a)return a;t=function(e,t){return Ka(t,Z.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Mi(e,t);if(!i.ok)return i.response;t=i.payload;let s=await hs(e);if(s)return s;if(yr(t.model))return bs(e,t);if(function(e){if("foundry"!==Z.provider)return hi(e);let t=Z.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:hi(e)}(t.model))return async function(e,t,o){let n="foundry"===Z.provider,r=n?t:qi(t,Z.models),a={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},i=r.output_config?.effort;return e.set("requestData",{model:r.model,reasoningEffort:i,effortClamped:fs(o,i),streaming:!!r.stream}),Z.manualApprove&&await ir(),ge.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",r.model),t.setAttribute("copilot_api.streaming",!!r.stream),Ua(t,r,a.anthropicBeta);try{let o=performance.now(),i=await Ba(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=ns(e,o,Z.models);return r&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",r.model)),r}}),s=performance.now()-o;if(Me.record(s,{model:r.model,target:"anthropic_messages",streaming:String(!!r.stream)}),!r.stream){let o=i,n=o.usage;if(n){let t={input_tokens:n.input_tokens||0,output_tokens:n.output_tokens||0,cache_read_input_tokens:n.cache_read_input_tokens||0,cache_creation_input_tokens:n.cache_creation_input_tokens||0},o=e.get("requestData")||{};o.tokenUsage=lr(ws(t)),o.copilotDuration=s,o.upstreamTtfbMs=s,o.upstreamTotalMs=s,e.set("requestData",o)}return t.end(),e.json(o)}let{events:l,span:c,release:u}=i;return j(e,async n=>{let a=0,i=performance.now(),s={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=Pr(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,Pe.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),ks(e.data,s)&&(p=!0),await n.writeSSE(e)):await n.writeSSE(e);let e=performance.now()-i,t={model:r.model,endpoint_type:"anthropic_messages"};Fe.record(e,t),Ke.record(a,t)}catch(t){throw Ve(c,e.get("requestSpan"),t),await vr(n,t),t}finally{if(Rr(e,o),p){let t=ws(s);cr(c,t);let o=e.get("requestData")||{};o.tokenUsage=lr(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&ue.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Ye(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=ge.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));o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),pi(o,t.messages);let a=gi(t,Z.models),i=a.messages.at(0);return mi(o,{system:"system"===i?.role&&"string"==typeof i.content?i.content:"",tools:a.tools}),a}finally{o.end()}});Ue.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=Or(c,Z.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:fs(r,u),streaming:!!c.stream});let p=performance.now();Z.manualApprove&&await ir();let d=await Vr(c),m=performance.now()-p;if(Me.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),ys(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=lr(d.usage)),t.copilotDuration=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=ge.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=Ei(a.message),i=Si(a.message.content),s=Oi(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:fi(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 Ue.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 j(e,async t=>{let n=null,r=0,a=performance.now(),i=Pr(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++,Pe.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=lr(n),t.copilotDuration=m,e.set("requestData",t)}let u=ts(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(Fe.record(l,u),Ke.record(r,u),Rr(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=lr(n),t.copilotDuration=m,e.set("requestData",t))}}catch(o){throw Ve(h,e.get("requestSpan"),o),await vr(t,o),o}finally{n&&cr(h,n),h.end(),g()}let l=e.get("requestId");l&&ue.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const ys=e=>Object.hasOwn(e,"choices");function ws(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 ks(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 bs(e,t){let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.anthropic_to_responses",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),pi(o,t.messages);let n=Fi(t,Z.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===Z.provider,promptCacheKey:"foundry"===Z.provider?Hi(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return mi(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});Ue.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),Z.manualApprove&&await ir();let i=performance.now(),s=await na(a),l=performance.now()-i;if(Me.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),aa(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=lr({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens,prompt_tokens_details:s.usage.input_tokens_details})),t.copilotDuration=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=ge.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:Yi(e.status,o),stop_sequence:null,usage:Ui(e.usage)}}(s)}finally{e.end()}});return Ue.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 j(e,async t=>{let n=null,r=0,s=performance.now(),d=Pr(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++,Pe.add(1,{model:a.model,endpoint_type:"responses"});let c=ia(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=lr(n),t.copilotDuration=l,e.set("requestData",t)}let u=Zi(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"};Fe.record(u,p),Ke.record(r,p),Rr(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await vr(t,o),o}finally{n&&cr(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const vs=new q;vs.post("/",async e=>{try{return await _s(e)}catch(t){return await lo(e,t)}});const xs=new q;function Ts(e){return ge.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=_r(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),Ae.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 $s(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=lr(o),n.copilotDuration=t.copilotDuration,t.c.set("requestData",n)}xs.get("/",async e=>{try{Z.models||await Mo();let t=Z.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 lo(e,t)}});const As=new Set(["message","function_call","function_call_output"]),Ss=new Set(["type","name","description","parameters"]);async function Es(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||!cs())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await us(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Os(e){if(cs())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Es(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Cs(e){if(!cs())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 Es(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Is(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 As.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Ps(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 Rs(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&&Ps(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)Ps(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Ns(e){return null!=e}function qs(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Ds(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function js(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(!qs(n)){o.push(n);continue}let e=Is(n);null===e?t.add(Ds(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"])Ns(e[o])&&(t[o]=e[o]);let r=new Set;if(Ns(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))Ss.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(Ns(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Ns(o.effort)&&(t.reasoning.effort=o.effort),Ns(o.summary)&&(t.reasoning.summary=o.summary)}if(Ns(e.text)&&"object"==typeof e.text){let o=e.text;Ns(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Ms(e,t){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Fs(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||Ns(n.previous_response_id)||Ns(n.prompt)||Ns(n.conversation)?null:Ms(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 Hs(e){await wr(Z);let t=await e.req.json();if(!qs(t))return Ms(e,"request body must be a JSON object");let n=function(e){return"foundry"===Z.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:js(e)}(t),{customToolNames:r}=n,a=n.payload;o.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),r.size>0&&o.debug(`Custom tools detected: ${[...r].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:Ts(t)}}catch(t){if(t instanceof gr)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=Fs(e,t.input,n);if(s)return s;let l=await sr(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),Z.manualApprove&&await ir();let c=performance.now(),u=await na(a),p=performance.now()-c;if(Me.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Us(u))return async function(e,t,o){await Os(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=lr({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n.copilotDuration=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 j(e,async t=>{let o={value:null},n=0,i=performance.now(),s=Pr(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Rs(i.data,r);s=await Cs(s);let l=s===i.data?i:{...i,data:s};Pe.add(1,{model:a.model,endpoint_type:"responses"}),$s(s,{usageRef:o,c:e,copilotDuration:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};Fe.record(l,u),Ke.record(n,u),Rr(e,c)}catch(o){throw Ve(m,e.get("requestSpan"),o),await xr(t,o),o}finally{o.value&&cr(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ue.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Us=e=>Object.hasOwn(e,"output"),Bs=new q;Bs.post("/",async e=>{try{return await Hs(e)}catch(t){return await lo(e,t)}});const Ls=new q;Ls.get("/",e=>{try{return Z.showToken?e.json({token:Z.copilotToken}):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 zs=new q;zs.get("/",async e=>{try{let t=await wn();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Gs=new q;function Ks(){return function(e){let t=e.filter(e=>nr(e));if(0===t.length)return;let o=t.find(e=>or.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(Z.models?.data??[])}function Js(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 Xn(o).slice(0,200)}catch{}let t=Xn(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 Ws(e={}){let t=performance.now(),o=e.model&&function(e){let t=Z.models?.data.find(t=>t.id===e);return void 0!==t&&nr(t)}(e.model)?e.model:Ks();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 Gs.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[er]:tr},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:Js(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)}}Gs.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=yt(i),p=function(e){return e===tr}(e.req.header(er));e.set("requestId",r),e.set("isSelfTest",p),e.header("x-request-id",r);let m=ge.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();Ze.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>ar?t.slice(0,ar):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||ue.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(()=>rr(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{}}):rr(y)}),Gs.use(D()),Gs.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()}),Gs.get("/",e=>e.text("Server running")),Gs.route("/health",Ca),Gs.route("/chat/completions",Ea),Gs.route("/models",xs),Gs.route("/embeddings",Oa),Gs.route("/usage",zs),Gs.route("/token",Ls),Gs.route("/v1/chat/completions",Ea),Gs.route("/v1/models",xs),Gs.route("/v1/embeddings",Oa),Gs.route("/v1/messages",vs),Gs.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=Da.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=Da.perMessage+ja(e)*Da.contentMultiplier}for(let e of t.messages)o+=Da.perMessage,o+=ja(e.role),"string"==typeof e.content?o+=ja(e.content)*Da.contentMultiplier:Array.isArray(e.content)&&(o+=Ma(e.content));let n=t.tools?.filter(Na);return n&&n.length>0&&(o+=function(e){let t=Da.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=Da.perTool),t+=ja(n.name),n.description&&(t+=Da.perDesc+ja(n.description)),t+=Fa(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),Gs.route("/v1/responses",Bs),Gs.route("/responses",Bs),Gs.onError((e,t)=>lo(t,e));const Ys=e=>`[1m${e}[0m`,Vs=e=>`[2m${e}[0m`,Xs=e=>`[32m${e}[0m`,Zs=e=>`[31m${e}[0m`,Qs=e=>`[33m${e}[0m`,el=Vs(" ─────────────────────────────────────────────────────────────");function tl(e,t,o){console.log(` ${function(e){return"ok"===e?Xs("✓"):"warn"===e?Qs("⚠"):Zs("✗")}(e)} ${Ys(t.padEnd(14))} ${o}`)}function ol(e){console.log(` ${Vs("↳")} ${Vs(e)}`)}function nl(e){return e instanceof Ut?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function rl(){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(W.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 al(){try{await Mo();let e=(Z.models?.data.length??0)>0;return tl(e?"ok":"warn","Model catalog",e?function(){let e=Z.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 tl("fail","Model catalog",nl(e)),ol("Could not fetch /models — check connectivity/auth."),!1}}async function il(e){Z.accountType=e.accountType;let t=await Et(),o=Ot();if(console.log(""),console.log(` ${Ys("COPILOT-API DOCTOR")} ${Vs(`v${t}`)}`),console.log(el),tl("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await Y(),Fo(),!await async function(){let e=await rl();if(!e)return tl("fail","Auth token","not found"),void ol("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");Z.githubToken=e.token,tl("ok","Auth token",`found (${e.source})`);try{let e=await uo();return await lt(Z,e.login),tl("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return tl("fail","GitHub auth",nl(e)),void ol("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(el),console.log(` ${Zs("✗")} ${Ys("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await co();return Z.copilotToken=e,tl("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Ut?e.response.status:0;return tl("fail","Service token",nl(e)),ol(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 al();await async function(){try{let e=await wn(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${mn(fn(t))} of ${mn(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;tl("ok","Copilot plan",`${e.copilot_plan} · ${o} `+Vs(`(resets ${e.quota_reset_date})`))}catch(e){tl("warn","Copilot plan",`unavailable (${nl(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Ws();return e.ok?(tl("ok","Generation",`works via ${e.model} ${Vs(`(${e.durationMs}ms)`)}`),!0):(tl("fail","Generation",`${e.reason}${e.status?Vs(` [HTTP ${e.status}]`):""}`),!1)}():tl("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){tl(t,"Client config","potential base-URL issue");for(let t of e)ol(t)}else tl("ok","Client config","no base-URL issues detected");ol("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(el),a?(console.log(` ${Xs("✓")} ${Ys("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Qs("⚠")} ${Ys("Some checks need attention")} — see the ${Zs("✗")}/${Qs("⚠")} lines above.`),console.log(""),2)}const sl=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 il({accountType:e["account-type"]});g.exit(t)}});function ll(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 cl=!1;const ul="copilot-api-node20",pl=`https://registry.npmjs.org/${ul}/latest`,dl=e=>`[1m${e}[0m`,ml=e=>`[33m${e}[0m`;async function fl(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(pl,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function hl(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}let gl,_l;async function yl(e){try{let[t,o]=await Promise.all([Et(),fl(e)]);return"unknown"!==t&&o&&function(e,t){let o=e.split(".").map(Number),n=t.split(".").map(Number),r=Math.max(o.length,n.length);for(let e=0;e<r;e++){let t=o[e]??0,r=n[e]??0;if(t<r)return!0;if(t>r)return!1}return!1}(t,o)?{current:t,latest:o}:null}catch{return null}}function wl(){if(!gl||!_l)return;let{signal:e}=_l;gl.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${ul}@latest`,n=ml("│"),r=` ${dl("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${dl(o)} to update`,i=" ".repeat(54),s=ml(`╭${"─".repeat(54)}╮`),l=ml(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${hl(r,54)}${n}`,`${n}${i}${n}`,`${n}${hl(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var kl={posts:[{title:"I Almost Bought an AI Code Reviewer. Then I Did the Math.",teaser:"100+ repos. Every PR reviewed by AI. Under $1K a month.",url:"https://barazany.dev/blog/claude-code-pr-reviewer",date:"2026-06-09"},{title:"I Had Claude Mine 30 Days of My Own Messages. What It Found Was Uncomfortably Accurate.",teaser:"I had Claude read a month of my messages. It nailed me.",url:"https://barazany.dev/blog/mining-claude-history-ultracode",date:"2026-06-05"},{title:"The 5-Hour Quota, Boris's Tweet, and What the Source Code Actually Reveals",teaser:"Claude Code's caching story — decoded from the source.",url:"https://barazany.dev/blog/claude-code-token-caching",date:"2026-04-01"}]};const bl=262144,vl="https://barazany.dev",xl=/^[a-z0-9][a-z0-9-]*$/i,Tl=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function $l(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(Tl," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function Al(e){if("object"!=typeof e||!e)return null;let t=e,o=$l(t.title,100),n=$l(t.teaser??t.excerpt??t.description,120),r=function(e){if("string"!=typeof e||e.length>2048)return null;let t;try{t=new URL(e)}catch{return null}if(t.origin!==vl||t.username||t.password)return null;let o=t.href;return/^[\x21-\x7E]+$/.test(o)?o:null}(t.url);if(null===r&&void 0===t.url&&"string"==typeof t.slug&&xl.test(t.slug)&&(r=`${vl}/blog/${t.slug}`),!o||!n||null===r)return null;let a=function(e){if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e))return Number.isFinite(Date.parse(e))?e.slice(0,10):void 0}(t.date);return a?{title:o,teaser:n,url:r,date:a}:{title:o,teaser:n,url:r}}function Sl(e){let t=e;if(!Array.isArray(e)&&"object"==typeof e&&e&&(t=e.posts),!Array.isArray(t))return[];let o=[];for(let e of t){let t=Al(e);t&&o.push(t)}let n=e=>e.date?Date.parse(e.date):-1/0;return o.sort((e,t)=>n(t)-n(e)).slice(0,3)}let El=null;function Ol(e){return s.join(e,"blog-posts.json")}function Cl(e=W.APP_DIR){try{if(El&&El.length>0)return El;let t=function(e){try{let t=Ol(e);return B.statSync(t).size>bl?[]:Sl(JSON.parse(B.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Sl(kl)}catch{return[]}}function Il(e){return e>-6e4&&e<864e5}async function Pl(e){let t=new AbortController,o=setTimeout(()=>t.abort(),e);"object"==typeof o&&"unref"in o&&o.unref();try{let e=await fetch("https://barazany.dev/posts.json",{signal:t.signal,headers:{accept:"application/json"}});if(!e.ok)return await(e.body?.cancel().catch(()=>{})),[];let o=await async function(e,t){let o=Number(e.headers.get("content-length"));if(Number.isFinite(o)&&o>bl)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>bl?null:t}let n=e.body.getReader(),r=()=>{n.cancel().catch(()=>{})};t.addEventListener("abort",r,{once:!0});let a=[],i=0;try{for(;;){let{done:e,value:t}=await n.read();if(e)break;if(i+=t.byteLength,i>bl)return await n.cancel().catch(()=>{}),null;a.push(t)}}finally{t.removeEventListener("abort",r)}return t.aborted?null:Buffer.concat(a).toString("utf8")}(e,t.signal);return null===o?[]:Sl(JSON.parse(o))}finally{clearTimeout(o)}}async function Rl(e={}){try{if("1"===g.env.COPILOT_API_NO_BLOG||"1"===g.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??W.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=Ol(e),n=await B.promises.stat(o);if(n.size<=bl){let e=await B.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Il(t-n.fetchedAt)}return Il(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await Pl(e.timeoutMs??3e3);if(0===n.length)return;El=n,await async function(e,t,o){let n=Ol(e),r=`${n}.${g.pid}.tmp`;try{await B.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await B.promises.rename(r,n)}catch(e){throw await B.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function Nl(e){if("foundry"===e.provider)return Z.foundry=function(e){let t=e.FOUNDRY_ENDPOINT,o=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");if(!o)throw Error("--provider foundry requires FOUNDRY_API_KEY");let n=fo(t),r=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:n,anthropicEndpoint:r?fo(r,"FOUNDRY_ANTHROPIC_ENDPOINT"):go(n),apiKey:o,deployments:_o(e.FOUNDRY_DEPLOYMENTS)}}(process.env),Z.connectivity.h2=!1,Z.connectivity.h2Keepalive=!1,o.info(`Using Microsoft Foundry upstream: ${Z.foundry.endpoint}`),{login:"foundry"};e.githubToken&&o.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let t,n=e.githubToken||process.env.GH_TOKEN;n?(function(e){Z.githubToken=e,Wo=!1}(n),o.info("Using provided Auth token")):await rn();try{t=await uo(),await lt(Z,t.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}return await(async()=>{let{token:e,refresh_in:t}=await co();Z.copilotToken=e,o.debug("Service token fetched successfully!"),Z.showToken&&o.info("Service token:",e),Jo=!0,nn(t),ot.start(),Lo=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),tn(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},zo=()=>{o.debug("Network connectivity lost")},ot.on("online",Lo),ot.on("offline",zo)})(),t}function ql(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 Dl=e=>`[1m${e}[0m`,jl=e=>`[2m${e}[0m`,Ml=e=>`[36m${e}[0m`,Fl=e=>`[32m${e}[0m`,Hl=e=>`[33m${e}[0m`,Ul=e=>`[4m${e}[0m`,Bl=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Ll="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",zl="https://github.com/johnib/copilot-api-issues/issues",Gl=jl(" ─────────────────────────────────────────────────────────────");function Kl(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Jl(e){return e&&0!==e.length?e.join("·"):"—"}function Wl(e){if(0===e.length)return[];let t=["",Gl,` ${Dl("BARAZANY.DEV")} ${jl("— Recent Posts")}`,Gl,""];for(let[o,n]of e.entries()){let e=`${n.url}${Ll}`,r=Bl(e,Dl(Ul(`[${o+1}]`)));t.push(` ${r} ${Ml(n.title)}`,` ${jl("→")} ${jl(n.teaser)}`,"")}return t.push(Gl,` ${Bl(`https://barazany.dev/blog${Ll}`,"barazany.dev/blog")}`,Gl),t}function Yl(e){let t=[];Z.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):Z.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(jl(" → "))} ${Fl("✓")}`:jl("off"),n=["",` ${Dl("COPILOT-API")} ${jl(`v${e.version}`)}`,Gl,` ${jl("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${jl("User")} ${e.user} ${jl("·")} ${e.accountType}`];return Z.vsCodeVersion&&n.push(` ${jl("Client")} VSCode ${Z._v1}`),n.push(` ${jl("Network")} ${t.join(jl(" · "))}`,` ${jl("Search")} ${o}`),e.clipboardCopied&&n.push(` ${jl("Clipboard")} Claude Code command ${Fl("✓")}`),n.push(Gl),n}function Vl(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Dl("Active")}`];if(e.model){let o=Z.models?.data.find(t=>t.id===e.model),n=Kl(o?.capabilities.limits?.max_context_window_tokens),r=Jl(o?.capabilities.supports.reasoning_effort);t.push(` ${Ml(e.model.padEnd(32))} ${jl("ctx")} ${Dl(n.padStart(5))} ${jl("effort")} ${jl(r)} ${Hl("← main")}`)}if(e.smallModel){let o=Z.models?.data.find(t=>t.id===e.smallModel),n=Kl(o?.capabilities.limits?.max_context_window_tokens),r=Jl(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${jl("ctx")} ${n.padStart(5)} ${jl("effort")} ${jl(r)} ${Hl("← small")}`)}return t}function Xl(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of Z.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("",` ${Dl(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Ml("●"):jl("·"),i=n?Ml(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Kl(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Jl(r.effort)}`;t.push(` ${a} ${i} ${jl(s)}${jl(l)}`)}}return t}function Zl(){let e=zl.replace(/^https:\/\//,""),t=Bl(`${zl}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Gl,` ${Dl("FOUND A BUG?")} ${jl("— Report it on GitHub")}`,Gl,"",` ${Ml("→")} ${Ml(t)}`,` ${jl("Bug reports, feature requests, and questions welcome.")}`,"",Gl]}function Ql(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=["",Gl,` ${Dl("Claude Cowork")} ${jl("— Settings → Inference Provider")}`,Gl,"",` ${jl("Paste into")} ${Dl("inferenceGatewayBaseUrl")}${jl(":")}`,` ${Dl(Ml(r))}`];return n||a.push("",` ${jl("Your Tailscale hostname is shown by:")} ${Ml("tailscale status --self")}`),a.push("",` ${jl("Docs:")} ${Ml("https://claude.com/docs/cowork/3p/installation")}`),a}function ec(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Gl,` ${Dl("HTTPS")} ${jl("— self-signed cert")}`,Gl,"",` ${jl("Cert")} ${t}`];switch(o.push("",` ${Dl("Trust this cert")} ${jl("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${jl("macOS:")}`,` ${Ml("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Ml(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${jl("Windows (PowerShell as Administrator):")}`,` ${Ml(`Import-Certificate -FilePath "${t}" \``)}`,` ${Ml("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${jl("Linux (Debian/Ubuntu):")}`,` ${Ml(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Ml("sudo update-ca-certificates")}`,` ${jl("Linux (Fedora/RHEL/Arch):")}`,` ${Ml(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Ml("sudo update-ca-trust")}`);break;default:o.push(` ${jl("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${jl("Or, for Node CLIs only (no admin needed):")}`,` ${Ml(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Gl),o}function tc(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 oc=s.join(W.APP_DIR,"certs"),nc=s.join(oc,"cert.pem"),rc=s.join(oc,"key.pem"),ac=s.join(oc,"cert.meta.json");async function ic(e){try{return await a.readFile(e,"utf8")}catch{return}}async function sc(e){let t=await ic(nc),o=await ic(rc),n=await async function(){let e=await ic(ac);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 lc(e){return 0!==G(e)}async function cc(e){await a.mkdir(oc,{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)lc(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 K([{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(nc,l.cert,{mode:420}),await a.writeFile(rc,l.private,{mode:384}),await async function(e){await a.writeFile(ac,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:nc,keyPath:rc,generated:!0}}const uc=[],pc=Date.now();let dc="";function mc(){let e=async(e,t=0)=>{let n=ge.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()-pc)/1e3}});for(let t of uc)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Bl("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Gl,` ${Dl("COPILOT-API")} ${jl(`v${e}`)} ${jl("·")} ${tc(t)} uptime`,Gl,""," Check in from time to time on",` ${Ml(o)}`,"",Gl,""];console.log(n.join("\n"))}(dc,Date.now()-pc),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)})}const fc=e=>e.filter(e=>"embeddings"!==e.capabilities.type).map(e=>e.id),hc=e=>e.filter(e=>"embeddings"!==e.capabilities.type&&(e.supported_endpoints?.includes("/responses")??!0)).map(e=>e.id);async function gc(e,t,n){if(!e.claudeCode)return!1;Z.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));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,fc(Z.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:fc(Z.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:fc(Z.models.data)}));let s=ql({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(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function _c(e){return e.githubToken?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function yc(e){let{options:t,version:o,runtime:n,githubUser:r}=e,a=ge.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Xe({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,claudeCode:t.claudeCode,model:t.model,smallModel:t.smallModel,githubTokenSource:_c(t)},runtime:n,identity:{githubUser:r.login,machineId:Z.machineId,sessionId:Z.sessionId,vsCodeVersion:Z.vsCodeVersion},connectivity:Z.connectivity,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-pc},"copilot_api")});if(Z.models?.data)for(let e of Z.models.data)a.addEvent("copilot_api.model.available",Xe(e,"model"));a.end(),We(_.INFO,"INFO","Server started",Xe({version:o,port:t.port,accountType:t.accountType,githubUser:r.login,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-pc},"copilot_api"))}async function wc(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 sc(e)){let e=await ic(nc),t=await ic(rc);if(e&&t)return{cert:e,key:t,certPath:nc,keyPath:rc,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),cc(e)}(e.httpsHosts)}}async function kc(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=Hn;try{L(t),L(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(mc(),uc.push(()=>{o.debug("Cleaning up connectivity monitor"),ot.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),Jo=!1,Uo&&=void clearInterval(Uo),Lo&&=void ot.off("online",Lo),zo&&=void ot.off("offline",zo),Bo=void 0,Go=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=[...qr.keys(),...Dr];qr.clear(),Dr.clear(),Nr.clear(),jr=void 0;for(let t of e)Hr(t)&&(qe.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!pe)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([pe.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.claudeCode&&t.codex)throw Error("Cannot use --claude-code and --codex together");Z.provider=t.provider,Z.accountType=t.accountType,Z.manualApprove=t.manual,Z.rateLimitSeconds=t.rateLimit,Z.rateLimitWait=t.rateLimitWait,Z.showToken=t.showToken,Z.timeoutMs=t.timeout,Z.connectivity.timeoutMs=t.connectTimeout,Z.webSearchProviders=t.webSearchProviders,Z.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;Z.connectivity.h2=t,Z.connectivity.h2Keepalive=e}(),await Y(),Rl().catch(()=>{}),Fo();let n=await Et();dc=n;let r=Ot();!function(e,t){t&&(me=t),de=crypto.randomUUID();let o=v({[S]:"copilot-api",[E]:e,[A]:de}),{endpoint:n,headers:r}=he();pe=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:[]}),pe.start()}(n,pc);let a=await Nl(t);await async function(){try{return await Mo(),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,n=e instanceof Error?e.message:"Unknown error occurred",r=void 0===t?"":` (HTTP ${t})`,a="foundry"===Z.provider?"Foundry":"Copilot";return o.warn(`Could not fetch model list from ${a}${r}: ${n}. This is likely a transient network or authentication issue. The proxy will start anyway; model listing endpoints may return empty until the cache is populated.`),!1}}()||function(e){let t=setTimeout(()=>{Mo().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{Mo().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)}}();uc.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),Z.connectivity.h2&&(Lr(Br(ct(Z))),Z.connectivity.h2Keepalive&&Gr()),yc({options:t,version:n,runtime:r,githubUser:a});let s=await wc(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await gc(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(Z.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=hc(Z.models.data);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);r=e.model}else r=await o.prompt("Select a model to use with Codex CLI",{type:"select",options:hc(Z.models.data)});let a=ql({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,c,s);(function(e){let t=[...Yl(e),...Vl(e),...Xl(e),...Zl(),"",...Wl(Cl()),...Ql(e),...ec(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 En()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),wl(),z({fetch:Gs.fetch,port:t.port,hostname:t.hostname,tls:s?{cert:s.cert,key:s.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(l,t.hostname,t.port),t.smokeTest&&"copilot"===t.provider&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await Ws({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: ${Xn(r.detail)}`),o.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){o.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(c,t.smallModel??t.model,t.hostname)}function bc(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const vc=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT and FOUNDRY_API_KEY). Overrides COPILOT_API_PROVIDER.'},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:bc(t,"--rate-limit"),r=e.timeout,a=void 0===r?X:bc(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:bc(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],g.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??g.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!ls(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${ss.join(", ")}`);let r=n.length>0?n:ss,a=new Set,i=n.length>0,s=[];for(let e of r){if(!ls(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:u}),d=(g.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d;return kc({provider:Ao(e.provider,g.env.COPILOT_API_PROVIDER),port:bc(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:n,rateLimitWait:e.wait,githubToken:e["github-token"],claudeCode:e["claude-code"],codex:e.codex,model:e.model,smallModel:e["small-model"],showToken:e["show-token"],timeout:a,connectTimeout:i,webSearchProviders:p,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!m})}});cl||(cl=!0,o.setReporters([ll(o.options.reporters)]));const xc=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(gl||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;_l=e,gl=yl(e).catch(()=>null)})(),xc||wl();const Tc=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:ln,start:vc,"check-usage":xn,debug:Pt,doctor:sl,"cowork-setup":Yn}});await t(Tc),xc||(_l?.abort(),_l=void 0,gl=void 0);export{};
|
|
2
|
+
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{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 b}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as k}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as $}from"@opentelemetry/sdk-metrics";import{NodeSDK as T}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 O,request as C}from"undici";import{createHash as I,randomBytes as P,randomUUID as R}from"node:crypto";import{promisify as N}from"node:util";import{Hono as q}from"hono";import{cors as j}from"hono/cors";import{streamSSE as D}from"hono/streaming";import{events as M}from"fetch-event-stream";import{Tokenizer as F,models as H}from"ai-tokenizer";import*as U from"ai-tokenizer/encoding/claude";import B,{accessSync as L}from"node:fs";import{serve as z}from"srvx";import{isIP as G}from"node:net";import{generate as K}from"selfsigned";const J=s.join(i.homedir(),".local","share","copilot-api"),W={APP_DIR:J,GITHUB_TOKEN_PATH:s.join(J,"github_token"),MACHINE_ID_PATH:s.join(J,"machine_id"),SESSION_ID_PATH:s.join(J,"session_id")};async function Y(){await a.mkdir(W.APP_DIR,{recursive:!0}),await V(W.GITHUB_TOKEN_PATH),await V(W.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 X=6e5,Z={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:X,webSearchProviders:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}};function Q(e){let[t="",o=""]=e.trim().split(/\s+/,2),n=o&&"undefined"!==o&&"null"!==o?/^(?:ghu|gho|ghp|ghs|ghr|github_pat)_/.exec(o)?.[0]??"opaque":"missing";return`${t.toLowerCase()} ${n}`}const ee=" │ ",te=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()},oe=(e,t)=>e.padEnd(t),ne=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),re=(e,t,o)=>` --\x3e ${oe(e,4)} ${oe(t,21)} ${oe(o,3)}`,ae=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return oe(t,22)})(e.model??"—")+oe(t,8)},ie=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?te(Math.max(t-o,0)):"—",r=e?te(e.outputTokens??0):"—",a=o?te(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},se=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${oe("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=te(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},le=e=>{if(void 0===e.ttfbMs)return`e2e ${ne(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${ne(e.ttfbMs)} → e2e ${ne(e.e2eMs)} ${t}`},ce=e=>e?Z.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,ue=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}}),pe={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=>[re(e.method,e.path,e.status),ae(e),ie(e.tokenUsage),se(e.tokenUsage,e.maxContextTokens),le({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(ee))({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:ce(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),Ve(_.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)},...ue(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=>[re(e.method,e.path,"429"),ae(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${ne(e.e2eMs)}`].join(ee))({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=re(e.method,e.path,e.status.toString()),o=ae(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${ne(e.e2eMs)}`].join(ee)})({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(()=>pe.cleanup(),6e4);let de,me,fe=Date.now();const he={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function ge(){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):he;return{endpoint:e.replace(/\/$/,""),headers:t}}async function _e(){if(!de)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([de.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}const ye=d.getTracer("copilot-api"),we=p.getMeter("copilot-api"),be=y.getLogger("copilot-api"),ke=we.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),ve=we.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),xe=we.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),$e=we.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),Te=we.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Ae=we.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Se=we.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ee=we.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Oe=we.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Ce=we.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ie=we.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Pe=we.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Re=we.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Ne=we.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),qe=we.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),je=we.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),De=we.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Me=we.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Fe=we.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),He=we.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Ue=we.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Be=we.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Le=we.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),ze=we.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Ge=we.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Ke=we.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Je=we.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),We=we.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),Ye=we.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function Ve(e,t,o,n,r){let a=d.getActiveSpan()?.spanContext()??r;be.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function Xe(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 Ze(e,t,o){Xe(e,o),t&&t!==e&&Xe(t,o)}function Qe(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,Qe(r,e)))}return o}we.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!rt.getConnectivityStats().isOnline)}),we.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(rt.getConnectivityStats().consecutiveFailures)}),we.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(Z.models?.data.length??0)}),we.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(pe.completionCallbacks.size)}),we.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-fe)/1e3)});const et=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function tt(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();"authorization"===o&&e.setAttribute(`http.${t}.header.authorization.shape`,Q(r)),!et.has(o)&&e.setAttribute(`http.${t}.header.${o}`,r)}}async function ot(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:u}=e,p=ye.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&tt(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();et.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),Re.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 Xe(p,e),p.end(),e}}async function nt(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=ye.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});tt(f,"request",a);try{let{statusCode:e,headers:t,body:l}=await C(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&&!et.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Re.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 Xe(f,e),f.end(),e}}const rt=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:Z.connectivity.probeEndpoints,fastInterval:Z.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?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval)+Math.random()*Z.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ye.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),Z.connectivity.timeoutMs);try{let n=!1;for(let e of Z.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",...Z.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Ge.record(r,{endpoint:e,result:"success"});break}Ge.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),Ie.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")),Pe.add(1,{from:"offline",to:"online"}),Ve(_.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")),Pe.add(1,{from:"online",to:"offline"}),Ve(_.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?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*Z.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:Z.connectivity.jitterMaxMs>0,connectionPooling:Z.connectivity.connectionPooling,dnsCache:Z.connectivity.dnsCache}}},at=()=>({"content-type":"application/json",accept:"application/json"}),it="0.48.1",st=`copilot-chat/${it}`,lt=`GitHubCopilotChat/${it}`,ct=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`${W.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=I("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},ut=async(e,t)=>{e.machineId||=await ct(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(W.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(W.SESSION_ID_PATH,e),await a.chmod(W.SESSION_ID_PATH,384),e})()},pt=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,dt=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=R(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":st,"User-Agent":lt,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":R(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},mt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const ft=(e,t,o)=>{let n=dt(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&&mt.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},ht="https://api.github.com",gt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":st,"user-agent":lt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),_t="https://github.com",yt="01ab8ac9400c4e429b23",wt=["user:email"].join(" ");function bt(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 kt=32768,vt=[{regex:/Bearer\s+[\w.-]{20,}/g,mask:"Bearer ***"},{regex:/\bghu_[A-Za-z0-9]{20,}/g,mask:"ghu_***"},{regex:/\bghp_[A-Za-z0-9]{20,}/g,mask:"ghp_***"},{regex:/\bgho_[A-Za-z0-9]{20,}/g,mask:"gho_***"},{regex:/\bghs_[A-Za-z0-9]{20,}/g,mask:"ghs_***"},{regex:/\bghr_[A-Za-z0-9]{20,}/g,mask:"ghr_***"},{regex:/\bsk-[A-Za-z0-9-]{20,}/g,mask:"sk-***"},{regex:/\bhcaik_[A-Za-z0-9]{20,}/g,mask:"hcaik_***"},{regex:/\bapi-key[\x22\x27]?\s*[:=]\s*[\x22\x27]?[\w-]{20,}/gi,mask:"api-key: ***"}],xt=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function $t(e){let t=e;for(let{regex:e,mask:o}of vt)t=t.replace(e,o);return t}const Tt=new Map;function At(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 St(e,t,o){let n=$t(o),r=8*kt,a=n.length>r,i=a?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(i.length<=kt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=kt)e.setAttribute(`${t}.part_${o/kt}`,i.slice(o,o+kt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/kt))}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 Et(e,t){let o=function(e){if(Tt.size>=1e3&&!Tt.has(e)){let e=Tt.keys().next().value;void 0!==e&&Tt.delete(e)}let t,o=(Tt.get(e)??0)+1;return Tt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Me.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&&St(e,"copilot_api.incoming_request_body",n);let r=Ot(t.c.req.header());return r&&St(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&St(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&St(e,"copilot_api.outgoing_headers",Ot(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&St(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function Ot(e){let t={};for(let[o,n]of Object.entries(e))xt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Ct(){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 It(){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 Pt(){try{return!!(await a.stat(W.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(W.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Rt(e){let t=await async function(){let[e,t]=await Promise.all([Ct(),Pt()]);return{version:e,runtime:It(),paths:{APP_DIR:W.APP_DIR,GITHUB_TOKEN_PATH:W.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 Nt=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})=>Rt({json:e.json})}),qt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",jt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Dt=new Set;let Mt;function Ft(e){if(Z.errorReporting&&!(e.statusCode<500)&&!Dt.has(e.signature)){if(Dt.size>=1e3){let e=Dt.values().next().value;void 0!==e&&Dt.delete(e)}Dt.add(e.signature),async function(e){Mt??=Ct();let t=await Mt,o=It(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}($t(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:bt(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(qt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":jt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function Ht(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 Ut=new WeakSet;async function Bt(e,{attempt:t,maxRetries:n,operation:r}){return Ht(e)&&t<n?(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&Ut.add(e)}(e),!1)}var Lt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},zt=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Gt(e,t){return setTimeout(()=>e.abort(new zt(t)),t)}const Kt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Jt=RegExp(`\\b(?:${[...Kt].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 Yt(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 Vt(e){let t=e.code;return"string"==typeof t?t:void 0}function Xt(e){if(void 0===e.cause)return"";let t=Yt(e);if(t===e)return"";let o=Vt(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function Zt(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=>Kt.has(e))||!(t.length>0)&&(!!o.some(e=>Jt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Qt(e){return e.req.path.startsWith("/v1/messages")}function eo(e,t){if(Qt(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 to(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type?o.type=t.type:"string"==typeof t.code&&(o.type=t.code),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function oo(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 no(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 ro(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=At({endpointType:bt(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});Et(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function ao(e,t,o){let n=e.get("requestId"),r=pe.completionCallbacks.get(n);r&&(pe.logError(r,t,o),pe.completionCallbacks.delete(n))}async function io(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=pe.completionCallbacks.get(n);r&&(pe.logRateLimit(r,t.response),pe.completionCallbacks.delete(n)),Ae.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=eo(a,e),s=to(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),oo(o,s),Ve(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...no(s)}),ro({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,o)=>{so.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const so=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;function lo(e,t){(function(e){return"object"==typeof e&&!!e&&Ut.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",Z.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function co(e){return Zt(e)||function(e){return Ht(e)||e instanceof Error&&Ht(e.cause)}(e)}async function uo(e,t){if(lo(d.getActiveSpan(),t),t instanceof Lt&&429===t.response.status)return io(e,t);if(t instanceof SyntaxError){d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),Ve(_.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=Qt(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 ao(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Lt)return async function(e,t){let o=d.getActiveSpan(),n=await t.response.text(),r=eo(n,e),a=to(r);return ao(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"),oo(o,a),Ve(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...no(a)}),ro({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&Ft({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:At({endpointType:bt(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 zt||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof zt}(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.";Ve(_.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=Qt(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return ao(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(co(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?Yt(t):void 0,r=(n&&Vt(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.";Ve(_.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=Qt(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return ao(e,503,t instanceof Error?`${t.message}${Xt(t)}`:i),e.json(s,503)}(e,t);let n=d.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:c.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),Ve(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Ft({route:e.req.path,statusCode:500,errorClass:r.name,signature:At({endpointType:bt(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${Xt(r)}`}),ao(e,500,r.message),o.error(r);let a=Qt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const po=async()=>{let e=`${ht}/copilot_internal/v2/token`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await ot({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:gt(Z),signal:o.signal});try{if(!t.ok)throw new Lt("Failed to get Service token",t);return await t.json()}catch(e){throw Xe(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function mo(){let e=`${ht}/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await ot({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${Z._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Lt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Xe(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let fo=null;function ho(){return"foundry"===Z.provider?Promise.resolve():(fo||=po().then(({token:e})=>{Z._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{fo=null}),fo)}function go(e,t="FOUNDRY_ENDPOINT"){let o,n=e.trim();try{o=new URL(n)}catch{throw Error(`${t} is not a valid URL: "${n}"`)}if("https:"!==o.protocol)throw Error(`${t} must use https, got: "${n}"`);let r=o.pathname.replace(/\/+$/,"").replace(/\/(?:openai|_an1)(?:\/v1)?$/i,"");return`${o.origin}${r}`}const _o=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function yo(e){let t=new URL(e),o=_o.exec(t.hostname)?.[1];return o?`https://${o}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function wo(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,o]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:o||t}});return t.length>0?t:void 0}const bo=e=>({"api-key":e.apiKey,"Content-Type":"application/json",accept:"*/*"}),ko=e=>`${e.anthropicEndpoint}/anthropic`,vo=(e,t)=>({"x-api-key":e.apiKey,"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),xo=e=>"foundry"===e.provider;function $o(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const To=e=>xo(e)?(e=>`${e.endpoint}/openai/v1`)($o(e)):pt(e),Ao=(e,t=!1)=>xo(e)?bo($o(e)):dt(e,t),So=e=>xo(e)?!!e.foundry?.apiKey:!!e._t1;function Eo(e,t){let o=(e??t??"copilot").trim().toLowerCase();if("copilot"===o||"foundry"===o)return o;throw Error(`--provider must be "copilot" or "foundry", got: "${o}"`)}const Oo=[{pattern:/^gpt-6/,context:105e4,output:128e3},{pattern:/^gpt-5/,context:4e5,output:128e3},{pattern:/^gpt-4\.1/,context:1047576,output:32768},{pattern:/^o\d/,context:2e5,output:1e5}],Co={context:128e3,output:16384};function Io(e){return Oo.find(({pattern:t})=>t.test(e))??Co}const Po=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,Ro=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function No(e,t){return{id:e.id,name:e.id,object:"model",vendor:t.vendor,version:e.model,preview:!1,model_picker_enabled:!0,supported_endpoints:t.supported_endpoints,capabilities:{family:e.model,object:"model_capabilities",type:"chat",tokenizer:"o200k_base",limits:t.limits&&{max_context_window_tokens:t.limits.context,max_output_tokens:t.limits.output},supports:{tool_calls:!0,parallel_tool_calls:!0}}}}async function qo(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=Gt(o,Z.timeoutMs);try{let{response:n,span:r}=await ot({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:bo(e),signal:o.signal});try{if(!n.ok)throw new Lt("Failed to list Foundry deployments",n);let e=(await n.json()).data.filter(e=>!e.status||"succeeded"===e.status).map(e=>({id:e.id,model:e.model}));return r.setAttribute("copilot_api.models_count",e.length),e}catch(e){throw Xe(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function jo(e){return{object:"list",data:(e.deployments??await qo(e)).map(e=>function(e){let{model:t}=e;if(!Po.test(t))return(e=>/embedding/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/embeddings"],capabilities:{family:t,object:"model_capabilities",type:"embeddings",tokenizer:"cl100k_base",supports:{}}}:(e=>/^claude/i.test(e))(t)?No(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):Ro(t)?No(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:Io(t)}):No(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:Io(t)})}(e)).filter(e=>void 0!==e)}}const Do=async()=>{let e=`${To(Z)}/models`,t=Ao(Z),o=Z.timeoutMs,n=new AbortController,r=Gt(n,o);try{let{response:o,span:r}=await ot({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Lt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Xe(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()=>{if(xo(Z)&&Z.foundry)return jo(Z.foundry);try{return await Do()}catch(e){if(e instanceof Lt&&401===e.response.status)return await ho(),Do();throw e}})();Z.models=e}const Uo=()=>{Z._v1="1.140.0-insider"};var Bo=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Lo,zo,Go,Ko,Jo,Wo=!1,Yo=!1,Vo=!1;function Xo(){return Zo()?Jo:void 0}function Zo(){return void 0!==Jo&&Date.now()-Jo.at<6e4}function Qo(){return Vo?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const en=()=>a.readFile(W.GITHUB_TOKEN_PATH,"utf8");function tn(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";Z._t1=void 0,Jo={status:s,message:l,at:Date.now()},clearInterval(Lo),Lo=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Oe.add(1,{reason:r,success:"false"}),Ce.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),ze.record(performance.now()-a,{reason:r}),Ve(_.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 on(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;Z._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),Ce.add(1,{reason:r}),ze.record(performance.now()-a,{reason:r}),Ve(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const nn=async(e=5,t=1e3,n="scheduled")=>Wo?(o.debug("Token refresh already in progress, coalescing"),zo):(Wo=!0,zo=ye.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 po();return Z._t1=t,Jo=void 0,Yo&&void 0===Lo&&(o.info("Token refresh recovered, resuming scheduled refresh"),an(s)),o.debug("Service token refreshed successfully"),Z.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Oe.add(1,{reason:n,success:"true"}),ze.record(performance.now()-a,{reason:n}),void Ve(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Lt&&(401===s.response.status||403===s.response.status))return void tn({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),Oe.add(1,{reason:n,success:"false"}),l)return void on({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(),Wo=!1,zo=void 0}}),zo);async function rn(){return!!Z._t1||!Zo()&&(void 0!==Jo&&Vo&&await async function(){if(zo)return;let e=(await en().catch(()=>{}))?.trim();e&&e!==Z._t2?.trim()&&(Z._t2=e,o.info("Picked up re-authenticated Auth token from disk"),Z.showToken&&o.info("Auth token:",e))}(),await nn(3,250,"on-demand"),!!Z._t1)}function an(e){Lo&&clearInterval(Lo);let t=Math.max(1e3*(e-60),6e4);Lo=setInterval(()=>{nn(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function sn(e){try{let t=await en();if(t&&!e?.force)return Z._t2=t,Vo=!0,Z.showToken&&o.info("Auth token:",t),void await ln();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=Z.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${_t}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:yt,scope:wt}),signal:e.signal});if(!t.ok)throw new Lt("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 Bo("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=Z.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${_t}/login/oauth/access_token`,{method:"POST",headers:at(),body:JSON.stringify({client_id:yt,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 Bo("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Bo("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 Bo)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(W.GITHUB_TOKEN_PATH,e,{mode:384}))(r),Z._t2=r,Vo=!0,Z.showToken&&o.info("Auth token:",r),await ln()}catch(e){throw e instanceof Lt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function ln(){let e=await mo();o.success(`Authenticated as ${e.login}`)}async function cn(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),Z.showToken=e.showToken,await Y(),await sn({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 un=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})=>cn({verbose:e.verbose,showToken:e["show-token"]})}),pn=.01,dn=864e5,mn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),fn=new Intl.NumberFormat("en-US"),hn=e=>mn.format(e*pn),gn=e=>e.credits_used??e.entitlement-e.remaining,_n=(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())/dn;if(r<.5)return;let a=gn(e),i=a*pn/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*pn,c=new Date(n.getTime()+l/i*dn);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},yn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${fn.format(gn(e))} of ${fn.format(e.entitlement)} used`:"n/a",wn=e=>e.padEnd(14),bn=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${wn("AI credits")}unlimited`);else{let e=gn(o),t=o.percent_remaining;n.push(`${wn("AI credits")}${hn(e)} / ${hn(o.entitlement)} ${t.toFixed(1)}% left`,`${wn("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${wn("")}${fn.format(e)} of ${fn.format(o.entitlement)} credits`)}if(n.push("",`${wn("Chat")}${yn(e.quota_snapshots.chat)}`,`${wn("Completions")}${yn(e.quota_snapshots.completions)}`,"",`${wn("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/dn)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=_n(o,e.quota_reset_date,t);r&&n.push(`${wn("Burn rate")}~${mn.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?`${fn.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${wn("Overage")}${a}`)}return n.join("\n")},kn=async()=>{let e=`${ht}/copilot_internal/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await ot({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:gt(Z),signal:o.signal});try{if(!t.ok)throw new Lt("Failed to get usage",t);return await t.json()}catch(e){throw Xe(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},vn=()=>g.stdout.write("[2J[H"),xn=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,$n=async()=>{let e=await kn();return bn(e)},Tn=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 Y(),await sn(),!e.watch){try{o.box(await $n())}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 $n();n&&vn(),o.box(e),o.log(xn(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),An=N(f);async function Sn(){let e="win32"===g.platform?"where.exe":"which";try{return await An(e,["tailscale"]),!0}catch{return!1}}async function En(){try{let{stdout:e}=await An("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function On(e){return e.replace(/\.$/,"")}async function Cn(){let e=await En();if(e?.Online)return On(e.DNSName)}const In=N(f),Pn=e=>`[1m${e}[0m`,Rn=e=>`[2m${e}[0m`,Nn=e=>`[36m${e}[0m`,qn=e=>`[32m${e}[0m`,jn=e=>`[31m${e}[0m`,Dn=e=>`[33m${e}[0m`,Mn=Rn(" ─────────────────────────────────────────────────────────────"),Fn=s.join(W.APP_DIR,"certs","tailscale"),Hn=s.join(Fn,"cert.pem"),Un=s.join(Fn,"key.pem"),Bn={certDir:Fn,certPath:Hn,keyPath:Un};function Ln(){switch(g.platform){case"darwin":return[` ${Rn("Install Tailscale for macOS:")}`,` ${Nn("https://tailscale.com/download/mac")}`,` ${Rn("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${Rn("After installing, open the Tailscale app and sign in.")}`,` ${Rn("Then re-run this command.")}`].join("\n");case"linux":return[` ${Rn("Install Tailscale for Linux:")}`,` ${Nn("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Nn("sudo tailscale up")}`,` ${Rn("or")} ${Nn("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${Rn("Install Tailscale for Windows:")}`,` ${Nn("https://tailscale.com/download/windows")}`,"",` ${Rn("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${Rn("Install Tailscale:")} ${Nn("https://tailscale.com/download")}`}}function zn(){let e=[` ${jn("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${Rn("Open the Tailscale app from Applications and sign in.")}`,` ${Rn("Download:")} ${Nn("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${Rn("Open the Tailscale app and sign in.")}`,` ${Rn("Download:")} ${Nn("https://tailscale.com/download/windows")}`):e.push(` ${Rn("Connect with:")} ${Nn("sudo tailscale up")}`),e.push("",` ${Rn("Then re-run this command.")}`),e.join("\n")}async function Gn(){try{return await a.access(Hn),await a.access(Un),!0}catch{return!1}}function Kn(e){console.log(""),console.log(Mn),console.log(` ${Pn("Claude Cowork Setup")} ${Rn("— 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?qn("✅"):"missing"===n.status?jn("❌"):Dn("❓");let r=n.detail?Rn(` ${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(` ${qn("All checks passed.")}`):console.log(` ${jn(`${t.length} issue(s).`)} Run ${Nn("copilot-api cowork-setup install")} to fix.`),console.log("")}const Jn={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},Wn=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Sn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return Kn(e),console.log(""),console.log(Ln()),void console.log("");let o=await En();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},Kn(e),console.log(zn()),void console.log("");let n=On(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await Gn();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>`}),Kn(e)}(),g.exit(0)}}),Yn=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:Jn},async run({args:e}){await async function(e){if(console.log(""),console.log(Mn),console.log(` ${Pn("Claude Cowork Setup")} ${Rn("— Install")}`),console.log(Mn),console.log(""),!await Sn())return console.log(` ${jn("Tailscale is not installed.")}`),console.log(""),console.log(Ln()),console.log(""),console.log(` ${Rn("After installing, run")} ${Nn("tailscale up")} ${Rn("to connect, then re-run this command.")}`),void console.log("");let t=await En();if(!t||!t.Online)return console.log(zn()),void console.log("");let n=On(t.DNSName);if(console.log(` ${Rn("Tailscale hostname:")} ${Pn(n)}`),console.log(""),console.log(` ${Pn("Generating TLS certificate via Tailscale…")}`),console.log(` ${Rn("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Nn(`$ tailscale cert --cert-file ${Hn} --key-file ${Un} ${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 In("tailscale",["cert","--cert-file",Hn,"--key-file",Un,n]),console.log(` ${qn("✓ 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(` ${Pn("Next steps")}`),console.log(Mn),console.log(""),console.log(` ${Pn("1.")} Start the proxy:`),console.log(` ${Nn("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Pn("2.")} In Cowork ${Rn("→")} Settings ${Rn("→")} Inference Provider, set:`),console.log(` ${Pn("inferenceGatewayBaseUrl")} = ${Nn(`https://${n}:<port>`)}`),console.log(` ${Rn("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Pn("3.")} Restart Cowork ${Rn("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${Rn("For Cowork's own configuration docs, see:")}`),console.log(` ${Nn("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),Vn=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:Jn},async run({args:e}){await async function(e){if(console.log(""),console.log(Mn),console.log(` ${Pn("Claude Cowork Setup")} ${Rn("— Revert")}`),console.log(Mn),console.log(""),!await Gn())return console.log(` ${Rn("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${Pn("Remove Tailscale cert files:")}`),console.log(` ${Rn(Hn)}`),console.log(` ${Rn(Un)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(Fn,{recursive:!0}),console.log(` ${qn("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${Rn("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),Xn=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:Wn,install:Yn,revert:Vn}}),Zn=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Qn(e){if(!Zn.test(e))return e;let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],a=r.match(/^\[[0-9;]*[a-z]/i);t+=a?r.slice(a[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function er(e){return"string"==typeof e?Qn(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=er(n);!t&&r!==n&&(t=e.slice(0,o)),t?.push(r)}return t??e}(e):e&&"object"==typeof e?function(e){let t,o=Object.entries(e),n="thinking"===e.type;for(let e=0;e<o.length;e++){let[r,a]=o[e],i=!n||"thinking"!==r&&"signature"!==r?er(a):a;!t&&(i!==a||"__proto__"===r)&&(t=tr({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=tr({},o,o.length),t.properties={}),t??e}(e):e}function tr(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const or="x-copilot-api-self-test",nr=R();const rr=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function ar(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 ir(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();et.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(ke.add(1,d),Fe.record(s,d),c>=400&&ve.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&&(xe.add(e.inputTokens,t),Ke.record(e.inputTokens,t)),e.outputTokens&&($e.add(e.outputTokens,t),Je.record(e.outputTokens,t)),e.cachedTokens&&Te.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&pe.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const sr=1048576;const lr=async()=>ye.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),Ye.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),qe.add(1,{result:"rejected"}),new Lt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),qe.add(1,{result:"approved"})}finally{e.end()}});async function cr(e){if(So(Z)||await rn())return null;let t=Xo();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Qo()}`,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 ur(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 pr(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 dr=[{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"}],mr="claude-haiku-4.5",fr={haiku:mr,"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 hr(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 dr)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=fr[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 gr=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function _r(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=gr.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=gr.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var yr=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function wr(e){if(!e||"string"!=typeof e)throw new yr("Model name is required and must be a string");if("foundry"===Z.provider)return e;if(!Z.models?.data)throw new yr("Models not available. Please try again later.",503);let t=Z.models.data.map(e=>e.id);if(t.includes(e))return e;let o=hr(e,t);if(!o)throw Se.add(1,{requested_model:e}),new yr(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function br(e){let t=Z.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===Z.provider?Ro(e):/gpt-[\d.]+-codex/i.test(e)}async function kr(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return ye.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"),Ae.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Lt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Ae.add(1,{action:"waited",source:"local"}),Be.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 vr=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function xr(e){if(e instanceof vr)return{type:e.type,message:e.message};if(e instanceof Lt){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 $r(e,t){let{type:n,message:r}=xr(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 Tr(e,t){let{type:n,message:r}=xr(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 Ar(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 Sr(e,t,o){return Math.min(Math.max(e,t),o)}function Er(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 Er(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=Ar(o.capabilities.supports.min_thinking_budget),r=Ar(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Ar(o.capabilities.limits?.max_output_tokens)??void 0}}function Cr(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Sr(Ar(e.requestedBudget)??o,o,n),a=Ar(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 Ir(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=Cr({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 Pr(e){return"invalid_thinking_budget"===Er(e)}async function Rr(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(!Pr(i))return null;let l=Or(n,t.model);return l?function(e,t){let o=Cr({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=Ar(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 Nr(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 qr(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const jr=new Map,Dr=new Map,Mr=new Set;let Fr,Hr,Ur;function Br(e){return!e.closed&&!e.destroyed}function Lr(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new O(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return jr.set(t,Date.now()),De.add(1,{event:"created",origin:e}),Ve(_.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=Mr.has(t);De.add(1,{event:"goaway",origin:e}),Ve(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}),Dr.delete(t),Mr.delete(t),jr.delete(t),Br(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function zr(e,t){if(!Z.connectivity.h2)return;if(Fr&&Fr!==e&&function(){for(let e of[...Dr.keys(),...Mr])Br(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Dr.clear(),Mr.clear(),jr.clear()}(),Fr=e,t?.fresh){let t=Lr(e);return Mr.add(t),t}let n=Date.now();for(let[t]of Dr)if(n-(jr.get(t)??0)>=6e5)Dr.delete(t),jr.delete(t),Br(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),De.add(1,{event:"rotated",origin:e}),Ve(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Br(t))return Dr.delete(t),Mr.add(t),t;Dr.delete(t),jr.delete(t)}let r=Lr(e);return Mr.add(r),r}function Gr(e){e&&Mr.delete(e)&&(Br(e)?Dr.set(e,Date.now()):jr.delete(e))}function Kr(){Ur||(Ur=setInterval(()=>{!function(){let e=Date.now(),t=Z.connectivity.h2Keepalive,n=Dr.size;for(let[r,a]of Dr)e-a<6e4||t&&n<=1||(Dr.delete(r),jr.delete(r),n--,Br(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),De.add(1,{event:"idle_reaped",origin:Fr??""}),Ve(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${Fr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Fr??""}))}()},3e4),Ur.unref())}function Jr(){Hr||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Hr=setInterval(()=>{(async function(){if(0===Dr.size&&0===Mr.size){if(Fr){let e=Lr(Fr);Dr.set(e,Date.now())}return}let e=[...Dr.keys()];for(let t of e)Dr.delete(t);await Promise.allSettled(e.map(async e=>{if(Br(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:dt(Z)});await n.dump(),je.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Dr.set(e,Date.now())}catch(t){je.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),De.add(1,{event:"error",origin:Fr??""}),jr.delete(e),Br(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else jr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Hr.unref(),Kr())}function Wr(e){return e.max_completion_tokens??e.max_tokens}async function Yr(e,t,o){try{if(!e.ok)throw new Lt("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&&pr(t,n.usage),n}catch(e){throw Xe(t,e),e}finally{t.end()}}const Vr=e=>xo(Z)?e:function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=Wr(e);return null==i?a:{...a,max_completion_tokens:i}}(e,Z.models),Xr=e=>xo(Z)?e:er(e),Zr=async e=>{let t=Xr(e);try{return await Qr(t)}catch(e){if(e instanceof Lt&&401===e.response.status)return await ho(),Qr(t);let n;if(e instanceof Lt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Rr({payload:t,error:e,models:Z.models,errorBodyText:n});if(r)return e instanceof Lt&&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 Qr(Xr(r));throw e}},Qr=async e=>{if(!So(Z))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={...Ao(Z,t),"X-Initiator":o?"agent":"user"},r=To(Z),a=`${r}/chat/completions`,i=Z.timeoutMs,s=Vr(e),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":Wr(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=zr(r,{fresh:t>0}),s=new AbortController,u=Gt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await nt({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 Lt("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:M(m),span:d,release:()=>Gr(o)}}try{return await Yr(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{Gr(o)}}catch(e){if(Gr(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")},ea=new Map;const ta=["none","minimal","low","medium","high","xhigh","max"];function oa(e,t){if(!e.reasoning)return e;if(0===t.length){let{reasoning:t,...o}=e;return o}let o=e.reasoning.effort;if(!o)return e;let n=function(e,t){if(t.includes(e))return e;let o=ta.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=ta.indexOf(e);if(-1===t)continue;let a=Math.abs(t-o);a<r&&(r=a,n=e)}return n??t[0]}(o,t);return n&&n!==o?{...e,reasoning:{...e.reasoning,effort:n}}:e}function na(e,t){if(!e.reasoning)return null;let n=function(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}let{param:o,code:n,message:r=""}=t.error??{};if("reasoning.effort"===o||"reasoning"===o){if("unsupported_value"===n){let e=[...(/Supported values are:(.*)$/i.exec(r)?.[1]??"").matchAll(/\x27([^\x27]+)\x27/g)].map(e=>e[1]);return e.length>0?{kind:"unsupported_value",supported:e}:void 0}if("unsupported_parameter"===n)return{kind:"unsupported_parameter"}}}(t);if(!n)return null;let r="unsupported_value"===n.kind?n.supported:[];ea.set(e.model,r);let a=oa(e,r);return a===e?null:(o.debug(`Foundry rejected reasoning.effort=${e.reasoning.effort} on ${e.model}; retrying with ${a.reasoning?.effort??"no reasoning"}`),a)}async function ra(e,t,o){try{if(!e.ok)throw new Lt("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&&pr(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens,prompt_tokens_details:n.usage.input_tokens_details}),n}catch(e){throw Xe(t,e),e}finally{t.end()}}const aa=async e=>{let t=xo(Z),o=t?function(e){let t=ea.get(e.model);return t?oa(e,t):e}(e):e;try{return await ia(o)}catch(e){if(e instanceof Lt&&401===e.response.status)return await ho(),ia(o);if(t&&e instanceof Lt&&400===e.response.status){let t=na(o,await e.response.clone().text().catch(()=>{}));if(t)return ia(t)}throw e}},ia=async e=>{if(!So(Z))throw Error("Service token not found");let t=xo(Z)?e:er(e),o={...Ao(Z),"X-Initiator":"agent"},n=To(Z),r=`${n}/responses`,a=Z.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=zr(n,{fresh:e>0}),c=new AbortController,u=Gt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await nt({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 Lt("Failed to create responses",m,{outgoingBody:i,outgoingHeaders:o});return{events:M(m),span:d,release:()=>Gr(l)}}try{return await ra(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{Gr(l)}}catch(t){if(Gr(l),await Bt(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},sa=e=>Object.hasOwn(e,"output");function la(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens,...t.input_tokens_details&&{prompt_tokens_details:{cached_tokens:t.input_tokens_details.cached_tokens}}}:null}var ca=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const ua=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 pa(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new ca(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new ca(`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=>ma(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=fa(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=ma(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:ma(o.content)})}return t}(e.messages);if(0===o.length)throw new ca("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),da(e.temperature)&&(n.temperature=e.temperature),da(e.top_p)&&(n.top_p=e.top_p),da(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),da(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 da(e){return null!=e}function ma(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function fa(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 ca(`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 ha(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 ga(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 _a(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 ya(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function wa(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=ya(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[_a(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),[_a(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function ba(e,t){let o=[_a(e,{},ga(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=ha(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function ka(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:[_a(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:wa(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=ya(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[_a(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:ba(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 va="openai_responses";function xa(e){let t=performance.now(),n=ye.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),pa(e)}finally{t.end()}});Le.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!ua.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 $a(e){let t=performance.now(),o=ye.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:ga(e,n.length>0)}]};return e.usage&&(r.usage=ha(e.usage)),r}(e)}finally{t.end()}});return Le.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Ta(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=ha(t.usage);a.tokenUsage=ur(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($a(t))}async function Aa(e,t,n){let r;try{r=xa(t)}catch(t){if(t instanceof ca)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}),Z.manualApprove&&!n.isSelfTest&&await lr();let a=await cr(e);if(a)return a;let i=performance.now(),s=await aa(r),l=performance.now()-i;if(He.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),sa(s))return Ta(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=Nr(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++,Ne.add(1,{model:r.model,endpoint_type:va});let c=la(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=ur(c),t._d1=l,e.set("requestData",t)}let u=ka(s,m);if(u.error)throw new vr(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:va};Ue.record(performance.now()-s,u),We.record(a,u),qr(e,i)}catch(o){throw Ze(u,e.get("requestSpan"),o),await Tr(t,o),o}finally{n&&pr(u,n),u.end(),p()}let f=e.get("requestId");f&&pe.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Sa(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 Ea(e){let t=!0===e.get("isSelfTest");t||await kr(Z);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return ye.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=wr(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),Ee.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 yr)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(br(n.model))return Aa(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),Z.manualApprove&&!t&&await lr(),"foundry"!==Z.provider&&(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=(Z.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=Ir(n,Z.models)),Fo(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await cr(e);if(r)return r;let a=performance.now(),i=await Zr(n),s=performance.now()-a;if(He.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Oa(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=ur(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=Nr(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Ne.add(1,{model:n.model,endpoint_type:"openai"}),i=Sa(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=ur(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(Ue.record(c,u),We.record(r,u),qr(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=ur(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw Ze(c,e.get("requestSpan"),o),await Tr(t,o),o}finally{o.value&&pr(c,o.value),c.end(),u()}let d=e.get("requestId");d&&pe.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Oa=e=>Object.hasOwn(e,"choices"),Ca=new q;Ca.post("/",async e=>{try{return await Ea(e)}catch(t){return await uo(e,t)}});const Ia=new q;Ia.post("/",async e=>{try{let t=await e.req.json();try{t.model=wr(t.model)}catch(t){if(t instanceof yr)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 cr(e);if(o)return o;let n=performance.now(),r=await(async e=>{if(!So(Z))throw Error("Service token not found");let t=`${To(Z)}/embeddings`,o=Ao(Z),n=Z.timeoutMs,r=new AbortController,a=Gt(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await ot({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 Lt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Xe(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),a=performance.now()-n;He.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=ur(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await uo(e,t)}});const Pa=new q;let Ra=null,Na=null;function qa(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function ja(e){return!qa(e)}Pa.get("/",async e=>{let t,o=function(){if(xo(Z))return So(Z)?"valid":"missing";let e=Z._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=Ra;return t&&e-t.timestamp<3e4?{result:t.result}:Na||(Na=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${To(Z)}/models`,n=await fetch(t,{method:"GET",headers:Ao(Z),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Ra={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Ra={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),Na=null}})(),Na)}();t="valid"===o&&"reachable"===n.result?"ok":"valid"!==o&&"reachable"!==n.result?"unhealthy":"degraded";let r={status:t,copilot_token:o,upstream:n.result,version:"0.44.0-preview.7",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 Da=new F(U),Ma={...H["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Fa(e){try{return Da.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function Ha(e){let t=0;for(let o of e)switch(o.type){case"text":t+=Fa(o.text)*Ma.contentMultiplier;break;case"tool_use":t+=Fa(o.name+JSON.stringify(o.input))*Ma.contentMultiplier;break;case"tool_result":o.content&&(t+=Fa("string"==typeof o.content?o.content:JSON.stringify(o.content))*Ma.contentMultiplier);break;case"thinking":t+=Fa(o.thinking)*Ma.contentMultiplier;break;case"image":t+=1600}return t}function Ua(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?Ma.perFirstProp:Ma.perAdditionalProp,t+=Fa(o),r.description&&(t+=Ma.perPropDesc+Fa(r.description)),r.enum&&Array.isArray(r.enum)){t+=Ma.perEnum;for(let e of r.enum)t+=Fa(String(e))}if("object"===r.type&&r.properties&&(t+=Ma.perNestedObject,t+=Ua(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=Ma.perArrayOfObjects,t+=Ua(e))}}return t}function Ba(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 La(e,t,o){let n=Ba(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const za=async(e,t,n)=>{try{return await Ga(e,t)}catch(r){if(r instanceof Lt&&401===r.response.status)return await ho(),Ga(e,t);if(r instanceof Lt&&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}`),Ga(i,t)}throw r}};const Ga=async(e,t)=>{if(!So(Z))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=xo(Z)&&Z.foundry?{baseUrl:ko(Z.foundry),headers:vo(Z.foundry,t),cleanPayload:e}:function(e,t){let{metadata:o,...n}=e,r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...ft(Z,t,r),"X-Initiator":"agent"};return{baseUrl:pt(Z),headers:a,cleanPayload:n}}(er(e),t),a=`${o}/v1/messages`,i=Z.timeoutMs,s=JSON.stringify(r),l=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",...Ba(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){let t=zr(o,{fresh:e>0}),c=new AbortController,u=Gt(c,i);try{let{statusCode:o,headers:u,body:p,span:d}=await nt({spanName:"copilot POST /v1/messages",url:a,target:"anthropic_messages",headers:n,body:s,signal:c.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(p,{status:o,headers:u});if(!m.ok)throw d.end(),new Lt("Failed to create anthropic messages",m,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:M(m),span:d,release:()=>Gr(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&&pr(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(),Gr(t)}}catch(o){if(Gr(t),await Bt(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Ka=new Set(["low","medium","high","max","xhigh"]);function Ja(e){let t=e.output_config?.effort;if(!t)return e;let n=Z.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=_r(t,n);if(!r||!Ka.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}}}function Wa(e,t,n){if("foundry"===Z.provider)return Ja(e);let r=t.includes(e.model)?e.model:hr(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=hr(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 Ja(s)}const Ya=e=>"object"==typeof e&&!!e&&!Array.isArray(e),Va=["properties","patternProperties","$defs","definitions"],Xa=["items","additionalProperties","propertyNames","contains","not","if","then","else"],Za=["anyOf","allOf","oneOf","prefixItems"];const Qa=()=>["string","number","boolean"].map(e=>({type:e})),ei=()=>({anyOf:[...Qa(),{type:"array",items:{anyOf:Qa()}},{type:"object"}]}),ti=e=>!0===e||Ya(e)&&0===Object.keys(e).length,oi=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function ni(e,t){let o={...e};for(let e of Va){let n=o[e];Ya(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,Ya(o)?ni(o,t):o])))}for(let e of Xa){let n=o[e];Ya(n)&&(o[e]=ni(n,t))}for(let e of Za){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>Ya(e)?ni(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(Ya(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>ti(e)?ei().anyOf:Ya(e)?[e]:[]);if(0===o.length)return;let n=[...new Map(o.map(e=>[JSON.stringify(e),e]))].map(([,e])=>e);e.items=1===n.length?n[0]:{anyOf:n}}(o)),oi(o)&&(!("items"in o)||ti(o.items))&&(t.add("items"),o.items=ei()),ti(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function ri(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=ii(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function ai(e){return si(ii(e))}function ii(e){return"string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.flatMap(e=>"text"===e.type&&"string"==typeof e.text?[e.text]:[]).join("\n\n"):""}function si(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function li(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>si(e)).filter(Boolean).join("\n\n")}const ci=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),ui=new Set(["text","image"]);function pi(e,t){if(Array.isArray(e?.content))for(let o of e.content){if(t.size>=20)return;let e=String(o?.type).slice(0,64);ui.has(e)||t.add(`block:tool_result:${e}`)}}const di=new Set;function mi(e,t){e.setAttribute("copilot_api.translation.system_message_count",t.filter(e=>"system"===e.role).length);let o=function(e){let t=new Set;for(let o of e){if(t.size>=20)break;let e=String(o.role).slice(0,64),n=ci.get(e);if(n){if(Array.isArray(o.content))for(let r of o.content){let o=String(r?.type).slice(0,64);if(n.has(o)||t.add(`block:${e}:${o}`),"tool_result"===o&&pi(r,t),t.size>=20)break}}else t.add(`role:${e}`)}return[...t].sort()}(t);if(0===o.length)return;e.setAttribute("copilot_api.translation.unknown_shapes",o.join(","));let n=function(e){let t=[];for(let o of e){if(di.size>=100)break;di.has(o)||(di.add(o),t.push(o))}return t}(o);0!==n.length&&r.warn(`Request contains message shapes the translator does not handle (dropped): ${n.join(", ")}`)}const fi=e=>I("sha256").update(e).digest("hex").slice(0,12);function hi(e,t){e.setAttribute("copilot_api.translation.system_hash",fi(t.system)),e.setAttribute("copilot_api.translation.tools_hash",fi(JSON.stringify(t.tools??[])))}function gi(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function _i(e){return e.toLowerCase().startsWith("claude-")}function yi(e,t){let o={model:e.model,messages:wi(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:Si(e.tools,e.model),tool_choice:Ei(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=Ar(t),a=r&&r>1?r-1:o.min;return Sr(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Ir({...o,thinking_budget:a},t)}}return o}function wi(e,t){let{leadingSystemTexts:o,messages:n}=ri(e),r=function(e,t){let o=li(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=ai(e);if(!t)break;bi(r)?a.push(t):ki(r,t);break}case"user":r.push(...vi(e));for(let e of a)ki(r,e);a=[];break;case"assistant":r.push(...xi(e))}for(let e of a)ki(r,e);return r}function bi(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function ki(e,t){let o=function(e){return e.trimStart().startsWith("<system-reminder>")?e:`<system-reminder>\n${e}\n</system-reminder>`}(t),n=e.at(-1);"user"===n?.role?Array.isArray(n.content)?n.content.push({type:"text",text:o}):n.content=n.content?`${n.content}\n\n${o}`:o:e.push({role:"user",content:o})}function vi(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:Ai(e.content)});n.length>0&&t.push({role:"user",content:Ai(n)})}else t.push({role:"user",content:Ai(e.content)});return t}function xi(e){let t=function(e){return{reasoning_text:Ti(e.reasoning_text),reasoning_opaque:Ti(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Ai(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:Ai(e.content),...t}]}const $i=32768;function Ti(e){if("string"==typeof e)return e.length<=$i?e:e.slice(0,$i)}function Ai(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 Si(e,t){if(!e)return;let o=e.filter(ja),n=function(e){return e.toLowerCase().startsWith("gemini")}(t),r=new Set,a=o.map(e=>{let t=e.input_schema;if(n){let e=function(e){let t=new Set;return{schema:ni(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)r.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return r.size>0&&d.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function Ei(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 Oi(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 Ci(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Ii(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 Pi=new Set(["low","medium","high","max","xhigh"]);function Ri(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&&Pi.has(e)?e:null)(_r(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 Ni(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 qi=/[^\w-]/g;function ji(e){return e.replaceAll(qi,"_")}function Di(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=Ri(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:Ni(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:ji(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:ji(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Mi(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 Fi(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 Hi(e,t){return ye.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),La(n,t,e.req.header("anthropic-beta"));let r=wr(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Mi(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),Ee.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 yr)return{ok:!1,response:Fi(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function Ui(e,t,o){let{leadingSystemTexts:n,messages:r}=ri(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=ai(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(Ji(e));break}case"user":t.push(...Wi(n),...o.map(e=>Ji(e))),o=[];break;case"assistant":t.push(...Vi(n))}return t.push(...o.map(e=>Ji(e))),t}(r);if(0===a.length)throw new Lt("request has no translatable message content",Response.json({type:"error",error:{type:"invalid_request_error",message:"request has no translatable message content"}},{status:400}));let i={model:e.model,input:a,max_output_tokens:Math.max(e.max_tokens,16),stream:e.stream,temperature:e.temperature,top_p:e.top_p,store:!1,user:e.metadata?.user_id?.slice(0,64)},s=function(e,t){return li(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(ja).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(i.tool_choice=function(e){switch(e.type){case"auto":return"auto";case"any":return"required";case"none":return"none";case"tool":return e.name?{type:"function",name:e.name}:void 0;default:return}}(e.tool_choice));let l=function(e,t,o){if("adaptive"===e.thinking?.type){let t=e.output_config?.effort??"high";return o&&"max"===t?{effort:"max"}:{effort:Ki(t)}}if("enabled"===e.thinking?.type&&e.thinking.budget_tokens){let{effort:o}=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens),n=_r(o,t);return{effort:Gi(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function Bi(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${I("sha256").update(o).digest("hex").slice(0,32)}`}function Li(e){let t=e?.input_tokens??0,o=e?.input_tokens_details?.cached_tokens;return{input_tokens:void 0===o?t:Math.max(t-o,0),output_tokens:e?.output_tokens??0,...void 0===o?{}:{cache_read_input_tokens:o}}}const zi=new Set(["low","medium","high","xhigh"]),Gi=e=>null!==e&&zi.has(e);function Ki(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Ji(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function Wi(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(Yi(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)switch(t.type){case"text":e.push({type:"input_text",text:t.text});break;case"image":e.push({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 Yi(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 Vi(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 Xi(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 Zi(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Qi(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 es(e,t){let o=[];switch(e.type){case"response.created":Qi(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){Qi(t,o),Zi(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":Qi(t,o),Zi(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":Zi(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":{Zi(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:Xi(e.response.status,n),stop_sequence:null},usage:Li(r)},{type:"message_stop"});break}case"response.incomplete":{Qi(t,o),Zi(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:Li(n)},{type:"message_stop"});break}case"response.failed":Qi(t,o),Zi(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":Qi(t,o),Zi(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":Qi(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 ts(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 os(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function ns(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&&(ts(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&&(ts(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),os(t,o)),r.content&&(os(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){os(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&&(os(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:gi(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 rs=/structured_outputs|output_config\.format/i;function as(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&rs.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Di({...e,model:mr},o):null}var is=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var ss=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const ls={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 ot({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 Xe(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new ss: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 ot({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 Xe(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new is:e}finally{clearTimeout(i)}}},cs=["tavily","exa"];function us(e){return"tavily"===e||"exa"===e}function ps(){return Z.webSearchProviders.length>0}async function ds(e,t){return async function(e,t,n){let{providers:r,searchFns:a=ls}=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:Z.webSearchProviders})}function ms(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function fs(e,t){let o=[{type:"web_search_tool_result_error",error_code:t.errorCode??"unavailable"}];return{type:"web_search_tool_result",tool_use_id:e,content:t.searchFailed?o:t.results}}async function hs(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&&qa(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(!ps())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await ds(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_${ms()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...fs(n,e)}];return{id:`msg_ws_${ms()}`,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_${ms()}`,r=`msg_ws_${ms()}`,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:fs(n,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),D(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const gs=(e,t)=>!(!e||!t||e===t);async function _s(e){if(So(Z)||await rn())return null;let t=Xo();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Qo()}`}},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 ys(e,t){let o=t.model;return o&&"string"==typeof o?null:Fi(e,"Model name is required and must be a string")}async function ws(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&qa(t[0])}(t))return ys(e,t)??hs(e,t);await kr(Z),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=ys(e,t);if(a)return a;t=function(e,t){return Wa(t,Z.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Hi(e,t);if(!i.ok)return i.response;t=i.payload;let s=await _s(e);if(s)return s;if(br(t.model))return xs(e,t);if(function(e){if("foundry"!==Z.provider)return _i(e);let t=Z.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:_i(e)}(t.model))return async function(e,t,o){let n="foundry"===Z.provider,r=n?t:Di(t,Z.models),a={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},i=r.output_config?.effort;return e.set("requestData",{model:r.model,reasoningEffort:i,effortClamped:gs(o,i),streaming:!!r.stream}),Z.manualApprove&&await lr(),ye.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",r.model),t.setAttribute("copilot_api.streaming",!!r.stream),La(t,r,a.anthropicBeta);try{let o=performance.now(),i=await za(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=as(e,o,Z.models);return r&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",r.model)),r}}),s=performance.now()-o;if(He.record(s,{model:r.model,target:"anthropic_messages",streaming:String(!!r.stream)}),!r.stream){let o=i,n=o.usage;if(n){let t={input_tokens:n.input_tokens||0,output_tokens:n.output_tokens||0,cache_read_input_tokens:n.cache_read_input_tokens||0,cache_creation_input_tokens:n.cache_creation_input_tokens||0},o=e.get("requestData")||{};o.tokenUsage=ur(ks(t)),o._d1=s,o.upstreamTtfbMs=s,o.upstreamTotalMs=s,e.set("requestData",o)}return t.end(),e.json(o)}let{events:l,span:c,release:u}=i;return D(e,async n=>{let a=0,i=performance.now(),s={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=Nr(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,Ne.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),vs(e.data,s)&&(p=!0),await n.writeSSE(e)):await n.writeSSE(e);let e=performance.now()-i,t={model:r.model,endpoint_type:"anthropic_messages"};Ue.record(e,t),We.record(a,t)}catch(t){throw Ze(c,e.get("requestSpan"),t),await $r(n,t),t}finally{if(qr(e,o),p){let t=ks(s);pr(c,t);let o=e.get("requestData")||{};o.tokenUsage=ur(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&pe.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Xe(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=ye.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));o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),mi(o,t.messages);let a=yi(t,Z.models),i=a.messages.at(0);return hi(o,{system:"system"===i?.role&&"string"==typeof i.content?i.content:"",tools:a.tools}),a}finally{o.end()}});Le.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=Ir(c,Z.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:gs(r,u),streaming:!!c.stream});let p=performance.now();Z.manualApprove&&await lr();let d=await Zr(c),m=performance.now()-p;if(He.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),bs(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=ur(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=ye.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=Ci(a.message),i=Oi(a.message.content),s=Ii(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:gi(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 Le.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=Nr(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++,Ne.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=ur(n),t._d1=m,e.set("requestData",t)}let u=ns(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(Ue.record(l,u),We.record(r,u),qr(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=ur(n),t._d1=m,e.set("requestData",t))}}catch(o){throw Ze(h,e.get("requestSpan"),o),await $r(t,o),o}finally{n&&pr(h,n),h.end(),g()}let l=e.get("requestId");l&&pe.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const bs=e=>Object.hasOwn(e,"choices");function ks(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 vs(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 xs(e,t){let r=performance.now(),a=ye.startActiveSpan("copilot_api.translate.anthropic_to_responses",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),mi(o,t.messages);let n=Ui(t,Z.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===Z.provider,promptCacheKey:"foundry"===Z.provider?Bi(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return hi(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});Le.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),Z.manualApprove&&await lr();let i=performance.now(),s=await aa(a),l=performance.now()-i;if(He.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),sa(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=ur({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens,prompt_tokens_details:s.usage.input_tokens_details})),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=ye.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:Xi(e.status,o),stop_sequence:null,usage:Li(e.usage)}}(s)}finally{e.end()}});return Le.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=Nr(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++,Ne.add(1,{model:a.model,endpoint_type:"responses"});let c=la(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=ur(n),t._d1=l,e.set("requestData",t)}let u=es(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"};Ue.record(u,p),We.record(r,p),qr(e,i)}catch(o){throw Ze(u,e.get("requestSpan"),o),await $r(t,o),o}finally{n&&pr(u,n),u.end(),p()}let f=e.get("requestId");f&&pe.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const $s=new q;$s.post("/",async e=>{try{return await ws(e)}catch(t){return await uo(e,t)}});const Ts=new q;function As(e){return ye.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=wr(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),Ee.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 Ss(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=ur(o),n._d1=t._d1,t.c.set("requestData",n)}Ts.get("/",async e=>{try{Z.models||await Ho();let t=Z.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 uo(e,t)}});const Es=new Set(["message","function_call","function_call_output"]),Os=new Set(["type","name","description","parameters"]);async function Cs(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||!ps())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await ds(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Is(e){if(ps())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Cs(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Ps(e){if(!ps())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 Cs(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Rs(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 Es.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Ns(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 qs(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&&Ns(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)Ns(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function js(e){return null!=e}function Ds(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Ms(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Fs(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(!Ds(n)){o.push(n);continue}let e=Rs(n);null===e?t.add(Ms(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"])js(e[o])&&(t[o]=e[o]);let r=new Set;if(js(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))Os.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(js(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},js(o.effort)&&(t.reasoning.effort=o.effort),js(o.summary)&&(t.reasoning.summary=o.summary)}if(js(e.text)&&"object"==typeof e.text){let o=e.text;js(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Hs(e,t){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Us(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||js(n.previous_response_id)||js(n.prompt)||js(n.conversation)?null:Hs(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 Bs(e){await kr(Z);let t=await e.req.json();if(!Ds(t))return Hs(e,"request body must be a JSON object");let n=function(e){return"foundry"===Z.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:Fs(e)}(t),{customToolNames:r}=n,a=n.payload;o.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),r.size>0&&o.debug(`Custom tools detected: ${[...r].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:As(t)}}catch(t){if(t instanceof yr)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=Us(e,t.input,n);if(s)return s;let l=await cr(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),Z.manualApprove&&await lr();let c=performance.now(),u=await aa(a),p=performance.now()-c;if(He.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Ls(u))return async function(e,t,o){await Is(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=ur({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=Nr(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=qs(i.data,r);s=await Ps(s);let l=s===i.data?i:{...i,data:s};Ne.add(1,{model:a.model,endpoint_type:"responses"}),Ss(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"};Ue.record(l,u),We.record(n,u),qr(e,c)}catch(o){throw Ze(m,e.get("requestSpan"),o),await Tr(t,o),o}finally{o.value&&pr(m,o.value),m.end(),f()}let l=e.get("requestId");l&&pe.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Ls=e=>Object.hasOwn(e,"output"),zs=new q;zs.post("/",async e=>{try{return await Bs(e)}catch(t){return await uo(e,t)}});const Gs=new q;Gs.get("/",e=>{try{return Z.showToken?e.json({token:Z._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 Ks=new q;Ks.get("/",async e=>{try{let t=await kn();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Js=new q;function Ws(){return function(e){let t=e.filter(e=>ar(e));if(0===t.length)return;let o=t.find(e=>rr.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(Z.models?.data??[])}function Ys(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 Qn(o).slice(0,200)}catch{}let t=Qn(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 Vs(e={}){let t=performance.now(),o=e.model&&function(e){let t=Z.models?.data.find(t=>t.id===e);return void 0!==t&&ar(t)}(e.model)?e.model:Ws();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 Js.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[or]:nr},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:Ys(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)}}Js.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=bt(i),p=function(e){return e===nr}(e.req.header(or));e.set("requestId",r),e.set("isSelfTest",p),e.header("x-request-id",r);let m=ye.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();et.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>sr?t.slice(0,sr):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||pe.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(()=>ir(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{}}):ir(y)}),Js.use(j()),Js.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()}),Js.get("/",e=>e.text("Server running")),Js.route("/health",Pa),Js.route("/chat/completions",Ca),Js.route("/models",Ts),Js.route("/embeddings",Ia),Js.route("/usage",Ks),Js.route("/token",Gs),Js.route("/v1/chat/completions",Ca),Js.route("/v1/models",Ts),Js.route("/v1/embeddings",Ia),Js.route("/v1/messages",$s),Js.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=Ma.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=Ma.perMessage+Fa(e)*Ma.contentMultiplier}for(let e of t.messages)o+=Ma.perMessage,o+=Fa(e.role),"string"==typeof e.content?o+=Fa(e.content)*Ma.contentMultiplier:Array.isArray(e.content)&&(o+=Ha(e.content));let n=t.tools?.filter(ja);return n&&n.length>0&&(o+=function(e){let t=Ma.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=Ma.perTool),t+=Fa(n.name),n.description&&(t+=Ma.perDesc+Fa(n.description)),t+=Ua(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),Js.route("/v1/responses",zs),Js.route("/responses",zs),Js.onError((e,t)=>uo(t,e));const Xs=e=>`[1m${e}[0m`,Zs=e=>`[2m${e}[0m`,Qs=e=>`[32m${e}[0m`,el=e=>`[31m${e}[0m`,tl=e=>`[33m${e}[0m`,ol=Zs(" ─────────────────────────────────────────────────────────────");function nl(e,t,o){console.log(` ${function(e){return"ok"===e?Qs("✓"):"warn"===e?tl("⚠"):el("✗")}(e)} ${Xs(t.padEnd(14))} ${o}`)}function rl(e){console.log(` ${Zs("↳")} ${Zs(e)}`)}function al(e){return e instanceof Lt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function il(){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(W.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 sl(){try{await Ho();let e=(Z.models?.data.length??0)>0;return nl(e?"ok":"warn","Model catalog",e?function(){let e=Z.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 nl("fail","Model catalog",al(e)),rl("Could not fetch /models — check connectivity/auth."),!1}}async function ll(e){Z.accountType=e.accountType;let t=await Ct(),o=It();if(console.log(""),console.log(` ${Xs("COPILOT-API DOCTOR")} ${Zs(`v${t}`)}`),console.log(ol),nl("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await Y(),Uo(),!await async function(){let e=await il();if(!e)return nl("fail","Auth token","not found"),void rl("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");Z._t2=e.token,nl("ok","Auth token",`found (${e.source})`);try{let e=await mo();return await ut(Z,e.login),nl("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return nl("fail","GitHub auth",al(e)),void rl("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(ol),console.log(` ${el("✗")} ${Xs("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await po();return Z._t1=e,nl("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Lt?e.response.status:0;return nl("fail","Service token",al(e)),rl(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 sl();await async function(){try{let e=await kn(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${hn(gn(t))} of ${hn(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;nl("ok","Copilot plan",`${e.copilot_plan} · ${o} `+Zs(`(resets ${e.quota_reset_date})`))}catch(e){nl("warn","Copilot plan",`unavailable (${al(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Vs();return e.ok?(nl("ok","Generation",`works via ${e.model} ${Zs(`(${e.durationMs}ms)`)}`),!0):(nl("fail","Generation",`${e.reason}${e.status?Zs(` [HTTP ${e.status}]`):""}`),!1)}():nl("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){nl(t,"Client config","potential base-URL issue");for(let t of e)rl(t)}else nl("ok","Client config","no base-URL issues detected");rl("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(ol),a?(console.log(` ${Qs("✓")} ${Xs("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${tl("⚠")} ${Xs("Some checks need attention")} — see the ${el("✗")}/${tl("⚠")} lines above.`),console.log(""),2)}const cl=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 ll({accountType:e["account-type"]});g.exit(t)}});function ul(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 pl=!1;const dl="copilot-api-node20",ml=`https://registry.npmjs.org/${dl}/latest`,fl=e=>`[1m${e}[0m`,hl=e=>`[33m${e}[0m`;async function gl(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(ml,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function _l(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}let yl,wl;async function bl(e){try{let[t,o]=await Promise.all([Ct(),gl(e)]);return"unknown"!==t&&o&&function(e,t){let o=e.split(".").map(Number),n=t.split(".").map(Number),r=Math.max(o.length,n.length);for(let e=0;e<r;e++){let t=o[e]??0,r=n[e]??0;if(t<r)return!0;if(t>r)return!1}return!1}(t,o)?{current:t,latest:o}:null}catch{return null}}function kl(){if(!yl||!wl)return;let{signal:e}=wl;yl.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${dl}@latest`,n=hl("│"),r=` ${fl("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${fl(o)} to update`,i=" ".repeat(54),s=hl(`╭${"─".repeat(54)}╮`),l=hl(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${_l(r,54)}${n}`,`${n}${i}${n}`,`${n}${_l(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var vl={posts:[{title:"I Almost Bought an AI Code Reviewer. Then I Did the Math.",teaser:"100+ repos. Every PR reviewed by AI. Under $1K a month.",url:"https://barazany.dev/blog/claude-code-pr-reviewer",date:"2026-06-09"},{title:"I Had Claude Mine 30 Days of My Own Messages. What It Found Was Uncomfortably Accurate.",teaser:"I had Claude read a month of my messages. It nailed me.",url:"https://barazany.dev/blog/mining-claude-history-ultracode",date:"2026-06-05"},{title:"The 5-Hour Quota, Boris's Tweet, and What the Source Code Actually Reveals",teaser:"Claude Code's caching story — decoded from the source.",url:"https://barazany.dev/blog/claude-code-token-caching",date:"2026-04-01"}]};const xl=262144,$l="https://barazany.dev",Tl=/^[a-z0-9][a-z0-9-]*$/i,Al=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function Sl(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(Al," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function El(e){if("object"!=typeof e||!e)return null;let t=e,o=Sl(t.title,100),n=Sl(t.teaser??t.excerpt??t.description,120),r=function(e){if("string"!=typeof e||e.length>2048)return null;let t;try{t=new URL(e)}catch{return null}if(t.origin!==$l||t.username||t.password)return null;let o=t.href;return/^[\x21-\x7E]+$/.test(o)?o:null}(t.url);if(null===r&&void 0===t.url&&"string"==typeof t.slug&&Tl.test(t.slug)&&(r=`${$l}/blog/${t.slug}`),!o||!n||null===r)return null;let a=function(e){if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e))return Number.isFinite(Date.parse(e))?e.slice(0,10):void 0}(t.date);return a?{title:o,teaser:n,url:r,date:a}:{title:o,teaser:n,url:r}}function Ol(e){let t=e;if(!Array.isArray(e)&&"object"==typeof e&&e&&(t=e.posts),!Array.isArray(t))return[];let o=[];for(let e of t){let t=El(e);t&&o.push(t)}let n=e=>e.date?Date.parse(e.date):-1/0;return o.sort((e,t)=>n(t)-n(e)).slice(0,3)}let Cl=null;function Il(e){return s.join(e,"blog-posts.json")}function Pl(e=W.APP_DIR){try{if(Cl&&Cl.length>0)return Cl;let t=function(e){try{let t=Il(e);return B.statSync(t).size>xl?[]:Ol(JSON.parse(B.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Ol(vl)}catch{return[]}}function Rl(e){return e>-6e4&&e<864e5}async function Nl(e){let t=new AbortController,o=setTimeout(()=>t.abort(),e);"object"==typeof o&&"unref"in o&&o.unref();try{let e=await fetch("https://barazany.dev/posts.json",{signal:t.signal,headers:{accept:"application/json"}});if(!e.ok)return await(e.body?.cancel().catch(()=>{})),[];let o=await async function(e,t){let o=Number(e.headers.get("content-length"));if(Number.isFinite(o)&&o>xl)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>xl?null:t}let n=e.body.getReader(),r=()=>{n.cancel().catch(()=>{})};t.addEventListener("abort",r,{once:!0});let a=[],i=0;try{for(;;){let{done:e,value:t}=await n.read();if(e)break;if(i+=t.byteLength,i>xl)return await n.cancel().catch(()=>{}),null;a.push(t)}}finally{t.removeEventListener("abort",r)}return t.aborted?null:Buffer.concat(a).toString("utf8")}(e,t.signal);return null===o?[]:Ol(JSON.parse(o))}finally{clearTimeout(o)}}async function ql(e={}){try{if("1"===g.env.COPILOT_API_NO_BLOG||"1"===g.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??W.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=Il(e),n=await B.promises.stat(o);if(n.size<=xl){let e=await B.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Rl(t-n.fetchedAt)}return Rl(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await Nl(e.timeoutMs??3e3);if(0===n.length)return;Cl=n,await async function(e,t,o){let n=Il(e),r=`${n}.${g.pid}.tmp`;try{await B.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await B.promises.rename(r,n)}catch(e){throw await B.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function jl(e){if("foundry"===e.provider)return Z.foundry=function(e){let t=e.FOUNDRY_ENDPOINT,o=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");if(!o)throw Error("--provider foundry requires FOUNDRY_API_KEY");let n=go(t),r=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:n,anthropicEndpoint:r?go(r,"FOUNDRY_ANTHROPIC_ENDPOINT"):yo(n),apiKey:o,deployments:wo(e.FOUNDRY_DEPLOYMENTS)}}(process.env),Z.connectivity.h2=!1,Z.connectivity.h2Keepalive=!1,o.info(`Using Microsoft Foundry upstream: ${Z.foundry.endpoint}`),{login:"foundry"};e._t2&&o.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let t,n=e._t2||process.env.GH_TOKEN;n?(function(e){Z._t2=e,Vo=!1}(n),o.info("Using provided Auth token")):await sn();try{t=await mo(),await ut(Z,t.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}return await(async()=>{let{token:e,refresh_in:t}=await po();Z._t1=e,o.debug("Service token fetched successfully!"),Z.showToken&&o.info("Service token:",e),Yo=!0,an(t),rt.start(),Go=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),nn(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},Ko=()=>{o.debug("Network connectivity lost")},rt.on("online",Go),rt.on("offline",Ko)})(),t}function Dl(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 Ml=e=>`[1m${e}[0m`,Fl=e=>`[2m${e}[0m`,Hl=e=>`[36m${e}[0m`,Ul=e=>`[32m${e}[0m`,Bl=e=>`[33m${e}[0m`,Ll=e=>`[4m${e}[0m`,zl=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Gl="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Kl="https://github.com/johnib/copilot-api-issues/issues",Jl=Fl(" ─────────────────────────────────────────────────────────────");function Wl(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Yl(e){return e&&0!==e.length?e.join("·"):"—"}function Vl(e){if(0===e.length)return[];let t=["",Jl,` ${Ml("BARAZANY.DEV")} ${Fl("— Recent Posts")}`,Jl,""];for(let[o,n]of e.entries()){let e=`${n.url}${Gl}`,r=zl(e,Ml(Ll(`[${o+1}]`)));t.push(` ${r} ${Hl(n.title)}`,` ${Fl("→")} ${Fl(n.teaser)}`,"")}return t.push(Jl,` ${zl(`https://barazany.dev/blog${Gl}`,"barazany.dev/blog")}`,Jl),t}function Xl(e){let t=[];Z.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):Z.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(Fl(" → "))} ${Ul("✓")}`:Fl("off"),n=["",` ${Ml("COPILOT-API")} ${Fl(`v${e.version}`)}`,Jl,` ${Fl("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Fl("User")} ${e.user} ${Fl("·")} ${e.accountType}`];return Z._v1&&n.push(` ${Fl("Client")} VSCode ${Z._v1}`),n.push(` ${Fl("Network")} ${t.join(Fl(" · "))}`,` ${Fl("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Fl("Clipboard")} Claude Code command ${Ul("✓")}`),n.push(Jl),n}function Zl(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Ml("Active")}`];if(e.model){let o=Z.models?.data.find(t=>t.id===e.model),n=Wl(o?.capabilities.limits?.max_context_window_tokens),r=Yl(o?.capabilities.supports.reasoning_effort);t.push(` ${Hl(e.model.padEnd(32))} ${Fl("ctx")} ${Ml(n.padStart(5))} ${Fl("effort")} ${Fl(r)} ${Bl("← main")}`)}if(e.smallModel){let o=Z.models?.data.find(t=>t.id===e.smallModel),n=Wl(o?.capabilities.limits?.max_context_window_tokens),r=Yl(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Fl("ctx")} ${n.padStart(5)} ${Fl("effort")} ${Fl(r)} ${Bl("← small")}`)}return t}function Ql(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of Z.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("",` ${Ml(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Hl("●"):Fl("·"),i=n?Hl(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Wl(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Yl(r.effort)}`;t.push(` ${a} ${i} ${Fl(s)}${Fl(l)}`)}}return t}function ec(){let e=Kl.replace(/^https:\/\//,""),t=zl(`${Kl}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Jl,` ${Ml("FOUND A BUG?")} ${Fl("— Report it on GitHub")}`,Jl,"",` ${Hl("→")} ${Hl(t)}`,` ${Fl("Bug reports, feature requests, and questions welcome.")}`,"",Jl]}function tc(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=["",Jl,` ${Ml("Claude Cowork")} ${Fl("— Settings → Inference Provider")}`,Jl,"",` ${Fl("Paste into")} ${Ml("inferenceGatewayBaseUrl")}${Fl(":")}`,` ${Ml(Hl(r))}`];return n||a.push("",` ${Fl("Your Tailscale hostname is shown by:")} ${Hl("tailscale status --self")}`),a.push("",` ${Fl("Docs:")} ${Hl("https://claude.com/docs/cowork/3p/installation")}`),a}function oc(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Jl,` ${Ml("HTTPS")} ${Fl("— self-signed cert")}`,Jl,"",` ${Fl("Cert")} ${t}`];switch(o.push("",` ${Ml("Trust this cert")} ${Fl("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${Fl("macOS:")}`,` ${Hl("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Hl(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Fl("Windows (PowerShell as Administrator):")}`,` ${Hl(`Import-Certificate -FilePath "${t}" \``)}`,` ${Hl("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Fl("Linux (Debian/Ubuntu):")}`,` ${Hl(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Hl("sudo update-ca-certificates")}`,` ${Fl("Linux (Fedora/RHEL/Arch):")}`,` ${Hl(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Hl("sudo update-ca-trust")}`);break;default:o.push(` ${Fl("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Fl("Or, for Node CLIs only (no admin needed):")}`,` ${Hl(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Jl),o}function nc(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 rc=s.join(W.APP_DIR,"certs"),ac=s.join(rc,"cert.pem"),ic=s.join(rc,"key.pem"),sc=s.join(rc,"cert.meta.json");async function lc(e){try{return await a.readFile(e,"utf8")}catch{return}}async function cc(e){let t=await lc(ac),o=await lc(ic),n=await async function(){let e=await lc(sc);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 uc(e){return 0!==G(e)}async function pc(e){await a.mkdir(rc,{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)uc(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 K([{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(ac,l.cert,{mode:420}),await a.writeFile(ic,l.private,{mode:384}),await async function(e){await a.writeFile(sc,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:ac,keyPath:ic,generated:!0}}const dc=[],mc=Date.now();let fc="";function hc(){let e=async(e,t=0)=>{let n=ye.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()-mc)/1e3}});for(let t of dc)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=zl("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Jl,` ${Ml("COPILOT-API")} ${Fl(`v${e}`)} ${Fl("·")} ${nc(t)} uptime`,Jl,""," Check in from time to time on",` ${Hl(o)}`,"",Jl,""];console.log(n.join("\n"))}(fc,Date.now()-mc),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)})}const gc=e=>e.filter(e=>"embeddings"!==e.capabilities.type).map(e=>e.id),_c=e=>e.filter(e=>"embeddings"!==e.capabilities.type&&(e.supported_endpoints?.includes("/responses")??!0)).map(e=>e.id);async function yc(e,t,n){if(!e._cc1)return!1;Z.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));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,gc(Z.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:gc(Z.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:gc(Z.models.data)}));let s=Dl({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(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function wc(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function bc(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=ye.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Qe({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:wc(t),provider:t.provider},runtime:n,identity:{_u1:r.login,machineId:Z.machineId,sessionId:Z.sessionId,_v1:Z._v1},connectivity:Z.connectivity,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-mc},"copilot_api")});if(Z.models?.data)for(let e of Z.models.data)a.addEvent("copilot_api.model.available",Qe(e,"model"));a.end(),Ve(_.INFO,"INFO","Server started",Qe({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-mc},"copilot_api"))}async function kc(e,t){try{return await jl(e)}catch(o){throw await async function(e,t){let o=Qe({config:t,startupStage:"upstream_auth"},"copilot_api"),n=ye.startSpan("copilot_api.server.startup_failed",{kind:l.INTERNAL,attributes:o});e instanceof Lt&&(n.setAttribute("http.response.status_code",e.response.status),n.setAttribute("url.full",e.response.url)),Xe(n,e),n.end(),Ve(_.ERROR,"ERROR","Server startup failed",{...o,"exception.message":e instanceof Error?e.message:String(e)}),await _e()}(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:wc(e)}),o}}async function vc(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 cc(e)){let e=await lc(ac),t=await lc(ic);if(e&&t)return{cert:e,key:t,certPath:ac,keyPath:ic,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),pc(e)}(e.httpsHosts)}}async function xc(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=Bn;try{L(t),L(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(hc(),dc.push(()=>{o.debug("Cleaning up connectivity monitor"),rt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),Yo=!1,Lo&&=void clearInterval(Lo),Go&&=void rt.off("online",Go),Ko&&=void rt.off("offline",Ko),zo=void 0,Jo=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),Hr&&=void clearInterval(Hr),Ur&&=void clearInterval(Ur);let e=[...Dr.keys(),...Mr];Dr.clear(),Mr.clear(),jr.clear(),Fr=void 0;for(let t of e)Br(t)&&(De.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await _e()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");Z.provider=t.provider,Z.accountType=t.accountType,Z.manualApprove=t.manual,Z.rateLimitSeconds=t.rateLimit,Z.rateLimitWait=t.rateLimitWait,Z.showToken=t.showToken,Z.timeoutMs=t.timeout,Z.connectivity.timeoutMs=t.connectTimeout,Z.webSearchProviders=t.webSearchProviders,Z.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;Z.connectivity.h2=t,Z.connectivity.h2Keepalive=e}(),await Y(),ql().catch(()=>{}),Uo();let n=await Ct();fc=n;let r=It();!function(e,t){t&&(fe=t),me=crypto.randomUUID();let o=v({[S]:"copilot-api",[E]:e,[A]:me}),{endpoint:n,headers:r}=ge();de=new T({resource:o,traceExporter:new k({url:`${n}/v1/traces`,headers:r}),metricReader:new $({exporter:new b({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x({exporter:new w({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),de.start()}(n,mc);let a=await kc(t,n);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})`,a="foundry"===Z.provider?"Foundry":"Copilot";return o.warn(`Could not fetch model list from ${a}${r}: ${n}. This is likely a transient network or authentication issue. The proxy will start anyway; model listing endpoints may return empty until the cache is populated.`),!1}}()||function(e){let t=setTimeout(()=>{Ho().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=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)}}();dc.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),Z.connectivity.h2&&(Gr(zr(pt(Z))),Z.connectivity.h2Keepalive&&Jr()),bc({options:t,version:n,runtime:r,_u1:a});let s=await vc(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await yc(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(Z.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=_c(Z.models.data);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);r=e.model}else r=await o.prompt("Select a model to use with Codex CLI",{type:"select",options:_c(Z.models.data)});let a=Dl({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,c,s);(function(e){let t=[...Xl(e),...Zl(e),...Ql(e),...ec(),"",...Vl(Pl()),...tc(e),...oc(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 Cn()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),kl(),z({fetch:Js.fetch,port:t.port,hostname:t.hostname,tls:s?{cert:s.cert,key:s.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(l,t.hostname,t.port),t.smokeTest&&"copilot"===t.provider&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await Vs({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: ${Qn(r.detail)}`),o.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){o.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(c,t.smallModel??t.model,t.hostname)}function $c(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Tc=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT and FOUNDRY_API_KEY). Overrides COPILOT_API_PROVIDER.'},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:$c(t,"--rate-limit"),r=e.timeout,a=void 0===r?X:$c(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:$c(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],g.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??g.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!us(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${cs.join(", ")}`);let r=n.length>0?n:cs,a=new Set,i=n.length>0,s=[];for(let e of r){if(!us(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:u}),d=(g.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d;return xc({provider:Eo(e.provider,g.env.COPILOT_API_PROVIDER),port:$c(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:n,rateLimitWait:e.wait,_t2:e["github-token"],_cc1:e["claude-code"],codex:e.codex,model:e.model,smallModel:e["small-model"],showToken:e["show-token"],timeout:a,connectTimeout:i,webSearchProviders:p,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!m})}});pl||(pl=!0,o.setReporters([ul(o.options.reporters)]));const Ac=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(yl||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;wl=e,yl=bl(e).catch(()=>null)})(),Ac||kl();const Sc=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:un,start:Tc,"check-usage":Tn,debug:Nt,doctor:cl,"cowork-setup":Xn}});await t(Sc),Ac||(wl?.abort(),wl=void 0,yl=void 0);export{};
|
package/package.json
CHANGED