copilot-api-node20 0.43.0 → 0.43.1-preview.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.mjs +1 -1
- package/package.json +1 -1
package/dist/main.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{SpanKind as l,SpanStatusCode as c,context as u,metrics as p,trace as d}from"@opentelemetry/api";import m from"clipboardy";import{execFile as f,execSync as h}from"node:child_process";import g from"node:process";import{SeverityNumber as _,logs as y}from"@opentelemetry/api-logs";import{OTLPLogExporter as w}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as b}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as T}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as A,ATTR_SERVICE_NAME as S,ATTR_SERVICE_VERSION as E}from"@opentelemetry/semantic-conventions";import{Client as C,request as O}from"undici";import{createHash as I,randomBytes as P,randomUUID as R}from"node:crypto";import{promisify as N}from"node:util";import{Hono as q}from"hono";import{cors as j}from"hono/cors";import{streamSSE as D}from"hono/streaming";import{events as M}from"fetch-event-stream";import{Tokenizer as H,models as F}from"ai-tokenizer";import*as B from"ai-tokenizer/encoding/claude";import U,{accessSync as L}from"node:fs";import{serve as G}from"srvx";import{isIP as z}from"node:net";import{generate as J}from"selfsigned";const W=s.join(i.homedir(),".local","share","copilot-api"),K={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(K.APP_DIR,{recursive:!0}),await Y(K.GITHUB_TOKEN_PATH),await Y(K.SESSION_ID_PATH)}async function Y(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const X=6e5,Z={accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:X,webSearchProviders:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}},Q=" │ ",ee=e=>{if(e>=1e6){let t=e/1e6;return Number.isInteger(t)?`${t}M`:`${t.toFixed(1)}M`}return e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString()},te=(e,t)=>e.padEnd(t),oe=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ne=(e,t,o)=>` --\x3e ${te(e,4)} ${te(t,21)} ${te(o,3)}`,re=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return te(t,22)})(e.model??"—")+te(t,8)},ae=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ee(Math.max(t-o,0)):"—",r=e?ee(e.outputTokens??0):"—",a=o?ee(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},ie=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${te("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ee(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},se=e=>{if(void 0===e.ttfbMs)return`e2e ${oe(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${oe(e.ttfbMs)} → e2e ${oe(e.e2eMs)} ${t}`},le=e=>e?Z.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,ce=e=>({...e?.inputTokens&&{"copilot_api.input_tokens":e.inputTokens},...e?.inputTokens&&{"copilot_api.fresh_input_tokens":Math.max(e.inputTokens-(e.cachedTokens??0),0)},...e?.outputTokens&&{"copilot_api.output_tokens":e.outputTokens},...e?.cachedTokens&&{"copilot_api.cached_tokens":e.cachedTokens}}),ue={completionCallbacks:new Map,registerCompletion(e,t,o){this.completionCallbacks.set(e,{context:t,startTime:o,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(e){let{context:t,startTime:n}=e,r=Math.round(performance.now()-n),a=t.get("requestData"),i=a?.upstreamTotalMs??a?._d1,s=(e=>[ne(e.method,e.path,e.status),re(e),ae(e.tokenUsage),ie(e.tokenUsage,e.maxContextTokens),se({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(Q))({method:t.req.method,path:t.req.path,status:t.res.status.toString(),model:a?.model,reasoningEffort:a?.reasoningEffort,effortClamped:a?.effortClamped,tokenUsage:a?.tokenUsage,maxContextTokens:le(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),Ke(_.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:o,duration:n,upstreamTotal:r}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":n,...o?.model&&{"copilot_api.model":o.model},...o?.reasoningEffort&&{"copilot_api.reasoning_effort":o.reasoningEffort},...o?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==o?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(o.upstreamTtfbMs)},...void 0!==r&&{"copilot_api.upstream_total_ms":Math.round(r),"copilot_api.copilot_duration_ms":Math.round(r)},...ce(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=n.get("requestData");o.warn((e=>[ne(e.method,e.path,"429"),re(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${oe(e.e2eMs)}`].join(Q))({method:n.req.method,path:n.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},logError(e,t,n){let{context:r,startTime:a}=e,i=Math.round(performance.now()-a),s=r.get("requestData");o.error((e=>{let t=ne(e.method,e.path,e.status.toString()),o=re(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${oe(e.e2eMs)}`].join(Q)})({method:r.req.method,path:r.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:n,e2eMs:i}))},cleanup(){let e=performance.now()-12e5;for(let[t,o]of this.completionCallbacks)o.startTime<e&&this.completionCallbacks.delete(t);if(this.completionCallbacks.size>1e3){let e=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),t=e.slice(0,e.length-1e3);for(let[e]of t)this.completionCallbacks.delete(e)}}};setInterval(()=>ue.cleanup(),6e4);let pe,de,me=Date.now();const fe={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function he(){let e=process.env.OTEL_EXPORTER_OTLP_ENDPOINT??"https://api.honeycomb.io",t=process.env.OTEL_EXPORTER_OTLP_HEADERS?function(e){return e?Object.fromEntries(e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf("=");return-1===t?[e,""]:[decodeURIComponent(e.slice(0,t)),decodeURIComponent(e.slice(t+1))]})):{}}(process.env.OTEL_EXPORTER_OTLP_HEADERS):fe;return{endpoint:e.replace(/\/$/,""),headers:t}}const ge=d.getTracer("copilot-api"),_e=p.getMeter("copilot-api"),ye=y.getLogger("copilot-api"),we=_e.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),ke=_e.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),be=_e.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),ve=_e.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),xe=_e.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Te=_e.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),$e=_e.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ae=_e.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Se=_e.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Ee=_e.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ce=_e.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Oe=_e.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Ie=_e.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Pe=_e.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Re=_e.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ne=_e.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),qe=_e.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),je=_e.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),De=_e.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Me=_e.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),He=_e.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Fe=_e.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Be=_e.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Ue=_e.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Le=_e.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Ge=_e.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),ze=_e.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Je=_e.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),We=_e.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function Ke(e,t,o,n,r){let a=d.getActiveSpan()?.spanContext()??r;ye.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function Ve(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:c.ERROR,message:o??n.message}),e.recordException(n)}function Ye(e,t,o){Ve(e,o),t&&t!==e&&Ve(t,o)}function Xe(e,t=""){let o={};if(null==e)return o;if("object"!=typeof e)return("string"==typeof e||"number"==typeof e||"boolean"==typeof e)&&t&&(o[t]=e),o;if(Array.isArray(e))return t&&(o[t]=JSON.stringify(e)),o;for(let[n,r]of Object.entries(e)){let e=t?`${t}.${n}`:n;void 0!==r&&"function"!=typeof r&&(null===r?o[e]="null":"object"!=typeof r||Array.isArray(r)?Array.isArray(r)?o[e]=JSON.stringify(r):("string"==typeof r||"number"==typeof r||"boolean"==typeof r)&&(o[e]=r):Object.assign(o,Xe(r,e)))}return o}_e.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!ot.getConnectivityStats().isOnline)}),_e.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(ot.getConnectivityStats().consecutiveFailures)}),_e.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(Z.models?.data.length??0)}),_e.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ue.completionCallbacks.size)}),_e.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-me)/1e3)});const Ze=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","proxy-authorization"]);function Qe(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Ze.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function et(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:u}=e,p=ge.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&Qe(p,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();Ze.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),Ie.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:c.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw Ve(p,e),p.end(),e}}async function tt(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=ge.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Qe(f,"request",a);try{let{statusCode:e,headers:t,body:l}=await O(o,{method:r,headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!Ze.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Ie.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:c.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:l,span:f}}catch(e){throw Ve(f,e),f.end(),e}}const ot=new class extends EventTarget{isOnline=!0;lastChecked=(new Date).toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){o.debug("Starting connectivity monitor",{probeEndpoints:Z.connectivity.probeEndpoints,fastInterval:Z.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){o.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval)+Math.random()*Z.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ge.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),Z.connectivity.timeoutMs);try{let n=!1;for(let e of Z.connectivity.probeEndpoints)try{let t=performance.now(),o=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...Z.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Le.record(r,{endpoint:e,result:"success"});break}Le.record(r,{endpoint:e,result:"failed"})}catch(t){this.endpointFailureStats[e]=(this.endpointFailureStats[e]||0)+1,o.debug(`Probe failed for ${e}:`,t)}this.updateConnectivityState(n);let r=n?"online":"offline";e.setAttribute("copilot_api.connectivity.result",r),e.setAttribute("copilot_api.connectivity.consecutive_failures",this.consecutiveFailures),this.lastSuccessfulEndpoint&&e.setAttribute("copilot_api.connectivity.successful_endpoint",this.lastSuccessfulEndpoint),Ce.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")),Oe.add(1,{from:"offline",to:"online"}),Ke(_.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")),Oe.add(1,{from:"online",to:"offline"}),Ke(_.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,o.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*Z.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:Z.connectivity.jitterMaxMs>0,connectionPooling:Z.connectivity.connectionPooling,dnsCache:Z.connectivity.dnsCache}}},nt=()=>({"content-type":"application/json",accept:"application/json"}),rt="0.48.1",at=`copilot-chat/${rt}`,it=`GitHubCopilotChat/${rt}`,st=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${K.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=I("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},lt=async(e,t)=>{e.machineId||=await st(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(K.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(K.SESSION_ID_PATH,e),await a.chmod(K.SESSION_ID_PATH,384),e})()},ct=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,ut=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=R(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":at,"User-Agent":it,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":R(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},pt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const dt=(e,t,o)=>{let n=ut(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,a=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&pt.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta):void 0;if(a)for(let e of a.split(","))r.add(e);if(o)for(let e of o)r.add(e);return r.size>0&&(n["anthropic-beta"]=[...r].join(",")),n},mt="https://api.github.com",ft=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":at,"user-agent":it,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),ht="https://github.com",gt="01ab8ac9400c4e429b23",_t=["user:email"].join(" ");function yt(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const wt=32768,kt=[{regex:/Bearer\s+[\w.-]{20,}/g,mask:"Bearer ***"},{regex:/\bghu_[A-Za-z0-9]{20,}/g,mask:"ghu_***"},{regex:/\bghp_[A-Za-z0-9]{20,}/g,mask:"ghp_***"},{regex:/\bgho_[A-Za-z0-9]{20,}/g,mask:"gho_***"},{regex:/\bghs_[A-Za-z0-9]{20,}/g,mask:"ghs_***"},{regex:/\bghr_[A-Za-z0-9]{20,}/g,mask:"ghr_***"},{regex:/\bsk-[A-Za-z0-9-]{20,}/g,mask:"sk-***"},{regex:/\bhcaik_[A-Za-z0-9]{20,}/g,mask:"hcaik_***"}],bt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);function vt(e){let t=e;for(let{regex:e,mask:o}of kt)t=t.replace(e,o);return t}const xt=new Map;function Tt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function $t(e,t,o){let n=vt(o),r=8*wt,a=n.length>r,i=a?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(i.length<=wt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=wt)e.setAttribute(`${t}.part_${o/wt}`,i.slice(o,o+wt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/wt))}e.setAttribute(`${t}.bytes`,n.length),e.setAttribute(`${t}.sha256`,s),a&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,n.length-i.length))}function At(e,t){let o=function(e){if(xt.size>=1e3&&!xt.has(e)){let e=xt.keys().next().value;void 0!==e&&xt.delete(e)}let t,o=(xt.get(e)??0)+1;return xt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",je.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",o),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===o)return{decision:o};if("suppressed"===o)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:o};let n=t.c.get("rawBody");n&&$t(e,"copilot_api.incoming_request_body",n);let r=St(t.c.req.header());return r&&$t(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&$t(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&$t(e,"copilot_api.outgoing_headers",St(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&$t(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function St(e){let t={};for(let[o,n]of Object.entries(e))bt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Et(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await a.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function Ct(){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 Ot(){try{return!!(await a.stat(K.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(K.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function It(e){let t=await async function(){let[e,t]=await Promise.all([Et(),Ot()]);return{version:e,runtime:Ct(),paths:{APP_DIR:K.APP_DIR,GITHUB_TOKEN_PATH:K.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const Pt=e({meta:{name:"debug",description:"Print debug information about the application"},args:{json:{type:"boolean",default:!1,description:"Output debug information as JSON"}},run:({args:e})=>It({json:e.json})}),Rt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Nt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",qt=new Set;let jt;function Dt(e){if(Z.errorReporting&&!(e.statusCode<500)&&!qt.has(e.signature)){if(qt.size>=1e3){let e=qt.values().next().value;void 0!==e&&qt.delete(e)}qt.add(e.signature),async function(e){jt??=Et();let t=await jt,o=Ct(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(vt(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:yt(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(Rt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Nt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function Mt(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const Ht=new WeakSet;async function Ft(e,{attempt:t,maxRetries:n,operation:r}){return Mt(e)&&t<n?(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&Ht.add(e)}(e),!1)}var Bt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Ut=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Lt(e,t){return setTimeout(()=>e.abort(new Ut(t)),t)}const Gt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),zt=RegExp(`\\b(?:${[...Gt].join("|")})\\b`);function Jt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function Wt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Jt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function Kt(e){let t=e.code;return"string"==typeof t?t:void 0}function Vt(e){if(void 0===e.cause)return"";let t=Wt(e);if(t===e)return"";let o=Kt(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function Yt(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=>Gt.has(e))||!(t.length>0)&&(!!o.some(e=>zt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Xt(e){return e.req.path.startsWith("/v1/messages")}function Zt(e,t){if(Xt(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}function Qt(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type?o.type=t.type:"string"==typeof t.code&&(o.type=t.code),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function eo(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",t.message))}function to(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=e.message),t}function oo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=Tt({endpointType:yt(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});At(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function no(e,t,o){let n=e.get("requestId"),r=ue.completionCallbacks.get(n);r&&(ue.logError(r,t,o),ue.completionCallbacks.delete(n))}function ro(e,t){(function(e){return"object"==typeof e&&!!e&&Ht.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",Z.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function ao(e){return Yt(e)||function(e){return Mt(e)||e instanceof Error&&Mt(e.cause)}(e)}async function io(e,t){if(ro(d.getActiveSpan(),t),t instanceof Bt&&429===t.response.status)return async function(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=ue.completionCallbacks.get(n);r&&(ue.logRateLimit(r,t.response),ue.completionCallbacks.delete(n)),Te.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=Zt(a,e),s=Qt(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),eo(o,s),Ke(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...to(s)}),oo({c:e,error:t,errorText:a,upstream:s}),e.json(i,429)}(e,t);if(t instanceof SyntaxError){d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),Ke(_.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let o=Xt(e)?{type:"error",error:{type:"invalid_request_error",message:"Invalid JSON in request body"}}:{error:{message:"Invalid JSON in request body",type:"invalid_request_error"}};return no(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Bt)return async function(e,t){let o=d.getActiveSpan(),n=await t.response.text(),r=Zt(n,e),a=Qt(r);return no(e,t.response.status,a.message??t.message),o?.setStatus({code:c.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),eo(o,a),Ke(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...to(a)}),oo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&Dt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Tt({endpointType:yt(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message}),e.json(r,t.response.status)}(e,t);if(function(e){return e instanceof Ut||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Ut}(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Upstream request timed out"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","request_timeout");let n="Upstream request timed out (gateway timeout). Increase the timeout or retry.";Ke(_.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=Xt(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return no(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(ao(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?Wt(t):void 0,r=(n&&Kt(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.";Ke(_.WARN,"WARN",i,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":r,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=Xt(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return no(e,503,t instanceof Error?`${t.message}${Vt(t)}`:i),e.json(s,503)}(e,t);let n=d.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:c.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),Ke(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Dt({route:e.req.path,statusCode:500,errorClass:r.name,signature:Tt({endpointType:yt(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${Vt(r)}`}),no(e,500,r.message),o.error(r);let a=Xt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const so=async()=>{let e=`${mt}/copilot_internal/v2/token`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:ft(Z),signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get Service token",t);return await t.json()}catch(e){throw Ve(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function lo(){let e=`${mt}/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${Z._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Ve(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let co=null;function uo(){return co||=so().then(({token:e})=>{Z._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{co=null}),co}const po=async()=>{let e=`${ct(Z)}/models`,t=ut(Z),o=Z.timeoutMs,n=new AbortController,r=Lt(n,o);try{let{response:o,span:r}=await et({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Bt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Ve(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const mo=e=>new Promise(t=>{setTimeout(t,e)}),fo=e=>null==e;async function ho(){let e=await(async()=>{try{return await po()}catch(e){if(e instanceof Bt&&401===e.response.status)return await uo(),po();throw e}})();Z.models=e}const go=()=>{Z._v1="1.140.0-insider"};var _o=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let yo,wo,ko,bo,vo,xo=!1,To=!1,$o=!1;function Ao(){return So()?vo:void 0}function So(){return void 0!==vo&&Date.now()-vo.at<6e4}function Eo(){return $o?"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 Co=()=>a.readFile(K.GITHUB_TOKEN_PATH,"utf8");function Oo(e){let{span:t,error:n,reason:r,refreshStart:a,attempt:i}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";Z._t1=void 0,vo={status:s,message:l,at:Date.now()},clearInterval(yo),yo=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Se.add(1,{reason:r,success:"false"}),Ee.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:c.ERROR,message:n.message}),t.recordException(n),Ue.record(performance.now()-a,{reason:r}),Ke(_.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 Io(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;Z._t1=void 0,o.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=n instanceof Error?n:Error(String(n));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:c.ERROR,message:s.message}),t.recordException(s),Ee.add(1,{reason:r}),Ue.record(performance.now()-a,{reason:r}),Ke(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Po=async(e=5,t=1e3,n="scheduled")=>xo?(o.debug("Token refresh already in progress, coalescing"),wo):(xo=!0,wo=ge.startActiveSpan("copilot_api.token.refresh",async r=>{let a=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let i=1;i<=e;i++)try{r.setAttribute("copilot_api.token_refresh.attempt",i),o.debug(`Refreshing Service token (${n}, attempt ${i}/${e})`);let{token:t,refresh_in:s}=await so();return Z._t1=t,vo=void 0,To&&void 0===yo&&(o.info("Token refresh recovered, resuming scheduled refresh"),No(s)),o.debug("Service token refreshed successfully"),Z.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Se.add(1,{reason:n,success:"true"}),Ue.record(performance.now()-a,{reason:n}),void Ke(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Bt&&(401===s.response.status||403===s.response.status))return void Oo({span:r,error:s,reason:n,refreshStart:a,attempt:i});let l=i===e;if(o.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),Se.add(1,{reason:n,success:"false"}),l)return void Io({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(),xo=!1,wo=void 0}}),wo);async function Ro(){return!!Z._t1||!So()&&(void 0!==vo&&$o&&await async function(){if(wo)return;let e=(await Co().catch(()=>{}))?.trim();e&&e!==Z._t2?.trim()&&(Z._t2=e,o.info("Picked up re-authenticated Auth token from disk"),Z.showToken&&o.info("Auth token:",e))}(),await Po(3,250,"on-demand"),!!Z._t1)}function No(e){yo&&clearInterval(yo);let t=Math.max(1e3*(e-60),6e4);yo=setInterval(()=>{Po(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function qo(e){try{let t=await Co();if(t&&!e?.force)return Z._t2=t,$o=!0,Z.showToken&&o.info("Auth token:",t),void await jo();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=Z.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${ht}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:gt,scope:_t}),signal:e.signal});if(!t.ok)throw new Bt("Failed to get device code",t);return await t.json()}finally{clearTimeout(o)}}();o.debug("Device code response:",n),o.info(`Please enter the code "${n.user_code}" at ${n.verification_uri}`);try{m.writeSync(n.user_code),o.success("Code copied to clipboard — opening browser...")}catch{o.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,o=g.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",f(t,[e],()=>{})}catch{}}(n.verification_uri);let r=await async function(e){let t=1e3*(e.interval+1);o.debug(`Polling access token with interval of ${t}ms`),o.start("Waiting for authorization...");let n=Date.now(),r=1e3*e.expires_in;for(;;){if(Date.now()-n>=r)throw new _o("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=Z.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${ht}/login/oauth/access_token`,{method:"POST",headers:nt(),body:JSON.stringify({client_id:gt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await mo(t),o.error("Failed to poll access token:",await n.text());continue}let r=await n.json();if(o.debug("Polling access token response:",r),r.error){if("expired_token"===r.error)throw new _o("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new _o("Authorization was denied. Please run the command again and approve the request.");"authorization_pending"!==r.error&&"slow_down"!==r.error&&o.warn(`Unexpected auth error: ${r.error}`),await mo(t);continue}if(r.access_token)return r.access_token;await mo(t)}catch(e){if(e instanceof _o)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await mo(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(K.GITHUB_TOKEN_PATH,e,{mode:384}))(r),Z._t2=r,$o=!0,Z.showToken&&o.info("Auth token:",r),await jo()}catch(e){throw e instanceof Bt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function jo(){let e=await lo();o.success(`Authenticated as ${e.login}`)}async function Do(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),Z.showToken=e.showToken,await V(),await qo({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 Mo=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})=>Do({verbose:e.verbose,showToken:e["show-token"]})}),Ho=.01,Fo=864e5,Bo=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Uo=new Intl.NumberFormat("en-US"),Lo=e=>Bo.format(e*Ho),Go=e=>e.credits_used??e.entitlement-e.remaining,zo=(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())/Fo;if(r<.5)return;let a=Go(e),i=a*Ho/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Ho,c=new Date(n.getTime()+l/i*Fo);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Jo=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Uo.format(Go(e))} of ${Uo.format(e.entitlement)} used`:"n/a",Wo=e=>e.padEnd(14),Ko=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Wo("AI credits")}unlimited`);else{let e=Go(o),t=o.percent_remaining;n.push(`${Wo("AI credits")}${Lo(e)} / ${Lo(o.entitlement)} ${t.toFixed(1)}% left`,`${Wo("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Wo("")}${Uo.format(e)} of ${Uo.format(o.entitlement)} credits`)}if(n.push("",`${Wo("Chat")}${Jo(e.quota_snapshots.chat)}`,`${Wo("Completions")}${Jo(e.quota_snapshots.completions)}`,"",`${Wo("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Fo)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=zo(o,e.quota_reset_date,t);r&&n.push(`${Wo("Burn rate")}~${Bo.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?`${Uo.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Wo("Overage")}${a}`)}return n.join("\n")},Vo=async()=>{let e=`${mt}/copilot_internal/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:ft(Z),signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get usage",t);return await t.json()}catch(e){throw Ve(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Yo=()=>g.stdout.write("[2J[H"),Xo=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Zo=async()=>{let e=await Vo();return Ko(e)},Qo=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 qo(),!e.watch){try{o.box(await Zo())}catch(e){o.error("Failed to fetch usage:",e),g.exit(1)}g.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?o.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&o.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),n=g.stdout.isTTY,r=()=>g.exit(0);for(g.on("SIGINT",r),g.on("SIGTERM",r);;){try{let e=await Zo();n&&Yo(),o.box(e),o.log(Xo(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),en=N(f);async function tn(){let e="win32"===g.platform?"where.exe":"which";try{return await en(e,["tailscale"]),!0}catch{return!1}}async function on(){try{let{stdout:e}=await en("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function nn(e){return e.replace(/\.$/,"")}async function rn(){let e=await on();if(e?.Online)return nn(e.DNSName)}const an=N(f),sn=e=>`[1m${e}[0m`,ln=e=>`[2m${e}[0m`,cn=e=>`[36m${e}[0m`,un=e=>`[32m${e}[0m`,pn=e=>`[31m${e}[0m`,dn=e=>`[33m${e}[0m`,mn=ln(" ─────────────────────────────────────────────────────────────"),fn=s.join(K.APP_DIR,"certs","tailscale"),hn=s.join(fn,"cert.pem"),gn=s.join(fn,"key.pem"),_n={certDir:fn,certPath:hn,keyPath:gn};function yn(){switch(g.platform){case"darwin":return[` ${ln("Install Tailscale for macOS:")}`,` ${cn("https://tailscale.com/download/mac")}`,` ${ln("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`,` ${ln("Then re-run this command.")}`].join("\n");case"linux":return[` ${ln("Install Tailscale for Linux:")}`,` ${cn("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${cn("sudo tailscale up")}`,` ${ln("or")} ${cn("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${ln("Install Tailscale for Windows:")}`,` ${cn("https://tailscale.com/download/windows")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${ln("Install Tailscale:")} ${cn("https://tailscale.com/download")}`}}function wn(){let e=[` ${pn("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${ln("Open the Tailscale app from Applications and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${ln("Open the Tailscale app and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/windows")}`):e.push(` ${ln("Connect with:")} ${cn("sudo tailscale up")}`),e.push("",` ${ln("Then re-run this command.")}`),e.join("\n")}async function kn(){try{return await a.access(hn),await a.access(gn),!0}catch{return!1}}function bn(e){console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Diagnostic")}`),console.log(mn),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?un("✅"):"missing"===n.status?pn("❌"):dn("❓");let r=n.detail?ln(` ${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(` ${un("All checks passed.")}`):console.log(` ${pn(`${t.length} issue(s).`)} Run ${cn("copilot-api cowork-setup install")} to fix.`),console.log("")}const vn={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},xn=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await tn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return bn(e),console.log(""),console.log(yn()),void console.log("");let o=await on();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},bn(e),console.log(wn()),void console.log("");let n=nn(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await kn();e["tailscale-cert"]=r?{status:"ok",detail:hn}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),bn(e)}(),g.exit(0)}}),Tn=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Install")}`),console.log(mn),console.log(""),!await tn())return console.log(` ${pn("Tailscale is not installed.")}`),console.log(""),console.log(yn()),console.log(""),console.log(` ${ln("After installing, run")} ${cn("tailscale up")} ${ln("to connect, then re-run this command.")}`),void console.log("");let t=await on();if(!t||!t.Online)return console.log(wn()),void console.log("");let n=nn(t.DNSName);if(console.log(` ${ln("Tailscale hostname:")} ${sn(n)}`),console.log(""),console.log(` ${sn("Generating TLS certificate via Tailscale…")}`),console.log(` ${ln("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${cn(`$ tailscale cert --cert-file ${hn} --key-file ${gn} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(fn,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await an("tailscale",["cert","--cert-file",hn,"--key-file",gn,n]),console.log(` ${un("✓ Certificate generated")}`)}catch(e){let t=e instanceof Error?e.message:String(e);return void o.error(`Failed to generate cert: ${t}`)}console.log(""),console.log(mn),console.log(` ${sn("Next steps")}`),console.log(mn),console.log(""),console.log(` ${sn("1.")} Start the proxy:`),console.log(` ${cn("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${sn("2.")} In Cowork ${ln("→")} Settings ${ln("→")} Inference Provider, set:`),console.log(` ${sn("inferenceGatewayBaseUrl")} = ${cn(`https://${n}:<port>`)}`),console.log(` ${ln("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${sn("3.")} Restart Cowork ${ln("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${ln("For Cowork's own configuration docs, see:")}`),console.log(` ${cn("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),$n=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Revert")}`),console.log(mn),console.log(""),!await kn())return console.log(` ${ln("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${sn("Remove Tailscale cert files:")}`),console.log(` ${ln(hn)}`),console.log(` ${ln(gn)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(fn,{recursive:!0}),console.log(` ${un("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${ln("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),An=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:xn,install:Tn,revert:$n}}),Sn=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function En(e){if(!Sn.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 Cn(e){return"string"==typeof e?En(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=Cn(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?Cn(a):a;!t&&(i!==a||"__proto__"===r)&&(t=On({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=On({},o,o.length),t.properties={}),t??e}(e):e}function On(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const In="x-copilot-api-self-test",Pn=R();const Rn=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Nn(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 qn(e){try{!function(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),a=t.res.status,i=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",a),n.setAttribute("copilot_api.model",i),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();Ze.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:c.ERROR,message:`HTTP ${a}`})}(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:a,requestId:i}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:a};if(we.add(1,d),De.record(s,d),c>=400&&ke.add(1,{method:n,path:r,status_code:String(c),error_type:c>=500?"server_error":"client_error"}),l?.tokenUsage){let e=l.tokenUsage,t={model:u,endpoint_type:a};e.inputTokens&&(be.add(e.inputTokens,t),Ge.record(e.inputTokens,t)),e.outputTokens&&(ve.add(e.outputTokens,t),ze.record(e.outputTokens,t)),e.cachedTokens&&xe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ue.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const jn=1048576;const Dn=async()=>ge.startActiveSpan("copilot_api.approval.await",async e=>{let t=performance.now();try{let n=await o.prompt("Accept incoming request?",{type:"confirm"}),r=performance.now()-t;if(e.setAttribute("copilot_api.approval.wait_duration_ms",r),We.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Re.add(1,{result:"rejected"}),new Bt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Re.add(1,{result:"approved"})}finally{e.end()}});async function Mn(e){if(Z._t1||await Ro())return null;let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Eo()}`,type:"authentication_error"}},401)):(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function Hn(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 Fn(e,t){void 0!==t.prompt_tokens&&e.setAttribute("copilot_api.input_tokens",t.prompt_tokens),void 0!==t.completion_tokens&&e.setAttribute("copilot_api.output_tokens",t.completion_tokens),void 0!==t.total_tokens&&e.setAttribute("copilot_api.total_tokens",t.total_tokens)}const Bn=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],Un="claude-haiku-4.5",Ln={haiku:Un,"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 Gn(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 Bn)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=Ln[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 zn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Jn(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=zn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=zn.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var Wn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Kn(e){if(!e||"string"!=typeof e)throw new Wn("Model name is required and must be a string");if(!Z.models?.data)throw new Wn("Models not available. Please try again later.",503);let t=Z.models.data.map(e=>e.id);if(t.includes(e))return e;let o=Gn(e,t);if(!o)throw $e.add(1,{requested_model:e}),new Wn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Vn(e){let t=Z.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e)}async function Yn(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return ge.startActiveSpan("copilot_api.rate_limit.check",async n=>{try{let r=Date.now();if(n.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let a=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute("copilot_api.rate_limit.elapsed_seconds",a),a>t)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let i=Math.ceil(t-a);if(n.setAttribute("copilot_api.rate_limit.wait_seconds",i),!e.rateLimitWait)throw n.setAttribute("copilot_api.rate_limit.action","rejected"),Te.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Bt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Te.add(1,{action:"waited",source:"local"}),Fe.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await mo(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Xn=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Zn(e){if(e instanceof Xn)return{type:e.type,message:e.message};if(e instanceof Bt){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 Qn(e,t){let{type:n,message:r}=Zn(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 er(e,t){let{type:n,message:r}=Zn(t);try{await e.writeSSE({event:"error",data:JSON.stringify({error:{message:r,type:n}})})}catch(e){o.debug("Failed to emit OpenAI stream error frame:",e)}}function tr(e){if("number"==typeof e){if(!Number.isFinite(e))return null;let t=Math.floor(e);return t>0?t:null}if("string"==typeof e){let t=e.trim();if(!t)return null;let o=Number(t);if(!Number.isFinite(o))return null;let n=Math.floor(o);return n>0?n:null}return null}function or(e,t,o){return Math.min(Math.max(e,t),o)}function nr(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 nr(JSON.parse(r),t+1)}catch{return null}}function rr(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=tr(o.capabilities.supports.min_thinking_budget),r=tr(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:tr(o.capabilities.limits?.max_output_tokens)??void 0}}function ar(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=or(tr(e.requestedBudget)??o,o,n),a=tr(e.maxTokens);if(a||=r+1,t.maxOutputTokens&&a>t.maxOutputTokens&&(a=t.maxOutputTokens),a<=r){let e=Math.min(r,a-1);if(e>=o)r=e;else{let e=o+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:a};a=e,r=o}}return a<=r?{thinkingBudget:null,maxTokens:a}:{thinkingBudget:r,maxTokens:a}}function ir(e,t){if(fo(e.thinking_budget))return e;let o=rr(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=ar({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 sr(e){return"invalid_thinking_budget"===nr(e)}async function lr(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(fo(t.thinking_budget)||!(o instanceof Error))return null;let a,i,s=o;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==r)a=r;else try{a=await s.response.clone().text()}catch{return null}try{i=JSON.parse(a)}catch{return null}if(!sr(i))return null;let l=rr(n,t.model);return l?function(e,t){let o=ar({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:t});if(null===o.thinkingBudget)return{...e,max_tokens:o.maxTokens,thinking_budget:void 0};let n=o.thinkingBudget,r=tr(e.thinking_budget);if(r&&r===o.thinkingBudget){let e=n+1;e<=t.bounds.max&&(!o.maxTokens||e<o.maxTokens)&&(n=e)}let a=o.maxTokens;if((!a||a<=n)&&(a=n+1),t.maxOutputTokens&&a>t.maxOutputTokens){if(!(t.maxOutputTokens>n))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};a=t.maxOutputTokens}return{...e,max_tokens:a,thinking_budget:n}}(t,l):{...t,thinking_budget:void 0}}function cr(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 ur(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const pr=new Map,dr=new Map,mr=new Set;let fr,hr,gr;function _r(e){return!e.closed&&!e.destroyed}function yr(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 pr.set(t,Date.now()),qe.add(1,{event:"created",origin:e}),Ke(_.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{o.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{o.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(n,r,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=mr.has(t);qe.add(1,{event:"goaway",origin:e}),Ke(i?_.WARN:_.DEBUG,i?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),dr.delete(t),mr.delete(t),pr.delete(t),_r(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function wr(e,t){if(!Z.connectivity.h2)return;if(fr&&fr!==e&&function(){for(let e of[...dr.keys(),...mr])_r(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});dr.clear(),mr.clear(),pr.clear()}(),fr=e,t?.fresh){let t=yr(e);return mr.add(t),t}let n=Date.now();for(let[t]of dr)if(n-(pr.get(t)??0)>=6e5)dr.delete(t),pr.delete(t),_r(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),qe.add(1,{event:"rotated",origin:e}),Ke(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(_r(t))return dr.delete(t),mr.add(t),t;dr.delete(t),pr.delete(t)}let r=yr(e);return mr.add(r),r}function kr(e){e&&mr.delete(e)&&(_r(e)?dr.set(e,Date.now()):pr.delete(e))}function br(){gr||(gr=setInterval(()=>{!function(){let e=Date.now(),t=Z.connectivity.h2Keepalive,n=dr.size;for(let[r,a]of dr)e-a<6e4||t&&n<=1||(dr.delete(r),pr.delete(r),n--,_r(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),qe.add(1,{event:"idle_reaped",origin:fr??""}),Ke(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${fr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":fr??""}))}()},3e4),gr.unref())}function vr(){hr||(o.debug("Starting HTTP/2 keepalive (every 45s)"),hr=setInterval(()=>{(async function(){if(0===dr.size&&0===mr.size){if(fr){let e=yr(fr);dr.set(e,Date.now())}return}let e=[...dr.keys()];for(let t of e)dr.delete(t);await Promise.allSettled(e.map(async e=>{if(_r(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:ut(Z)});await n.dump(),Ne.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),dr.set(e,Date.now())}catch(t){Ne.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),qe.add(1,{event:"error",origin:fr??""}),pr.delete(e),_r(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else pr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),hr.unref(),br())}function xr(e){return e.max_completion_tokens??e.max_tokens}async function Tr(e,t,o){try{if(!e.ok)throw new Bt("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&&Fn(t,n.usage),n}catch(e){throw Ve(t,e),e}finally{t.end()}}const $r=async e=>{let t=Cn(e);try{return await Ar(t)}catch(e){if(e instanceof Bt&&401===e.response.status)return await uo(),Ar(t);let n;if(e instanceof Bt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await lr({payload:t,error:e,models:Z.models,errorBodyText:n});if(r)return e instanceof Bt&&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 Ar(Cn(r));throw e}},Ar=async e=>{if(!Z._t1)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={...ut(Z,t),"X-Initiator":o?"agent":"user"},r=ct(Z),a=`${r}/chat/completions`,i=Z.timeoutMs,s=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=xr(e);return null==i?a:{...a,max_completion_tokens:i}}(e,Z.models),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":xr(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=wr(r,{fresh:t>0}),s=new AbortController,u=Lt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await tt({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}),m=new Response(p,{status:r,headers:u});if(e.stream){if(!m.ok)throw d.end(),new Bt("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:M(m),span:d,release:()=>kr(o)}}try{return await Tr(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{kr(o)}}catch(e){if(kr(o),await Ft(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Sr(e,t,o){try{if(!e.ok)throw new Bt("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&&Fn(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Ve(t,e),e}finally{t.end()}}const Er=async e=>{try{return await Cr(e)}catch(t){if(t instanceof Bt&&401===t.response.status)return await uo(),Cr(e);throw t}},Cr=async e=>{if(!Z._t1)throw Error("Service token not found");let t=Cn(e),o={...ut(Z),"X-Initiator":"agent"},n=ct(Z),r=`${n}/responses`,a=Z.timeoutMs,i=JSON.stringify(t),s={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":a,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let l=wr(n,{fresh:e>0}),c=new AbortController,u=Lt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await tt({spanName:"copilot POST /responses",url:r,target:"responses",headers:o,body:i,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...s,"copilot_api.h2.retry_attempt":e},dispatcher:l}),m=new Response(p,{status:n,headers:u});if(t.stream){if(!m.ok)throw d.end(),new Bt("Failed to create responses",m,{outgoingBody:i,outgoingHeaders:o});return{events:M(m),span:d,release:()=>kr(l)}}try{return await Sr(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{kr(l)}}catch(t){if(kr(l),await Ft(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Or=e=>Object.hasOwn(e,"output");function Ir(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}:null}var Pr=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const Rr=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 Nr(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Pr(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Pr(`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=>jr(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=Dr(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=jr(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:jr(o.content)})}return t}(e.messages);if(0===o.length)throw new Pr("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),qr(e.temperature)&&(n.temperature=e.temperature),qr(e.top_p)&&(n.top_p=e.top_p),qr(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),qr(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 qr(e){return null!=e}function jr(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Dr(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 Pr(`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 Mr(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 Hr(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 Fr(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 Br(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Ur(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Br(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Fr(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),[Fr(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Lr(e,t){let o=[Fr(e,{},Hr(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=Mr(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Gr(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:[Fr(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Ur(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Br(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Fr(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Lr(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 zr="openai_responses";function Jr(e){let t=performance.now(),n=ge.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),Nr(e)}finally{t.end()}});Be.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!Rr.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 Wr(e){let t=performance.now(),o=ge.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",o=!1,n=[];for(let r of e.output)if("message"===r.type)for(let e of r.content)"output_text"===e.type?(t+=e.text,o=!0):"refusal"===e.type&&(t+=e.refusal,o=!0);else"function_call"===r.type&&n.push({id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments}});let r={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:o?t:null,...n.length>0&&{tool_calls:n}},logprobs:null,finish_reason:Hr(e,n.length>0)}]};return e.usage&&(r.usage=Mr(e.usage)),r}(e)}finally{t.end()}});return Be.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Kr(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=Mr(t.usage);a.tokenUsage=Hn(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(Wr(t))}async function Vr(e,t,n){let r;try{r=Jr(t)}catch(t){if(t instanceof Pr)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),Z.manualApprove&&!n.isSelfTest&&await Dn();let a=await Mn(e);if(a)return a;let i=performance.now(),s=await Er(r),l=performance.now()-i;if(Me.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Or(s))return Kr(e,s,l);let{events:c,span:u,release:p}=s,m=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return D(e,async t=>{let n=null,a=0,s=performance.now(),d=cr(e,i);try{try{for await(let i of c){if(d(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Pe.add(1,{model:r.model,endpoint_type:zr});let c=Ir(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Hn(c),t._d1=l,e.set("requestData",t)}let u=Gr(s,m);if(u.error)throw new Xn(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:zr};He.record(performance.now()-s,u),Je.record(a,u),ur(e,i)}catch(o){throw Ye(u,e.get("requestSpan"),o),await er(t,o),o}finally{n&&Fn(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Yr(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 Xr(e){let t=!0===e.get("isSelfTest");t||await Yn(Z);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return ge.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Kn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}(n)}catch(t){if(t instanceof Wn)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(Vn(n.model))return Vr(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),Z.manualApprove&&!t&&await Dn(),n=function(e){if(!fo(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!fo(e.max_tokens))return e;let t=(Z.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return o.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(n),n=ir(n,Z.models),fo(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Mn(e);if(r)return r;let a=performance.now(),i=await $r(n),s=performance.now()-a;if(Me.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Zr(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Hn(i.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return D(e,async t=>{let o={value:null},r=0,i=performance.now(),p=cr(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Pe.add(1,{model:n.model,endpoint_type:"openai"}),i=Yr(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Hn(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(He.record(c,u),Je.record(r,u),ur(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Hn(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw Ye(c,e.get("requestSpan"),o),await er(t,o),o}finally{o.value&&Fn(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ue.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Zr=e=>Object.hasOwn(e,"choices"),Qr=new q;Qr.post("/",async e=>{try{return await Xr(e)}catch(t){return await io(e,t)}});const ea=new q;ea.post("/",async e=>{try{let t=await e.req.json();try{t.model=Kn(t.model)}catch(t){if(t instanceof Wn)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=await Mn(e);if(o)return o;let n=performance.now(),r=await(async e=>{if(!Z._t1)throw Error("Service token not found");let t=`${ct(Z)}/embeddings`,o=ut(Z),n=Z.timeoutMs,r=new AbortController,a=Lt(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await et({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1}});try{if(!n.ok)throw new Bt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Ve(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),a=performance.now()-n;Me.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Hn(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await io(e,t)}});const ta=new q;let oa=null,na=null;function ra(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function aa(e){return!ra(e)}ta.get("/",async e=>{let t,o=function(){let e=Z._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let o=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),n=JSON.parse(atob(o)),r="object"==typeof n&&n&&"exp"in n&&"number"==typeof n.exp?n.exp:void 0;return void 0!==r&&1e3*r<Date.now()?"expired":"valid"}catch{return"expired"}}(),n=await async function(){let e=Date.now(),t=oa;return t&&e-t.timestamp<3e4?{result:t.result}:na||(na=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${ct(Z)}/models`,n=await fetch(t,{method:"GET",headers:ut(Z),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return oa={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return oa={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),na=null}})(),na)}();t="valid"===o&&"reachable"===n.result?"ok":"valid"!==o&&"reachable"!==n.result?"unhealthy":"degraded";let r={status:t,copilot_token:o,upstream:n.result,version:"0.43.0",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 ia=new H(B),sa={...F["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function la(e){try{return ia.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function ca(e){let t=0;for(let o of e)switch(o.type){case"text":t+=la(o.text)*sa.contentMultiplier;break;case"tool_use":t+=la(o.name+JSON.stringify(o.input))*sa.contentMultiplier;break;case"tool_result":o.content&&(t+=la("string"==typeof o.content?o.content:JSON.stringify(o.content))*sa.contentMultiplier);break;case"thinking":t+=la(o.thinking)*sa.contentMultiplier;break;case"image":t+=1600}return t}function ua(e){let t=0,o=e.properties;if(!o)return t;let n=Object.entries(o);for(let[e,[o,r]]of n.entries()){if(t+=0===e?sa.perFirstProp:sa.perAdditionalProp,t+=la(o),r.description&&(t+=sa.perPropDesc+la(r.description)),r.enum&&Array.isArray(r.enum)){t+=sa.perEnum;for(let e of r.enum)t+=la(String(e))}if("object"===r.type&&r.properties&&(t+=sa.perNestedObject,t+=ua(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=sa.perArrayOfObjects,t+=ua(e))}}return t}function pa(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 da(e,t,o){let n=pa(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const ma=async(e,t,n)=>{try{return await fa(e,t)}catch(r){if(r instanceof Bt&&401===r.response.status)return await uo(),fa(e,t);if(r instanceof Bt&&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}`),fa(i,t)}throw r}};const fa=async(e,t)=>{if(!Z._t1)throw Error("Service token not found");let{metadata:o,...n}=Cn(e),r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...dt(Z,t,r),"X-Initiator":"agent"},i=ct(Z),s=`${i}/v1/messages`,l=Z.timeoutMs,c=JSON.stringify(n),u=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",...pa(e,t?.anthropicBeta)}}(n,t,l);for(let e=0;e<=1;e++){let t=wr(i,{fresh:e>0}),r=new AbortController,p=Lt(r,l);try{let{statusCode:o,headers:i,body:p,span:d}=await tt({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:a,body:c,signal:r.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(p,{status:o,headers:i});if(!m.ok)throw d.end(),new Bt("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:a});if(n.stream)return{events:M(m),span:d,release:()=>kr(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&&Fn(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(),kr(t)}}catch(o){if(kr(t),await Ft(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ha=new Set(["low","medium","high","max","xhigh"]);function ga(e,t,n){let r=t.includes(e.model)?e.model:Gn(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=Gn(e,t);if(!n)return null;let r=new Set(t);if(o.context1m){let e=function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,r);if(e)return e}if(o.effort){let e=function(e,t,o){let n=null;if("high"===o?n="high":("max"===o||"xhigh"===o)&&(n="xhigh"),!n)return null;let r=`${e}-${n}`;return t.has(r)?r:null}(n,r,o.effort);if(e)return e}return null}(a.model,t,{context1m:n.context1m,effort:a.output_config?.effort}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=d.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",a.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),s={...a,model:i}}return function(e){let t=e.output_config?.effort;if(!t)return e;let n=Z.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Jn(t,n);if(!r||!ha.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=d.getActiveSpan();return i?.setAttribute("copilot_api.effort.requested",t),i?.setAttribute("copilot_api.effort.clamped_to",a),{...e,output_config:{...e.output_config,effort:a}}}(s)}function _a(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function ya(e,t){let o={model:e.model,messages:wa(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:Ta(e.tools),tool_choice:$a(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=rr(t,o.model);if(r){let a="enabled"===n.type&&"number"==typeof n.budget_tokens?n.budget_tokens:function(e,t,o){let n=function(e,t){return"max"===e||"xhigh"===e?t:"high"===e?16e3:"medium"===e?8e3:1024}(e,o.max),r=tr(t),a=r&&r>1?r-1:o.min;return or(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=ir({...o,thinking_budget:a},t)}}return o}function wa(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:ka(e)}]:[{role:"system",content:ka(e.map(e=>e.text).join("\n\n"))}]:[]}(t),n=e.flatMap(e=>"user"===e.role?function(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:xa(e.content)});n.length>0&&t.push({role:"user",content:xa(n)})}else t.push({role:"user",content:xa(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:va(e.reasoning_text),reasoning_opaque:va(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:xa(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:xa(e.content),...t}]}(e));return[...o,...n]}function ka(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const ba=32768;function va(e){if("string"==typeof e)return e.length<=ba?e:e.slice(0,ba)}function xa(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 Ta(e){if(e)return e.filter(aa).map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function $a(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 Aa(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 Sa(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Ea(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 Ca=new Set(["low","medium","high","max","xhigh"]);function Oa(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&&Ca.has(e)?e:null)(Jn(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 Ia(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 Pa=/[^\w-]/g;function Ra(e){return e.replaceAll(Pa,"_")}function Na(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=Oa(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:Ia(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:Ra(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Ra(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function qa(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 ja(e,t,o=400){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function Da(e,t){return ge.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),da(n,t,e.req.header("anthropic-beta"));let r=Kn(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=qa(t);return a?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}):r===t.model?(n.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(n.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:t.model,to_model:r}),o.debug(`Model mapping: '${t.model}' → '${r}'`),{ok:!0,payload:{...t,model:r}})}catch(t){if(t instanceof Wn)return{ok:!1,response:ja(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function Ma(e){let t=function(e){let t=[];for(let o of e)"user"===o.role?t.push(...Fa(o)):t.push(...Ua(o));return t}(e.messages);if(0===t.length)throw new Bt("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 o={model:e.model,input:t,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)},n=function(e){return e?function(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}("string"==typeof e?e:e.map(e=>e.text).join("\n\n")):null}(e.system);return n&&(o.instructions=n),e.tools?.length&&(o.tools=e.tools.filter(aa).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(o.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)),"adaptive"===e.thinking?.type?o.reasoning={effort:Ha(e.output_config?.effort??"high")}:"enabled"===e.thinking?.type&&e.thinking.budget_tokens&&(o.reasoning=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens)),o}function Ha(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Fa(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(Ba(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)"text"===t.type?e.push({type:"input_text",text:t.text}):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 Ba(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 Ua(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 La(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 Ga(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function za(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 Ja(e,t){let o=[];switch(e.type){case"response.created":za(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){za(t,o),Ga(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":za(t,o),Ga(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":Ga(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":{Ga(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:La(e.response.status,n),stop_sequence:null},usage:{input_tokens:r?.input_tokens??0,output_tokens:r?.output_tokens??0}},{type:"message_stop"});break}case"response.incomplete":{za(t,o),Ga(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:{input_tokens:n?.input_tokens??0,output_tokens:n?.output_tokens??0}},{type:"message_stop"});break}case"response.failed":za(t,o),Ga(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":za(t,o),Ga(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":za(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 Wa(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 Ka(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Va(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&&(Wa(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&&(Wa(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Ka(t,o)),r.content&&(Ka(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){Ka(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&&(Ka(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:_a(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 Ya=/structured_outputs|output_config\.format/i;function Xa(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Ya.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Na({...e,model:Un},o):null}var Za=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Qa=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const ei={tavily:async function(e,t,n){let r=function(e,t){let o={query:e,max_results:t?.maxResults??5};return t?.includeDomains?.length&&(o.include_domains=t.includeDomains),t?.excludeDomains?.length&&(o.exclude_domains=t.excludeDomains),o}(t,n);o.debug("Tavily search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await et({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("tavily.results_count",e.results.length),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw Ve(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Qa:e}finally{clearTimeout(i)}},exa:async function(e,t,n){let r=function(e,t){let o={query:e,numResults:t?.maxResults??5,contents:{text:!0}};return t?.includeDomains?.length&&(o.includeDomains=t.includeDomains),t?.excludeDomains?.length&&(o.excludeDomains=t.excludeDomains),o}(t,n);o.debug("Exa search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await et({spanName:"exa POST /search",url:"https://api.exa.ai/search",target:"exa_search",method:"POST",headers:{"Content-Type":"application/json","x-api-key":e},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"exa.max_results":n?.maxResults??5,"exa.has_include_domains":!!n?.includeDomains?.length,"exa.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("exa.results_count",e.results.length),o.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw Ve(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Za:e}finally{clearTimeout(i)}}},ti=["tavily","exa"];function oi(e){return"tavily"===e||"exa"===e}function ni(){return Z.webSearchProviders.length>0}async function ri(e,t){return async function(e,t,n){let{providers:r,searchFns:a=ei}=n;if(0===r.length)throw Error("No web search provider configured");let i,s=[];for(let[n,l]of r.entries())try{let n=await a[l.name](l.key,e,t);return s.length>0&&o.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),n}catch(e){i=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);n!==r.length-1&&o.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${r[n+1].name}".`)}let l=i instanceof Error?i.message:String(i);throw o.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),i instanceof Error?i:Error("All web search providers failed")}(e,t,{providers:Z.webSearchProviders})}function ai(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function ii(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 si(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return t&&ra(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!ni())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await ri(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_${ai()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...ii(n,e)}];return{id:`msg_ws_${ai()}`,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_${ai()}`,r=`msg_ws_${ai()}`,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:ii(n,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),D(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const li=(e,t)=>!(!e||!t||e===t);async function ci(e){if(Z._t1||await Ro())return null;let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Eo()}`}},401)):(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function ui(e,t){let o=t.model;return o&&"string"==typeof o?null:ja(e,"Model name is required and must be a string")}async function pi(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&ra(t[0])}(t))return ui(e,t)??si(e,t);await Yn(Z),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=ui(e,t);if(a)return a;t=function(e,t){return ga(t,Z.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Da(e,t);if(!i.ok)return i.response;t=i.payload;let s=await ci(e);if(s)return s;if(Vn(t.model))return hi(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t,o){let n=Na(t,Z.models),r={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},a=n.output_config?.effort;return e.set("requestData",{model:n.model,reasoningEffort:a,effortClamped:li(o,a),streaming:!!n.stream}),Z.manualApprove&&await Dn(),ge.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",n.model),t.setAttribute("copilot_api.streaming",!!n.stream),da(t,n,r.anthropicBeta);try{let o=performance.now(),a=await ma(n,r,{onStructuredOutputFallback:(e,o)=>{let n=Xa(e,o,Z.models);return n&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",n.model)),n}}),i=performance.now()-o;if(Me.record(i,{model:n.model,target:"anthropic_messages",streaming:String(!!n.stream)}),!n.stream){let o=a,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=Hn(mi(t)),o._d1=i,o.upstreamTtfbMs=i,o.upstreamTotalMs=i,e.set("requestData",o)}return t.end(),e.json(o)}let{events:s,span:l,release:c}=a;return D(e,async r=>{let a=0,i=performance.now(),u={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=cr(e,o);try{try{for await(let e of s)d(),e.data&&"[DONE]"!==e.data?(a++,Pe.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),fi(e.data,u)&&(p=!0),await r.writeSSE(e)):await r.writeSSE(e);let e=performance.now()-i,t={model:n.model,endpoint_type:"anthropic_messages"};He.record(e,t),Je.record(a,t)}catch(t){throw Ye(l,e.get("requestSpan"),t),await Qn(r,t),t}finally{if(ur(e,o),p){let t=mi(u);Fn(l,t);let o=e.get("requestData")||{};o.tokenUsage=Hn(t),e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&ue.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Ve(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=ge.startActiveSpan("copilot_api.translate.anthropic_to_openai",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),o.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),o.setAttribute("copilot_api.translation.has_system",!!t.system),o.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let n=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)),r=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));return o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),ya(t,Z.models)}finally{o.end()}});Be.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=ir(c,Z.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:li(r,u),streaming:!!c.stream});let p=performance.now();Z.manualApprove&&await Dn();let d=await $r(c),m=performance.now()-p;if(Me.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),di(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=Hn(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=ge.startActiveSpan("copilot_api.translate.openai_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","openai_to_anthropic");let t=function(e){let t=[],o=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let a of e.choices){let e=Sa(a.message),i=Aa(a.message.content),s=Ea(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:_a(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 Be.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}o.debug("Streaming response from service");let{events:f,span:h,release:g}=d;return D(e,async t=>{let n=null,r=0,a=performance.now(),i=cr(e,p),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of f){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let l;try{l=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,Pe.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=Hn(n),t._d1=m,e.set("requestData",t)}let u=Va(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(He.record(l,u),Je.record(r,u),ur(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Hn(n),t._d1=m,e.set("requestData",t))}}catch(o){throw Ye(h,e.get("requestSpan"),o),await Qn(t,o),o}finally{n&&Fn(h,n),h.end(),g()}let l=e.get("requestId");l&&ue.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const di=e=>Object.hasOwn(e,"choices");function mi(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 fi(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 hi(e,t){let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.anthropic_to_responses",e=>{try{return e.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),e.setAttribute("copilot_api.translation.message_count",t.messages.length),Ma(t)}finally{e.end()}});Be.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),Z.manualApprove&&await Dn();let i=performance.now(),s=await Er(a),l=performance.now()-i;if(Me.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Or(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Hn({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens})),t._d1=l,t.upstreamTtfbMs=l,t.upstreamTotalMs=l,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(s).slice(-400)),"failed"===s.status)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:s.error?.code??"api_error",message:s.error?.message??"Response generation failed"}},500);let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:La(e.status,o),stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}(s)}finally{e.end()}});return Be.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return D(e,async t=>{let n=null,r=0,s=performance.now(),d=cr(e,i),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let i of c){if(d(),o.debug("Responses API raw stream event:",i),!i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}r++,Pe.add(1,{model:a.model,endpoint_type:"responses"});let c=Ir(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Hn(n),t._d1=l,e.set("requestData",t)}let u=Ja(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"};He.record(u,p),Je.record(r,p),ur(e,i)}catch(o){throw Ye(u,e.get("requestSpan"),o),await Qn(t,o),o}finally{n&&Fn(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const gi=new q;gi.post("/",async e=>{try{return await pi(e)}catch(t){return await io(e,t)}});const _i=new q;function yi(e){return ge.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Kn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function wi(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=Hn(o),n._d1=t._d1,t.c.set("requestData",n)}_i.get("/",async e=>{try{Z.models||await ho();let t=Z.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await io(e,t)}});const ki=new Set(["message","function_call","function_call_output"]),bi=new Set(["type","name","description","parameters"]);async function vi(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||!ni())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await ri(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function xi(e){if(ni())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await vi(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Ti(e){if(!ni())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 vi(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function $i(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 ki.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Ai(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 Si(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&&Ai(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)Ai(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Ei(e){return null!=e}function Ci(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Oi(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Ii(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(!Ci(n)){o.push(n);continue}let e=$i(n);null===e?t.add(Oi(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"])Ei(e[o])&&(t[o]=e[o]);let r=new Set;if(Ei(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))bi.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(Ei(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Ei(o.effort)&&(t.reasoning.effort=o.effort),Ei(o.summary)&&(t.reasoning.summary=o.summary)}if(Ei(e.text)&&"object"==typeof e.text){let o=e.text;Ei(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Pi(e,t){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Ri(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=d.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||Ei(n.previous_response_id)||Ei(n.prompt)||Ei(n.conversation)?null:Pi(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 Ni(e){await Yn(Z);let t=await e.req.json();if(!Ci(t))return Pi(e,"request body must be a JSON object");let n=Ii(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:yi(t)}}catch(t){if(t instanceof Wn)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=Ri(e,t.input,n);if(s)return s;let l=await Mn(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),Z.manualApprove&&await Dn();let c=performance.now(),u=await Er(a),p=performance.now()-c;if(Me.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),qi(u))return async function(e,t,o){await xi(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Hn({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return D(e,async t=>{let o={value:null},n=0,i=performance.now(),s=cr(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Si(i.data,r);s=await Ti(s);let l=s===i.data?i:{...i,data:s};Pe.add(1,{model:a.model,endpoint_type:"responses"}),wi(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"};He.record(l,u),Je.record(n,u),ur(e,c)}catch(o){throw Ye(m,e.get("requestSpan"),o),await er(t,o),o}finally{o.value&&Fn(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ue.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const qi=e=>Object.hasOwn(e,"output"),ji=new q;ji.post("/",async e=>{try{return await Ni(e)}catch(t){return await io(e,t)}});const Di=new q;Di.get("/",e=>{try{return Z.showToken?e.json({token:Z._t1}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return o.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const Mi=new q;Mi.get("/",async e=>{try{let t=await Vo();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Hi=new q;function Fi(){return function(e){let t=e.filter(e=>Nn(e));if(0===t.length)return;let o=t.find(e=>Rn.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(Z.models?.data??[])}function Bi(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 En(o).slice(0,200)}catch{}let t=En(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 Ui(e={}){let t=performance.now(),o=e.model&&function(e){let t=Z.models?.data.find(t=>t.id===e);return void 0!==t&&Nn(t)}(e.model)?e.model:Fi();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 Hi.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[In]:Pn},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:Bi(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)}}Hi.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=yt(i),p=function(e){return e===Pn}(e.req.header(In));e.set("requestId",r),e.set("isSelfTest",p),e.header("x-request-id",r);let m=ge.startSpan("copilot_api.handle_request",{kind:l.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",m),e.set("requestTraceContext",m.spanContext()),p&&m.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Ze.has(e)||"x-copilot-api-self-test"!==e&&m.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=await e.req.raw.clone().text();e.set("rawBody",t.length>jn?t.slice(0,jn):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let f,h=new Promise(e=>{f=e});e.set("streamComplete",h),e.set("resolveStreamComplete",f);let g=d.setSpan(u.active(),m);await u.with(g,async()=>{p||ue.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw m.setStatus({code:c.ERROR,message:t.message}),m.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:m};_?.streaming&&e.res.status<400?h.then(()=>qn(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{m.recordException(t),m.setStatus({code:c.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{m.end()}catch{}}):qn(y)}),Hi.use(j()),Hi.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()}),Hi.get("/",e=>e.text("Server running")),Hi.route("/health",ta),Hi.route("/chat/completions",Qr),Hi.route("/models",_i),Hi.route("/embeddings",ea),Hi.route("/usage",Mi),Hi.route("/token",Di),Hi.route("/v1/chat/completions",Qr),Hi.route("/v1/models",_i),Hi.route("/v1/embeddings",ea),Hi.route("/v1/messages",gi),Hi.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=sa.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=sa.perMessage+la(e)*sa.contentMultiplier}for(let e of t.messages)o+=sa.perMessage,o+=la(e.role),"string"==typeof e.content?o+=la(e.content)*sa.contentMultiplier:Array.isArray(e.content)&&(o+=ca(e.content));let n=t.tools?.filter(aa);return n&&n.length>0&&(o+=function(e){let t=sa.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=sa.perTool),t+=la(n.name),n.description&&(t+=sa.perDesc+la(n.description)),t+=ua(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),Hi.route("/v1/responses",ji),Hi.route("/responses",ji),Hi.onError((e,t)=>io(t,e));const Li=e=>`[1m${e}[0m`,Gi=e=>`[2m${e}[0m`,zi=e=>`[32m${e}[0m`,Ji=e=>`[31m${e}[0m`,Wi=e=>`[33m${e}[0m`,Ki=Gi(" ─────────────────────────────────────────────────────────────");function Vi(e,t,o){console.log(` ${function(e){return"ok"===e?zi("✓"):"warn"===e?Wi("⚠"):Ji("✗")}(e)} ${Li(t.padEnd(14))} ${o}`)}function Yi(e){console.log(` ${Gi("↳")} ${Gi(e)}`)}function Xi(e){return e instanceof Bt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function Zi(){let e=g.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await a.readFile(K.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 Qi(){try{await ho();let e=(Z.models?.data.length??0)>0;return Vi(e?"ok":"warn","Model catalog",e?function(){let e=Z.models?.data??[],t={Claude:0,OpenAI:0,Gemini:0,Embedding:0};for(let o of e)o.id.startsWith("text-embedding")?t.Embedding++:"Anthropic"===o.vendor?t.Claude++:"Google"===o.vendor?t.Gemini++:t.OpenAI++;let o=Object.entries(t).filter(([,e])=>e>0).map(([e,t])=>`${e}: ${t}`);return`${e.length} models (${o.join(", ")})`}():"empty"),e}catch(e){return Vi("fail","Model catalog",Xi(e)),Yi("Could not fetch /models — check connectivity/auth."),!1}}async function es(e){Z.accountType=e.accountType;let t=await Et(),o=Ct();if(console.log(""),console.log(` ${Li("COPILOT-API DOCTOR")} ${Gi(`v${t}`)}`),console.log(Ki),Vi("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await V(),go(),!await async function(){let e=await Zi();if(!e)return Vi("fail","Auth token","not found"),void Yi("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");Z._t2=e.token,Vi("ok","Auth token",`found (${e.source})`);try{let e=await lo();return await lt(Z,e.login),Vi("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return Vi("fail","GitHub auth",Xi(e)),void Yi("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(Ki),console.log(` ${Ji("✗")} ${Li("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await so();return Z._t1=e,Vi("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Bt?e.response.status:0;return Vi("fail","Service token",Xi(e)),Yi(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 Qi();await async function(){try{let e=await Vo(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Lo(Go(t))} of ${Lo(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;Vi("ok","Copilot plan",`${e.copilot_plan} · ${o} `+Gi(`(resets ${e.quota_reset_date})`))}catch(e){Vi("warn","Copilot plan",`unavailable (${Xi(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Ui();return e.ok?(Vi("ok","Generation",`works via ${e.model} ${Gi(`(${e.durationMs}ms)`)}`),!0):(Vi("fail","Generation",`${e.reason}${e.status?Gi(` [HTTP ${e.status}]`):""}`),!1)}():Vi("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let o of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let n=g.env[o];n&&("ANTHROPIC_BASE_URL"===o&&/\/v1\/*$/.test(n)&&(t="warn",e.push(`${o}=${n} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(n)&&(t="warn",e.push(`${o}=${n} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){Vi(t,"Client config","potential base-URL issue");for(let t of e)Yi(t)}else Vi("ok","Client config","no base-URL issues detected");Yi("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(Ki),a?(console.log(` ${zi("✓")} ${Li("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Wi("⚠")} ${Li("Some checks need attention")} — see the ${Ji("✗")}/${Wi("⚠")} lines above.`),console.log(""),2)}const ts=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 es({accountType:e["account-type"]});g.exit(t)}});function os(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 ns=!1;const rs="copilot-api-node20",as=`https://registry.npmjs.org/${rs}/latest`,is=e=>`[1m${e}[0m`,ss=e=>`[33m${e}[0m`;async function ls(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(as,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function cs(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 us,ps;async function ds(e){try{let[t,o]=await Promise.all([Et(),ls(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 ms(){if(!us||!ps)return;let{signal:e}=ps;us.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${rs}@latest`,n=ss("│"),r=` ${is("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${is(o)} to update`,i=" ".repeat(54),s=ss(`╭${"─".repeat(54)}╮`),l=ss(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${cs(r,54)}${n}`,`${n}${i}${n}`,`${n}${cs(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var fs={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 hs=262144,gs="https://barazany.dev",_s=/^[a-z0-9][a-z0-9-]*$/i,ys=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function ws(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(ys," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function ks(e){if("object"!=typeof e||!e)return null;let t=e,o=ws(t.title,100),n=ws(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!==gs||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&&_s.test(t.slug)&&(r=`${gs}/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 bs(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=ks(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 vs=null;function xs(e){return s.join(e,"blog-posts.json")}function Ts(e=K.APP_DIR){try{if(vs&&vs.length>0)return vs;let t=function(e){try{let t=xs(e);return U.statSync(t).size>hs?[]:bs(JSON.parse(U.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:bs(fs)}catch{return[]}}function $s(e){return e>-6e4&&e<864e5}async function As(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>hs)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>hs?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>hs)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?[]:bs(JSON.parse(o))}finally{clearTimeout(o)}}async function Ss(e={}){try{if("1"===g.env.COPILOT_API_NO_BLOG||"1"===g.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??K.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=xs(e),n=await U.promises.stat(o);if(n.size<=hs){let e=await U.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return $s(t-n.fetchedAt)}return $s(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await As(e.timeoutMs??3e3);if(0===n.length)return;vs=n,await async function(e,t,o){let n=xs(e),r=`${n}.${g.pid}.tmp`;try{await U.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await U.promises.rename(r,n)}catch(e){throw await U.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}function Es(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=g;if("win32"===e){try{if(h(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=o.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),r=Object.entries(e).filter(([,e])=>void 0!==e);switch(n){case"powershell":o=r.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":o=r.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":o=r.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(" ");o=r.length>0?`export ${e}`:"";break}}return o&&t?`${o}${"cmd"===n?" & ":" && "}${t}`:o||t}const Cs=e=>`[1m${e}[0m`,Os=e=>`[2m${e}[0m`,Is=e=>`[36m${e}[0m`,Ps=e=>`[32m${e}[0m`,Rs=e=>`[33m${e}[0m`,Ns=e=>`[4m${e}[0m`,qs=(e,t)=>`]8;;${e}\\${t}]8;;\\`,js="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Ds="https://github.com/johnib/copilot-api-issues/issues",Ms=Os(" ─────────────────────────────────────────────────────────────");function Hs(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Fs(e){return e&&0!==e.length?e.join("·"):"—"}function Bs(e){if(0===e.length)return[];let t=["",Ms,` ${Cs("BARAZANY.DEV")} ${Os("— Recent Posts")}`,Ms,""];for(let[o,n]of e.entries()){let e=`${n.url}${js}`,r=qs(e,Cs(Ns(`[${o+1}]`)));t.push(` ${r} ${Is(n.title)}`,` ${Os("→")} ${Os(n.teaser)}`,"")}return t.push(Ms,` ${qs(`https://barazany.dev/blog${js}`,"barazany.dev/blog")}`,Ms),t}function Us(e){let t=[];Z.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):Z.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearchProviders.length>0?`${e.webSearchProviders.map(e=>(e=>e&&e[0].toUpperCase()+e.slice(1))(e)).join(Os(" → "))} ${Ps("✓")}`:Os("off"),n=["",` ${Cs("COPILOT-API")} ${Os(`v${e.version}`)}`,Ms,` ${Os("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Os("User")} ${e.user} ${Os("·")} ${e.accountType}`];return Z._v1&&n.push(` ${Os("Client")} VSCode ${Z._v1}`),n.push(` ${Os("Network")} ${t.join(Os(" · "))}`,` ${Os("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Os("Clipboard")} Claude Code command ${Ps("✓")}`),n.push(Ms),n}function Ls(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Cs("Active")}`];if(e.model){let o=Z.models?.data.find(t=>t.id===e.model),n=Hs(o?.capabilities.limits?.max_context_window_tokens),r=Fs(o?.capabilities.supports.reasoning_effort);t.push(` ${Is(e.model.padEnd(32))} ${Os("ctx")} ${Cs(n.padStart(5))} ${Os("effort")} ${Os(r)} ${Rs("← main")}`)}if(e.smallModel){let o=Z.models?.data.find(t=>t.id===e.smallModel),n=Hs(o?.capabilities.limits?.max_context_window_tokens),r=Fs(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Os("ctx")} ${n.padStart(5)} ${Os("effort")} ${Os(r)} ${Rs("← small")}`)}return t}function Gs(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of Z.models?.data??[]){let a=r.capabilities.limits?.max_context_window_tokens,i={id:r.id,ctx:a,effort:r.capabilities.supports.reasoning_effort};r.id.startsWith("text-embedding")?n.push(i):"Anthropic"===r.vendor?e.push(i):"Google"===r.vendor?o.push(i):t.push(i)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${Cs(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Is("●"):Os("·"),i=n?Is(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Hs(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Fs(r.effort)}`;t.push(` ${a} ${i} ${Os(s)}${Os(l)}`)}}return t}function zs(){let e=Ds.replace(/^https:\/\//,""),t=qs(`${Ds}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Ms,` ${Cs("FOUND A BUG?")} ${Os("— Report it on GitHub")}`,Ms,"",` ${Is("→")} ${Is(t)}`,` ${Os("Bug reports, feature requests, and questions welcome.")}`,"",Ms]}function Js(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=["",Ms,` ${Cs("Claude Cowork")} ${Os("— Settings → Inference Provider")}`,Ms,"",` ${Os("Paste into")} ${Cs("inferenceGatewayBaseUrl")}${Os(":")}`,` ${Cs(Is(r))}`];return n||a.push("",` ${Os("Your Tailscale hostname is shown by:")} ${Is("tailscale status --self")}`),a.push("",` ${Os("Docs:")} ${Is("https://claude.com/docs/cowork/3p/installation")}`),a}function Ws(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Ms,` ${Cs("HTTPS")} ${Os("— self-signed cert")}`,Ms,"",` ${Os("Cert")} ${t}`];switch(o.push("",` ${Cs("Trust this cert")} ${Os("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${Os("macOS:")}`,` ${Is("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Is(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Os("Windows (PowerShell as Administrator):")}`,` ${Is(`Import-Certificate -FilePath "${t}" \``)}`,` ${Is("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Os("Linux (Debian/Ubuntu):")}`,` ${Is(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Is("sudo update-ca-certificates")}`,` ${Os("Linux (Fedora/RHEL/Arch):")}`,` ${Is(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Is("sudo update-ca-trust")}`);break;default:o.push(` ${Os("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Os("Or, for Node CLIs only (no admin needed):")}`,` ${Is(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Ms),o}function Ks(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 Vs=s.join(K.APP_DIR,"certs"),Ys=s.join(Vs,"cert.pem"),Xs=s.join(Vs,"key.pem"),Zs=s.join(Vs,"cert.meta.json");async function Qs(e){try{return await a.readFile(e,"utf8")}catch{return}}async function el(e){let t=await Qs(Ys),o=await Qs(Xs),n=await async function(){let e=await Qs(Zs);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 tl(e){return 0!==z(e)}async function ol(e){await a.mkdir(Vs,{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)tl(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(Ys,l.cert,{mode:420}),await a.writeFile(Xs,l.private,{mode:384}),await async function(e){await a.writeFile(Zs,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:Ys,keyPath:Xs,generated:!0}}const nl=[],rl=Date.now();let al="";function il(){let e=async(e,t=0)=>{let n=ge.startSpan("copilot_api.server.shutdown",{kind:l.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-rl)/1e3}});for(let t of nl)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=qs("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Ms,` ${Cs("COPILOT-API")} ${Os(`v${e}`)} ${Os("·")} ${Ks(t)} uptime`,Ms,""," Check in from time to time on",` ${Is(o)}`,"",Ms,""];console.log(n.join("\n"))}(al,Date.now()-rl),g.exit(t)};g.on("SIGINT",()=>e("SIGINT")),g.on("SIGTERM",()=>e("SIGTERM")),g.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),g.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}async function sl(e,t,n){if(!e._cc1)return!1;Z.models||(o.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),g.exit(1));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,Z.models.data.map(e=>e.id));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Z.models.data.map(e=>e.id)}),a=await o.prompt("Select a small model to use",{type:"select",options:Z.models.data.map(e=>e.id)}));let s=Es({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:r,ANTHROPIC_SMALL_FAST_MODEL:a,NODE_EXTRA_CA_CERTS:n?.certPath},"claude");try{return m.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function ll(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function cl(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=ge.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Xe({config:{version:o,port:t.port,accountType:t.accountType,verbose:t.verbose,manualApprove:t.manual,rateLimitSeconds:t.rateLimit??0,rateLimitWait:t.rateLimitWait,timeoutMs:t.timeout,showToken:t.showToken,_cc1:t._cc1,model:t.model,smallModel:t.smallModel,_t3:ll(t)},runtime:n,identity:{_u1:r.login,machineId:Z.machineId,sessionId:Z.sessionId,_v1:Z._v1},connectivity:Z.connectivity,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-rl},"copilot_api")});if(Z.models?.data)for(let e of Z.models.data)a.addEvent("copilot_api.model.available",Xe(e,"model"));a.end(),Ke(_.INFO,"INFO","Server started",Xe({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-rl},"copilot_api"))}async function ul(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 el(e)){let e=await Qs(Ys),t=await Qs(Xs);if(e&&t)return{cert:e,key:t,certPath:Ys,keyPath:Xs,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),ol(e)}(e.httpsHosts)}}async function pl(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=_n;try{L(t),L(n)}catch{throw o.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:n}}(e);if(il(),nl.push(()=>{o.debug("Cleaning up connectivity monitor"),ot.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),To=!1,yo&&=void clearInterval(yo),ko&&=void ot.off("online",ko),bo&&=void ot.off("offline",bo),wo=void 0,vo=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),hr&&=void clearInterval(hr),gr&&=void clearInterval(gr);let e=[...dr.keys(),...mr];dr.clear(),mr.clear(),pr.clear(),fr=void 0;for(let t of e)_r(t)&&(qe.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!pe)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([pe.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");Z.accountType=t.accountType,Z.manualApprove=t.manual,Z.rateLimitSeconds=t.rateLimit,Z.rateLimitWait=t.rateLimitWait,Z.showToken=t.showToken,Z.timeoutMs=t.timeout,Z.connectivity.timeoutMs=t.connectTimeout,Z.webSearchProviders=t.webSearchProviders,Z.errorReporting=function(e){let t=g.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===g.env.COPILOT_H2_KEEPALIVE||"true"===g.env.COPILOT_H2_KEEPALIVE,t=e||"1"===g.env.COPILOT_H2||"true"===g.env.COPILOT_H2;Z.connectivity.h2=t,Z.connectivity.h2Keepalive=e}(),await V(),Ss().catch(()=>{}),go();let n=await Et();al=n;let r=Ct();(function(e,t){t&&(me=t),de=crypto.randomUUID();let o=v({[S]:"copilot-api",[E]:e,[A]:de}),{endpoint:n,headers:r}=he();pe=new $({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new T({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x({exporter:new w({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),pe.start()})(n,rl),t._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 a,i=t._t2||g.env.GH_TOKEN;i?(function(e){Z._t2=e,$o=!1}(i),o.info("Using provided Auth token")):await qo();try{a=await lo(),await lt(Z,a.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}await(async()=>{let{token:e,refresh_in:t}=await so();Z._t1=e,o.debug("Service token fetched successfully!"),Z.showToken&&o.info("Service token:",e),To=!0,No(t),ot.start(),ko=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Po(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},bo=()=>{o.debug("Network connectivity lost")},ot.on("online",ko),ot.on("offline",bo)})(),await async function(){try{return await ho(),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,n=e instanceof Error?e.message:"Unknown error occurred",r=void 0===t?"":` (HTTP ${t})`;return o.warn(`Could not fetch model list from Copilot${r}: ${n}. This is likely a transient network or authentication issue. The proxy will start anyway; model listing endpoints may return empty until the cache is populated.`),!1}}()||function(e){let t=setTimeout(()=>{ho().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{ho().then(()=>o.debug("Model list refreshed successfully")).catch(e=>{o.warn("Failed to refresh model list; keeping existing cache:",e)})},e);return t.unref(),()=>{clearInterval(t)}}();nl.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),Z.connectivity.h2&&(kr(wr(ct(Z))),Z.connectivity.h2Keepalive&&vr()),cl({options:t,version:n,runtime:r,_u1:a});let l=await ul(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await sl(t,u,l)||await async function(e,t,n){if(!e.codex)return!1;let r;if(Z.models||(o.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),g.exit(1)),e.model){let t=Z.models.data.map(e=>e.id);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:Z.models.data.map(e=>e.id)});let a=Es({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return m.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,u,l);(function(e){let t=[...Us(e),...Ls(e),...Gs(e),...zs(),"",...Bs(Ts()),...Js(e),...Ws(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 rn()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),ms(),G({fetch:Hi.fetch,port:t.port,hostname:t.hostname,tls:l?{cert:l.cert,key:l.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(c,t.hostname,t.port),t.smokeTest&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await Ui({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: ${En(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))}}(u,t.smallModel??t.model,t.hostname)}function dl(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const ml=e({meta:{name:"start",description:"Start the API server"},args:{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:dl(t,"--rate-limit"),r=e.timeout,a=void 0===r?X:dl(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:dl(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],g.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??g.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!oi(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${ti.join(", ")}`);let r=n.length>0?n:ti,a=new Set,i=n.length>0,s=[];for(let e of r){if(!oi(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||g.env.TAVILY_API_KEY,exaApiKey:g.env.EXA_API_KEY,order:u}),d=(g.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d;return pl({port:dl(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})}});ns||(ns=!0,o.setReporters([os(o.options.reporters)]));const fl=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(us||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;ps=e,us=ds(e).catch(()=>null)})(),fl||ms();const hl=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Mo,start:ml,"check-usage":Qo,debug:Pt,doctor:ts,"cowork-setup":An}});await t(hl),fl||(ps?.abort(),ps=void 0,us=void 0);export{};
|
|
2
|
+
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{SpanKind as l,SpanStatusCode as c,context as u,metrics as p,trace as d}from"@opentelemetry/api";import m from"clipboardy";import{execFile as f,execSync as h}from"node:child_process";import g from"node:process";import{SeverityNumber as _,logs as y}from"@opentelemetry/api-logs";import{OTLPLogExporter as w}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as b}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as $}from"@opentelemetry/sdk-metrics";import{NodeSDK as T}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as A,ATTR_SERVICE_NAME as S,ATTR_SERVICE_VERSION as E}from"@opentelemetry/semantic-conventions";import{Client as O,request as C}from"undici";import{createHash as I,randomBytes as P,randomUUID as R}from"node:crypto";import{promisify as N}from"node:util";import{Hono as q}from"hono";import{cors as j}from"hono/cors";import{streamSSE as D}from"hono/streaming";import{events as M}from"fetch-event-stream";import{Tokenizer as H,models as F}from"ai-tokenizer";import*as B from"ai-tokenizer/encoding/claude";import U,{accessSync as L}from"node:fs";import{serve as z}from"srvx";import{isIP as G}from"node:net";import{generate as J}from"selfsigned";const K=s.join(i.homedir(),".local","share","copilot-api"),W={APP_DIR:K,GITHUB_TOKEN_PATH:s.join(K,"github_token"),MACHINE_ID_PATH:s.join(K,"machine_id"),SESSION_ID_PATH:s.join(K,"session_id")};async function V(){await a.mkdir(W.APP_DIR,{recursive:!0}),await Y(W.GITHUB_TOKEN_PATH),await Y(W.SESSION_ID_PATH)}async function Y(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const X=6e5,Z={accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:X,webSearchProviders:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}},Q=" │ ",ee=e=>{if(e>=1e6){let t=e/1e6;return Number.isInteger(t)?`${t}M`:`${t.toFixed(1)}M`}return e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString()},te=(e,t)=>e.padEnd(t),oe=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ne=(e,t,o)=>` --\x3e ${te(e,4)} ${te(t,21)} ${te(o,3)}`,re=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return te(t,22)})(e.model??"—")+te(t,8)},ae=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ee(Math.max(t-o,0)):"—",r=e?ee(e.outputTokens??0):"—",a=o?ee(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},ie=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${te("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ee(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},se=e=>{if(void 0===e.ttfbMs)return`e2e ${oe(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${oe(e.ttfbMs)} → e2e ${oe(e.e2eMs)} ${t}`},le=e=>e?Z.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,ce=e=>({...e?.inputTokens&&{"copilot_api.input_tokens":e.inputTokens},...e?.inputTokens&&{"copilot_api.fresh_input_tokens":Math.max(e.inputTokens-(e.cachedTokens??0),0)},...e?.outputTokens&&{"copilot_api.output_tokens":e.outputTokens},...e?.cachedTokens&&{"copilot_api.cached_tokens":e.cachedTokens}}),ue={completionCallbacks:new Map,registerCompletion(e,t,o){this.completionCallbacks.set(e,{context:t,startTime:o,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(e){let{context:t,startTime:n}=e,r=Math.round(performance.now()-n),a=t.get("requestData"),i=a?.upstreamTotalMs??a?._d1,s=(e=>[ne(e.method,e.path,e.status),re(e),ae(e.tokenUsage),ie(e.tokenUsage,e.maxContextTokens),se({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(Q))({method:t.req.method,path:t.req.path,status:t.res.status.toString(),model:a?.model,reasoningEffort:a?.reasoningEffort,effortClamped:a?.effortClamped,tokenUsage:a?.tokenUsage,maxContextTokens:le(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),We(_.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:o,duration:n,upstreamTotal:r}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":n,...o?.model&&{"copilot_api.model":o.model},...o?.reasoningEffort&&{"copilot_api.reasoning_effort":o.reasoningEffort},...o?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==o?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(o.upstreamTtfbMs)},...void 0!==r&&{"copilot_api.upstream_total_ms":Math.round(r),"copilot_api.copilot_duration_ms":Math.round(r)},...ce(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=n.get("requestData");o.warn((e=>[ne(e.method,e.path,"429"),re(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${oe(e.e2eMs)}`].join(Q))({method:n.req.method,path:n.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},logError(e,t,n){let{context:r,startTime:a}=e,i=Math.round(performance.now()-a),s=r.get("requestData");o.error((e=>{let t=ne(e.method,e.path,e.status.toString()),o=re(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${oe(e.e2eMs)}`].join(Q)})({method:r.req.method,path:r.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:n,e2eMs:i}))},cleanup(){let e=performance.now()-12e5;for(let[t,o]of this.completionCallbacks)o.startTime<e&&this.completionCallbacks.delete(t);if(this.completionCallbacks.size>1e3){let e=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),t=e.slice(0,e.length-1e3);for(let[e]of t)this.completionCallbacks.delete(e)}}};setInterval(()=>ue.cleanup(),6e4);let pe,de,me=Date.now();const fe={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function he(){let e=process.env.OTEL_EXPORTER_OTLP_ENDPOINT??"https://api.honeycomb.io",t=process.env.OTEL_EXPORTER_OTLP_HEADERS?function(e){return e?Object.fromEntries(e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf("=");return-1===t?[e,""]:[decodeURIComponent(e.slice(0,t)),decodeURIComponent(e.slice(t+1))]})):{}}(process.env.OTEL_EXPORTER_OTLP_HEADERS):fe;return{endpoint:e.replace(/\/$/,""),headers:t}}const ge=d.getTracer("copilot-api"),_e=p.getMeter("copilot-api"),ye=y.getLogger("copilot-api"),we=_e.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),ke=_e.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),be=_e.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),ve=_e.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),xe=_e.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),$e=_e.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Te=_e.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ae=_e.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Se=_e.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Ee=_e.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Oe=_e.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Ce=_e.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Ie=_e.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Pe=_e.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Re=_e.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ne=_e.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),qe=_e.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),je=_e.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),De=_e.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Me=_e.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),He=_e.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Fe=_e.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Be=_e.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Ue=_e.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Le=_e.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),ze=_e.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Ge=_e.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Je=_e.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),Ke=_e.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function We(e,t,o,n,r){let a=d.getActiveSpan()?.spanContext()??r;ye.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function Ve(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:c.ERROR,message:o??n.message}),e.recordException(n)}function Ye(e,t,o){Ve(e,o),t&&t!==e&&Ve(t,o)}function Xe(e,t=""){let o={};if(null==e)return o;if("object"!=typeof e)return("string"==typeof e||"number"==typeof e||"boolean"==typeof e)&&t&&(o[t]=e),o;if(Array.isArray(e))return t&&(o[t]=JSON.stringify(e)),o;for(let[n,r]of Object.entries(e)){let e=t?`${t}.${n}`:n;void 0!==r&&"function"!=typeof r&&(null===r?o[e]="null":"object"!=typeof r||Array.isArray(r)?Array.isArray(r)?o[e]=JSON.stringify(r):("string"==typeof r||"number"==typeof r||"boolean"==typeof r)&&(o[e]=r):Object.assign(o,Xe(r,e)))}return o}_e.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!ot.getConnectivityStats().isOnline)}),_e.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(ot.getConnectivityStats().consecutiveFailures)}),_e.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(Z.models?.data.length??0)}),_e.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ue.completionCallbacks.size)}),_e.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-me)/1e3)});const Ze=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","proxy-authorization"]);function Qe(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Ze.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function et(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:u}=e,p=ge.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&Qe(p,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();Ze.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),Ie.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:c.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw Ve(p,e),p.end(),e}}async function tt(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=ge.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Qe(f,"request",a);try{let{statusCode:e,headers:t,body:l}=await C(o,{method:r,headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!Ze.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Ie.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:c.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:l,span:f}}catch(e){throw Ve(f,e),f.end(),e}}const ot=new class extends EventTarget{isOnline=!0;lastChecked=(new Date).toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){o.debug("Starting connectivity monitor",{probeEndpoints:Z.connectivity.probeEndpoints,fastInterval:Z.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){o.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval)+Math.random()*Z.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ge.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),Z.connectivity.timeoutMs);try{let n=!1;for(let e of Z.connectivity.probeEndpoints)try{let t=performance.now(),o=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...Z.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Le.record(r,{endpoint:e,result:"success"});break}Le.record(r,{endpoint:e,result:"failed"})}catch(t){this.endpointFailureStats[e]=(this.endpointFailureStats[e]||0)+1,o.debug(`Probe failed for ${e}:`,t)}this.updateConnectivityState(n);let r=n?"online":"offline";e.setAttribute("copilot_api.connectivity.result",r),e.setAttribute("copilot_api.connectivity.consecutive_failures",this.consecutiveFailures),this.lastSuccessfulEndpoint&&e.setAttribute("copilot_api.connectivity.successful_endpoint",this.lastSuccessfulEndpoint),Oe.add(1,{result:n?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&o.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),Ce.add(1,{from:"offline",to:"online"}),We(_.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(o.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),Ce.add(1,{from:"online",to:"offline"}),We(_.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,o.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*Z.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:Z.connectivity.jitterMaxMs>0,connectionPooling:Z.connectivity.connectionPooling,dnsCache:Z.connectivity.dnsCache}}},nt=()=>({"content-type":"application/json",accept:"application/json"}),rt="0.48.1",at=`copilot-chat/${rt}`,it=`GitHubCopilotChat/${rt}`,st=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${W.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=I("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},lt=async(e,t)=>{e.machineId||=await st(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(W.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(W.SESSION_ID_PATH,e),await a.chmod(W.SESSION_ID_PATH,384),e})()},ct=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,ut=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=R(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":at,"User-Agent":it,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":R(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},pt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const dt=(e,t,o)=>{let n=ut(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,a=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&pt.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta):void 0;if(a)for(let e of a.split(","))r.add(e);if(o)for(let e of o)r.add(e);return r.size>0&&(n["anthropic-beta"]=[...r].join(",")),n},mt="https://api.github.com",ft=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":at,"user-agent":it,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),ht="https://github.com",gt="01ab8ac9400c4e429b23",_t=["user:email"].join(" ");function yt(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const wt=32768,kt=[{regex:/Bearer\s+[\w.-]{20,}/g,mask:"Bearer ***"},{regex:/\bghu_[A-Za-z0-9]{20,}/g,mask:"ghu_***"},{regex:/\bghp_[A-Za-z0-9]{20,}/g,mask:"ghp_***"},{regex:/\bgho_[A-Za-z0-9]{20,}/g,mask:"gho_***"},{regex:/\bghs_[A-Za-z0-9]{20,}/g,mask:"ghs_***"},{regex:/\bghr_[A-Za-z0-9]{20,}/g,mask:"ghr_***"},{regex:/\bsk-[A-Za-z0-9-]{20,}/g,mask:"sk-***"},{regex:/\bhcaik_[A-Za-z0-9]{20,}/g,mask:"hcaik_***"}],bt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);function vt(e){let t=e;for(let{regex:e,mask:o}of kt)t=t.replace(e,o);return t}const xt=new Map;function $t(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 Tt(e,t,o){let n=vt(o),r=8*wt,a=n.length>r,i=a?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(i.length<=wt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=wt)e.setAttribute(`${t}.part_${o/wt}`,i.slice(o,o+wt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/wt))}e.setAttribute(`${t}.bytes`,n.length),e.setAttribute(`${t}.sha256`,s),a&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,n.length-i.length))}function At(e,t){let o=function(e){if(xt.size>=1e3&&!xt.has(e)){let e=xt.keys().next().value;void 0!==e&&xt.delete(e)}let t,o=(xt.get(e)??0)+1;return xt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",je.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",o),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===o)return{decision:o};if("suppressed"===o)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:o};let n=t.c.get("rawBody");n&&Tt(e,"copilot_api.incoming_request_body",n);let r=St(t.c.req.header());return r&&Tt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&Tt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Tt(e,"copilot_api.outgoing_headers",St(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Tt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function St(e){let t={};for(let[o,n]of Object.entries(e))bt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Et(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await a.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function Ot(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:i.platform(),arch:i.arch()}}async function Ct(){try{return!!(await a.stat(W.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(W.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function It(e){let t=await async function(){let[e,t]=await Promise.all([Et(),Ct()]);return{version:e,runtime:Ot(),paths:{APP_DIR:W.APP_DIR,GITHUB_TOKEN_PATH:W.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const Pt=e({meta:{name:"debug",description:"Print debug information about the application"},args:{json:{type:"boolean",default:!1,description:"Output debug information as JSON"}},run:({args:e})=>It({json:e.json})}),Rt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Nt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",qt=new Set;let jt;function Dt(e){if(Z.errorReporting&&!(e.statusCode<500)&&!qt.has(e.signature)){if(qt.size>=1e3){let e=qt.values().next().value;void 0!==e&&qt.delete(e)}qt.add(e.signature),async function(e){jt??=Et();let t=await jt,o=Ot(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(vt(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:yt(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(Rt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Nt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function Mt(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const Ht=new WeakSet;async function Ft(e,{attempt:t,maxRetries:n,operation:r}){return Mt(e)&&t<n?(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&Ht.add(e)}(e),!1)}var Bt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Ut=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Lt(e,t){return setTimeout(()=>e.abort(new Ut(t)),t)}const zt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Gt=RegExp(`\\b(?:${[...zt].join("|")})\\b`);function Jt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function Kt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Jt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function Wt(e){let t=e.code;return"string"==typeof t?t:void 0}function Vt(e){if(void 0===e.cause)return"";let t=Kt(e);if(t===e)return"";let o=Wt(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function Yt(e){if(!(e instanceof Error))return!1;let{codes:t,messages:o}=function(e){let t=[],o=[],n=new Set,r=(e,a)=>{if(a>4||!(e instanceof Error)||n.has(e))return;n.add(e);let{code:i,errors:s,cause:l}=e;if("string"==typeof i&&t.push(i),o.push(e.message),Array.isArray(s))for(let e of s)r(e,a+1);r(l,a+1)};return r(e,0),{codes:t,messages:o}}(e);return!!t.some(e=>zt.has(e))||!(t.length>0)&&(!!o.some(e=>Gt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Xt(e){return e.req.path.startsWith("/v1/messages")}function Zt(e,t){if(Xt(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}function Qt(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type?o.type=t.type:"string"==typeof t.code&&(o.type=t.code),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function eo(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",t.message))}function to(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=e.message),t}function oo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=$t({endpointType:yt(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});At(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function no(e,t,o){let n=e.get("requestId"),r=ue.completionCallbacks.get(n);r&&(ue.logError(r,t,o),ue.completionCallbacks.delete(n))}function ro(e,t){(function(e){return"object"==typeof e&&!!e&&Ht.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",Z.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function ao(e){return Yt(e)||function(e){return Mt(e)||e instanceof Error&&Mt(e.cause)}(e)}async function io(e,t){if(ro(d.getActiveSpan(),t),t instanceof Bt&&429===t.response.status)return async function(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=ue.completionCallbacks.get(n);r&&(ue.logRateLimit(r,t.response),ue.completionCallbacks.delete(n)),$e.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=Zt(a,e),s=Qt(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),eo(o,s),We(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...to(s)}),oo({c:e,error:t,errorText:a,upstream:s}),e.json(i,429)}(e,t);if(t instanceof SyntaxError){d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),We(_.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let o=Xt(e)?{type:"error",error:{type:"invalid_request_error",message:"Invalid JSON in request body"}}:{error:{message:"Invalid JSON in request body",type:"invalid_request_error"}};return no(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Bt)return async function(e,t){let o=d.getActiveSpan(),n=await t.response.text(),r=Zt(n,e),a=Qt(r);return no(e,t.response.status,a.message??t.message),o?.setStatus({code:c.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),eo(o,a),We(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...to(a)}),oo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&Dt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:$t({endpointType:yt(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message}),e.json(r,t.response.status)}(e,t);if(function(e){return e instanceof Ut||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Ut}(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Upstream request timed out"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","request_timeout");let n="Upstream request timed out (gateway timeout). Increase the timeout or retry.";We(_.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=Xt(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return no(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(ao(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?Kt(t):void 0,r=(n&&Wt(n))??"none",a=n?.message??String(t);o?.setAttribute("copilot_api.transport_cause_code",r),o?.setAttribute("copilot_api.transport_cause_message",a);let i="Temporary upstream connection failure. Please retry.";We(_.WARN,"WARN",i,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":r,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=Xt(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return no(e,503,t instanceof Error?`${t.message}${Vt(t)}`:i),e.json(s,503)}(e,t);let n=d.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:c.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),We(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Dt({route:e.req.path,statusCode:500,errorClass:r.name,signature:$t({endpointType:yt(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${Vt(r)}`}),no(e,500,r.message),o.error(r);let a=Xt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const so=async()=>{let e=`${mt}/copilot_internal/v2/token`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:ft(Z),signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get Service token",t);return await t.json()}catch(e){throw Ve(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function lo(){let e=`${mt}/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${Z._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Ve(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let co=null;function uo(){return co||=so().then(({token:e})=>{Z._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{co=null}),co}const po=async()=>{let e=`${ct(Z)}/models`,t=ut(Z),o=Z.timeoutMs,n=new AbortController,r=Lt(n,o);try{let{response:o,span:r}=await et({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Bt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Ve(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const mo=e=>new Promise(t=>{setTimeout(t,e)}),fo=e=>null==e;async function ho(){let e=await(async()=>{try{return await po()}catch(e){if(e instanceof Bt&&401===e.response.status)return await uo(),po();throw e}})();Z.models=e}const go=()=>{Z._v1="1.140.0-insider"};var _o=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let yo,wo,ko,bo,vo,xo=!1,$o=!1,To=!1;function Ao(){return So()?vo:void 0}function So(){return void 0!==vo&&Date.now()-vo.at<6e4}function Eo(){return To?"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 Oo=()=>a.readFile(W.GITHUB_TOKEN_PATH,"utf8");function Co(e){let{span:t,error:n,reason:r,refreshStart:a,attempt:i}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";Z._t1=void 0,vo={status:s,message:l,at:Date.now()},clearInterval(yo),yo=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Se.add(1,{reason:r,success:"false"}),Ee.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:c.ERROR,message:n.message}),t.recordException(n),Ue.record(performance.now()-a,{reason:r}),We(_.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":i,"copilot_api.token_refresh.terminal_status":s})}function Io(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;Z._t1=void 0,o.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=n instanceof Error?n:Error(String(n));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:c.ERROR,message:s.message}),t.recordException(s),Ee.add(1,{reason:r}),Ue.record(performance.now()-a,{reason:r}),We(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Po=async(e=5,t=1e3,n="scheduled")=>xo?(o.debug("Token refresh already in progress, coalescing"),wo):(xo=!0,wo=ge.startActiveSpan("copilot_api.token.refresh",async r=>{let a=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let i=1;i<=e;i++)try{r.setAttribute("copilot_api.token_refresh.attempt",i),o.debug(`Refreshing Service token (${n}, attempt ${i}/${e})`);let{token:t,refresh_in:s}=await so();return Z._t1=t,vo=void 0,$o&&void 0===yo&&(o.info("Token refresh recovered, resuming scheduled refresh"),No(s)),o.debug("Service token refreshed successfully"),Z.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Se.add(1,{reason:n,success:"true"}),Ue.record(performance.now()-a,{reason:n}),void We(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Bt&&(401===s.response.status||403===s.response.status))return void Co({span:r,error:s,reason:n,refreshStart:a,attempt:i});let l=i===e;if(o.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),Se.add(1,{reason:n,success:"false"}),l)return void Io({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(),xo=!1,wo=void 0}}),wo);async function Ro(){return!!Z._t1||!So()&&(void 0!==vo&&To&&await async function(){if(wo)return;let e=(await Oo().catch(()=>{}))?.trim();e&&e!==Z._t2?.trim()&&(Z._t2=e,o.info("Picked up re-authenticated Auth token from disk"),Z.showToken&&o.info("Auth token:",e))}(),await Po(3,250,"on-demand"),!!Z._t1)}function No(e){yo&&clearInterval(yo);let t=Math.max(1e3*(e-60),6e4);yo=setInterval(()=>{Po(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function qo(e){try{let t=await Oo();if(t&&!e?.force)return Z._t2=t,To=!0,Z.showToken&&o.info("Auth token:",t),void await jo();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=Z.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${ht}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:gt,scope:_t}),signal:e.signal});if(!t.ok)throw new Bt("Failed to get device code",t);return await t.json()}finally{clearTimeout(o)}}();o.debug("Device code response:",n),o.info(`Please enter the code "${n.user_code}" at ${n.verification_uri}`);try{m.writeSync(n.user_code),o.success("Code copied to clipboard — opening browser...")}catch{o.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,o=g.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",f(t,[e],()=>{})}catch{}}(n.verification_uri);let r=await async function(e){let t=1e3*(e.interval+1);o.debug(`Polling access token with interval of ${t}ms`),o.start("Waiting for authorization...");let n=Date.now(),r=1e3*e.expires_in;for(;;){if(Date.now()-n>=r)throw new _o("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=Z.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${ht}/login/oauth/access_token`,{method:"POST",headers:nt(),body:JSON.stringify({client_id:gt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await mo(t),o.error("Failed to poll access token:",await n.text());continue}let r=await n.json();if(o.debug("Polling access token response:",r),r.error){if("expired_token"===r.error)throw new _o("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new _o("Authorization was denied. Please run the command again and approve the request.");"authorization_pending"!==r.error&&"slow_down"!==r.error&&o.warn(`Unexpected auth error: ${r.error}`),await mo(t);continue}if(r.access_token)return r.access_token;await mo(t)}catch(e){if(e instanceof _o)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await mo(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(W.GITHUB_TOKEN_PATH,e,{mode:384}))(r),Z._t2=r,To=!0,Z.showToken&&o.info("Auth token:",r),await jo()}catch(e){throw e instanceof Bt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function jo(){let e=await lo();o.success(`Authenticated as ${e.login}`)}async function Do(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),Z.showToken=e.showToken,await V(),await qo({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 Mo=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})=>Do({verbose:e.verbose,showToken:e["show-token"]})}),Ho=.01,Fo=864e5,Bo=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Uo=new Intl.NumberFormat("en-US"),Lo=e=>Bo.format(e*Ho),zo=e=>e.credits_used??e.entitlement-e.remaining,Go=(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())/Fo;if(r<.5)return;let a=zo(e),i=a*Ho/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Ho,c=new Date(n.getTime()+l/i*Fo);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Jo=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Uo.format(zo(e))} of ${Uo.format(e.entitlement)} used`:"n/a",Ko=e=>e.padEnd(14),Wo=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Ko("AI credits")}unlimited`);else{let e=zo(o),t=o.percent_remaining;n.push(`${Ko("AI credits")}${Lo(e)} / ${Lo(o.entitlement)} ${t.toFixed(1)}% left`,`${Ko("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Ko("")}${Uo.format(e)} of ${Uo.format(o.entitlement)} credits`)}if(n.push("",`${Ko("Chat")}${Jo(e.quota_snapshots.chat)}`,`${Ko("Completions")}${Jo(e.quota_snapshots.completions)}`,"",`${Ko("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Fo)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=Go(o,e.quota_reset_date,t);r&&n.push(`${Ko("Burn rate")}~${Bo.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?`${Uo.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Ko("Overage")}${a}`)}return n.join("\n")},Vo=async()=>{let e=`${mt}/copilot_internal/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:ft(Z),signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get usage",t);return await t.json()}catch(e){throw Ve(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Yo=()=>g.stdout.write("[2J[H"),Xo=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Zo=async()=>{let e=await Vo();return Wo(e)},Qo=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 qo(),!e.watch){try{o.box(await Zo())}catch(e){o.error("Failed to fetch usage:",e),g.exit(1)}g.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?o.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&o.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),n=g.stdout.isTTY,r=()=>g.exit(0);for(g.on("SIGINT",r),g.on("SIGTERM",r);;){try{let e=await Zo();n&&Yo(),o.box(e),o.log(Xo(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),en=N(f);async function tn(){let e="win32"===g.platform?"where.exe":"which";try{return await en(e,["tailscale"]),!0}catch{return!1}}async function on(){try{let{stdout:e}=await en("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function nn(e){return e.replace(/\.$/,"")}async function rn(){let e=await on();if(e?.Online)return nn(e.DNSName)}const an=N(f),sn=e=>`[1m${e}[0m`,ln=e=>`[2m${e}[0m`,cn=e=>`[36m${e}[0m`,un=e=>`[32m${e}[0m`,pn=e=>`[31m${e}[0m`,dn=e=>`[33m${e}[0m`,mn=ln(" ─────────────────────────────────────────────────────────────"),fn=s.join(W.APP_DIR,"certs","tailscale"),hn=s.join(fn,"cert.pem"),gn=s.join(fn,"key.pem"),_n={certDir:fn,certPath:hn,keyPath:gn};function yn(){switch(g.platform){case"darwin":return[` ${ln("Install Tailscale for macOS:")}`,` ${cn("https://tailscale.com/download/mac")}`,` ${ln("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`,` ${ln("Then re-run this command.")}`].join("\n");case"linux":return[` ${ln("Install Tailscale for Linux:")}`,` ${cn("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${cn("sudo tailscale up")}`,` ${ln("or")} ${cn("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${ln("Install Tailscale for Windows:")}`,` ${cn("https://tailscale.com/download/windows")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${ln("Install Tailscale:")} ${cn("https://tailscale.com/download")}`}}function wn(){let e=[` ${pn("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${ln("Open the Tailscale app from Applications and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${ln("Open the Tailscale app and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/windows")}`):e.push(` ${ln("Connect with:")} ${cn("sudo tailscale up")}`),e.push("",` ${ln("Then re-run this command.")}`),e.join("\n")}async function kn(){try{return await a.access(hn),await a.access(gn),!0}catch{return!1}}function bn(e){console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Diagnostic")}`),console.log(mn),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?un("✅"):"missing"===n.status?pn("❌"):dn("❓");let r=n.detail?ln(` ${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(` ${un("All checks passed.")}`):console.log(` ${pn(`${t.length} issue(s).`)} Run ${cn("copilot-api cowork-setup install")} to fix.`),console.log("")}const vn={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},xn=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await tn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return bn(e),console.log(""),console.log(yn()),void console.log("");let o=await on();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},bn(e),console.log(wn()),void console.log("");let n=nn(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await kn();e["tailscale-cert"]=r?{status:"ok",detail:hn}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),bn(e)}(),g.exit(0)}}),$n=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Install")}`),console.log(mn),console.log(""),!await tn())return console.log(` ${pn("Tailscale is not installed.")}`),console.log(""),console.log(yn()),console.log(""),console.log(` ${ln("After installing, run")} ${cn("tailscale up")} ${ln("to connect, then re-run this command.")}`),void console.log("");let t=await on();if(!t||!t.Online)return console.log(wn()),void console.log("");let n=nn(t.DNSName);if(console.log(` ${ln("Tailscale hostname:")} ${sn(n)}`),console.log(""),console.log(` ${sn("Generating TLS certificate via Tailscale…")}`),console.log(` ${ln("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${cn(`$ tailscale cert --cert-file ${hn} --key-file ${gn} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(fn,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await an("tailscale",["cert","--cert-file",hn,"--key-file",gn,n]),console.log(` ${un("✓ Certificate generated")}`)}catch(e){let t=e instanceof Error?e.message:String(e);return void o.error(`Failed to generate cert: ${t}`)}console.log(""),console.log(mn),console.log(` ${sn("Next steps")}`),console.log(mn),console.log(""),console.log(` ${sn("1.")} Start the proxy:`),console.log(` ${cn("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${sn("2.")} In Cowork ${ln("→")} Settings ${ln("→")} Inference Provider, set:`),console.log(` ${sn("inferenceGatewayBaseUrl")} = ${cn(`https://${n}:<port>`)}`),console.log(` ${ln("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${sn("3.")} Restart Cowork ${ln("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${ln("For Cowork's own configuration docs, see:")}`),console.log(` ${cn("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),Tn=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Revert")}`),console.log(mn),console.log(""),!await kn())return console.log(` ${ln("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${sn("Remove Tailscale cert files:")}`),console.log(` ${ln(hn)}`),console.log(` ${ln(gn)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(fn,{recursive:!0}),console.log(` ${un("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${ln("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),An=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:xn,install:$n,revert:Tn}}),Sn=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function En(e){if(!Sn.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 On(e){return"string"==typeof e?En(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=On(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?On(a):a;!t&&(i!==a||"__proto__"===r)&&(t=Cn({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=Cn({},o,o.length),t.properties={}),t??e}(e):e}function Cn(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const In="x-copilot-api-self-test",Pn=R();const Rn=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Nn(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 qn(e){try{!function(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),a=t.res.status,i=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",a),n.setAttribute("copilot_api.model",i),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();Ze.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:c.ERROR,message:`HTTP ${a}`})}(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:a,requestId:i}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:a};if(we.add(1,d),De.record(s,d),c>=400&&ke.add(1,{method:n,path:r,status_code:String(c),error_type:c>=500?"server_error":"client_error"}),l?.tokenUsage){let e=l.tokenUsage,t={model:u,endpoint_type:a};e.inputTokens&&(be.add(e.inputTokens,t),ze.record(e.inputTokens,t)),e.outputTokens&&(ve.add(e.outputTokens,t),Ge.record(e.outputTokens,t)),e.cachedTokens&&xe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ue.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const jn=1048576;const Dn=async()=>ge.startActiveSpan("copilot_api.approval.await",async e=>{let t=performance.now();try{let n=await o.prompt("Accept incoming request?",{type:"confirm"}),r=performance.now()-t;if(e.setAttribute("copilot_api.approval.wait_duration_ms",r),Ke.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Re.add(1,{result:"rejected"}),new Bt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Re.add(1,{result:"approved"})}finally{e.end()}});async function Mn(e){if(Z._t1||await Ro())return null;let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Eo()}`,type:"authentication_error"}},401)):(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function Hn(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 Fn(e,t){void 0!==t.prompt_tokens&&e.setAttribute("copilot_api.input_tokens",t.prompt_tokens),void 0!==t.completion_tokens&&e.setAttribute("copilot_api.output_tokens",t.completion_tokens),void 0!==t.total_tokens&&e.setAttribute("copilot_api.total_tokens",t.total_tokens)}const Bn=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],Un="claude-haiku-4.5",Ln={haiku:Un,"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 zn(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 Bn)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=Ln[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 Gn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Jn(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=Gn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=Gn.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var Kn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Wn(e){if(!e||"string"!=typeof e)throw new Kn("Model name is required and must be a string");if(!Z.models?.data)throw new Kn("Models not available. Please try again later.",503);let t=Z.models.data.map(e=>e.id);if(t.includes(e))return e;let o=zn(e,t);if(!o)throw Te.add(1,{requested_model:e}),new Kn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Vn(e){let t=Z.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e)}async function Yn(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return ge.startActiveSpan("copilot_api.rate_limit.check",async n=>{try{let r=Date.now();if(n.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let a=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute("copilot_api.rate_limit.elapsed_seconds",a),a>t)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let i=Math.ceil(t-a);if(n.setAttribute("copilot_api.rate_limit.wait_seconds",i),!e.rateLimitWait)throw n.setAttribute("copilot_api.rate_limit.action","rejected"),$e.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Bt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),$e.add(1,{action:"waited",source:"local"}),Fe.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await mo(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Xn=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Zn(e){if(e instanceof Xn)return{type:e.type,message:e.message};if(e instanceof Bt){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 Qn(e,t){let{type:n,message:r}=Zn(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 er(e,t){let{type:n,message:r}=Zn(t);try{await e.writeSSE({event:"error",data:JSON.stringify({error:{message:r,type:n}})})}catch(e){o.debug("Failed to emit OpenAI stream error frame:",e)}}function tr(e){if("number"==typeof e){if(!Number.isFinite(e))return null;let t=Math.floor(e);return t>0?t:null}if("string"==typeof e){let t=e.trim();if(!t)return null;let o=Number(t);if(!Number.isFinite(o))return null;let n=Math.floor(o);return n>0?n:null}return null}function or(e,t,o){return Math.min(Math.max(e,t),o)}function nr(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 nr(JSON.parse(r),t+1)}catch{return null}}function rr(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=tr(o.capabilities.supports.min_thinking_budget),r=tr(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:tr(o.capabilities.limits?.max_output_tokens)??void 0}}function ar(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=or(tr(e.requestedBudget)??o,o,n),a=tr(e.maxTokens);if(a||=r+1,t.maxOutputTokens&&a>t.maxOutputTokens&&(a=t.maxOutputTokens),a<=r){let e=Math.min(r,a-1);if(e>=o)r=e;else{let e=o+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:a};a=e,r=o}}return a<=r?{thinkingBudget:null,maxTokens:a}:{thinkingBudget:r,maxTokens:a}}function ir(e,t){if(fo(e.thinking_budget))return e;let o=rr(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=ar({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 sr(e){return"invalid_thinking_budget"===nr(e)}async function lr(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(fo(t.thinking_budget)||!(o instanceof Error))return null;let a,i,s=o;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==r)a=r;else try{a=await s.response.clone().text()}catch{return null}try{i=JSON.parse(a)}catch{return null}if(!sr(i))return null;let l=rr(n,t.model);return l?function(e,t){let o=ar({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:t});if(null===o.thinkingBudget)return{...e,max_tokens:o.maxTokens,thinking_budget:void 0};let n=o.thinkingBudget,r=tr(e.thinking_budget);if(r&&r===o.thinkingBudget){let e=n+1;e<=t.bounds.max&&(!o.maxTokens||e<o.maxTokens)&&(n=e)}let a=o.maxTokens;if((!a||a<=n)&&(a=n+1),t.maxOutputTokens&&a>t.maxOutputTokens){if(!(t.maxOutputTokens>n))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};a=t.maxOutputTokens}return{...e,max_tokens:a,thinking_budget:n}}(t,l):{...t,thinking_budget:void 0}}function cr(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 ur(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const pr=new Map,dr=new Map,mr=new Set;let fr,hr,gr;function _r(e){return!e.closed&&!e.destroyed}function yr(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new O(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return pr.set(t,Date.now()),qe.add(1,{event:"created",origin:e}),We(_.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{o.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{o.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(n,r,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=mr.has(t);qe.add(1,{event:"goaway",origin:e}),We(i?_.WARN:_.DEBUG,i?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),dr.delete(t),mr.delete(t),pr.delete(t),_r(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function wr(e,t){if(!Z.connectivity.h2)return;if(fr&&fr!==e&&function(){for(let e of[...dr.keys(),...mr])_r(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});dr.clear(),mr.clear(),pr.clear()}(),fr=e,t?.fresh){let t=yr(e);return mr.add(t),t}let n=Date.now();for(let[t]of dr)if(n-(pr.get(t)??0)>=6e5)dr.delete(t),pr.delete(t),_r(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),qe.add(1,{event:"rotated",origin:e}),We(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(_r(t))return dr.delete(t),mr.add(t),t;dr.delete(t),pr.delete(t)}let r=yr(e);return mr.add(r),r}function kr(e){e&&mr.delete(e)&&(_r(e)?dr.set(e,Date.now()):pr.delete(e))}function br(){gr||(gr=setInterval(()=>{!function(){let e=Date.now(),t=Z.connectivity.h2Keepalive,n=dr.size;for(let[r,a]of dr)e-a<6e4||t&&n<=1||(dr.delete(r),pr.delete(r),n--,_r(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),qe.add(1,{event:"idle_reaped",origin:fr??""}),We(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${fr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":fr??""}))}()},3e4),gr.unref())}function vr(){hr||(o.debug("Starting HTTP/2 keepalive (every 45s)"),hr=setInterval(()=>{(async function(){if(0===dr.size&&0===mr.size){if(fr){let e=yr(fr);dr.set(e,Date.now())}return}let e=[...dr.keys()];for(let t of e)dr.delete(t);await Promise.allSettled(e.map(async e=>{if(_r(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:ut(Z)});await n.dump(),Ne.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),dr.set(e,Date.now())}catch(t){Ne.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),qe.add(1,{event:"error",origin:fr??""}),pr.delete(e),_r(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else pr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),hr.unref(),br())}function xr(e){return e.max_completion_tokens??e.max_tokens}async function $r(e,t,o){try{if(!e.ok)throw new Bt("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&&Fn(t,n.usage),n}catch(e){throw Ve(t,e),e}finally{t.end()}}const Tr=async e=>{let t=On(e);try{return await Ar(t)}catch(e){if(e instanceof Bt&&401===e.response.status)return await uo(),Ar(t);let n;if(e instanceof Bt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await lr({payload:t,error:e,models:Z.models,errorBodyText:n});if(r)return e instanceof Bt&&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 Ar(On(r));throw e}},Ar=async e=>{if(!Z._t1)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={...ut(Z,t),"X-Initiator":o?"agent":"user"},r=ct(Z),a=`${r}/chat/completions`,i=Z.timeoutMs,s=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=xr(e);return null==i?a:{...a,max_completion_tokens:i}}(e,Z.models),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":xr(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=wr(r,{fresh:t>0}),s=new AbortController,u=Lt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await tt({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}),m=new Response(p,{status:r,headers:u});if(e.stream){if(!m.ok)throw d.end(),new Bt("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:M(m),span:d,release:()=>kr(o)}}try{return await $r(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{kr(o)}}catch(e){if(kr(o),await Ft(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Sr(e,t,o){try{if(!e.ok)throw new Bt("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&&Fn(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Ve(t,e),e}finally{t.end()}}const Er=async e=>{try{return await Or(e)}catch(t){if(t instanceof Bt&&401===t.response.status)return await uo(),Or(e);throw t}},Or=async e=>{if(!Z._t1)throw Error("Service token not found");let t=On(e),o={...ut(Z),"X-Initiator":"agent"},n=ct(Z),r=`${n}/responses`,a=Z.timeoutMs,i=JSON.stringify(t),s={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":a,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let l=wr(n,{fresh:e>0}),c=new AbortController,u=Lt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await tt({spanName:"copilot POST /responses",url:r,target:"responses",headers:o,body:i,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...s,"copilot_api.h2.retry_attempt":e},dispatcher:l}),m=new Response(p,{status:n,headers:u});if(t.stream){if(!m.ok)throw d.end(),new Bt("Failed to create responses",m,{outgoingBody:i,outgoingHeaders:o});return{events:M(m),span:d,release:()=>kr(l)}}try{return await Sr(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{kr(l)}}catch(t){if(kr(l),await Ft(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Cr=e=>Object.hasOwn(e,"output");function Ir(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}:null}var Pr=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const Rr=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 Nr(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Pr(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Pr(`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=>jr(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=Dr(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=jr(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:jr(o.content)})}return t}(e.messages);if(0===o.length)throw new Pr("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),qr(e.temperature)&&(n.temperature=e.temperature),qr(e.top_p)&&(n.top_p=e.top_p),qr(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),qr(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 qr(e){return null!=e}function jr(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Dr(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 Pr(`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 Mr(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 Hr(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 Fr(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 Br(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Ur(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Br(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Fr(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),[Fr(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Lr(e,t){let o=[Fr(e,{},Hr(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=Mr(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function zr(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:[Fr(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Ur(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Br(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Fr(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Lr(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 Gr="openai_responses";function Jr(e){let t=performance.now(),n=ge.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),Nr(e)}finally{t.end()}});Be.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!Rr.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 Kr(e){let t=performance.now(),o=ge.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",o=!1,n=[];for(let r of e.output)if("message"===r.type)for(let e of r.content)"output_text"===e.type?(t+=e.text,o=!0):"refusal"===e.type&&(t+=e.refusal,o=!0);else"function_call"===r.type&&n.push({id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments}});let r={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:o?t:null,...n.length>0&&{tool_calls:n}},logprobs:null,finish_reason:Hr(e,n.length>0)}]};return e.usage&&(r.usage=Mr(e.usage)),r}(e)}finally{t.end()}});return Be.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Wr(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=Mr(t.usage);a.tokenUsage=Hn(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(Kr(t))}async function Vr(e,t,n){let r;try{r=Jr(t)}catch(t){if(t instanceof Pr)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),Z.manualApprove&&!n.isSelfTest&&await Dn();let a=await Mn(e);if(a)return a;let i=performance.now(),s=await Er(r),l=performance.now()-i;if(Me.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Cr(s))return Wr(e,s,l);let{events:c,span:u,release:p}=s,m=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return D(e,async t=>{let n=null,a=0,s=performance.now(),d=cr(e,i);try{try{for await(let i of c){if(d(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Pe.add(1,{model:r.model,endpoint_type:Gr});let c=Ir(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Hn(c),t._d1=l,e.set("requestData",t)}let u=zr(s,m);if(u.error)throw new Xn(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:Gr};He.record(performance.now()-s,u),Je.record(a,u),ur(e,i)}catch(o){throw Ye(u,e.get("requestSpan"),o),await er(t,o),o}finally{n&&Fn(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Yr(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 Xr(e){let t=!0===e.get("isSelfTest");t||await Yn(Z);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return ge.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Wn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}(n)}catch(t){if(t instanceof Kn)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(Vn(n.model))return Vr(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),Z.manualApprove&&!t&&await Dn(),n=function(e){if(!fo(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!fo(e.max_tokens))return e;let t=(Z.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return o.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(n),n=ir(n,Z.models),fo(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Mn(e);if(r)return r;let a=performance.now(),i=await Tr(n),s=performance.now()-a;if(Me.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Zr(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Hn(i.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return D(e,async t=>{let o={value:null},r=0,i=performance.now(),p=cr(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Pe.add(1,{model:n.model,endpoint_type:"openai"}),i=Yr(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Hn(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(He.record(c,u),Je.record(r,u),ur(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Hn(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw Ye(c,e.get("requestSpan"),o),await er(t,o),o}finally{o.value&&Fn(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ue.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Zr=e=>Object.hasOwn(e,"choices"),Qr=new q;Qr.post("/",async e=>{try{return await Xr(e)}catch(t){return await io(e,t)}});const ea=new q;ea.post("/",async e=>{try{let t=await e.req.json();try{t.model=Wn(t.model)}catch(t){if(t instanceof Kn)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=await Mn(e);if(o)return o;let n=performance.now(),r=await(async e=>{if(!Z._t1)throw Error("Service token not found");let t=`${ct(Z)}/embeddings`,o=ut(Z),n=Z.timeoutMs,r=new AbortController,a=Lt(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await et({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1}});try{if(!n.ok)throw new Bt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Ve(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),a=performance.now()-n;Me.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Hn(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await io(e,t)}});const ta=new q;let oa=null,na=null;function ra(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function aa(e){return!ra(e)}ta.get("/",async e=>{let t,o=function(){let e=Z._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let o=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),n=JSON.parse(atob(o)),r="object"==typeof n&&n&&"exp"in n&&"number"==typeof n.exp?n.exp:void 0;return void 0!==r&&1e3*r<Date.now()?"expired":"valid"}catch{return"expired"}}(),n=await async function(){let e=Date.now(),t=oa;return t&&e-t.timestamp<3e4?{result:t.result}:na||(na=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${ct(Z)}/models`,n=await fetch(t,{method:"GET",headers:ut(Z),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return oa={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return oa={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),na=null}})(),na)}();t="valid"===o&&"reachable"===n.result?"ok":"valid"!==o&&"reachable"!==n.result?"unhealthy":"degraded";let r={status:t,copilot_token:o,upstream:n.result,version:"0.43.1-preview.2",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 ia=new H(B),sa={...F["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function la(e){try{return ia.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function ca(e){let t=0;for(let o of e)switch(o.type){case"text":t+=la(o.text)*sa.contentMultiplier;break;case"tool_use":t+=la(o.name+JSON.stringify(o.input))*sa.contentMultiplier;break;case"tool_result":o.content&&(t+=la("string"==typeof o.content?o.content:JSON.stringify(o.content))*sa.contentMultiplier);break;case"thinking":t+=la(o.thinking)*sa.contentMultiplier;break;case"image":t+=1600}return t}function ua(e){let t=0,o=e.properties;if(!o)return t;let n=Object.entries(o);for(let[e,[o,r]]of n.entries()){if(t+=0===e?sa.perFirstProp:sa.perAdditionalProp,t+=la(o),r.description&&(t+=sa.perPropDesc+la(r.description)),r.enum&&Array.isArray(r.enum)){t+=sa.perEnum;for(let e of r.enum)t+=la(String(e))}if("object"===r.type&&r.properties&&(t+=sa.perNestedObject,t+=ua(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=sa.perArrayOfObjects,t+=ua(e))}}return t}function pa(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 da(e,t,o){let n=pa(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const ma=async(e,t,n)=>{try{return await fa(e,t)}catch(r){if(r instanceof Bt&&401===r.response.status)return await uo(),fa(e,t);if(r instanceof Bt&&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}`),fa(i,t)}throw r}};const fa=async(e,t)=>{if(!Z._t1)throw Error("Service token not found");let{metadata:o,...n}=On(e),r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...dt(Z,t,r),"X-Initiator":"agent"},i=ct(Z),s=`${i}/v1/messages`,l=Z.timeoutMs,c=JSON.stringify(n),u=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",...pa(e,t?.anthropicBeta)}}(n,t,l);for(let e=0;e<=1;e++){let t=wr(i,{fresh:e>0}),r=new AbortController,p=Lt(r,l);try{let{statusCode:o,headers:i,body:p,span:d}=await tt({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:a,body:c,signal:r.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(p,{status:o,headers:i});if(!m.ok)throw d.end(),new Bt("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:a});if(n.stream)return{events:M(m),span:d,release:()=>kr(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&&Fn(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(),kr(t)}}catch(o){if(kr(t),await Ft(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ha=new Set(["low","medium","high","max","xhigh"]);function ga(e,t,n){let r=t.includes(e.model)?e.model:zn(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=zn(e,t);if(!n)return null;let r=new Set(t);if(o.context1m){let e=function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,r);if(e)return e}if(o.effort){let e=function(e,t,o){let n=null;if("high"===o?n="high":("max"===o||"xhigh"===o)&&(n="xhigh"),!n)return null;let r=`${e}-${n}`;return t.has(r)?r:null}(n,r,o.effort);if(e)return e}return null}(a.model,t,{context1m:n.context1m,effort:a.output_config?.effort}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=d.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",a.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),s={...a,model:i}}return function(e){let t=e.output_config?.effort;if(!t)return e;let n=Z.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Jn(t,n);if(!r||!ha.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=d.getActiveSpan();return i?.setAttribute("copilot_api.effort.requested",t),i?.setAttribute("copilot_api.effort.clamped_to",a),{...e,output_config:{...e.output_config,effort:a}}}(s)}const _a=e=>"object"==typeof e&&!!e&&!Array.isArray(e),ya=["properties","patternProperties","$defs","definitions"],wa=["items","additionalProperties","propertyNames","contains","not","if","then","else"],ka=["anyOf","allOf","oneOf","prefixItems"];function ba(e,t){let o={...e};for(let e of ya){let n=o[e];_a(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,_a(o)?ba(o,t):o])))}for(let e of wa){let n=o[e];_a(n)&&(o[e]=ba(n,t))}for(let e of ka){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>_a(e)?ba(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?e.prefixItems:[];delete e.prefixItems,(_a(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.some(e=>!0===e||_a(e)&&0===Object.keys(e).length),n=t.filter(e=>_a(e));if(o||0===n.length)return;let r=[...new Map(n.map(e=>[JSON.stringify(e),e]))].map(([,e])=>e);e.items=1===r.length?r[0]:{anyOf:r}}(o)),o}function va(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=xa(n);e&&o.push(e);break}case"user":case"assistant":t.push(n)}return{conversation:t,systemTexts:o}}function xa(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 $a(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>function(e){return e.replace(/^x-_an1-billing-header:[^\n]*\n*/,"")}(e)).filter(Boolean).join("\n\n")}const Ta=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),Aa=new Set(["text","image"]);function Sa(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);Aa.has(e)||t.add(`block:tool_result:${e}`)}}const Ea=new Set;function Oa(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=Ta.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&&Sa(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(Ea.size>=100)break;Ea.has(o)||(Ea.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(", ")}`)}function Ca(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Ia(e,t){let o={model:e.model,messages:Pa(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:ja(e.tools,e.model),tool_choice:Da(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=rr(t,o.model);if(r){let a="enabled"===n.type&&"number"==typeof n.budget_tokens?n.budget_tokens:function(e,t,o){let n=function(e,t){return"max"===e||"xhigh"===e?t:"high"===e?16e3:"medium"===e?8e3:1024}(e,o.max),r=tr(t),a=r&&r>1?r-1:o.min;return or(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=ir({...o,thinking_budget:a},t)}}return o}function Pa(e,t){let{conversation:o,systemTexts:n}=va(e),r=function(e,t){let o=$a(e,t);return o?[{role:"system",content:o}]:[]}(t,n),a=o.flatMap(e=>"user"===e.role?function(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:qa(e.content)});n.length>0&&t.push({role:"user",content:qa(n)})}else t.push({role:"user",content:qa(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:Na(e.reasoning_text),reasoning_opaque:Na(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:qa(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:qa(e.content),...t}]}(e));return[...r,...a]}const Ra=32768;function Na(e){if("string"==typeof e)return e.length<=Ra?e:e.slice(0,Ra)}function qa(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 ja(e,t){if(!e)return;let o=e.filter(aa),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:ba(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)r.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return r.size>0&&d.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function Da(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 Ma(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 Ha(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Fa(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 Ba=new Set(["low","medium","high","max","xhigh"]);function Ua(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&&Ba.has(e)?e:null)(Jn(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 La(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 za=/[^\w-]/g;function Ga(e){return e.replaceAll(za,"_")}function Ja(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=Ua(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:La(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:Ga(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Ga(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Ka(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 Wa(e,t,o=400){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function Va(e,t){return ge.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),da(n,t,e.req.header("anthropic-beta"));let r=Wn(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Ka(t);return a?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}):r===t.model?(n.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(n.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:t.model,to_model:r}),o.debug(`Model mapping: '${t.model}' → '${r}'`),{ok:!0,payload:{...t,model:r}})}catch(t){if(t instanceof Kn)return{ok:!1,response:Wa(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function Ya(e){let{conversation:t,systemTexts:o}=va(e.messages),n=function(e){let t=[];for(let o of e)"user"===o.role?t.push(...Za(o)):t.push(...ei(o));return t}(t);if(0===n.length)throw new Bt("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 r={model:e.model,input:n,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)},a=function(e,t){return $a(e,t)||null}(e.system,o);return a&&(r.instructions=a),e.tools?.length&&(r.tools=e.tools.filter(aa).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(r.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)),"adaptive"===e.thinking?.type?r.reasoning={effort:Xa(e.output_config?.effort??"high")}:"enabled"===e.thinking?.type&&e.thinking.budget_tokens&&(r.reasoning=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens)),r}function Xa(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Za(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(Qa(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 Qa(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 ei(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 ti(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 oi(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function ni(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 ri(e,t){let o=[];switch(e.type){case"response.created":ni(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){ni(t,o),oi(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":ni(t,o),oi(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":oi(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":{oi(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:ti(e.response.status,n),stop_sequence:null},usage:{input_tokens:r?.input_tokens??0,output_tokens:r?.output_tokens??0}},{type:"message_stop"});break}case"response.incomplete":{ni(t,o),oi(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:{input_tokens:n?.input_tokens??0,output_tokens:n?.output_tokens??0}},{type:"message_stop"});break}case"response.failed":ni(t,o),oi(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":ni(t,o),oi(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":ni(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 ai(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 ii(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function si(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&&(ai(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&&(ai(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),ii(t,o)),r.content&&(ii(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){ii(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&&(ii(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Ca(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 li=/structured_outputs|output_config\.format/i;function ci(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&li.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Ja({...e,model:Un},o):null}var ui=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var pi=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const di={tavily:async function(e,t,n){let r=function(e,t){let o={query:e,max_results:t?.maxResults??5};return t?.includeDomains?.length&&(o.include_domains=t.includeDomains),t?.excludeDomains?.length&&(o.exclude_domains=t.excludeDomains),o}(t,n);o.debug("Tavily search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await et({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("tavily.results_count",e.results.length),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw Ve(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new pi:e}finally{clearTimeout(i)}},exa:async function(e,t,n){let r=function(e,t){let o={query:e,numResults:t?.maxResults??5,contents:{text:!0}};return t?.includeDomains?.length&&(o.includeDomains=t.includeDomains),t?.excludeDomains?.length&&(o.excludeDomains=t.excludeDomains),o}(t,n);o.debug("Exa search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await et({spanName:"exa POST /search",url:"https://api.exa.ai/search",target:"exa_search",method:"POST",headers:{"Content-Type":"application/json","x-api-key":e},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"exa.max_results":n?.maxResults??5,"exa.has_include_domains":!!n?.includeDomains?.length,"exa.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("exa.results_count",e.results.length),o.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw Ve(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new ui:e}finally{clearTimeout(i)}}},mi=["tavily","exa"];function fi(e){return"tavily"===e||"exa"===e}function hi(){return Z.webSearchProviders.length>0}async function gi(e,t){return async function(e,t,n){let{providers:r,searchFns:a=di}=n;if(0===r.length)throw Error("No web search provider configured");let i,s=[];for(let[n,l]of r.entries())try{let n=await a[l.name](l.key,e,t);return s.length>0&&o.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),n}catch(e){i=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);n!==r.length-1&&o.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${r[n+1].name}".`)}let l=i instanceof Error?i.message:String(i);throw o.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),i instanceof Error?i:Error("All web search providers failed")}(e,t,{providers:Z.webSearchProviders})}function _i(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function yi(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 wi(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return t&&ra(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!hi())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await gi(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_${_i()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...yi(n,e)}];return{id:`msg_ws_${_i()}`,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_${_i()}`,r=`msg_ws_${_i()}`,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:yi(n,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),D(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const ki=(e,t)=>!(!e||!t||e===t);async function bi(e){if(Z._t1||await Ro())return null;let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Eo()}`}},401)):(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function vi(e,t){let o=t.model;return o&&"string"==typeof o?null:Wa(e,"Model name is required and must be a string")}async function xi(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&ra(t[0])}(t))return vi(e,t)??wi(e,t);await Yn(Z),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=vi(e,t);if(a)return a;t=function(e,t){return ga(t,Z.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Va(e,t);if(!i.ok)return i.response;t=i.payload;let s=await bi(e);if(s)return s;if(Vn(t.model))return Si(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t,o){let n=Ja(t,Z.models),r={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},a=n.output_config?.effort;return e.set("requestData",{model:n.model,reasoningEffort:a,effortClamped:ki(o,a),streaming:!!n.stream}),Z.manualApprove&&await Dn(),ge.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",n.model),t.setAttribute("copilot_api.streaming",!!n.stream),da(t,n,r.anthropicBeta);try{let o=performance.now(),a=await ma(n,r,{onStructuredOutputFallback:(e,o)=>{let n=ci(e,o,Z.models);return n&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",n.model)),n}}),i=performance.now()-o;if(Me.record(i,{model:n.model,target:"anthropic_messages",streaming:String(!!n.stream)}),!n.stream){let o=a,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=Hn(Ti(t)),o._d1=i,o.upstreamTtfbMs=i,o.upstreamTotalMs=i,e.set("requestData",o)}return t.end(),e.json(o)}let{events:s,span:l,release:c}=a;return D(e,async r=>{let a=0,i=performance.now(),u={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=cr(e,o);try{try{for await(let e of s)d(),e.data&&"[DONE]"!==e.data?(a++,Pe.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),Ai(e.data,u)&&(p=!0),await r.writeSSE(e)):await r.writeSSE(e);let e=performance.now()-i,t={model:n.model,endpoint_type:"anthropic_messages"};He.record(e,t),Je.record(a,t)}catch(t){throw Ye(l,e.get("requestSpan"),t),await Qn(r,t),t}finally{if(ur(e,o),p){let t=Ti(u);Fn(l,t);let o=e.get("requestData")||{};o.tokenUsage=Hn(t),e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&ue.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Ve(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=ge.startActiveSpan("copilot_api.translate.anthropic_to_openai",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),o.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),o.setAttribute("copilot_api.translation.has_system",!!t.system),o.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let n=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)),r=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));return o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),Oa(o,t.messages),Ia(t,Z.models)}finally{o.end()}});Be.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=ir(c,Z.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:ki(r,u),streaming:!!c.stream});let p=performance.now();Z.manualApprove&&await Dn();let d=await Tr(c),m=performance.now()-p;if(Me.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),$i(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=Hn(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=ge.startActiveSpan("copilot_api.translate.openai_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","openai_to_anthropic");let t=function(e){let t=[],o=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let a of e.choices){let e=Ha(a.message),i=Ma(a.message.content),s=Fa(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:Ca(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 Be.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}o.debug("Streaming response from service");let{events:f,span:h,release:g}=d;return D(e,async t=>{let n=null,r=0,a=performance.now(),i=cr(e,p),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of f){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let l;try{l=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,Pe.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=Hn(n),t._d1=m,e.set("requestData",t)}let u=si(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(He.record(l,u),Je.record(r,u),ur(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Hn(n),t._d1=m,e.set("requestData",t))}}catch(o){throw Ye(h,e.get("requestSpan"),o),await Qn(t,o),o}finally{n&&Fn(h,n),h.end(),g()}let l=e.get("requestId");l&&ue.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const $i=e=>Object.hasOwn(e,"choices");function Ti(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 Ai(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 Si(e,t){let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.anthropic_to_responses",e=>{try{return e.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),e.setAttribute("copilot_api.translation.message_count",t.messages.length),Oa(e,t.messages),Ya(t)}finally{e.end()}});Be.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),Z.manualApprove&&await Dn();let i=performance.now(),s=await Er(a),l=performance.now()-i;if(Me.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Cr(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Hn({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens})),t._d1=l,t.upstreamTtfbMs=l,t.upstreamTotalMs=l,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(s).slice(-400)),"failed"===s.status)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:s.error?.code??"api_error",message:s.error?.message??"Response generation failed"}},500);let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:ti(e.status,o),stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}(s)}finally{e.end()}});return Be.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return D(e,async t=>{let n=null,r=0,s=performance.now(),d=cr(e,i),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let i of c){if(d(),o.debug("Responses API raw stream event:",i),!i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}r++,Pe.add(1,{model:a.model,endpoint_type:"responses"});let c=Ir(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Hn(n),t._d1=l,e.set("requestData",t)}let u=ri(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"};He.record(u,p),Je.record(r,p),ur(e,i)}catch(o){throw Ye(u,e.get("requestSpan"),o),await Qn(t,o),o}finally{n&&Fn(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const Ei=new q;Ei.post("/",async e=>{try{return await xi(e)}catch(t){return await io(e,t)}});const Oi=new q;function Ci(e){return ge.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Wn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function Ii(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=Hn(o),n._d1=t._d1,t.c.set("requestData",n)}Oi.get("/",async e=>{try{Z.models||await ho();let t=Z.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await io(e,t)}});const Pi=new Set(["message","function_call","function_call_output"]),Ri=new Set(["type","name","description","parameters"]);async function Ni(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||!hi())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await gi(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function qi(e){if(hi())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Ni(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function ji(e){if(!hi())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 Ni(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Di(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 Pi.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Mi(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 Hi(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&&Mi(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)Mi(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Fi(e){return null!=e}function Bi(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Ui(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Li(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(!Bi(n)){o.push(n);continue}let e=Di(n);null===e?t.add(Ui(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"])Fi(e[o])&&(t[o]=e[o]);let r=new Set;if(Fi(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))Ri.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(Fi(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Fi(o.effort)&&(t.reasoning.effort=o.effort),Fi(o.summary)&&(t.reasoning.summary=o.summary)}if(Fi(e.text)&&"object"==typeof e.text){let o=e.text;Fi(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function zi(e,t){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Gi(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=d.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||Fi(n.previous_response_id)||Fi(n.prompt)||Fi(n.conversation)?null:zi(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 Ji(e){await Yn(Z);let t=await e.req.json();if(!Bi(t))return zi(e,"request body must be a JSON object");let n=Li(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:Ci(t)}}catch(t){if(t instanceof Kn)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=Gi(e,t.input,n);if(s)return s;let l=await Mn(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),Z.manualApprove&&await Dn();let c=performance.now(),u=await Er(a),p=performance.now()-c;if(Me.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Ki(u))return async function(e,t,o){await qi(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Hn({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return D(e,async t=>{let o={value:null},n=0,i=performance.now(),s=cr(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Hi(i.data,r);s=await ji(s);let l=s===i.data?i:{...i,data:s};Pe.add(1,{model:a.model,endpoint_type:"responses"}),Ii(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"};He.record(l,u),Je.record(n,u),ur(e,c)}catch(o){throw Ye(m,e.get("requestSpan"),o),await er(t,o),o}finally{o.value&&Fn(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ue.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Ki=e=>Object.hasOwn(e,"output"),Wi=new q;Wi.post("/",async e=>{try{return await Ji(e)}catch(t){return await io(e,t)}});const Vi=new q;Vi.get("/",e=>{try{return Z.showToken?e.json({token:Z._t1}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return o.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const Yi=new q;Yi.get("/",async e=>{try{let t=await Vo();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Xi=new q;function Zi(){return function(e){let t=e.filter(e=>Nn(e));if(0===t.length)return;let o=t.find(e=>Rn.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(Z.models?.data??[])}function Qi(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 En(o).slice(0,200)}catch{}let t=En(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 es(e={}){let t=performance.now(),o=e.model&&function(e){let t=Z.models?.data.find(t=>t.id===e);return void 0!==t&&Nn(t)}(e.model)?e.model:Zi();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 Xi.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[In]:Pn},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:Qi(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)}}Xi.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=yt(i),p=function(e){return e===Pn}(e.req.header(In));e.set("requestId",r),e.set("isSelfTest",p),e.header("x-request-id",r);let m=ge.startSpan("copilot_api.handle_request",{kind:l.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",m),e.set("requestTraceContext",m.spanContext()),p&&m.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Ze.has(e)||"x-copilot-api-self-test"!==e&&m.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=await e.req.raw.clone().text();e.set("rawBody",t.length>jn?t.slice(0,jn):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let f,h=new Promise(e=>{f=e});e.set("streamComplete",h),e.set("resolveStreamComplete",f);let g=d.setSpan(u.active(),m);await u.with(g,async()=>{p||ue.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw m.setStatus({code:c.ERROR,message:t.message}),m.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:m};_?.streaming&&e.res.status<400?h.then(()=>qn(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{m.recordException(t),m.setStatus({code:c.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{m.end()}catch{}}):qn(y)}),Xi.use(j()),Xi.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()}),Xi.get("/",e=>e.text("Server running")),Xi.route("/health",ta),Xi.route("/chat/completions",Qr),Xi.route("/models",Oi),Xi.route("/embeddings",ea),Xi.route("/usage",Yi),Xi.route("/token",Vi),Xi.route("/v1/chat/completions",Qr),Xi.route("/v1/models",Oi),Xi.route("/v1/embeddings",ea),Xi.route("/v1/messages",Ei),Xi.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=sa.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=sa.perMessage+la(e)*sa.contentMultiplier}for(let e of t.messages)o+=sa.perMessage,o+=la(e.role),"string"==typeof e.content?o+=la(e.content)*sa.contentMultiplier:Array.isArray(e.content)&&(o+=ca(e.content));let n=t.tools?.filter(aa);return n&&n.length>0&&(o+=function(e){let t=sa.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=sa.perTool),t+=la(n.name),n.description&&(t+=sa.perDesc+la(n.description)),t+=ua(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),Xi.route("/v1/responses",Wi),Xi.route("/responses",Wi),Xi.onError((e,t)=>io(t,e));const ts=e=>`[1m${e}[0m`,os=e=>`[2m${e}[0m`,ns=e=>`[32m${e}[0m`,rs=e=>`[31m${e}[0m`,as=e=>`[33m${e}[0m`,is=os(" ─────────────────────────────────────────────────────────────");function ss(e,t,o){console.log(` ${function(e){return"ok"===e?ns("✓"):"warn"===e?as("⚠"):rs("✗")}(e)} ${ts(t.padEnd(14))} ${o}`)}function ls(e){console.log(` ${os("↳")} ${os(e)}`)}function cs(e){return e instanceof Bt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function us(){let e=g.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await a.readFile(W.GITHUB_TOKEN_PATH,"utf8")).trim();return e.length>0?e:void 0}catch{return}}();return t?{token:t,source:"stored file"}:void 0}async function ps(){try{await ho();let e=(Z.models?.data.length??0)>0;return ss(e?"ok":"warn","Model catalog",e?function(){let e=Z.models?.data??[],t={Claude:0,OpenAI:0,Gemini:0,Embedding:0};for(let o of e)o.id.startsWith("text-embedding")?t.Embedding++:"Anthropic"===o.vendor?t.Claude++:"Google"===o.vendor?t.Gemini++:t.OpenAI++;let o=Object.entries(t).filter(([,e])=>e>0).map(([e,t])=>`${e}: ${t}`);return`${e.length} models (${o.join(", ")})`}():"empty"),e}catch(e){return ss("fail","Model catalog",cs(e)),ls("Could not fetch /models — check connectivity/auth."),!1}}async function ds(e){Z.accountType=e.accountType;let t=await Et(),o=Ot();if(console.log(""),console.log(` ${ts("COPILOT-API DOCTOR")} ${os(`v${t}`)}`),console.log(is),ss("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await V(),go(),!await async function(){let e=await us();if(!e)return ss("fail","Auth token","not found"),void ls("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");Z._t2=e.token,ss("ok","Auth token",`found (${e.source})`);try{let e=await lo();return await lt(Z,e.login),ss("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return ss("fail","GitHub auth",cs(e)),void ls("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(is),console.log(` ${rs("✗")} ${ts("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await so();return Z._t1=e,ss("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Bt?e.response.status:0;return ss("fail","Service token",cs(e)),ls(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 ps();await async function(){try{let e=await Vo(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Lo(zo(t))} of ${Lo(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;ss("ok","Copilot plan",`${e.copilot_plan} · ${o} `+os(`(resets ${e.quota_reset_date})`))}catch(e){ss("warn","Copilot plan",`unavailable (${cs(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await es();return e.ok?(ss("ok","Generation",`works via ${e.model} ${os(`(${e.durationMs}ms)`)}`),!0):(ss("fail","Generation",`${e.reason}${e.status?os(` [HTTP ${e.status}]`):""}`),!1)}():ss("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let o of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let n=g.env[o];n&&("ANTHROPIC_BASE_URL"===o&&/\/v1\/*$/.test(n)&&(t="warn",e.push(`${o}=${n} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(n)&&(t="warn",e.push(`${o}=${n} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){ss(t,"Client config","potential base-URL issue");for(let t of e)ls(t)}else ss("ok","Client config","no base-URL issues detected");ls("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(is),a?(console.log(` ${ns("✓")} ${ts("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${as("⚠")} ${ts("Some checks need attention")} — see the ${rs("✗")}/${as("⚠")} lines above.`),console.log(""),2)}const ms=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 ds({accountType:e["account-type"]});g.exit(t)}});function fs(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 hs=!1;const gs="copilot-api-node20",_s=`https://registry.npmjs.org/${gs}/latest`,ys=e=>`[1m${e}[0m`,ws=e=>`[33m${e}[0m`;async function ks(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(_s,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function bs(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 vs,xs;async function $s(e){try{let[t,o]=await Promise.all([Et(),ks(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 Ts(){if(!vs||!xs)return;let{signal:e}=xs;vs.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${gs}@latest`,n=ws("│"),r=` ${ys("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${ys(o)} to update`,i=" ".repeat(54),s=ws(`╭${"─".repeat(54)}╮`),l=ws(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${bs(r,54)}${n}`,`${n}${i}${n}`,`${n}${bs(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var As={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 Ss=262144,Es="https://barazany.dev",Os=/^[a-z0-9][a-z0-9-]*$/i,Cs=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function Is(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(Cs," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function Ps(e){if("object"!=typeof e||!e)return null;let t=e,o=Is(t.title,100),n=Is(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!==Es||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&&Os.test(t.slug)&&(r=`${Es}/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 Rs(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=Ps(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 Ns=null;function qs(e){return s.join(e,"blog-posts.json")}function js(e=W.APP_DIR){try{if(Ns&&Ns.length>0)return Ns;let t=function(e){try{let t=qs(e);return U.statSync(t).size>Ss?[]:Rs(JSON.parse(U.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Rs(As)}catch{return[]}}function Ds(e){return e>-6e4&&e<864e5}async function Ms(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>Ss)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>Ss?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>Ss)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?[]:Rs(JSON.parse(o))}finally{clearTimeout(o)}}async function Hs(e={}){try{if("1"===g.env.COPILOT_API_NO_BLOG||"1"===g.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??W.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=qs(e),n=await U.promises.stat(o);if(n.size<=Ss){let e=await U.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Ds(t-n.fetchedAt)}return Ds(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await Ms(e.timeoutMs??3e3);if(0===n.length)return;Ns=n,await async function(e,t,o){let n=qs(e),r=`${n}.${g.pid}.tmp`;try{await U.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await U.promises.rename(r,n)}catch(e){throw await U.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}function Fs(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=g;if("win32"===e){try{if(h(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=o.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),r=Object.entries(e).filter(([,e])=>void 0!==e);switch(n){case"powershell":o=r.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":o=r.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":o=r.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(" ");o=r.length>0?`export ${e}`:"";break}}return o&&t?`${o}${"cmd"===n?" & ":" && "}${t}`:o||t}const Bs=e=>`[1m${e}[0m`,Us=e=>`[2m${e}[0m`,Ls=e=>`[36m${e}[0m`,zs=e=>`[32m${e}[0m`,Gs=e=>`[33m${e}[0m`,Js=e=>`[4m${e}[0m`,Ks=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Ws="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Vs="https://github.com/johnib/copilot-api-issues/issues",Ys=Us(" ─────────────────────────────────────────────────────────────");function Xs(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Zs(e){return e&&0!==e.length?e.join("·"):"—"}function Qs(e){if(0===e.length)return[];let t=["",Ys,` ${Bs("BARAZANY.DEV")} ${Us("— Recent Posts")}`,Ys,""];for(let[o,n]of e.entries()){let e=`${n.url}${Ws}`,r=Ks(e,Bs(Js(`[${o+1}]`)));t.push(` ${r} ${Ls(n.title)}`,` ${Us("→")} ${Us(n.teaser)}`,"")}return t.push(Ys,` ${Ks(`https://barazany.dev/blog${Ws}`,"barazany.dev/blog")}`,Ys),t}function el(e){let t=[];Z.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):Z.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearchProviders.length>0?`${e.webSearchProviders.map(e=>(e=>e&&e[0].toUpperCase()+e.slice(1))(e)).join(Us(" → "))} ${zs("✓")}`:Us("off"),n=["",` ${Bs("COPILOT-API")} ${Us(`v${e.version}`)}`,Ys,` ${Us("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Us("User")} ${e.user} ${Us("·")} ${e.accountType}`];return Z._v1&&n.push(` ${Us("Client")} VSCode ${Z._v1}`),n.push(` ${Us("Network")} ${t.join(Us(" · "))}`,` ${Us("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Us("Clipboard")} Claude Code command ${zs("✓")}`),n.push(Ys),n}function tl(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Bs("Active")}`];if(e.model){let o=Z.models?.data.find(t=>t.id===e.model),n=Xs(o?.capabilities.limits?.max_context_window_tokens),r=Zs(o?.capabilities.supports.reasoning_effort);t.push(` ${Ls(e.model.padEnd(32))} ${Us("ctx")} ${Bs(n.padStart(5))} ${Us("effort")} ${Us(r)} ${Gs("← main")}`)}if(e.smallModel){let o=Z.models?.data.find(t=>t.id===e.smallModel),n=Xs(o?.capabilities.limits?.max_context_window_tokens),r=Zs(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Us("ctx")} ${n.padStart(5)} ${Us("effort")} ${Us(r)} ${Gs("← small")}`)}return t}function ol(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of Z.models?.data??[]){let a=r.capabilities.limits?.max_context_window_tokens,i={id:r.id,ctx:a,effort:r.capabilities.supports.reasoning_effort};r.id.startsWith("text-embedding")?n.push(i):"Anthropic"===r.vendor?e.push(i):"Google"===r.vendor?o.push(i):t.push(i)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${Bs(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Ls("●"):Us("·"),i=n?Ls(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Xs(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Zs(r.effort)}`;t.push(` ${a} ${i} ${Us(s)}${Us(l)}`)}}return t}function nl(){let e=Vs.replace(/^https:\/\//,""),t=Ks(`${Vs}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Ys,` ${Bs("FOUND A BUG?")} ${Us("— Report it on GitHub")}`,Ys,"",` ${Ls("→")} ${Ls(t)}`,` ${Us("Bug reports, feature requests, and questions welcome.")}`,"",Ys]}function rl(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=["",Ys,` ${Bs("Claude Cowork")} ${Us("— Settings → Inference Provider")}`,Ys,"",` ${Us("Paste into")} ${Bs("inferenceGatewayBaseUrl")}${Us(":")}`,` ${Bs(Ls(r))}`];return n||a.push("",` ${Us("Your Tailscale hostname is shown by:")} ${Ls("tailscale status --self")}`),a.push("",` ${Us("Docs:")} ${Ls("https://claude.com/docs/cowork/3p/installation")}`),a}function al(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Ys,` ${Bs("HTTPS")} ${Us("— self-signed cert")}`,Ys,"",` ${Us("Cert")} ${t}`];switch(o.push("",` ${Bs("Trust this cert")} ${Us("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${Us("macOS:")}`,` ${Ls("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Ls(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Us("Windows (PowerShell as Administrator):")}`,` ${Ls(`Import-Certificate -FilePath "${t}" \``)}`,` ${Ls("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Us("Linux (Debian/Ubuntu):")}`,` ${Ls(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Ls("sudo update-ca-certificates")}`,` ${Us("Linux (Fedora/RHEL/Arch):")}`,` ${Ls(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Ls("sudo update-ca-trust")}`);break;default:o.push(` ${Us("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Us("Or, for Node CLIs only (no admin needed):")}`,` ${Ls(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Ys),o}function il(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 sl=s.join(W.APP_DIR,"certs"),ll=s.join(sl,"cert.pem"),cl=s.join(sl,"key.pem"),ul=s.join(sl,"cert.meta.json");async function pl(e){try{return await a.readFile(e,"utf8")}catch{return}}async function dl(e){let t=await pl(ll),o=await pl(cl),n=await async function(){let e=await pl(ul);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 ml(e){return 0!==G(e)}async function fl(e){await a.mkdir(sl,{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)ml(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(ll,l.cert,{mode:420}),await a.writeFile(cl,l.private,{mode:384}),await async function(e){await a.writeFile(ul,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:ll,keyPath:cl,generated:!0}}const hl=[],gl=Date.now();let _l="";function yl(){let e=async(e,t=0)=>{let n=ge.startSpan("copilot_api.server.shutdown",{kind:l.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-gl)/1e3}});for(let t of hl)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Ks("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Ys,` ${Bs("COPILOT-API")} ${Us(`v${e}`)} ${Us("·")} ${il(t)} uptime`,Ys,""," Check in from time to time on",` ${Ls(o)}`,"",Ys,""];console.log(n.join("\n"))}(_l,Date.now()-gl),g.exit(t)};g.on("SIGINT",()=>e("SIGINT")),g.on("SIGTERM",()=>e("SIGTERM")),g.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),g.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}async function wl(e,t,n){if(!e._cc1)return!1;Z.models||(o.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),g.exit(1));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,Z.models.data.map(e=>e.id));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Z.models.data.map(e=>e.id)}),a=await o.prompt("Select a small model to use",{type:"select",options:Z.models.data.map(e=>e.id)}));let s=Fs({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:r,ANTHROPIC_SMALL_FAST_MODEL:a,NODE_EXTRA_CA_CERTS:n?.certPath},"claude");try{return m.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function kl(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function bl(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=ge.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Xe({config:{version:o,port:t.port,accountType:t.accountType,verbose:t.verbose,manualApprove:t.manual,rateLimitSeconds:t.rateLimit??0,rateLimitWait:t.rateLimitWait,timeoutMs:t.timeout,showToken:t.showToken,_cc1:t._cc1,model:t.model,smallModel:t.smallModel,_t3:kl(t)},runtime:n,identity:{_u1:r.login,machineId:Z.machineId,sessionId:Z.sessionId,_v1:Z._v1},connectivity:Z.connectivity,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-gl},"copilot_api")});if(Z.models?.data)for(let e of Z.models.data)a.addEvent("copilot_api.model.available",Xe(e,"model"));a.end(),We(_.INFO,"INFO","Server started",Xe({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-gl},"copilot_api"))}async function vl(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 dl(e)){let e=await pl(ll),t=await pl(cl);if(e&&t)return{cert:e,key:t,certPath:ll,keyPath:cl,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),fl(e)}(e.httpsHosts)}}async function xl(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=_n;try{L(t),L(n)}catch{throw o.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:n}}(e);if(yl(),hl.push(()=>{o.debug("Cleaning up connectivity monitor"),ot.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),$o=!1,yo&&=void clearInterval(yo),ko&&=void ot.off("online",ko),bo&&=void ot.off("offline",bo),wo=void 0,vo=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),hr&&=void clearInterval(hr),gr&&=void clearInterval(gr);let e=[...dr.keys(),...mr];dr.clear(),mr.clear(),pr.clear(),fr=void 0;for(let t of e)_r(t)&&(qe.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!pe)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([pe.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");Z.accountType=t.accountType,Z.manualApprove=t.manual,Z.rateLimitSeconds=t.rateLimit,Z.rateLimitWait=t.rateLimitWait,Z.showToken=t.showToken,Z.timeoutMs=t.timeout,Z.connectivity.timeoutMs=t.connectTimeout,Z.webSearchProviders=t.webSearchProviders,Z.errorReporting=function(e){let t=g.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===g.env.COPILOT_H2_KEEPALIVE||"true"===g.env.COPILOT_H2_KEEPALIVE,t=e||"1"===g.env.COPILOT_H2||"true"===g.env.COPILOT_H2;Z.connectivity.h2=t,Z.connectivity.h2Keepalive=e}(),await V(),Hs().catch(()=>{}),go();let n=await Et();_l=n;let r=Ot();(function(e,t){t&&(me=t),de=crypto.randomUUID();let o=v({[S]:"copilot-api",[E]:e,[A]:de}),{endpoint:n,headers:r}=he();pe=new T({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new $({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x({exporter:new w({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),pe.start()})(n,gl),t._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 a,i=t._t2||g.env.GH_TOKEN;i?(function(e){Z._t2=e,To=!1}(i),o.info("Using provided Auth token")):await qo();try{a=await lo(),await lt(Z,a.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}await(async()=>{let{token:e,refresh_in:t}=await so();Z._t1=e,o.debug("Service token fetched successfully!"),Z.showToken&&o.info("Service token:",e),$o=!0,No(t),ot.start(),ko=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Po(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},bo=()=>{o.debug("Network connectivity lost")},ot.on("online",ko),ot.on("offline",bo)})(),await async function(){try{return await ho(),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,n=e instanceof Error?e.message:"Unknown error occurred",r=void 0===t?"":` (HTTP ${t})`;return o.warn(`Could not fetch model list from Copilot${r}: ${n}. This is likely a transient network or authentication issue. The proxy will start anyway; model listing endpoints may return empty until the cache is populated.`),!1}}()||function(e){let t=setTimeout(()=>{ho().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{ho().then(()=>o.debug("Model list refreshed successfully")).catch(e=>{o.warn("Failed to refresh model list; keeping existing cache:",e)})},e);return t.unref(),()=>{clearInterval(t)}}();hl.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),Z.connectivity.h2&&(kr(wr(ct(Z))),Z.connectivity.h2Keepalive&&vr()),bl({options:t,version:n,runtime:r,_u1:a});let l=await vl(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await wl(t,u,l)||await async function(e,t,n){if(!e.codex)return!1;let r;if(Z.models||(o.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),g.exit(1)),e.model){let t=Z.models.data.map(e=>e.id);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:Z.models.data.map(e=>e.id)});let a=Fs({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return m.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,u,l);(function(e){let t=[...el(e),...tl(e),...ol(e),...nl(),"",...Qs(js()),...rl(e),...al(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 rn()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),Ts(),z({fetch:Xi.fetch,port:t.port,hostname:t.hostname,tls:l?{cert:l.cert,key:l.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(c,t.hostname,t.port),t.smokeTest&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await es({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: ${En(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))}}(u,t.smallModel??t.model,t.hostname)}function $l(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Tl=e({meta:{name:"start",description:"Start the API server"},args:{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:$l(t,"--rate-limit"),r=e.timeout,a=void 0===r?X:$l(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:$l(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],g.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??g.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!fi(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${mi.join(", ")}`);let r=n.length>0?n:mi,a=new Set,i=n.length>0,s=[];for(let e of r){if(!fi(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||g.env.TAVILY_API_KEY,exaApiKey:g.env.EXA_API_KEY,order:u}),d=(g.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d;return xl({port:$l(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})}});hs||(hs=!0,o.setReporters([fs(o.options.reporters)]));const Al=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(vs||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;xs=e,vs=$s(e).catch(()=>null)})(),Al||Ts();const Sl=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Mo,start:Tl,"check-usage":Qo,debug:Pt,doctor:ms,"cowork-setup":An}});await t(Sl),Al||(xs?.abort(),xs=void 0,vs=void 0);export{};
|
package/package.json
CHANGED