copilot-api-node20 0.44.0-preview.8 → 0.44.0-preview.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.mjs +1 -1
- package/package.json +1 -1
package/dist/main.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{AsyncLocalStorage as l}from"node:async_hooks";import{SpanKind as c,SpanStatusCode as u,context as p,metrics as d,trace as m}from"@opentelemetry/api";import f from"clipboardy";import{execFile as h,execSync as g}from"node:child_process";import _ from"node:process";import{SeverityNumber as y,logs as w}from"@opentelemetry/api-logs";import{OTLPLogExporter as b}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as v}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as x}from"@opentelemetry/resources";import{BatchLogRecordProcessor as $}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as T}from"@opentelemetry/sdk-metrics";import{NodeSDK as A}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as S,ATTR_SERVICE_NAME as E,ATTR_SERVICE_VERSION as O}from"@opentelemetry/semantic-conventions";import{Client as C,request as I}from"undici";import{createHash as P,randomBytes as N,randomUUID as R}from"node:crypto";import{promisify as q}from"node:util";import{Hono as j}from"hono";import{cors as D}from"hono/cors";import{streamSSE as M}from"hono/streaming";import{events as F}from"fetch-event-stream";import{Tokenizer as H,models as U}from"ai-tokenizer";import*as B from"ai-tokenizer/encoding/claude";import L,{accessSync as z}from"node:fs";import{serve as G}from"srvx";import{isIP as K}from"node:net";import{generate as J}from"selfsigned";const W=s.join(i.homedir(),".local","share","copilot-api"),Y={APP_DIR:W,GITHUB_TOKEN_PATH:s.join(W,"github_token"),MACHINE_ID_PATH:s.join(W,"machine_id"),SESSION_ID_PATH:s.join(W,"session_id")};async function V(){await a.mkdir(Y.APP_DIR,{recursive:!0}),await X(Y.GITHUB_TOKEN_PATH),await X(Y.SESSION_ID_PATH)}async function X(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const Z=new l;function Q(e,t){return Z.run(e,t)}const ee=()=>!0===Z.getStore()?.rerun;const te=6e5,oe={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:te,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 ne(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:()=>Z.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=Z.getStore();return e?e.models:o},set:e=>{o=e},enumerable:!0,configurable:!0}})}(oe);const re=" │ ",ae=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()},ie=(e,t)=>e.padEnd(t),se=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),le=(e,t,o)=>` --\x3e ${ie(e,4)} ${ie(t,21)} ${ie(o,3)}`,ce=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return ie(t,22)})(e.model??"—")+ie(t,8)},ue=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ae(Math.max(t-o,0)):"—",r=e?ae(e.outputTokens??0):"—",a=o?ae(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},pe=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${ie("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ae(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},de=e=>{if(void 0===e.ttfbMs)return`e2e ${se(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${se(e.ttfbMs)} → e2e ${se(e.e2eMs)} ${t}`},me=e=>e?oe.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,fe=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}}),he={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=>[le(e.method,e.path,e.status),ce(e),ue(e.tokenUsage),pe(e.tokenUsage,e.maxContextTokens),de({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(re))({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:me(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),et(y.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)},...fe(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=n.get("requestData");o.warn((e=>[le(e.method,e.path,"429"),ce(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${se(e.e2eMs)}`].join(re))({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=le(e.method,e.path,e.status.toString()),o=ce(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${se(e.e2eMs)}`].join(re)})({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(()=>he.cleanup(),6e4);let ge,_e,ye=Date.now();const we={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function be(){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):we;return{endpoint:e.replace(/\/$/,""),headers:t}}async function ke(){if(!ge)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([ge.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 ve=m.getTracer("copilot-api"),xe=d.getMeter("copilot-api"),$e=w.getLogger("copilot-api"),Te=xe.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),Ae=xe.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),Se=xe.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Ee=xe.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),Oe=xe.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Ce=xe.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Ie=xe.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Pe=xe.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Ne=xe.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Re=xe.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),qe=xe.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),je=xe.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),De=xe.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Me=xe.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Fe=xe.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),He=xe.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Ue=xe.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Be=xe.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Le=xe.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),ze=xe.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Ge=xe.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Ke=xe.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Je=xe.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),We=xe.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Ye=xe.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Ve=xe.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Xe=xe.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Ze=xe.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),Qe=xe.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function et(e,t,o,n,r){let a=m.getActiveSpan()?.spanContext()??r;$e.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function tt(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:u.ERROR,message:o??n.message}),e.recordException(n)}function ot(e,t,o){tt(e,o),t&&t!==e&&tt(t,o)}function nt(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,nt(r,e)))}return o}xe.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!lt.getConnectivityStats().isOnline)}),xe.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(lt.getConnectivityStats().consecutiveFailures)}),xe.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(oe.models?.data.length??0)}),xe.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(he.completionCallbacks.size)}),xe.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-ye)/1e3)});const rt=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function at(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();"authorization"===o&&e.setAttribute(`http.${t}.header.authorization.shape`,ne(r)),!rt.has(o)&&e.setAttribute(`http.${t}.header.${o}`,r)}}async function it(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:l}=e,p=ve.startSpan(t,{kind:c.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...l}});a&&at(p,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();rt.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),De.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:u.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw tt(p,e),p.end(),e}}async function st(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=ve.startSpan(t,{kind:c.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});at(f,"request",a);try{let{statusCode:e,headers:t,body:c}=await I(o,{method:r,headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:p,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!rt.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return De.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:u.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:c,span:f}}catch(e){throw tt(f,e),f.end(),e}}const lt=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:oe.connectivity.probeEndpoints,fastInterval:oe.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?oe.connectivity.slowProbeInterval:oe.connectivity.fastProbeInterval)+Math.random()*oe.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ve.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),oe.connectivity.timeoutMs);try{let n=!1;for(let e of oe.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",...oe.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Ye.record(r,{endpoint:e,result:"success"});break}Ye.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),qe.add(1,{result:n?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&o.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),je.add(1,{from:"offline",to:"online"}),et(y.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(o.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),je.add(1,{from:"online",to:"offline"}),et(y.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?oe.connectivity.slowProbeInterval:oe.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*oe.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:oe.connectivity.jitterMaxMs>0,connectionPooling:oe.connectivity.connectionPooling,dnsCache:oe.connectivity.dnsCache}}},ct=()=>({"content-type":"application/json",accept:"application/json"}),ut="0.48.1",pt=`copilot-chat/${ut}`,dt=`GitHubCopilotChat/${ut}`,mt=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`${Y.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=P("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(N(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},ft=async(e,t)=>{e.machineId||=await mt(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(Y.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(Y.SESSION_ID_PATH,e),await a.chmod(Y.SESSION_ID_PATH,384),e})()},ht=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,gt=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=R(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":pt,"User-Agent":dt,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":R(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},_t=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const yt=(e,t,o)=>{let n=gt(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&&_t.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},wt="https://api.github.com",bt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":pt,"user-agent":dt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),kt="https://github.com",vt="01ab8ac9400c4e429b23",xt=["user:email"].join(" ");function $t(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const Tt=32768,At=[{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: ***"}],St=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Et(e){let t=e;for(let{regex:e,mask:o}of At)t=t.replace(e,o);return t}const Ot=new Map;function Ct(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 It(e,t,o){let n=Et(o),r=8*Tt,a=n.length>r,i=a?n.slice(0,r):n,s=P("sha256").update(n).digest("hex");if(i.length<=Tt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=Tt)e.setAttribute(`${t}.part_${o/Tt}`,i.slice(o,o+Tt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/Tt))}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 Pt(e,t){let o=function(e){if(Ot.size>=1e3&&!Ot.has(e)){let e=Ot.keys().next().value;void 0!==e&&Ot.delete(e)}let t,o=(Ot.get(e)??0)+1;return Ot.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Be.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&&It(e,"copilot_api.incoming_request_body",n);let r=Nt(t.c.req.header());return r&&It(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&It(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&It(e,"copilot_api.outgoing_headers",Nt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&It(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function Nt(e){let t={};for(let[o,n]of Object.entries(e))St.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Rt(){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 qt(){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 jt(){try{return!!(await a.stat(Y.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(Y.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Dt(e){let t=await async function(){let[e,t]=await Promise.all([Rt(),jt()]);return{version:e,runtime:qt(),paths:{APP_DIR:Y.APP_DIR,GITHUB_TOKEN_PATH:Y.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 Mt=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})=>Dt({json:e.json})}),Ft=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Ht=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Ut=new Set;let Bt;function Lt(e){if(oe.errorReporting&&!(e.statusCode<500)&&!Ut.has(e.signature)){if(Ut.size>=1e3){let e=Ut.values().next().value;void 0!==e&&Ut.delete(e)}Ut.add(e.signature),async function(e){Bt??=Rt();let t=await Bt,o=qt(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(Et(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:$t(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(Ft,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Ht},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function zt(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 Gt=new WeakSet;async function Kt(e,{attempt:t,maxRetries:n,operation:r}){return zt(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&&Gt.add(e)}(e),!1)}var Jt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Wt=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Yt(e,t){return setTimeout(()=>e.abort(new Wt(t)),t)}const Vt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Xt=RegExp(`\\b(?:${[...Vt].join("|")})\\b`);function Zt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function Qt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Zt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function eo(e){let t=e.code;return"string"==typeof t?t:void 0}function to(e){if(void 0===e.cause)return"";let t=Qt(e);if(t===e)return"";let o=eo(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function oo(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=>Vt.has(e))||!(t.length>0)&&(!!o.some(e=>Xt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function no(e){return e.req.path.startsWith("/v1/messages")}function ro(e,t){if(no(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}function ao(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 io(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",t.message))}function so(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=e.message),t}function lo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=m.getActiveSpan();if(!a)return;let i=Ct({endpointType:$t(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});Pt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function co(e,t,o){let n=e.get("requestId"),r=he.completionCallbacks.get(n);r&&(he.logError(r,t,o),he.completionCallbacks.delete(n))}async function uo(e,t){let o=m.getActiveSpan(),n=e.get("requestId"),r=he.completionCallbacks.get(n);r&&(he.logRateLimit(r,t.response),he.completionCallbacks.delete(n)),Ce.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=ro(a,e),s=ao(i);return o?.setStatus({code:u.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),io(o,s),et(y.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...so(s)}),lo({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,o)=>{po.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const po=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;function mo(e,t){(function(e){return"object"==typeof e&&!!e&&Gt.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",oe.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function fo(e){return oo(e)||function(e){return zt(e)||e instanceof Error&&zt(e.cause)}(e)}async function ho(e,t){if(mo(m.getActiveSpan(),t),t instanceof Jt&&429===t.response.status)return uo(e,t);if(t instanceof SyntaxError){m.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),et(y.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=no(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 co(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Jt)return async function(e,t){let o=m.getActiveSpan(),n=await t.response.text(),r=ro(n,e),a=ao(r);return co(e,t.response.status,a.message??t.message),o?.setStatus({code:u.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),io(o,a),et(y.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...so(a)}),lo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&Lt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Ct({endpointType:$t(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message}),e.json(r,t.response.status)}(e,t);if(function(e){return e instanceof Wt||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Wt}(t))return function(e,t){let o=m.getActiveSpan();o?.setStatus({code:u.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.";et(y.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=no(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return co(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(fo(t))return function(e,t){let o=m.getActiveSpan();o?.setStatus({code:u.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?Qt(t):void 0,r=(n&&eo(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.";et(y.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=no(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return co(e,503,t instanceof Error?`${t.message}${to(t)}`:i),e.json(s,503)}(e,t);let n=m.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:u.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),et(y.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Lt({route:e.req.path,statusCode:500,errorClass:r.name,signature:Ct({endpointType:$t(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${to(r)}`}),co(e,500,r.message),o.error(r);let a=no(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const go=async()=>{let e=`${wt}/copilot_internal/v2/token`,t=oe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await it({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:bt(oe),signal:o.signal});try{if(!t.ok)throw new Jt("Failed to get Service token",t);return await t.json()}catch(e){throw tt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function _o(){let e=`${wt}/user`,t=oe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await it({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${oe._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Jt("Failed to get GitHub user",t);return await t.json()}catch(e){throw tt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let yo=null;function wo(){return"foundry"===oe.provider?Promise.resolve():(yo||=go().then(({token:e})=>{oe._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{yo=null}),yo)}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 ko=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function vo(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 xo(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,o]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:o||t}});return t.length>0?t:void 0}const $o=e=>({"api-key":e.apiKey,"Content-Type":"application/json",accept:"*/*"}),To=e=>`${e.anthropicEndpoint}/anthropic`,Ao=(e,t)=>({"x-api-key":e.apiKey,"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),So=e=>"foundry"===e.provider;function Eo(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const Oo=e=>So(e)?(e=>`${e.endpoint}/openai/v1`)(Eo(e)):ht(e),Co=(e,t=!1)=>So(e)?$o(Eo(e)):gt(e,t),Io=e=>So(e)?!!e.foundry?.apiKey:!!e._t1;const Po=[{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}],No={context:128e3,output:16384};function Ro(e){return Po.find(({pattern:t})=>t.test(e))??No}const qo=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,jo=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function Do(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 Mo(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=Yt(o,oe.timeoutMs);try{let{response:n,span:r}=await it({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:$o(e),signal:o.signal});try{if(!n.ok)throw new Jt("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 tt(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function Fo(e){return{object:"list",data:(e.deployments??await Mo(e)).map(e=>function(e){let{model:t}=e;if(!qo.test(t))return(e=>/embedding/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/embeddings"],capabilities:{family:t,object:"model_capabilities",type:"embeddings",tokenizer:"cl100k_base",supports:{}}}:(e=>/^claude/i.test(e))(t)?Do(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):jo(t)?Do(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:Ro(t)}):Do(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:Ro(t)})}(e)).filter(e=>void 0!==e)}}const Ho=async()=>{if(So(oe)&&oe.foundry)return Fo(oe.foundry);try{return await Uo()}catch(e){if(e instanceof Jt&&401===e.response.status)return await wo(),Uo();throw e}},Uo=async()=>{let e=`${Oo(oe)}/models`,t=Co(oe),o=oe.timeoutMs,n=new AbortController,r=Yt(n,o);try{let{response:o,span:r}=await it({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Jt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw tt(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const Bo=[{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"}],Lo="claude-haiku-4.5",zo={haiku:Lo,"sonnet-4.6":"claude-sonnet-4.6","sonnet-4.5":"claude-sonnet-4.5","sonnet-4":"claude-sonnet-4","opus-4.7":"claude-opus-4.7","opus-4.6":"claude-opus-4.6","opus-4.5":"claude-opus-4.5",opus:"claude-opus-4.5"};function Go(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of Bo)if(t.pattern.test(e))return t.family;return null}(n);if(!a)return null;let i=n.replace(/-\d{8}(?::.*)?$/,""),s=r?`-${r}`:"";for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,""),o=`${i}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2")===o)return e}return function(e,t,o=null){let n=zo[e];if(!n)return null;if(o){let e=`${n}-${o}`;if(t.includes(e))return e}if(t.includes(n))return n;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let n=o?`${e}-${o}`:e;if(t.includes(n))return n}return null}(a,t,r)}const Ko=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Jo(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=Ko.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=Ko.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}let Wo;const Yo=new Map;function Vo(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 Xo(){Wo=await Q({provider:"copilot"},Ho)}const Zo=()=>void 0!==Wo;function Qo(e,t,o=Date.now()){let n=function(e,t=Date.now()){let o=e.get("retry-after-ms");if(null!==o&&Number.isFinite(Number(o))&&Number(o)>=0)return Number(o);let n=e.get("retry-after");if(null!==n){let e=Number(n);if(""!==n.trim()&&Number.isFinite(e)&&e>=0)return 1e3*e;let o=Date.parse(n);if(!Number.isNaN(o))return Math.max(0,o-t)}return 1e4}(t,o);return Yo.set(e,o+n),n}function en(e,t,o){let{model:n,reason:r}=o,a=m.getActiveSpan();return a?.setAttribute("copilot_api.fallback.upstream","copilot"),a?.setAttribute("copilot_api.fallback.reason",r),a?.setAttribute("copilot_api.fallback.foundry_model",n),Q({provider:"copilot",models:Wo,rerun:"foundry_429"===r},()=>t(e))}async function tn(e,t){if(!Zo()||!So(oe))return t(e);let n=await async function(e){try{let t=await e.req.json();return"string"==typeof t.model?t.model:void 0}catch{return}}(e);if(!n||!function(e){let t=Wo?.data.map(e=>e.id)??[];return t.includes(e)?e:Go(e,t)??void 0}(n))return t(e);if(function(e,t=Date.now()){let o=Yo.get(e);return void 0!==o&&(t<o||(Yo.delete(e),!1))}(n))return en(e,t,{model:n,reason:"breaker_open"});try{return await t(e)}catch(r){if(!(e=>e instanceof Jt&&429===e.response.status&&void 0!==e.outgoingBody)(r))throw r;let a=Qo(n,r.response.headers);return await(r.response.body?.cancel()),m.getActiveSpan()?.setAttribute("copilot_api.fallback.retry_after_ms",a),o.info(`Foundry rate-limited ${n}; serving it from Copilot for ${Math.ceil(a/1e3)}s`),en(e,t,{model:n,reason:"foundry_429"})}}const on=e=>new Promise(t=>{setTimeout(t,e)}),nn=e=>null==e;async function rn(){let e=await Ho();oe.models=e,Zo()&&await Xo().catch(e=>{o.warn("Failed to refresh the Copilot fallback models:",e)})}const an=()=>{oe._v1="1.140.0-insider"};var sn=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let ln,cn,un,pn,dn,mn=!1,fn=!1,hn=!1;function gn(){return _n()?dn:void 0}function _n(){return void 0!==dn&&Date.now()-dn.at<6e4}function yn(){return hn?"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 wn=()=>a.readFile(Y.GITHUB_TOKEN_PATH,"utf8");function bn(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";oe._t1=void 0,dn={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.`),Ne.add(1,{reason:r,success:"false"}),Re.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:u.ERROR,message:n.message}),t.recordException(n),We.record(performance.now()-a,{reason:r}),et(y.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 kn(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;oe._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:u.ERROR,message:s.message}),t.recordException(s),Re.add(1,{reason:r}),We.record(performance.now()-a,{reason:r}),et(y.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const vn=async(e=5,t=1e3,n="scheduled")=>mn?(o.debug("Token refresh already in progress, coalescing"),cn):(mn=!0,cn=ve.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 go();return oe._t1=t,dn=void 0,fn&&void 0===ln&&(o.info("Token refresh recovered, resuming scheduled refresh"),$n(s)),o.debug("Service token refreshed successfully"),oe.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Ne.add(1,{reason:n,success:"true"}),We.record(performance.now()-a,{reason:n}),void et(y.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Jt&&(401===s.response.status||403===s.response.status))return void bn({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),Ne.add(1,{reason:n,success:"false"}),l)return void kn({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(),mn=!1,cn=void 0}}),cn);async function xn(){return!!oe._t1||!_n()&&(void 0!==dn&&hn&&await async function(){if(cn)return;let e=(await wn().catch(()=>{}))?.trim();e&&e!==oe._t2?.trim()&&(oe._t2=e,o.info("Picked up re-authenticated Auth token from disk"),oe.showToken&&o.info("Auth token:",e))}(),await vn(3,250,"on-demand"),!!oe._t1)}function $n(e){ln&&clearInterval(ln);let t=Math.max(1e3*(e-60),6e4);ln=setInterval(()=>{vn(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function Tn(e){try{let t=await wn();if(t&&!e?.force)return oe._t2=t,hn=!0,oe.showToken&&o.info("Auth token:",t),void await An();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=oe.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${kt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:vt,scope:xt}),signal:e.signal});if(!t.ok)throw new Jt("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{f.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=_.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",h(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 sn("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=oe.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${kt}/login/oauth/access_token`,{method:"POST",headers:ct(),body:JSON.stringify({client_id:vt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await on(t),o.error("Failed to poll access token:",await n.text());continue}let r=await n.json();if(o.debug("Polling access token response:",r),r.error){if("expired_token"===r.error)throw new sn("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new sn("Authorization was denied. Please run the command again and approve the request.");"authorization_pending"!==r.error&&"slow_down"!==r.error&&o.warn(`Unexpected auth error: ${r.error}`),await on(t);continue}if(r.access_token)return r.access_token;await on(t)}catch(e){if(e instanceof sn)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await on(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(Y.GITHUB_TOKEN_PATH,e,{mode:384}))(r),oe._t2=r,hn=!0,oe.showToken&&o.info("Auth token:",r),await An()}catch(e){throw e instanceof Jt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function An(){let e=await _o();o.success(`Authenticated as ${e.login}`)}async function Sn(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),oe.showToken=e.showToken,await V(),await Tn({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 En=e({meta:{name:"auth",description:"Run authentication flow"},args:{verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"show-token":{type:"boolean",default:!1,description:"Show token on auth"}},run:({args:e})=>Sn({verbose:e.verbose,showToken:e["show-token"]})}),On=.01,Cn=864e5,In=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Pn=new Intl.NumberFormat("en-US"),Nn=e=>In.format(e*On),Rn=e=>e.credits_used??e.entitlement-e.remaining,qn=(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())/Cn;if(r<.5)return;let a=Rn(e),i=a*On/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*On,c=new Date(n.getTime()+l/i*Cn);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},jn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Pn.format(Rn(e))} of ${Pn.format(e.entitlement)} used`:"n/a",Dn=e=>e.padEnd(14),Mn=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Dn("AI credits")}unlimited`);else{let e=Rn(o),t=o.percent_remaining;n.push(`${Dn("AI credits")}${Nn(e)} / ${Nn(o.entitlement)} ${t.toFixed(1)}% left`,`${Dn("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Dn("")}${Pn.format(e)} of ${Pn.format(o.entitlement)} credits`)}if(n.push("",`${Dn("Chat")}${jn(e.quota_snapshots.chat)}`,`${Dn("Completions")}${jn(e.quota_snapshots.completions)}`,"",`${Dn("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Cn)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=qn(o,e.quota_reset_date,t);r&&n.push(`${Dn("Burn rate")}~${In.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?`${Pn.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Dn("Overage")}${a}`)}return n.join("\n")},Fn=async()=>{let e=`${wt}/copilot_internal/user`,t=oe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await it({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:bt(oe),signal:o.signal});try{if(!t.ok)throw new Jt("Failed to get usage",t);return await t.json()}catch(e){throw tt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Hn=()=>_.stdout.write("[2J[H"),Un=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Bn=async()=>{let e=await Fn();return Mn(e)},Ln=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 V(),await Tn(),!e.watch){try{o.box(await Bn())}catch(e){o.error("Failed to fetch usage:",e),_.exit(1)}_.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=_.stdout.isTTY,r=()=>_.exit(0);for(_.on("SIGINT",r),_.on("SIGTERM",r);;){try{let e=await Bn();n&&Hn(),o.box(e),o.log(Un(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),zn=q(h);async function Gn(){let e="win32"===_.platform?"where.exe":"which";try{return await zn(e,["tailscale"]),!0}catch{return!1}}async function Kn(){try{let{stdout:e}=await zn("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Jn(e){return e.replace(/\.$/,"")}async function Wn(){let e=await Kn();if(e?.Online)return Jn(e.DNSName)}const Yn=q(h),Vn=e=>`[1m${e}[0m`,Xn=e=>`[2m${e}[0m`,Zn=e=>`[36m${e}[0m`,Qn=e=>`[32m${e}[0m`,er=e=>`[31m${e}[0m`,tr=e=>`[33m${e}[0m`,or=Xn(" ─────────────────────────────────────────────────────────────"),nr=s.join(Y.APP_DIR,"certs","tailscale"),rr=s.join(nr,"cert.pem"),ar=s.join(nr,"key.pem"),ir={certDir:nr,certPath:rr,keyPath:ar};function sr(){switch(_.platform){case"darwin":return[` ${Xn("Install Tailscale for macOS:")}`,` ${Zn("https://tailscale.com/download/mac")}`,` ${Xn("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${Xn("After installing, open the Tailscale app and sign in.")}`,` ${Xn("Then re-run this command.")}`].join("\n");case"linux":return[` ${Xn("Install Tailscale for Linux:")}`,` ${Zn("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Zn("sudo tailscale up")}`,` ${Xn("or")} ${Zn("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${Xn("Install Tailscale for Windows:")}`,` ${Zn("https://tailscale.com/download/windows")}`,"",` ${Xn("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${Xn("Install Tailscale:")} ${Zn("https://tailscale.com/download")}`}}function lr(){let e=[` ${er("Tailscale is not running.")}`];return"darwin"===_.platform?e.push(` ${Xn("Open the Tailscale app from Applications and sign in.")}`,` ${Xn("Download:")} ${Zn("https://tailscale.com/download/mac")}`):"win32"===_.platform?e.push(` ${Xn("Open the Tailscale app and sign in.")}`,` ${Xn("Download:")} ${Zn("https://tailscale.com/download/windows")}`):e.push(` ${Xn("Connect with:")} ${Zn("sudo tailscale up")}`),e.push("",` ${Xn("Then re-run this command.")}`),e.join("\n")}async function cr(){try{return await a.access(rr),await a.access(ar),!0}catch{return!1}}function ur(e){console.log(""),console.log(or),console.log(` ${Vn("Claude Cowork Setup")} ${Xn("— Diagnostic")}`),console.log(or),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?Qn("✅"):"missing"===n.status?er("❌"):tr("❓");let r=n.detail?Xn(` ${n.detail}`):"";t.push(` ${e} ${o}${r}`)}return t}(e))console.log(t);console.log("");let t=Object.values(e).filter(e=>"missing"===e.status);0===t.length?console.log(` ${Qn("All checks passed.")}`):console.log(` ${er(`${t.length} issue(s).`)} Run ${Zn("copilot-api cowork-setup install")} to fix.`),console.log("")}const pr={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},dr=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Gn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return ur(e),console.log(""),console.log(sr()),void console.log("");let o=await Kn();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},ur(e),console.log(lr()),void console.log("");let n=Jn(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await cr();e["tailscale-cert"]=r?{status:"ok",detail:rr}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),ur(e)}(),_.exit(0)}}),mr=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:pr},async run({args:e}){await async function(e){if(console.log(""),console.log(or),console.log(` ${Vn("Claude Cowork Setup")} ${Xn("— Install")}`),console.log(or),console.log(""),!await Gn())return console.log(` ${er("Tailscale is not installed.")}`),console.log(""),console.log(sr()),console.log(""),console.log(` ${Xn("After installing, run")} ${Zn("tailscale up")} ${Xn("to connect, then re-run this command.")}`),void console.log("");let t=await Kn();if(!t||!t.Online)return console.log(lr()),void console.log("");let n=Jn(t.DNSName);if(console.log(` ${Xn("Tailscale hostname:")} ${Vn(n)}`),console.log(""),console.log(` ${Vn("Generating TLS certificate via Tailscale…")}`),console.log(` ${Xn("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Zn(`$ tailscale cert --cert-file ${rr} --key-file ${ar} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(nr,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Yn("tailscale",["cert","--cert-file",rr,"--key-file",ar,n]),console.log(` ${Qn("✓ Certificate generated")}`)}catch(e){let t=e instanceof Error?e.message:String(e);return void o.error(`Failed to generate cert: ${t}`)}console.log(""),console.log(or),console.log(` ${Vn("Next steps")}`),console.log(or),console.log(""),console.log(` ${Vn("1.")} Start the proxy:`),console.log(` ${Zn("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Vn("2.")} In Cowork ${Xn("→")} Settings ${Xn("→")} Inference Provider, set:`),console.log(` ${Vn("inferenceGatewayBaseUrl")} = ${Zn(`https://${n}:<port>`)}`),console.log(` ${Xn("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Vn("3.")} Restart Cowork ${Xn("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${Xn("For Cowork's own configuration docs, see:")}`),console.log(` ${Zn("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),_.exit(0)}}),fr=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:pr},async run({args:e}){await async function(e){if(console.log(""),console.log(or),console.log(` ${Vn("Claude Cowork Setup")} ${Xn("— Revert")}`),console.log(or),console.log(""),!await cr())return console.log(` ${Xn("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${Vn("Remove Tailscale cert files:")}`),console.log(` ${Xn(rr)}`),console.log(` ${Xn(ar)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(nr,{recursive:!0}),console.log(` ${Qn("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${Xn("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),_.exit(0)}}),hr=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:dr,install:mr,revert:fr}}),gr=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function _r(e){if(!gr.test(e))return e;let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],a=r.match(/^\[[0-9;]*[a-z]/i);t+=a?r.slice(a[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function yr(e){return"string"==typeof e?_r(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=yr(n);!t&&r!==n&&(t=e.slice(0,o)),t?.push(r)}return t??e}(e):e&&"object"==typeof e?function(e){let t,o=Object.entries(e),n="thinking"===e.type;for(let e=0;e<o.length;e++){let[r,a]=o[e],i=!n||"thinking"!==r&&"signature"!==r?yr(a):a;!t&&(i!==a||"__proto__"===r)&&(t=wr({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=wr({},o,o.length),t.properties={}),t??e}(e):e}function wr(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const br="x-copilot-api-self-test",kr=R();const vr=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function xr(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 $r(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();rt.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:u.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(Te.add(1,d),Le.record(s,d),c>=400&&Ae.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&&(Se.add(e.inputTokens,t),Ve.record(e.inputTokens,t)),e.outputTokens&&(Ee.add(e.outputTokens,t),Xe.record(e.outputTokens,t)),e.cachedTokens&&Oe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&he.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const Tr=1048576;const Ar=async()=>{if(!ee())return ve.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),Qe.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Fe.add(1,{result:"rejected"}),new Jt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Fe.add(1,{result:"approved"})}finally{e.end()}})};async function Sr(e){if(Io(oe)||await xn())return null;let t=gn();return t?(m.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${yn()}`,type:"authentication_error"}},401)):(m.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 Er(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 Or(e,t){void 0!==t.prompt_tokens&&e.setAttribute("copilot_api.input_tokens",t.prompt_tokens),void 0!==t.completion_tokens&&e.setAttribute("copilot_api.output_tokens",t.completion_tokens),void 0!==t.total_tokens&&e.setAttribute("copilot_api.total_tokens",t.total_tokens)}var Cr=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Ir(e){if(!e||"string"!=typeof e)throw new Cr("Model name is required and must be a string");if("foundry"===oe.provider)return e;if(!oe.models?.data)throw new Cr("Models not available. Please try again later.",503);let t=oe.models.data.map(e=>e.id);if(t.includes(e))return e;let o=Go(e,t);if(!o)throw Ie.add(1,{requested_model:e}),new Cr(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Pr(e){let t=oe.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===oe.provider?jo(e):/gpt-[\d.]+-codex/i.test(e)}async function Nr(e){if(void 0===e.rateLimitSeconds||ee())return;let t=e.rateLimitSeconds;return ve.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"),Ce.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Jt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Ce.add(1,{action:"waited",source:"local"}),Ke.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await on(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Rr=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function qr(e){if(e instanceof Rr)return{type:e.type,message:e.message};if(e instanceof Jt){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 jr(e,t){let{type:n,message:r}=qr(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 Dr(e,t){let{type:n,message:r}=qr(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 Mr(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 Fr(e,t,o){return Math.min(Math.max(e,t),o)}function Hr(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 Hr(JSON.parse(r),t+1)}catch{return null}}function Ur(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Mr(o.capabilities.supports.min_thinking_budget),r=Mr(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Mr(o.capabilities.limits?.max_output_tokens)??void 0}}function Br(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Fr(Mr(e.requestedBudget)??o,o,n),a=Mr(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 Lr(e,t){if(nn(e.thinking_budget))return e;let o=Ur(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Br({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 zr(e){return"invalid_thinking_budget"===Hr(e)}async function Gr(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(nn(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(!zr(i))return null;let l=Ur(n,t.model);return l?function(e,t){let o=Br({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=Mr(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 Kr(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 Jr(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const Wr=new Map,Yr=new Map,Vr=new Set;let Xr,Zr,Qr;function ea(e){return!e.closed&&!e.destroyed}function ta(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new C(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return Wr.set(t,Date.now()),Ue.add(1,{event:"created",origin:e}),et(y.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=Vr.has(t);Ue.add(1,{event:"goaway",origin:e}),et(i?y.WARN:y.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}),Yr.delete(t),Vr.delete(t),Wr.delete(t),ea(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function oa(e,t){if(!oe.connectivity.h2)return;if(Xr&&Xr!==e&&function(){for(let e of[...Yr.keys(),...Vr])ea(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Yr.clear(),Vr.clear(),Wr.clear()}(),Xr=e,t?.fresh){let t=ta(e);return Vr.add(t),t}let n=Date.now();for(let[t]of Yr)if(n-(Wr.get(t)??0)>=6e5)Yr.delete(t),Wr.delete(t),ea(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ue.add(1,{event:"rotated",origin:e}),et(y.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(ea(t))return Yr.delete(t),Vr.add(t),t;Yr.delete(t),Wr.delete(t)}let r=ta(e);return Vr.add(r),r}function na(e){e&&Vr.delete(e)&&(ea(e)?Yr.set(e,Date.now()):Wr.delete(e))}function ra(){Qr||(Qr=setInterval(()=>{!function(){let e=Date.now(),t=oe.connectivity.h2Keepalive,n=Yr.size;for(let[r,a]of Yr)e-a<6e4||t&&n<=1||(Yr.delete(r),Wr.delete(r),n--,ea(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ue.add(1,{event:"idle_reaped",origin:Xr??""}),et(y.INFO,"INFO",`HTTP/2 idle connection reaped for ${Xr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Xr??""}))}()},3e4),Qr.unref())}function aa(){Zr||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Zr=setInterval(()=>{(async function(){if(0===Yr.size&&0===Vr.size){if(Xr){let e=ta(Xr);Yr.set(e,Date.now())}return}let e=[...Yr.keys()];for(let t of e)Yr.delete(t);await Promise.allSettled(e.map(async e=>{if(ea(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:gt(oe)});await n.dump(),He.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Yr.set(e,Date.now())}catch(t){He.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ue.add(1,{event:"error",origin:Xr??""}),Wr.delete(e),ea(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Wr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Zr.unref(),ra())}function ia(e){return e.max_completion_tokens??e.max_tokens}async function sa(e,t,o){try{if(!e.ok)throw new Jt("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&&Or(t,n.usage),n}catch(e){throw tt(t,e),e}finally{t.end()}}const la=e=>So(oe)?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=ia(e);return null==i?a:{...a,max_completion_tokens:i}}(e,oe.models),ca=e=>So(oe)?e:yr(e),ua=async e=>{let t=ca(e);try{return await pa(t)}catch(e){if(e instanceof Jt&&401===e.response.status)return await wo(),pa(t);let n;if(e instanceof Jt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Gr({payload:t,error:e,models:oe.models,errorBodyText:n});if(r)return e instanceof Jt&&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 pa(ca(r));throw e}},pa=async e=>{if(!Io(oe))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={...Co(oe,t),"X-Initiator":o?"agent":"user"},r=Oo(oe),a=`${r}/chat/completions`,i=oe.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":ia(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=oa(r,{fresh:t>0}),s=new AbortController,u=Yt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await st({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}),m=new Response(p,{status:r,headers:u});if(e.stream){if(!m.ok)throw d.end(),new Jt("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:F(m),span:d,release:()=>na(o)}}try{return await sa(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{na(o)}}catch(e){if(na(o),await Kt(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},da=new Map;const ma=["none","minimal","low","medium","high","xhigh","max"];function fa(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=ma.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=ma.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 ha(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:[];da.set(e.model,r);let a=fa(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 ga(e,t,o){try{if(!e.ok)throw new Jt("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&&Or(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 tt(t,e),e}finally{t.end()}}const _a=async e=>{let t=So(oe),o=t?function(e){let t=da.get(e.model);return t?fa(e,t):e}(e):e;try{return await ya(o)}catch(e){if(e instanceof Jt&&401===e.response.status)return await wo(),ya(o);if(t&&e instanceof Jt&&400===e.response.status){let t=ha(o,await e.response.clone().text().catch(()=>{}));if(t)return ya(t)}throw e}},ya=async e=>{if(!Io(oe))throw Error("Service token not found");let t=So(oe)?e:yr(e),o={...Co(oe),"X-Initiator":"agent"},n=Oo(oe),r=`${n}/responses`,a=oe.timeoutMs,i=JSON.stringify(t),s={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":a,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let l=oa(n,{fresh:e>0}),c=new AbortController,u=Yt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await st({spanName:"copilot POST /responses",url:r,target:"responses",headers:o,body:i,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...s,"copilot_api.h2.retry_attempt":e},dispatcher:l}),m=new Response(p,{status:n,headers:u});if(t.stream){if(!m.ok)throw d.end(),new Jt("Failed to create responses",m,{outgoingBody:i,outgoingHeaders:o});return{events:F(m),span:d,release:()=>na(l)}}try{return await ga(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{na(l)}}catch(t){if(na(l),await Kt(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},wa=e=>Object.hasOwn(e,"output");function ba(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens,...t.input_tokens_details&&{prompt_tokens_details:{cached_tokens:t.input_tokens_details.cached_tokens}}}:null}var ka=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const va=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 xa(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new ka(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new ka(`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=>Ta(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=Aa(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Ta(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:Ta(o.content)})}return t}(e.messages);if(0===o.length)throw new ka("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),$a(e.temperature)&&(n.temperature=e.temperature),$a(e.top_p)&&(n.top_p=e.top_p),$a(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),$a(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 $a(e){return null!=e}function Ta(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Aa(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 ka(`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 Sa(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 Ea(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 Oa(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 Ca(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Ia(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Ca(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Oa(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),[Oa(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Pa(e,t){let o=[Oa(e,{},Ea(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=Sa(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Na(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:[Oa(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Ia(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Ca(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Oa(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Pa(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 Ra="openai_responses";function qa(e){let t=performance.now(),n=ve.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),xa(e)}finally{t.end()}});Je.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!va.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 ja(e){let t=performance.now(),o=ve.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:Ea(e,n.length>0)}]};return e.usage&&(r.usage=Sa(e.usage)),r}(e)}finally{t.end()}});return Je.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Da(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=Sa(t.usage);a.tokenUsage=Er(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?(m.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(ja(t))}async function Ma(e,t,n){let r;try{r=qa(t)}catch(t){if(t instanceof ka)return m.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}),oe.manualApprove&&!n.isSelfTest&&await Ar();let a=await Sr(e);if(a)return a;let i=performance.now(),s=await _a(r),l=performance.now()-i;if(ze.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),wa(s))return Da(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 M(e,async t=>{let n=null,a=0,s=performance.now(),m=Kr(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++,Me.add(1,{model:r.model,endpoint_type:Ra});let c=ba(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Er(c),t._d1=l,e.set("requestData",t)}let u=Na(s,d);if(u.error)throw new Rr(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:Ra};Ge.record(performance.now()-s,u),Ze.record(a,u),Jr(e,i)}catch(o){throw ot(u,e.get("requestSpan"),o),await Dr(t,o),o}finally{n&&Or(u,n),u.end(),p()}let f=e.get("requestId");f&&he.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Fa(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 Ha(e){let t=!0===e.get("isSelfTest");t||await Nr(oe);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return ve.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Ir(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),Pe.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 Cr)return m.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(Pr(n.model))return Ma(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),oe.manualApprove&&!t&&await Ar(),"foundry"!==oe.provider&&(n=function(e){if(!nn(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!nn(e.max_tokens))return e;let t=(oe.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=Lr(n,oe.models)),nn(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Sr(e);if(r)return r;let a=performance.now(),i=await ua(n),s=performance.now()-a;if(ze.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Ua(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Er(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 M(e,async t=>{let o={value:null},r=0,i=performance.now(),p=Kr(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Me.add(1,{model:n.model,endpoint_type:"openai"}),i=Fa(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Er(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(Ge.record(c,u),Ze.record(r,u),Jr(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Er(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw ot(c,e.get("requestSpan"),o),await Dr(t,o),o}finally{o.value&&Or(c,o.value),c.end(),u()}let d=e.get("requestId");d&&he.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Ua=e=>Object.hasOwn(e,"choices"),Ba=new j;Ba.post("/",async e=>{try{return await Ha(e)}catch(t){return await ho(e,t)}});const La=new j;La.post("/",async e=>{try{let t=await e.req.json();try{t.model=Ir(t.model)}catch(t){if(t instanceof Cr)return m.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=await Sr(e);if(o)return o;let n=performance.now(),r=await(async e=>{if(!Io(oe))throw Error("Service token not found");let t=`${Oo(oe)}/embeddings`,o=Co(oe),n=oe.timeoutMs,r=new AbortController,a=Yt(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await it({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1}});try{if(!n.ok)throw new Jt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw tt(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),a=performance.now()-n;ze.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Er(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await ho(e,t)}});const za=new j;let Ga=null,Ka=null;function Ja(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function Wa(e){return!Ja(e)}za.get("/",async e=>{let t,o=function(){if(So(oe))return Io(oe)?"valid":"missing";let e=oe._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=Ga;return t&&e-t.timestamp<3e4?{result:t.result}:Ka||(Ka=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${Oo(oe)}/models`,n=await fetch(t,{method:"GET",headers:Co(oe),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Ga={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Ga={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),Ka=null}})(),Ka)}();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.8",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 Ya=new H(B),Va={...U["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Xa(e){try{return Ya.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function Za(e){let t=0;for(let o of e)switch(o.type){case"text":t+=Xa(o.text)*Va.contentMultiplier;break;case"tool_use":t+=Xa(o.name+JSON.stringify(o.input))*Va.contentMultiplier;break;case"tool_result":o.content&&(t+=Xa("string"==typeof o.content?o.content:JSON.stringify(o.content))*Va.contentMultiplier);break;case"thinking":t+=Xa(o.thinking)*Va.contentMultiplier;break;case"image":t+=1600}return t}function Qa(e){let t=0,o=e.properties;if(!o)return t;let n=Object.entries(o);for(let[e,[o,r]]of n.entries()){if(t+=0===e?Va.perFirstProp:Va.perAdditionalProp,t+=Xa(o),r.description&&(t+=Va.perPropDesc+Xa(r.description)),r.enum&&Array.isArray(r.enum)){t+=Va.perEnum;for(let e of r.enum)t+=Xa(String(e))}if("object"===r.type&&r.properties&&(t+=Va.perNestedObject,t+=Qa(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=Va.perArrayOfObjects,t+=Qa(e))}}return t}function ei(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")};return e.thinking&&(o["copilot_api.thinking.type"]=e.thinking.type,"budget_tokens"in e.thinking&&e.thinking.budget_tokens&&(o["copilot_api.thinking.budget_tokens"]=e.thinking.budget_tokens)),e.output_config?.effort&&(o["copilot_api.output_config.effort"]=e.output_config.effort),o}function ti(e,t,o){let n=ei(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const oi=async(e,t,n)=>{try{return await ni(e,t)}catch(r){if(r instanceof Jt&&401===r.response.status)return await wo(),ni(e,t);if(r instanceof Jt&&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}`),ni(i,t)}throw r}};const ni=async(e,t)=>{if(!Io(oe))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=So(oe)&&oe.foundry?{baseUrl:To(oe.foundry),headers:Ao(oe.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={...yt(oe,t,r),"X-Initiator":"agent"};return{baseUrl:ht(oe),headers:a,cleanPayload:n}}(yr(e),t),a=`${o}/v1/messages`,i=oe.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",...ei(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){let t=oa(o,{fresh:e>0}),c=new AbortController,u=Yt(c,i);try{let{statusCode:o,headers:u,body:p,span:d}=await st({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 Jt("Failed to create anthropic messages",m,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:F(m),span:d,release:()=>na(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&&Or(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(),na(t)}}catch(o){if(na(t),await Kt(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ri=new Set(["low","medium","high","max","xhigh"]);function ai(e){let t=e.output_config?.effort;if(!t)return e;let n=oe.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Jo(t,n);if(!r||!ri.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=m.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 ii(e,t,n){if("foundry"===oe.provider)return ai(e);let r=t.includes(e.model)?e.model:Go(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=Go(e,t);if(!n)return null;let r=new Set(t);if(o.context1m){let e=function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,r);if(e)return e}if(o.effort){let e=function(e,t,o){let n=null;if("high"===o?n="high":("max"===o||"xhigh"===o)&&(n="xhigh"),!n)return null;let r=`${e}-${n}`;return t.has(r)?r:null}(n,r,o.effort);if(e)return e}return null}(a.model,t,{context1m:n.context1m,effort:a.output_config?.effort}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=m.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 ai(s)}const si=e=>"object"==typeof e&&!!e&&!Array.isArray(e),li=["properties","patternProperties","$defs","definitions"],ci=["items","additionalProperties","propertyNames","contains","not","if","then","else"],ui=["anyOf","allOf","oneOf","prefixItems"];const pi=()=>["string","number","boolean"].map(e=>({type:e})),di=()=>({anyOf:[...pi(),{type:"array",items:{anyOf:pi()}},{type:"object"}]}),mi=e=>!0===e||si(e)&&0===Object.keys(e).length,fi=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function hi(e,t){let o={...e};for(let e of li){let n=o[e];si(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,si(o)?hi(o,t):o])))}for(let e of ci){let n=o[e];si(n)&&(o[e]=hi(n,t))}for(let e of ui){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>si(e)?hi(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(si(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>mi(e)?di().anyOf:si(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)),fi(o)&&(!("items"in o)||mi(o.items))&&(t.add("items"),o.items=di()),mi(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function gi(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=yi(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function _i(e){return wi(yi(e))}function yi(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 wi(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function bi(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>wi(e)).filter(Boolean).join("\n\n")}const ki=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),vi=new Set(["text","image"]);function xi(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);vi.has(e)||t.add(`block:tool_result:${e}`)}}const $i=new Set;function Ti(e,t){e.setAttribute("copilot_api.translation.system_message_count",t.filter(e=>"system"===e.role).length);let o=function(e){let t=new Set;for(let o of e){if(t.size>=20)break;let e=String(o.role).slice(0,64),n=ki.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&&xi(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($i.size>=100)break;$i.has(o)||($i.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 Ai=e=>P("sha256").update(e).digest("hex").slice(0,12);function Si(e,t){e.setAttribute("copilot_api.translation.system_hash",Ai(t.system)),e.setAttribute("copilot_api.translation.tools_hash",Ai(JSON.stringify(t.tools??[])))}function Ei(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Oi(e){return e.toLowerCase().startsWith("claude-")}function Ci(e,t){let o={model:e.model,messages:Ii(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:Fi(e.tools,e.model),tool_choice:Hi(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Ur(t,o.model);if(r){let a="enabled"===n.type&&"number"==typeof n.budget_tokens?n.budget_tokens:function(e,t,o){let n=function(e,t){return"max"===e||"xhigh"===e?t:"high"===e?16e3:"medium"===e?8e3:1024}(e,o.max),r=Mr(t),a=r&&r>1?r-1:o.min;return Fr(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Lr({...o,thinking_budget:a},t)}}return o}function Ii(e,t){let{leadingSystemTexts:o,messages:n}=gi(e),r=function(e,t){let o=bi(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=_i(e);if(!t)break;Pi(r)?a.push(t):Ni(r,t);break}case"user":r.push(...Ri(e));for(let e of a)Ni(r,e);a=[];break;case"assistant":r.push(...qi(e))}for(let e of a)Ni(r,e);return r}function Pi(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function Ni(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 Ri(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:Mi(e.content)});n.length>0&&t.push({role:"user",content:Mi(n)})}else t.push({role:"user",content:Mi(e.content)});return t}function qi(e){let t=function(e){return{reasoning_text:Di(e.reasoning_text),reasoning_opaque:Di(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Mi(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:Mi(e.content),...t}]}const ji=32768;function Di(e){if("string"==typeof e)return e.length<=ji?e:e.slice(0,ji)}function Mi(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 Fi(e,t){if(!e)return;let o=e.filter(Wa),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:hi(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&&m.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function Hi(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 Ui(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 Bi(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Li(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 zi=new Set(["low","medium","high","max","xhigh"]);function Gi(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&&zi.has(e)?e:null)(Jo(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 Ki(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 Ji=/[^\w-]/g;function Wi(e){return e.replaceAll(Ji,"_")}function Yi(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=Gi(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:Ki(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:Wi(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Wi(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Vi(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t)return"thinking must be an object";let o=t,n=new Set(["enabled","adaptive","disabled"]);return"string"==typeof o.type&&n.has(o.type)?"enabled"!==o.type||void 0===o.budget_tokens||"number"==typeof o.budget_tokens&&Number.isFinite(o.budget_tokens)&&!(o.budget_tokens<=0)&&Number.isInteger(o.budget_tokens)?null:"thinking.budget_tokens must be a positive integer":"thinking.type must be one of: enabled, adaptive, disabled"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t)return"output_config must be an object";let o=t;if(void 0===o.effort)return null;let n=new Set(["low","medium","high","max","xhigh"]);return"string"==typeof o.effort&&n.has(o.effort)?null:"output_config.effort must be one of: low, medium, high, max, xhigh"}(e)}function Xi(e,t,o=400){return m.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function Zi(e,t){return ve.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),ti(n,t,e.req.header("anthropic-beta"));let r=Ir(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Vi(t);return a?(m.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),Pe.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 Cr)return{ok:!1,response:Xi(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function Qi(e,t,o){let{leadingSystemTexts:n,messages:r}=gi(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=_i(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(as(e));break}case"user":t.push(...is(n),...o.map(e=>as(e))),o=[];break;case"assistant":t.push(...ls(n))}return t.push(...o.map(e=>as(e))),t}(r);if(0===a.length)throw new Jt("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 bi(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(Wa).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:rs(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=Jo(o,t);return{effort:ns(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function es(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${P("sha256").update(o).digest("hex").slice(0,32)}`}function ts(e){let t=e?.input_tokens??0,o=e?.input_tokens_details?.cached_tokens;return{input_tokens:void 0===o?t:Math.max(t-o,0),output_tokens:e?.output_tokens??0,...void 0===o?{}:{cache_read_input_tokens:o}}}const os=new Set(["low","medium","high","xhigh"]),ns=e=>null!==e&&os.has(e);function rs(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function as(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function is(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(ss(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)switch(t.type){case"text":e.push({type:"input_text",text:t.text});break;case"image":e.push({type:"input_image",image_url:`data:${t.source.media_type};base64,${t.source.data}`,detail:"high"})}t.push({type:"message",role:"user",content:e})}else{let e=n.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function ss(e){let t;return t="string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.filter(e=>"text"===e.type).map(e=>e.text).join("\n"):"",e.is_error&&(t=`[ERROR] ${t}`),{type:"function_call_output",call_id:e.tool_use_id,output:t}}function ls(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 cs(e,t){if(t)return"tool_use";switch(e){case"completed":case"cancelled":case"failed":return"end_turn";case"incomplete":return"max_tokens";default:return null}}function us(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function ps(e,t,o){e.messageStartSent||=(e.responseId=o?.responseId??e.responseId,e.model=o?.model??e.model,t.push({type:"message_start",message:{id:e.responseId,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}),!0)}function ds(e,t){let o=[];switch(e.type){case"response.created":ps(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){ps(t,o),us(t,o);let n=e.item;t.toolCalls[e.output_index]={call_id:n.call_id,name:n.name,_bi1:t.contentBlockIndex},o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"tool_use",id:n.call_id,name:n.name,input:{}}}),t.contentBlockOpen=!0}break;case"response.content_part.added":ps(t,o),us(t,o),o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),t.contentBlockOpen=!0;break;case"response.output_text.delta":o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"response.content_part.done":us(t,o);break;case"response.function_call_arguments.delta":{let n=t.toolCalls[e.output_index];n&&o.push({type:"content_block_delta",index:n._bi1,delta:{type:"input_json_delta",partial_json:e.delta}});break}case"response.output_item.done":if("function_call"===e.item.type){let n=t.toolCalls[e.output_index];n&&t.contentBlockOpen&&(o.push({type:"content_block_stop",index:n._bi1}),t.contentBlockIndex++,t.contentBlockOpen=!1)}break;case"response.completed":{us(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:cs(e.response.status,n),stop_sequence:null},usage:ts(r)},{type:"message_stop"});break}case"response.incomplete":{ps(t,o),us(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:ts(n)},{type:"message_stop"});break}case"response.failed":ps(t,o),us(t,o),o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":ps(t,o),us(t,o),o.push({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{input_tokens:0,output_tokens:0}},{type:"message_stop"});break;case"response.refusal.delta":ps(t,o),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}})}return o}function ms(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 fs(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function hs(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&&(ms(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&&(ms(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),fs(t,o)),r.content&&(fs(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){fs(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&&(fs(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Ei(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 gs=/structured_outputs|output_config\.format/i;function _s(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&gs.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Yi({...e,model:Lo},o):null}var ys=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var ws=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const bs={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 it({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 tt(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new ws: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 it({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 tt(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new ys:e}finally{clearTimeout(i)}}},ks=["tavily","exa"];function vs(e){return"tavily"===e||"exa"===e}function xs(){return oe.webSearchProviders.length>0}async function $s(e,t){return async function(e,t,n){let{providers:r,searchFns:a=bs}=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:oe.webSearchProviders})}function Ts(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function As(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 Ss(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&&Ja(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!xs())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await $s(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_${Ts()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...As(n,e)}];return{id:`msg_ws_${Ts()}`,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_${Ts()}`,r=`msg_ws_${Ts()}`,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:As(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}),M(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const Es=(e,t)=>!(!e||!t||e===t);async function Os(e){if(Io(oe)||await xn())return null;let t=gn();return t?(m.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${yn()}`}},401)):(m.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 Cs(e,t){let o=t.model;return o&&"string"==typeof o?null:Xi(e,"Model name is required and must be a string")}async function Is(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&Ja(t[0])}(t))return Cs(e,t)??Ss(e,t);await Nr(oe),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=Cs(e,t);if(a)return a;t=function(e,t){return ii(t,oe.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Zi(e,t);if(!i.ok)return i.response;t=i.payload;let s=await Os(e);if(s)return s;if(Pr(t.model))return qs(e,t);if(function(e){if("foundry"!==oe.provider)return Oi(e);let t=oe.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:Oi(e)}(t.model))return async function(e,t,o){let n="foundry"===oe.provider,r=n?t:Yi(t,oe.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:Es(o,i),streaming:!!r.stream}),oe.manualApprove&&await Ar(),ve.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),ti(t,r,a.anthropicBeta);try{let o=performance.now(),i=await oi(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=_s(e,o,oe.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(ze.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=Er(Ns(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 M(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=Kr(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,Me.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),Rs(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"};Ge.record(e,t),Ze.record(a,t)}catch(t){throw ot(c,e.get("requestSpan"),t),await jr(n,t),t}finally{if(Jr(e,o),p){let t=Ns(s);Or(c,t);let o=e.get("requestData")||{};o.tokenUsage=Er(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&he.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw tt(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=ve.startActiveSpan("copilot_api.translate.anthropic_to_openai",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),o.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),o.setAttribute("copilot_api.translation.has_system",!!t.system),o.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let n=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)),r=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),Ti(o,t.messages);let a=Ci(t,oe.models),i=a.messages.at(0);return Si(o,{system:"system"===i?.role&&"string"==typeof i.content?i.content:"",tools:a.tools}),a}finally{o.end()}});Je.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=Lr(c,oe.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:Es(r,u),streaming:!!c.stream});let p=performance.now();oe.manualApprove&&await Ar();let d=await ua(c),m=performance.now()-p;if(ze.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),Ps(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=Er(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=ve.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=Bi(a.message),i=Ui(a.message.content),s=Li(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:Ei(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 Je.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 M(e,async t=>{let n=null,r=0,a=performance.now(),i=Kr(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++,Me.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=Er(n),t._d1=m,e.set("requestData",t)}let u=hs(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(Ge.record(l,u),Ze.record(r,u),Jr(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Er(n),t._d1=m,e.set("requestData",t))}}catch(o){throw ot(h,e.get("requestSpan"),o),await jr(t,o),o}finally{n&&Or(h,n),h.end(),g()}let l=e.get("requestId");l&&he.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Ps=e=>Object.hasOwn(e,"choices");function Ns(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 Rs(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}async function qs(e,t){let r=performance.now(),a=ve.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),Ti(o,t.messages);let n=Qi(t,oe.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===oe.provider,promptCacheKey:"foundry"===oe.provider?es(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return Si(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});Je.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),oe.manualApprove&&await Ar();let i=performance.now(),s=await _a(a),l=performance.now()-i;if(ze.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),wa(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Er({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens,prompt_tokens_details:s.usage.input_tokens_details})),t._d1=l,t.upstreamTtfbMs=l,t.upstreamTotalMs=l,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(s).slice(-400)),"failed"===s.status)return m.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:s.error?.code??"api_error",message:s.error?.message??"Response generation failed"}},500);let r=performance.now(),a=ve.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:cs(e.status,o),stop_sequence:null,usage:ts(e.usage)}}(s)}finally{e.end()}});return Je.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return M(e,async t=>{let n=null,r=0,s=performance.now(),d=Kr(e,i),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let i of c){if(d(),o.debug("Responses API raw stream event:",i),!i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}r++,Me.add(1,{model:a.model,endpoint_type:"responses"});let c=ba(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Er(n),t._d1=l,e.set("requestData",t)}let u=ds(s,m);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let u=performance.now()-s,p={model:a.model,endpoint_type:"responses"};Ge.record(u,p),Ze.record(r,p),Jr(e,i)}catch(o){throw ot(u,e.get("requestSpan"),o),await jr(t,o),o}finally{n&&Or(u,n),u.end(),p()}let f=e.get("requestId");f&&he.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const js=new j;js.post("/",async e=>{try{return await tn(e,Is)}catch(t){return await ho(e,t)}});const Ds=new j;function Ms(e){return ve.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Ir(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),Pe.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 Fs(e,t){let o=function(e){try{let t=JSON.parse(e);if(("response.completed"===t.type||"response.incomplete"===t.type)&&t.response?.usage){let e=t.response.usage;return{prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=Er(o),n._d1=t._d1,t.c.set("requestData",n)}Ds.get("/",async e=>{try{oe.models||await rn();let t=oe.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 ho(e,t)}});const Hs=new Set(["message","function_call","function_call_output"]),Us=new Set(["type","name","description","parameters"]);async function Bs(e){if(!e)return!1;let t=e.sources;if(t&&t.length>0)return!1;let n=e.query??e.queries?.[0];return!(!n||!xs())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await $s(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Ls(e){if(xs())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Bs(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function zs(e){if(!xs())return e;try{let t=JSON.parse(e);if("response.output_item.done"===t.type){let e=t.item;if("web_search_call"===e?.type&&await Bs(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Gs(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 Hs.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Ks(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 Js(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&&Ks(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)Ks(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Ws(e){return null!=e}function Ys(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Vs(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Xs(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(!Ys(n)){o.push(n);continue}let e=Gs(n);null===e?t.add(Vs(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"])Ws(e[o])&&(t[o]=e[o]);let r=new Set;if(Ws(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))Us.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(Ws(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Ws(o.effort)&&(t.reasoning.effort=o.effort),Ws(o.summary)&&(t.reasoning.summary=o.summary)}if(Ws(e.text)&&"object"==typeof e.text){let o=e.text;Ws(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Zs(e,t){return m.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Qs(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=m.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||Ws(n.previous_response_id)||Ws(n.prompt)||Ws(n.conversation)?null:Zs(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 el(e){await Nr(oe);let t=await e.req.json();if(!Ys(t))return Zs(e,"request body must be a JSON object");let n=function(e){return"foundry"===oe.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:Xs(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:Ms(t)}}catch(t){if(t instanceof Cr)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=Qs(e,t.input,n);if(s)return s;let l=await Sr(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),oe.manualApprove&&await Ar();let c=performance.now(),u=await _a(a),p=performance.now()-c;if(ze.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),tl(u))return async function(e,t,o){await Ls(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Er({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return M(e,async t=>{let o={value:null},n=0,i=performance.now(),s=Kr(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Js(i.data,r);s=await zs(s);let l=s===i.data?i:{...i,data:s};Me.add(1,{model:a.model,endpoint_type:"responses"}),Fs(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"};Ge.record(l,u),Ze.record(n,u),Jr(e,c)}catch(o){throw ot(m,e.get("requestSpan"),o),await Dr(t,o),o}finally{o.value&&Or(m,o.value),m.end(),f()}let l=e.get("requestId");l&&he.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const tl=e=>Object.hasOwn(e,"output"),ol=new j;ol.post("/",async e=>{try{return await tn(e,el)}catch(t){return await ho(e,t)}});const nl=new j;nl.get("/",e=>{try{return oe.showToken?e.json({token:oe._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 rl=new j;rl.get("/",async e=>{try{let t=await Fn();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const al=new j;function il(){return function(e){let t=e.filter(e=>xr(e));if(0===t.length)return;let o=t.find(e=>vr.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(oe.models?.data??[])}function sl(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 _r(o).slice(0,200)}catch{}let t=_r(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 ll(e={}){let t=performance.now(),o=e.model&&function(e){let t=oe.models?.data.find(t=>t.id===e);return void 0!==t&&xr(t)}(e.model)?e.model:il();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 al.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[br]:kr},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:sl(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)}}al.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=$t(i),l=function(e){return e===kr}(e.req.header(br));e.set("requestId",r),e.set("isSelfTest",l),e.header("x-request-id",r);let d=ve.startSpan("copilot_api.handle_request",{kind:c.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",d),e.set("requestTraceContext",d.spanContext()),l&&d.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();rt.has(e)||"x-copilot-api-self-test"!==e&&d.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>Tr?t.slice(0,Tr):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let f,h=new Promise(e=>{f=e});e.set("streamComplete",h),e.set("resolveStreamComplete",f);let g=m.setSpan(p.active(),d);await p.with(g,async()=>{l||he.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw d.setStatus({code:u.ERROR,message:t.message}),d.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:d};_?.streaming&&e.res.status<400?h.then(()=>$r(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{d.recordException(t),d.setStatus({code:u.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{d.end()}catch{}}):$r(y)}),al.use(D()),al.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()}),al.get("/",e=>e.text("Server running")),al.route("/health",za),al.route("/chat/completions",Ba),al.route("/models",Ds),al.route("/embeddings",La),al.route("/usage",rl),al.route("/token",nl),al.route("/v1/chat/completions",Ba),al.route("/v1/models",Ds),al.route("/v1/embeddings",La),al.route("/v1/messages",js),al.post("/v1/messages/count_tokens",async function(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:"invalid_request_error",message:"Invalid JSON"}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let o=Va.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=Va.perMessage+Xa(e)*Va.contentMultiplier}for(let e of t.messages)o+=Va.perMessage,o+=Xa(e.role),"string"==typeof e.content?o+=Xa(e.content)*Va.contentMultiplier:Array.isArray(e.content)&&(o+=Za(e.content));let n=t.tools?.filter(Wa);return n&&n.length>0&&(o+=function(e){let t=Va.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=Va.perTool),t+=Xa(n.name),n.description&&(t+=Va.perDesc+Xa(n.description)),t+=Qa(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),al.route("/v1/responses",ol),al.route("/responses",ol),al.onError((e,t)=>ho(t,e));const cl=e=>`[1m${e}[0m`,ul=e=>`[2m${e}[0m`,pl=e=>`[32m${e}[0m`,dl=e=>`[31m${e}[0m`,ml=e=>`[33m${e}[0m`,fl=ul(" ─────────────────────────────────────────────────────────────");function hl(e,t,o){console.log(` ${function(e){return"ok"===e?pl("✓"):"warn"===e?ml("⚠"):dl("✗")}(e)} ${cl(t.padEnd(14))} ${o}`)}function gl(e){console.log(` ${ul("↳")} ${ul(e)}`)}function _l(e){return e instanceof Jt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function yl(){let e=_.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(Y.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 wl(){try{await rn();let e=(oe.models?.data.length??0)>0;return hl(e?"ok":"warn","Model catalog",e?function(){let e=oe.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 hl("fail","Model catalog",_l(e)),gl("Could not fetch /models — check connectivity/auth."),!1}}async function bl(e){oe.accountType=e.accountType;let t=await Rt(),o=qt();if(console.log(""),console.log(` ${cl("COPILOT-API DOCTOR")} ${ul(`v${t}`)}`),console.log(fl),hl("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await V(),an(),!await async function(){let e=await yl();if(!e)return hl("fail","Auth token","not found"),void gl("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");oe._t2=e.token,hl("ok","Auth token",`found (${e.source})`);try{let e=await _o();return await ft(oe,e.login),hl("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return hl("fail","GitHub auth",_l(e)),void gl("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(fl),console.log(` ${dl("✗")} ${cl("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await go();return oe._t1=e,hl("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Jt?e.response.status:0;return hl("fail","Service token",_l(e)),gl(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 wl();await async function(){try{let e=await Fn(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Nn(Rn(t))} of ${Nn(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;hl("ok","Copilot plan",`${e.copilot_plan} · ${o} `+ul(`(resets ${e.quota_reset_date})`))}catch(e){hl("warn","Copilot plan",`unavailable (${_l(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await ll();return e.ok?(hl("ok","Generation",`works via ${e.model} ${ul(`(${e.durationMs}ms)`)}`),!0):(hl("fail","Generation",`${e.reason}${e.status?ul(` [HTTP ${e.status}]`):""}`),!1)}():hl("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=_.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){hl(t,"Client config","potential base-URL issue");for(let t of e)gl(t)}else hl("ok","Client config","no base-URL issues detected");gl("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(fl),a?(console.log(` ${pl("✓")} ${cl("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${ml("⚠")} ${cl("Some checks need attention")} — see the ${dl("✗")}/${ml("⚠")} lines above.`),console.log(""),2)}const kl=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 bl({accountType:e["account-type"]});_.exit(t)}});function vl(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 xl=!1;const $l="copilot-api-node20",Tl=`https://registry.npmjs.org/${$l}/latest`,Al=e=>`[1m${e}[0m`,Sl=e=>`[33m${e}[0m`;async function El(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Tl,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Ol(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 Cl,Il;async function Pl(e){try{let[t,o]=await Promise.all([Rt(),El(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 Nl(){if(!Cl||!Il)return;let{signal:e}=Il;Cl.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${$l}@latest`,n=Sl("│"),r=` ${Al("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${Al(o)} to update`,i=" ".repeat(54),s=Sl(`╭${"─".repeat(54)}╮`),l=Sl(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${Ol(r,54)}${n}`,`${n}${i}${n}`,`${n}${Ol(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var Rl={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 ql=262144,jl="https://barazany.dev",Dl=/^[a-z0-9][a-z0-9-]*$/i,Ml=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function Fl(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(Ml," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function Hl(e){if("object"!=typeof e||!e)return null;let t=e,o=Fl(t.title,100),n=Fl(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!==jl||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&&Dl.test(t.slug)&&(r=`${jl}/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 Ul(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=Hl(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 Bl=null;function Ll(e){return s.join(e,"blog-posts.json")}function zl(e=Y.APP_DIR){try{if(Bl&&Bl.length>0)return Bl;let t=function(e){try{let t=Ll(e);return L.statSync(t).size>ql?[]:Ul(JSON.parse(L.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Ul(Rl)}catch{return[]}}function Gl(e){return e>-6e4&&e<864e5}async function Kl(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>ql)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>ql?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>ql)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?[]:Ul(JSON.parse(o))}finally{clearTimeout(o)}}async function Jl(e={}){try{if("1"===_.env.COPILOT_API_NO_BLOG||"1"===_.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??Y.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=Ll(e),n=await L.promises.stat(o);if(n.size<=ql){let e=await L.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Gl(t-n.fetchedAt)}return Gl(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await Kl(e.timeoutMs??3e3);if(0===n.length)return;Bl=n,await async function(e,t,o){let n=Ll(e),r=`${n}.${_.pid}.tmp`;try{await L.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await L.promises.rename(r,n)}catch(e){throw await L.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function Wl(e){return"foundry"===e.provider?(oe.foundry=function(e){let t=e.FOUNDRY_ENDPOINT,o=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");if(!o)throw Error("--provider foundry requires FOUNDRY_API_KEY");let n=bo(t),r=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:n,anthropicEndpoint:r?bo(r,"FOUNDRY_ANTHROPIC_ENDPOINT"):vo(n),apiKey:o,deployments:xo(e.FOUNDRY_DEPLOYMENTS)}}(process.env),oe.connectivity.h2=!1,oe.connectivity.h2Keepalive=!1,o.info(`Using Microsoft Foundry upstream: ${oe.foundry.endpoint}`),"copilot"===e.fallback&&await async function(e){try{await Yl(e),await Xo(),o.info("Copilot fallback enabled for Foundry rate limits (429)")}catch(e){o.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}}(e),{login:"foundry"}):Yl(e)}async function Yl(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){oe._t2=e,hn=!1}(n),o.info("Using provided Auth token")):await Tn();try{t=await _o(),await ft(oe,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 go();oe._t1=e,o.debug("Service token fetched successfully!"),oe.showToken&&o.info("Service token:",e),fn=!0,$n(t),lt.start(),un=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),vn(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},pn=()=>{o.debug("Network connectivity lost")},lt.on("online",un),lt.on("offline",pn)})(),t}function Vl(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=_;if("win32"===e){try{if(g(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=o.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),r=Object.entries(e).filter(([,e])=>void 0!==e);switch(n){case"powershell":o=r.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":o=r.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":o=r.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(" ");o=r.length>0?`export ${e}`:"";break}}return o&&t?`${o}${"cmd"===n?" & ":" && "}${t}`:o||t}const Xl=e=>`[1m${e}[0m`,Zl=e=>`[2m${e}[0m`,Ql=e=>`[36m${e}[0m`,ec=e=>`[32m${e}[0m`,tc=e=>`[33m${e}[0m`,oc=e=>`[4m${e}[0m`,nc=(e,t)=>`]8;;${e}\\${t}]8;;\\`,rc="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",ac="https://github.com/johnib/copilot-api-issues/issues",ic=Zl(" ─────────────────────────────────────────────────────────────");function sc(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function lc(e){return e&&0!==e.length?e.join("·"):"—"}function cc(e){if(0===e.length)return[];let t=["",ic,` ${Xl("BARAZANY.DEV")} ${Zl("— Recent Posts")}`,ic,""];for(let[o,n]of e.entries()){let e=`${n.url}${rc}`,r=nc(e,Xl(oc(`[${o+1}]`)));t.push(` ${r} ${Ql(n.title)}`,` ${Zl("→")} ${Zl(n.teaser)}`,"")}return t.push(ic,` ${nc(`https://barazany.dev/blog${rc}`,"barazany.dev/blog")}`,ic),t}function uc(e){let t=[];oe.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):oe.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(Zl(" → "))} ${ec("✓")}`:Zl("off"),n=["",` ${Xl("COPILOT-API")} ${Zl(`v${e.version}`)}`,ic,` ${Zl("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Zl("User")} ${e.user} ${Zl("·")} ${e.accountType}`];return oe._v1&&n.push(` ${Zl("Client")} VSCode ${oe._v1}`),n.push(` ${Zl("Network")} ${t.join(Zl(" · "))}`,` ${Zl("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Zl("Clipboard")} Claude Code command ${ec("✓")}`),n.push(ic),n}function pc(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Xl("Active")}`];if(e.model){let o=oe.models?.data.find(t=>t.id===e.model),n=sc(o?.capabilities.limits?.max_context_window_tokens),r=lc(o?.capabilities.supports.reasoning_effort);t.push(` ${Ql(e.model.padEnd(32))} ${Zl("ctx")} ${Xl(n.padStart(5))} ${Zl("effort")} ${Zl(r)} ${tc("← main")}`)}if(e.smallModel){let o=oe.models?.data.find(t=>t.id===e.smallModel),n=sc(o?.capabilities.limits?.max_context_window_tokens),r=lc(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Zl("ctx")} ${n.padStart(5)} ${Zl("effort")} ${Zl(r)} ${tc("← small")}`)}return t}function dc(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of oe.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("",` ${Xl(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Ql("●"):Zl("·"),i=n?Ql(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?sc(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${lc(r.effort)}`;t.push(` ${a} ${i} ${Zl(s)}${Zl(l)}`)}}return t}function mc(){let e=ac.replace(/^https:\/\//,""),t=nc(`${ac}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",ic,` ${Xl("FOUND A BUG?")} ${Zl("— Report it on GitHub")}`,ic,"",` ${Ql("→")} ${Ql(t)}`,` ${Zl("Bug reports, feature requests, and questions welcome.")}`,"",ic]}function fc(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=["",ic,` ${Xl("Claude Cowork")} ${Zl("— Settings → Inference Provider")}`,ic,"",` ${Zl("Paste into")} ${Xl("inferenceGatewayBaseUrl")}${Zl(":")}`,` ${Xl(Ql(r))}`];return n||a.push("",` ${Zl("Your Tailscale hostname is shown by:")} ${Ql("tailscale status --self")}`),a.push("",` ${Zl("Docs:")} ${Ql("https://claude.com/docs/cowork/3p/installation")}`),a}function hc(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",ic,` ${Xl("HTTPS")} ${Zl("— self-signed cert")}`,ic,"",` ${Zl("Cert")} ${t}`];switch(o.push("",` ${Xl("Trust this cert")} ${Zl("(one-time setup)")}`),_.platform){case"darwin":o.push(` ${Zl("macOS:")}`,` ${Ql("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Ql(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Zl("Windows (PowerShell as Administrator):")}`,` ${Ql(`Import-Certificate -FilePath "${t}" \``)}`,` ${Ql("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Zl("Linux (Debian/Ubuntu):")}`,` ${Ql(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Ql("sudo update-ca-certificates")}`,` ${Zl("Linux (Fedora/RHEL/Arch):")}`,` ${Ql(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Ql("sudo update-ca-trust")}`);break;default:o.push(` ${Zl("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Zl("Or, for Node CLIs only (no admin needed):")}`,` ${Ql(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,ic),o}function gc(e){let t=Math.floor(e/1e3),o=Math.floor(t/3600),n=Math.floor(t%3600/60);return o>0?`${o}h ${n}m`:n>0?`${n}m`:`${t}s`}const _c=s.join(Y.APP_DIR,"certs"),yc=s.join(_c,"cert.pem"),wc=s.join(_c,"key.pem"),bc=s.join(_c,"cert.meta.json");async function kc(e){try{return await a.readFile(e,"utf8")}catch{return}}async function vc(e){let t=await kc(yc),o=await kc(wc),n=await async function(){let e=await kc(bc);if(e)try{let t=JSON.parse(e);return Array.isArray(t.hosts)&&"string"==typeof t.notAfter?t:void 0}catch{return}}();if(!t||!o||!n)return!1;let r=new Set(n.hosts);for(let t of e)if(!r.has(t))return!1;let a=Date.parse(n.notAfter);return!Number.isNaN(a)&&a-Date.now()>2592e6}function xc(e){return 0!==K(e)}async function $c(e){await a.mkdir(_c,{recursive:!0});let t=new Date,o=new Date;o.setDate(o.getDate()+825);let n=["127.0.0.1","::1"],r=new Set(["localhost"]),i=new Set(n);for(let t of e)xc(t)?i.add(t):r.add(t);let s=[...[...r].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))],l=await J([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:o,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:s}]});return await a.writeFile(yc,l.cert,{mode:420}),await a.writeFile(wc,l.private,{mode:384}),await async function(e){await a.writeFile(bc,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:yc,keyPath:wc,generated:!0}}const Tc=[],Ac=Date.now();let Sc="";function Ec(){let e=async(e,t=0)=>{let n=ve.startSpan("copilot_api.server.shutdown",{kind:c.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-Ac)/1e3}});for(let t of Tc)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=nc("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",ic,` ${Xl("COPILOT-API")} ${Zl(`v${e}`)} ${Zl("·")} ${gc(t)} uptime`,ic,""," Check in from time to time on",` ${Ql(o)}`,"",ic,""];console.log(n.join("\n"))}(Sc,Date.now()-Ac),_.exit(t)};_.on("SIGINT",()=>e("SIGINT")),_.on("SIGTERM",()=>e("SIGTERM")),_.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),_.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}const Oc=e=>e.filter(e=>"embeddings"!==e.capabilities.type).map(e=>e.id),Cc=e=>e.filter(e=>"embeddings"!==e.capabilities.type&&(e.supported_endpoints?.includes("/responses")??!0)).map(e=>e.id);async function Ic(e,t,n){if(!e._cc1)return!1;oe.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."),_.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,Oc(oe.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Oc(oe.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:Oc(oe.models.data)}));let s=Vl({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 f.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function Pc(e){return e._t2?"cli_arg":_.env.GH_TOKEN?"env_var":"stored"}function Nc(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=ve.startSpan("copilot_api.server.startup",{kind:c.INTERNAL,attributes:nt({config:{version:o,port:t.port,accountType:t.accountType,verbose:t.verbose,manualApprove:t.manual,rateLimitSeconds:t.rateLimit??0,rateLimitWait:t.rateLimitWait,timeoutMs:t.timeout,showToken:t.showToken,_cc1:t._cc1,model:t.model,smallModel:t.smallModel,_t3:Pc(t),provider:t.provider},runtime:n,identity:{_u1:r.login,machineId:oe.machineId,sessionId:oe.sessionId,_v1:oe._v1},connectivity:oe.connectivity,modelsCount:oe.models?.data.length??0,startupDurationMs:Date.now()-Ac},"copilot_api")});if(oe.models?.data)for(let e of oe.models.data)a.addEvent("copilot_api.model.available",nt(e,"model"));a.end(),et(y.INFO,"INFO","Server started",nt({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:oe.models?.data.length??0,startupDurationMs:Date.now()-Ac},"copilot_api"))}async function Rc(e,t){try{return await Wl(e)}catch(o){throw await async function(e,t){let o=nt({config:t,startupStage:"upstream_auth"},"copilot_api"),n=ve.startSpan("copilot_api.server.startup_failed",{kind:c.INTERNAL,attributes:o});e instanceof Jt&&(n.setAttribute("http.response.status_code",e.response.status),n.setAttribute("url.full",e.response.url)),tt(n,e),n.end(),et(y.ERROR,"ERROR","Server startup failed",{...o,"exception.message":e instanceof Error?e.message:String(e)}),await ke()}(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:Pc(e)}),o}}async function qc(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[o,n]=await Promise.all([a.readFile(e,"utf8"),a.readFile(t,"utf8")]);return{cert:o,key:n,certPath:e,keyPath:t,generated:!1}}(e.httpsCert,e.httpsKey);if(e.httpsCert||e.httpsKey)throw Error("Both --https-cert and --https-key must be provided together");return async function(e=[]){if(await vc(e)){let e=await kc(yc),t=await kc(wc);if(e&&t)return{cert:e,key:t,certPath:yc,keyPath:wc,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),$c(e)}(e.httpsHosts)}}async function jc(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=ir;try{z(t),z(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(Ec(),Tc.push(()=>{o.debug("Cleaning up connectivity monitor"),lt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),fn=!1,ln&&=void clearInterval(ln),un&&=void lt.off("online",un),pn&&=void lt.off("offline",pn),cn=void 0,dn=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),Zr&&=void clearInterval(Zr),Qr&&=void clearInterval(Qr);let e=[...Yr.keys(),...Vr];Yr.clear(),Vr.clear(),Wr.clear(),Xr=void 0;for(let t of e)ea(t)&&(Ue.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await ke()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");oe.provider=t.provider,oe.accountType=t.accountType,oe.manualApprove=t.manual,oe.rateLimitSeconds=t.rateLimit,oe.rateLimitWait=t.rateLimitWait,oe.showToken=t.showToken,oe.timeoutMs=t.timeout,oe.connectivity.timeoutMs=t.connectTimeout,oe.webSearchProviders=t.webSearchProviders,oe.errorReporting=function(e){let t=_.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===_.env.COPILOT_H2_KEEPALIVE||"true"===_.env.COPILOT_H2_KEEPALIVE,t=e||"1"===_.env.COPILOT_H2||"true"===_.env.COPILOT_H2;oe.connectivity.h2=t,oe.connectivity.h2Keepalive=e}(),await V(),Jl().catch(()=>{}),an();let n=await Rt();Sc=n;let r=qt();!function(e,t){t&&(ye=t),_e=crypto.randomUUID();let o=x({[E]:"copilot-api",[O]:e,[S]:_e}),{endpoint:n,headers:r}=be();ge=new A({resource:o,traceExporter:new v({url:`${n}/v1/traces`,headers:r}),metricReader:new T({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new $({exporter:new b({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),ge.start()}(n,Ac);let a=await Rc(t,n);await async function(){try{return await rn(),!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"===oe.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(()=>{rn().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{rn().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)}}();Tc.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),oe.connectivity.h2&&(na(oa(ht(oe))),oe.connectivity.h2Keepalive&&aa()),Nc({options:t,version:n,runtime:r,_u1:a});let s=await qc(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await Ic(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(oe.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."),_.exit(1)),e.model){let t=Cc(oe.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:Cc(oe.models.data)});let a=Vl({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return f.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=[...uc(e),...pc(e),...dc(e),...mc(),"",...cc(zl()),...fc(e),...hc(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 Wn()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),Nl(),G({fetch:al.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 ll({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: ${_r(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 Dc(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Mc=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT and FOUNDRY_API_KEY). Overrides COPILOT_API_PROVIDER.'},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:Dc(t,"--rate-limit"),r=e.timeout,a=void 0===r?te:Dc(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:Dc(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],_.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??_.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!vs(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${ks.join(", ")}`);let r=n.length>0?n:ks,a=new Set,i=n.length>0,s=[];for(let e of r){if(!vs(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||_.env.TAVILY_API_KEY,exaApiKey:_.env.EXA_API_KEY,order:u}),d=(_.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,_.env.COPILOT_API_PROVIDER);return jc({provider:f,fallback:Vo(e.fallback,_.env.COPILOT_API_FALLBACK,f),port:Dc(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})}});xl||(xl=!0,o.setReporters([vl(o.options.reporters)]));const Fc=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(Cl||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;Il=e,Cl=Pl(e).catch(()=>null)})(),Fc||Nl();const Hc=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:En,start:Mc,"check-usage":Ln,debug:Mt,doctor:kl,"cowork-setup":hr}});await t(Hc),Fc||(Il?.abort(),Il=void 0,Cl=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{SpanKind as c,SpanStatusCode as u,context as p,metrics as d,trace as m}from"@opentelemetry/api";import f from"clipboardy";import{execFile as h,execSync as g}from"node:child_process";import _ from"node:process";import{SeverityNumber as y,logs as w}from"@opentelemetry/api-logs";import{OTLPLogExporter as b}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as v}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as x}from"@opentelemetry/resources";import{BatchLogRecordProcessor as $}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as T}from"@opentelemetry/sdk-metrics";import{NodeSDK as A}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as S,ATTR_SERVICE_NAME as E,ATTR_SERVICE_VERSION as O}from"@opentelemetry/semantic-conventions";import{Client as C,request as I}from"undici";import{createHash as P,randomBytes as N,randomUUID as R}from"node:crypto";import{promisify as q}from"node:util";import{Hono as j}from"hono";import{cors as D}from"hono/cors";import{streamSSE as M}from"hono/streaming";import{events as F}from"fetch-event-stream";import{Tokenizer as H,models as U}from"ai-tokenizer";import*as B from"ai-tokenizer/encoding/claude";import L,{accessSync as z}from"node:fs";import{serve as G}from"srvx";import{isIP as K}from"node:net";import{generate as J}from"selfsigned";const W=s.join(i.homedir(),".local","share","copilot-api"),Y={APP_DIR:W,GITHUB_TOKEN_PATH:s.join(W,"github_token"),MACHINE_ID_PATH:s.join(W,"machine_id"),SESSION_ID_PATH:s.join(W,"session_id")};async function V(){await a.mkdir(Y.APP_DIR,{recursive:!0}),await X(Y.GITHUB_TOKEN_PATH),await X(Y.SESSION_ID_PATH)}async function X(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const Z=new l;function Q(e,t){return Z.run(e,t)}const ee=()=>!0===Z.getStore()?.rerun;const te=6e5,oe={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:te,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 ne(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:()=>Z.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=Z.getStore();return e?e.models:o},set:e=>{o=e},enumerable:!0,configurable:!0}})}(oe);const re=" │ ",ae=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()},ie=(e,t)=>e.padEnd(t),se=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),le=(e,t,o)=>` --\x3e ${ie(e,4)} ${ie(t,21)} ${ie(o,3)}`,ce=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return ie(t,22)})(e.model??"—")+ie(t,8)},ue=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ae(Math.max(t-o,0)):"—",r=e?ae(e.outputTokens??0):"—",a=o?ae(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},pe=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${ie("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ae(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},de=e=>{if(void 0===e.ttfbMs)return`e2e ${se(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${se(e.ttfbMs)} → e2e ${se(e.e2eMs)} ${t}`},me=e=>e?oe.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,fe=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}}),he={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=>[le(e.method,e.path,e.status),ce(e),ue(e.tokenUsage),pe(e.tokenUsage,e.maxContextTokens),de({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(re))({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:me(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),et(y.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)},...fe(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=>[le(e.method,e.path,"429"),ce(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${se(e.e2eMs)}`].join(re))({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=le(e.method,e.path,e.status.toString()),o=ce(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${se(e.e2eMs)}`].join(re)})({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(()=>he.cleanup(),6e4);let ge,_e,ye=Date.now();const we={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function be(){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):we;return{endpoint:e.replace(/\/$/,""),headers:t}}async function ke(){if(!ge)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([ge.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 ve=m.getTracer("copilot-api"),xe=d.getMeter("copilot-api"),$e=w.getLogger("copilot-api"),Te=xe.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),Ae=xe.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),Se=xe.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Ee=xe.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),Oe=xe.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Ce=xe.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Ie=xe.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Pe=xe.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Ne=xe.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Re=xe.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),qe=xe.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),je=xe.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),De=xe.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Me=xe.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Fe=xe.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),He=xe.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Ue=xe.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Be=xe.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Le=xe.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),ze=xe.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Ge=xe.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Ke=xe.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Je=xe.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),We=xe.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Ye=xe.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Ve=xe.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Xe=xe.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Ze=xe.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),Qe=xe.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function et(e,t,o,n,r){let a=m.getActiveSpan()?.spanContext()??r;$e.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function tt(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:u.ERROR,message:o??n.message}),e.recordException(n)}function ot(e,t,o){tt(e,o),t&&t!==e&&tt(t,o)}function nt(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,nt(r,e)))}return o}xe.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!lt.getConnectivityStats().isOnline)}),xe.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(lt.getConnectivityStats().consecutiveFailures)}),xe.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(oe.models?.data.length??0)}),xe.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(he.completionCallbacks.size)}),xe.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-ye)/1e3)});const rt=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function at(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();"authorization"===o&&e.setAttribute(`http.${t}.header.authorization.shape`,ne(r)),!rt.has(o)&&e.setAttribute(`http.${t}.header.${o}`,r)}}async function it(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:l}=e,p=ve.startSpan(t,{kind:c.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...l}});a&&at(p,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();rt.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),De.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:u.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw tt(p,e),p.end(),e}}async function st(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=ve.startSpan(t,{kind:c.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});at(f,"request",a);try{let{statusCode:e,headers:t,body:c}=await I(o,{method:r,headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:p,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!rt.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return De.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:u.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:c,span:f}}catch(e){throw tt(f,e),f.end(),e}}const lt=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:oe.connectivity.probeEndpoints,fastInterval:oe.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?oe.connectivity.slowProbeInterval:oe.connectivity.fastProbeInterval)+Math.random()*oe.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ve.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),oe.connectivity.timeoutMs);try{let n=!1;for(let e of oe.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",...oe.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Ye.record(r,{endpoint:e,result:"success"});break}Ye.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),qe.add(1,{result:n?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&o.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),je.add(1,{from:"offline",to:"online"}),et(y.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(o.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),je.add(1,{from:"online",to:"offline"}),et(y.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?oe.connectivity.slowProbeInterval:oe.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*oe.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:oe.connectivity.jitterMaxMs>0,connectionPooling:oe.connectivity.connectionPooling,dnsCache:oe.connectivity.dnsCache}}},ct=()=>({"content-type":"application/json",accept:"application/json"}),ut="0.48.1",pt=`copilot-chat/${ut}`,dt=`GitHubCopilotChat/${ut}`,mt=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`${Y.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=P("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(N(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},ft=async(e,t)=>{e.machineId||=await mt(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(Y.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(Y.SESSION_ID_PATH,e),await a.chmod(Y.SESSION_ID_PATH,384),e})()},ht=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,gt=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=R(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":pt,"User-Agent":dt,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":R(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},_t=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const yt=(e,t,o)=>{let n=gt(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&&_t.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},wt="https://api.github.com",bt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":pt,"user-agent":dt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),kt="https://github.com",vt="01ab8ac9400c4e429b23",xt=["user:email"].join(" ");function $t(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const Tt=32768,At=[{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: ***"}],St=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Et(e){let t=e;for(let{regex:e,mask:o}of At)t=t.replace(e,o);return t}const Ot=new Map;function Ct(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 It(e,t,o){let n=Et(o),r=8*Tt,a=n.length>r,i=a?n.slice(0,r):n,s=P("sha256").update(n).digest("hex");if(i.length<=Tt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=Tt)e.setAttribute(`${t}.part_${o/Tt}`,i.slice(o,o+Tt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/Tt))}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 Pt(e,t){let o=function(e){if(Ot.size>=1e3&&!Ot.has(e)){let e=Ot.keys().next().value;void 0!==e&&Ot.delete(e)}let t,o=(Ot.get(e)??0)+1;return Ot.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Be.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&&It(e,"copilot_api.incoming_request_body",n);let r=Nt(t.c.req.header());return r&&It(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&It(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&It(e,"copilot_api.outgoing_headers",Nt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&It(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function Nt(e){let t={};for(let[o,n]of Object.entries(e))St.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Rt(){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 qt(){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 jt(){try{return!!(await a.stat(Y.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(Y.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Dt(e){let t=await async function(){let[e,t]=await Promise.all([Rt(),jt()]);return{version:e,runtime:qt(),paths:{APP_DIR:Y.APP_DIR,GITHUB_TOKEN_PATH:Y.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 Mt=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})=>Dt({json:e.json})}),Ft=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Ht=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Ut=new Set;let Bt;function Lt(e){if(oe.errorReporting&&!(e.statusCode<500)&&!Ut.has(e.signature)){if(Ut.size>=1e3){let e=Ut.values().next().value;void 0!==e&&Ut.delete(e)}Ut.add(e.signature),async function(e){Bt??=Rt();let t=await Bt,o=qt(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(Et(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:$t(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(Ft,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Ht},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function zt(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 Gt=new WeakSet;async function Kt(e,{attempt:t,maxRetries:n,operation:r}){return zt(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&&Gt.add(e)}(e),!1)}var Jt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Wt=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Yt(e,t){return setTimeout(()=>e.abort(new Wt(t)),t)}const Vt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Xt=RegExp(`\\b(?:${[...Vt].join("|")})\\b`);function Zt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function Qt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Zt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function eo(e){let t=e.code;return"string"==typeof t?t:void 0}function to(e){if(void 0===e.cause)return"";let t=Qt(e);if(t===e)return"";let o=eo(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function oo(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=>Vt.has(e))||!(t.length>0)&&(!!o.some(e=>Xt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function no(e){return e.req.path.startsWith("/v1/messages")}function ro(e,t){if(no(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}function ao(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 io(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",t.message))}function so(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=e.message),t}function lo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=m.getActiveSpan();if(!a)return;let i=Ct({endpointType:$t(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});Pt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function co(e,t,o){let n=e.get("requestId"),r=he.completionCallbacks.get(n);r&&(he.logError(r,t,o),he.completionCallbacks.delete(n))}async function uo(e,t){let o=m.getActiveSpan(),n=e.get("requestId"),r=he.completionCallbacks.get(n);r&&(he.logRateLimit(r,t.response),he.completionCallbacks.delete(n)),Ce.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=ro(a,e),s=ao(i);return o?.setStatus({code:u.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),io(o,s),et(y.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...so(s)}),lo({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,o)=>{po.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const po=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;function mo(e,t){(function(e){return"object"==typeof e&&!!e&&Gt.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",oe.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function fo(e){return oo(e)||function(e){return zt(e)||e instanceof Error&&zt(e.cause)}(e)}async function ho(e,t){if(mo(m.getActiveSpan(),t),t instanceof Jt&&429===t.response.status)return uo(e,t);if(t instanceof SyntaxError){m.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),et(y.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=no(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 co(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Jt)return async function(e,t){let o=m.getActiveSpan(),n=await t.response.text(),r=ro(n,e),a=ao(r);return co(e,t.response.status,a.message??t.message),o?.setStatus({code:u.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),io(o,a),et(y.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...so(a)}),lo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&Lt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Ct({endpointType:$t(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message}),e.json(r,t.response.status)}(e,t);if(function(e){return e instanceof Wt||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Wt}(t))return function(e,t){let o=m.getActiveSpan();o?.setStatus({code:u.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.";et(y.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=no(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return co(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(fo(t))return function(e,t){let o=m.getActiveSpan();o?.setStatus({code:u.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?Qt(t):void 0,r=(n&&eo(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.";et(y.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=no(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return co(e,503,t instanceof Error?`${t.message}${to(t)}`:i),e.json(s,503)}(e,t);let n=m.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:u.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),et(y.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Lt({route:e.req.path,statusCode:500,errorClass:r.name,signature:Ct({endpointType:$t(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${to(r)}`}),co(e,500,r.message),o.error(r);let a=no(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const go=async()=>{let e=`${wt}/copilot_internal/v2/token`,t=oe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await it({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:bt(oe),signal:o.signal});try{if(!t.ok)throw new Jt("Failed to get Service token",t);return await t.json()}catch(e){throw tt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function _o(){let e=`${wt}/user`,t=oe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await it({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${oe._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Jt("Failed to get GitHub user",t);return await t.json()}catch(e){throw tt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let yo=null;function wo(){return"foundry"===oe.provider?Promise.resolve():(yo||=go().then(({token:e})=>{oe._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{yo=null}),yo)}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 ko=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function vo(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 xo(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,o]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:o||t}});return t.length>0?t:void 0}const $o=e=>({"api-key":e.apiKey,"Content-Type":"application/json",accept:"*/*"}),To=e=>`${e.anthropicEndpoint}/anthropic`,Ao=(e,t)=>({"x-api-key":e.apiKey,"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),So=e=>"foundry"===e.provider;function Eo(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const Oo=e=>So(e)?(e=>`${e.endpoint}/openai/v1`)(Eo(e)):ht(e),Co=(e,t=!1)=>So(e)?$o(Eo(e)):gt(e,t),Io=e=>So(e)?!!e.foundry?.apiKey:!!e._t1;const Po=[{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}],No={context:128e3,output:16384};function Ro(e){return Po.find(({pattern:t})=>t.test(e))??No}const qo=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,jo=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function Do(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 Mo(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=Yt(o,oe.timeoutMs);try{let{response:n,span:r}=await it({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:$o(e),signal:o.signal});try{if(!n.ok)throw new Jt("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 tt(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function Fo(e){return{object:"list",data:(e.deployments??await Mo(e)).map(e=>function(e){let{model:t}=e;if(!qo.test(t))return(e=>/embedding/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/embeddings"],capabilities:{family:t,object:"model_capabilities",type:"embeddings",tokenizer:"cl100k_base",supports:{}}}:(e=>/^claude/i.test(e))(t)?Do(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):jo(t)?Do(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:Ro(t)}):Do(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:Ro(t)})}(e)).filter(e=>void 0!==e)}}const Ho=async()=>{if(So(oe)&&oe.foundry)return Fo(oe.foundry);try{return await Uo()}catch(e){if(e instanceof Jt&&401===e.response.status)return await wo(),Uo();throw e}},Uo=async()=>{let e=`${Oo(oe)}/models`,t=Co(oe),o=oe.timeoutMs,n=new AbortController,r=Yt(n,o);try{let{response:o,span:r}=await it({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Jt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw tt(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const Bo=[{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"}],Lo="claude-haiku-4.5",zo={haiku:Lo,"sonnet-4.6":"claude-sonnet-4.6","sonnet-4.5":"claude-sonnet-4.5","sonnet-4":"claude-sonnet-4","opus-4.7":"claude-opus-4.7","opus-4.6":"claude-opus-4.6","opus-4.5":"claude-opus-4.5",opus:"claude-opus-4.5"};function Go(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of Bo)if(t.pattern.test(e))return t.family;return null}(n);if(!a)return null;let i=n.replace(/-\d{8}(?::.*)?$/,""),s=r?`-${r}`:"";for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,""),o=`${i}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2")===o)return e}return function(e,t,o=null){let n=zo[e];if(!n)return null;if(o){let e=`${n}-${o}`;if(t.includes(e))return e}if(t.includes(n))return n;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let n=o?`${e}-${o}`:e;if(t.includes(n))return n}return null}(a,t,r)}const Ko=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Jo(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=Ko.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=Ko.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}let Wo;const Yo=new Map;function Vo(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 Xo(){Wo=await Q({provider:"copilot"},Ho)}const Zo=()=>void 0!==Wo;function Qo(e,t,o=Date.now()){let n=function(e,t=Date.now()){let o=e.get("retry-after-ms");if(null!==o&&Number.isFinite(Number(o))&&Number(o)>=0)return Number(o);let n=e.get("retry-after");if(null!==n){let e=Number(n);if(""!==n.trim()&&Number.isFinite(e)&&e>=0)return 1e3*e;let o=Date.parse(n);if(!Number.isNaN(o))return Math.max(0,o-t)}return 1e4}(t,o);return Yo.set(e,Math.max(Yo.get(e)??0,o+n)),n}function en(e){if(!Zo()||!So(oe)||!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 tn(e,t,o){let{model:n,reason:r}=o,a=m.getActiveSpan();return a?.setAttribute("copilot_api.fallback.upstream","copilot"),a?.setAttribute("copilot_api.fallback.reason",r),a?.setAttribute("copilot_api.fallback.foundry_model",n),Q({provider:"copilot",models:Wo,rerun:"foundry_429"===r},()=>t(e))}async function on(e,t){if(!Zo()||!So(oe))return t(e);let n=await async function(e){try{let t=await e.req.json();return"string"==typeof t.model?t.model:void 0}catch{return}}(e);if(!n||!function(e){let t=Wo?.data.map(e=>e.id)??[];return t.includes(e)?e:Go(e,t)??void 0}(n))return t(e);if(function(e,t=Date.now()){let o=Yo.get(e);return void 0!==o&&(t<o||(Yo.delete(e),!1))}(n))return tn(e,t,{model:n,reason:"breaker_open"});try{return await t(e)}catch(r){if(!(e=>e instanceof Jt&&429===e.response.status&&void 0!==e.outgoingBody)(r))throw r;let a=Qo(n,r.response.headers);return await(r.response.body?.cancel()),m.getActiveSpan()?.setAttribute("copilot_api.fallback.retry_after_ms",a),o.info(`Foundry rate-limited ${n}; serving it from Copilot for ${Math.ceil(a/1e3)}s`),tn(e,t,{model:n,reason:"foundry_429"})}}const nn=e=>new Promise(t=>{setTimeout(t,e)}),rn=e=>null==e;async function an(){let e=await Ho();oe.models=e,Zo()&&await Xo().catch(e=>{o.warn("Failed to refresh the Copilot fallback models:",e)})}const sn=()=>{oe._v1="1.140.0-insider"};var ln=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let cn,un,pn,dn,mn,fn=!1,hn=!1,gn=!1;function _n(){return yn()?mn:void 0}function yn(){return void 0!==mn&&Date.now()-mn.at<6e4}function wn(){return gn?"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 bn=()=>a.readFile(Y.GITHUB_TOKEN_PATH,"utf8");function kn(e){let{span:t,error:n,reason:r,refreshStart:a,attempt:i}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";oe._t1=void 0,mn={status:s,message:l,at:Date.now()},clearInterval(cn),cn=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Ne.add(1,{reason:r,success:"false"}),Re.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:u.ERROR,message:n.message}),t.recordException(n),We.record(performance.now()-a,{reason:r}),et(y.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 vn(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;oe._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:u.ERROR,message:s.message}),t.recordException(s),Re.add(1,{reason:r}),We.record(performance.now()-a,{reason:r}),et(y.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const xn=async(e=5,t=1e3,n="scheduled")=>fn?(o.debug("Token refresh already in progress, coalescing"),un):(fn=!0,un=ve.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 go();return oe._t1=t,mn=void 0,hn&&void 0===cn&&(o.info("Token refresh recovered, resuming scheduled refresh"),Tn(s)),o.debug("Service token refreshed successfully"),oe.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Ne.add(1,{reason:n,success:"true"}),We.record(performance.now()-a,{reason:n}),void et(y.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Jt&&(401===s.response.status||403===s.response.status))return void kn({span:r,error:s,reason:n,refreshStart:a,attempt:i});let l=i===e;if(o.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),Ne.add(1,{reason:n,success:"false"}),l)return void vn({span:r,error:s,reason:n,refreshStart:a,maxRetries:e});let c=t*2**(i-1);o.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),fn=!1,un=void 0}}),un);async function $n(){return!!oe._t1||!yn()&&(void 0!==mn&&gn&&await async function(){if(un)return;let e=(await bn().catch(()=>{}))?.trim();e&&e!==oe._t2?.trim()&&(oe._t2=e,o.info("Picked up re-authenticated Auth token from disk"),oe.showToken&&o.info("Auth token:",e))}(),await xn(3,250,"on-demand"),!!oe._t1)}function Tn(e){cn&&clearInterval(cn);let t=Math.max(1e3*(e-60),6e4);cn=setInterval(()=>{xn(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function An(e){try{let t=await bn();if(t&&!e?.force)return oe._t2=t,gn=!0,oe.showToken&&o.info("Auth token:",t),void await Sn();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=oe.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${kt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:vt,scope:xt}),signal:e.signal});if(!t.ok)throw new Jt("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{f.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=_.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",h(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 ln("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=oe.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${kt}/login/oauth/access_token`,{method:"POST",headers:ct(),body:JSON.stringify({client_id:vt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await nn(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 ln("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new ln("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 nn(t);continue}if(r.access_token)return r.access_token;await nn(t)}catch(e){if(e instanceof ln)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await nn(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(Y.GITHUB_TOKEN_PATH,e,{mode:384}))(r),oe._t2=r,gn=!0,oe.showToken&&o.info("Auth token:",r),await Sn()}catch(e){throw e instanceof Jt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Sn(){let e=await _o();o.success(`Authenticated as ${e.login}`)}async function En(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),oe.showToken=e.showToken,await V(),await An({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 On=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})=>En({verbose:e.verbose,showToken:e["show-token"]})}),Cn=.01,In=864e5,Pn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Nn=new Intl.NumberFormat("en-US"),Rn=e=>Pn.format(e*Cn),qn=e=>e.credits_used??e.entitlement-e.remaining,jn=(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())/In;if(r<.5)return;let a=qn(e),i=a*Cn/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Cn,c=new Date(n.getTime()+l/i*In);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Dn=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Nn.format(qn(e))} of ${Nn.format(e.entitlement)} used`:"n/a",Mn=e=>e.padEnd(14),Fn=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Mn("AI credits")}unlimited`);else{let e=qn(o),t=o.percent_remaining;n.push(`${Mn("AI credits")}${Rn(e)} / ${Rn(o.entitlement)} ${t.toFixed(1)}% left`,`${Mn("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Mn("")}${Nn.format(e)} of ${Nn.format(o.entitlement)} credits`)}if(n.push("",`${Mn("Chat")}${Dn(e.quota_snapshots.chat)}`,`${Mn("Completions")}${Dn(e.quota_snapshots.completions)}`,"",`${Mn("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/In)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=jn(o,e.quota_reset_date,t);r&&n.push(`${Mn("Burn rate")}~${Pn.format(r.usdPerDay)}/day${(e=>e.exhausted?" — allowance already exhausted":e.exhaustsOn?` — on track to exhaust ${(e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}))(e.exhaustsOn)}`:" — within allowance")(r)}`);let a=o.overage_permitted?"permitted, "+(o.overage_count>0?`${Nn.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Mn("Overage")}${a}`)}return n.join("\n")},Hn=async()=>{let e=`${wt}/copilot_internal/user`,t=oe.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await it({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:bt(oe),signal:o.signal});try{if(!t.ok)throw new Jt("Failed to get usage",t);return await t.json()}catch(e){throw tt(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Un=()=>_.stdout.write("[2J[H"),Bn=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Ln=async()=>{let e=await Hn();return Fn(e)},zn=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 V(),await An(),!e.watch){try{o.box(await Ln())}catch(e){o.error("Failed to fetch usage:",e),_.exit(1)}_.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=_.stdout.isTTY,r=()=>_.exit(0);for(_.on("SIGINT",r),_.on("SIGTERM",r);;){try{let e=await Ln();n&&Un(),o.box(e),o.log(Bn(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Gn=q(h);async function Kn(){let e="win32"===_.platform?"where.exe":"which";try{return await Gn(e,["tailscale"]),!0}catch{return!1}}async function Jn(){try{let{stdout:e}=await Gn("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Wn(e){return e.replace(/\.$/,"")}async function Yn(){let e=await Jn();if(e?.Online)return Wn(e.DNSName)}const Vn=q(h),Xn=e=>`[1m${e}[0m`,Zn=e=>`[2m${e}[0m`,Qn=e=>`[36m${e}[0m`,er=e=>`[32m${e}[0m`,tr=e=>`[31m${e}[0m`,or=e=>`[33m${e}[0m`,nr=Zn(" ─────────────────────────────────────────────────────────────"),rr=s.join(Y.APP_DIR,"certs","tailscale"),ar=s.join(rr,"cert.pem"),ir=s.join(rr,"key.pem"),sr={certDir:rr,certPath:ar,keyPath:ir};function lr(){switch(_.platform){case"darwin":return[` ${Zn("Install Tailscale for macOS:")}`,` ${Qn("https://tailscale.com/download/mac")}`,` ${Zn("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${Zn("After installing, open the Tailscale app and sign in.")}`,` ${Zn("Then re-run this command.")}`].join("\n");case"linux":return[` ${Zn("Install Tailscale for Linux:")}`,` ${Qn("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Qn("sudo tailscale up")}`,` ${Zn("or")} ${Qn("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${Zn("Install Tailscale for Windows:")}`,` ${Qn("https://tailscale.com/download/windows")}`,"",` ${Zn("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${Zn("Install Tailscale:")} ${Qn("https://tailscale.com/download")}`}}function cr(){let e=[` ${tr("Tailscale is not running.")}`];return"darwin"===_.platform?e.push(` ${Zn("Open the Tailscale app from Applications and sign in.")}`,` ${Zn("Download:")} ${Qn("https://tailscale.com/download/mac")}`):"win32"===_.platform?e.push(` ${Zn("Open the Tailscale app and sign in.")}`,` ${Zn("Download:")} ${Qn("https://tailscale.com/download/windows")}`):e.push(` ${Zn("Connect with:")} ${Qn("sudo tailscale up")}`),e.push("",` ${Zn("Then re-run this command.")}`),e.join("\n")}async function ur(){try{return await a.access(ar),await a.access(ir),!0}catch{return!1}}function pr(e){console.log(""),console.log(nr),console.log(` ${Xn("Claude Cowork Setup")} ${Zn("— Diagnostic")}`),console.log(nr),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?er("✅"):"missing"===n.status?tr("❌"):or("❓");let r=n.detail?Zn(` ${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(` ${er("All checks passed.")}`):console.log(` ${tr(`${t.length} issue(s).`)} Run ${Qn("copilot-api cowork-setup install")} to fix.`),console.log("")}const dr={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},mr=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Kn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return pr(e),console.log(""),console.log(lr()),void console.log("");let o=await Jn();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},pr(e),console.log(cr()),void console.log("");let n=Wn(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await ur();e["tailscale-cert"]=r?{status:"ok",detail:ar}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),pr(e)}(),_.exit(0)}}),fr=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:dr},async run({args:e}){await async function(e){if(console.log(""),console.log(nr),console.log(` ${Xn("Claude Cowork Setup")} ${Zn("— Install")}`),console.log(nr),console.log(""),!await Kn())return console.log(` ${tr("Tailscale is not installed.")}`),console.log(""),console.log(lr()),console.log(""),console.log(` ${Zn("After installing, run")} ${Qn("tailscale up")} ${Zn("to connect, then re-run this command.")}`),void console.log("");let t=await Jn();if(!t||!t.Online)return console.log(cr()),void console.log("");let n=Wn(t.DNSName);if(console.log(` ${Zn("Tailscale hostname:")} ${Xn(n)}`),console.log(""),console.log(` ${Xn("Generating TLS certificate via Tailscale…")}`),console.log(` ${Zn("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Qn(`$ tailscale cert --cert-file ${ar} --key-file ${ir} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(rr,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Vn("tailscale",["cert","--cert-file",ar,"--key-file",ir,n]),console.log(` ${er("✓ Certificate generated")}`)}catch(e){let t=e instanceof Error?e.message:String(e);return void o.error(`Failed to generate cert: ${t}`)}console.log(""),console.log(nr),console.log(` ${Xn("Next steps")}`),console.log(nr),console.log(""),console.log(` ${Xn("1.")} Start the proxy:`),console.log(` ${Qn("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Xn("2.")} In Cowork ${Zn("→")} Settings ${Zn("→")} Inference Provider, set:`),console.log(` ${Xn("inferenceGatewayBaseUrl")} = ${Qn(`https://${n}:<port>`)}`),console.log(` ${Zn("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Xn("3.")} Restart Cowork ${Zn("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${Zn("For Cowork's own configuration docs, see:")}`),console.log(` ${Qn("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),_.exit(0)}}),hr=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:dr},async run({args:e}){await async function(e){if(console.log(""),console.log(nr),console.log(` ${Xn("Claude Cowork Setup")} ${Zn("— Revert")}`),console.log(nr),console.log(""),!await ur())return console.log(` ${Zn("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${Xn("Remove Tailscale cert files:")}`),console.log(` ${Zn(ar)}`),console.log(` ${Zn(ir)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(rr,{recursive:!0}),console.log(` ${er("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${Zn("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),_.exit(0)}}),gr=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:mr,install:fr,revert:hr}}),_r=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function yr(e){if(!_r.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 wr(e){return"string"==typeof e?yr(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=wr(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?wr(a):a;!t&&(i!==a||"__proto__"===r)&&(t=br({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=br({},o,o.length),t.properties={}),t??e}(e):e}function br(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const kr="x-copilot-api-self-test",vr=R();const xr=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function $r(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 Tr(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();rt.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:u.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(Te.add(1,d),Le.record(s,d),c>=400&&Ae.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&&(Se.add(e.inputTokens,t),Ve.record(e.inputTokens,t)),e.outputTokens&&(Ee.add(e.outputTokens,t),Xe.record(e.outputTokens,t)),e.cachedTokens&&Oe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&he.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const Ar=1048576;const Sr=async()=>{if(!ee())return ve.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),Qe.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Fe.add(1,{result:"rejected"}),new Jt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Fe.add(1,{result:"approved"})}finally{e.end()}})};async function Er(e){if(Io(oe)||await $n())return null;let t=_n();return t?(m.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${wn()}`,type:"authentication_error"}},401)):(m.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 Or(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function Cr(e,t){void 0!==t.prompt_tokens&&e.setAttribute("copilot_api.input_tokens",t.prompt_tokens),void 0!==t.completion_tokens&&e.setAttribute("copilot_api.output_tokens",t.completion_tokens),void 0!==t.total_tokens&&e.setAttribute("copilot_api.total_tokens",t.total_tokens)}var Ir=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Pr(e){if(!e||"string"!=typeof e)throw new Ir("Model name is required and must be a string");if("foundry"===oe.provider)return e;if(!oe.models?.data)throw new Ir("Models not available. Please try again later.",503);let t=oe.models.data.map(e=>e.id);if(t.includes(e))return e;let o=Go(e,t);if(!o)throw Ie.add(1,{requested_model:e}),new Ir(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Nr(e){let t=oe.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===oe.provider?jo(e):/gpt-[\d.]+-codex/i.test(e)}async function Rr(e){if(void 0===e.rateLimitSeconds||ee())return;let t=e.rateLimitSeconds;return ve.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"),Ce.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Jt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Ce.add(1,{action:"waited",source:"local"}),Ke.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await nn(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var qr=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function jr(e){if(e instanceof qr)return{type:e.type,message:e.message};if(e instanceof Jt){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 Dr(e,t){let{type:n,message:r}=jr(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 Mr(e,t){let{type:n,message:r}=jr(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 Fr(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 Hr(e,t,o){return Math.min(Math.max(e,t),o)}function Ur(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 Ur(JSON.parse(r),t+1)}catch{return null}}function Br(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Fr(o.capabilities.supports.min_thinking_budget),r=Fr(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Fr(o.capabilities.limits?.max_output_tokens)??void 0}}function Lr(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Hr(Fr(e.requestedBudget)??o,o,n),a=Fr(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 zr(e,t){if(rn(e.thinking_budget))return e;let o=Br(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Lr({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 Gr(e){return"invalid_thinking_budget"===Ur(e)}async function Kr(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(rn(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(!Gr(i))return null;let l=Br(n,t.model);return l?function(e,t){let o=Lr({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=Fr(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 Jr(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 Wr(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const Yr=new Map,Vr=new Map,Xr=new Set;let Zr,Qr,ea;function ta(e){return!e.closed&&!e.destroyed}function oa(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new C(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return Yr.set(t,Date.now()),Ue.add(1,{event:"created",origin:e}),et(y.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=Xr.has(t);Ue.add(1,{event:"goaway",origin:e}),et(i?y.WARN:y.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}),Vr.delete(t),Xr.delete(t),Yr.delete(t),ta(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function na(e,t){if(!oe.connectivity.h2)return;if(Zr&&Zr!==e&&function(){for(let e of[...Vr.keys(),...Xr])ta(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Vr.clear(),Xr.clear(),Yr.clear()}(),Zr=e,t?.fresh){let t=oa(e);return Xr.add(t),t}let n=Date.now();for(let[t]of Vr)if(n-(Yr.get(t)??0)>=6e5)Vr.delete(t),Yr.delete(t),ta(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ue.add(1,{event:"rotated",origin:e}),et(y.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(ta(t))return Vr.delete(t),Xr.add(t),t;Vr.delete(t),Yr.delete(t)}let r=oa(e);return Xr.add(r),r}function ra(e){e&&Xr.delete(e)&&(ta(e)?Vr.set(e,Date.now()):Yr.delete(e))}function aa(){ea||(ea=setInterval(()=>{!function(){let e=Date.now(),t=oe.connectivity.h2Keepalive,n=Vr.size;for(let[r,a]of Vr)e-a<6e4||t&&n<=1||(Vr.delete(r),Yr.delete(r),n--,ta(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ue.add(1,{event:"idle_reaped",origin:Zr??""}),et(y.INFO,"INFO",`HTTP/2 idle connection reaped for ${Zr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Zr??""}))}()},3e4),ea.unref())}function ia(){Qr||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Qr=setInterval(()=>{(async function(){if(0===Vr.size&&0===Xr.size){if(Zr){let e=oa(Zr);Vr.set(e,Date.now())}return}let e=[...Vr.keys()];for(let t of e)Vr.delete(t);await Promise.allSettled(e.map(async e=>{if(ta(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:gt(oe)});await n.dump(),He.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Vr.set(e,Date.now())}catch(t){He.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ue.add(1,{event:"error",origin:Zr??""}),Yr.delete(e),ta(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Yr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Qr.unref(),aa())}function sa(e){return e.max_completion_tokens??e.max_tokens}async function la(e,t,o){try{if(!e.ok)throw new Jt("Failed to create chat completions",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&Cr(t,n.usage),n}catch(e){throw tt(t,e),e}finally{t.end()}}const ca=e=>So(oe)?e:function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=sa(e);return null==i?a:{...a,max_completion_tokens:i}}(e,oe.models),ua=e=>So(oe)?e:wr(e),pa=async e=>{let t=ua(e);try{return await da(t)}catch(e){if(e instanceof Jt&&401===e.response.status)return await wo(),da(t);let n;if(e instanceof Jt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Kr({payload:t,error:e,models:oe.models,errorBodyText:n});if(r)return e instanceof Jt&&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 da(ua(r));throw e}},da=async e=>{if(!Io(oe))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={...Co(oe,t),"X-Initiator":o?"agent":"user"},r=Oo(oe),a=`${r}/chat/completions`,i=oe.timeoutMs,s=ca(e),l=JSON.stringify(s),c={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":i,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":sa(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=na(r,{fresh:t>0}),s=new AbortController,u=Yt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await st({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}),m=new Response(p,{status:r,headers:u});if(e.stream){if(!m.ok)throw d.end(),new Jt("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:F(m),span:d,release:()=>ra(o)}}try{return await la(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{ra(o)}}catch(e){if(ra(o),await Kt(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ma=new Map;const fa=["none","minimal","low","medium","high","xhigh","max"];function ha(e,t){if(!e.reasoning)return e;if(0===t.length){let{reasoning:t,...o}=e;return o}let o=e.reasoning.effort;if(!o)return e;let n=function(e,t){if(t.includes(e))return e;let o=fa.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=fa.indexOf(e);if(-1===t)continue;let a=Math.abs(t-o);a<r&&(r=a,n=e)}return n??t[0]}(o,t);return n&&n!==o?{...e,reasoning:{...e.reasoning,effort:n}}:e}function ga(e,t){if(!e.reasoning)return null;let n=function(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}let{param:o,code:n,message:r=""}=t.error??{};if("reasoning.effort"===o||"reasoning"===o){if("unsupported_value"===n){let e=[...(/Supported values are:(.*)$/i.exec(r)?.[1]??"").matchAll(/\x27([^\x27]+)\x27/g)].map(e=>e[1]);return e.length>0?{kind:"unsupported_value",supported:e}:void 0}if("unsupported_parameter"===n)return{kind:"unsupported_parameter"}}}(t);if(!n)return null;let r="unsupported_value"===n.kind?n.supported:[];ma.set(e.model,r);let a=ha(e,r);return a===e?null:(o.debug(`Foundry rejected reasoning.effort=${e.reasoning.effort} on ${e.model}; retrying with ${a.reasoning?.effort??"no reasoning"}`),a)}async function _a(e,t,o){try{if(!e.ok)throw new Jt("Failed to create responses",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&Cr(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens,prompt_tokens_details:n.usage.input_tokens_details}),n}catch(e){throw tt(t,e),e}finally{t.end()}}const ya=async e=>{let t=So(oe),o=t?function(e){let t=ma.get(e.model);return t?ha(e,t):e}(e):e;try{return await wa(o)}catch(e){if(e instanceof Jt&&401===e.response.status)return await wo(),wa(o);if(t&&e instanceof Jt&&400===e.response.status){let t=ga(o,await e.response.clone().text().catch(()=>{}));if(t)return wa(t)}throw e}},wa=async e=>{if(!Io(oe))throw Error("Service token not found");let t=So(oe)?e:wr(e),o={...Co(oe),"X-Initiator":"agent"},n=Oo(oe),r=`${n}/responses`,a=oe.timeoutMs,i=JSON.stringify(t),s={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":a,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let l=na(n,{fresh:e>0}),c=new AbortController,u=Yt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await st({spanName:"copilot POST /responses",url:r,target:"responses",headers:o,body:i,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...s,"copilot_api.h2.retry_attempt":e},dispatcher:l}),m=new Response(p,{status:n,headers:u});if(t.stream){let e=en(m);if(e&&(d.setAttribute("copilot_api.foundry.throttled_stream",!0),await(m.body?.cancel())),!m.ok||e)throw d.end(),new Jt("Failed to create responses",e??m,{outgoingBody:i,outgoingHeaders:o});return{events:F(m),span:d,release:()=>ra(l)}}try{return await _a(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{ra(l)}}catch(t){if(ra(l),await Kt(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ba=e=>Object.hasOwn(e,"output");function ka(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens,...t.input_tokens_details&&{prompt_tokens_details:{cached_tokens:t.input_tokens_details.cached_tokens}}}:null}var va=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const xa=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 $a(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new va(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new va(`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=>Aa(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=Sa(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Aa(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:Aa(o.content)})}return t}(e.messages);if(0===o.length)throw new va("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),Ta(e.temperature)&&(n.temperature=e.temperature),Ta(e.top_p)&&(n.top_p=e.top_p),Ta(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),Ta(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 Ta(e){return null!=e}function Aa(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Sa(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 va(`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 Ea(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 Oa(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 Ca(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 Ia(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Pa(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Ia(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Ca(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),[Ca(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Na(e,t){let o=[Ca(e,{},Oa(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=Ea(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Ra(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:[Ca(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Pa(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Ia(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Ca(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Na(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 qa="openai_responses";function ja(e){let t=performance.now(),n=ve.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),$a(e)}finally{t.end()}});Je.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!xa.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 Da(e){let t=performance.now(),o=ve.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:Oa(e,n.length>0)}]};return e.usage&&(r.usage=Ea(e.usage)),r}(e)}finally{t.end()}});return Je.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Ma(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=Ea(t.usage);a.tokenUsage=Or(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?(m.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(Da(t))}async function Fa(e,t,n){let r;try{r=ja(t)}catch(t){if(t instanceof va)return m.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}),oe.manualApprove&&!n.isSelfTest&&await Sr();let a=await Er(e);if(a)return a;let i=performance.now(),s=await ya(r),l=performance.now()-i;if(ze.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),ba(s))return Ma(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 M(e,async t=>{let n=null,a=0,s=performance.now(),m=Jr(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++,Me.add(1,{model:r.model,endpoint_type:qa});let c=ka(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Or(c),t._d1=l,e.set("requestData",t)}let u=Ra(s,d);if(u.error)throw new qr(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:qa};Ge.record(performance.now()-s,u),Ze.record(a,u),Wr(e,i)}catch(o){throw ot(u,e.get("requestSpan"),o),await Mr(t,o),o}finally{n&&Cr(u,n),u.end(),p()}let f=e.get("requestId");f&&he.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Ha(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 Ua(e){let t=!0===e.get("isSelfTest");t||await Rr(oe);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return ve.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Pr(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),Pe.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 Ir)return m.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(Nr(n.model))return Fa(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),oe.manualApprove&&!t&&await Sr(),"foundry"!==oe.provider&&(n=function(e){if(!rn(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!rn(e.max_tokens))return e;let t=(oe.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=zr(n,oe.models)),rn(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Er(e);if(r)return r;let a=performance.now(),i=await pa(n),s=performance.now()-a;if(ze.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Ba(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Or(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 M(e,async t=>{let o={value:null},r=0,i=performance.now(),p=Jr(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Me.add(1,{model:n.model,endpoint_type:"openai"}),i=Ha(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Or(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(Ge.record(c,u),Ze.record(r,u),Wr(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Or(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw ot(c,e.get("requestSpan"),o),await Mr(t,o),o}finally{o.value&&Cr(c,o.value),c.end(),u()}let d=e.get("requestId");d&&he.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Ba=e=>Object.hasOwn(e,"choices"),La=new j;La.post("/",async e=>{try{return await Ua(e)}catch(t){return await ho(e,t)}});const za=new j;za.post("/",async e=>{try{let t=await e.req.json();try{t.model=Pr(t.model)}catch(t){if(t instanceof Ir)return m.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 Er(e);if(o)return o;let n=performance.now(),r=await(async e=>{if(!Io(oe))throw Error("Service token not found");let t=`${Oo(oe)}/embeddings`,o=Co(oe),n=oe.timeoutMs,r=new AbortController,a=Yt(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await it({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1}});try{if(!n.ok)throw new Jt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw tt(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),a=performance.now()-n;ze.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Or(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await ho(e,t)}});const Ga=new j;let Ka=null,Ja=null;function Wa(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function Ya(e){return!Wa(e)}Ga.get("/",async e=>{let t,o=function(){if(So(oe))return Io(oe)?"valid":"missing";let e=oe._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=Ka;return t&&e-t.timestamp<3e4?{result:t.result}:Ja||(Ja=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${Oo(oe)}/models`,n=await fetch(t,{method:"GET",headers:Co(oe),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Ka={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Ka={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),Ja=null}})(),Ja)}();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.9",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 Va=new H(B),Xa={...U["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Za(e){try{return Va.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function Qa(e){let t=0;for(let o of e)switch(o.type){case"text":t+=Za(o.text)*Xa.contentMultiplier;break;case"tool_use":t+=Za(o.name+JSON.stringify(o.input))*Xa.contentMultiplier;break;case"tool_result":o.content&&(t+=Za("string"==typeof o.content?o.content:JSON.stringify(o.content))*Xa.contentMultiplier);break;case"thinking":t+=Za(o.thinking)*Xa.contentMultiplier;break;case"image":t+=1600}return t}function ei(e){let t=0,o=e.properties;if(!o)return t;let n=Object.entries(o);for(let[e,[o,r]]of n.entries()){if(t+=0===e?Xa.perFirstProp:Xa.perAdditionalProp,t+=Za(o),r.description&&(t+=Xa.perPropDesc+Za(r.description)),r.enum&&Array.isArray(r.enum)){t+=Xa.perEnum;for(let e of r.enum)t+=Za(String(e))}if("object"===r.type&&r.properties&&(t+=Xa.perNestedObject,t+=ei(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=Xa.perArrayOfObjects,t+=ei(e))}}return t}function ti(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")};return e.thinking&&(o["copilot_api.thinking.type"]=e.thinking.type,"budget_tokens"in e.thinking&&e.thinking.budget_tokens&&(o["copilot_api.thinking.budget_tokens"]=e.thinking.budget_tokens)),e.output_config?.effort&&(o["copilot_api.output_config.effort"]=e.output_config.effort),o}function oi(e,t,o){let n=ti(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const ni=async(e,t,n)=>{try{return await ri(e,t)}catch(r){if(r instanceof Jt&&401===r.response.status)return await wo(),ri(e,t);if(r instanceof Jt&&400===r.response.status&&n?.onStructuredOutputFallback){let a;try{a=await r.response.clone().text()}catch{a=void 0}let i=n.onStructuredOutputFallback(e,a);if(i)return o.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${i.model}`),ri(i,t)}throw r}};const ri=async(e,t)=>{if(!Io(oe))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=So(oe)&&oe.foundry?{baseUrl:To(oe.foundry),headers:Ao(oe.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={...yt(oe,t,r),"X-Initiator":"agent"};return{baseUrl:ht(oe),headers:a,cleanPayload:n}}(wr(e),t),a=`${o}/v1/messages`,i=oe.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",...ti(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){let t=na(o,{fresh:e>0}),c=new AbortController,u=Yt(c,i);try{let{statusCode:o,headers:u,body:p,span:d}=await st({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 Jt("Failed to create anthropic messages",m,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:F(m),span:d,release:()=>ra(t)};try{let e=await m.json();"string"==typeof e.id&&d.setAttribute("copilot_api.response.id",e.id);let t=e.usage;return t&&Cr(d,{prompt_tokens:t.input_tokens??0,completion_tokens:t.output_tokens??0,total_tokens:(t.input_tokens??0)+(t.output_tokens??0)}),e}finally{d.end(),ra(t)}}catch(o){if(ra(t),await Kt(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ai=new Set(["low","medium","high","max","xhigh"]);function ii(e){let t=e.output_config?.effort;if(!t)return e;let n=oe.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Jo(t,n);if(!r||!ai.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=m.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 si(e,t,n){if("foundry"===oe.provider)return ii(e);let r=t.includes(e.model)?e.model:Go(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=Go(e,t);if(!n)return null;let r=new Set(t);if(o.context1m){let e=function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,r);if(e)return e}if(o.effort){let e=function(e,t,o){let n=null;if("high"===o?n="high":("max"===o||"xhigh"===o)&&(n="xhigh"),!n)return null;let r=`${e}-${n}`;return t.has(r)?r:null}(n,r,o.effort);if(e)return e}return null}(a.model,t,{context1m:n.context1m,effort:a.output_config?.effort}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=m.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 ii(s)}const li=e=>"object"==typeof e&&!!e&&!Array.isArray(e),ci=["properties","patternProperties","$defs","definitions"],ui=["items","additionalProperties","propertyNames","contains","not","if","then","else"],pi=["anyOf","allOf","oneOf","prefixItems"];const di=()=>["string","number","boolean"].map(e=>({type:e})),mi=()=>({anyOf:[...di(),{type:"array",items:{anyOf:di()}},{type:"object"}]}),fi=e=>!0===e||li(e)&&0===Object.keys(e).length,hi=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function gi(e,t){let o={...e};for(let e of ci){let n=o[e];li(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,li(o)?gi(o,t):o])))}for(let e of ui){let n=o[e];li(n)&&(o[e]=gi(n,t))}for(let e of pi){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>li(e)?gi(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(li(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>fi(e)?mi().anyOf:li(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)),hi(o)&&(!("items"in o)||fi(o.items))&&(t.add("items"),o.items=mi()),fi(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function _i(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=wi(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function yi(e){return bi(wi(e))}function wi(e){return"string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.flatMap(e=>"text"===e.type&&"string"==typeof e.text?[e.text]:[]).join("\n\n"):""}function bi(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function ki(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>bi(e)).filter(Boolean).join("\n\n")}const vi=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),xi=new Set(["text","image"]);function $i(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);xi.has(e)||t.add(`block:tool_result:${e}`)}}const Ti=new Set;function Ai(e,t){e.setAttribute("copilot_api.translation.system_message_count",t.filter(e=>"system"===e.role).length);let o=function(e){let t=new Set;for(let o of e){if(t.size>=20)break;let e=String(o.role).slice(0,64),n=vi.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&&$i(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(Ti.size>=100)break;Ti.has(o)||(Ti.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 Si=e=>P("sha256").update(e).digest("hex").slice(0,12);function Ei(e,t){e.setAttribute("copilot_api.translation.system_hash",Si(t.system)),e.setAttribute("copilot_api.translation.tools_hash",Si(JSON.stringify(t.tools??[])))}function Oi(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Ci(e){return e.toLowerCase().startsWith("claude-")}function Ii(e,t){let o={model:e.model,messages:Pi(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:Hi(e.tools,e.model),tool_choice:Ui(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Br(t,o.model);if(r){let a="enabled"===n.type&&"number"==typeof n.budget_tokens?n.budget_tokens:function(e,t,o){let n=function(e,t){return"max"===e||"xhigh"===e?t:"high"===e?16e3:"medium"===e?8e3:1024}(e,o.max),r=Fr(t),a=r&&r>1?r-1:o.min;return Hr(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=zr({...o,thinking_budget:a},t)}}return o}function Pi(e,t){let{leadingSystemTexts:o,messages:n}=_i(e),r=function(e,t){let o=ki(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=yi(e);if(!t)break;Ni(r)?a.push(t):Ri(r,t);break}case"user":r.push(...qi(e));for(let e of a)Ri(r,e);a=[];break;case"assistant":r.push(...ji(e))}for(let e of a)Ri(r,e);return r}function Ni(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function Ri(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 qi(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:Fi(e.content)});n.length>0&&t.push({role:"user",content:Fi(n)})}else t.push({role:"user",content:Fi(e.content)});return t}function ji(e){let t=function(e){return{reasoning_text:Mi(e.reasoning_text),reasoning_opaque:Mi(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Fi(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:Fi(e.content),...t}]}const Di=32768;function Mi(e){if("string"==typeof e)return e.length<=Di?e:e.slice(0,Di)}function Fi(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 Hi(e,t){if(!e)return;let o=e.filter(Ya),n=function(e){return e.toLowerCase().startsWith("gemini")}(t),r=new Set,a=o.map(e=>{let t=e.input_schema;if(n){let e=function(e){let t=new Set;return{schema:gi(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)r.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return r.size>0&&m.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function Ui(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 Bi(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 Li(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function zi(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 Gi=new Set(["low","medium","high","max","xhigh"]);function Ki(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&&Gi.has(e)?e:null)(Jo(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 Ji(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 Wi=/[^\w-]/g;function Yi(e){return e.replaceAll(Wi,"_")}function Vi(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=Ki(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:Ji(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:Yi(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Yi(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Xi(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t)return"thinking must be an object";let o=t,n=new Set(["enabled","adaptive","disabled"]);return"string"==typeof o.type&&n.has(o.type)?"enabled"!==o.type||void 0===o.budget_tokens||"number"==typeof o.budget_tokens&&Number.isFinite(o.budget_tokens)&&!(o.budget_tokens<=0)&&Number.isInteger(o.budget_tokens)?null:"thinking.budget_tokens must be a positive integer":"thinking.type must be one of: enabled, adaptive, disabled"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t)return"output_config must be an object";let o=t;if(void 0===o.effort)return null;let n=new Set(["low","medium","high","max","xhigh"]);return"string"==typeof o.effort&&n.has(o.effort)?null:"output_config.effort must be one of: low, medium, high, max, xhigh"}(e)}function Zi(e,t,o=400){return m.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function Qi(e,t){return ve.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),oi(n,t,e.req.header("anthropic-beta"));let r=Pr(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Xi(t);return a?(m.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),Pe.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 Ir)return{ok:!1,response:Zi(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function es(e,t,o){let{leadingSystemTexts:n,messages:r}=_i(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=yi(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(is(e));break}case"user":t.push(...ss(n),...o.map(e=>is(e))),o=[];break;case"assistant":t.push(...cs(n))}return t.push(...o.map(e=>is(e))),t}(r);if(0===a.length)throw new Jt("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 ki(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(Ya).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:as(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=Jo(o,t);return{effort:rs(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function ts(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${P("sha256").update(o).digest("hex").slice(0,32)}`}function os(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 ns=new Set(["low","medium","high","xhigh"]),rs=e=>null!==e&&ns.has(e);function as(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function is(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function ss(e){if("string"==typeof e.content)return[{type:"message",role:"user",content:e.content}];let t=[],o=e.content.filter(e=>"tool_result"===e.type),n=e.content.filter(e=>"tool_result"!==e.type);for(let e of o)t.push(ls(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)switch(t.type){case"text":e.push({type:"input_text",text:t.text});break;case"image":e.push({type:"input_image",image_url:`data:${t.source.media_type};base64,${t.source.data}`,detail:"high"})}t.push({type:"message",role:"user",content:e})}else{let e=n.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function ls(e){let t;return t="string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.filter(e=>"text"===e.type).map(e=>e.text).join("\n"):"",e.is_error&&(t=`[ERROR] ${t}`),{type:"function_call_output",call_id:e.tool_use_id,output:t}}function cs(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 us(e,t){if(t)return"tool_use";switch(e){case"completed":case"cancelled":case"failed":return"end_turn";case"incomplete":return"max_tokens";default:return null}}function ps(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function ds(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 ms(e,t){let o=[];switch(e.type){case"response.created":ds(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){ds(t,o),ps(t,o);let n=e.item;t.toolCalls[e.output_index]={call_id:n.call_id,name:n.name,_bi1:t.contentBlockIndex},o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"tool_use",id:n.call_id,name:n.name,input:{}}}),t.contentBlockOpen=!0}break;case"response.content_part.added":ds(t,o),ps(t,o),o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),t.contentBlockOpen=!0;break;case"response.output_text.delta":o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"response.content_part.done":ps(t,o);break;case"response.function_call_arguments.delta":{let n=t.toolCalls[e.output_index];n&&o.push({type:"content_block_delta",index:n._bi1,delta:{type:"input_json_delta",partial_json:e.delta}});break}case"response.output_item.done":if("function_call"===e.item.type){let n=t.toolCalls[e.output_index];n&&t.contentBlockOpen&&(o.push({type:"content_block_stop",index:n._bi1}),t.contentBlockIndex++,t.contentBlockOpen=!1)}break;case"response.completed":{ps(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:us(e.response.status,n),stop_sequence:null},usage:os(r)},{type:"message_stop"});break}case"response.incomplete":{ds(t,o),ps(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:os(n)},{type:"message_stop"});break}case"response.failed":ds(t,o),ps(t,o),o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":ds(t,o),ps(t,o),o.push({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{input_tokens:0,output_tokens:0}},{type:"message_stop"});break;case"response.refusal.delta":ds(t,o),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}})}return o}function fs(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 hs(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function gs(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&&(fs(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&&(fs(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),hs(t,o)),r.content&&(hs(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){hs(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&&(hs(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Oi(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 _s=/structured_outputs|output_config\.format/i;function ys(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&_s.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Vi({...e,model:Lo},o):null}var ws=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var bs=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const ks={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 it({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 tt(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new bs: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 it({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 tt(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new ws:e}finally{clearTimeout(i)}}},vs=["tavily","exa"];function xs(e){return"tavily"===e||"exa"===e}function $s(){return oe.webSearchProviders.length>0}async function Ts(e,t){return async function(e,t,n){let{providers:r,searchFns:a=ks}=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:oe.webSearchProviders})}function As(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Ss(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 Es(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&&Wa(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(!$s())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await Ts(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_${As()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...Ss(n,e)}];return{id:`msg_ws_${As()}`,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_${As()}`,r=`msg_ws_${As()}`,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:Ss(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}),M(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const Os=(e,t)=>!(!e||!t||e===t);async function Cs(e){if(Io(oe)||await $n())return null;let t=_n();return t?(m.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${wn()}`}},401)):(m.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 Is(e,t){let o=t.model;return o&&"string"==typeof o?null:Zi(e,"Model name is required and must be a string")}async function Ps(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&Wa(t[0])}(t))return Is(e,t)??Es(e,t);await Rr(oe),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=Is(e,t);if(a)return a;t=function(e,t){return si(t,oe.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Qi(e,t);if(!i.ok)return i.response;t=i.payload;let s=await Cs(e);if(s)return s;if(Nr(t.model))return js(e,t);if(function(e){if("foundry"!==oe.provider)return Ci(e);let t=oe.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:Ci(e)}(t.model))return async function(e,t,o){let n="foundry"===oe.provider,r=n?t:Vi(t,oe.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:Os(o,i),streaming:!!r.stream}),oe.manualApprove&&await Sr(),ve.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),oi(t,r,a.anthropicBeta);try{let o=performance.now(),i=await ni(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=ys(e,o,oe.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(ze.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=Or(Rs(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 M(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=Jr(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,Me.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),qs(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"};Ge.record(e,t),Ze.record(a,t)}catch(t){throw ot(c,e.get("requestSpan"),t),await Dr(n,t),t}finally{if(Wr(e,o),p){let t=Rs(s);Cr(c,t);let o=e.get("requestData")||{};o.tokenUsage=Or(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&he.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw tt(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=ve.startActiveSpan("copilot_api.translate.anthropic_to_openai",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),o.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),o.setAttribute("copilot_api.translation.has_system",!!t.system),o.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let n=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)),r=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),Ai(o,t.messages);let a=Ii(t,oe.models),i=a.messages.at(0);return Ei(o,{system:"system"===i?.role&&"string"==typeof i.content?i.content:"",tools:a.tools}),a}finally{o.end()}});Je.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=zr(c,oe.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:Os(r,u),streaming:!!c.stream});let p=performance.now();oe.manualApprove&&await Sr();let d=await pa(c),m=performance.now()-p;if(ze.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),Ns(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=Or(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=ve.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=Li(a.message),i=Bi(a.message.content),s=zi(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:Oi(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 Je.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 M(e,async t=>{let n=null,r=0,a=performance.now(),i=Jr(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++,Me.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=Or(n),t._d1=m,e.set("requestData",t)}let u=gs(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(Ge.record(l,u),Ze.record(r,u),Wr(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Or(n),t._d1=m,e.set("requestData",t))}}catch(o){throw ot(h,e.get("requestSpan"),o),await Dr(t,o),o}finally{n&&Cr(h,n),h.end(),g()}let l=e.get("requestId");l&&he.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Ns=e=>Object.hasOwn(e,"choices");function Rs(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 qs(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}async function js(e,t){let r=performance.now(),a=ve.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),Ai(o,t.messages);let n=es(t,oe.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===oe.provider,promptCacheKey:"foundry"===oe.provider?ts(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return Ei(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});Je.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),oe.manualApprove&&await Sr();let i=performance.now(),s=await ya(a),l=performance.now()-i;if(ze.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),ba(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Or({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens,prompt_tokens_details:s.usage.input_tokens_details})),t._d1=l,t.upstreamTtfbMs=l,t.upstreamTotalMs=l,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(s).slice(-400)),"failed"===s.status)return m.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:s.error?.code??"api_error",message:s.error?.message??"Response generation failed"}},500);let r=performance.now(),a=ve.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:us(e.status,o),stop_sequence:null,usage:os(e.usage)}}(s)}finally{e.end()}});return Je.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return M(e,async t=>{let n=null,r=0,s=performance.now(),d=Jr(e,i),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let i of c){if(d(),o.debug("Responses API raw stream event:",i),!i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}r++,Me.add(1,{model:a.model,endpoint_type:"responses"});let c=ka(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Or(n),t._d1=l,e.set("requestData",t)}let u=ms(s,m);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let u=performance.now()-s,p={model:a.model,endpoint_type:"responses"};Ge.record(u,p),Ze.record(r,p),Wr(e,i)}catch(o){throw ot(u,e.get("requestSpan"),o),await Dr(t,o),o}finally{n&&Cr(u,n),u.end(),p()}let f=e.get("requestId");f&&he.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const Ds=new j;Ds.post("/",async e=>{try{return await on(e,Ps)}catch(t){return await ho(e,t)}});const Ms=new j;function Fs(e){return ve.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Pr(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),Pe.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 Hs(e,t){let o=function(e){try{let t=JSON.parse(e);if(("response.completed"===t.type||"response.incomplete"===t.type)&&t.response?.usage){let e=t.response.usage;return{prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=Or(o),n._d1=t._d1,t.c.set("requestData",n)}Ms.get("/",async e=>{try{oe.models||await an();let t=oe.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 ho(e,t)}});const Us=new Set(["message","function_call","function_call_output"]),Bs=new Set(["type","name","description","parameters"]);async function Ls(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||!$s())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await Ts(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function zs(e){if($s())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Ls(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Gs(e){if(!$s())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 Ls(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Ks(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 Us.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Js(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 Ws(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&&Js(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)Js(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Ys(e){return null!=e}function Vs(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Xs(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Zs(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(!Vs(n)){o.push(n);continue}let e=Ks(n);null===e?t.add(Xs(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"])Ys(e[o])&&(t[o]=e[o]);let r=new Set;if(Ys(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))Bs.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(Ys(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Ys(o.effort)&&(t.reasoning.effort=o.effort),Ys(o.summary)&&(t.reasoning.summary=o.summary)}if(Ys(e.text)&&"object"==typeof e.text){let o=e.text;Ys(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Qs(e,t){return m.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function el(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=m.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||Ys(n.previous_response_id)||Ys(n.prompt)||Ys(n.conversation)?null:Qs(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 tl(e){await Rr(oe);let t=await e.req.json();if(!Vs(t))return Qs(e,"request body must be a JSON object");let n=function(e){return"foundry"===oe.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:Zs(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:Fs(t)}}catch(t){if(t instanceof Ir)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=el(e,t.input,n);if(s)return s;let l=await Er(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),oe.manualApprove&&await Sr();let c=performance.now(),u=await ya(a),p=performance.now()-c;if(ze.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),ol(u))return async function(e,t,o){await zs(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Or({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return M(e,async t=>{let o={value:null},n=0,i=performance.now(),s=Jr(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Ws(i.data,r);s=await Gs(s);let l=s===i.data?i:{...i,data:s};Me.add(1,{model:a.model,endpoint_type:"responses"}),Hs(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"};Ge.record(l,u),Ze.record(n,u),Wr(e,c)}catch(o){throw ot(m,e.get("requestSpan"),o),await Mr(t,o),o}finally{o.value&&Cr(m,o.value),m.end(),f()}let l=e.get("requestId");l&&he.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const ol=e=>Object.hasOwn(e,"output"),nl=new j;nl.post("/",async e=>{try{return await on(e,tl)}catch(t){return await ho(e,t)}});const rl=new j;rl.get("/",e=>{try{return oe.showToken?e.json({token:oe._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 al=new j;al.get("/",async e=>{try{let t=await Hn();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const il=new j;function sl(){return function(e){let t=e.filter(e=>$r(e));if(0===t.length)return;let o=t.find(e=>xr.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(oe.models?.data??[])}function ll(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 yr(o).slice(0,200)}catch{}let t=yr(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 cl(e={}){let t=performance.now(),o=e.model&&function(e){let t=oe.models?.data.find(t=>t.id===e);return void 0!==t&&$r(t)}(e.model)?e.model:sl();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 il.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[kr]:vr},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:ll(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)}}il.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=$t(i),l=function(e){return e===vr}(e.req.header(kr));e.set("requestId",r),e.set("isSelfTest",l),e.header("x-request-id",r);let d=ve.startSpan("copilot_api.handle_request",{kind:c.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",d),e.set("requestTraceContext",d.spanContext()),l&&d.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();rt.has(e)||"x-copilot-api-self-test"!==e&&d.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=await e.req.raw.clone().text();e.set("rawBody",t.length>Ar?t.slice(0,Ar):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let f,h=new Promise(e=>{f=e});e.set("streamComplete",h),e.set("resolveStreamComplete",f);let g=m.setSpan(p.active(),d);await p.with(g,async()=>{l||he.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw d.setStatus({code:u.ERROR,message:t.message}),d.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:d};_?.streaming&&e.res.status<400?h.then(()=>Tr(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{d.recordException(t),d.setStatus({code:u.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{d.end()}catch{}}):Tr(y)}),il.use(D()),il.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()}),il.get("/",e=>e.text("Server running")),il.route("/health",Ga),il.route("/chat/completions",La),il.route("/models",Ms),il.route("/embeddings",za),il.route("/usage",al),il.route("/token",rl),il.route("/v1/chat/completions",La),il.route("/v1/models",Ms),il.route("/v1/embeddings",za),il.route("/v1/messages",Ds),il.post("/v1/messages/count_tokens",async function(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:"invalid_request_error",message:"Invalid JSON"}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let o=Xa.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=Xa.perMessage+Za(e)*Xa.contentMultiplier}for(let e of t.messages)o+=Xa.perMessage,o+=Za(e.role),"string"==typeof e.content?o+=Za(e.content)*Xa.contentMultiplier:Array.isArray(e.content)&&(o+=Qa(e.content));let n=t.tools?.filter(Ya);return n&&n.length>0&&(o+=function(e){let t=Xa.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=Xa.perTool),t+=Za(n.name),n.description&&(t+=Xa.perDesc+Za(n.description)),t+=ei(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),il.route("/v1/responses",nl),il.route("/responses",nl),il.onError((e,t)=>ho(t,e));const ul=e=>`[1m${e}[0m`,pl=e=>`[2m${e}[0m`,dl=e=>`[32m${e}[0m`,ml=e=>`[31m${e}[0m`,fl=e=>`[33m${e}[0m`,hl=pl(" ─────────────────────────────────────────────────────────────");function gl(e,t,o){console.log(` ${function(e){return"ok"===e?dl("✓"):"warn"===e?fl("⚠"):ml("✗")}(e)} ${ul(t.padEnd(14))} ${o}`)}function _l(e){console.log(` ${pl("↳")} ${pl(e)}`)}function yl(e){return e instanceof Jt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function wl(){let e=_.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(Y.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 bl(){try{await an();let e=(oe.models?.data.length??0)>0;return gl(e?"ok":"warn","Model catalog",e?function(){let e=oe.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 gl("fail","Model catalog",yl(e)),_l("Could not fetch /models — check connectivity/auth."),!1}}async function kl(e){oe.accountType=e.accountType;let t=await Rt(),o=qt();if(console.log(""),console.log(` ${ul("COPILOT-API DOCTOR")} ${pl(`v${t}`)}`),console.log(hl),gl("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await V(),sn(),!await async function(){let e=await wl();if(!e)return gl("fail","Auth token","not found"),void _l("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");oe._t2=e.token,gl("ok","Auth token",`found (${e.source})`);try{let e=await _o();return await ft(oe,e.login),gl("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return gl("fail","GitHub auth",yl(e)),void _l("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(hl),console.log(` ${ml("✗")} ${ul("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await go();return oe._t1=e,gl("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Jt?e.response.status:0;return gl("fail","Service token",yl(e)),_l(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 bl();await async function(){try{let e=await Hn(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Rn(qn(t))} of ${Rn(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;gl("ok","Copilot plan",`${e.copilot_plan} · ${o} `+pl(`(resets ${e.quota_reset_date})`))}catch(e){gl("warn","Copilot plan",`unavailable (${yl(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await cl();return e.ok?(gl("ok","Generation",`works via ${e.model} ${pl(`(${e.durationMs}ms)`)}`),!0):(gl("fail","Generation",`${e.reason}${e.status?pl(` [HTTP ${e.status}]`):""}`),!1)}():gl("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=_.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){gl(t,"Client config","potential base-URL issue");for(let t of e)_l(t)}else gl("ok","Client config","no base-URL issues detected");_l("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(hl),a?(console.log(` ${dl("✓")} ${ul("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${fl("⚠")} ${ul("Some checks need attention")} — see the ${ml("✗")}/${fl("⚠")} lines above.`),console.log(""),2)}const vl=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 kl({accountType:e["account-type"]});_.exit(t)}});function xl(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 $l=!1;const Tl="copilot-api-node20",Al=`https://registry.npmjs.org/${Tl}/latest`,Sl=e=>`[1m${e}[0m`,El=e=>`[33m${e}[0m`;async function Ol(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Al,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Cl(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 Il,Pl;async function Nl(e){try{let[t,o]=await Promise.all([Rt(),Ol(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 Rl(){if(!Il||!Pl)return;let{signal:e}=Pl;Il.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${Tl}@latest`,n=El("│"),r=` ${Sl("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${Sl(o)} to update`,i=" ".repeat(54),s=El(`╭${"─".repeat(54)}╮`),l=El(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${Cl(r,54)}${n}`,`${n}${i}${n}`,`${n}${Cl(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var ql={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 jl=262144,Dl="https://barazany.dev",Ml=/^[a-z0-9][a-z0-9-]*$/i,Fl=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function Hl(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(Fl," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function Ul(e){if("object"!=typeof e||!e)return null;let t=e,o=Hl(t.title,100),n=Hl(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!==Dl||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&&Ml.test(t.slug)&&(r=`${Dl}/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 Bl(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=Ul(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 Ll=null;function zl(e){return s.join(e,"blog-posts.json")}function Gl(e=Y.APP_DIR){try{if(Ll&&Ll.length>0)return Ll;let t=function(e){try{let t=zl(e);return L.statSync(t).size>jl?[]:Bl(JSON.parse(L.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Bl(ql)}catch{return[]}}function Kl(e){return e>-6e4&&e<864e5}async function Jl(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>jl)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>jl?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>jl)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?[]:Bl(JSON.parse(o))}finally{clearTimeout(o)}}async function Wl(e={}){try{if("1"===_.env.COPILOT_API_NO_BLOG||"1"===_.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??Y.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=zl(e),n=await L.promises.stat(o);if(n.size<=jl){let e=await L.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Kl(t-n.fetchedAt)}return Kl(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await Jl(e.timeoutMs??3e3);if(0===n.length)return;Ll=n,await async function(e,t,o){let n=zl(e),r=`${n}.${_.pid}.tmp`;try{await L.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await L.promises.rename(r,n)}catch(e){throw await L.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function Yl(e){return"foundry"===e.provider?(oe.foundry=function(e){let t=e.FOUNDRY_ENDPOINT,o=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");if(!o)throw Error("--provider foundry requires FOUNDRY_API_KEY");let n=bo(t),r=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:n,anthropicEndpoint:r?bo(r,"FOUNDRY_ANTHROPIC_ENDPOINT"):vo(n),apiKey:o,deployments:xo(e.FOUNDRY_DEPLOYMENTS)}}(process.env),oe.connectivity.h2=!1,oe.connectivity.h2Keepalive=!1,o.info(`Using Microsoft Foundry upstream: ${oe.foundry.endpoint}`),"copilot"===e.fallback&&await async function(e){try{await Vl(e),await Xo(),o.info("Copilot fallback enabled for Foundry rate limits (429)")}catch(e){o.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}}(e),{login:"foundry"}):Vl(e)}async function Vl(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){oe._t2=e,gn=!1}(n),o.info("Using provided Auth token")):await An();try{t=await _o(),await ft(oe,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 go();oe._t1=e,o.debug("Service token fetched successfully!"),oe.showToken&&o.info("Service token:",e),hn=!0,Tn(t),lt.start(),pn=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),xn(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},dn=()=>{o.debug("Network connectivity lost")},lt.on("online",pn),lt.on("offline",dn)})(),t}function Xl(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=_;if("win32"===e){try{if(g(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=o.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),r=Object.entries(e).filter(([,e])=>void 0!==e);switch(n){case"powershell":o=r.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":o=r.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":o=r.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(" ");o=r.length>0?`export ${e}`:"";break}}return o&&t?`${o}${"cmd"===n?" & ":" && "}${t}`:o||t}const Zl=e=>`[1m${e}[0m`,Ql=e=>`[2m${e}[0m`,ec=e=>`[36m${e}[0m`,tc=e=>`[32m${e}[0m`,oc=e=>`[33m${e}[0m`,nc=e=>`[4m${e}[0m`,rc=(e,t)=>`]8;;${e}\\${t}]8;;\\`,ac="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",ic="https://github.com/johnib/copilot-api-issues/issues",sc=Ql(" ─────────────────────────────────────────────────────────────");function lc(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function cc(e){return e&&0!==e.length?e.join("·"):"—"}function uc(e){if(0===e.length)return[];let t=["",sc,` ${Zl("BARAZANY.DEV")} ${Ql("— Recent Posts")}`,sc,""];for(let[o,n]of e.entries()){let e=`${n.url}${ac}`,r=rc(e,Zl(nc(`[${o+1}]`)));t.push(` ${r} ${ec(n.title)}`,` ${Ql("→")} ${Ql(n.teaser)}`,"")}return t.push(sc,` ${rc(`https://barazany.dev/blog${ac}`,"barazany.dev/blog")}`,sc),t}function pc(e){let t=[];oe.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):oe.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(Ql(" → "))} ${tc("✓")}`:Ql("off"),n=["",` ${Zl("COPILOT-API")} ${Ql(`v${e.version}`)}`,sc,` ${Ql("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Ql("User")} ${e.user} ${Ql("·")} ${e.accountType}`];return oe._v1&&n.push(` ${Ql("Client")} VSCode ${oe._v1}`),n.push(` ${Ql("Network")} ${t.join(Ql(" · "))}`,` ${Ql("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Ql("Clipboard")} Claude Code command ${tc("✓")}`),n.push(sc),n}function dc(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Zl("Active")}`];if(e.model){let o=oe.models?.data.find(t=>t.id===e.model),n=lc(o?.capabilities.limits?.max_context_window_tokens),r=cc(o?.capabilities.supports.reasoning_effort);t.push(` ${ec(e.model.padEnd(32))} ${Ql("ctx")} ${Zl(n.padStart(5))} ${Ql("effort")} ${Ql(r)} ${oc("← main")}`)}if(e.smallModel){let o=oe.models?.data.find(t=>t.id===e.smallModel),n=lc(o?.capabilities.limits?.max_context_window_tokens),r=cc(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Ql("ctx")} ${n.padStart(5)} ${Ql("effort")} ${Ql(r)} ${oc("← small")}`)}return t}function mc(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of oe.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("",` ${Zl(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?ec("●"):Ql("·"),i=n?ec(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?lc(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${cc(r.effort)}`;t.push(` ${a} ${i} ${Ql(s)}${Ql(l)}`)}}return t}function fc(){let e=ic.replace(/^https:\/\//,""),t=rc(`${ic}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",sc,` ${Zl("FOUND A BUG?")} ${Ql("— Report it on GitHub")}`,sc,"",` ${ec("→")} ${ec(t)}`,` ${Ql("Bug reports, feature requests, and questions welcome.")}`,"",sc]}function hc(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=["",sc,` ${Zl("Claude Cowork")} ${Ql("— Settings → Inference Provider")}`,sc,"",` ${Ql("Paste into")} ${Zl("inferenceGatewayBaseUrl")}${Ql(":")}`,` ${Zl(ec(r))}`];return n||a.push("",` ${Ql("Your Tailscale hostname is shown by:")} ${ec("tailscale status --self")}`),a.push("",` ${Ql("Docs:")} ${ec("https://claude.com/docs/cowork/3p/installation")}`),a}function gc(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",sc,` ${Zl("HTTPS")} ${Ql("— self-signed cert")}`,sc,"",` ${Ql("Cert")} ${t}`];switch(o.push("",` ${Zl("Trust this cert")} ${Ql("(one-time setup)")}`),_.platform){case"darwin":o.push(` ${Ql("macOS:")}`,` ${ec("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${ec(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Ql("Windows (PowerShell as Administrator):")}`,` ${ec(`Import-Certificate -FilePath "${t}" \``)}`,` ${ec("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Ql("Linux (Debian/Ubuntu):")}`,` ${ec(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${ec("sudo update-ca-certificates")}`,` ${Ql("Linux (Fedora/RHEL/Arch):")}`,` ${ec(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${ec("sudo update-ca-trust")}`);break;default:o.push(` ${Ql("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Ql("Or, for Node CLIs only (no admin needed):")}`,` ${ec(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,sc),o}function _c(e){let t=Math.floor(e/1e3),o=Math.floor(t/3600),n=Math.floor(t%3600/60);return o>0?`${o}h ${n}m`:n>0?`${n}m`:`${t}s`}const yc=s.join(Y.APP_DIR,"certs"),wc=s.join(yc,"cert.pem"),bc=s.join(yc,"key.pem"),kc=s.join(yc,"cert.meta.json");async function vc(e){try{return await a.readFile(e,"utf8")}catch{return}}async function xc(e){let t=await vc(wc),o=await vc(bc),n=await async function(){let e=await vc(kc);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 $c(e){return 0!==K(e)}async function Tc(e){await a.mkdir(yc,{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)$c(t)?i.add(t):r.add(t);let s=[...[...r].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))],l=await J([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:o,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:s}]});return await a.writeFile(wc,l.cert,{mode:420}),await a.writeFile(bc,l.private,{mode:384}),await async function(e){await a.writeFile(kc,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:wc,keyPath:bc,generated:!0}}const Ac=[],Sc=Date.now();let Ec="";function Oc(){let e=async(e,t=0)=>{let n=ve.startSpan("copilot_api.server.shutdown",{kind:c.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-Sc)/1e3}});for(let t of Ac)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=rc("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",sc,` ${Zl("COPILOT-API")} ${Ql(`v${e}`)} ${Ql("·")} ${_c(t)} uptime`,sc,""," Check in from time to time on",` ${ec(o)}`,"",sc,""];console.log(n.join("\n"))}(Ec,Date.now()-Sc),_.exit(t)};_.on("SIGINT",()=>e("SIGINT")),_.on("SIGTERM",()=>e("SIGTERM")),_.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),_.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}const Cc=e=>e.filter(e=>"embeddings"!==e.capabilities.type).map(e=>e.id),Ic=e=>e.filter(e=>"embeddings"!==e.capabilities.type&&(e.supported_endpoints?.includes("/responses")??!0)).map(e=>e.id);async function Pc(e,t,n){if(!e._cc1)return!1;oe.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."),_.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,Cc(oe.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Cc(oe.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:Cc(oe.models.data)}));let s=Xl({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 f.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function Nc(e){return e._t2?"cli_arg":_.env.GH_TOKEN?"env_var":"stored"}function Rc(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=ve.startSpan("copilot_api.server.startup",{kind:c.INTERNAL,attributes:nt({config:{version:o,port:t.port,accountType:t.accountType,verbose:t.verbose,manualApprove:t.manual,rateLimitSeconds:t.rateLimit??0,rateLimitWait:t.rateLimitWait,timeoutMs:t.timeout,showToken:t.showToken,_cc1:t._cc1,model:t.model,smallModel:t.smallModel,_t3:Nc(t),provider:t.provider},runtime:n,identity:{_u1:r.login,machineId:oe.machineId,sessionId:oe.sessionId,_v1:oe._v1},connectivity:oe.connectivity,modelsCount:oe.models?.data.length??0,startupDurationMs:Date.now()-Sc},"copilot_api")});if(oe.models?.data)for(let e of oe.models.data)a.addEvent("copilot_api.model.available",nt(e,"model"));a.end(),et(y.INFO,"INFO","Server started",nt({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:oe.models?.data.length??0,startupDurationMs:Date.now()-Sc},"copilot_api"))}async function qc(e,t){try{return await Yl(e)}catch(o){throw await async function(e,t){let o=nt({config:t,startupStage:"upstream_auth"},"copilot_api"),n=ve.startSpan("copilot_api.server.startup_failed",{kind:c.INTERNAL,attributes:o});e instanceof Jt&&(n.setAttribute("http.response.status_code",e.response.status),n.setAttribute("url.full",e.response.url)),tt(n,e),n.end(),et(y.ERROR,"ERROR","Server startup failed",{...o,"exception.message":e instanceof Error?e.message:String(e)}),await ke()}(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:Nc(e)}),o}}async function jc(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 xc(e)){let e=await vc(wc),t=await vc(bc);if(e&&t)return{cert:e,key:t,certPath:wc,keyPath:bc,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Tc(e)}(e.httpsHosts)}}async function Dc(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=sr;try{z(t),z(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(Oc(),Ac.push(()=>{o.debug("Cleaning up connectivity monitor"),lt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),hn=!1,cn&&=void clearInterval(cn),pn&&=void lt.off("online",pn),dn&&=void lt.off("offline",dn),un=void 0,mn=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),Qr&&=void clearInterval(Qr),ea&&=void clearInterval(ea);let e=[...Vr.keys(),...Xr];Vr.clear(),Xr.clear(),Yr.clear(),Zr=void 0;for(let t of e)ta(t)&&(Ue.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await ke()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");oe.provider=t.provider,oe.accountType=t.accountType,oe.manualApprove=t.manual,oe.rateLimitSeconds=t.rateLimit,oe.rateLimitWait=t.rateLimitWait,oe.showToken=t.showToken,oe.timeoutMs=t.timeout,oe.connectivity.timeoutMs=t.connectTimeout,oe.webSearchProviders=t.webSearchProviders,oe.errorReporting=function(e){let t=_.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===_.env.COPILOT_H2_KEEPALIVE||"true"===_.env.COPILOT_H2_KEEPALIVE,t=e||"1"===_.env.COPILOT_H2||"true"===_.env.COPILOT_H2;oe.connectivity.h2=t,oe.connectivity.h2Keepalive=e}(),await V(),Wl().catch(()=>{}),sn();let n=await Rt();Ec=n;let r=qt();!function(e,t){t&&(ye=t),_e=crypto.randomUUID();let o=x({[E]:"copilot-api",[O]:e,[S]:_e}),{endpoint:n,headers:r}=be();ge=new A({resource:o,traceExporter:new v({url:`${n}/v1/traces`,headers:r}),metricReader:new T({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new $({exporter:new b({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),ge.start()}(n,Sc);let a=await qc(t,n);await async function(){try{return await an(),!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"===oe.provider?"Foundry":"Copilot";return o.warn(`Could not fetch model list from ${a}${r}: ${n}. This is likely a transient network or authentication issue. The proxy will start anyway; model listing endpoints may return empty until the cache is populated.`),!1}}()||function(e){let t=setTimeout(()=>{an().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{an().then(()=>o.debug("Model list refreshed successfully")).catch(e=>{o.warn("Failed to refresh model list; keeping existing cache:",e)})},e);return t.unref(),()=>{clearInterval(t)}}();Ac.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),oe.connectivity.h2&&(ra(na(ht(oe))),oe.connectivity.h2Keepalive&&ia()),Rc({options:t,version:n,runtime:r,_u1:a});let s=await jc(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await Pc(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(oe.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."),_.exit(1)),e.model){let t=Ic(oe.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:Ic(oe.models.data)});let a=Xl({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return f.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=[...pc(e),...dc(e),...mc(e),...fc(),"",...uc(Gl()),...hc(e),...gc(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 Yn()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),Rl(),G({fetch:il.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 cl({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: ${yr(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 Mc(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Fc=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT and FOUNDRY_API_KEY). Overrides COPILOT_API_PROVIDER.'},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:Mc(t,"--rate-limit"),r=e.timeout,a=void 0===r?te:Mc(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:Mc(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],_.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??_.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(!xs(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${vs.join(", ")}`);let r=n.length>0?n:vs,a=new Set,i=n.length>0,s=[];for(let e of r){if(!xs(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"]||_.env.TAVILY_API_KEY,exaApiKey:_.env.EXA_API_KEY,order:u}),d=(_.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,_.env.COPILOT_API_PROVIDER);return Dc({provider:f,fallback:Vo(e.fallback,_.env.COPILOT_API_FALLBACK,f),port:Mc(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})}});$l||($l=!0,o.setReporters([xl(o.options.reporters)]));const Hc=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(Il||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;Pl=e,Il=Nl(e).catch(()=>null)})(),Hc||Rl();const Uc=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:On,start:Fc,"check-usage":zn,debug:Mt,doctor:vl,"cowork-setup":gr}});await t(Uc),Hc||(Pl?.abort(),Pl=void 0,Il=void 0);export{};
|
package/package.json
CHANGED