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