copilot-api-node20 0.44.0-preview.12 → 0.44.0-preview.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.mjs +1 -1
- package/package.json +1 -1
package/dist/main.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{AsyncLocalStorage as l}from"node:async_hooks";import{ROOT_CONTEXT as c,SpanKind as u,SpanStatusCode as p,context as d,metrics as m,trace as f}from"@opentelemetry/api";import h from"clipboardy";import{execFile as g,execSync as _}from"node:child_process";import y from"node:process";import{SeverityNumber as w,logs as b}from"@opentelemetry/api-logs";import{OTLPLogExporter as k}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as v}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as x}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as T}from"@opentelemetry/resources";import{BatchLogRecordProcessor as $}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as A}from"@opentelemetry/sdk-metrics";import{NodeSDK as S}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as E,ATTR_SERVICE_NAME as O,ATTR_SERVICE_VERSION as C}from"@opentelemetry/semantic-conventions";import{Client as I,request as R}from"undici";import{createHash as N,randomBytes as P,randomUUID as q}from"node:crypto";import{promisify as D}from"node:util";import{Hono as j}from"hono";import{cors as M}from"hono/cors";import{streamSSE as F}from"hono/streaming";import{events as H}from"fetch-event-stream";import{Tokenizer as U,models as B}from"ai-tokenizer";import*as L from"ai-tokenizer/encoding/claude";import z,{accessSync as G}from"node:fs";import{serve as K}from"srvx";import{isIP as J}from"node:net";import{generate as W}from"selfsigned";const Y=s.join(i.homedir(),".local","share","copilot-api"),V={APP_DIR:Y,GITHUB_TOKEN_PATH:s.join(Y,"github_token"),MACHINE_ID_PATH:s.join(Y,"machine_id"),SESSION_ID_PATH:s.join(Y,"session_id")};async function X(){await a.mkdir(V.APP_DIR,{recursive:!0}),await Z(V.GITHUB_TOKEN_PATH),await Z(V.SESSION_ID_PATH)}async function Z(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const Q=new l;function ee(e,t){return Q.run(e,t)}const te=()=>!0===Q.getStore()?.rerun;const oe=6e5,ne={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:oe,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 re(e){let[t="",o=""]=e.trim().split(/\s+/,2),n=o&&"undefined"!==o&&"null"!==o?/^(?:ghu|gho|ghp|ghs|ghr|github_pat)_/.exec(o)?.[0]??"opaque":"missing";return`${t.toLowerCase()} ${n}`}!function(e){let t=e.provider,o=e.models;Object.defineProperties(e,{provider:{get:()=>Q.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=Q.getStore();return e?e.models:o},set:e=>{o=e},enumerable:!0,configurable:!0}})}(ne);const ae=" │ ",ie=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()},se=(e,t)=>e.padEnd(t),le=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ce=(e,t,o)=>` --\x3e ${se(e,4)} ${se(t,21)} ${se(o,3)}`,ue=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return se(t,22)})(e.model??"—")+se(t,8)},pe=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ie(Math.max(t-o,0)):"—",r=e?ie(e.outputTokens??0):"—",a=o?ie(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},de=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${se("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ie(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},me=e=>{if(void 0===e.ttfbMs)return`e2e ${le(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${le(e.ttfbMs)} → e2e ${le(e.e2eMs)} ${t}`},fe=e=>e?ne.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,he=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}}),ge={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=>[ce(e.method,e.path,e.status),ue(e),pe(e.tokenUsage),de(e.tokenUsage,e.maxContextTokens),me({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(ae))({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:fe(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),tt(w.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:o,duration:n,upstreamTotal:r}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":n,...o?.model&&{"copilot_api.model":o.model},...o?.reasoningEffort&&{"copilot_api.reasoning_effort":o.reasoningEffort},...o?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==o?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(o.upstreamTtfbMs)},...void 0!==r&&{"copilot_api.upstream_total_ms":Math.round(r),"copilot_api.copilot_duration_ms":Math.round(r)},...he(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=n.get("requestData");o.error((e=>[ce(e.method,e.path,"429"),ue(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${le(e.e2eMs)}`].join(ae))({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=ce(e.method,e.path,e.status.toString()),o=ue(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${le(e.e2eMs)}`].join(ae)})({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(()=>ge.cleanup(),6e4);let _e,ye,we=Date.now();const be={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function ke(){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):be;return{endpoint:e.replace(/\/$/,""),headers:t}}async function ve(){if(!_e)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([_e.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}const xe=f.getTracer("copilot-api"),Te=m.getMeter("copilot-api"),$e=b.getLogger("copilot-api"),Ae=Te.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),Se=Te.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),Ee=Te.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Oe=Te.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),Ce=Te.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Ie=Te.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Re=Te.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ne=Te.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Pe=Te.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),qe=Te.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),De=Te.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),je=Te.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Me=Te.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Fe=Te.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),He=Te.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ue=Te.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Be=Te.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Le=Te.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),ze=Te.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Ge=Te.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Ke=Te.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Je=Te.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),We=Te.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Ye=Te.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Ve=Te.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Xe=Te.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Ze=Te.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Qe=Te.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),et=Te.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function tt(e,t,o,n,r){let a=f.getActiveSpan()?.spanContext()??r;$e.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function ot(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:p.ERROR,message:o??n.message}),e.recordException(n)}function nt(e,t,o){ot(e,o),t&&t!==e&&ot(t,o)}function rt(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,rt(r,e)))}return o}Te.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!ct.getConnectivityStats().isOnline)}),Te.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(ct.getConnectivityStats().consecutiveFailures)}),Te.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(ne.models?.data.length??0)}),Te.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ge.completionCallbacks.size)}),Te.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-we)/1e3)});const at=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function it(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();"authorization"===o&&e.setAttribute(`http.${t}.header.authorization.shape`,re(r)),!at.has(o)&&e.setAttribute(`http.${t}.header.${o}`,r)}}async function st(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:l}=e,c=xe.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...l}});a&&it(c,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return c.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();at.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(c,e),Me.add(1,{target:n,status_code:String(e.status)}),e.ok||c.setStatus({code:p.ERROR,message:`HTTP ${e.status}`}),{response:e,span:c}}catch(e){throw ot(c,e),c.end(),e}}async function lt(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,extraAttributes:d,dispatcher:m}=e,f=xe.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});it(f,"request",a);try{let{statusCode:e,headers:t,body:u}=await R(o,{method:r,headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!at.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Me.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:p.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:u,span:f}}catch(e){throw ot(f,e),f.end(),e}}const ct=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:ne.connectivity.probeEndpoints,fastInterval:ne.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?ne.connectivity.slowProbeInterval:ne.connectivity.fastProbeInterval)+Math.random()*ne.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=xe.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),ne.connectivity.timeoutMs);try{let n=!1;for(let e of ne.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",...ne.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Ve.record(r,{endpoint:e,result:"success"});break}Ve.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),De.add(1,{result:n?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&o.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),je.add(1,{from:"offline",to:"online"}),tt(w.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(o.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),je.add(1,{from:"online",to:"offline"}),tt(w.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,o.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?ne.connectivity.slowProbeInterval:ne.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*ne.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:ne.connectivity.jitterMaxMs>0,connectionPooling:ne.connectivity.connectionPooling,dnsCache:ne.connectivity.dnsCache}}},ut=()=>({"content-type":"application/json",accept:"application/json"}),pt="0.48.1",dt=`copilot-chat/${pt}`,mt=`GitHubCopilotChat/${pt}`,ft=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`${V.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=N("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},ht=async(e,t)=>{e.machineId||=await ft(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(V.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=q();return await a.writeFile(V.SESSION_ID_PATH,e),await a.chmod(V.SESSION_ID_PATH,384),e})()},gt=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,_t=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=q(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":dt,"User-Agent":mt,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":q(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},yt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const wt=(e,t,o)=>{let n=_t(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,a=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&yt.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},bt="https://api.github.com",kt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":dt,"user-agent":mt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),vt="https://github.com",xt="01ab8ac9400c4e429b23",Tt=["user:email"].join(" ");function $t(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const At=32768,St=[{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: ***"}],Et=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Ot(e){let t=e;for(let{regex:e,mask:o}of St)t=t.replace(e,o);return t}const Ct=/[\w.%+#!$&*=?^~\x27-]+@[\w-]+(?:\.[\w-]+)+/g;function It(e){return Ot(e).replaceAll(Ct,"<redacted-email>")}const Rt=new Map;function Nt(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 Pt(e,t,o){let n=Ot(o),r=8*At,a=n.length>r,i=a?n.slice(0,r):n,s=N("sha256").update(n).digest("hex");if(i.length<=At)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=At)e.setAttribute(`${t}.part_${o/At}`,i.slice(o,o+At));e.setAttribute(`${t}.parts`,Math.ceil(i.length/At))}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 qt(e,t){let o=function(e){if(Rt.size>=1e3&&!Rt.has(e)){let e=Rt.keys().next().value;void 0!==e&&Rt.delete(e)}let t,o=(Rt.get(e)??0)+1;return Rt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Le.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&&Pt(e,"copilot_api.incoming_request_body",n);let r=Dt(t.c.req.header());return r&&Pt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&Pt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Pt(e,"copilot_api.outgoing_headers",Dt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Pt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function Dt(e){let t={};for(let[o,n]of Object.entries(e))Et.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function jt(){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 Mt(){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 Ft(){try{return!!(await a.stat(V.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(V.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Ht(e){let t=await async function(){let[e,t]=await Promise.all([jt(),Ft()]);return{version:e,runtime:Mt(),paths:{APP_DIR:V.APP_DIR,GITHUB_TOKEN_PATH:V.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 Ut=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})=>Ht({json:e.json})}),Bt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Lt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",zt=new Set;let Gt;function Kt(e){if(ne.errorReporting&&!(e.statusCode<500)&&!zt.has(e.signature)){if(zt.size>=1e3){let e=zt.values().next().value;void 0!==e&&zt.delete(e)}zt.add(e.signature),async function(e){Gt??=jt();let t=await Gt,o=Mt(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(It(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:$t(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(Bt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Lt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function Jt(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 Wt=new WeakSet;async function Yt(e,{attempt:t,maxRetries:n,operation:r}){return Jt(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&&Wt.add(e)}(e),!1)}var Vt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Xt=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Zt(e,t){return setTimeout(()=>e.abort(new Xt(t)),t)}const Qt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),eo=RegExp(`\\b(?:${[...Qt].join("|")})\\b`);function to(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function oo(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=to(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function no(e){let t=e.code;return"string"==typeof t?t:void 0}function ro(e){if(void 0===e.cause)return"";let t=oo(e);if(t===e)return"";let o=no(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function ao(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=>Qt.has(e))||!(t.length>0)&&(!!o.some(e=>eo.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function io(e){return e.req.path.startsWith("/v1/messages")}function so(e,t){if(io(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}const lo=/maximum context length|exceeds the context window/i;function co(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 uo(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",It(t.message)))}function po(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=It(e.message)),t}function mo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=f.getActiveSpan();if(!a)return;let i=Nt({endpointType:$t(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});qt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function fo(e,t,o){let n=e.get("requestId"),r=ge.completionCallbacks.get(n);r&&(ge.logError(r,t,o),ge.completionCallbacks.delete(n))}async function ho(e,t){let o=f.getActiveSpan(),n=e.get("requestId"),r=ge.completionCallbacks.get(n);r&&(ge.logRateLimit(r,t.response),ge.completionCallbacks.delete(n)),Ie.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=so(a,e),s=co(i);return o?.setStatus({code:p.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),uo(o,s),tt(w.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...po(s)}),mo({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,o)=>{go.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const go=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;async function _o(e,t){let o=f.getActiveSpan(),n=await t.response.text(),r=so(n,e),a=co(r);fo(e,t.response.status,a.message??t.message),o?.setStatus({code:p.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),uo(o,a),tt(w.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...po(a)}),mo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&Kt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Nt({endpointType:$t(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message});let i=io(e)?function(e){let t;try{let o=JSON.parse(e);t=o.error&&"object"==typeof o.error?o.error:o}catch{return}let o="string"==typeof t.message?t.message:"";if("context_length_exceeded"!==t.code&&"context_length_exceeded"!==t.type&&!lo.test(o))return;let n=/maximum context length is (\d+)/i.exec(o)?.[1],r=/(?:resulted in|requested) (\d+) tokens/i.exec(o)?.[1];return{type:"error",error:{type:"invalid_request_error",message:n&&r?`prompt is too long: ${r} tokens > ${n} maximum`:`prompt is too long: ${o||"context_length_exceeded"}`}}}(n):void 0;return i?e.json(i,400):e.json(r,t.response.status)}function yo(e,t){(function(e){return"object"==typeof e&&!!e&&Wt.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",ne.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function wo(e){return ao(e)||function(e){return Jt(e)||e instanceof Error&&Jt(e.cause)}(e)}async function bo(e,t){if(yo(f.getActiveSpan(),t),t instanceof Vt&&429===t.response.status)return ho(e,t);if(t instanceof SyntaxError){f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),tt(w.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let o=io(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 fo(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Vt)return _o(e,t);if(function(e){return e instanceof Xt||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Xt}(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Upstream request timed out"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","request_timeout");let n="Upstream request timed out (gateway timeout). Increase the timeout or retry.";tt(w.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=io(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return fo(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(wo(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?oo(t):void 0,r=(n&&no(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.";tt(w.WARN,"WARN",i,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":r,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=io(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return fo(e,503,t instanceof Error?`${t.message}${ro(t)}`:i),e.json(s,503)}(e,t);let n=f.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:p.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),tt(w.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Kt({route:e.req.path,statusCode:500,errorClass:r.name,signature:Nt({endpointType:$t(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${ro(r)}`}),fo(e,500,r.message),o.error(r);let a=io(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const ko=async()=>{let e=`${bt}/copilot_internal/v2/token`,t=ne.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await st({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:kt(ne),signal:o.signal});try{if(!t.ok)throw new Vt("Failed to get Service token",t);return await t.json()}catch(e){throw ot(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function vo(){let e=`${bt}/user`,t=ne.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await st({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${ne._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Vt("Failed to get GitHub user",t);return await t.json()}catch(e){throw ot(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}const xo=3e5;let To,$o,Ao,So=null,Eo=0;function Oo(e){Ao&&clearTimeout(Ao),Ao=setTimeout(()=>{Ro("scheduled").catch(e=>{o.warn("Foundry Entra token renewal failed; retrying:",e),Oo(3e4)})},e),Ao.unref()}async function Co(e){let t=$o;if(!To||!t?.tokenScope)throw Error("Foundry Entra auth is not initialised");let o=xe.startSpan("copilot_api.foundry.entra_token",{kind:u.INTERNAL,attributes:{"copilot_api.foundry.token.trigger":e}},"upstream_401"===e?d.active():c);try{let e=await To.getToken(t.tokenScope);if(!e)throw Error(`No Entra token for scope ${t.tokenScope}`);o.setAttribute("copilot_api.foundry.token.expires_in_s",Math.round((e.expiresOnTimestamp-Date.now())/1e3)),t.bearerToken=e.token,t.bearerExpiresAt=e.expiresOnTimestamp,Eo=Date.now(),Oo(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-xo;return Math.max(t-Date.now(),3e4)}(e))}catch(e){throw ot(o,e),e}finally{o.end()}}async function Io(e,t){$o=e,To=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await Co("startup")}catch(e){throw Error("Foundry Entra ID auth: could not get a token. Run `az login` (or set FOUNDRY_API_KEY for key auth). The identity needs the 'Cognitive Services OpenAI User' role (GPT) or 'Azure AI User' (Claude) on the resource.",{cause:e})}}function Ro(e="upstream_401"){return So??=Co(e).finally(()=>{So=null}),So}let No=null;async function Po(e){if("foundry"===ne.provider){if("entra"!==ne.foundry?.auth)return!1;let t=e?.outgoingHeaders?.Authorization;return async function(e=!1,t){let n=$o?.bearerToken;if(void 0!==t&&t!==n)return!0;let r=$o?.bearerExpiresAt,a=void 0!==r&&r-Date.now()>xo;if(e&&a)return!1;if(Date.now()-Eo<3e4)return!0;try{return await Ro(),!0}catch(e){return o.warn("Foundry Entra token renewal after a 401 failed:",e),!1}}(await async function(e){if(!e)return!1;let t=await e.response.clone().text().catch(()=>"");return/"code"\s*:\s*"PermissionDenied"/.test(t)}(e),t?.replace(/^Bearer /,""))}return No||=ko().then(({token:e})=>{ne._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{No=null}),await No,!0}function qo(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 Do=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function jo(e){let t=new URL(e),o=Do.exec(t.hostname)?.[1];return o?`https://${o}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function Mo(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,o]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:o||t}});return t.length>0?t:void 0}function Fo(e){let t=e.FOUNDRY_ENDPOINT,o=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");let n=function(e,t){let o=e?.trim().toLowerCase();if(!o)return t?"key":"entra";if("key"!==o&&"entra"!==o)throw Error(`FOUNDRY_AUTH must be "key" or "entra", got: "${o}"`);if("key"===o&&!t)throw Error("FOUNDRY_AUTH=key requires FOUNDRY_API_KEY");return o}(e.FOUNDRY_AUTH,o),r=qo(t),a=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:r,anthropicEndpoint:a?qo(a,"FOUNDRY_ANTHROPIC_ENDPOINT"):jo(r),auth:n,..."key"===n?{apiKey:o}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:Mo(e.FOUNDRY_DEPLOYMENTS)}}const Ho=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},Uo=e=>({...Ho(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),Bo=e=>`${e.anthropicEndpoint}/anthropic`,Lo=(e,t)=>({...Ho(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),zo=e=>"foundry"===e.provider;function Go(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const Ko=e=>zo(e)?(e=>`${e.endpoint}/openai/v1`)(Go(e)):gt(e),Jo=(e,t=!1)=>zo(e)?Uo(Go(e)):_t(e,t),Wo=e=>zo(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const Yo=[{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}],Vo={context:128e3,output:16384};function Xo(e){return Yo.find(({pattern:t})=>t.test(e))??Vo}const Zo=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,Qo=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function en(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 tn(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=Zt(o,ne.timeoutMs);try{let{response:n,span:r}=await st({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:Uo(e),signal:o.signal});try{if(!n.ok)throw new Vt("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 ot(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function on(e){return{object:"list",data:(e.deployments??await tn(e)).map(e=>function(e){let{model:t}=e;if(!Zo.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)?en(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):Qo(t)?en(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:Xo(t)}):en(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:Xo(t)})}(e)).filter(e=>void 0!==e)}}const nn=()=>zo(ne)&&ne.foundry?on(ne.foundry):an(),rn=async()=>{try{return await nn()}catch(e){if(e instanceof Vt&&401===e.response.status){if(!await Po(e))throw e;return nn()}throw e}},an=async()=>{let e=`${Ko(ne)}/models`,t=Jo(ne),o=ne.timeoutMs,n=new AbortController,r=Zt(n,o);try{let{response:o,span:r}=await st({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Vt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw ot(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const sn=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],ln="claude-haiku-4.5",cn={haiku:ln,"sonnet-4.6":"claude-sonnet-4.6","sonnet-4.5":"claude-sonnet-4.5","sonnet-4":"claude-sonnet-4","opus-4.7":"claude-opus-4.7","opus-4.6":"claude-opus-4.6","opus-4.5":"claude-opus-4.5",opus:"claude-opus-4.5"};const un=/^claude-/i;function pn(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function dn(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of sn)if(t.pattern.test(e))return t.family;return null}(n),i=un.test(n),s=n.replace(/-\d{8}(?::.*)?$/,""),l=r?`-${r}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let o=pn(e);for(let e of t)if(pn(e.replace(/-\d{8}(?::.*)?$/,""))===o)return e}return a?function(e,t,o=null){let n=cn[e];if(!n)return null;if(o){let e=`${n}-${o}`;if(t.includes(e))return e}if(t.includes(n))return n;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let n=o?`${e}-${o}`:e;if(t.includes(n))return n}return null}(a,t,r):null}const mn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function fn(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=mn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=mn.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}let hn;const gn=new Map;function _n(e,t,o){let n=(e??t??"").trim().toLowerCase();if(""!==n&&"none"!==n){if("copilot"!==n)throw Error(`--fallback must be "copilot", got: "${n}"`);if("foundry"!==o)throw Error("--fallback copilot requires --provider foundry");return n}}async function yn(){hn=await ee({provider:"copilot"},rn)}const wn=()=>void 0!==hn;function bn(e,t,o=Date.now()){let n=function(e,t=Date.now()){let o=e.get("retry-after-ms");if(null!==o&&Number.isFinite(Number(o))&&Number(o)>=0)return Number(o);let n=e.get("retry-after");if(null!==n){let e=Number(n);if(""!==n.trim()&&Number.isFinite(e)&&e>=0)return 1e3*e;let o=Date.parse(n);if(!Number.isNaN(o))return Math.max(0,o-t)}return 1e4}(t,o);return gn.set(e,Math.max(gn.get(e)??0,o+n)),n}function kn(e){if(!wn()||!zo(ne)||!e.ok)return;let{headers:t}=e;return t.has("retry-after")||t.has("retry-after-ms")?Response.json({error:{message:"Foundry rate-limited this request (HTTP 200 stream with retry-after).",type:"too_many_requests",code:"rate_limit_exceeded"}},{status:429,headers:t}):void 0}function vn(e,t,o){let{model:n,reason:r}=o,a=f.getActiveSpan();return a?.setAttribute("copilot_api.fallback.upstream","copilot"),a?.setAttribute("copilot_api.fallback.reason",r),a?.setAttribute("copilot_api.fallback.foundry_model",n),ee({provider:"copilot",models:hn,rerun:"foundry_429"===r},()=>t(e))}async function xn(e,t){if(!wn()||!zo(ne))return t(e);let n=await async function(e){try{let t=await e.req.json();return"string"==typeof t.model?t.model:void 0}catch{return}}(e);if(!n||!function(e){let t=hn?.data.map(e=>e.id)??[];return t.includes(e)?e:dn(e,t)??void 0}(n))return t(e);if(function(e,t=Date.now()){let o=gn.get(e);return void 0!==o&&(t<o||(gn.delete(e),!1))}(n))return vn(e,t,{model:n,reason:"breaker_open"});try{return await t(e)}catch(r){if(!(e=>e instanceof Vt&&429===e.response.status&&void 0!==e.outgoingBody)(r))throw r;let a=bn(n,r.response.headers);return await(r.response.body?.cancel()),f.getActiveSpan()?.setAttribute("copilot_api.fallback.retry_after_ms",a),o.info(`Foundry rate-limited ${n}; serving it from Copilot for ${Math.ceil(a/1e3)}s`),vn(e,t,{model:n,reason:"foundry_429"})}}const Tn=e=>new Promise(t=>{setTimeout(t,e)}),$n=e=>null==e;async function An({refreshFallback:e=!0}={}){let t=await rn();ne.models=t,e&&wn()&&await yn().catch(e=>{o.warn("Failed to refresh the Copilot fallback models:",e)})}const Sn=()=>{ne._v1="1.140.0-insider"};var En=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let On,Cn,In,Rn,Nn,Pn=!1,qn=!1,Dn=!1;function jn(){return Mn()?Nn:void 0}function Mn(){return void 0!==Nn&&Date.now()-Nn.at<6e4}function Fn(){return Dn?"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 Hn=()=>a.readFile(V.GITHUB_TOKEN_PATH,"utf8");function Un(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";ne._t1=void 0,Nn={status:s,message:l,at:Date.now()},clearInterval(On),On=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Pe.add(1,{reason:r,success:"false"}),qe.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:p.ERROR,message:n.message}),t.recordException(n),Ye.record(performance.now()-a,{reason:r}),tt(w.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":i,"copilot_api.token_refresh.terminal_status":s})}function Bn(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;ne._t1=void 0,o.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=n instanceof Error?n:Error(String(n));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:p.ERROR,message:s.message}),t.recordException(s),qe.add(1,{reason:r}),Ye.record(performance.now()-a,{reason:r}),tt(w.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Ln=async(e=5,t=1e3,n="scheduled")=>Pn?(o.debug("Token refresh already in progress, coalescing"),Cn):(Pn=!0,Cn=xe.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 ko();return ne._t1=t,Nn=void 0,qn&&void 0===On&&(o.info("Token refresh recovered, resuming scheduled refresh"),Gn(s)),o.debug("Service token refreshed successfully"),ne.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Pe.add(1,{reason:n,success:"true"}),Ye.record(performance.now()-a,{reason:n}),void tt(w.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Vt&&(401===s.response.status||403===s.response.status))return void Un({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),Pe.add(1,{reason:n,success:"false"}),l)return void Bn({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(),Pn=!1,Cn=void 0}}),Cn);async function zn(){return!!ne._t1||!Mn()&&(void 0!==Nn&&Dn&&await async function(){if(Cn)return;let e=(await Hn().catch(()=>{}))?.trim();e&&e!==ne._t2?.trim()&&(ne._t2=e,o.info("Picked up re-authenticated Auth token from disk"),ne.showToken&&o.info("Auth token:",e))}(),await Ln(3,250,"on-demand"),!!ne._t1)}function Gn(e){On&&clearInterval(On);let t=Math.max(1e3*(e-60),6e4);On=setInterval(()=>{Ln(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Kn(e){try{let t=await Hn();if(t&&!e?.force)return ne._t2=t,Dn=!0,ne.showToken&&o.info("Auth token:",t),void await Jn();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=ne.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${vt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:xt,scope:Tt}),signal:e.signal});if(!t.ok)throw new Vt("Failed to get device code",t);return await t.json()}finally{clearTimeout(o)}}();o.debug("Device code response:",n),o.info(`Please enter the code "${n.user_code}" at ${n.verification_uri}`);try{h.writeSync(n.user_code),o.success("Code copied to clipboard — opening browser...")}catch{o.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,o=y.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",g(t,[e],()=>{})}catch{}}(n.verification_uri);let r=await async function(e){let t=1e3*(e.interval+1);o.debug(`Polling access token with interval of ${t}ms`),o.start("Waiting for authorization...");let n=Date.now(),r=1e3*e.expires_in;for(;;){if(Date.now()-n>=r)throw new En("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=ne.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${vt}/login/oauth/access_token`,{method:"POST",headers:ut(),body:JSON.stringify({client_id:xt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await Tn(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 En("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new En("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 Tn(t);continue}if(r.access_token)return r.access_token;await Tn(t)}catch(e){if(e instanceof En)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await Tn(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(V.GITHUB_TOKEN_PATH,e,{mode:384}))(r),ne._t2=r,Dn=!0,ne.showToken&&o.info("Auth token:",r),await Jn()}catch(e){throw e instanceof Vt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Jn(){let e=await vo();o.success(`Authenticated as ${e.login}`)}async function Wn(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),ne.showToken=e.showToken,await X(),await Kn({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 Yn=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})=>Wn({verbose:e.verbose,showToken:e["show-token"]})}),Vn=.01,Xn=864e5,Zn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Qn=new Intl.NumberFormat("en-US"),er=e=>Zn.format(e*Vn),tr=e=>e.credits_used??e.entitlement-e.remaining,or=(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())/Xn;if(r<.5)return;let a=tr(e),i=a*Vn/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Vn,c=new Date(n.getTime()+l/i*Xn);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},nr=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Qn.format(tr(e))} of ${Qn.format(e.entitlement)} used`:"n/a",rr=e=>e.padEnd(14),ar=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${rr("AI credits")}unlimited`);else{let e=tr(o),t=o.percent_remaining;n.push(`${rr("AI credits")}${er(e)} / ${er(o.entitlement)} ${t.toFixed(1)}% left`,`${rr("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${rr("")}${Qn.format(e)} of ${Qn.format(o.entitlement)} credits`)}if(n.push("",`${rr("Chat")}${nr(e.quota_snapshots.chat)}`,`${rr("Completions")}${nr(e.quota_snapshots.completions)}`,"",`${rr("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Xn)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=or(o,e.quota_reset_date,t);r&&n.push(`${rr("Burn rate")}~${Zn.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?`${Qn.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${rr("Overage")}${a}`)}return n.join("\n")},ir=async()=>{let e=`${bt}/copilot_internal/user`,t=ne.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await st({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:kt(ne),signal:o.signal});try{if(!t.ok)throw new Vt("Failed to get usage",t);return await t.json()}catch(e){throw ot(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},sr=()=>y.stdout.write("[2J[H"),lr=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,cr=async()=>{let e=await ir();return ar(e)},ur=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 X(),await Kn(),!e.watch){try{o.box(await cr())}catch(e){o.error("Failed to fetch usage:",e),y.exit(1)}y.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?o.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&o.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),n=y.stdout.isTTY,r=()=>y.exit(0);for(y.on("SIGINT",r),y.on("SIGTERM",r);;){try{let e=await cr();n&&sr(),o.box(e),o.log(lr(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),pr=D(g);async function dr(){let e="win32"===y.platform?"where.exe":"which";try{return await pr(e,["tailscale"]),!0}catch{return!1}}async function mr(){try{let{stdout:e}=await pr("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function fr(e){return e.replace(/\.$/,"")}async function hr(){let e=await mr();if(e?.Online)return fr(e.DNSName)}const gr=D(g),_r=e=>`[1m${e}[0m`,yr=e=>`[2m${e}[0m`,wr=e=>`[36m${e}[0m`,br=e=>`[32m${e}[0m`,kr=e=>`[31m${e}[0m`,vr=e=>`[33m${e}[0m`,xr=yr(" ─────────────────────────────────────────────────────────────"),Tr=s.join(V.APP_DIR,"certs","tailscale"),$r=s.join(Tr,"cert.pem"),Ar=s.join(Tr,"key.pem"),Sr={certDir:Tr,certPath:$r,keyPath:Ar};function Er(){switch(y.platform){case"darwin":return[` ${yr("Install Tailscale for macOS:")}`,` ${wr("https://tailscale.com/download/mac")}`,` ${yr("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${yr("After installing, open the Tailscale app and sign in.")}`,` ${yr("Then re-run this command.")}`].join("\n");case"linux":return[` ${yr("Install Tailscale for Linux:")}`,` ${wr("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${wr("sudo tailscale up")}`,` ${yr("or")} ${wr("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${yr("Install Tailscale for Windows:")}`,` ${wr("https://tailscale.com/download/windows")}`,"",` ${yr("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${yr("Install Tailscale:")} ${wr("https://tailscale.com/download")}`}}function Or(){let e=[` ${kr("Tailscale is not running.")}`];return"darwin"===y.platform?e.push(` ${yr("Open the Tailscale app from Applications and sign in.")}`,` ${yr("Download:")} ${wr("https://tailscale.com/download/mac")}`):"win32"===y.platform?e.push(` ${yr("Open the Tailscale app and sign in.")}`,` ${yr("Download:")} ${wr("https://tailscale.com/download/windows")}`):e.push(` ${yr("Connect with:")} ${wr("sudo tailscale up")}`),e.push("",` ${yr("Then re-run this command.")}`),e.join("\n")}async function Cr(){try{return await a.access($r),await a.access(Ar),!0}catch{return!1}}function Ir(e){console.log(""),console.log(xr),console.log(` ${_r("Claude Cowork Setup")} ${yr("— Diagnostic")}`),console.log(xr),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?br("✅"):"missing"===n.status?kr("❌"):vr("❓");let r=n.detail?yr(` ${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(` ${br("All checks passed.")}`):console.log(` ${kr(`${t.length} issue(s).`)} Run ${wr("copilot-api cowork-setup install")} to fix.`),console.log("")}const Rr={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},Nr=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await dr();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return Ir(e),console.log(""),console.log(Er()),void console.log("");let o=await mr();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},Ir(e),console.log(Or()),void console.log("");let n=fr(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await Cr();e["tailscale-cert"]=r?{status:"ok",detail:$r}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),Ir(e)}(),y.exit(0)}}),Pr=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:Rr},async run({args:e}){await async function(e){if(console.log(""),console.log(xr),console.log(` ${_r("Claude Cowork Setup")} ${yr("— Install")}`),console.log(xr),console.log(""),!await dr())return console.log(` ${kr("Tailscale is not installed.")}`),console.log(""),console.log(Er()),console.log(""),console.log(` ${yr("After installing, run")} ${wr("tailscale up")} ${yr("to connect, then re-run this command.")}`),void console.log("");let t=await mr();if(!t||!t.Online)return console.log(Or()),void console.log("");let n=fr(t.DNSName);if(console.log(` ${yr("Tailscale hostname:")} ${_r(n)}`),console.log(""),console.log(` ${_r("Generating TLS certificate via Tailscale…")}`),console.log(` ${yr("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${wr(`$ tailscale cert --cert-file ${$r} --key-file ${Ar} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(Tr,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await gr("tailscale",["cert","--cert-file",$r,"--key-file",Ar,n]),console.log(` ${br("✓ 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(xr),console.log(` ${_r("Next steps")}`),console.log(xr),console.log(""),console.log(` ${_r("1.")} Start the proxy:`),console.log(` ${wr("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${_r("2.")} In Cowork ${yr("→")} Settings ${yr("→")} Inference Provider, set:`),console.log(` ${_r("inferenceGatewayBaseUrl")} = ${wr(`https://${n}:<port>`)}`),console.log(` ${yr("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${_r("3.")} Restart Cowork ${yr("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${yr("For Cowork's own configuration docs, see:")}`),console.log(` ${wr("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),qr=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:Rr},async run({args:e}){await async function(e){if(console.log(""),console.log(xr),console.log(` ${_r("Claude Cowork Setup")} ${yr("— Revert")}`),console.log(xr),console.log(""),!await Cr())return console.log(` ${yr("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${_r("Remove Tailscale cert files:")}`),console.log(` ${yr($r)}`),console.log(` ${yr(Ar)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(Tr,{recursive:!0}),console.log(` ${br("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${yr("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),Dr=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:Nr,install:Pr,revert:qr}}),jr=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Mr(e){if(!jr.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 Fr(e){return"string"==typeof e?Mr(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=Fr(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?Fr(a):a;!t&&(i!==a||"__proto__"===r)&&(t=Hr({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=Hr({},o,o.length),t.properties={}),t??e}(e):e}function Hr(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const Ur="x-copilot-api-self-test",Br=q();const Lr=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function zr(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 Gr(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();at.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:p.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(Ae.add(1,d),ze.record(s,d),c>=400&&Se.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&&(Ee.add(e.inputTokens,t),Xe.record(e.inputTokens,t)),e.outputTokens&&(Oe.add(e.outputTokens,t),Ze.record(e.outputTokens,t)),e.cachedTokens&&Ce.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ge.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const Kr=1048576;const Jr=async()=>{if(!te())return xe.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),et.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),He.add(1,{result:"rejected"}),new Vt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),He.add(1,{result:"approved"})}finally{e.end()}})};async function Wr(e){if(Wo(ne)||await zn())return null;let t=jn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Fn()}`,type:"authentication_error"}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function Yr(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 Vr(e,t){e.setAttributes(function(e){let t={};void 0!==e.prompt_tokens&&(t["copilot_api.input_tokens"]=e.prompt_tokens),void 0!==e.completion_tokens&&(t["copilot_api.output_tokens"]=e.completion_tokens),void 0!==e.total_tokens&&(t["copilot_api.total_tokens"]=e.total_tokens);let o=e.prompt_tokens_details?.cached_tokens;return void 0!==o&&(t["copilot_api.cached_tokens"]=o),t}(t))}var Xr=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Zr(e){if(!e||"string"!=typeof e)throw new Xr("Model name is required and must be a string");if("foundry"===ne.provider)return e;if(!ne.models?.data)throw new Xr("Models not available. Please try again later.",503);let t=ne.models.data.map(e=>e.id);if(t.includes(e))return e;let o=dn(e,t);if(!o)throw Re.add(1,{requested_model:e}),new Xr(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Qr(e){let t=ne.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===ne.provider?Qo(e):/gpt-[\d.]+-codex/i.test(e)}async function ea(e){if(void 0===e.rateLimitSeconds||te())return;let t=e.rateLimitSeconds;return xe.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"),Ie.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Vt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Ie.add(1,{action:"waited",source:"local"}),Je.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await Tn(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var ta=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function oa(e){if(e instanceof ta)return{type:e.type,message:e.message};if(e instanceof Vt){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 na(e,t){let{type:n,message:r}=oa(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 ra(e,t){let{type:n,message:r}=oa(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 aa(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 ia(e,t,o){return Math.min(Math.max(e,t),o)}function sa(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 sa(JSON.parse(r),t+1)}catch{return null}}function la(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=aa(o.capabilities.supports.min_thinking_budget),r=aa(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:aa(o.capabilities.limits?.max_output_tokens)??void 0}}function ca(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=ia(aa(e.requestedBudget)??o,o,n),a=aa(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 ua(e,t){if($n(e.thinking_budget))return e;let o=la(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=ca({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 pa(e){return"invalid_thinking_budget"===sa(e)}async function da(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if($n(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(!pa(i))return null;let l=la(n,t.model);return l?function(e,t){let o=ca({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=aa(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 ma(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 fa(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const ha=new Map,ga=new Map,_a=new Set;let ya,wa,ba;function ka(e){return!e.closed&&!e.destroyed}function va(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new I(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return ha.set(t,Date.now()),Be.add(1,{event:"created",origin:e}),tt(w.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{o.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{o.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(n,r,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=_a.has(t);Be.add(1,{event:"goaway",origin:e}),tt(i?w.WARN:w.DEBUG,i?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),ga.delete(t),_a.delete(t),ha.delete(t),ka(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function xa(e,t){if(!ne.connectivity.h2)return;if(ya&&ya!==e&&function(){for(let e of[...ga.keys(),..._a])ka(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});ga.clear(),_a.clear(),ha.clear()}(),ya=e,t?.fresh){let t=va(e);return _a.add(t),t}let n=Date.now();for(let[t]of ga)if(n-(ha.get(t)??0)>=6e5)ga.delete(t),ha.delete(t),ka(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Be.add(1,{event:"rotated",origin:e}),tt(w.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(ka(t))return ga.delete(t),_a.add(t),t;ga.delete(t),ha.delete(t)}let r=va(e);return _a.add(r),r}function Ta(e){e&&_a.delete(e)&&(ka(e)?ga.set(e,Date.now()):ha.delete(e))}function $a(){ba||(ba=setInterval(()=>{!function(){let e=Date.now(),t=ne.connectivity.h2Keepalive,n=ga.size;for(let[r,a]of ga)e-a<6e4||t&&n<=1||(ga.delete(r),ha.delete(r),n--,ka(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Be.add(1,{event:"idle_reaped",origin:ya??""}),tt(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${ya}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":ya??""}))}()},3e4),ba.unref())}function Aa(){wa||(o.debug("Starting HTTP/2 keepalive (every 45s)"),wa=setInterval(()=>{(async function(){if(0===ga.size&&0===_a.size){if(ya){let e=va(ya);ga.set(e,Date.now())}return}let e=[...ga.keys()];for(let t of e)ga.delete(t);await Promise.allSettled(e.map(async e=>{if(ka(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:_t(ne)});await n.dump(),Ue.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),ga.set(e,Date.now())}catch(t){Ue.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Be.add(1,{event:"error",origin:ya??""}),ha.delete(e),ka(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else ha.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),wa.unref(),$a())}function Sa(e){return e.max_completion_tokens??e.max_tokens}async function Ea(e,t,o){try{if(!e.ok)throw new Vt("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&&Vr(t,n.usage),n}catch(e){throw ot(t,e),e}finally{t.end()}}const Oa=e=>zo(ne)?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=Sa(e);return null==i?a:{...a,max_completion_tokens:i}}(e,ne.models),Ca=e=>zo(ne)?e:Fr(e),Ia=async e=>{let t=Ca(e);try{return await Ra(t)}catch(e){if(e instanceof Vt&&401===e.response.status){if(!await Po(e))throw e;return Ra(t)}let n;if(e instanceof Vt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await da({payload:t,error:e,models:ne.models,errorBodyText:n});if(r)return e instanceof Vt&&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 Ra(Ca(r));throw e}},Ra=async e=>{if(!Wo(ne))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={...Jo(ne,t),"X-Initiator":o?"agent":"user"},r=Ko(ne),a=`${r}/chat/completions`,i=ne.timeoutMs,s=Oa(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":Sa(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user","copilot_api.upstream.provider":ne.provider};for(let t=0;t<=1;t++){let o=xa(r,{fresh:t>0}),s=new AbortController,u=Zt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await lt({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 Vt("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:H(m),span:d,release:()=>Ta(o)}}try{return await Ea(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{Ta(o)}}catch(e){if(Ta(o),await Yt(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Na=new Map;const Pa=["none","minimal","low","medium","high","xhigh","max"];function qa(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=Pa.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=Pa.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 Da(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:[];Na.set(e.model,r);let a=qa(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 ja(e,t,o){try{if(!e.ok)throw new Vt("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&&Vr(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 ot(t,e),e}finally{t.end()}}const Ma=async(e,t)=>{let o=zo(ne),n=o?function(e){let t=Na.get(e.model);return t?qa(e,t):e}(e):e,r=!1,a=!1;for(;;)try{return t?.onAttempt?.(n),await Fa(n)}catch(e){if(!(e instanceof Vt))throw e;if(401===e.response.status&&!r){if(r=!0,!await Po(e))throw e;continue}if(o&&400===e.response.status&&!a){a=!0;let t=Da(n,await e.response.clone().text().catch(()=>{}));if(t){n=t;continue}}throw e}},Fa=async e=>{if(!Wo(ne))throw Error("Service token not found");let t=zo(ne)?e:Fr(e),o={...Jo(ne),"X-Initiator":"agent"},n=Ko(ne),r=`${n}/responses`,a=ne.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","copilot_api.upstream.provider":ne.provider};for(let e=0;e<=1;e++){let l=xa(n,{fresh:e>0}),c=new AbortController,u=Zt(c,a);try{let{statusCode:n,headers:u,body:d,span:m}=await lt({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}),f=new Response(d,{status:n,headers:u});if(t.stream){let e=kn(f);if(e&&(m.setAttribute("copilot_api.foundry.throttled_stream",!0),m.setAttribute("copilot_api.upstream.effective_status",429),m.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(f.body?.cancel())),!f.ok||e)throw m.end(),new Vt("Failed to create responses",e??f,{outgoingBody:i,outgoingHeaders:o});return{events:H(f),span:m,release:()=>Ta(l)}}try{return await ja(f,m,{outgoingBody:i,outgoingHeaders:o})}finally{Ta(l)}}catch(t){if(Ta(l),await Yt(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Ha=e=>Object.hasOwn(e,"output");function Ua(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens,...t.input_tokens_details&&{prompt_tokens_details:{cached_tokens:t.input_tokens_details.cached_tokens}},...t.output_tokens_details&&{completion_tokens_details:{reasoning_tokens:t.output_tokens_details.reasoning_tokens}}}:null}var Ba=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 za(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Ba(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Ba(`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=>Ka(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=Ja(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Ka(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:Ka(o.content)})}return t}(e.messages);if(0===o.length)throw new Ba("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),Ga(e.temperature)&&(n.temperature=e.temperature),Ga(e.top_p)&&(n.top_p=e.top_p),Ga(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),Ga(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 Ga(e){return null!=e}function Ka(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Ja(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 Ba(`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 Wa(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 Ya(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 Va(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 Xa(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Za(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Xa(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Va(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),[Va(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Qa(e,t){let o=[Va(e,{},Ya(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=Wa(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function ei(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:[Va(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Za(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Xa(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Va(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Qa(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 ti="openai_responses";function oi(e){let t=performance.now(),n=xe.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),za(e)}finally{t.end()}});We.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 ni(e){let t=performance.now(),o=xe.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:Ya(e,n.length>0)}]};return e.usage&&(r.usage=Wa(e.usage)),r}(e)}finally{t.end()}});return We.record(performance.now()-t,{direction:"responses_to_openai"}),o}function ri(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=Wa(t.usage);a.tokenUsage=Yr(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(ni(t))}async function ai(e,t,n){let r;try{r=oi(t)}catch(t){if(t instanceof Ba)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),ne.manualApprove&&!n.isSelfTest&&await Jr();let a=await Wr(e);if(a)return a;let i=performance.now(),s=await Ma(r),l=performance.now()-i;if(Ge.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Ha(s))return ri(e,s,l);let{events:c,span:u,release:p}=s,d=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return F(e,async t=>{let n=null,a=0,s=performance.now(),m=ma(e,i);try{try{for await(let i of c){if(m(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Fe.add(1,{model:r.model,endpoint_type:ti});let c=Ua(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Yr(c),t._d1=l,e.set("requestData",t)}let u=ei(s,d);if(u.error)throw new ta(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:ti};Ke.record(performance.now()-s,u),Qe.record(a,u),fa(e,i)}catch(o){throw nt(u,e.get("requestSpan"),o),await ra(t,o),o}finally{n&&Vr(u,n),u.end(),p()}let f=e.get("requestId");f&&ge.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function ii(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 si(e){let t=!0===e.get("isSelfTest");t||await ea(ne);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return xe.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Zr(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),Ne.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 Xr)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(Qr(n.model))return ai(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),ne.manualApprove&&!t&&await Jr(),"foundry"!==ne.provider&&(n=function(e){if(!$n(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!$n(e.max_tokens))return e;let t=(ne.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=ua(n,ne.models)),$n(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Wr(e);if(r)return r;let a=performance.now(),i=await Ia(n),s=performance.now()-a;if(Ge.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),li(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Yr(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 F(e,async t=>{let o={value:null},r=0,i=performance.now(),p=ma(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Fe.add(1,{model:n.model,endpoint_type:"openai"}),i=ii(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Yr(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(Ke.record(c,u),Qe.record(r,u),fa(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Yr(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw nt(c,e.get("requestSpan"),o),await ra(t,o),o}finally{o.value&&Vr(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ge.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const li=e=>Object.hasOwn(e,"choices"),ci=new j;ci.post("/",async e=>{try{return await si(e)}catch(t){return await bo(e,t)}});const ui=async e=>{if(!Wo(ne))throw Error("Service token not found");let t=`${Ko(ne)}/embeddings`,o=Jo(ne),n=ne.timeoutMs,r=new AbortController,a=Zt(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await st({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1,"copilot_api.upstream.provider":ne.provider}});try{if(!n.ok)throw new Vt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw ot(a,e),e}finally{a.end()}}finally{clearTimeout(a)}},pi=new j;pi.post("/",async e=>{try{let t=await e.req.json();try{t.model=Zr(t.model)}catch(t){if(t instanceof Xr)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=await Wr(e);if(o)return o;let n=performance.now(),r=await(async e=>{try{return await ui(e)}catch(t){if(t instanceof Vt&&401===t.response.status){if(!await Po(t))throw t;return ui(e)}throw t}})(t),a=performance.now()-n;Ge.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Yr(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await bo(e,t)}});const di=new j;let mi=null,fi=null;function hi(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function gi(e){return!hi(e)}di.get("/",async e=>{let t,o=function(){if(zo(ne)){if(!Wo(ne))return"missing";let e=ne.foundry?.bearerExpiresAt;return void 0!==e&&e<=Date.now()?"expired":"valid"}let e=ne._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=mi;return t&&e-t.timestamp<3e4?{result:t.result}:fi||(fi=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${Ko(ne)}/models`,n=await fetch(t,{method:"GET",headers:Jo(ne),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return mi={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return mi={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),fi=null}})(),fi)}();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.12",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 _i=new U(L),yi={...B["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function wi(e){try{return _i.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function bi(e){let t=0;for(let o of e)switch(o.type){case"text":t+=wi(o.text)*yi.contentMultiplier;break;case"tool_use":t+=wi(o.name+JSON.stringify(o.input))*yi.contentMultiplier;break;case"tool_result":o.content&&(t+=wi("string"==typeof o.content?o.content:JSON.stringify(o.content))*yi.contentMultiplier);break;case"thinking":t+=wi(o.thinking)*yi.contentMultiplier;break;case"image":t+=1600}return t}function ki(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?yi.perFirstProp:yi.perAdditionalProp,t+=wi(o),r.description&&(t+=yi.perPropDesc+wi(r.description)),r.enum&&Array.isArray(r.enum)){t+=yi.perEnum;for(let e of r.enum)t+=wi(String(e))}if("object"===r.type&&r.properties&&(t+=yi.perNestedObject,t+=ki(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=yi.perArrayOfObjects,t+=ki(e))}}return t}function vi(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")},n=e.thinking;if(n&&"object"==typeof n){let{type:e,budget_tokens:t}=n;"string"==typeof e&&(o["copilot_api.thinking.type"]=e),"number"==typeof t&&t&&(o["copilot_api.thinking.budget_tokens"]=t)}let r=e.output_config?.effort;return"string"==typeof r&&r&&(o["copilot_api.output_config.effort"]=r),o}function xi(e,t,o){let n=vi(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Ti=async(e,t,n)=>{try{return await $i(e,t)}catch(r){if(r instanceof Vt&&401===r.response.status){if(!await Po(r))throw r;return $i(e,t)}if(r instanceof Vt&&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}`),$i(i,t)}throw r}};const $i=async(e,t)=>{if(!Wo(ne))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=zo(ne)&&ne.foundry?{baseUrl:Bo(ne.foundry),headers:Lo(ne.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={...wt(ne,t,r),"X-Initiator":"agent"};return{baseUrl:gt(ne),headers:a,cleanPayload:n}}(Fr(e),t),a=`${o}/v1/messages`,i=ne.timeoutMs,s=JSON.stringify(r),l=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough","copilot_api.upstream.provider":ne.provider,...vi(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){let t=xa(o,{fresh:e>0}),c=new AbortController,u=Zt(c,i);try{let{statusCode:o,headers:u,body:p,span:d}=await lt({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 Vt("Failed to create anthropic messages",m,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:H(m),span:d,release:()=>Ta(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&&Vr(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(),Ta(t)}}catch(o){if(Ta(t),await Yt(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Ai=new Set(["low","medium","high","max","xhigh"]),Si=(e,t)=>!(!e||!t||e===t);function Ei(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!Ai.has(t))return e;let n=ne.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=fn(t,n);if(!r||!Ai.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=f.getActiveSpan();return i?.setAttribute("copilot_api.effort.requested",t),i?.setAttribute("copilot_api.effort.clamped_to",a),{...e,output_config:{...e.output_config,effort:a}}}function Oi(e,t,n){if("foundry"===ne.provider)return Ei(e);let r=t.includes(e.model)?e.model:dn(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=dn(e,t);return n&&o.context1m?function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,new Set(t)):null}(a.model,t,{context1m:n.context1m}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=f.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",a.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),s={...a,model:i}}return Ei(s)}const Ci=e=>"object"==typeof e&&!!e&&!Array.isArray(e),Ii=["properties","patternProperties","$defs","definitions"],Ri=["items","additionalProperties","propertyNames","contains","not","if","then","else"],Ni=["anyOf","allOf","oneOf","prefixItems"];const Pi=()=>["string","number","boolean"].map(e=>({type:e})),qi=()=>({anyOf:[...Pi(),{type:"array",items:{anyOf:Pi()}},{type:"object"}]}),Di=e=>!0===e||Ci(e)&&0===Object.keys(e).length,ji=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function Mi(e,t){let o={...e};for(let e of Ii){let n=o[e];Ci(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,Ci(o)?Mi(o,t):o])))}for(let e of Ri){let n=o[e];Ci(n)&&(o[e]=Mi(n,t))}for(let e of Ni){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>Ci(e)?Mi(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(Ci(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>Di(e)?qi().anyOf:Ci(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)),ji(o)&&(!("items"in o)||Di(o.items))&&(t.add("items"),o.items=qi()),Di(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function Fi(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=Ui(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function Hi(e){return Bi(Ui(e))}function Ui(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 Bi(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=>Bi(e)).filter(Boolean).join("\n\n")}const zi=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),Gi=new Set(["text","image"]);function Ki(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);Gi.has(e)||t.add(`block:tool_result:${e}`)}}const Ji=new Set;function Wi(e,t){e.setAttribute("copilot_api.translation.system_message_count",t.filter(e=>"system"===e.role).length),e.setAttribute("copilot_api.translation.has_images",function(e){return e.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type||"tool_result"===e.type&&Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)))}(t));let o=function(e){let t=new Set;for(let o of e){if(t.size>=20)break;let e=String(o.role).slice(0,64),n=zi.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&&Ki(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(Ji.size>=100)break;Ji.has(o)||(Ji.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 Yi=e=>N("sha256").update(e).digest("hex").slice(0,12);function Vi(e,t){e.setAttribute("copilot_api.translation.system_hash",Yi(t.system)),e.setAttribute("copilot_api.translation.tools_hash",Yi(JSON.stringify(t.tools??[])))}function Xi(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Zi(e){return e.toLowerCase().startsWith("claude-")}function Qi(e,t){let o={model:e.model,messages:es(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:ls(e.tools,e.model),tool_choice:cs(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=la(t,o.model);if(r){let a="enabled"===n.type&&"number"==typeof n.budget_tokens?n.budget_tokens:function(e,t,o){let n=function(e,t){return"max"===e||"xhigh"===e?t:"medium"===e?8e3:"low"===e?1024:16e3}(e,o.max),r=aa(t),a=r&&r>1?r-1:o.min;return ia(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=ua({...o,thinking_budget:a},t)}}return o}function es(e,t){let{leadingSystemTexts:o,messages:n}=Fi(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=Hi(e);if(!t)break;ts(r)?a.push(t):os(r,t);break}case"user":r.push(...ns(e));for(let e of a)os(r,e);a=[];break;case"assistant":r.push(...rs(e))}for(let e of a)os(r,e);return r}function ts(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function os(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 ns(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:ss(e.content)});n.length>0&&t.push({role:"user",content:ss(n)})}else t.push({role:"user",content:ss(e.content)});return t}function rs(e){let t=function(e){return{reasoning_text:is(e.reasoning_text),reasoning_opaque:is(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:ss(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:ss(e.content),...t}]}const as=32768;function is(e){if("string"==typeof e)return e.length<=as?e:e.slice(0,as)}function ss(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 ls(e,t){if(!e)return;let o=e.filter(gi),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:Mi(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)r.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return r.size>0&&f.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function cs(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 us(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 ps(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function ds(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 ms=new Set(["low","medium","high","max","xhigh"]);function fs(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&&ms.has(e)?e:null)(fn(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 hs(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 gs=/[^\w-]/g;function _s(e){return e.replaceAll(gs,"_")}function ys(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=fs(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:hs(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:_s(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:_s(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function ws(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"thinking must be an object";let o=t;return"string"==typeof o.type?"enabled"!==o.type||void 0===o.budget_tokens||"number"==typeof o.budget_tokens&&Number.isFinite(o.budget_tokens)&&!(o.budget_tokens<=0)&&Number.isInteger(o.budget_tokens)?null:"thinking.budget_tokens must be a positive integer":"thinking.type must be a string"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"output_config must be an object";let o=t;return void 0===o.effort||"string"==typeof o.effort?null:"output_config.effort must be a string"}(e)}function bs(e,t,o=400){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function ks(e,t){return xe.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),xi(n,t,e.req.header("anthropic-beta"));let r=Zr(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=ws(t);return a?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}):r===t.model?(n.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(n.setAttribute("copilot_api.model.was_mapped",!0),Ne.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 Xr)return{ok:!1,response:bs(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function vs(e,t,o){let{leadingSystemTexts:n,messages:r}=Fi(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=Hi(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(Es(e));break}case"user":t.push(...Os(n),...o.map(e=>Es(e))),o=[];break;case"assistant":t.push(...Rs(n))}return t.push(...o.map(e=>Es(e))),t}(r);if(0===a.length)throw new Vt("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(gi).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:Ss(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=fn(o,t);return{effort:As(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function xs(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${N("sha256").update(o).digest("hex").slice(0,32)}`}function Ts(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 $s=new Set(["low","medium","high","xhigh"]),As=e=>null!==e&&$s.has(e);function Ss(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Es(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function Os(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(Is(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(Cs(t))}t.push({type:"message",role:"user",content:e})}else{let e=n.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function Cs(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function Is(e){if(Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)){let t=e.content.filter(e=>["image","text"].includes(e.type)).map(e=>"image"===e.type?Cs(e):{type:"input_text",text:e.text});return e.is_error&&t.unshift({type:"input_text",text:"[ERROR]"}),{type:"function_call_output",call_id:e.tool_use_id,output:t}}let t;return t="string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.filter(e=>"text"===e.type).map(e=>e.text).join("\n"):"",e.is_error&&(t=`[ERROR] ${t}`),{type:"function_call_output",call_id:e.tool_use_id,output:t}}function Rs(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 Ns(e,t){if("incomplete"===e.status)return"content_filter"===e.incomplete_details?.reason?"refusal":"max_tokens";if(t)return"tool_use";switch(e.status){case"completed":case"cancelled":case"failed":return"end_turn";default:return null}}function Ps(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function qs(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 Ds(e,t){let o=[];switch(e.type){case"response.created":qs(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){qs(t,o),Ps(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":qs(t,o),Ps(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":Ps(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":{Ps(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage,a=Ns(e.response,n);t.terminalEvent=e.type,t.stopReason=a,o.push({type:"message_delta",delta:{stop_reason:a,stop_sequence:null},usage:Ts(r)},{type:"message_stop"});break}case"response.incomplete":{qs(t,o),Ps(t,o);let n=e.response.usage,r=Ns(e.response,!1);t.terminalEvent=e.type,t.stopReason=r,o.push({type:"message_delta",delta:{stop_reason:r,stop_sequence:null},usage:Ts(n)},{type:"message_stop"});break}case"response.failed":qs(t,o),Ps(t,o),t.terminalEvent=e.type,o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":qs(t,o),Ps(t,o),t.terminalEvent=e.type,t.stopReason="end_turn",o.push({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{input_tokens:0,output_tokens:0}},{type:"message_stop"});break;case"response.refusal.delta":qs(t,o),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"error":t.terminalEvent=e.type,o.push({type:"error",error:{type:e.code??"api_error",message:e.message??"Response generation failed"}})}return o}function js(e,t,o){let n=t.reasoning?.effort,r=e.get("requestData")||{};r.reasoningEffort=n,r.effortClamped=Si(o,n),e.set("requestData",r)}function Ms(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function Fs(e,t,n){for(let r of t){if(o.debug("Translated Anthropic event:",r),"error"===r.type)throw n?.setAttribute("copilot_api.error_type","upstream_failure"),new ta(r.error.type,r.error.message);await e.writeSSE({event:r.type,data:JSON.stringify(r)})}}async function Hs(e,t,r){let a=performance.now(),i=xe.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),Wi(o,t.messages);let n=vs(t,ne.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===ne.provider,promptCacheKey:"foundry"===ne.provider?xs(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return Vi(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});We.record(performance.now()-a,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",i),e.set("requestData",{model:i.model,streaming:!!i.stream}),js(e,i,r),ne.manualApprove&&await Jr();let s=performance.now(),l=await Ma(i,{onAttempt:t=>js(e,t,r)}),c=performance.now()-s;if(Ge.record(c,{model:i.model,target:"responses",streaming:String(!!i.stream)}),Ha(l)){let t=e.get("requestData")||{};if(Ms(e.get("requestSpan"),l.usage?.output_tokens_details?.reasoning_tokens),l.usage&&(t.tokenUsage=Yr({prompt_tokens:l.usage.input_tokens,completion_tokens:l.usage.output_tokens,total_tokens:l.usage.total_tokens,prompt_tokens_details:l.usage.input_tokens_details})),t._d1=c,t.upstreamTtfbMs=c,t.upstreamTotalMs=c,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(l).slice(-400)),"failed"===l.status)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:l.error?.code??"api_error",message:l.error?.message??"Response generation failed"}},500);let r=performance.now(),a=xe.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","responses_to_anthropic");let t=function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:Ns(e,o),stop_sequence:null,usage:Ts(e.usage)}}(l);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 We.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:u,span:p,release:d}=l;return F(e,async t=>{let n=null,r=0,a=performance.now(),l=ma(e,s),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let a of u){if(l(),o.debug("Responses API raw stream event:",a),!a.data)continue;let s;try{s=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}r++,Fe.add(1,{model:i.model,endpoint_type:"responses"});let u=Ua(s);if(u){n=u;let t=e.get("requestData")||{};t.tokenUsage=Yr(n),t._d1=c,e.set("requestData",t)}await Fs(t,Ds(s,m),e.get("requestSpan"))}!function(e,t){if(!t.terminalEvent)throw e?.setAttribute("copilot_api.error_type","stream_incomplete"),new ta("api_error","Upstream stream ended before the response completed")}(e.get("requestSpan"),m);let p=performance.now()-a,d={model:i.model,endpoint_type:"responses"};Ke.record(p,d),Qe.record(r,d),fa(e,s)}catch(o){throw nt(p,e.get("requestSpan"),o),await na(t,o),o}finally{n&&Vr(p,n),function(e,t,o){e&&(Ms(e,o?.completion_tokens_details?.reasoning_tokens),e.setAttribute("copilot_api.stream.terminal_event",t.terminalEvent??"none"),void 0!==t.stopReason&&e.setAttribute("copilot_api.translation.stop_reason",t.stopReason??"null"),e.setAttribute("copilot_api.translation.tool_use_count",Object.keys(t.toolCalls).length))}(e.get("requestSpan"),m,n),p.end(),d()}}finally{try{let t=e.get("requestId");t&&ge.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}})}function Us(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 Bs(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Ls(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&&(Us(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&&(Us(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Bs(t,o)),r.content&&(Bs(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){Bs(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&&(Bs(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Xi(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 zs=/structured_outputs|output_config\.format/i;function Gs(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&zs.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?ys({...e,model:ln},o):null}var Ks=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Js=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const Ws={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 st({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 ot(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Js: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 st({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 ot(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Ks:e}finally{clearTimeout(i)}}},Ys=["tavily","exa"];function Vs(e){return"tavily"===e||"exa"===e}function Xs(){return ne.webSearchProviders.length>0}async function Zs(e,t){return async function(e,t,n){let{providers:r,searchFns:a=Ws}=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:ne.webSearchProviders})}function Qs(e){let t=e.tools;return!(!t||1!==t.length)&&hi(t[0])}function el(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function tl(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 ol(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&&hi(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(!Xs())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await Zs(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_${el()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...tl(n,e)}];return{id:`msg_ws_${el()}`,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_${el()}`,r=`msg_ws_${el()}`,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:tl(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}),F(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}async function nl(e){if(Wo(ne)||await zn())return null;let t=jn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Fn()}`}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function rl(e,t){let o=t.model;return o&&"string"==typeof o?null:bs(e,"Model name is required and must be a string")}async function al(e){let t=await e.req.json();if(Qs(t))return rl(e,t)??ol(e,t);await ea(ne),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=rl(e,t);if(a)return a;t=function(e,t){return Oi(t,ne.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=ks(e,t);if(!i.ok)return i.response;t=i.payload;let s=await nl(e);if(s)return s;if(Qr(t.model))return Hs(e,t,r);if(function(e){if("foundry"!==ne.provider)return Zi(e);let t=ne.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:Zi(e)}(t.model))return async function(e,t,o){let n="foundry"===ne.provider,r=n?t:ys(t,ne.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:Si(o,i),streaming:!!r.stream}),ne.manualApprove&&await Jr(),xe.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),xi(t,r,a.anthropicBeta);try{let o=performance.now(),i=await Ti(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=Gs(e,o,ne.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(Ge.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=Yr(sl(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 F(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=ma(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,Fe.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),ll(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"};Ke.record(e,t),Qe.record(a,t)}catch(t){throw nt(c,e.get("requestSpan"),t),await na(n,t),t}finally{if(fa(e,o),p){let t=sl(s);Vr(c,t);let o=e.get("requestData")||{};o.tokenUsage=Yr(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&ge.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw ot(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=xe.startActiveSpan("copilot_api.translate.anthropic_to_openai",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),o.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),o.setAttribute("copilot_api.translation.has_system",!!t.system),o.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let n=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));o.setAttribute("copilot_api.translation.has_thinking",n),Wi(o,t.messages);let r=Qi(t,ne.models),a=r.messages.at(0);return Vi(o,{system:"system"===a?.role&&"string"==typeof a.content?a.content:"",tools:r.tools}),r}finally{o.end()}});We.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=ua(c,ne.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:Si(r,u),streaming:!!c.stream});let p=performance.now();ne.manualApprove&&await Jr();let d=await Ia(c),m=performance.now()-p;if(Ge.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),il(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=Yr(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=xe.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=ps(a.message),i=us(a.message.content),s=ds(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:Xi(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 We.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 F(e,async t=>{let n=null,r=0,a=performance.now(),i=ma(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++,Fe.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=Yr(n),t._d1=m,e.set("requestData",t)}let u=Ls(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(Ke.record(l,u),Qe.record(r,u),fa(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Yr(n),t._d1=m,e.set("requestData",t))}}catch(o){throw nt(h,e.get("requestSpan"),o),await na(t,o),o}finally{n&&Vr(h,n),h.end(),g()}let l=e.get("requestId");l&&ge.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const il=e=>Object.hasOwn(e,"choices");function sl(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 ll(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}const cl=new j;cl.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&Qs(t)}catch{return!1}}(e)?await al(e):await xn(e,al)}catch(t){return await bo(e,t)}});const ul=new j;function pl(e){return xe.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Zr(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),Ne.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 dl(e,t){let o=function(e){try{let t=JSON.parse(e);if(("response.completed"===t.type||"response.incomplete"===t.type)&&t.response?.usage){let e=t.response.usage;return{prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens,prompt_tokens_details:e.input_tokens_details}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=Yr(o),n._d1=t._d1,t.c.set("requestData",n)}ul.get("/",async e=>{try{ne.models||await An();let t=ne.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 bo(e,t)}});const ml=new Set(["message","function_call","function_call_output"]),fl=new Set(["type","name","description","parameters"]);async function hl(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||!Xs())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await Zs(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function gl(e){if(Xs())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await hl(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function _l(e){if(!Xs())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 hl(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function yl(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 ml.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function wl(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 bl(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&&wl(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)wl(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function kl(e){return null!=e}function vl(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function xl(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Tl(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(!vl(n)){o.push(n);continue}let e=yl(n);null===e?t.add(xl(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"])kl(e[o])&&(t[o]=e[o]);let r=new Set;if(kl(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))fl.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(kl(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},kl(o.effort)&&(t.reasoning.effort=o.effort),kl(o.summary)&&(t.reasoning.summary=o.summary)}if(kl(e.text)&&"object"==typeof e.text){let o=e.text;kl(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function $l(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Al(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=f.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||kl(n.previous_response_id)||kl(n.prompt)||kl(n.conversation)?null:$l(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 Sl(e){await ea(ne);let t=await e.req.json();if(!vl(t))return $l(e,"request body must be a JSON object");let n=function(e){return"foundry"===ne.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:Tl(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:pl(t)}}catch(t){if(t instanceof Xr)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=Al(e,t.input,n);if(s)return s;let l=await Wr(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),ne.manualApprove&&await Jr();let c=performance.now(),u=await Ma(a),p=performance.now()-c;if(Ge.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),El(u))return async function(e,t,o){await gl(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Yr({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens,prompt_tokens_details:t.usage.input_tokens_details})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return F(e,async t=>{let o={value:null},n=0,i=performance.now(),s=ma(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=bl(i.data,r);s=await _l(s);let l=s===i.data?i:{...i,data:s};Fe.add(1,{model:a.model,endpoint_type:"responses"}),dl(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"};Ke.record(l,u),Qe.record(n,u),fa(e,c)}catch(o){throw nt(m,e.get("requestSpan"),o),await ra(t,o),o}finally{o.value&&Vr(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ge.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const El=e=>Object.hasOwn(e,"output"),Ol=new j;Ol.post("/",async e=>{try{return await xn(e,Sl)}catch(t){return await bo(e,t)}});const Cl=new j;Cl.get("/",e=>{try{return ne.showToken?e.json({token:ne._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 Il=new j;Il.get("/",async e=>{try{let t=await ir();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Rl=new j;function Nl(){return function(e){let t=e.filter(e=>zr(e));if(0===t.length)return;let o=t.find(e=>Lr.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(ne.models?.data??[])}function Pl(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 Mr(o).slice(0,200)}catch{}let t=Mr(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 ql(e={}){let t=performance.now(),o=e.model&&function(e){let t=ne.models?.data.find(t=>t.id===e);return void 0!==t&&zr(t)}(e.model)?e.model:Nl();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 Rl.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[Ur]:Br},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:Pl(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)}}Rl.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=$t(i),l=function(e){return e===Br}(e.req.header(Ur));e.set("requestId",r),e.set("isSelfTest",l),e.header("x-request-id",r);let c=xe.startSpan("copilot_api.handle_request",{kind:u.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",c),e.set("requestTraceContext",c.spanContext()),l&&c.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();at.has(e)||"x-copilot-api-self-test"!==e&&c.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=await e.req.raw.clone().text();e.set("rawBody",t.length>Kr?t.slice(0,Kr):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let m,h=new Promise(e=>{m=e});e.set("streamComplete",h),e.set("resolveStreamComplete",m);let g=f.setSpan(d.active(),c);await d.with(g,async()=>{l||ge.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw c.setStatus({code:p.ERROR,message:t.message}),c.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:c};_?.streaming&&e.res.status<400?h.then(()=>Gr(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{c.recordException(t),c.setStatus({code:p.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{c.end()}catch{}}):Gr(y)}),Rl.use(M()),Rl.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()}),Rl.get("/",e=>e.text("Server running")),Rl.route("/health",di),Rl.route("/chat/completions",ci),Rl.route("/models",ul),Rl.route("/embeddings",pi),Rl.route("/usage",Il),Rl.route("/token",Cl),Rl.route("/v1/chat/completions",ci),Rl.route("/v1/models",ul),Rl.route("/v1/embeddings",pi),Rl.route("/v1/messages",cl),Rl.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=yi.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=yi.perMessage+wi(e)*yi.contentMultiplier}for(let e of t.messages)o+=yi.perMessage,o+=wi(e.role),"string"==typeof e.content?o+=wi(e.content)*yi.contentMultiplier:Array.isArray(e.content)&&(o+=bi(e.content));let n=t.tools?.filter(gi);return n&&n.length>0&&(o+=function(e){let t=yi.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=yi.perTool),t+=wi(n.name),n.description&&(t+=yi.perDesc+wi(n.description)),t+=ki(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),Rl.route("/v1/responses",Ol),Rl.route("/responses",Ol),Rl.onError((e,t)=>bo(t,e));const Dl=e=>`[1m${e}[0m`,jl=e=>`[2m${e}[0m`,Ml=e=>`[32m${e}[0m`,Fl=e=>`[31m${e}[0m`,Hl=e=>`[33m${e}[0m`,Ul=jl(" ─────────────────────────────────────────────────────────────");function Bl(e,t,o){console.log(` ${function(e){return"ok"===e?Ml("✓"):"warn"===e?Hl("⚠"):Fl("✗")}(e)} ${Dl(t.padEnd(14))} ${o}`)}function Ll(e){console.log(` ${jl("↳")} ${jl(e)}`)}function zl(e){return e instanceof Vt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function Gl(){let e=y.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await a.readFile(V.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 Kl(){try{await An();let e=(ne.models?.data.length??0)>0;return Bl(e?"ok":"warn","Model catalog",e?function(){let e=ne.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 Bl("fail","Model catalog",zl(e)),Ll("Could not fetch /models — check connectivity/auth."),!1}}async function Jl(e){ne.accountType=e.accountType;let t=await jt(),o=Mt();if(console.log(""),console.log(` ${Dl("COPILOT-API DOCTOR")} ${jl(`v${t}`)}`),console.log(Ul),Bl("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await X(),Sn(),!await async function(){let e=await Gl();if(!e)return Bl("fail","Auth token","not found"),void Ll("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");ne._t2=e.token,Bl("ok","Auth token",`found (${e.source})`);try{let e=await vo();return await ht(ne,e.login),Bl("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return Bl("fail","GitHub auth",zl(e)),void Ll("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(Ul),console.log(` ${Fl("✗")} ${Dl("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await ko();return ne._t1=e,Bl("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Vt?e.response.status:0;return Bl("fail","Service token",zl(e)),Ll(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 Kl();await async function(){try{let e=await ir(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${er(tr(t))} of ${er(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;Bl("ok","Copilot plan",`${e.copilot_plan} · ${o} `+jl(`(resets ${e.quota_reset_date})`))}catch(e){Bl("warn","Copilot plan",`unavailable (${zl(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await ql();return e.ok?(Bl("ok","Generation",`works via ${e.model} ${jl(`(${e.durationMs}ms)`)}`),!0):(Bl("fail","Generation",`${e.reason}${e.status?jl(` [HTTP ${e.status}]`):""}`),!1)}():Bl("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let o of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let n=y.env[o];n&&("ANTHROPIC_BASE_URL"===o&&/\/v1\/*$/.test(n)&&(t="warn",e.push(`${o}=${n} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(n)&&(t="warn",e.push(`${o}=${n} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){Bl(t,"Client config","potential base-URL issue");for(let t of e)Ll(t)}else Bl("ok","Client config","no base-URL issues detected");Ll("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(Ul),a?(console.log(` ${Ml("✓")} ${Dl("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Hl("⚠")} ${Dl("Some checks need attention")} — see the ${Fl("✗")}/${Hl("⚠")} lines above.`),console.log(""),2)}const Wl=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 Jl({accountType:e["account-type"]});y.exit(t)}});function Yl(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 Vl=!1;const Xl="copilot-api-node20",Zl=`https://registry.npmjs.org/${Xl}/latest`,Ql=e=>`[1m${e}[0m`,ec=e=>`[33m${e}[0m`;async function tc(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Zl,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function oc(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 nc,rc;async function ac(e){try{let[t,o]=await Promise.all([jt(),tc(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 ic(){if(!nc||!rc)return;let{signal:e}=rc;nc.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${Xl}@latest`,n=ec("│"),r=` ${Ql("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${Ql(o)} to update`,i=" ".repeat(54),s=ec(`╭${"─".repeat(54)}╮`),l=ec(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${oc(r,54)}${n}`,`${n}${i}${n}`,`${n}${oc(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var sc={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 lc=262144,cc="https://barazany.dev",uc=/^[a-z0-9][a-z0-9-]*$/i,pc=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function dc(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(pc," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function mc(e){if("object"!=typeof e||!e)return null;let t=e,o=dc(t.title,100),n=dc(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!==cc||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&&uc.test(t.slug)&&(r=`${cc}/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 fc(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=mc(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 hc=null;function gc(e){return s.join(e,"blog-posts.json")}function _c(e=V.APP_DIR){try{if(hc&&hc.length>0)return hc;let t=function(e){try{let t=gc(e);return z.statSync(t).size>lc?[]:fc(JSON.parse(z.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:fc(sc)}catch{return[]}}function yc(e){return e>-6e4&&e<864e5}async function wc(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>lc)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>lc?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>lc)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?[]:fc(JSON.parse(o))}finally{clearTimeout(o)}}async function bc(e={}){try{if("1"===y.env.COPILOT_API_NO_BLOG||"1"===y.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??V.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=gc(e),n=await z.promises.stat(o);if(n.size<=lc){let e=await z.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return yc(t-n.fetchedAt)}return yc(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await wc(e.timeoutMs??3e3);if(0===n.length)return;hc=n,await async function(e,t,o){let n=gc(e),r=`${n}.${y.pid}.tmp`;try{await z.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await z.promises.rename(r,n)}catch(e){throw await z.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function kc(e){let t;try{({login:t}=await vc(e))}catch(e){return void o.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await yn(),o.info("Copilot fallback enabled for Foundry rate limits (429)")}catch(e){o.error("Copilot fallback disabled: could not load the Copilot model list; serving from Foundry only.",e)}return t}async function vc(e){e._t2&&o.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let t,n=e._t2||process.env.GH_TOKEN;n?(function(e){ne._t2=e,Dn=!1}(n),o.info("Using provided Auth token")):await Kn();try{t=await vo(),await ht(ne,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 ko();ne._t1=e,o.debug("Service token fetched successfully!"),ne.showToken&&o.info("Service token:",e),qn=!0,Gn(t),ct.start(),In=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Ln(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},Rn=()=>{o.debug("Network connectivity lost")},ct.on("online",In),ct.on("offline",Rn)})(),t}function xc(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=y;if("win32"===e){try{if(_(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=o.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),r=Object.entries(e).filter(([,e])=>void 0!==e);switch(n){case"powershell":o=r.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":o=r.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":o=r.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(" ");o=r.length>0?`export ${e}`:"";break}}return o&&t?`${o}${"cmd"===n?" & ":" && "}${t}`:o||t}function Tc(e,t){return{version:t.version,port:e.port,accountType:e.accountType,verbose:e.verbose,manualApprove:e.manual,rateLimitSeconds:e.rateLimit??0,rateLimitWait:e.rateLimitWait,timeoutMs:e.timeout,showToken:e.showToken,_cc1:e._cc1,model:e.model,smallModel:e.smallModel,_t3:t._t3,provider:e.provider,fallback:e.fallback,foundryAuth:t.foundryAuth}}const $c=e=>`[1m${e}[0m`,Ac=e=>`[2m${e}[0m`,Sc=e=>`[36m${e}[0m`,Ec=e=>`[32m${e}[0m`,Oc=e=>`[33m${e}[0m`,Cc=e=>`[4m${e}[0m`,Ic=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Rc="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Nc="https://github.com/johnib/copilot-api-issues/issues",Pc=Ac(" ─────────────────────────────────────────────────────────────");function qc(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Dc(e){return e&&0!==e.length?e.join("·"):"—"}function jc(e){if(0===e.length)return[];let t=["",Pc,` ${$c("BARAZANY.DEV")} ${Ac("— Recent Posts")}`,Pc,""];for(let[o,n]of e.entries()){let e=`${n.url}${Rc}`,r=Ic(e,$c(Cc(`[${o+1}]`)));t.push(` ${r} ${Sc(n.title)}`,` ${Ac("→")} ${Ac(n.teaser)}`,"")}return t.push(Pc,` ${Ic(`https://barazany.dev/blog${Rc}`,"barazany.dev/blog")}`,Pc),t}function Mc(e){let t=[];ne.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):ne.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(Ac(" → "))} ${Ec("✓")}`:Ac("off"),n=["",` ${$c("COPILOT-API")} ${Ac(`v${e.version}`)}`,Pc,` ${Ac("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Ac("User")} ${e.user} ${Ac("·")} ${e.accountType}`];return ne._v1&&n.push(` ${Ac("Client")} VSCode ${ne._v1}`),n.push(` ${Ac("Network")} ${t.join(Ac(" · "))}`,` ${Ac("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Ac("Clipboard")} Claude Code command ${Ec("✓")}`),n.push(Pc),n}function Fc(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${$c("Active")}`];if(e.model){let o=ne.models?.data.find(t=>t.id===e.model),n=qc(o?.capabilities.limits?.max_context_window_tokens),r=Dc(o?.capabilities.supports.reasoning_effort);t.push(` ${Sc(e.model.padEnd(32))} ${Ac("ctx")} ${$c(n.padStart(5))} ${Ac("effort")} ${Ac(r)} ${Oc("← main")}`)}if(e.smallModel){let o=ne.models?.data.find(t=>t.id===e.smallModel),n=qc(o?.capabilities.limits?.max_context_window_tokens),r=Dc(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Ac("ctx")} ${n.padStart(5)} ${Ac("effort")} ${Ac(r)} ${Oc("← small")}`)}return t}function Hc(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of ne.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("",` ${$c(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Sc("●"):Ac("·"),i=n?Sc(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?qc(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Dc(r.effort)}`;t.push(` ${a} ${i} ${Ac(s)}${Ac(l)}`)}}return t}function Uc(){let e=Nc.replace(/^https:\/\//,""),t=Ic(`${Nc}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Pc,` ${$c("FOUND A BUG?")} ${Ac("— Report it on GitHub")}`,Pc,"",` ${Sc("→")} ${Sc(t)}`,` ${Ac("Bug reports, feature requests, and questions welcome.")}`,"",Pc]}function Bc(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=["",Pc,` ${$c("Claude Cowork")} ${Ac("— Settings → Inference Provider")}`,Pc,"",` ${Ac("Paste into")} ${$c("inferenceGatewayBaseUrl")}${Ac(":")}`,` ${$c(Sc(r))}`];return n||a.push("",` ${Ac("Your Tailscale hostname is shown by:")} ${Sc("tailscale status --self")}`),a.push("",` ${Ac("Docs:")} ${Sc("https://claude.com/docs/cowork/3p/installation")}`),a}function Lc(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Pc,` ${$c("HTTPS")} ${Ac("— self-signed cert")}`,Pc,"",` ${Ac("Cert")} ${t}`];switch(o.push("",` ${$c("Trust this cert")} ${Ac("(one-time setup)")}`),y.platform){case"darwin":o.push(` ${Ac("macOS:")}`,` ${Sc("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Sc(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Ac("Windows (PowerShell as Administrator):")}`,` ${Sc(`Import-Certificate -FilePath "${t}" \``)}`,` ${Sc("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Ac("Linux (Debian/Ubuntu):")}`,` ${Sc(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Sc("sudo update-ca-certificates")}`,` ${Ac("Linux (Fedora/RHEL/Arch):")}`,` ${Sc(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Sc("sudo update-ca-trust")}`);break;default:o.push(` ${Ac("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Ac("Or, for Node CLIs only (no admin needed):")}`,` ${Sc(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Pc),o}function zc(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 Gc=s.join(V.APP_DIR,"certs"),Kc=s.join(Gc,"cert.pem"),Jc=s.join(Gc,"key.pem"),Wc=s.join(Gc,"cert.meta.json");async function Yc(e){try{return await a.readFile(e,"utf8")}catch{return}}async function Vc(e){let t=await Yc(Kc),o=await Yc(Jc),n=await async function(){let e=await Yc(Wc);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 Xc(e){return 0!==J(e)}async function Zc(e){await a.mkdir(Gc,{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)Xc(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 W([{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(Kc,l.cert,{mode:420}),await a.writeFile(Jc,l.private,{mode:384}),await async function(e){await a.writeFile(Wc,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:Kc,keyPath:Jc,generated:!0}}const Qc=[],eu=Date.now();let tu="";function ou(){let e=async(e,t=0)=>{let n=xe.startSpan("copilot_api.server.shutdown",{kind:u.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-eu)/1e3}});for(let t of Qc)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Ic("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Pc,` ${$c("COPILOT-API")} ${Ac(`v${e}`)} ${Ac("·")} ${zc(t)} uptime`,Pc,""," Check in from time to time on",` ${Sc(o)}`,"",Pc,""];console.log(n.join("\n"))}(tu,Date.now()-eu),y.exit(t)};y.on("SIGINT",()=>e("SIGINT")),y.on("SIGTERM",()=>e("SIGTERM")),y.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),y.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}const nu=e=>e.filter(e=>"embeddings"!==e.capabilities.type).map(e=>e.id),ru=e=>e.filter(e=>"embeddings"!==e.capabilities.type&&(e.supported_endpoints?.includes("/responses")??!0)).map(e=>e.id);async function au(e,t,n){if(!e._cc1)return!1;ne.models||(o.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),y.exit(1));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,nu(ne.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:nu(ne.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:nu(ne.models.data)}));let s=xc({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:r,ANTHROPIC_SMALL_FAST_MODEL:a,NODE_EXTRA_CA_CERTS:n?.certPath},"claude");try{return h.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function iu(e){return e._t2?"cli_arg":y.env.GH_TOKEN?"env_var":"stored"}function su(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=xe.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:rt({config:Tc(t,{version:o,_t3:iu(t),foundryAuth:ne.foundry?.auth}),runtime:n,identity:{_u1:r.login,machineId:ne.machineId,sessionId:ne.sessionId,_v1:ne._v1},connectivity:ne.connectivity,modelsCount:ne.models?.data.length??0,startupDurationMs:Date.now()-eu},"copilot_api")});if(ne.models?.data)for(let e of ne.models.data)a.addEvent("copilot_api.model.available",rt(e,"model"));a.end(),tt(w.INFO,"INFO","Server started",rt({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:ne.models?.data.length??0,startupDurationMs:Date.now()-eu},"copilot_api"))}async function lu(e,t){try{return await async function(e){return"foundry"===e.provider?(ne.foundry=Fo(process.env),ne.connectivity.h2=!1,ne.connectivity.h2Keepalive=!1,"entra"===ne.foundry.auth&&await Io(ne.foundry),o.info(`Using Microsoft Foundry upstream: ${ne.foundry.endpoint} (${"entra"===ne.foundry.auth?"Entra ID":"API key"} auth)`),{login:("copilot"===e.fallback?await kc(e):void 0)??"foundry"}):vc(e)}(e)}catch(o){throw await async function(e,t){let o=rt({config:t,startupStage:"upstream_auth"},"copilot_api"),n=xe.startSpan("copilot_api.server.startup_failed",{kind:u.INTERNAL,attributes:o});e instanceof Vt&&(n.setAttribute("http.response.status_code",e.response.status),n.setAttribute("url.full",e.response.url)),ot(n,e),n.end(),tt(w.ERROR,"ERROR","Server startup failed",{...o,"exception.message":e instanceof Error?e.message:String(e)}),await ve()}(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:iu(e)}),o}}async function cu(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 Vc(e)){let e=await Yc(Kc),t=await Yc(Jc);if(e&&t)return{cert:e,key:t,certPath:Kc,keyPath:Jc,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Zc(e)}(e.httpsHosts)}}async function uu(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=Sr;try{G(t),G(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(ou(),Qc.push(()=>{o.debug("Cleaning up connectivity monitor"),ct.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),qn=!1,On&&=void clearInterval(On),In&&=void ct.off("online",In),Rn&&=void ct.off("offline",Rn),Cn=void 0,Nn=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),wa&&=void clearInterval(wa),ba&&=void clearInterval(ba);let e=[...ga.keys(),..._a];ga.clear(),_a.clear(),ha.clear(),ya=void 0;for(let t of e)ka(t)&&(Be.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await ve()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");ne.provider=t.provider,ne.accountType=t.accountType,ne.manualApprove=t.manual,ne.rateLimitSeconds=t.rateLimit,ne.rateLimitWait=t.rateLimitWait,ne.showToken=t.showToken,ne.timeoutMs=t.timeout,ne.connectivity.timeoutMs=t.connectTimeout,ne.webSearchProviders=t.webSearchProviders,ne.errorReporting=function(e){let t=y.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===y.env.COPILOT_H2_KEEPALIVE||"true"===y.env.COPILOT_H2_KEEPALIVE,t=e||"1"===y.env.COPILOT_H2||"true"===y.env.COPILOT_H2;ne.connectivity.h2=t,ne.connectivity.h2Keepalive=e}(),await X(),bc().catch(()=>{}),Sn();let n=await jt();tu=n;let r=Mt();!function(e,t){t&&(we=t),ye=crypto.randomUUID();let o=T({[O]:"copilot-api",[C]:e,[E]:ye}),{endpoint:n,headers:r}=ke();_e=new S({resource:o,traceExporter:new x({url:`${n}/v1/traces`,headers:r}),metricReader:new A({exporter:new v({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new $({exporter:new k({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),_e.start()}(n,eu);let a=await lu(t,n);await async function(){try{return await An({refreshFallback:!1}),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,n=e instanceof Error?e.message:"Unknown error occurred",r=void 0===t?"":` (HTTP ${t})`,a="foundry"===ne.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(()=>{An().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{An().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)}}();Qc.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),ne.connectivity.h2&&(Ta(xa(gt(ne))),ne.connectivity.h2Keepalive&&Aa()),su({options:t,version:n,runtime:r,_u1:a});let s=await cu(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await au(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(ne.models||(o.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),y.exit(1)),e.model){let t=ru(ne.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:ru(ne.models.data)});let a=xc({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return h.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,c,s);(function(e){let t=[...Mc(e),...Fc(e),...Hc(e),...Uc(),"",...jc(_c()),...Bc(e),...Lc(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 hr()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),ic(),K({fetch:Rl.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 ql({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: ${Mr(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 pu(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const du=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT, plus FOUNDRY_API_KEY or an Entra ID login such as az login). Overrides COPILOT_API_PROVIDER.'},fallback:{type:"string",description:'With --provider foundry: "copilot" re-sends a Foundry-rate-limited (429) request to GitHub Copilot and keeps that model on Copilot until Foundry\'s retry-after passes. Overrides COPILOT_API_FALLBACK.'},port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},"error-reporting":{type:"boolean",default:!0,description:"Send anonymous, sanitized error reports to the maintainer to help fix bugs (no prompts, completions, or tokens). Use --no-error-reporting or COPILOT_API_ERROR_REPORTING=0 to disable."},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"[DEPRECATED — set the TAVILY_API_KEY env var instead] Tavily API key for web search."},"web-search-provider":{type:"string",description:'Web search failover order, e.g. "exa,tavily" (first = primary, rest = fallbacks). Web search turns on when TAVILY_API_KEY and/or EXA_API_KEY are set; this flag is optional and only orders the providers you configured.'},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"},"smoke-test":{type:"boolean",default:!0,description:"After startup, run one tiny self-test generation to verify the proxy works end-to-end and print a clear PASS/FAIL. Disable with --no-smoke-test (or COPILOT_API_NO_SMOKE_TEST=1)."}},run({args:e}){let t=e["rate-limit"],n=void 0===t?void 0:pu(t,"--rate-limit"),r=e.timeout,a=void 0===r?oe:pu(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:pu(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],y.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??y.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!Vs(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${Ys.join(", ")}`);let r=n.length>0?n:Ys,a=new Set,i=n.length>0,s=[];for(let e of r){if(!Vs(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||y.env.TAVILY_API_KEY,exaApiKey:y.env.EXA_API_KEY,order:u}),d=(y.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d,f=function(e,t){let o=(e??t??"copilot").trim().toLowerCase();if("copilot"===o||"foundry"===o)return o;throw Error(`--provider must be "copilot" or "foundry", got: "${o}"`)}(e.provider,y.env.COPILOT_API_PROVIDER);return uu({provider:f,fallback:_n(e.fallback,y.env.COPILOT_API_FALLBACK,f),port:pu(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})}});Vl||(Vl=!0,o.setReporters([Yl(o.options.reporters)]));const mu=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(nc||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;rc=e,nc=ac(e).catch(()=>null)})(),mu||ic();const fu=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Yn,start:du,"check-usage":ur,debug:Ut,doctor:Wl,"cowork-setup":Dr}});await t(fu),mu||(rc?.abort(),rc=void 0,nc=void 0);export{};
|
|
2
|
+
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{AsyncLocalStorage as l}from"node:async_hooks";import{ROOT_CONTEXT as c,SpanKind as u,SpanStatusCode as p,context as d,metrics as m,trace as f}from"@opentelemetry/api";import h from"clipboardy";import{execFile as g,execSync as _}from"node:child_process";import y from"node:process";import{SeverityNumber as w,logs as b}from"@opentelemetry/api-logs";import{OTLPLogExporter as k}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as v}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as x}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as T}from"@opentelemetry/resources";import{BatchLogRecordProcessor as $}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as A}from"@opentelemetry/sdk-metrics";import{NodeSDK as S}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as E,ATTR_SERVICE_NAME as O,ATTR_SERVICE_VERSION as C}from"@opentelemetry/semantic-conventions";import{Client as I,request as R}from"undici";import{createHash as N,randomBytes as P,randomUUID as q}from"node:crypto";import{promisify as D}from"node:util";import{Hono as j}from"hono";import{cors as M}from"hono/cors";import{streamSSE as F}from"hono/streaming";import{events as H}from"fetch-event-stream";import{Tokenizer as U,models as B}from"ai-tokenizer";import*as L from"ai-tokenizer/encoding/claude";import z,{accessSync as G}from"node:fs";import{serve as K}from"srvx";import{isIP as J}from"node:net";import{generate as W}from"selfsigned";const Y=s.join(i.homedir(),".local","share","copilot-api"),V={APP_DIR:Y,GITHUB_TOKEN_PATH:s.join(Y,"github_token"),MACHINE_ID_PATH:s.join(Y,"machine_id"),SESSION_ID_PATH:s.join(Y,"session_id")};async function X(){await a.mkdir(V.APP_DIR,{recursive:!0}),await Z(V.GITHUB_TOKEN_PATH),await Z(V.SESSION_ID_PATH)}async function Z(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const Q=new l;function ee(e,t){return Q.run(e,t)}const te=()=>!0===Q.getStore()?.rerun;const oe=6e5,ne={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:oe,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 re(e){let[t="",o=""]=e.trim().split(/\s+/,2),n=o&&"undefined"!==o&&"null"!==o?/^(?:ghu|gho|ghp|ghs|ghr|github_pat)_/.exec(o)?.[0]??"opaque":"missing";return`${t.toLowerCase()} ${n}`}!function(e){let t=e.provider,o=e.models;Object.defineProperties(e,{provider:{get:()=>Q.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=Q.getStore();return e?e.models:o},set:e=>{o=e},enumerable:!0,configurable:!0}})}(ne);const ae=" │ ",ie=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()},se=(e,t)=>e.padEnd(t),le=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ce=(e,t,o)=>` --\x3e ${se(e,4)} ${se(t,21)} ${se(o,3)}`,ue=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return se(t,22)})(e.model??"—")+se(t,8)},pe=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ie(Math.max(t-o,0)):"—",r=e?ie(e.outputTokens??0):"—",a=o?ie(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},de=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${se("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ie(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},me=e=>{if(void 0===e.ttfbMs)return`e2e ${le(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${le(e.ttfbMs)} → e2e ${le(e.e2eMs)} ${t}`},fe=e=>e?ne.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,he=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}}),ge={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=>[ce(e.method,e.path,e.status),ue(e),pe(e.tokenUsage),de(e.tokenUsage,e.maxContextTokens),me({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(ae))({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:fe(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),tt(w.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:o,duration:n,upstreamTotal:r}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":n,...o?.model&&{"copilot_api.model":o.model},...o?.reasoningEffort&&{"copilot_api.reasoning_effort":o.reasoningEffort},...o?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==o?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(o.upstreamTtfbMs)},...void 0!==r&&{"copilot_api.upstream_total_ms":Math.round(r),"copilot_api.copilot_duration_ms":Math.round(r)},...he(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=n.get("requestData");o.error((e=>[ce(e.method,e.path,"429"),ue(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${le(e.e2eMs)}`].join(ae))({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=ce(e.method,e.path,e.status.toString()),o=ue(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${le(e.e2eMs)}`].join(ae)})({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(()=>ge.cleanup(),6e4);let _e,ye,we=Date.now();const be={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function ke(){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):be;return{endpoint:e.replace(/\/$/,""),headers:t}}async function ve(){if(!_e)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([_e.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}const xe=f.getTracer("copilot-api"),Te=m.getMeter("copilot-api"),$e=b.getLogger("copilot-api"),Ae=Te.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),Se=Te.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),Ee=Te.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Oe=Te.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),Ce=Te.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Ie=Te.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Re=Te.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ne=Te.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Pe=Te.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),qe=Te.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),De=Te.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),je=Te.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Me=Te.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Fe=Te.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),He=Te.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ue=Te.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Be=Te.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Le=Te.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),ze=Te.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Ge=Te.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Ke=Te.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Je=Te.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),We=Te.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Ye=Te.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Ve=Te.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Xe=Te.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Ze=Te.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Qe=Te.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),et=Te.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function tt(e,t,o,n,r){let a=f.getActiveSpan()?.spanContext()??r;$e.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function ot(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:p.ERROR,message:o??n.message}),e.recordException(n)}function nt(e,t,o){ot(e,o),t&&t!==e&&ot(t,o)}function rt(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,rt(r,e)))}return o}Te.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!ct.getConnectivityStats().isOnline)}),Te.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(ct.getConnectivityStats().consecutiveFailures)}),Te.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(ne.models?.data.length??0)}),Te.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ge.completionCallbacks.size)}),Te.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-we)/1e3)});const at=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function it(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();"authorization"===o&&e.setAttribute(`http.${t}.header.authorization.shape`,re(r)),!at.has(o)&&e.setAttribute(`http.${t}.header.${o}`,r)}}async function st(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:l}=e,c=xe.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...l}});a&&it(c,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return c.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();at.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(c,e),Me.add(1,{target:n,status_code:String(e.status)}),e.ok||c.setStatus({code:p.ERROR,message:`HTTP ${e.status}`}),{response:e,span:c}}catch(e){throw ot(c,e),c.end(),e}}async function lt(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,extraAttributes:d,dispatcher:m}=e,f=xe.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});it(f,"request",a);try{let{statusCode:e,headers:t,body:u}=await R(o,{method:r,headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!at.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Me.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:p.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:u,span:f}}catch(e){throw ot(f,e),f.end(),e}}const ct=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:ne.connectivity.probeEndpoints,fastInterval:ne.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?ne.connectivity.slowProbeInterval:ne.connectivity.fastProbeInterval)+Math.random()*ne.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=xe.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),ne.connectivity.timeoutMs);try{let n=!1;for(let e of ne.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",...ne.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Ve.record(r,{endpoint:e,result:"success"});break}Ve.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),De.add(1,{result:n?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&o.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),je.add(1,{from:"offline",to:"online"}),tt(w.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(o.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),je.add(1,{from:"online",to:"offline"}),tt(w.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,o.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?ne.connectivity.slowProbeInterval:ne.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*ne.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:ne.connectivity.jitterMaxMs>0,connectionPooling:ne.connectivity.connectionPooling,dnsCache:ne.connectivity.dnsCache}}},ut=()=>({"content-type":"application/json",accept:"application/json"}),pt="0.48.1",dt=`copilot-chat/${pt}`,mt=`GitHubCopilotChat/${pt}`,ft=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`${V.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=N("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},ht=async(e,t)=>{e.machineId||=await ft(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(V.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=q();return await a.writeFile(V.SESSION_ID_PATH,e),await a.chmod(V.SESSION_ID_PATH,384),e})()},gt=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,_t=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=q(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":dt,"User-Agent":mt,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":q(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},yt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const wt=(e,t,o)=>{let n=_t(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,a=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&yt.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},bt="https://api.github.com",kt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":dt,"user-agent":mt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),vt="https://github.com",xt="01ab8ac9400c4e429b23",Tt=["user:email"].join(" "),$t=new WeakMap;function At(e){let t=e.req.raw,o=$t.get(t);if(!o){let e=new AbortController;t.signal.aborted?e.abort(t.signal.reason):t.signal.addEventListener("abort",()=>e.abort(t.signal.reason),{once:!0}),$t.set(t,e),o=e}return o}const St=e=>At(e).signal;function Et(e){return!!At(e).signal.aborted&&(e.get("requestSpan")?.setAttribute("copilot_api.client_aborted",!0),!0)}function Ot(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 Ct=32768,It=[{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: ***"}],Rt=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Nt(e){let t=e;for(let{regex:e,mask:o}of It)t=t.replace(e,o);return t}const Pt=/[\w.%+#!$&*=?^~\x27-]+@[\w-]+(?:\.[\w-]+)+/g;function qt(e){return Nt(e).replaceAll(Pt,"<redacted-email>")}const Dt=new Map;function jt(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 Mt(e,t,o){let n=Nt(o),r=8*Ct,a=n.length>r,i=a?n.slice(0,r):n,s=N("sha256").update(n).digest("hex");if(i.length<=Ct)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=Ct)e.setAttribute(`${t}.part_${o/Ct}`,i.slice(o,o+Ct));e.setAttribute(`${t}.parts`,Math.ceil(i.length/Ct))}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 Ft(e,t){let o=function(e){if(Dt.size>=1e3&&!Dt.has(e)){let e=Dt.keys().next().value;void 0!==e&&Dt.delete(e)}let t,o=(Dt.get(e)??0)+1;return Dt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Le.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&&Mt(e,"copilot_api.incoming_request_body",n);let r=Ht(t.c.req.header());return r&&Mt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&Mt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Mt(e,"copilot_api.outgoing_headers",Ht(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Mt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function Ht(e){let t={};for(let[o,n]of Object.entries(e))Rt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Ut(){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 Bt(){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 Lt(){try{return!!(await a.stat(V.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(V.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function zt(e){let t=await async function(){let[e,t]=await Promise.all([Ut(),Lt()]);return{version:e,runtime:Bt(),paths:{APP_DIR:V.APP_DIR,GITHUB_TOKEN_PATH:V.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 Gt=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})=>zt({json:e.json})}),Kt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Jt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Wt=new Set;let Yt;function Vt(e){if(ne.errorReporting&&!(e.statusCode<500)&&!Wt.has(e.signature)){if(Wt.size>=1e3){let e=Wt.values().next().value;void 0!==e&&Wt.delete(e)}Wt.add(e.signature),async function(e){Yt??=Ut();let t=await Yt,o=Bt(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(qt(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:Ot(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(Kt,{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 Xt(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 Zt=new WeakSet;async function Qt(e,{attempt:t,maxRetries:n,operation:r}){return Xt(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&&Zt.add(e)}(e),!1)}var eo=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},to=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function oo(e,t){return setTimeout(()=>e.abort(new to(t)),t)}const no=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),ro=RegExp(`\\b(?:${[...no].join("|")})\\b`);function ao(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function io(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=ao(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function so(e){let t=e.code;return"string"==typeof t?t:void 0}function lo(e){if(void 0===e.cause)return"";let t=io(e);if(t===e)return"";let o=so(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function co(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=>no.has(e))||!(t.length>0)&&(!!o.some(e=>ro.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function uo(e){return e.req.path.startsWith("/v1/messages")}function po(e,t){if(uo(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}const mo=/maximum context length|exceeds the context window/i;function fo(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 ho(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",qt(t.message)))}function go(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=qt(e.message)),t}function _o(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=f.getActiveSpan();if(!a)return;let i=jt({endpointType:Ot(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});Ft(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function yo(e,t,o){let n=e.get("requestId"),r=ge.completionCallbacks.get(n);r&&(ge.logError(r,t,o),ge.completionCallbacks.delete(n))}async function wo(e,t){let o=f.getActiveSpan(),n=e.get("requestId"),r=ge.completionCallbacks.get(n);r&&(ge.logRateLimit(r,t.response),ge.completionCallbacks.delete(n)),Ie.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=po(a,e),s=fo(i);return o?.setStatus({code:p.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),ho(o,s),tt(w.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...go(s)}),_o({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,o)=>{bo.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const bo=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;async function ko(e,t){let o=f.getActiveSpan(),n=await t.response.text(),r=po(n,e),a=fo(r);yo(e,t.response.status,a.message??t.message),o?.setStatus({code:p.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),ho(o,a),tt(w.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...go(a)}),_o({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&Vt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:jt({endpointType:Ot(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message});let i=uo(e)?function(e){let t;try{let o=JSON.parse(e);t=o.error&&"object"==typeof o.error?o.error:o}catch{return}let o="string"==typeof t.message?t.message:"";if("context_length_exceeded"!==t.code&&"context_length_exceeded"!==t.type&&!mo.test(o))return;let n=/maximum context length is (\d+)/i.exec(o)?.[1],r=/(?:resulted in|requested) (\d+) tokens/i.exec(o)?.[1];return{type:"error",error:{type:"invalid_request_error",message:n&&r?`prompt is too long: ${r} tokens > ${n} maximum`:`prompt is too long: ${o||"context_length_exceeded"}`}}}(n):void 0;return i?e.json(i,400):e.json(r,t.response.status)}function vo(e,t){(function(e){return"object"==typeof e&&!!e&&Zt.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",ne.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function xo(e){return co(e)||function(e){return Xt(e)||e instanceof Error&&Xt(e.cause)}(e)}async function To(e,t){return Et(e)?new Response(null,{status:499}):async function(e,t){if(vo(f.getActiveSpan(),t),t instanceof eo&&429===t.response.status)return wo(e,t);if(t instanceof SyntaxError){f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),tt(w.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let o=uo(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 yo(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof eo)return ko(e,t);if(function(e){return e instanceof to||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof to}(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Upstream request timed out"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","request_timeout");let n="Upstream request timed out (gateway timeout). Increase the timeout or retry.";tt(w.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=uo(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return yo(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(xo(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?io(t):void 0,r=(n&&so(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.";tt(w.WARN,"WARN",i,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":r,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=uo(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return yo(e,503,t instanceof Error?`${t.message}${lo(t)}`:i),e.json(s,503)}(e,t);let n=f.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:p.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),tt(w.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Vt({route:e.req.path,statusCode:500,errorClass:r.name,signature:jt({endpointType:Ot(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${lo(r)}`}),yo(e,500,r.message),o.error(r);let a=uo(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}(e,t)}const $o=async()=>{let e=`${bt}/copilot_internal/v2/token`,t=ne.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await st({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:kt(ne),signal:o.signal});try{if(!t.ok)throw new eo("Failed to get Service token",t);return await t.json()}catch(e){throw ot(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function Ao(){let e=`${bt}/user`,t=ne.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await st({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${ne._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new eo("Failed to get GitHub user",t);return await t.json()}catch(e){throw ot(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}const So=3e5;let Eo,Oo,Co,Io=null,Ro=0;function No(e){Co&&clearTimeout(Co),Co=setTimeout(()=>{Do("scheduled").catch(e=>{o.warn("Foundry Entra token renewal failed; retrying:",e),No(3e4)})},e),Co.unref()}async function Po(e){let t=Oo;if(!Eo||!t?.tokenScope)throw Error("Foundry Entra auth is not initialised");let o=xe.startSpan("copilot_api.foundry.entra_token",{kind:u.INTERNAL,attributes:{"copilot_api.foundry.token.trigger":e}},"upstream_401"===e?d.active():c);try{let e=await Eo.getToken(t.tokenScope);if(!e)throw Error(`No Entra token for scope ${t.tokenScope}`);o.setAttribute("copilot_api.foundry.token.expires_in_s",Math.round((e.expiresOnTimestamp-Date.now())/1e3)),t.bearerToken=e.token,t.bearerExpiresAt=e.expiresOnTimestamp,Ro=Date.now(),No(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-So;return Math.max(t-Date.now(),3e4)}(e))}catch(e){throw ot(o,e),e}finally{o.end()}}async function qo(e,t){Oo=e,Eo=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await Po("startup")}catch(e){throw Error("Foundry Entra ID auth: could not get a token. Run `az login` (or set FOUNDRY_API_KEY for key auth). The identity needs the 'Cognitive Services OpenAI User' role (GPT) or 'Azure AI User' (Claude) on the resource.",{cause:e})}}function Do(e="upstream_401"){return Io??=Po(e).finally(()=>{Io=null}),Io}let jo=null;async function Mo(e){if("foundry"===ne.provider){if("entra"!==ne.foundry?.auth)return!1;let t=e?.outgoingHeaders?.Authorization;return async function(e=!1,t){let n=Oo?.bearerToken;if(void 0!==t&&t!==n)return!0;let r=Oo?.bearerExpiresAt,a=void 0!==r&&r-Date.now()>So;if(e&&a)return!1;if(Date.now()-Ro<3e4)return!0;try{return await Do(),!0}catch(e){return o.warn("Foundry Entra token renewal after a 401 failed:",e),!1}}(await async function(e){if(!e)return!1;let t=await e.response.clone().text().catch(()=>"");return/"code"\s*:\s*"PermissionDenied"/.test(t)}(e),t?.replace(/^Bearer /,""))}return jo||=$o().then(({token:e})=>{ne._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{jo=null}),await jo,!0}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(/\/(?:openai|_an1)(?:\/v1)?$/i,"");return`${o.origin}${r}`}const Ho=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function Uo(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 Bo(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,o]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:o||t}});return t.length>0?t:void 0}function Lo(e){let t=e.FOUNDRY_ENDPOINT,o=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");let n=function(e,t){let o=e?.trim().toLowerCase();if(!o)return t?"key":"entra";if("key"!==o&&"entra"!==o)throw Error(`FOUNDRY_AUTH must be "key" or "entra", got: "${o}"`);if("key"===o&&!t)throw Error("FOUNDRY_AUTH=key requires FOUNDRY_API_KEY");return o}(e.FOUNDRY_AUTH,o),r=Fo(t),a=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:r,anthropicEndpoint:a?Fo(a,"FOUNDRY_ANTHROPIC_ENDPOINT"):Uo(r),auth:n,..."key"===n?{apiKey:o}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:Bo(e.FOUNDRY_DEPLOYMENTS)}}const zo=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},Go=e=>({...zo(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),Ko=e=>`${e.anthropicEndpoint}/anthropic`,Jo=(e,t)=>({...zo(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),Wo=e=>"foundry"===e.provider;function Yo(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const Vo=e=>Wo(e)?(e=>`${e.endpoint}/openai/v1`)(Yo(e)):gt(e),Xo=(e,t=!1)=>Wo(e)?Go(Yo(e)):_t(e,t),Zo=e=>Wo(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const Qo=[{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}],en={context:128e3,output:16384};function tn(e){return Qo.find(({pattern:t})=>t.test(e))??en}const on=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,nn=e=>/^claude/i.test(e),rn=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function an(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 sn(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=oo(o,ne.timeoutMs);try{let{response:n,span:r}=await st({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:Go(e),signal:o.signal});try{if(!n.ok)throw new eo("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 ot(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function ln(e){return{object:"list",data:(e.deployments??await sn(e)).map(e=>function(e){let{model:t}=e;if(!on.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:{}}}:nn(t)?an(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):rn(t)?an(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:tn(t)}):an(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:tn(t)})}(e)).filter(e=>void 0!==e)}}const cn=()=>Wo(ne)&&ne.foundry?ln(ne.foundry):pn(),un=async()=>{try{return await cn()}catch(e){if(e instanceof eo&&401===e.response.status){if(!await Mo(e))throw e;return cn()}throw e}},pn=async()=>{let e=`${Vo(ne)}/models`,t=Xo(ne),o=ne.timeoutMs,n=new AbortController,r=oo(n,o);try{let{response:o,span:r}=await st({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new eo("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw ot(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const dn=[{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"}],mn="claude-haiku-4.5",fn={haiku:mn,"sonnet-4.6":"claude-sonnet-4.6","sonnet-4.5":"claude-sonnet-4.5","sonnet-4":"claude-sonnet-4","opus-4.7":"claude-opus-4.7","opus-4.6":"claude-opus-4.6","opus-4.5":"claude-opus-4.5",opus:"claude-opus-4.5"};const hn=/^claude-/i;function gn(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function _n(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of dn)if(t.pattern.test(e))return t.family;return null}(n),i=hn.test(n),s=n.replace(/-\d{8}(?::.*)?$/,""),l=r?`-${r}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let o=gn(e);for(let e of t)if(gn(e.replace(/-\d{8}(?::.*)?$/,""))===o)return e}return a?function(e,t,o=null){let n=fn[e];if(!n)return null;if(o){let e=`${n}-${o}`;if(t.includes(e))return e}if(t.includes(n))return n;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let n=o?`${e}-${o}`:e;if(t.includes(n))return n}return null}(a,t,r):null}const yn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function wn(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=yn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=yn.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}let bn;const kn=new Map;function vn(e,t,o){let n=(e??t??"").trim().toLowerCase();if(""!==n&&"none"!==n){if("copilot"!==n)throw Error(`--fallback must be "copilot", got: "${n}"`);if("foundry"!==o)throw Error("--fallback copilot requires --provider foundry");return n}}async function xn(){bn=await ee({provider:"copilot"},un)}const Tn=()=>void 0!==bn;function $n(e,t,o=Date.now()){let n=function(e,t=Date.now()){let o=e.get("retry-after-ms");if(null!==o&&Number.isFinite(Number(o))&&Number(o)>=0)return Number(o);let n=e.get("retry-after");if(null!==n){let e=Number(n);if(""!==n.trim()&&Number.isFinite(e)&&e>=0)return 1e3*e;let o=Date.parse(n);if(!Number.isNaN(o))return Math.max(0,o-t)}return 1e4}(t,o);return kn.set(e,Math.max(kn.get(e)??0,o+n)),n}function An(e){if(!Tn()||!Wo(ne)||!e.ok)return;let{headers:t}=e;return t.has("retry-after")||t.has("retry-after-ms")?Response.json({error:{message:"Foundry rate-limited this request (HTTP 200 stream with retry-after).",type:"too_many_requests",code:"rate_limit_exceeded"}},{status:429,headers:t}):void 0}function Sn(e,t,o){let{model:n,reason:r}=o,a=f.getActiveSpan();return a?.setAttribute("copilot_api.fallback.upstream","copilot"),a?.setAttribute("copilot_api.fallback.reason",r),a?.setAttribute("copilot_api.fallback.foundry_model",n),ee({provider:"copilot",models:bn,rerun:"foundry_429"===r},()=>t(e))}async function En(e,t){if(!Tn()||!Wo(ne))return t(e);let n=await async function(e){try{let t=await e.req.json();return"string"==typeof t.model?t.model:void 0}catch{return}}(e);if(!n||!function(e){let t=bn?.data.map(e=>e.id)??[];return t.includes(e)?e:_n(e,t)??void 0}(n))return t(e);if(function(e,t=Date.now()){let o=kn.get(e);return void 0!==o&&(t<o||(kn.delete(e),!1))}(n))return Sn(e,t,{model:n,reason:"breaker_open"});try{return await t(e)}catch(r){if(!(e=>e instanceof eo&&429===e.response.status&&void 0!==e.outgoingBody)(r))throw r;let a=$n(n,r.response.headers);if(await(r.response.body?.cancel()),f.getActiveSpan()?.setAttribute("copilot_api.fallback.retry_after_ms",a),o.info(`Foundry rate-limited ${n}; serving it from Copilot for ${Math.ceil(a/1e3)}s`),Et(e))throw r;return Sn(e,t,{model:n,reason:"foundry_429"})}}const On=e=>new Promise(t=>{setTimeout(t,e)}),Cn=e=>null==e;async function In({refreshFallback:e=!0}={}){let t=await un();ne.models=t,e&&Tn()&&await xn().catch(e=>{o.warn("Failed to refresh the Copilot fallback models:",e)})}const Rn=()=>{ne._v1="1.140.0-insider"};var Nn=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Pn,qn,Dn,jn,Mn,Fn=!1,Hn=!1,Un=!1;function Bn(){return Ln()?Mn:void 0}function Ln(){return void 0!==Mn&&Date.now()-Mn.at<6e4}function zn(){return Un?"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 Gn=()=>a.readFile(V.GITHUB_TOKEN_PATH,"utf8");function Kn(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";ne._t1=void 0,Mn={status:s,message:l,at:Date.now()},clearInterval(Pn),Pn=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Pe.add(1,{reason:r,success:"false"}),qe.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:p.ERROR,message:n.message}),t.recordException(n),Ye.record(performance.now()-a,{reason:r}),tt(w.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":i,"copilot_api.token_refresh.terminal_status":s})}function Jn(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;ne._t1=void 0,o.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=n instanceof Error?n:Error(String(n));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:p.ERROR,message:s.message}),t.recordException(s),qe.add(1,{reason:r}),Ye.record(performance.now()-a,{reason:r}),tt(w.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Wn=async(e=5,t=1e3,n="scheduled")=>Fn?(o.debug("Token refresh already in progress, coalescing"),qn):(Fn=!0,qn=xe.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 $o();return ne._t1=t,Mn=void 0,Hn&&void 0===Pn&&(o.info("Token refresh recovered, resuming scheduled refresh"),Vn(s)),o.debug("Service token refreshed successfully"),ne.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Pe.add(1,{reason:n,success:"true"}),Ye.record(performance.now()-a,{reason:n}),void tt(w.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof eo&&(401===s.response.status||403===s.response.status))return void Kn({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),Pe.add(1,{reason:n,success:"false"}),l)return void Jn({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(),Fn=!1,qn=void 0}}),qn);async function Yn(){return!!ne._t1||!Ln()&&(void 0!==Mn&&Un&&await async function(){if(qn)return;let e=(await Gn().catch(()=>{}))?.trim();e&&e!==ne._t2?.trim()&&(ne._t2=e,o.info("Picked up re-authenticated Auth token from disk"),ne.showToken&&o.info("Auth token:",e))}(),await Wn(3,250,"on-demand"),!!ne._t1)}function Vn(e){Pn&&clearInterval(Pn);let t=Math.max(1e3*(e-60),6e4);Pn=setInterval(()=>{Wn(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Xn(e){try{let t=await Gn();if(t&&!e?.force)return ne._t2=t,Un=!0,ne.showToken&&o.info("Auth token:",t),void await Zn();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=ne.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${vt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:xt,scope:Tt}),signal:e.signal});if(!t.ok)throw new eo("Failed to get device code",t);return await t.json()}finally{clearTimeout(o)}}();o.debug("Device code response:",n),o.info(`Please enter the code "${n.user_code}" at ${n.verification_uri}`);try{h.writeSync(n.user_code),o.success("Code copied to clipboard — opening browser...")}catch{o.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,o=y.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",g(t,[e],()=>{})}catch{}}(n.verification_uri);let r=await async function(e){let t=1e3*(e.interval+1);o.debug(`Polling access token with interval of ${t}ms`),o.start("Waiting for authorization...");let n=Date.now(),r=1e3*e.expires_in;for(;;){if(Date.now()-n>=r)throw new Nn("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=ne.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${vt}/login/oauth/access_token`,{method:"POST",headers:ut(),body:JSON.stringify({client_id:xt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await On(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 Nn("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Nn("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 On(t);continue}if(r.access_token)return r.access_token;await On(t)}catch(e){if(e instanceof Nn)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await On(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(V.GITHUB_TOKEN_PATH,e,{mode:384}))(r),ne._t2=r,Un=!0,ne.showToken&&o.info("Auth token:",r),await Zn()}catch(e){throw e instanceof eo?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Zn(){let e=await Ao();o.success(`Authenticated as ${e.login}`)}async function Qn(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),ne.showToken=e.showToken,await X(),await Xn({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 er=e({meta:{name:"auth",description:"Run authentication flow"},args:{verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"show-token":{type:"boolean",default:!1,description:"Show token on auth"}},run:({args:e})=>Qn({verbose:e.verbose,showToken:e["show-token"]})}),tr=.01,or=864e5,nr=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),rr=new Intl.NumberFormat("en-US"),ar=e=>nr.format(e*tr),ir=e=>e.credits_used??e.entitlement-e.remaining,sr=(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())/or;if(r<.5)return;let a=ir(e),i=a*tr/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*tr,c=new Date(n.getTime()+l/i*or);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},lr=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${rr.format(ir(e))} of ${rr.format(e.entitlement)} used`:"n/a",cr=e=>e.padEnd(14),ur=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${cr("AI credits")}unlimited`);else{let e=ir(o),t=o.percent_remaining;n.push(`${cr("AI credits")}${ar(e)} / ${ar(o.entitlement)} ${t.toFixed(1)}% left`,`${cr("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${cr("")}${rr.format(e)} of ${rr.format(o.entitlement)} credits`)}if(n.push("",`${cr("Chat")}${lr(e.quota_snapshots.chat)}`,`${cr("Completions")}${lr(e.quota_snapshots.completions)}`,"",`${cr("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/or)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=sr(o,e.quota_reset_date,t);r&&n.push(`${cr("Burn rate")}~${nr.format(r.usdPerDay)}/day${(e=>e.exhausted?" — allowance already exhausted":e.exhaustsOn?` — on track to exhaust ${(e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}))(e.exhaustsOn)}`:" — within allowance")(r)}`);let a=o.overage_permitted?"permitted, "+(o.overage_count>0?`${rr.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${cr("Overage")}${a}`)}return n.join("\n")},pr=async()=>{let e=`${bt}/copilot_internal/user`,t=ne.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await st({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:kt(ne),signal:o.signal});try{if(!t.ok)throw new eo("Failed to get usage",t);return await t.json()}catch(e){throw ot(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},dr=()=>y.stdout.write("[2J[H"),mr=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,fr=async()=>{let e=await pr();return ur(e)},hr=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 X(),await Xn(),!e.watch){try{o.box(await fr())}catch(e){o.error("Failed to fetch usage:",e),y.exit(1)}y.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?o.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&o.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),n=y.stdout.isTTY,r=()=>y.exit(0);for(y.on("SIGINT",r),y.on("SIGTERM",r);;){try{let e=await fr();n&&dr(),o.box(e),o.log(mr(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),gr=D(g);async function _r(){let e="win32"===y.platform?"where.exe":"which";try{return await gr(e,["tailscale"]),!0}catch{return!1}}async function yr(){try{let{stdout:e}=await gr("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function wr(e){return e.replace(/\.$/,"")}async function br(){let e=await yr();if(e?.Online)return wr(e.DNSName)}const kr=D(g),vr=e=>`[1m${e}[0m`,xr=e=>`[2m${e}[0m`,Tr=e=>`[36m${e}[0m`,$r=e=>`[32m${e}[0m`,Ar=e=>`[31m${e}[0m`,Sr=e=>`[33m${e}[0m`,Er=xr(" ─────────────────────────────────────────────────────────────"),Or=s.join(V.APP_DIR,"certs","tailscale"),Cr=s.join(Or,"cert.pem"),Ir=s.join(Or,"key.pem"),Rr={certDir:Or,certPath:Cr,keyPath:Ir};function Nr(){switch(y.platform){case"darwin":return[` ${xr("Install Tailscale for macOS:")}`,` ${Tr("https://tailscale.com/download/mac")}`,` ${xr("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${xr("After installing, open the Tailscale app and sign in.")}`,` ${xr("Then re-run this command.")}`].join("\n");case"linux":return[` ${xr("Install Tailscale for Linux:")}`,` ${Tr("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Tr("sudo tailscale up")}`,` ${xr("or")} ${Tr("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${xr("Install Tailscale for Windows:")}`,` ${Tr("https://tailscale.com/download/windows")}`,"",` ${xr("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${xr("Install Tailscale:")} ${Tr("https://tailscale.com/download")}`}}function Pr(){let e=[` ${Ar("Tailscale is not running.")}`];return"darwin"===y.platform?e.push(` ${xr("Open the Tailscale app from Applications and sign in.")}`,` ${xr("Download:")} ${Tr("https://tailscale.com/download/mac")}`):"win32"===y.platform?e.push(` ${xr("Open the Tailscale app and sign in.")}`,` ${xr("Download:")} ${Tr("https://tailscale.com/download/windows")}`):e.push(` ${xr("Connect with:")} ${Tr("sudo tailscale up")}`),e.push("",` ${xr("Then re-run this command.")}`),e.join("\n")}async function qr(){try{return await a.access(Cr),await a.access(Ir),!0}catch{return!1}}function Dr(e){console.log(""),console.log(Er),console.log(` ${vr("Claude Cowork Setup")} ${xr("— Diagnostic")}`),console.log(Er),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?$r("✅"):"missing"===n.status?Ar("❌"):Sr("❓");let r=n.detail?xr(` ${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(` ${$r("All checks passed.")}`):console.log(` ${Ar(`${t.length} issue(s).`)} Run ${Tr("copilot-api cowork-setup install")} to fix.`),console.log("")}const jr={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},Mr=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await _r();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return Dr(e),console.log(""),console.log(Nr()),void console.log("");let o=await yr();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},Dr(e),console.log(Pr()),void console.log("");let n=wr(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await qr();e["tailscale-cert"]=r?{status:"ok",detail:Cr}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),Dr(e)}(),y.exit(0)}}),Fr=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:jr},async run({args:e}){await async function(e){if(console.log(""),console.log(Er),console.log(` ${vr("Claude Cowork Setup")} ${xr("— Install")}`),console.log(Er),console.log(""),!await _r())return console.log(` ${Ar("Tailscale is not installed.")}`),console.log(""),console.log(Nr()),console.log(""),console.log(` ${xr("After installing, run")} ${Tr("tailscale up")} ${xr("to connect, then re-run this command.")}`),void console.log("");let t=await yr();if(!t||!t.Online)return console.log(Pr()),void console.log("");let n=wr(t.DNSName);if(console.log(` ${xr("Tailscale hostname:")} ${vr(n)}`),console.log(""),console.log(` ${vr("Generating TLS certificate via Tailscale…")}`),console.log(` ${xr("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Tr(`$ tailscale cert --cert-file ${Cr} --key-file ${Ir} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(Or,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await kr("tailscale",["cert","--cert-file",Cr,"--key-file",Ir,n]),console.log(` ${$r("✓ 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(Er),console.log(` ${vr("Next steps")}`),console.log(Er),console.log(""),console.log(` ${vr("1.")} Start the proxy:`),console.log(` ${Tr("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${vr("2.")} In Cowork ${xr("→")} Settings ${xr("→")} Inference Provider, set:`),console.log(` ${vr("inferenceGatewayBaseUrl")} = ${Tr(`https://${n}:<port>`)}`),console.log(` ${xr("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${vr("3.")} Restart Cowork ${xr("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${xr("For Cowork's own configuration docs, see:")}`),console.log(` ${Tr("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),Hr=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:jr},async run({args:e}){await async function(e){if(console.log(""),console.log(Er),console.log(` ${vr("Claude Cowork Setup")} ${xr("— Revert")}`),console.log(Er),console.log(""),!await qr())return console.log(` ${xr("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${vr("Remove Tailscale cert files:")}`),console.log(` ${xr(Cr)}`),console.log(` ${xr(Ir)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(Or,{recursive:!0}),console.log(` ${$r("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${xr("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),Ur=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:Mr,install:Fr,revert:Hr}}),Br=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function Lr(e){if(!Br.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 zr(e){return"string"==typeof e?Lr(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=zr(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?zr(a):a;!t&&(i!==a||"__proto__"===r)&&(t=Gr({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=Gr({},o,o.length),t.properties={}),t??e}(e):e}function Gr(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const Kr="x-copilot-api-self-test",Jr=q();const Wr=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Yr(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 Vr(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();at.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:p.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(Ae.add(1,d),ze.record(s,d),c>=400&&Se.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&&(Ee.add(e.inputTokens,t),Xe.record(e.inputTokens,t)),e.outputTokens&&(Oe.add(e.outputTokens,t),Ze.record(e.outputTokens,t)),e.cachedTokens&&Ce.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ge.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const Xr=1048576;const Zr=async()=>{if(!te())return xe.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),et.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),He.add(1,{result:"rejected"}),new eo("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),He.add(1,{result:"approved"})}finally{e.end()}})};async function Qr(e){if(Zo(ne)||await Yn())return null;let t=Bn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${zn()}`,type:"authentication_error"}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function ea(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 ta(e,t){e.setAttributes(function(e){let t={};void 0!==e.prompt_tokens&&(t["copilot_api.input_tokens"]=e.prompt_tokens),void 0!==e.completion_tokens&&(t["copilot_api.output_tokens"]=e.completion_tokens),void 0!==e.total_tokens&&(t["copilot_api.total_tokens"]=e.total_tokens);let o=e.prompt_tokens_details?.cached_tokens;return void 0!==o&&(t["copilot_api.cached_tokens"]=o),t}(t))}var oa=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function na(e){if(!e||"string"!=typeof e)throw new oa("Model name is required and must be a string");if("foundry"===ne.provider)return e;if(!ne.models?.data)throw new oa("Models not available. Please try again later.",503);let t=ne.models.data.map(e=>e.id);if(t.includes(e))return e;let o=_n(e,t);if(!o)throw Re.add(1,{requested_model:e}),new oa(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function ra(e){let t=ne.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===ne.provider?rn(e):/gpt-[\d.]+-codex/i.test(e)}async function aa(e){if(void 0===e.rateLimitSeconds||te())return;let t=e.rateLimitSeconds;return xe.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"),Ie.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new eo("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Ie.add(1,{action:"waited",source:"local"}),Je.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await On(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var ia=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function sa(e){if(e instanceof ia)return{type:e.type,message:e.message};if(e instanceof eo){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 la(e,t){let{type:n,message:r}=sa(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 ca(e,t){let{type:n,message:r}=sa(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 ua(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 pa(e,t,o){return Math.min(Math.max(e,t),o)}function da(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 da(JSON.parse(r),t+1)}catch{return null}}function ma(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=ua(o.capabilities.supports.min_thinking_budget),r=ua(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:ua(o.capabilities.limits?.max_output_tokens)??void 0}}function fa(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=pa(ua(e.requestedBudget)??o,o,n),a=ua(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 ha(e,t){if(Cn(e.thinking_budget))return e;let o=ma(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=fa({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 ga(e){return"invalid_thinking_budget"===da(e)}async function _a(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(Cn(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(!ga(i))return null;let l=ma(n,t.model);return l?function(e,t){let o=fa({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=ua(e.thinking_budget);if(r&&r===o.thinkingBudget){let e=n+1;e<=t.bounds.max&&(!o.maxTokens||e<o.maxTokens)&&(n=e)}let a=o.maxTokens;if((!a||a<=n)&&(a=n+1),t.maxOutputTokens&&a>t.maxOutputTokens){if(!(t.maxOutputTokens>n))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};a=t.maxOutputTokens}return{...e,max_tokens:a,thinking_budget:n}}(t,l):{...t,thinking_budget:void 0}}function ya(e,t){let o=!1;return()=>{if(o)return;o=!0;let n=e.get("requestData")||{};n.upstreamTtfbMs=performance.now()-t,e.set("requestData",n)}}function wa(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const ba=new Map,ka=new Map,va=new Set;let xa,Ta,$a;function Aa(e){return!e.closed&&!e.destroyed}function Sa(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new I(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return ba.set(t,Date.now()),Be.add(1,{event:"created",origin:e}),tt(w.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{o.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{o.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(n,r,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=va.has(t);Be.add(1,{event:"goaway",origin:e}),tt(i?w.WARN:w.DEBUG,i?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),ka.delete(t),va.delete(t),ba.delete(t),Aa(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Ea(e,t){if(!ne.connectivity.h2)return;if(xa&&xa!==e&&function(){for(let e of[...ka.keys(),...va])Aa(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});ka.clear(),va.clear(),ba.clear()}(),xa=e,t?.fresh){let t=Sa(e);return va.add(t),t}let n=Date.now();for(let[t]of ka)if(n-(ba.get(t)??0)>=6e5)ka.delete(t),ba.delete(t),Aa(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Be.add(1,{event:"rotated",origin:e}),tt(w.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Aa(t))return ka.delete(t),va.add(t),t;ka.delete(t),ba.delete(t)}let r=Sa(e);return va.add(r),r}function Oa(e){e&&va.delete(e)&&(Aa(e)?ka.set(e,Date.now()):ba.delete(e))}function Ca(){$a||($a=setInterval(()=>{!function(){let e=Date.now(),t=ne.connectivity.h2Keepalive,n=ka.size;for(let[r,a]of ka)e-a<6e4||t&&n<=1||(ka.delete(r),ba.delete(r),n--,Aa(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Be.add(1,{event:"idle_reaped",origin:xa??""}),tt(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${xa}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":xa??""}))}()},3e4),$a.unref())}function Ia(){Ta||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Ta=setInterval(()=>{(async function(){if(0===ka.size&&0===va.size){if(xa){let e=Sa(xa);ka.set(e,Date.now())}return}let e=[...ka.keys()];for(let t of e)ka.delete(t);await Promise.allSettled(e.map(async e=>{if(Aa(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:_t(ne)});await n.dump(),Ue.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),ka.set(e,Date.now())}catch(t){Ue.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Be.add(1,{event:"error",origin:xa??""}),ba.delete(e),Aa(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else ba.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Ta.unref(),Ca())}function Ra(e){return e.max_completion_tokens??e.max_tokens}async function Na(e,t,o){try{if(!e.ok)throw new eo("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&&ta(t,n.usage),n}catch(e){throw ot(t,e),e}finally{t.end()}}const Pa=e=>Wo(ne)?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=Ra(e);return null==i?a:{...a,max_completion_tokens:i}}(e,ne.models),qa=e=>Wo(ne)?e:zr(e),Da=async e=>{let t=qa(e);try{return await ja(t)}catch(e){if(e instanceof eo&&401===e.response.status){if(!await Mo(e))throw e;return ja(t)}let n;if(e instanceof eo)try{n=await e.response.clone().text()}catch{n=void 0}let r=await _a({payload:t,error:e,models:ne.models,errorBodyText:n});if(r)return e instanceof eo&&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 ja(qa(r));throw e}},ja=async e=>{if(!Zo(ne))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={...Xo(ne,t),"X-Initiator":o?"agent":"user"},r=Vo(ne),a=`${r}/chat/completions`,i=ne.timeoutMs,s=Pa(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":Ra(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user","copilot_api.upstream.provider":ne.provider};for(let t=0;t<=1;t++){let o=Ea(r,{fresh:t>0}),s=new AbortController,u=oo(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await lt({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 eo("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:H(m),span:d,release:()=>Oa(o)}}try{return await Na(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{Oa(o)}}catch(e){if(Oa(o),await Qt(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Ma=new Map;const Fa=["none","minimal","low","medium","high","xhigh","max"];function Ha(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=Fa.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=Fa.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 Ua(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:[];Ma.set(e.model,r);let a=Ha(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 Ba(e,t,o){try{if(!e.ok)throw new eo("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&&ta(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 ot(t,e),e}finally{t.end()}}const La=async(e,t)=>{let o=Wo(ne),n=o?function(e){let t=Ma.get(e.model);return t?Ha(e,t):e}(e):e,r=!1,a=!1;for(;;)try{return t?.onAttempt?.(n),await Ga(n,t?.signal)}catch(e){if(!(e instanceof eo))throw e;if(401===e.response.status&&!r){if(r=!0,!await Mo(e))throw e;continue}if(o&&400===e.response.status&&!a){a=!0;let t=Ua(n,await e.response.clone().text().catch(()=>{}));if(t){n=t;continue}}throw e}};function za(e,t){let o,n=()=>{o?.destroy(e?.reason),t.abort(e?.reason)};return e?.aborted?n():e?.addEventListener("abort",n,{once:!0}),{attach:e=>o=e,dispose:()=>e?.removeEventListener("abort",n)}}const Ga=async(e,t)=>{if(!Zo(ne))throw Error("Service token not found");let o=Wo(ne)?e:zr(e),n={...Xo(ne),"X-Initiator":"agent"},r=Vo(ne),a=`${r}/responses`,i=ne.timeoutMs,s=JSON.stringify(o),l=((e,t)=>({"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":t,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.max_output_tokens":e.max_output_tokens??0,"copilot_api.api_type":"responses","copilot_api.upstream.provider":ne.provider}))(o,i);for(let e=0;e<=1;e++){let c=Ea(r,{fresh:e>0}),u=new AbortController,d=oo(u,i),m=za(t,u);try{let{statusCode:t,headers:r,body:d,span:f}=await lt({spanName:"copilot POST /responses",url:a,target:"responses",headers:n,body:s,signal:u.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:c});m.attach(d);let h=new Response(d,{status:t,headers:r});if(o.stream){let e=An(h);if(e&&(f.setAttribute("copilot_api.foundry.throttled_stream",!0),f.setAttribute("copilot_api.upstream.effective_status",429),f.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(h.body?.cancel())),!h.ok||e)throw f.end(),new eo("Failed to create responses",e??h,{outgoingBody:s,outgoingHeaders:n});return{events:H(h),span:f,release:()=>{m.dispose(),Oa(c)}}}try{return await Ba(h,f,{outgoingBody:s,outgoingHeaders:n})}finally{m.dispose(),Oa(c)}}catch(t){if(m.dispose(),Oa(c),await Qt(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Ka=e=>Object.hasOwn(e,"output");function Ja(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens,...t.input_tokens_details&&{prompt_tokens_details:{cached_tokens:t.input_tokens_details.cached_tokens}},...t.output_tokens_details&&{completion_tokens_details:{reasoning_tokens:t.output_tokens_details.reasoning_tokens}}}:null}var Wa=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const Ya=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 Va(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Wa(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Wa(`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=>Za(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=Qa(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Za(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:Za(o.content)})}return t}(e.messages);if(0===o.length)throw new Wa("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),Xa(e.temperature)&&(n.temperature=e.temperature),Xa(e.top_p)&&(n.top_p=e.top_p),Xa(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),Xa(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 Xa(e){return null!=e}function Za(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Qa(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 Wa(`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 ei(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 ti(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 oi(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 ni(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function ri(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=ni(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[oi(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),[oi(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function ai(e,t){let o=[oi(e,{},ti(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=ei(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function ii(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:[oi(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:ri(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=ni(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[oi(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:ai(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 si="openai_responses";function li(e){let t=performance.now(),n=xe.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),Va(e)}finally{t.end()}});We.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!Ya.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 ci(e){let t=performance.now(),o=xe.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:ti(e,n.length>0)}]};return e.usage&&(r.usage=ei(e.usage)),r}(e)}finally{t.end()}});return We.record(performance.now()-t,{direction:"responses_to_openai"}),o}function ui(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=ei(t.usage);a.tokenUsage=ea(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(ci(t))}async function pi(e,t,n){let r;try{r=li(t)}catch(t){if(t instanceof Wa)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),ne.manualApprove&&!n.isSelfTest&&await Zr();let a=await Qr(e);if(a)return a;let i=performance.now(),s=await La(r),l=performance.now()-i;if(Ge.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Ka(s))return ui(e,s,l);let{events:c,span:u,release:p}=s,d=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return F(e,async t=>{let n=null,a=0,s=performance.now(),m=ya(e,i);try{try{for await(let i of c){if(m(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Fe.add(1,{model:r.model,endpoint_type:si});let c=Ja(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=ea(c),t._d1=l,e.set("requestData",t)}let u=ii(s,d);if(u.error)throw new ia(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:si};Ke.record(performance.now()-s,u),Qe.record(a,u),wa(e,i)}catch(o){throw nt(u,e.get("requestSpan"),o),await ca(t,o),o}finally{n&&ta(u,n),u.end(),p()}let f=e.get("requestId");f&&ge.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function di(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 mi(e){let t=!0===e.get("isSelfTest");t||await aa(ne);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return xe.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=na(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),Ne.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 oa)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(ra(n.model))return pi(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),ne.manualApprove&&!t&&await Zr(),"foundry"!==ne.provider&&(n=function(e){if(!Cn(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!Cn(e.max_tokens))return e;let t=(ne.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=ha(n,ne.models)),Cn(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Qr(e);if(r)return r;let a=performance.now(),i=await Da(n),s=performance.now()-a;if(Ge.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),fi(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=ea(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 F(e,async t=>{let o={value:null},r=0,i=performance.now(),p=ya(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Fe.add(1,{model:n.model,endpoint_type:"openai"}),i=di(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=ea(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(Ke.record(c,u),Qe.record(r,u),wa(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=ea(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw nt(c,e.get("requestSpan"),o),await ca(t,o),o}finally{o.value&&ta(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ge.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const fi=e=>Object.hasOwn(e,"choices"),hi=new j;hi.post("/",async e=>{try{return await mi(e)}catch(t){return await To(e,t)}});const gi=async e=>{if(!Zo(ne))throw Error("Service token not found");let t=`${Vo(ne)}/embeddings`,o=Xo(ne),n=ne.timeoutMs,r=new AbortController,a=oo(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await st({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1,"copilot_api.upstream.provider":ne.provider}});try{if(!n.ok)throw new eo("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw ot(a,e),e}finally{a.end()}}finally{clearTimeout(a)}},_i=new j;_i.post("/",async e=>{try{let t=await e.req.json();try{t.model=na(t.model)}catch(t){if(t instanceof oa)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=await Qr(e);if(o)return o;let n=performance.now(),r=await(async e=>{try{return await gi(e)}catch(t){if(t instanceof eo&&401===t.response.status){if(!await Mo(t))throw t;return gi(e)}throw t}})(t),a=performance.now()-n;Ge.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=ea(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await To(e,t)}});const yi=new j;let wi=null,bi=null;function ki(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function vi(e){return!ki(e)}yi.get("/",async e=>{let t,o=function(){if(Wo(ne)){if(!Zo(ne))return"missing";let e=ne.foundry?.bearerExpiresAt;return void 0!==e&&e<=Date.now()?"expired":"valid"}let e=ne._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=wi;return t&&e-t.timestamp<3e4?{result:t.result}:bi||(bi=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${Vo(ne)}/models`,n=await fetch(t,{method:"GET",headers:Xo(ne),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return wi={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return wi={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),bi=null}})(),bi)}();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.13",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 xi=new U(L);let Ti;const $i={...B["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Ai(e,t){try{return e.encode(t,[],[]).length}catch(e){return o.debug("count_tokens: tokenizer failed, using length/4",e),Math.ceil(t.length/4)}}function Si(e,t){let o=0;for(let n of e)switch(n.type){case"text":o+=t(n.text)*$i.contentMultiplier;break;case"tool_use":o+=t(n.name+JSON.stringify(n.input))*$i.contentMultiplier;break;case"tool_result":n.content&&(o+=t("string"==typeof n.content?n.content:JSON.stringify(n.content))*$i.contentMultiplier);break;case"thinking":o+=t(n.thinking)*$i.contentMultiplier;break;case"image":o+=1600}return o}function Ei(e,t){let o=0,n=e.properties;if(!n)return o;let r=Object.entries(n);for(let[e,[n,a]]of r.entries()){if(o+=0===e?$i.perFirstProp:$i.perAdditionalProp,o+=t(n),a.description&&(o+=$i.perPropDesc+t(a.description)),a.enum&&Array.isArray(a.enum)){o+=$i.perEnum;for(let e of a.enum)o+=t(String(e))}if("object"===a.type&&a.properties&&(o+=$i.perNestedObject,o+=Ei(a,t)),"array"===a.type&&a.items){let e=a.items;"object"===e.type&&e.properties&&(o+=$i.perArrayOfObjects,o+=Ei(e,t))}}return o}function Oi(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")},n=e.thinking;if(n&&"object"==typeof n){let{type:e,budget_tokens:t}=n;"string"==typeof e&&(o["copilot_api.thinking.type"]=e),"number"==typeof t&&t&&(o["copilot_api.thinking.budget_tokens"]=t)}let r=e.output_config?.effort;return"string"==typeof r&&r&&(o["copilot_api.output_config.effort"]=r),o}function Ci(e,t,o){let n=Oi(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Ii=async(e,t,n)=>{try{return await Ri(e,t)}catch(r){if(r instanceof eo&&401===r.response.status){if(!await Mo(r))throw r;return Ri(e,t)}if(r instanceof eo&&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}`),Ri(i,t)}throw r}};const Ri=async(e,t)=>{if(!Zo(ne))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=Wo(ne)&&ne.foundry?{baseUrl:Ko(ne.foundry),headers:Jo(ne.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={...wt(ne,t,r),"X-Initiator":"agent"};return{baseUrl:gt(ne),headers:a,cleanPayload:n}}(zr(e),t),a=`${o}/v1/messages`,i=ne.timeoutMs,s=JSON.stringify(r),l=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough","copilot_api.upstream.provider":ne.provider,...Oi(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){let t=Ea(o,{fresh:e>0}),c=new AbortController,u=oo(c,i);try{let{statusCode:o,headers:u,body:p,span:d}=await lt({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 eo("Failed to create anthropic messages",m,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:H(m),span:d,release:()=>Oa(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&&ta(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(),Oa(t)}}catch(o){if(Oa(t),await Qt(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Ni=new Set(["low","medium","high","max","xhigh"]),Pi=(e,t)=>!(!e||!t||e===t);function qi(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!Ni.has(t))return e;let n=ne.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=wn(t,n);if(!r||!Ni.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=f.getActiveSpan();return i?.setAttribute("copilot_api.effort.requested",t),i?.setAttribute("copilot_api.effort.clamped_to",a),{...e,output_config:{...e.output_config,effort:a}}}function Di(e,t,n){if("foundry"===ne.provider)return qi(e);let r=t.includes(e.model)?e.model:_n(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=_n(e,t);return n&&o.context1m?function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,new Set(t)):null}(a.model,t,{context1m:n.context1m}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=f.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",a.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),s={...a,model:i}}return qi(s)}const ji=e=>"object"==typeof e&&!!e&&!Array.isArray(e),Mi=["properties","patternProperties","$defs","definitions"],Fi=["items","additionalProperties","propertyNames","contains","not","if","then","else"],Hi=["anyOf","allOf","oneOf","prefixItems"];const Ui=()=>["string","number","boolean"].map(e=>({type:e})),Bi=()=>({anyOf:[...Ui(),{type:"array",items:{anyOf:Ui()}},{type:"object"}]}),Li=e=>!0===e||ji(e)&&0===Object.keys(e).length,zi=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function Gi(e,t){let o={...e};for(let e of Mi){let n=o[e];ji(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,ji(o)?Gi(o,t):o])))}for(let e of Fi){let n=o[e];ji(n)&&(o[e]=Gi(n,t))}for(let e of Hi){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>ji(e)?Gi(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(ji(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>Li(e)?Bi().anyOf:ji(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)),zi(o)&&(!("items"in o)||Li(o.items))&&(t.add("items"),o.items=Bi()),Li(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function Ki(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=Wi(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function Ji(e){return Yi(Wi(e))}function Wi(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 Yi(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function Vi(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>Yi(e)).filter(Boolean).join("\n\n")}const Xi=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),Zi=new Set(["text","image"]);function Qi(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);Zi.has(e)||t.add(`block:tool_result:${e}`)}}const es=new Set;function ts(e,t){e.setAttribute("copilot_api.translation.system_message_count",t.filter(e=>"system"===e.role).length),e.setAttribute("copilot_api.translation.has_images",function(e){return e.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type||"tool_result"===e.type&&Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)))}(t));let o=function(e){let t=new Set;for(let o of e){if(t.size>=20)break;let e=String(o.role).slice(0,64),n=Xi.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&&Qi(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(es.size>=100)break;es.has(o)||(es.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 os=e=>N("sha256").update(e).digest("hex").slice(0,12);function ns(e,t){e.setAttribute("copilot_api.translation.system_hash",os(t.system)),e.setAttribute("copilot_api.translation.tools_hash",os(JSON.stringify(t.tools??[])))}function rs(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function as(e){return e.toLowerCase().startsWith("claude-")}function is(e,t){let o={model:e.model,messages:ss(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:hs(e.tools,e.model),tool_choice:gs(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=ma(t,o.model);if(r){let a="enabled"===n.type&&"number"==typeof n.budget_tokens?n.budget_tokens:function(e,t,o){let n=function(e,t){return"max"===e||"xhigh"===e?t:"medium"===e?8e3:"low"===e?1024:16e3}(e,o.max),r=ua(t),a=r&&r>1?r-1:o.min;return pa(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=ha({...o,thinking_budget:a},t)}}return o}function ss(e,t){let{leadingSystemTexts:o,messages:n}=Ki(e),r=function(e,t){let o=Vi(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=Ji(e);if(!t)break;ls(r)?a.push(t):cs(r,t);break}case"user":r.push(...us(e));for(let e of a)cs(r,e);a=[];break;case"assistant":r.push(...ps(e))}for(let e of a)cs(r,e);return r}function ls(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function cs(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 us(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:fs(e.content)});n.length>0&&t.push({role:"user",content:fs(n)})}else t.push({role:"user",content:fs(e.content)});return t}function ps(e){let t=function(e){return{reasoning_text:ms(e.reasoning_text),reasoning_opaque:ms(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:fs(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:fs(e.content),...t}]}const ds=32768;function ms(e){if("string"==typeof e)return e.length<=ds?e:e.slice(0,ds)}function fs(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 hs(e,t){if(!e)return;let o=e.filter(vi),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:Gi(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)r.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return r.size>0&&f.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function gs(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 _s(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 ys(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function ws(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 bs=new Set(["low","medium","high","max","xhigh"]);function ks(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&&bs.has(e)?e:null)(wn(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 vs(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 xs=/[^\w-]/g;function Ts(e){return e.replaceAll(xs,"_")}function $s(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=ks(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:vs(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:Ts(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Ts(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function As(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"thinking must be an object";let o=t;return"string"==typeof o.type?"enabled"!==o.type||void 0===o.budget_tokens||"number"==typeof o.budget_tokens&&Number.isFinite(o.budget_tokens)&&!(o.budget_tokens<=0)&&Number.isInteger(o.budget_tokens)?null:"thinking.budget_tokens must be a positive integer":"thinking.type must be a string"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"output_config must be an object";let o=t;return void 0===o.effort||"string"==typeof o.effort?null:"output_config.effort must be a string"}(e)}function Ss(e,t,o=400){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function Es(e,t){return xe.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),Ci(n,t,e.req.header("anthropic-beta"));let r=na(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=As(t);return a?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}):r===t.model?(n.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(n.setAttribute("copilot_api.model.was_mapped",!0),Ne.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 oa)return{ok:!1,response:Ss(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function Os(e,t,o){let{leadingSystemTexts:n,messages:r}=Ki(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=Ji(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(qs(e));break}case"user":t.push(...Ds(n),...o.map(e=>qs(e))),o=[];break;case"assistant":t.push(...Fs(n))}return t.push(...o.map(e=>qs(e))),t}(r);if(0===a.length)throw new eo("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 Vi(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(vi).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:Ps(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=wn(o,t);return{effort:Ns(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function Cs(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${N("sha256").update(o).digest("hex").slice(0,32)}`}function Is(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 Rs=new Set(["low","medium","high","xhigh"]),Ns=e=>null!==e&&Rs.has(e);function Ps(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function qs(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function Ds(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(Ms(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(js(t))}t.push({type:"message",role:"user",content:e})}else{let e=n.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function js(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function Ms(e){if(Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)){let t=e.content.filter(e=>["image","text"].includes(e.type)).map(e=>"image"===e.type?js(e):{type:"input_text",text:e.text});return e.is_error&&t.unshift({type:"input_text",text:"[ERROR]"}),{type:"function_call_output",call_id:e.tool_use_id,output:t}}let t;return t="string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.filter(e=>"text"===e.type).map(e=>e.text).join("\n"):"",e.is_error&&(t=`[ERROR] ${t}`),{type:"function_call_output",call_id:e.tool_use_id,output:t}}function Fs(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 Hs(e,t){if("incomplete"===e.status)return"content_filter"===e.incomplete_details?.reason?"refusal":"max_tokens";if(t)return"tool_use";switch(e.status){case"completed":case"cancelled":case"failed":return"end_turn";default:return null}}function Us(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Bs(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 Ls(e,t){let o=[];switch(e.type){case"response.created":Bs(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){Bs(t,o),Us(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":Bs(t,o),Us(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":Us(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":{Us(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage,a=Hs(e.response,n);t.terminalEvent=e.type,t.stopReason=a,o.push({type:"message_delta",delta:{stop_reason:a,stop_sequence:null},usage:Is(r)},{type:"message_stop"});break}case"response.incomplete":{Bs(t,o),Us(t,o);let n=e.response.usage,r=Hs(e.response,!1);t.terminalEvent=e.type,t.stopReason=r,o.push({type:"message_delta",delta:{stop_reason:r,stop_sequence:null},usage:Is(n)},{type:"message_stop"});break}case"response.failed":Bs(t,o),Us(t,o),t.terminalEvent=e.type,o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":Bs(t,o),Us(t,o),t.terminalEvent=e.type,t.stopReason="end_turn",o.push({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{input_tokens:0,output_tokens:0}},{type:"message_stop"});break;case"response.refusal.delta":Bs(t,o),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"error":t.terminalEvent=e.type,o.push({type:"error",error:{type:e.code??"api_error",message:e.message??"Response generation failed"}})}return o}function zs(e,t,o){let n=t.reasoning?.effort,r=e.get("requestData")||{};r.reasoningEffort=n,r.effortClamped=Pi(o,n),e.set("requestData",r)}function Gs(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function Ks(e,t,n){for(let r of t){if(o.debug("Translated Anthropic event:",r),"error"===r.type)throw n?.setAttribute("copilot_api.error_type","upstream_failure"),new ia(r.error.type,r.error.message);await e.writeSSE({event:r.type,data:JSON.stringify(r)})}}async function Js(e,t,r){let a=performance.now(),i=xe.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),ts(o,t.messages);let n=Os(t,ne.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===ne.provider,promptCacheKey:"foundry"===ne.provider?Cs(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return ns(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});We.record(performance.now()-a,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",i),e.set("requestData",{model:i.model,streaming:!!i.stream}),zs(e,i,r),ne.manualApprove&&await Zr();let s=performance.now(),l=await La(i,{onAttempt:t=>zs(e,t,r),signal:St(e)}),c=performance.now()-s;if(Ge.record(c,{model:i.model,target:"responses",streaming:String(!!i.stream)}),Ka(l)){let t=e.get("requestData")||{};if(Gs(e.get("requestSpan"),l.usage?.output_tokens_details?.reasoning_tokens),l.usage&&(t.tokenUsage=ea({prompt_tokens:l.usage.input_tokens,completion_tokens:l.usage.output_tokens,total_tokens:l.usage.total_tokens,prompt_tokens_details:l.usage.input_tokens_details})),t._d1=c,t.upstreamTtfbMs=c,t.upstreamTotalMs=c,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(l).slice(-400)),"failed"===l.status)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:l.error?.code??"api_error",message:l.error?.message??"Response generation failed"}},500);let r=performance.now(),a=xe.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","responses_to_anthropic");let t=function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:Hs(e,o),stop_sequence:null,usage:Is(e.usage)}}(l);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 We.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:u,span:p,release:d}=l;return F(e,async t=>{t.onAbort(()=>function(e){At(e).abort()}(e));let n=null,r=0,a=performance.now(),l=ya(e,s),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let a of u){if(l(),o.debug("Responses API raw stream event:",a),!a.data)continue;let s;try{s=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}r++,Fe.add(1,{model:i.model,endpoint_type:"responses"});let u=Ja(s);if(u){n=u;let t=e.get("requestData")||{};t.tokenUsage=ea(n),t._d1=c,e.set("requestData",t)}await Ks(t,Ls(s,m),e.get("requestSpan"))}!function(e,t){if(!t.terminalEvent)throw e?.setAttribute("copilot_api.error_type","stream_incomplete"),new ia("api_error","Upstream stream ended before the response completed")}(e.get("requestSpan"),m);let p=performance.now()-a,d={model:i.model,endpoint_type:"responses"};Ke.record(p,d),Qe.record(r,d),wa(e,s)}catch(o){if(Et(e))return;throw nt(p,e.get("requestSpan"),o),await la(t,o),o}finally{n&&ta(p,n),function(e,t,o){e&&(Gs(e,o?.completion_tokens_details?.reasoning_tokens),e.setAttribute("copilot_api.stream.terminal_event",t.terminalEvent??"none"),void 0!==t.stopReason&&e.setAttribute("copilot_api.translation.stop_reason",t.stopReason??"null"),e.setAttribute("copilot_api.translation.tool_use_count",Object.keys(t.toolCalls).length))}(e.get("requestSpan"),m,n),p.end(),d()}}finally{try{let t=e.get("requestId");t&&ge.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}})}function Ws(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 Ys(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Vs(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&&(Ws(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&&(Ws(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Ys(t,o)),r.content&&(Ys(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){Ys(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&&(Ys(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:rs(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 Xs=/structured_outputs|output_config\.format/i;function Zs(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Xs.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?$s({...e,model:mn},o):null}var Qs=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var el=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const tl={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 st({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 ot(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new el: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 st({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 ot(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Qs:e}finally{clearTimeout(i)}}},ol=["tavily","exa"];function nl(e){return"tavily"===e||"exa"===e}function rl(){return ne.webSearchProviders.length>0}async function al(e,t){return async function(e,t,n){let{providers:r,searchFns:a=tl}=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:ne.webSearchProviders})}function il(e){let t=e.tools;return!(!t||1!==t.length)&&ki(t[0])}function sl(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function ll(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 cl(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&&ki(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(!rl())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await al(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_${sl()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...ll(n,e)}];return{id:`msg_ws_${sl()}`,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_${sl()}`,r=`msg_ws_${sl()}`,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:ll(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}),F(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}async function ul(e){if(Zo(ne)||await Yn())return null;let t=Bn();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${zn()}`}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function pl(e,t){let o=t.model;return o&&"string"==typeof o?null:Ss(e,"Model name is required and must be a string")}async function dl(e){let t=await e.req.json();if(il(t))return pl(e,t)??cl(e,t);await aa(ne),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=pl(e,t);if(a)return a;t=function(e,t){return Di(t,ne.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Es(e,t);if(!i.ok)return i.response;t=i.payload;let s=await ul(e);if(s)return s;if(ra(t.model))return Js(e,t,r);if(function(e){if("foundry"!==ne.provider)return as(e);let t=ne.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:as(e)}(t.model))return async function(e,t,o){let n="foundry"===ne.provider,r=n?t:$s(t,ne.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:Pi(o,i),streaming:!!r.stream}),ne.manualApprove&&await Zr(),xe.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),Ci(t,r,a.anthropicBeta);try{let o=performance.now(),i=await Ii(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=Zs(e,o,ne.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(Ge.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=ea(fl(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 F(e,async n=>{let a=0,i=performance.now(),s={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=ya(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,Fe.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),hl(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"};Ke.record(e,t),Qe.record(a,t)}catch(t){throw nt(c,e.get("requestSpan"),t),await la(n,t),t}finally{if(wa(e,o),p){let t=fl(s);ta(c,t);let o=e.get("requestData")||{};o.tokenUsage=ea(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&ge.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw ot(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=xe.startActiveSpan("copilot_api.translate.anthropic_to_openai",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),o.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),o.setAttribute("copilot_api.translation.has_system",!!t.system),o.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let n=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));o.setAttribute("copilot_api.translation.has_thinking",n),ts(o,t.messages);let r=is(t,ne.models),a=r.messages.at(0);return ns(o,{system:"system"===a?.role&&"string"==typeof a.content?a.content:"",tools:r.tools}),r}finally{o.end()}});We.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=ha(c,ne.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:Pi(r,u),streaming:!!c.stream});let p=performance.now();ne.manualApprove&&await Zr();let d=await Da(c),m=performance.now()-p;if(Ge.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),ml(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=ea(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=xe.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=ys(a.message),i=_s(a.message.content),s=ws(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:rs(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 We.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 F(e,async t=>{let n=null,r=0,a=performance.now(),i=ya(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++,Fe.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=ea(n),t._d1=m,e.set("requestData",t)}let u=Vs(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(Ke.record(l,u),Qe.record(r,u),wa(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=ea(n),t._d1=m,e.set("requestData",t))}}catch(o){throw nt(h,e.get("requestSpan"),o),await la(t,o),o}finally{n&&ta(h,n),h.end(),g()}let l=e.get("requestId");l&&ge.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const ml=e=>Object.hasOwn(e,"choices");function fl(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 hl(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}const gl=new j;gl.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&il(t)}catch{return!1}}(e)?await dl(e):await En(e,dl)}catch(t){return await To(e,t)}});const _l=new j;function yl(e){return xe.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=na(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),Ne.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 wl(e,t){let o=function(e){try{let t=JSON.parse(e);if(("response.completed"===t.type||"response.incomplete"===t.type)&&t.response?.usage){let e=t.response.usage;return{prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens,prompt_tokens_details:e.input_tokens_details}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=ea(o),n._d1=t._d1,t.c.set("requestData",n)}_l.get("/",async e=>{try{ne.models||await In();let t=ne.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 To(e,t)}});const bl=new Set(["message","function_call","function_call_output"]),kl=new Set(["type","name","description","parameters"]);async function vl(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||!rl())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await al(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function xl(e){if(rl())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await vl(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Tl(e){if(!rl())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 vl(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function $l(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 bl.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Al(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 Sl(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&&Al(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)Al(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function El(e){return null!=e}function Ol(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Cl(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Il(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(!Ol(n)){o.push(n);continue}let e=$l(n);null===e?t.add(Cl(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"])El(e[o])&&(t[o]=e[o]);let r=new Set;if(El(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))kl.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(El(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},El(o.effort)&&(t.reasoning.effort=o.effort),El(o.summary)&&(t.reasoning.summary=o.summary)}if(El(e.text)&&"object"==typeof e.text){let o=e.text;El(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Rl(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Nl(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=f.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||El(n.previous_response_id)||El(n.prompt)||El(n.conversation)?null:Rl(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 Pl(e){await aa(ne);let t=await e.req.json();if(!Ol(t))return Rl(e,"request body must be a JSON object");let n=function(e){return"foundry"===ne.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:Il(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:yl(t)}}catch(t){if(t instanceof oa)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=Nl(e,t.input,n);if(s)return s;let l=await Qr(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),ne.manualApprove&&await Zr();let c=performance.now(),u=await La(a),p=performance.now()-c;if(Ge.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),ql(u))return async function(e,t,o){await xl(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=ea({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens,prompt_tokens_details:t.usage.input_tokens_details})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return F(e,async t=>{let o={value:null},n=0,i=performance.now(),s=ya(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Sl(i.data,r);s=await Tl(s);let l=s===i.data?i:{...i,data:s};Fe.add(1,{model:a.model,endpoint_type:"responses"}),wl(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"};Ke.record(l,u),Qe.record(n,u),wa(e,c)}catch(o){throw nt(m,e.get("requestSpan"),o),await ca(t,o),o}finally{o.value&&ta(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ge.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const ql=e=>Object.hasOwn(e,"output"),Dl=new j;Dl.post("/",async e=>{try{return await En(e,Pl)}catch(t){return await To(e,t)}});const jl=new j;jl.get("/",e=>{try{return ne.showToken?e.json({token:ne._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 Ml=new j;Ml.get("/",async e=>{try{let t=await pr();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Fl=new j;function Hl(){return function(e){let t=e.filter(e=>Yr(e));if(0===t.length)return;let o=t.find(e=>Wr.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(ne.models?.data??[])}function Ul(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 Lr(o).slice(0,200)}catch{}let t=Lr(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 Bl(e={}){let t=performance.now(),o=e.model&&function(e){let t=ne.models?.data.find(t=>t.id===e);return void 0!==t&&Yr(t)}(e.model)?e.model:Hl();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 Fl.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[Kr]:Jr},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:Ul(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)}}Fl.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=Ot(i),l=function(e){return e===Jr}(e.req.header(Kr));e.set("requestId",r),e.set("isSelfTest",l),e.header("x-request-id",r);let c=xe.startSpan("copilot_api.handle_request",{kind:u.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",c),e.set("requestTraceContext",c.spanContext()),l&&c.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();at.has(e)||"x-copilot-api-self-test"!==e&&c.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=await e.req.raw.clone().text();e.set("rawBody",t.length>Xr?t.slice(0,Xr):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let m,h=new Promise(e=>{m=e});e.set("streamComplete",h),e.set("resolveStreamComplete",m);let g=f.setSpan(d.active(),c);await d.with(g,async()=>{l||ge.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw c.setStatus({code:p.ERROR,message:t.message}),c.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:c};_?.streaming&&e.res.status<400?h.then(()=>Vr(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{c.recordException(t),c.setStatus({code:p.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{c.end()}catch{}}):Vr(y)}),Fl.use(M()),Fl.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()}),Fl.get("/",e=>e.text("Server running")),Fl.route("/health",yi),Fl.route("/chat/completions",hi),Fl.route("/models",_l),Fl.route("/embeddings",_i),Fl.route("/usage",Ml),Fl.route("/token",jl),Fl.route("/v1/chat/completions",hi),Fl.route("/v1/models",_l),Fl.route("/v1/embeddings",_i),Fl.route("/v1/messages",gl),Fl.post("/v1/messages/count_tokens",async function(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:"invalid_request_error",message:"Invalid JSON"}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let{name:o,tokenizer:n}=await async function(e){let t=ne.models?.data.find(t=>t.id===e);return!t||"Anthropic"===t.vendor||nn(t.capabilities.family)||"o200k_base"!==t.capabilities.tokenizer?{name:"claude",tokenizer:xi}:(Ti??=import("ai-tokenizer/encoding/o200k_base").then(e=>new U(e)),{name:"o200k_base",tokenizer:await Ti})}(t.model),r=e=>Ai(n,e),a=$i.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");a+=$i.perMessage+r(e)*$i.contentMultiplier}for(let e of t.messages)a+=$i.perMessage,a+=r(e.role),"string"==typeof e.content?a+=r(e.content)*$i.contentMultiplier:Array.isArray(e.content)&&(a+=Si(e.content,r));let i=t.tools?.filter(vi);i&&i.length>0&&(a+=function(e,t){let o=$i.toolsExist;for(let[n,r]of e.entries())n>0&&(o+=$i.perTool),o+=t(r.name),r.description&&(o+=$i.perDesc+t(r.description)),o+=Ei(r.input_schema,t);return o}(i,r));let s=Math.round(a);"string"==typeof t.model&&e.set("requestData",{model:t.model,streaming:!1});let l=e.get("requestSpan");return l?.setAttribute("copilot_api.count_tokens.estimate",s),l?.setAttribute("copilot_api.count_tokens.tokenizer",o),e.json({input_tokens:s})}),Fl.route("/v1/responses",Dl),Fl.route("/responses",Dl),Fl.onError((e,t)=>To(t,e));const Ll=e=>`[1m${e}[0m`,zl=e=>`[2m${e}[0m`,Gl=e=>`[32m${e}[0m`,Kl=e=>`[31m${e}[0m`,Jl=e=>`[33m${e}[0m`,Wl=zl(" ─────────────────────────────────────────────────────────────");function Yl(e,t,o){console.log(` ${function(e){return"ok"===e?Gl("✓"):"warn"===e?Jl("⚠"):Kl("✗")}(e)} ${Ll(t.padEnd(14))} ${o}`)}function Vl(e){console.log(` ${zl("↳")} ${zl(e)}`)}function Xl(e){return e instanceof eo?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function Zl(){let e=y.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await a.readFile(V.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 Ql(){try{await In();let e=(ne.models?.data.length??0)>0;return Yl(e?"ok":"warn","Model catalog",e?function(){let e=ne.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 Yl("fail","Model catalog",Xl(e)),Vl("Could not fetch /models — check connectivity/auth."),!1}}async function ec(e){ne.accountType=e.accountType;let t=await Ut(),o=Bt();if(console.log(""),console.log(` ${Ll("COPILOT-API DOCTOR")} ${zl(`v${t}`)}`),console.log(Wl),Yl("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await X(),Rn(),!await async function(){let e=await Zl();if(!e)return Yl("fail","Auth token","not found"),void Vl("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");ne._t2=e.token,Yl("ok","Auth token",`found (${e.source})`);try{let e=await Ao();return await ht(ne,e.login),Yl("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return Yl("fail","GitHub auth",Xl(e)),void Vl("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(Wl),console.log(` ${Kl("✗")} ${Ll("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await $o();return ne._t1=e,Yl("ok","Service token","acquired"),!0}catch(e){let t=e instanceof eo?e.response.status:0;return Yl("fail","Service token",Xl(e)),Vl(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 Ql();await async function(){try{let e=await pr(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${ar(ir(t))} of ${ar(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;Yl("ok","Copilot plan",`${e.copilot_plan} · ${o} `+zl(`(resets ${e.quota_reset_date})`))}catch(e){Yl("warn","Copilot plan",`unavailable (${Xl(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Bl();return e.ok?(Yl("ok","Generation",`works via ${e.model} ${zl(`(${e.durationMs}ms)`)}`),!0):(Yl("fail","Generation",`${e.reason}${e.status?zl(` [HTTP ${e.status}]`):""}`),!1)}():Yl("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let o of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let n=y.env[o];n&&("ANTHROPIC_BASE_URL"===o&&/\/v1\/*$/.test(n)&&(t="warn",e.push(`${o}=${n} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(n)&&(t="warn",e.push(`${o}=${n} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){Yl(t,"Client config","potential base-URL issue");for(let t of e)Vl(t)}else Yl("ok","Client config","no base-URL issues detected");Vl("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(Wl),a?(console.log(` ${Gl("✓")} ${Ll("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Jl("⚠")} ${Ll("Some checks need attention")} — see the ${Kl("✗")}/${Jl("⚠")} lines above.`),console.log(""),2)}const tc=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 ec({accountType:e["account-type"]});y.exit(t)}});function oc(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 nc=!1;const rc="copilot-api-node20",ac=`https://registry.npmjs.org/${rc}/latest`,ic=e=>`[1m${e}[0m`,sc=e=>`[33m${e}[0m`;async function lc(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(ac,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function cc(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 uc,pc;async function dc(e){try{let[t,o]=await Promise.all([Ut(),lc(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 mc(){if(!uc||!pc)return;let{signal:e}=pc;uc.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${rc}@latest`,n=sc("│"),r=` ${ic("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${ic(o)} to update`,i=" ".repeat(54),s=sc(`╭${"─".repeat(54)}╮`),l=sc(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${cc(r,54)}${n}`,`${n}${i}${n}`,`${n}${cc(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var fc={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 hc=262144,gc="https://barazany.dev",_c=/^[a-z0-9][a-z0-9-]*$/i,yc=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function wc(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(yc," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function bc(e){if("object"!=typeof e||!e)return null;let t=e,o=wc(t.title,100),n=wc(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!==gc||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&&_c.test(t.slug)&&(r=`${gc}/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 kc(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=bc(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 vc=null;function xc(e){return s.join(e,"blog-posts.json")}function Tc(e=V.APP_DIR){try{if(vc&&vc.length>0)return vc;let t=function(e){try{let t=xc(e);return z.statSync(t).size>hc?[]:kc(JSON.parse(z.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:kc(fc)}catch{return[]}}function $c(e){return e>-6e4&&e<864e5}async function Ac(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>hc)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>hc?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>hc)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?[]:kc(JSON.parse(o))}finally{clearTimeout(o)}}async function Sc(e={}){try{if("1"===y.env.COPILOT_API_NO_BLOG||"1"===y.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??V.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=xc(e),n=await z.promises.stat(o);if(n.size<=hc){let e=await z.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return $c(t-n.fetchedAt)}return $c(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await Ac(e.timeoutMs??3e3);if(0===n.length)return;vc=n,await async function(e,t,o){let n=xc(e),r=`${n}.${y.pid}.tmp`;try{await z.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await z.promises.rename(r,n)}catch(e){throw await z.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function Ec(e){let t;try{({login:t}=await Oc(e))}catch(e){return void o.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await xn(),o.info("Copilot fallback enabled for Foundry rate limits (429)")}catch(e){o.error("Copilot fallback disabled: could not load the Copilot model list; serving from Foundry only.",e)}return t}async function Oc(e){e._t2&&o.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let t,n=e._t2||process.env.GH_TOKEN;n?(function(e){ne._t2=e,Un=!1}(n),o.info("Using provided Auth token")):await Xn();try{t=await Ao(),await ht(ne,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 $o();ne._t1=e,o.debug("Service token fetched successfully!"),ne.showToken&&o.info("Service token:",e),Hn=!0,Vn(t),ct.start(),Dn=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Wn(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},jn=()=>{o.debug("Network connectivity lost")},ct.on("online",Dn),ct.on("offline",jn)})(),t}function Cc(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=y;if("win32"===e){try{if(_(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=o.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),r=Object.entries(e).filter(([,e])=>void 0!==e);switch(n){case"powershell":o=r.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":o=r.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":o=r.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(" ");o=r.length>0?`export ${e}`:"";break}}return o&&t?`${o}${"cmd"===n?" & ":" && "}${t}`:o||t}function Ic(e,t){return{version:t.version,port:e.port,accountType:e.accountType,verbose:e.verbose,manualApprove:e.manual,rateLimitSeconds:e.rateLimit??0,rateLimitWait:e.rateLimitWait,timeoutMs:e.timeout,showToken:e.showToken,_cc1:e._cc1,model:e.model,smallModel:e.smallModel,_t3:t._t3,provider:e.provider,fallback:e.fallback,foundryAuth:t.foundryAuth}}const Rc=e=>`[1m${e}[0m`,Nc=e=>`[2m${e}[0m`,Pc=e=>`[36m${e}[0m`,qc=e=>`[32m${e}[0m`,Dc=e=>`[33m${e}[0m`,jc=e=>`[4m${e}[0m`,Mc=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Fc="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Hc="https://github.com/johnib/copilot-api-issues/issues",Uc=Nc(" ─────────────────────────────────────────────────────────────");function Bc(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Lc(e){return e&&0!==e.length?e.join("·"):"—"}function zc(e){if(0===e.length)return[];let t=["",Uc,` ${Rc("BARAZANY.DEV")} ${Nc("— Recent Posts")}`,Uc,""];for(let[o,n]of e.entries()){let e=`${n.url}${Fc}`,r=Mc(e,Rc(jc(`[${o+1}]`)));t.push(` ${r} ${Pc(n.title)}`,` ${Nc("→")} ${Nc(n.teaser)}`,"")}return t.push(Uc,` ${Mc(`https://barazany.dev/blog${Fc}`,"barazany.dev/blog")}`,Uc),t}function Gc(e){let t=[];ne.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):ne.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(Nc(" → "))} ${qc("✓")}`:Nc("off"),n=["",` ${Rc("COPILOT-API")} ${Nc(`v${e.version}`)}`,Uc,` ${Nc("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Nc("User")} ${e.user} ${Nc("·")} ${e.accountType}`];return ne._v1&&n.push(` ${Nc("Client")} VSCode ${ne._v1}`),n.push(` ${Nc("Network")} ${t.join(Nc(" · "))}`,` ${Nc("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Nc("Clipboard")} Claude Code command ${qc("✓")}`),n.push(Uc),n}function Kc(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Rc("Active")}`];if(e.model){let o=ne.models?.data.find(t=>t.id===e.model),n=Bc(o?.capabilities.limits?.max_context_window_tokens),r=Lc(o?.capabilities.supports.reasoning_effort);t.push(` ${Pc(e.model.padEnd(32))} ${Nc("ctx")} ${Rc(n.padStart(5))} ${Nc("effort")} ${Nc(r)} ${Dc("← main")}`)}if(e.smallModel){let o=ne.models?.data.find(t=>t.id===e.smallModel),n=Bc(o?.capabilities.limits?.max_context_window_tokens),r=Lc(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Nc("ctx")} ${n.padStart(5)} ${Nc("effort")} ${Nc(r)} ${Dc("← small")}`)}return t}function Jc(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of ne.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("",` ${Rc(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Pc("●"):Nc("·"),i=n?Pc(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Bc(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Lc(r.effort)}`;t.push(` ${a} ${i} ${Nc(s)}${Nc(l)}`)}}return t}function Wc(){let e=Hc.replace(/^https:\/\//,""),t=Mc(`${Hc}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Uc,` ${Rc("FOUND A BUG?")} ${Nc("— Report it on GitHub")}`,Uc,"",` ${Pc("→")} ${Pc(t)}`,` ${Nc("Bug reports, feature requests, and questions welcome.")}`,"",Uc]}function Yc(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=["",Uc,` ${Rc("Claude Cowork")} ${Nc("— Settings → Inference Provider")}`,Uc,"",` ${Nc("Paste into")} ${Rc("inferenceGatewayBaseUrl")}${Nc(":")}`,` ${Rc(Pc(r))}`];return n||a.push("",` ${Nc("Your Tailscale hostname is shown by:")} ${Pc("tailscale status --self")}`),a.push("",` ${Nc("Docs:")} ${Pc("https://claude.com/docs/cowork/3p/installation")}`),a}function Vc(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Uc,` ${Rc("HTTPS")} ${Nc("— self-signed cert")}`,Uc,"",` ${Nc("Cert")} ${t}`];switch(o.push("",` ${Rc("Trust this cert")} ${Nc("(one-time setup)")}`),y.platform){case"darwin":o.push(` ${Nc("macOS:")}`,` ${Pc("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Pc(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Nc("Windows (PowerShell as Administrator):")}`,` ${Pc(`Import-Certificate -FilePath "${t}" \``)}`,` ${Pc("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Nc("Linux (Debian/Ubuntu):")}`,` ${Pc(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Pc("sudo update-ca-certificates")}`,` ${Nc("Linux (Fedora/RHEL/Arch):")}`,` ${Pc(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Pc("sudo update-ca-trust")}`);break;default:o.push(` ${Nc("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Nc("Or, for Node CLIs only (no admin needed):")}`,` ${Pc(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Uc),o}function Xc(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 Zc=s.join(V.APP_DIR,"certs"),Qc=s.join(Zc,"cert.pem"),eu=s.join(Zc,"key.pem"),tu=s.join(Zc,"cert.meta.json");async function ou(e){try{return await a.readFile(e,"utf8")}catch{return}}async function nu(e){let t=await ou(Qc),o=await ou(eu),n=await async function(){let e=await ou(tu);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 ru(e){return 0!==J(e)}async function au(e){await a.mkdir(Zc,{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)ru(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 W([{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(Qc,l.cert,{mode:420}),await a.writeFile(eu,l.private,{mode:384}),await async function(e){await a.writeFile(tu,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:Qc,keyPath:eu,generated:!0}}const iu=[],su=Date.now();let lu="";function cu(){let e=async(e,t=0)=>{let n=xe.startSpan("copilot_api.server.shutdown",{kind:u.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-su)/1e3}});for(let t of iu)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Mc("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Uc,` ${Rc("COPILOT-API")} ${Nc(`v${e}`)} ${Nc("·")} ${Xc(t)} uptime`,Uc,""," Check in from time to time on",` ${Pc(o)}`,"",Uc,""];console.log(n.join("\n"))}(lu,Date.now()-su),y.exit(t)};y.on("SIGINT",()=>e("SIGINT")),y.on("SIGTERM",()=>e("SIGTERM")),y.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),y.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}const uu=e=>e.filter(e=>"embeddings"!==e.capabilities.type).map(e=>e.id),pu=e=>e.filter(e=>"embeddings"!==e.capabilities.type&&(e.supported_endpoints?.includes("/responses")??!0)).map(e=>e.id);async function du(e,t,n){if(!e._cc1)return!1;ne.models||(o.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),y.exit(1));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,uu(ne.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:uu(ne.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:uu(ne.models.data)}));let s=Cc({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:r,ANTHROPIC_SMALL_FAST_MODEL:a,NODE_EXTRA_CA_CERTS:n?.certPath},"claude");try{return h.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function mu(e){return e._t2?"cli_arg":y.env.GH_TOKEN?"env_var":"stored"}function fu(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=xe.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:rt({config:Ic(t,{version:o,_t3:mu(t),foundryAuth:ne.foundry?.auth}),runtime:n,identity:{_u1:r.login,machineId:ne.machineId,sessionId:ne.sessionId,_v1:ne._v1},connectivity:ne.connectivity,modelsCount:ne.models?.data.length??0,startupDurationMs:Date.now()-su},"copilot_api")});if(ne.models?.data)for(let e of ne.models.data)a.addEvent("copilot_api.model.available",rt(e,"model"));a.end(),tt(w.INFO,"INFO","Server started",rt({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:ne.models?.data.length??0,startupDurationMs:Date.now()-su},"copilot_api"))}async function hu(e,t){try{return await async function(e){return"foundry"===e.provider?(ne.foundry=Lo(process.env),ne.connectivity.h2=!1,ne.connectivity.h2Keepalive=!1,"entra"===ne.foundry.auth&&await qo(ne.foundry),o.info(`Using Microsoft Foundry upstream: ${ne.foundry.endpoint} (${"entra"===ne.foundry.auth?"Entra ID":"API key"} auth)`),{login:("copilot"===e.fallback?await Ec(e):void 0)??"foundry"}):Oc(e)}(e)}catch(o){throw await async function(e,t){let o=rt({config:t,startupStage:"upstream_auth"},"copilot_api"),n=xe.startSpan("copilot_api.server.startup_failed",{kind:u.INTERNAL,attributes:o});e instanceof eo&&(n.setAttribute("http.response.status_code",e.response.status),n.setAttribute("url.full",e.response.url)),ot(n,e),n.end(),tt(w.ERROR,"ERROR","Server startup failed",{...o,"exception.message":e instanceof Error?e.message:String(e)}),await ve()}(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:mu(e)}),o}}async function gu(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 nu(e)){let e=await ou(Qc),t=await ou(eu);if(e&&t)return{cert:e,key:t,certPath:Qc,keyPath:eu,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),au(e)}(e.httpsHosts)}}async function _u(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=Rr;try{G(t),G(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(cu(),iu.push(()=>{o.debug("Cleaning up connectivity monitor"),ct.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),Hn=!1,Pn&&=void clearInterval(Pn),Dn&&=void ct.off("online",Dn),jn&&=void ct.off("offline",jn),qn=void 0,Mn=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),Ta&&=void clearInterval(Ta),$a&&=void clearInterval($a);let e=[...ka.keys(),...va];ka.clear(),va.clear(),ba.clear(),xa=void 0;for(let t of e)Aa(t)&&(Be.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await ve()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");ne.provider=t.provider,ne.accountType=t.accountType,ne.manualApprove=t.manual,ne.rateLimitSeconds=t.rateLimit,ne.rateLimitWait=t.rateLimitWait,ne.showToken=t.showToken,ne.timeoutMs=t.timeout,ne.connectivity.timeoutMs=t.connectTimeout,ne.webSearchProviders=t.webSearchProviders,ne.errorReporting=function(e){let t=y.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===y.env.COPILOT_H2_KEEPALIVE||"true"===y.env.COPILOT_H2_KEEPALIVE,t=e||"1"===y.env.COPILOT_H2||"true"===y.env.COPILOT_H2;ne.connectivity.h2=t,ne.connectivity.h2Keepalive=e}(),await X(),Sc().catch(()=>{}),Rn();let n=await Ut();lu=n;let r=Bt();!function(e,t){t&&(we=t),ye=crypto.randomUUID();let o=T({[O]:"copilot-api",[C]:e,[E]:ye}),{endpoint:n,headers:r}=ke();_e=new S({resource:o,traceExporter:new x({url:`${n}/v1/traces`,headers:r}),metricReader:new A({exporter:new v({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new $({exporter:new k({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),_e.start()}(n,su);let a=await hu(t,n);await async function(){try{return await In({refreshFallback:!1}),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,n=e instanceof Error?e.message:"Unknown error occurred",r=void 0===t?"":` (HTTP ${t})`,a="foundry"===ne.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(()=>{In().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{In().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)}}();iu.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),ne.connectivity.h2&&(Oa(Ea(gt(ne))),ne.connectivity.h2Keepalive&&Ia()),fu({options:t,version:n,runtime:r,_u1:a});let s=await gu(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await du(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(ne.models||(o.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),y.exit(1)),e.model){let t=pu(ne.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:pu(ne.models.data)});let a=Cc({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return h.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,c,s);(function(e){let t=[...Gc(e),...Kc(e),...Jc(e),...Wc(),"",...zc(Tc()),...Yc(e),...Vc(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 br()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),mc(),K({fetch:Fl.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 Bl({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: ${Lr(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 yu(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const wu=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT, plus FOUNDRY_API_KEY or an Entra ID login such as az login). Overrides COPILOT_API_PROVIDER.'},fallback:{type:"string",description:'With --provider foundry: "copilot" re-sends a Foundry-rate-limited (429) request to GitHub Copilot and keeps that model on Copilot until Foundry\'s retry-after passes. Overrides COPILOT_API_FALLBACK.'},port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},"error-reporting":{type:"boolean",default:!0,description:"Send anonymous, sanitized error reports to the maintainer to help fix bugs (no prompts, completions, or tokens). Use --no-error-reporting or COPILOT_API_ERROR_REPORTING=0 to disable."},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"[DEPRECATED — set the TAVILY_API_KEY env var instead] Tavily API key for web search."},"web-search-provider":{type:"string",description:'Web search failover order, e.g. "exa,tavily" (first = primary, rest = fallbacks). Web search turns on when TAVILY_API_KEY and/or EXA_API_KEY are set; this flag is optional and only orders the providers you configured.'},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"},"smoke-test":{type:"boolean",default:!0,description:"After startup, run one tiny self-test generation to verify the proxy works end-to-end and print a clear PASS/FAIL. Disable with --no-smoke-test (or COPILOT_API_NO_SMOKE_TEST=1)."}},run({args:e}){let t=e["rate-limit"],n=void 0===t?void 0:yu(t,"--rate-limit"),r=e.timeout,a=void 0===r?oe:yu(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:yu(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],y.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??y.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!nl(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${ol.join(", ")}`);let r=n.length>0?n:ol,a=new Set,i=n.length>0,s=[];for(let e of r){if(!nl(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||y.env.TAVILY_API_KEY,exaApiKey:y.env.EXA_API_KEY,order:u}),d=(y.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d,f=function(e,t){let o=(e??t??"copilot").trim().toLowerCase();if("copilot"===o||"foundry"===o)return o;throw Error(`--provider must be "copilot" or "foundry", got: "${o}"`)}(e.provider,y.env.COPILOT_API_PROVIDER);return _u({provider:f,fallback:vn(e.fallback,y.env.COPILOT_API_FALLBACK,f),port:yu(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})}});nc||(nc=!0,o.setReporters([oc(o.options.reporters)]));const bu=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(uc||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;pc=e,uc=dc(e).catch(()=>null)})(),bu||mc();const ku=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:er,start:wu,"check-usage":hr,debug:Gt,doctor:tc,"cowork-setup":Ur}});await t(ku),bu||(pc?.abort(),pc=void 0,uc=void 0);export{};
|
package/package.json
CHANGED