copilot-api-node20 0.44.0-preview.16 → 0.44.0-preview.18

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