copilot-api-node20 0.35.2 → 0.35.3
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 k}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as w}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 $}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as x}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 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 M}from"hono/streaming";import{events as D}from"fetch-event-stream";import{Tokenizer as H,models as B}from"ai-tokenizer";import*as F from"ai-tokenizer/encoding/claude";import{accessSync as L}from"node:fs";import{serve as U}from"srvx";import{isIP as G}from"node:net";import{generate as z}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 J(){await a.mkdir(W.APP_DIR,{recursive:!0}),await V(W.GITHUB_TOKEN_PATH),await V(W.SESSION_ID_PATH)}async function V(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const Y=6e5,X={accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:Y,webSearchProviders:[],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}},Z=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()},Q=(e,t)=>e.padEnd(t),ee=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),te=(e,t,o)=>` --\x3e ${Q(e,4)} ${Q(t,21)} ${Q(o,3)}`,oe=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>Q(e.length>21?`${e.slice(0,20)}…`:e,22))(e.model??"—")+Q(t,8)},ne=e=>{let t=e?Z(e.inputTokens??0):"—",o=e?Z(e.outputTokens??0):"—";return`↑${t.padStart(5)} ↓${o.padStart(5)}`},re=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${Q("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=Z(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},ae=e=>{if(void 0===e.ttfbMs)return`e2e ${ee(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${ee(e.ttfbMs)} → e2e ${ee(e.e2eMs)} ${t}`},ie=e=>e?X.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,se={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=>[te(e.method,e.path,e.status),oe(e),ne(e.tokenUsage),re(e.tokenUsage,e.maxContextTokens),ae({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(" │ "))({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:ie(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),ze(_.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)},...o?.tokenUsage?.inputTokens&&{"copilot_api.input_tokens":o.tokenUsage.inputTokens},...o?.tokenUsage?.outputTokens&&{"copilot_api.output_tokens":o.tokenUsage.outputTokens}}})({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=>[te(e.method,e.path,"429"),oe(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(30),`e2e ${ee(e.e2eMs)}`].join(" │ "))({method:n.req.method,path:n.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},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(()=>se.cleanup(),6e4);let le,ce,ue=Date.now();const pe={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function de(){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):pe;return{endpoint:e.replace(/\/$/,""),headers:t}}const me=d.getTracer("copilot-api"),fe=p.getMeter("copilot-api"),he=y.getLogger("copilot-api"),ge=fe.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),_e=fe.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),ye=fe.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),ke=fe.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),we=fe.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),be=fe.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),ve=fe.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),$e=fe.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),xe=fe.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Te=fe.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ae=fe.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Se=fe.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Ee=fe.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Ce=fe.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Oe=fe.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ie=fe.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Pe=fe.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Re=fe.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Ne=fe.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),qe=fe.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),je=fe.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Me=fe.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),De=fe.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),He=fe.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Be=fe.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Fe=fe.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Le=fe.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Ue=fe.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),Ge=fe.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function ze(e,t,o,n,r){let a=d.getActiveSpan()?.spanContext()??r;he.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function Ke(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 We(e,t,o){Ke(e,o),t&&t!==e&&Ke(t,o)}function Je(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,Je(r,e)))}return o}fe.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!Qe.getConnectivityStats().isOnline)}),fe.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(Qe.getConnectivityStats().consecutiveFailures)}),fe.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(X.models?.data.length??0)}),fe.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(se.completionCallbacks.size)}),fe.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-ue)/1e3)});const Ve=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","proxy-authorization"]);function Ye(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Ve.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function Xe(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:u}=e,p=me.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&Ye(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();Ve.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),Ee.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 Ke(p,e),p.end(),e}}async function Ze(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=me.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Ye(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&&!Ve.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Ee.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 Ke(f,e),f.end(),e}}const Qe=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:X.connectivity.probeEndpoints,fastInterval:X.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?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval)+Math.random()*X.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=me.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),X.connectivity.timeoutMs);try{let n=!1;for(let e of X.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",...X.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Be.record(r,{endpoint:e,result:"success"});break}Be.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),Ae.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")),Se.add(1,{from:"offline",to:"online"}),ze(_.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")),Se.add(1,{from:"online",to:"offline"}),ze(_.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?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*X.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:X.connectivity.jitterMaxMs>0,connectionPooling:X.connectivity.connectionPooling,dnsCache:X.connectivity.dnsCache}}},et=()=>({"content-type":"application/json",accept:"application/json"}),tt="0.48.1",ot=`copilot-chat/${tt}`,nt=`GitHubCopilotChat/${tt}`,rt=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},at=async(e,t)=>{e.machineId||=await rt(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})()},it=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,st=(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":ot,"User-Agent":nt,"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},lt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const ct=(e,t,o)=>{let n=st(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&<.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},ut="https://api.github.com",pt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":ot,"user-agent":nt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),dt="https://github.com",mt="01ab8ac9400c4e429b23",ft=["user:email"].join(" ");function ht(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 gt=32768,_t=[{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_***"}],yt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);const kt=new Map;function wt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=e.model??"unknown";return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function bt(e,t,o){let n=function(e){let t=e;for(let{regex:e,mask:o}of _t)t=t.replace(e,o);return t}(o),r=8*gt,a=n.length>r,i=a?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(i.length<=gt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=gt)e.setAttribute(`${t}.part_${o/gt}`,i.slice(o,o+gt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/gt))}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 vt(e,t){let o=function(e){if(kt.size>=1e3&&!kt.has(e)){let e=kt.keys().next().value;void 0!==e&&kt.delete(e)}let t,o=(kt.get(e)??0)+1;return kt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Re.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&&bt(e,"copilot_api.incoming_request_body",n);let r=$t(t.c.req.header());return r&&bt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&bt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&bt(e,"copilot_api.outgoing_headers",$t(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&bt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function $t(e){let t={};for(let[o,n]of Object.entries(e))yt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}var xt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}};function Tt(e){return e.req.path.startsWith("/v1/messages")}function At(e,t){if(Tt(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||"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 St(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type&&(o.type=t.type),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function Et(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 Ct(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 Ot(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=wt({endpointType:ht(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});vt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}async function It(e,t){if(t instanceof xt&&429===t.response.status)return async function(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=se.completionCallbacks.get(n);r&&(se.logRateLimit(r,t.response),se.completionCallbacks.delete(n)),be.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=At(a,e),s=St(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),Et(o,s),ze(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...Ct(s)}),Ot({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"),ze(_.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=Tt(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 e.json(o,400)}if(o.error("Error occurred:",t),t instanceof xt)return async function(e,t){let n=d.getActiveSpan(),r=await t.response.text(),a=At(r,e),i=St(a);return o.error("HTTP error:",a),n?.setStatus({code:c.ERROR,message:t.message}),n?.recordException(t),n?.setAttribute("copilot_api.error_type","HTTPError"),Et(n,i),ze(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...Ct(i)}),Ot({c:e,error:t,errorText:r,upstream:i}),e.json(a,t.response.status)}(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),ze(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name});let a=Tt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const Pt=async()=>{let e=`${ut}/copilot_internal/v2/token`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Xe({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:pt(X),signal:o.signal});try{if(!t.ok)throw new xt("Failed to get Service token",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function Rt(){let e=`${ut}/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Xe({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${X._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new xt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let Nt=null;function qt(){return Nt||=Pt().then(({token:e})=>{X._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{Nt=null}),Nt}const jt=async()=>{let e=`${it(X)}/models`,t=st(X),o=X.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),o);try{let{response:o,span:r}=await Xe({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new xt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Ke(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const Mt=e=>new Promise(t=>{setTimeout(t,e)}),Dt=e=>null==e;async function Ht(){X.models=await(async()=>{try{return await jt()}catch(e){if(e instanceof xt&&401===e.response.status)return await qt(),jt();throw e}})()}const Bt=()=>{X._v1="1.121.0-insider"};var Ft=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Lt,Ut,Gt,zt,Kt=!1;function Wt(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";X._t1=void 0,clearInterval(Lt),Lt=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),xe.add(1,{reason:r,success:"false"}),Te.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),He.record(performance.now()-a,{reason:r}),ze(_.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 Jt(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;X._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),Te.add(1,{reason:r}),He.record(performance.now()-a,{reason:r}),ze(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Vt=async(e=5,t=1e3,n="scheduled")=>Kt?(o.debug("Token refresh already in progress, coalescing"),Ut):(Kt=!0,Ut=me.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}=await Pt();return X._t1=t,o.debug("Service token refreshed successfully"),X.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),xe.add(1,{reason:n,success:"true"}),He.record(performance.now()-a,{reason:n}),void ze(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof xt&&(401===s.response.status||403===s.response.status))return void Wt({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),xe.add(1,{reason:n,success:"false"}),l)return void Jt({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(),Kt=!1,Ut=void 0}}),Ut);async function Yt(){return!!X._t1||(await Vt(1,0,"on-demand"),!!X._t1)}async function Xt(e){try{let t=await a.readFile(W.GITHUB_TOKEN_PATH,"utf8");if(t&&!e?.force)return X._t2=t,X.showToken&&o.info("Auth token:",t),void await Zt();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=X.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${dt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:mt,scope:ft}),signal:e.signal});if(!t.ok)throw new xt("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 Ft("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=X.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${dt}/login/oauth/access_token`,{method:"POST",headers:et(),body:JSON.stringify({client_id:mt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await Mt(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 Ft("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Ft("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 Mt(t);continue}if(r.access_token)return r.access_token;await Mt(t)}catch(e){if(e instanceof Ft)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await Mt(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(W.GITHUB_TOKEN_PATH,e,{mode:384}))(r),X._t2=r,X.showToken&&o.info("Auth token:",r),await Zt()}catch(e){throw e instanceof xt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Zt(){let e=await Rt();o.success(`Authenticated as ${e.login}`)}async function Qt(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),X.showToken=e.showToken,await J(),await Xt({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 eo=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})=>Qt({verbose:e.verbose,showToken:e["show-token"]})}),to=async()=>{let e=`${ut}/copilot_internal/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Xe({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:pt(X),signal:o.signal});try{if(!t.ok)throw new xt("Failed to get usage",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},oo=e({meta:{name:"check-usage",description:"Show current usage/quota information"},async run(){await J(),await Xt();try{let e=await to(),t=e.quota_snapshots.premium_interactions,n=t.entitlement,r=n-t.remaining,a=n>0?r/n*100:0,i=t.percent_remaining;function s(e,t){if(!t)return`${e}: N/A`;let o=t.entitlement,n=o-t.remaining,r=o>0?n/o*100:0,a=t.percent_remaining;return`${e}: ${n}/${o} used (${r.toFixed(1)}% used, ${a.toFixed(1)}% remaining)`}let l=`Premium: ${r}/${n} used (${a.toFixed(1)}% used, ${i.toFixed(1)}% remaining)`,c=s("Chat",e.quota_snapshots.chat),u=s("Completions",e.quota_snapshots.completions);o.box(`Usage (plan: ${e.copilot_plan})\nQuota resets: ${e.quota_reset_date}\n\nQuotas:\n ${l}\n ${c}\n ${u}`)}catch(p){o.error("Failed to fetch usage:",p),process.exit(1)}}}),no=N(f);async function ro(){let e="win32"===g.platform?"where.exe":"which";try{return await no(e,["tailscale"]),!0}catch{return!1}}async function ao(){try{let{stdout:e}=await no("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function io(e){return e.replace(/\.$/,"")}async function so(){let e=await ao();if(e?.Online)return io(e.DNSName)}const lo=N(f),co=e=>`[1m${e}[0m`,uo=e=>`[2m${e}[0m`,po=e=>`[36m${e}[0m`,mo=e=>`[32m${e}[0m`,fo=e=>`[31m${e}[0m`,ho=e=>`[33m${e}[0m`,go=uo(" ─────────────────────────────────────────────────────────────"),_o=s.join(W.APP_DIR,"certs","tailscale"),yo=s.join(_o,"cert.pem"),ko=s.join(_o,"key.pem"),wo={certDir:_o,certPath:yo,keyPath:ko};function bo(){switch(g.platform){case"darwin":return[` ${uo("Install Tailscale for macOS:")}`,` ${po("https://tailscale.com/download/mac")}`,` ${uo("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${uo("After installing, open the Tailscale app and sign in.")}`,` ${uo("Then re-run this command.")}`].join("\n");case"linux":return[` ${uo("Install Tailscale for Linux:")}`,` ${po("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${po("sudo tailscale up")}`,` ${uo("or")} ${po("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${uo("Install Tailscale for Windows:")}`,` ${po("https://tailscale.com/download/windows")}`,"",` ${uo("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${uo("Install Tailscale:")} ${po("https://tailscale.com/download")}`}}function vo(){let e=[` ${fo("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${uo("Open the Tailscale app from Applications and sign in.")}`,` ${uo("Download:")} ${po("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${uo("Open the Tailscale app and sign in.")}`,` ${uo("Download:")} ${po("https://tailscale.com/download/windows")}`):e.push(` ${uo("Connect with:")} ${po("sudo tailscale up")}`),e.push("",` ${uo("Then re-run this command.")}`),e.join("\n")}async function $o(){try{return await a.access(yo),await a.access(ko),!0}catch{return!1}}function xo(e){console.log(""),console.log(go),console.log(` ${co("Claude Cowork Setup")} ${uo("— Diagnostic")}`),console.log(go),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?mo("✅"):"missing"===n.status?fo("❌"):ho("❓");let r=n.detail?uo(` ${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(` ${mo("All checks passed.")}`):console.log(` ${fo(`${t.length} issue(s).`)} Run ${po("copilot-api cowork-setup install")} to fix.`),console.log("")}const To={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},Ao=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await ro();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return xo(e),console.log(""),console.log(bo()),void console.log("");let o=await ao();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},xo(e),console.log(vo()),void console.log("");let n=io(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await $o();e["tailscale-cert"]=r?{status:"ok",detail:yo}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),xo(e)}(),g.exit(0)}}),install:e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:To},async run({args:e}){await async function(e){if(console.log(""),console.log(go),console.log(` ${co("Claude Cowork Setup")} ${uo("— Install")}`),console.log(go),console.log(""),!await ro())return console.log(` ${fo("Tailscale is not installed.")}`),console.log(""),console.log(bo()),console.log(""),console.log(` ${uo("After installing, run")} ${po("tailscale up")} ${uo("to connect, then re-run this command.")}`),void console.log("");let t=await ao();if(!t||!t.Online)return console.log(vo()),void console.log("");let n=io(t.DNSName);if(console.log(` ${uo("Tailscale hostname:")} ${co(n)}`),console.log(""),console.log(` ${co("Generating TLS certificate via Tailscale…")}`),console.log(` ${uo("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${po(`$ tailscale cert --cert-file ${yo} --key-file ${ko} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(_o,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await lo("tailscale",["cert","--cert-file",yo,"--key-file",ko,n]),console.log(` ${mo("✓ 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(go),console.log(` ${co("Next steps")}`),console.log(go),console.log(""),console.log(` ${co("1.")} Start the proxy:`),console.log(` ${po("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${co("2.")} In Cowork ${uo("→")} Settings ${uo("→")} Inference Provider, set:`),console.log(` ${co("inferenceGatewayBaseUrl")} = ${po(`https://${n}:<port>`)}`),console.log(` ${uo("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${co("3.")} Restart Cowork ${uo("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${uo("For Cowork's own configuration docs, see:")}`),console.log(` ${po("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),revert:e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:To},async run({args:e}){await async function(e){if(console.log(""),console.log(go),console.log(` ${co("Claude Cowork Setup")} ${uo("— Revert")}`),console.log(go),console.log(""),!await $o())return console.log(` ${uo("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${co("Remove Tailscale cert files:")}`),console.log(` ${uo(yo)}`),console.log(` ${uo(ko)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(_o,{recursive:!0}),console.log(` ${mo("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${uo("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}})}});async function So(){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 Eo(){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 Co(){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 Oo(e){let t=await async function(){let[e,t]=await Promise.all([So(),Co()]);return{version:e,runtime:Eo(),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 Io=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})=>Oo({json:e.json})}),Po=[{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"}],Ro="claude-haiku-4.5",No={haiku:Ro,"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 qo(e,t){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 Po)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=No[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 jo=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Mo(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=jo.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=jo.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var Do=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Ho(e){if(!e||"string"!=typeof e)throw new Do("Model name is required and must be a string");if(!X.models?.data)throw new Do("Models not available. Please try again later.",503);let t=X.models.data.map(e=>e.id);if(t.includes(e))return e;let o=qo(e,t);if(!o)throw ve.add(1,{requested_model:e}),new Do(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Bo(e){let t=X.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e)}function Fo(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 Lo(e){if("string"==typeof e)return Fo(e);if(Array.isArray(e))return e.map(e=>Lo(e));if(e&&"object"==typeof e){let t={},o="thinking"===e.type;for(let[n,r]of Object.entries(e))t[n]=!o||"thinking"!==n&&"signature"!==n?Lo(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}const Uo="x-copilot-api-self-test",Go=R();function zo(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),e.estimatedCost&&n.setAttribute("copilot_api.estimated_cost",e.estimatedCost)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();Ve.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(ge.add(1,d),Ne.record(s,d),c>=400&&_e.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&&(ye.add(e.inputTokens,t),Fe.record(e.inputTokens,t)),e.outputTokens&&(ke.add(e.outputTokens,t),Le.record(e.outputTokens,t)),e.cachedTokens&&we.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&se.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const Ko=1048576;const Wo=async()=>me.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),Ge.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Oe.add(1,{result:"rejected"}),new xt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Oe.add(1,{result:"approved"})}finally{e.end()}}),Jo=3e-6,Vo=15e-6;function Yo(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,estimatedCost:t*Jo+o*Vo,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function Xo(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)}async function Zo(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return me.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"),be.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new xt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),be.add(1,{action:"waited",source:"local"}),Me.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await Mt(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function Qo(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 en(e,t,o){return Math.min(Math.max(e,t),o)}function tn(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 tn(JSON.parse(r),t+1)}catch{return null}}function on(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Qo(o.capabilities.supports.min_thinking_budget),r=Qo(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Qo(o.capabilities.limits?.max_output_tokens)??void 0}}function nn(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=en(Qo(e.requestedBudget)??o,o,n),a=Qo(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 rn(e,t){if(Dt(e.thinking_budget))return e;let o=on(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=nn({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 an(e){return"invalid_thinking_budget"===tn(e)}async function sn(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(Dt(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(!an(i))return null;let l=on(n,t.model);return l?function(e,t){let o=nn({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=Qo(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 ln(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 cn(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const un=new Map,pn=new Map,dn=new Set;let mn,fn,hn;function gn(e){return!e.closed&&!e.destroyed}function _n(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 un.set(t,Date.now()),Pe.add(1,{event:"created",origin:e}),ze(_.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=dn.has(t);Pe.add(1,{event:"goaway",origin:e}),ze(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}),pn.delete(t),dn.delete(t),un.delete(t),gn(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function yn(e){if(!X.connectivity.h2)return;mn&&mn!==e&&function(){for(let e of[...pn.keys(),...dn])gn(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});pn.clear(),dn.clear(),un.clear()}(),mn=e;let t=Date.now();for(let[n]of pn)if(t-(un.get(n)??0)>=6e5)pn.delete(n),un.delete(n),gn(n)&&n.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Pe.add(1,{event:"rotated",origin:e}),ze(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(gn(n))return pn.delete(n),dn.add(n),n;pn.delete(n),un.delete(n)}let n=_n(e);return dn.add(n),n}function kn(e){e&&dn.delete(e)&&(gn(e)?pn.set(e,Date.now()):un.delete(e))}function wn(){hn||(hn=setInterval(()=>{!function(){let e=Date.now(),t=X.connectivity.h2Keepalive,n=pn.size;for(let[r,a]of pn)e-a<6e4||t&&n<=1||(pn.delete(r),un.delete(r),n--,gn(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Pe.add(1,{event:"idle_reaped",origin:mn??""}),ze(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${mn}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":mn??""}))}()},3e4),hn.unref())}function bn(){fn||(o.debug("Starting HTTP/2 keepalive (every 45s)"),fn=setInterval(()=>{(async function(){if(0===pn.size&&0===dn.size){if(mn){let e=_n(mn);pn.set(e,Date.now())}return}let e=[...pn.keys()];for(let t of e)pn.delete(t);await Promise.allSettled(e.map(async e=>{if(gn(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:st(X)});await n.dump(),Ie.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),pn.set(e,Date.now())}catch(t){Ie.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Pe.add(1,{event:"error",origin:mn??""}),un.delete(e),gn(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else un.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),fn.unref(),wn())}function vn(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)}async function $n(){return new Promise(e=>setTimeout(e,100))}async function xn(e,t,o){try{if(!e.ok)throw new xt("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&&Xo(t,n.usage),n}catch(e){throw Ke(t,e),e}finally{t.end()}}const Tn=async e=>{let t=Lo(e);try{return await An(t)}catch(e){if(e instanceof xt&&401===e.response.status)return await qt(),An(t);let n;if(e instanceof xt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await sn({payload:t,error:e,models:X.models,errorBodyText:n});if(r)return e instanceof xt&&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 An(Lo(r));throw e}},An=async e=>{if(!X._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)),n=e.messages.some(e=>["assistant","tool"].includes(e.role)),r={...st(X,t),"X-Initiator":n?"agent":"user"},a=it(X),i=`${a}/chat/completions`,s=X.timeoutMs,l=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t))return{...e};let{max_tokens:o,stop:n,...r}=e;return null==o?{...r}:{...r,max_completion_tokens:o}}(e,X.models),c=JSON.stringify(l),u={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":s,"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":e.max_tokens??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":n?"agent":"user"};for(let t=0;t<=1;t++){let n=yn(a),l=new AbortController,p=setTimeout(()=>l.abort(),s);try{let{statusCode:o,headers:a,body:p,span:d}=await Ze({spanName:"copilot POST /chat/completions",url:i,target:"chat_completions",headers:r,body:c,signal:l.signal,headersTimeout:s,bodyTimeout:3*s,extraAttributes:{...u,"copilot_api.h2.retry_attempt":t},dispatcher:n}),m=new Response(p,{status:o,headers:a});if(e.stream){if(!m.ok)throw d.end(),new xt("Failed to create chat completions",m,{outgoingBody:c,outgoingHeaders:r});return{events:D(m),span:d,release:()=>kn(n)}}try{return await xn(m,d,{outgoingBody:c,outgoingHeaders:r})}finally{kn(n)}}catch(e){if(kn(n),vn(e)&&t<1){o.warn(`HTTP/2 connection error during chat completions, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await $n();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function Sn(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 En(e){let t=!0===e.get("isSelfTest");t||await Zo(X);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Ho(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),$e.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 Do)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(e.set("requestData",{model:n.model,streaming:!!n.stream}),X.manualApprove&&!t&&await Wo(),Dt(n.max_tokens)){let e=X.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(n.max_tokens))}n=rn(n,X.models),Dt(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=performance.now(),a=await Tn(n),i=performance.now()-r;if(qe.record(i,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Cn(a)){let t=e.get("requestData")||{};return a.usage&&(t.tokenUsage=Yo(a.usage)),t._d1=i,t.upstreamTtfbMs=i,t.upstreamTotalMs=i,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(a)),e.json(a)}let{events:s,span:l,release:c}=a;return M(e,async t=>{let o={value:null},a=0,u=performance.now(),p=ln(e,r);try{try{for await(let r of s){p();let s=r;r.data&&"[DONE]"!==r.data&&(a++,Ce.add(1,{model:n.model,endpoint_type:"openai"}),s=Sn(r,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Yo(t),n._d1=i,e.set("requestData",n)})),await t.writeSSE(s)}let l=performance.now()-u,c={model:n.model,endpoint_type:"openai"};if(je.record(l,c),Ue.record(a,c),cn(e,r),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Yo(o.value),t._d1=i,e.set("requestData",t))}}catch(t){throw We(l,e.get("requestSpan"),t),t}finally{o.value&&Xo(l,o.value),l.end(),c()}let d=e.get("requestId");d&&se.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Cn=e=>Object.hasOwn(e,"choices"),On=new q;On.post("/",async e=>{try{return await En(e)}catch(t){return await It(e,t)}});const In=new q;In.post("/",async e=>{try{let t=await e.req.json();try{t.model=Ho(t.model)}catch(t){if(t instanceof Do)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=performance.now(),n=await(async e=>{if(!X._t1)throw Error("Service token not found");let t=`${it(X)}/embeddings`,o=st(X),n=X.timeoutMs,r=new AbortController,a=setTimeout(()=>r.abort(),n),i=JSON.stringify(e);try{let{response:n,span:a}=await Xe({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 xt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Ke(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),r=performance.now()-o;qe.record(r,{model:t.model,target:"embeddings",streaming:"false"});let a=e.get("requestData")||{};return a.tokenUsage=Yo(n.usage),a._d1=r,e.set("requestData",a),e.json(n)}catch(t){return await It(e,t)}});const Pn=new q;let Rn=null,Nn=null;Pn.get("/",async e=>{let t,o=function(){let e=X._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=Rn;return t&&e-t.timestamp<3e4?{result:t.result}:Nn||(Nn=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${it(X)}/models`,n=await fetch(t,{method:"GET",headers:st(X),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Rn={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Rn={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),Nn=null}})(),Nn)}();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.35.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 qn=new H(F),jn={...B["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Mn(e){return qn.encode(e).length}function Dn(e){let t=0;for(let o of e)switch(o.type){case"text":t+=Mn(o.text)*jn.contentMultiplier;break;case"tool_use":t+=Mn(o.name+JSON.stringify(o.input))*jn.contentMultiplier;break;case"tool_result":o.content&&(t+=Mn("string"==typeof o.content?o.content:JSON.stringify(o.content))*jn.contentMultiplier);break;case"thinking":t+=Mn(o.thinking)*jn.contentMultiplier;break;case"image":t+=1600}return t}function Hn(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?jn.perFirstProp:jn.perAdditionalProp,t+=Mn(o),r.description&&(t+=jn.perPropDesc+Mn(r.description)),r.enum&&Array.isArray(r.enum)){t+=jn.perEnum;for(let e of r.enum)t+=Mn(String(e))}if("object"===r.type&&r.properties&&(t+=jn.perNestedObject,t+=Hn(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=jn.perArrayOfObjects,t+=Hn(e))}}return t}function Bn(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 Fn(e,t,o){let n=Bn(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Ln=async(e,t,n)=>{try{return await Gn(e,t)}catch(r){if(r instanceof xt&&401===r.response.status)return await qt(),Gn(e,t);if(r instanceof xt&&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}`),Gn(i,t)}throw r}};function Un(e){return e.context_management?["context-management-2025-06-27"]:[]}const Gn=async(e,t)=>{if(!X._t1)throw Error("Service token not found");let{metadata:n,...r}=Lo(e),a={...ct(X,t,Un(r)),"X-Initiator":"agent"},i=it(X),s=`${i}/v1/messages`,l=X.timeoutMs,c=JSON.stringify(r),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",...Bn(e,t?.anthropicBeta)}}(r,t,l);for(let e=0;e<=1;e++){let t=yn(i),p=new AbortController,d=setTimeout(()=>p.abort(),l);try{let{statusCode:o,headers:n,body:i,span:d}=await Ze({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:a,body:c,signal:p.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(i,{status:o,headers:n});if(!m.ok)throw d.end(),new xt("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:a});if(r.stream)return{events:D(m),span:d,release:()=>kn(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&&Xo(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(),kn(t)}}catch(n){if(kn(t),vn(n)&&e<1){o.warn(`HTTP/2 connection error during anthropic messages, retrying (attempt ${e+1}): ${n instanceof Error?n.message:String(n)}`),await $n();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function zn(e,t,o){try{if(!e.ok)throw new xt("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&&Xo(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Ke(t,e),e}finally{t.end()}}const Kn=async e=>{try{return await Wn(e)}catch(t){if(t instanceof xt&&401===t.response.status)return await qt(),Wn(e);throw t}},Wn=async e=>{if(!X._t1)throw Error("Service token not found");let t=Lo(e),n={...st(X),"X-Initiator":"agent"},r=it(X),a=`${r}/responses`,i=X.timeoutMs,s=JSON.stringify(t),l={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":i,"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 c=yn(r),u=new AbortController,p=setTimeout(()=>u.abort(),i);try{let{statusCode:o,headers:r,body:p,span:d}=await Ze({spanName:"copilot POST /responses",url:a,target:"responses",headers:n,body:s,signal:u.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:c}),m=new Response(p,{status:o,headers:r});if(t.stream){if(!m.ok)throw d.end(),new xt("Failed to create responses",m,{outgoingBody:s,outgoingHeaders:n});return{events:D(m),span:d,release:()=>kn(c)}}try{return await zn(m,d,{outgoingBody:s,outgoingHeaders:n})}finally{kn(c)}}catch(t){if(kn(c),vn(t)&&e<1){o.warn(`HTTP/2 connection error during responses, retrying (attempt ${e+1}): ${t instanceof Error?t.message:String(t)}`),await $n();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Jn=new Set(["low","medium","high","max","xhigh"]);function Vn(e,t,n){let r=t.includes(e.model)?e.model:qo(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=qo(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=X.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Mo(t,n);if(!r||!Jn.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 Yn(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Xn(e,t){let o={model:e.model,messages:Zn(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:nr(e.tools),tool_choice:rr(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=on(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=Qo(t),a=r&&r>1?r-1:o.min;return en(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=rn({...o,thinking_budget:a},t)}}return o}function Zn(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:Qn(e)}]:[{role:"system",content:Qn(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:or(e.content)});n.length>0&&t.push({role:"user",content:or(n)})}else t.push({role:"user",content:or(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:tr(e.reasoning_text),reasoning_opaque:tr(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:or(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:or(e.content),...t}]}(e));return[...o,...n]}function Qn(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const er=32768;function tr(e){if("string"==typeof e)return e.length<=er?e:e.slice(0,er)}function or(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 nr(e){if(e)return e.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function rr(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 ar(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 ir(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function sr(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 lr=new Set(["low","medium","high","max","xhigh"]);function cr(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&&lr.has(e)?e:null)(Mo(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 ur(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 pr=/[^\w-]/g;function dr(e){return e.replaceAll(pr,"_")}function mr(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=cr(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:ur(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:dr(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:dr(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function fr(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 hr(e){let t={model:e.model,input:_r(e.messages),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)},o=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 o&&(t.instructions=o),e.tools?.length&&(t.tools=e.tools.map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(t.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?t.reasoning={effort:gr(e.output_config?.effort??"high")}:"enabled"===e.thinking?.type&&e.thinking.budget_tokens&&(t.reasoning=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens)),t}function gr(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function _r(e){let t=[];for(let o of e)"user"===o.role?t.push(...yr(o)):t.push(...wr(o));return t}function yr(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(kr(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}`});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 kr(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 wr(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 br(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 vr(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function $r(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 xr(e,t){let o=[];switch(e.type){case"response.created":$r(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":case"response.refusal.done":case"response.reasoning_summary_text.delta":case"response.reasoning_summary_text.done":default:break;case"response.output_item.added":if("function_call"===e.item.type){$r(t,o),vr(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":$r(t,o),vr(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":vr(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":{vr(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:br(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":{$r(t,o),vr(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":$r(t,o),vr(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":$r(t,o),vr(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":$r(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 Tr(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 Ar(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Sr(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&&(Tr(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&&(Tr(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Ar(t,o)),r.content&&(Ar(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){Ar(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&&(Ar(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Yn(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 Er=/structured_outputs|output_config\.format/i;function Cr(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Er.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?mr({...e,model:Ro},o):null}var Or=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Ir=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const Pr={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 Xe({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 Ke(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Ir: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 Xe({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 Ke(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Or:e}finally{clearTimeout(i)}}},Rr=["tavily","exa"];function Nr(e){return"tavily"===e||"exa"===e}function qr(){return X.webSearchProviders.length>0}async function jr(e,t){return async function(e,t,n){let{providers:r,searchFns:a=Pr}=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:X.webSearchProviders})}function Mr(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Dr(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function Hr(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{maxResults:"number"==typeof t?.max_uses?t.max_uses:5,allowedDomains:t?.allowed_domains,blockedDomains:t?.blocked_domains}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!qr())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await jr(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_${Mr()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{type:"web_search_tool_result",tool_use_id:n,content:Dr(e)}];return{id:`msg_ws_${Mr()}`,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_${Mr()}`,r=`msg_ws_${Mr()}`,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:{type:"web_search_tool_result",tool_use_id:n,content:Dr(e)}},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),M(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const Br=(e,t)=>!(!e||!t||e===t);async function Fr(e){let t=await e.req.json();if(function(e){let t=e.tools;if(!t||1!==t.length)return!1;let o=t[0].type;return"string"==typeof o&&o.startsWith("web_search")}(t))return Hr(e,t);await Zo(X),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort;t=function(e,t){return Vn(t,X.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let a=function(e,t){return me.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),Fn(n,t,e.req.header("anthropic-beta"));let r=Ho(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=fr(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),$e.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 Do)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:t.message}},t.statusCode)};throw t}finally{n.end()}})}(e,t);if(!a.ok)return a.response;if(t=a.payload,!X._t1&&!await Yt())return d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503);if(Bo(t.model))return async function(e,t){let r=performance.now(),a=me.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),hr(t)}finally{e.end()}});De.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),X.manualApprove&&await Wo();let i=performance.now(),s=await Kn(a),l=performance.now()-i;if(qe.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Gr(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Yo({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=me.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)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:br(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 De.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return M(e,async t=>{let n=null,r=0,s=performance.now(),d=ln(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++,Ce.add(1,{model:a.model,endpoint_type:"responses"});let c=Lr(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Yo(n),t._d1=l,e.set("requestData",t)}let u=xr(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"};je.record(u,p),Ue.record(r,p),cn(e,i)}catch(t){throw We(u,e.get("requestSpan"),t),t}finally{n&&Xo(u,n),u.end(),p()}let f=e.get("requestId");f&&se.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t,o){let n=mr(t,X.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:Br(o,a),streaming:!!n.stream}),X.manualApprove&&await Wo(),me.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),Fn(t,n,r.anthropicBeta);try{let o=performance.now(),a=await Ln(n,r,{onStructuredOutputFallback:(e,o)=>{let n=Cr(e,o,X.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(qe.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=Yo(zr(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 M(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=ln(e,o);try{try{for await(let e of s)d(),e.data&&"[DONE]"!==e.data?(a++,Ce.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),Kr(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"};je.record(e,t),Ue.record(a,t)}finally{if(cn(e,o),p){let t=zr(u);Xo(l,t);let o=e.get("requestData")||{};o.tokenUsage=Yo(t),e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&se.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Ke(t,e),t.end(),e}})}(e,t,r);let i=performance.now(),s=me.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),Xn(t,X.models)}finally{o.end()}});De.record(performance.now()-i,{direction:"anthropic_to_openai"}),s=rn(s,X.models),o.debug("Translated OpenAI request payload:",s);let l=t.output_config?.effort;e.set("requestData",{model:s.model,reasoningEffort:l,effortClamped:Br(r,l),streaming:!!s.stream});let c=performance.now();X.manualApprove&&await Wo();let u=await Tn(s),p=performance.now()-c;if(qe.record(p,{model:s.model,target:"chat_completions",streaming:String(!!s.stream)}),Ur(u)){let t=e.get("requestData")||{};u.usage&&(t.tokenUsage=Yo(u.usage)),t._d1=p,t.upstreamTtfbMs=p,t.upstreamTotalMs=p,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(u).slice(-400));let r=performance.now(),a=me.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=ir(a.message),i=ar(a.message.content),s=sr(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:Yn(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(u);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 De.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:m,span:f,release:h}=u;return M(e,async t=>{let n=null,r=0,a=performance.now(),i=ln(e,c),l={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of m){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let c;try{c=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,Ce.add(1,{model:s.model,endpoint_type:"anthropic"}),c.usage){n=c.usage;let t=e.get("requestData")||{};t.tokenUsage=Yo(n),t._d1=p,e.set("requestData",t)}let u=Sr(c,l);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()-a,d={model:s.model,endpoint_type:"anthropic"};if(je.record(u,d),Ue.record(r,d),cn(e,c),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Yo(n),t._d1=p,e.set("requestData",t))}}catch(t){throw We(f,e.get("requestSpan"),t),t}finally{n&&Xo(f,n),f.end(),h()}let u=e.get("requestId");u&&se.executeCompletion(u)}finally{e.get("resolveStreamComplete")?.()}})}function Lr(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}const Ur=e=>Object.hasOwn(e,"choices"),Gr=e=>Object.hasOwn(e,"output");function zr(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 Kr(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}const Wr=new q;Wr.post("/",async e=>{try{return await Fr(e)}catch(t){return await It(e,t)}});const Jr=new q;function Vr(e){return me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Ho(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),$e.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 Yr(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=Yo(o),n._d1=t._d1,t.c.set("requestData",n)}Jr.get("/",async e=>{try{X.models||await Ht();let t=X.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 It(e,t)}});const Xr=new Set(["message","function_call","function_call_output"]),Zr=new Set(["type","name","description","parameters"]);async function Qr(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||!qr())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await jr(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function ea(e){if(qr())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Qr(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function ta(e){if(!qr())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 Qr(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function oa(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 na(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&&oa(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)oa(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function ra(e){return null!=e}function aa(e){let t=e.input,o="string"==typeof t?t:t.map(e=>function(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 Xr.has(e.type)||"web_search_call"===e.type?e:null}}(e)).filter(e=>null!==e),n={model:e.model,input:o};for(let t of["instructions","max_output_tokens","temperature","top_p","stream","store","tool_choice","parallel_tool_calls","user"])ra(e[t])&&(n[t]=e[t]);let r=new Set;if(ra(e.tools)){let t=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))Zr.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);n.tools=t.tools,r=t.customToolNames}if(ra(e.reasoning)&&"object"==typeof e.reasoning){let t=e.reasoning;n.reasoning={},ra(t.effort)&&(n.reasoning.effort=t.effort),ra(t.summary)&&(n.reasoning.summary=t.summary)}if(ra(e.text)&&"object"==typeof e.text){let t=e.text;ra(t.format)&&(n.text={format:t.format})}return{payload:n,customToolNames:r}}async function ia(e){return X._t1||await Yt()?null:(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}async function sa(e){await Zo(X);let{payload:t,customToolNames:n}=aa(await e.req.json()),r=t;o.debug(`Responses API [${Array.isArray(r.input)?r.input.length:1} items]`),n.size>0&&o.debug(`Custom tools detected: ${[...n].join(", ")}`);let a=function(e,t){try{return{ok:!0,payload:Vr(t)}}catch(t){if(t instanceof Do)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,r);if(!a.ok)return a.response;r=a.payload;let i=await ia(e);if(i)return i;e.set("requestData",{model:r.model,reasoningEffort:r.reasoning?.effort,streaming:!!r.stream}),X.manualApprove&&await Wo();let s=performance.now(),l=await Kn(r),c=performance.now()-s;if(qe.record(c,{model:r.model,target:"responses",streaming:String(!!r.stream)}),la(l))return async function(e,t,o){await ea(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Yo({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,l,c);let{events:u,span:p,release:d}=l;return M(e,async t=>{let o={value:null},a=0,i=performance.now(),l=ln(e,s);try{try{for await(let i of u)if(l(),i.data&&"[DONE]"!==i.data){a++;let s=na(i.data,n);s=await ta(s);let l=s===i.data?i:{...i,data:s};Ce.add(1,{model:r.model,endpoint_type:"responses"}),Yr(s,{usageRef:o,c:e,_d1:c}),await t.writeSSE(l)}else await t.writeSSE(i);let p=performance.now()-i,d={model:r.model,endpoint_type:"responses"};je.record(p,d),Ue.record(a,d),cn(e,s)}catch(t){throw We(p,e.get("requestSpan"),t),t}finally{o.value&&Xo(p,o.value),p.end(),d()}let m=e.get("requestId");m&&se.executeCompletion(m)}finally{e.get("resolveStreamComplete")?.()}})}const la=e=>Object.hasOwn(e,"output"),ca=new q;ca.post("/",async e=>{try{return await sa(e)}catch(t){return await It(e,t)}});const ua=new q;ua.get("/",e=>{try{return X.showToken?e.json({token:X._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 pa=new q;pa.get("/",async e=>{try{let t=await to();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const da=new q;da.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=ht(i),p=function(e){return e===Go}(e.req.header(Uo));e.set("requestId",r),e.set("isSelfTest",p),e.header("x-request-id",r);let m=me.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();Ve.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>Ko?t.slice(0,Ko):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||se.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(()=>zo(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{}}):zo(y)}),da.use(j()),da.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()}),da.get("/",e=>e.text("Server running")),da.route("/health",Pn),da.route("/chat/completions",On),da.route("/models",Jr),da.route("/embeddings",In),da.route("/usage",pa),da.route("/token",ua),da.route("/v1/chat/completions",On),da.route("/v1/models",Jr),da.route("/v1/embeddings",In),da.route("/v1/messages",Wr),da.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=jn.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=jn.perMessage+Mn(e)*jn.contentMultiplier}for(let e of t.messages)o+=jn.perMessage,o+=Mn(e.role),"string"==typeof e.content?o+=Mn(e.content)*jn.contentMultiplier:Array.isArray(e.content)&&(o+=Dn(e.content));return t.tools&&t.tools.length>0&&(o+=function(e){let t=jn.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=jn.perTool),t+=Mn(n.name),n.description&&(t+=jn.perDesc+Mn(n.description)),t+=Hn(n.input_schema);return t}(t.tools)),e.json({input_tokens:Math.round(o)})}),da.route("/v1/responses",ca),da.route("/responses",ca);const ma="text-embedding";function fa(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 Fo(o).slice(0,200)}catch{}let t=Fo(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 ha(e={}){let t=performance.now(),o=e.model&&function(e){return(X.models?.data.some(t=>t.id===e)??!1)&&!e.startsWith(ma)&&!Bo(e)}(e.model)?e.model:function(){let e=X.models?.data??[];if(0===e.length)return;let t=e.filter(e=>!e.id.startsWith(ma)&&"embeddings"!==e.capabilities.type&&!Bo(e.id));if(0===t.length)return;let o=t.find(e=>/haiku|mini|flash|nano|small|lite/i.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}();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 da.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[Uo]:Go},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:fa(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)}}const ga=e=>`[1m${e}[0m`,_a=e=>`[2m${e}[0m`,ya=e=>`[32m${e}[0m`,ka=e=>`[31m${e}[0m`,wa=e=>`[33m${e}[0m`,ba=_a(" ─────────────────────────────────────────────────────────────");function va(e,t,o){console.log(` ${function(e){return"ok"===e?ya("✓"):"warn"===e?wa("⚠"):ka("✗")}(e)} ${ga(t.padEnd(14))} ${o}`)}function $a(e){console.log(` ${_a("↳")} ${_a(e)}`)}function xa(e){return e instanceof xt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function Ta(){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 Aa(){try{await Ht();let e=(X.models?.data.length??0)>0;return va(e?"ok":"warn","Model catalog",e?function(){let e=X.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 va("fail","Model catalog",xa(e)),$a("Could not fetch /models — check connectivity/auth."),!1}}async function Sa(e){X.accountType=e.accountType;let t=await So(),o=Eo();if(console.log(""),console.log(` ${ga("COPILOT-API DOCTOR")} ${_a(`v${t}`)}`),console.log(ba),va("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await J(),Bt(),!await async function(){let e=await Ta();if(!e)return va("fail","Auth token","not found"),void $a("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");X._t2=e.token,va("ok","Auth token",`found (${e.source})`);try{let e=await Rt();return await at(X,e.login),va("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return va("fail","GitHub auth",xa(e)),void $a("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(ba),console.log(` ${ka("✗")} ${ga("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await Pt();return X._t1=e,va("ok","Service token","acquired"),!0}catch(e){let t=e instanceof xt?e.response.status:0;return va("fail","Service token",xa(e)),$a(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 Aa();await async function(){try{let e=await to(),t=e.quota_snapshots.premium_interactions;va("ok","Copilot plan",`${e.copilot_plan} · premium ${t.percent_remaining.toFixed(0)}% remaining `+_a(`(resets ${e.quota_reset_date})`))}catch(e){va("warn","Copilot plan",`unavailable (${xa(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await ha();return e.ok?(va("ok","Generation",`works via ${e.model} ${_a(`(${e.durationMs}ms)`)}`),!0):(va("fail","Generation",`${e.reason}${e.status?_a(` [HTTP ${e.status}]`):""}`),!1)}():va("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){va(t,"Client config","potential base-URL issue");for(let t of e)$a(t)}else va("ok","Client config","no base-URL issues detected");$a("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(ba),a?(console.log(` ${ya("✓")} ${ga("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${wa("⚠")} ${ga("Some checks need attention")} — see the ${ka("✗")}/${wa("⚠")} lines above.`),console.log(""),2)}const Ea=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 Sa({accountType:e["account-type"]});g.exit(t)}}),Ca="copilot-api-node20",Oa=`https://registry.npmjs.org/${Ca}/latest`,Ia=e=>`[1m${e}[0m`,Pa=e=>`[33m${e}[0m`;async function Ra(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Oa,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Na(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}function qa(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 ja=e=>`[1m${e}[0m`,Ma=e=>`[2m${e}[0m`,Da=e=>`[36m${e}[0m`,Ha=e=>`[32m${e}[0m`,Ba=e=>`[33m${e}[0m`,Fa=e=>`[4m${e}[0m`,La=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Ua="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Ga="https://github.com/johnib/copilot-api-issues/issues",za=Ma(" ─────────────────────────────────────────────────────────────");function Ka(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Wa(e){return e&&0!==e.length?e.join("·"):"—"}const Ja=[{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"},{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"},{title:"Claude Code's Compaction Engine: What the Source Code Actually Reveals",teaser:"What's actually running beneath every long session.",url:"https://barazany.dev/blog/claude-codes-compaction-engine"}];function Va(e){if(0===e.length)return[];let t=["",za,` ${ja("BARAZANY.DEV")} ${Ma("— Recent Posts")}`,za,""];for(let[o,n]of e.entries()){let e=La(`${n.url}${Ua}`,ja(Fa(`[${o+1}]`)));t.push(` ${e} ${Da(n.title)}`,` ${Ma("→")} ${Ma(n.teaser)}`,"")}return t.push(za,` ${La(`https://barazany.dev/blog${Ua}`,"barazany.dev/blog")}`,za),t}function Ya(e){let t=[];X.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):X.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(Ma(" → "))} ${Ha("✓")}`:Ma("off"),n=["",` ${ja("COPILOT-API")} ${Ma(`v${e.version}`)}`,za,` ${Ma("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Ma("User")} ${e.user} ${Ma("·")} ${e.accountType}`];return X._v1&&n.push(` ${Ma("Client")} VSCode ${X._v1}`),n.push(` ${Ma("Network")} ${t.join(Ma(" · "))}`,` ${Ma("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Ma("Clipboard")} Claude Code command ${Ha("✓")}`),n.push(za),n}function Xa(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${ja("Active")}`];if(e.model){let o=X.models?.data.find(t=>t.id===e.model),n=Ka(o?.capabilities.limits?.max_context_window_tokens),r=Wa(o?.capabilities.supports.reasoning_effort);t.push(` ${Da(e.model.padEnd(32))} ${Ma("ctx")} ${ja(n.padStart(5))} ${Ma("effort")} ${Ma(r)} ${Ba("← main")}`)}if(e.smallModel){let o=X.models?.data.find(t=>t.id===e.smallModel),n=Ka(o?.capabilities.limits?.max_context_window_tokens),r=Wa(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Ma("ctx")} ${n.padStart(5)} ${Ma("effort")} ${Ma(r)} ${Ba("← small")}`)}return t}function Za(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of X.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("",` ${ja(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Da("●"):Ma("·"),i=n?Da(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Ka(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Wa(r.effort)}`;t.push(` ${a} ${i} ${Ma(s)}${Ma(l)}`)}}return t}function Qa(){let e=Ga.replace(/^https:\/\//,""),t=La(`${Ga}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",za,` ${ja("FOUND A BUG?")} ${Ma("— Report it on GitHub")}`,za,"",` ${Da("→")} ${Da(t)}`,` ${Ma("Bug reports, feature requests, and questions welcome.")}`,"",za]}function ei(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=["",za,` ${ja("Claude Cowork")} ${Ma("— Settings → Inference Provider")}`,za,"",` ${Ma("Paste into")} ${ja("inferenceGatewayBaseUrl")}${Ma(":")}`,` ${ja(Da(r))}`];return n||a.push("",` ${Ma("Your Tailscale hostname is shown by:")} ${Da("tailscale status --self")}`),a.push("",` ${Ma("Docs:")} ${Da("https://claude.com/docs/cowork/3p/installation")}`),a}function ti(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",za,` ${ja("HTTPS")} ${Ma("— self-signed cert")}`,za,"",` ${Ma("Cert")} ${t}`];switch(o.push("",` ${ja("Trust this cert")} ${Ma("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${Ma("macOS:")}`,` ${Da("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Da(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Ma("Windows (PowerShell as Administrator):")}`,` ${Da(`Import-Certificate -FilePath "${t}" \``)}`,` ${Da("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Ma("Linux (Debian/Ubuntu):")}`,` ${Da(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Da("sudo update-ca-certificates")}`,` ${Ma("Linux (Fedora/RHEL/Arch):")}`,` ${Da(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Da("sudo update-ca-trust")}`);break;default:o.push(` ${Ma("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Ma("Or, for Node CLIs only (no admin needed):")}`,` ${Da(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,za),o}function oi(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 ni=s.join(W.APP_DIR,"certs"),ri=s.join(ni,"cert.pem"),ai=s.join(ni,"key.pem"),ii=s.join(ni,"cert.meta.json");async function si(e){try{return await a.readFile(e,"utf8")}catch{return}}async function li(e){let t=await si(ri),o=await si(ai),n=await async function(){let e=await si(ii);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 ci(e){return 0!==G(e)}async function ui(e){await a.mkdir(ni,{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)ci(t)?i.add(t):r.add(t);let s=await z([{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:[...[...r].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))]}]});return await a.writeFile(ri,s.cert,{mode:420}),await a.writeFile(ai,s.private,{mode:384}),await async function(e){await a.writeFile(ii,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:s.cert,key:s.private,certPath:ri,keyPath:ai,generated:!0}}const pi=[],di=Date.now();let mi="";function fi(){let e=async(e,t=0)=>{let n=me.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()-di)/1e3}});for(let t of pi)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=La("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",za,` ${ja("COPILOT-API")} ${Ma(`v${e}`)} ${Ma("·")} ${oi(t)} uptime`,za,""," Check in from time to time on",` ${Da(o)}`,"",za,""];console.log(n.join("\n"))}(mi,Date.now()-di),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)})}function hi(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function gi(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=me.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Je({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:hi(t)},runtime:n,identity:{_u1:r.login,machineId:X.machineId,sessionId:X.sessionId,_v1:X._v1},connectivity:X.connectivity,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-di},"copilot_api")});if(X.models?.data)for(let e of X.models.data)a.addEvent("copilot_api.model.available",Je(e,"model"));a.end(),ze(_.INFO,"INFO","Server started",Je({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-di},"copilot_api"))}async function _i(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 li(e)){let e=await si(ri),t=await si(ai);if(e&&t)return{cert:e,key:t,certPath:ri,keyPath:ai,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),ui(e)}(e.httpsHosts)}}async function yi(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=wo;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(fi(),pi.push(()=>{o.debug("Cleaning up connectivity monitor"),Qe.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),Lt&&=void clearInterval(Lt),Gt&&=void Qe.off("online",Gt),zt&&=void Qe.off("offline",zt),Ut=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),fn&&=void clearInterval(fn),hn&&=void clearInterval(hn);let e=[...pn.keys(),...dn];pn.clear(),dn.clear(),un.clear(),mn=void 0;for(let t of e)gn(t)&&(Pe.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!le)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([le.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");X.accountType=t.accountType,X.manualApprove=t.manual,X.rateLimitSeconds=t.rateLimit,X.rateLimitWait=t.rateLimitWait,X.showToken=t.showToken,X.timeoutMs=t.timeout,X.connectivity.timeoutMs=t.connectTimeout,X.webSearchProviders=t.webSearchProviders,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;X.connectivity.h2=t,X.connectivity.h2Keepalive=e}(),await J(),Bt();let n=await So();mi=n;let r=Eo();(function(e,t){t&&(ue=t),ce=crypto.randomUUID();let o=v({[S]:"copilot-api",[E]:e,[A]:ce}),{endpoint:n,headers:r}=de();le=new T({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new x({exporter:new w({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new $(new k({url:`${n}/v1/logs`,headers:r}))],instrumentations:[]}),le.start()})(n,di),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?(X._t2=i,o.info("Using provided Auth token")):await Xt();try{a=await Rt(),await at(X,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 Pt();X._t1=e,o.debug("Service token fetched successfully!"),X.showToken&&o.info("Service token:",e),Lt=setInterval(()=>{Vt(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),Qe.start(),Gt=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Vt(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},zt=()=>{o.debug("Network connectivity lost")},Qe.on("online",Gt),Qe.on("offline",zt)})(),await async function(){try{return await Ht(),!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(()=>{Ht().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{Ht().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)}}();pi.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),X.connectivity.h2&&(kn(yn(it(X))),X.connectivity.h2Keepalive&&bn()),gi({options:t,version:n,runtime:r,_u1:a});let l=await _i(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await async function(e,t,n){if(!e._cc1)return!1;let r,a;if(X.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)),e.model&&e.smallModel){let t=X.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}`);if(!t.includes(e.smallModel))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid small model: ${e.smallModel}`);r=e.model,a=e.smallModel}else{if(e.model||e.smallModel)throw Error("Both --model and --small-model must be specified for model selection");r=await o.prompt("Select a model to use",{type:"select",options:X.models.data.map(e=>e.id)}),a=await o.prompt("Select a small model to use",{type:"select",options:X.models.data.map(e=>e.id)})}let i=qa({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(i),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(i),!1}}(t,u,l)||await async function(e,t,n){if(!e.codex)return!1;let r;if(X.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=X.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:X.models.data.map(e=>e.id)});let a=qa({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=[...Ya(e),...Xa(e),...Za(e),...Qa(),"",...Va(Ja),...ei(e),...ti(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 so()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),U({fetch:da.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 ha({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: ${Fo(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 ki(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const wi=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"},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:ki(t,"--rate-limit"),r=e.timeout,a=void 0===r?Y:ki(r,"--timeout"),i=e["connect-timeout"]??g.env.COPILOT_CONNECT_TIMEOUT_MS,s=void 0===i?15e3:ki(i,"--connect-timeout");if(s<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${s}`);let l=e["https-hosts"],c=l?l.split(",").map(e=>e.trim()).filter(Boolean):[],u=e["web-search-provider"]??g.env.WEB_SEARCH_PROVIDER,p=u?u.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 d=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!Nr(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${Rr.join(", ")}`);let r=n.length>0?n:Rr,a=new Set,i=n.length>0,s=[];for(let e of r){if(!Nr(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:p}),m=(g.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),f=""!==m&&"0"!==m&&"false"!==m;return yi({port:ki(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:s,webSearchProviders:d,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:c,claudeCowork:e["claude-cowork"],smokeTest:e["smoke-test"]&&!f})}});await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([So(),Ra()]);if("unknown"===e||!t||!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}(e,t))return;!function(e,t){let o=`npx ${Ca}@latest`,n=Pa("│"),r=` ${Ia("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${Ia(o)} to update`,i=" ".repeat(54),s=Pa(`╭${"─".repeat(54)}╮`),l=Pa(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${Na(r,54)}${n}`,`${n}${i}${n}`,`${n}${Na(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(e,t)}catch{}}(),await t(e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:eo,start:wi,"check-usage":oo,debug:Io,doctor:Ea,"cowork-setup":Ao}}));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 k}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as w}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 $}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as x}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 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 M}from"hono/streaming";import{events as D}from"fetch-event-stream";import{Tokenizer as H,models as B}from"ai-tokenizer";import*as F from"ai-tokenizer/encoding/claude";import{accessSync as L}from"node:fs";import{serve as U}from"srvx";import{isIP as G}from"node:net";import{generate as z}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 J(){await a.mkdir(W.APP_DIR,{recursive:!0}),await V(W.GITHUB_TOKEN_PATH),await V(W.SESSION_ID_PATH)}async function V(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const Y=6e5,X={accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:Y,webSearchProviders:[],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}},Z=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()},Q=(e,t)=>e.padEnd(t),ee=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),te=(e,t,o)=>` --\x3e ${Q(e,4)} ${Q(t,21)} ${Q(o,3)}`,oe=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>Q(e.length>21?`${e.slice(0,20)}…`:e,22))(e.model??"—")+Q(t,8)},ne=e=>{let t=e?Z(e.inputTokens??0):"—",o=e?Z(e.outputTokens??0):"—";return`↑${t.padStart(5)} ↓${o.padStart(5)}`},re=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${Q("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=Z(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},ae=e=>{if(void 0===e.ttfbMs)return`e2e ${ee(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${ee(e.ttfbMs)} → e2e ${ee(e.e2eMs)} ${t}`},ie=e=>e?X.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,se={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=>[te(e.method,e.path,e.status),oe(e),ne(e.tokenUsage),re(e.tokenUsage,e.maxContextTokens),ae({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(" │ "))({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:ie(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),ze(_.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)},...o?.tokenUsage?.inputTokens&&{"copilot_api.input_tokens":o.tokenUsage.inputTokens},...o?.tokenUsage?.outputTokens&&{"copilot_api.output_tokens":o.tokenUsage.outputTokens}}})({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=>[te(e.method,e.path,"429"),oe(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(30),`e2e ${ee(e.e2eMs)}`].join(" │ "))({method:n.req.method,path:n.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},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(()=>se.cleanup(),6e4);let le,ce,ue=Date.now();const pe={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function de(){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):pe;return{endpoint:e.replace(/\/$/,""),headers:t}}const me=d.getTracer("copilot-api"),fe=p.getMeter("copilot-api"),he=y.getLogger("copilot-api"),ge=fe.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),_e=fe.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),ye=fe.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),ke=fe.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),we=fe.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),be=fe.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),ve=fe.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),$e=fe.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),xe=fe.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Te=fe.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ae=fe.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Se=fe.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Ee=fe.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Ce=fe.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Oe=fe.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ie=fe.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Pe=fe.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Re=fe.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Ne=fe.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),qe=fe.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),je=fe.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Me=fe.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),De=fe.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),He=fe.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Be=fe.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Fe=fe.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Le=fe.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Ue=fe.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),Ge=fe.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function ze(e,t,o,n,r){let a=d.getActiveSpan()?.spanContext()??r;he.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function Ke(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 We(e,t,o){Ke(e,o),t&&t!==e&&Ke(t,o)}function Je(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,Je(r,e)))}return o}fe.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!Qe.getConnectivityStats().isOnline)}),fe.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(Qe.getConnectivityStats().consecutiveFailures)}),fe.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(X.models?.data.length??0)}),fe.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(se.completionCallbacks.size)}),fe.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-ue)/1e3)});const Ve=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","proxy-authorization"]);function Ye(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Ve.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function Xe(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:u}=e,p=me.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&Ye(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();Ve.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),Ee.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 Ke(p,e),p.end(),e}}async function Ze(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=me.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Ye(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&&!Ve.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Ee.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 Ke(f,e),f.end(),e}}const Qe=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:X.connectivity.probeEndpoints,fastInterval:X.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?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval)+Math.random()*X.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=me.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),X.connectivity.timeoutMs);try{let n=!1;for(let e of X.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",...X.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Be.record(r,{endpoint:e,result:"success"});break}Be.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),Ae.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")),Se.add(1,{from:"offline",to:"online"}),ze(_.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")),Se.add(1,{from:"online",to:"offline"}),ze(_.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?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*X.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:X.connectivity.jitterMaxMs>0,connectionPooling:X.connectivity.connectionPooling,dnsCache:X.connectivity.dnsCache}}},et=()=>({"content-type":"application/json",accept:"application/json"}),tt="0.48.1",ot=`copilot-chat/${tt}`,nt=`GitHubCopilotChat/${tt}`,rt=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},at=async(e,t)=>{e.machineId||=await rt(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})()},it=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,st=(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":ot,"User-Agent":nt,"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},lt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const ct=(e,t,o)=>{let n=st(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&<.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},ut="https://api.github.com",pt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":ot,"user-agent":nt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),dt="https://github.com",mt="01ab8ac9400c4e429b23",ft=["user:email"].join(" ");function ht(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 gt=32768,_t=[{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_***"}],yt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);const kt=new Map;function wt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=e.model??"unknown";return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function bt(e,t,o){let n=function(e){let t=e;for(let{regex:e,mask:o}of _t)t=t.replace(e,o);return t}(o),r=8*gt,a=n.length>r,i=a?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(i.length<=gt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=gt)e.setAttribute(`${t}.part_${o/gt}`,i.slice(o,o+gt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/gt))}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 vt(e,t){let o=function(e){if(kt.size>=1e3&&!kt.has(e)){let e=kt.keys().next().value;void 0!==e&&kt.delete(e)}let t,o=(kt.get(e)??0)+1;return kt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Re.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&&bt(e,"copilot_api.incoming_request_body",n);let r=$t(t.c.req.header());return r&&bt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&bt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&bt(e,"copilot_api.outgoing_headers",$t(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&bt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function $t(e){let t={};for(let[o,n]of Object.entries(e))yt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}var xt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}};function Tt(e){return e.req.path.startsWith("/v1/messages")}function At(e,t){if(Tt(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||"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 St(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type&&(o.type=t.type),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function Et(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 Ct(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 Ot(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=wt({endpointType:ht(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});vt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}async function It(e,t){if(t instanceof xt&&429===t.response.status)return async function(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=se.completionCallbacks.get(n);r&&(se.logRateLimit(r,t.response),se.completionCallbacks.delete(n)),be.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=At(a,e),s=St(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),Et(o,s),ze(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...Ct(s)}),Ot({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"),ze(_.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=Tt(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 e.json(o,400)}if(o.error("Error occurred:",t),t instanceof xt)return async function(e,t){let n=d.getActiveSpan(),r=await t.response.text(),a=At(r,e),i=St(a);return o.error("HTTP error:",a),n?.setStatus({code:c.ERROR,message:t.message}),n?.recordException(t),n?.setAttribute("copilot_api.error_type","HTTPError"),Et(n,i),ze(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...Ct(i)}),Ot({c:e,error:t,errorText:r,upstream:i}),e.json(a,t.response.status)}(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),ze(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name});let a=Tt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const Pt=async()=>{let e=`${ut}/copilot_internal/v2/token`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Xe({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:pt(X),signal:o.signal});try{if(!t.ok)throw new xt("Failed to get Service token",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function Rt(){let e=`${ut}/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Xe({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${X._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new xt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let Nt=null;function qt(){return Nt||=Pt().then(({token:e})=>{X._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{Nt=null}),Nt}const jt=async()=>{let e=`${it(X)}/models`,t=st(X),o=X.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),o);try{let{response:o,span:r}=await Xe({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new xt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Ke(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const Mt=e=>new Promise(t=>{setTimeout(t,e)}),Dt=e=>null==e;async function Ht(){X.models=await(async()=>{try{return await jt()}catch(e){if(e instanceof xt&&401===e.response.status)return await qt(),jt();throw e}})()}const Bt=()=>{X._v1="1.121.0-insider"};var Ft=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Lt,Ut,Gt,zt,Kt=!1;function Wt(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";X._t1=void 0,clearInterval(Lt),Lt=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),xe.add(1,{reason:r,success:"false"}),Te.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),He.record(performance.now()-a,{reason:r}),ze(_.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 Jt(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;X._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),Te.add(1,{reason:r}),He.record(performance.now()-a,{reason:r}),ze(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Vt=async(e=5,t=1e3,n="scheduled")=>Kt?(o.debug("Token refresh already in progress, coalescing"),Ut):(Kt=!0,Ut=me.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}=await Pt();return X._t1=t,o.debug("Service token refreshed successfully"),X.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),xe.add(1,{reason:n,success:"true"}),He.record(performance.now()-a,{reason:n}),void ze(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof xt&&(401===s.response.status||403===s.response.status))return void Wt({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),xe.add(1,{reason:n,success:"false"}),l)return void Jt({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(),Kt=!1,Ut=void 0}}),Ut);async function Yt(){return!!X._t1||(await Vt(1,0,"on-demand"),!!X._t1)}async function Xt(e){try{let t=await a.readFile(W.GITHUB_TOKEN_PATH,"utf8");if(t&&!e?.force)return X._t2=t,X.showToken&&o.info("Auth token:",t),void await Zt();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=X.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${dt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:mt,scope:ft}),signal:e.signal});if(!t.ok)throw new xt("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 Ft("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=X.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${dt}/login/oauth/access_token`,{method:"POST",headers:et(),body:JSON.stringify({client_id:mt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await Mt(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 Ft("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Ft("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 Mt(t);continue}if(r.access_token)return r.access_token;await Mt(t)}catch(e){if(e instanceof Ft)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await Mt(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(W.GITHUB_TOKEN_PATH,e,{mode:384}))(r),X._t2=r,X.showToken&&o.info("Auth token:",r),await Zt()}catch(e){throw e instanceof xt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Zt(){let e=await Rt();o.success(`Authenticated as ${e.login}`)}async function Qt(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),X.showToken=e.showToken,await J(),await Xt({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 eo=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})=>Qt({verbose:e.verbose,showToken:e["show-token"]})}),to=async()=>{let e=`${ut}/copilot_internal/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Xe({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:pt(X),signal:o.signal});try{if(!t.ok)throw new xt("Failed to get usage",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},oo=e({meta:{name:"check-usage",description:"Show current usage/quota information"},async run(){await J(),await Xt();try{let e=await to(),t=e.quota_snapshots.premium_interactions,n=t.entitlement,r=n-t.remaining,a=n>0?r/n*100:0,i=t.percent_remaining;function s(e,t){if(!t)return`${e}: N/A`;let o=t.entitlement,n=o-t.remaining,r=o>0?n/o*100:0,a=t.percent_remaining;return`${e}: ${n}/${o} used (${r.toFixed(1)}% used, ${a.toFixed(1)}% remaining)`}let l=`Premium: ${r}/${n} used (${a.toFixed(1)}% used, ${i.toFixed(1)}% remaining)`,c=s("Chat",e.quota_snapshots.chat),u=s("Completions",e.quota_snapshots.completions);o.box(`Usage (plan: ${e.copilot_plan})\nQuota resets: ${e.quota_reset_date}\n\nQuotas:\n ${l}\n ${c}\n ${u}`)}catch(p){o.error("Failed to fetch usage:",p),process.exit(1)}}}),no=N(f);async function ro(){let e="win32"===g.platform?"where.exe":"which";try{return await no(e,["tailscale"]),!0}catch{return!1}}async function ao(){try{let{stdout:e}=await no("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function io(e){return e.replace(/\.$/,"")}async function so(){let e=await ao();if(e?.Online)return io(e.DNSName)}const lo=N(f),co=e=>`[1m${e}[0m`,uo=e=>`[2m${e}[0m`,po=e=>`[36m${e}[0m`,mo=e=>`[32m${e}[0m`,fo=e=>`[31m${e}[0m`,ho=e=>`[33m${e}[0m`,go=uo(" ─────────────────────────────────────────────────────────────"),_o=s.join(W.APP_DIR,"certs","tailscale"),yo=s.join(_o,"cert.pem"),ko=s.join(_o,"key.pem"),wo={certDir:_o,certPath:yo,keyPath:ko};function bo(){switch(g.platform){case"darwin":return[` ${uo("Install Tailscale for macOS:")}`,` ${po("https://tailscale.com/download/mac")}`,` ${uo("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${uo("After installing, open the Tailscale app and sign in.")}`,` ${uo("Then re-run this command.")}`].join("\n");case"linux":return[` ${uo("Install Tailscale for Linux:")}`,` ${po("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${po("sudo tailscale up")}`,` ${uo("or")} ${po("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${uo("Install Tailscale for Windows:")}`,` ${po("https://tailscale.com/download/windows")}`,"",` ${uo("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${uo("Install Tailscale:")} ${po("https://tailscale.com/download")}`}}function vo(){let e=[` ${fo("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${uo("Open the Tailscale app from Applications and sign in.")}`,` ${uo("Download:")} ${po("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${uo("Open the Tailscale app and sign in.")}`,` ${uo("Download:")} ${po("https://tailscale.com/download/windows")}`):e.push(` ${uo("Connect with:")} ${po("sudo tailscale up")}`),e.push("",` ${uo("Then re-run this command.")}`),e.join("\n")}async function $o(){try{return await a.access(yo),await a.access(ko),!0}catch{return!1}}function xo(e){console.log(""),console.log(go),console.log(` ${co("Claude Cowork Setup")} ${uo("— Diagnostic")}`),console.log(go),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?mo("✅"):"missing"===n.status?fo("❌"):ho("❓");let r=n.detail?uo(` ${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(` ${mo("All checks passed.")}`):console.log(` ${fo(`${t.length} issue(s).`)} Run ${po("copilot-api cowork-setup install")} to fix.`),console.log("")}const To={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},Ao=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await ro();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return xo(e),console.log(""),console.log(bo()),void console.log("");let o=await ao();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},xo(e),console.log(vo()),void console.log("");let n=io(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await $o();e["tailscale-cert"]=r?{status:"ok",detail:yo}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),xo(e)}(),g.exit(0)}}),install:e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:To},async run({args:e}){await async function(e){if(console.log(""),console.log(go),console.log(` ${co("Claude Cowork Setup")} ${uo("— Install")}`),console.log(go),console.log(""),!await ro())return console.log(` ${fo("Tailscale is not installed.")}`),console.log(""),console.log(bo()),console.log(""),console.log(` ${uo("After installing, run")} ${po("tailscale up")} ${uo("to connect, then re-run this command.")}`),void console.log("");let t=await ao();if(!t||!t.Online)return console.log(vo()),void console.log("");let n=io(t.DNSName);if(console.log(` ${uo("Tailscale hostname:")} ${co(n)}`),console.log(""),console.log(` ${co("Generating TLS certificate via Tailscale…")}`),console.log(` ${uo("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${po(`$ tailscale cert --cert-file ${yo} --key-file ${ko} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(_o,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await lo("tailscale",["cert","--cert-file",yo,"--key-file",ko,n]),console.log(` ${mo("✓ 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(go),console.log(` ${co("Next steps")}`),console.log(go),console.log(""),console.log(` ${co("1.")} Start the proxy:`),console.log(` ${po("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${co("2.")} In Cowork ${uo("→")} Settings ${uo("→")} Inference Provider, set:`),console.log(` ${co("inferenceGatewayBaseUrl")} = ${po(`https://${n}:<port>`)}`),console.log(` ${uo("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${co("3.")} Restart Cowork ${uo("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${uo("For Cowork's own configuration docs, see:")}`),console.log(` ${po("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),revert:e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:To},async run({args:e}){await async function(e){if(console.log(""),console.log(go),console.log(` ${co("Claude Cowork Setup")} ${uo("— Revert")}`),console.log(go),console.log(""),!await $o())return console.log(` ${uo("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${co("Remove Tailscale cert files:")}`),console.log(` ${uo(yo)}`),console.log(` ${uo(ko)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(_o,{recursive:!0}),console.log(` ${mo("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${uo("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}})}});async function So(){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 Eo(){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 Co(){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 Oo(e){let t=await async function(){let[e,t]=await Promise.all([So(),Co()]);return{version:e,runtime:Eo(),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 Io=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})=>Oo({json:e.json})}),Po=[{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"}],Ro="claude-haiku-4.5",No={haiku:Ro,"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 qo(e,t){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 Po)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=No[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 jo=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Mo(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=jo.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=jo.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var Do=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Ho(e){if(!e||"string"!=typeof e)throw new Do("Model name is required and must be a string");if(!X.models?.data)throw new Do("Models not available. Please try again later.",503);let t=X.models.data.map(e=>e.id);if(t.includes(e))return e;let o=qo(e,t);if(!o)throw ve.add(1,{requested_model:e}),new Do(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Bo(e){let t=X.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e)}function Fo(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 Lo(e){if("string"==typeof e)return Fo(e);if(Array.isArray(e))return e.map(e=>Lo(e));if(e&&"object"==typeof e){let t={},o="thinking"===e.type;for(let[n,r]of Object.entries(e))t[n]=!o||"thinking"!==n&&"signature"!==n?Lo(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}const Uo="x-copilot-api-self-test",Go=R();function zo(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),e.estimatedCost&&n.setAttribute("copilot_api.estimated_cost",e.estimatedCost)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();Ve.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(ge.add(1,d),Ne.record(s,d),c>=400&&_e.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&&(ye.add(e.inputTokens,t),Fe.record(e.inputTokens,t)),e.outputTokens&&(ke.add(e.outputTokens,t),Le.record(e.outputTokens,t)),e.cachedTokens&&we.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&se.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const Ko=1048576;const Wo=async()=>me.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),Ge.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Oe.add(1,{result:"rejected"}),new xt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Oe.add(1,{result:"approved"})}finally{e.end()}}),Jo=3e-6,Vo=15e-6;function Yo(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,estimatedCost:t*Jo+o*Vo,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function Xo(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)}async function Zo(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return me.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"),be.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new xt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),be.add(1,{action:"waited",source:"local"}),Me.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await Mt(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function Qo(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 en(e,t,o){return Math.min(Math.max(e,t),o)}function tn(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 tn(JSON.parse(r),t+1)}catch{return null}}function on(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Qo(o.capabilities.supports.min_thinking_budget),r=Qo(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Qo(o.capabilities.limits?.max_output_tokens)??void 0}}function nn(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=en(Qo(e.requestedBudget)??o,o,n),a=Qo(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 rn(e,t){if(Dt(e.thinking_budget))return e;let o=on(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=nn({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 an(e){return"invalid_thinking_budget"===tn(e)}async function sn(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(Dt(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(!an(i))return null;let l=on(n,t.model);return l?function(e,t){let o=nn({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=Qo(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 ln(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 cn(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const un=new Map,pn=new Map,dn=new Set;let mn,fn,hn;function gn(e){return!e.closed&&!e.destroyed}function _n(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 un.set(t,Date.now()),Pe.add(1,{event:"created",origin:e}),ze(_.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=dn.has(t);Pe.add(1,{event:"goaway",origin:e}),ze(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}),pn.delete(t),dn.delete(t),un.delete(t),gn(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function yn(e){if(!X.connectivity.h2)return;mn&&mn!==e&&function(){for(let e of[...pn.keys(),...dn])gn(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});pn.clear(),dn.clear(),un.clear()}(),mn=e;let t=Date.now();for(let[n]of pn)if(t-(un.get(n)??0)>=6e5)pn.delete(n),un.delete(n),gn(n)&&n.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Pe.add(1,{event:"rotated",origin:e}),ze(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(gn(n))return pn.delete(n),dn.add(n),n;pn.delete(n),un.delete(n)}let n=_n(e);return dn.add(n),n}function kn(e){e&&dn.delete(e)&&(gn(e)?pn.set(e,Date.now()):un.delete(e))}function wn(){hn||(hn=setInterval(()=>{!function(){let e=Date.now(),t=X.connectivity.h2Keepalive,n=pn.size;for(let[r,a]of pn)e-a<6e4||t&&n<=1||(pn.delete(r),un.delete(r),n--,gn(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Pe.add(1,{event:"idle_reaped",origin:mn??""}),ze(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${mn}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":mn??""}))}()},3e4),hn.unref())}function bn(){fn||(o.debug("Starting HTTP/2 keepalive (every 45s)"),fn=setInterval(()=>{(async function(){if(0===pn.size&&0===dn.size){if(mn){let e=_n(mn);pn.set(e,Date.now())}return}let e=[...pn.keys()];for(let t of e)pn.delete(t);await Promise.allSettled(e.map(async e=>{if(gn(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:st(X)});await n.dump(),Ie.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),pn.set(e,Date.now())}catch(t){Ie.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Pe.add(1,{event:"error",origin:mn??""}),un.delete(e),gn(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else un.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),fn.unref(),wn())}function vn(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)}async function $n(){return new Promise(e=>setTimeout(e,100))}async function xn(e,t,o){try{if(!e.ok)throw new xt("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&&Xo(t,n.usage),n}catch(e){throw Ke(t,e),e}finally{t.end()}}const Tn=async e=>{let t=Lo(e);try{return await An(t)}catch(e){if(e instanceof xt&&401===e.response.status)return await qt(),An(t);let n;if(e instanceof xt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await sn({payload:t,error:e,models:X.models,errorBodyText:n});if(r)return e instanceof xt&&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 An(Lo(r));throw e}},An=async e=>{if(!X._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)),n=e.messages.some(e=>["assistant","tool"].includes(e.role)),r={...st(X,t),"X-Initiator":n?"agent":"user"},a=it(X),i=`${a}/chat/completions`,s=X.timeoutMs,l=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t))return{...e};let{max_tokens:o,stop:n,...r}=e;return null==o?{...r}:{...r,max_completion_tokens:o}}(e,X.models),c=JSON.stringify(l),u={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":s,"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":e.max_tokens??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":n?"agent":"user"};for(let t=0;t<=1;t++){let n=yn(a),l=new AbortController,p=setTimeout(()=>l.abort(),s);try{let{statusCode:o,headers:a,body:p,span:d}=await Ze({spanName:"copilot POST /chat/completions",url:i,target:"chat_completions",headers:r,body:c,signal:l.signal,headersTimeout:s,bodyTimeout:3*s,extraAttributes:{...u,"copilot_api.h2.retry_attempt":t},dispatcher:n}),m=new Response(p,{status:o,headers:a});if(e.stream){if(!m.ok)throw d.end(),new xt("Failed to create chat completions",m,{outgoingBody:c,outgoingHeaders:r});return{events:D(m),span:d,release:()=>kn(n)}}try{return await xn(m,d,{outgoingBody:c,outgoingHeaders:r})}finally{kn(n)}}catch(e){if(kn(n),vn(e)&&t<1){o.warn(`HTTP/2 connection error during chat completions, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await $n();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function Sn(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 En(e){let t=!0===e.get("isSelfTest");t||await Zo(X);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Ho(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),$e.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 Do)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(e.set("requestData",{model:n.model,streaming:!!n.stream}),X.manualApprove&&!t&&await Wo(),Dt(n.max_tokens)){let e=X.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(n.max_tokens))}n=rn(n,X.models),Dt(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=performance.now(),a=await Tn(n),i=performance.now()-r;if(qe.record(i,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Cn(a)){let t=e.get("requestData")||{};return a.usage&&(t.tokenUsage=Yo(a.usage)),t._d1=i,t.upstreamTtfbMs=i,t.upstreamTotalMs=i,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(a)),e.json(a)}let{events:s,span:l,release:c}=a;return M(e,async t=>{let o={value:null},a=0,u=performance.now(),p=ln(e,r);try{try{for await(let r of s){p();let s=r;r.data&&"[DONE]"!==r.data&&(a++,Ce.add(1,{model:n.model,endpoint_type:"openai"}),s=Sn(r,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Yo(t),n._d1=i,e.set("requestData",n)})),await t.writeSSE(s)}let l=performance.now()-u,c={model:n.model,endpoint_type:"openai"};if(je.record(l,c),Ue.record(a,c),cn(e,r),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Yo(o.value),t._d1=i,e.set("requestData",t))}}catch(t){throw We(l,e.get("requestSpan"),t),t}finally{o.value&&Xo(l,o.value),l.end(),c()}let d=e.get("requestId");d&&se.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Cn=e=>Object.hasOwn(e,"choices"),On=new q;On.post("/",async e=>{try{return await En(e)}catch(t){return await It(e,t)}});const In=new q;In.post("/",async e=>{try{let t=await e.req.json();try{t.model=Ho(t.model)}catch(t){if(t instanceof Do)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=performance.now(),n=await(async e=>{if(!X._t1)throw Error("Service token not found");let t=`${it(X)}/embeddings`,o=st(X),n=X.timeoutMs,r=new AbortController,a=setTimeout(()=>r.abort(),n),i=JSON.stringify(e);try{let{response:n,span:a}=await Xe({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 xt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Ke(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),r=performance.now()-o;qe.record(r,{model:t.model,target:"embeddings",streaming:"false"});let a=e.get("requestData")||{};return a.tokenUsage=Yo(n.usage),a._d1=r,e.set("requestData",a),e.json(n)}catch(t){return await It(e,t)}});const Pn=new q;let Rn=null,Nn=null;Pn.get("/",async e=>{let t,o=function(){let e=X._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=Rn;return t&&e-t.timestamp<3e4?{result:t.result}:Nn||(Nn=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${it(X)}/models`,n=await fetch(t,{method:"GET",headers:st(X),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Rn={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Rn={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),Nn=null}})(),Nn)}();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.35.3",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 qn=new H(F),jn={...B["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Mn(e){return qn.encode(e).length}function Dn(e){let t=0;for(let o of e)switch(o.type){case"text":t+=Mn(o.text)*jn.contentMultiplier;break;case"tool_use":t+=Mn(o.name+JSON.stringify(o.input))*jn.contentMultiplier;break;case"tool_result":o.content&&(t+=Mn("string"==typeof o.content?o.content:JSON.stringify(o.content))*jn.contentMultiplier);break;case"thinking":t+=Mn(o.thinking)*jn.contentMultiplier;break;case"image":t+=1600}return t}function Hn(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?jn.perFirstProp:jn.perAdditionalProp,t+=Mn(o),r.description&&(t+=jn.perPropDesc+Mn(r.description)),r.enum&&Array.isArray(r.enum)){t+=jn.perEnum;for(let e of r.enum)t+=Mn(String(e))}if("object"===r.type&&r.properties&&(t+=jn.perNestedObject,t+=Hn(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=jn.perArrayOfObjects,t+=Hn(e))}}return t}function Bn(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 Fn(e,t,o){let n=Bn(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Ln=async(e,t,n)=>{try{return await Gn(e,t)}catch(r){if(r instanceof xt&&401===r.response.status)return await qt(),Gn(e,t);if(r instanceof xt&&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}`),Gn(i,t)}throw r}};function Un(e){return e.context_management?["context-management-2025-06-27"]:[]}const Gn=async(e,t)=>{if(!X._t1)throw Error("Service token not found");let{metadata:n,...r}=Lo(e),a={...ct(X,t,Un(r)),"X-Initiator":"agent"},i=it(X),s=`${i}/v1/messages`,l=X.timeoutMs,c=JSON.stringify(r),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",...Bn(e,t?.anthropicBeta)}}(r,t,l);for(let e=0;e<=1;e++){let t=yn(i),p=new AbortController,d=setTimeout(()=>p.abort(),l);try{let{statusCode:o,headers:n,body:i,span:d}=await Ze({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:a,body:c,signal:p.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(i,{status:o,headers:n});if(!m.ok)throw d.end(),new xt("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:a});if(r.stream)return{events:D(m),span:d,release:()=>kn(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&&Xo(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(),kn(t)}}catch(n){if(kn(t),vn(n)&&e<1){o.warn(`HTTP/2 connection error during anthropic messages, retrying (attempt ${e+1}): ${n instanceof Error?n.message:String(n)}`),await $n();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function zn(e,t,o){try{if(!e.ok)throw new xt("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&&Xo(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Ke(t,e),e}finally{t.end()}}const Kn=async e=>{try{return await Wn(e)}catch(t){if(t instanceof xt&&401===t.response.status)return await qt(),Wn(e);throw t}},Wn=async e=>{if(!X._t1)throw Error("Service token not found");let t=Lo(e),n={...st(X),"X-Initiator":"agent"},r=it(X),a=`${r}/responses`,i=X.timeoutMs,s=JSON.stringify(t),l={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":i,"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 c=yn(r),u=new AbortController,p=setTimeout(()=>u.abort(),i);try{let{statusCode:o,headers:r,body:p,span:d}=await Ze({spanName:"copilot POST /responses",url:a,target:"responses",headers:n,body:s,signal:u.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:c}),m=new Response(p,{status:o,headers:r});if(t.stream){if(!m.ok)throw d.end(),new xt("Failed to create responses",m,{outgoingBody:s,outgoingHeaders:n});return{events:D(m),span:d,release:()=>kn(c)}}try{return await zn(m,d,{outgoingBody:s,outgoingHeaders:n})}finally{kn(c)}}catch(t){if(kn(c),vn(t)&&e<1){o.warn(`HTTP/2 connection error during responses, retrying (attempt ${e+1}): ${t instanceof Error?t.message:String(t)}`),await $n();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Jn=new Set(["low","medium","high","max","xhigh"]);function Vn(e,t,n){let r=t.includes(e.model)?e.model:qo(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=qo(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=X.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Mo(t,n);if(!r||!Jn.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 Yn(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Xn(e,t){let o={model:e.model,messages:Zn(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:nr(e.tools),tool_choice:rr(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=on(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=Qo(t),a=r&&r>1?r-1:o.min;return en(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=rn({...o,thinking_budget:a},t)}}return o}function Zn(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:Qn(e)}]:[{role:"system",content:Qn(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:or(e.content)});n.length>0&&t.push({role:"user",content:or(n)})}else t.push({role:"user",content:or(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:tr(e.reasoning_text),reasoning_opaque:tr(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:or(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:or(e.content),...t}]}(e));return[...o,...n]}function Qn(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const er=32768;function tr(e){if("string"==typeof e)return e.length<=er?e:e.slice(0,er)}function or(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 nr(e){if(e)return e.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function rr(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 ar(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 ir(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function sr(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 lr=new Set(["low","medium","high","max","xhigh"]);function cr(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&&lr.has(e)?e:null)(Mo(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 ur(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 pr=/[^\w-]/g;function dr(e){return e.replaceAll(pr,"_")}function mr(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=cr(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:ur(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:dr(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:dr(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function fr(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 hr(e){let t={model:e.model,input:_r(e.messages),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)},o=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 o&&(t.instructions=o),e.tools?.length&&(t.tools=e.tools.map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(t.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?t.reasoning={effort:gr(e.output_config?.effort??"high")}:"enabled"===e.thinking?.type&&e.thinking.budget_tokens&&(t.reasoning=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens)),t}function gr(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function _r(e){let t=[];for(let o of e)"user"===o.role?t.push(...yr(o)):t.push(...wr(o));return t}function yr(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(kr(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}`});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 kr(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 wr(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 br(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 vr(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function $r(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 xr(e,t){let o=[];switch(e.type){case"response.created":$r(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":case"response.refusal.done":case"response.reasoning_summary_text.delta":case"response.reasoning_summary_text.done":default:break;case"response.output_item.added":if("function_call"===e.item.type){$r(t,o),vr(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":$r(t,o),vr(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":vr(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":{vr(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:br(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":{$r(t,o),vr(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":$r(t,o),vr(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":$r(t,o),vr(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":$r(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 Tr(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 Ar(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Sr(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&&(Tr(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&&(Tr(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Ar(t,o)),r.content&&(Ar(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){Ar(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&&(Ar(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Yn(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 Er=/structured_outputs|output_config\.format/i;function Cr(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Er.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?mr({...e,model:Ro},o):null}var Or=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Ir=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const Pr={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 Xe({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 Ke(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Ir: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 Xe({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 Ke(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Or:e}finally{clearTimeout(i)}}},Rr=["tavily","exa"];function Nr(e){return"tavily"===e||"exa"===e}function qr(){return X.webSearchProviders.length>0}async function jr(e,t){return async function(e,t,n){let{providers:r,searchFns:a=Pr}=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:X.webSearchProviders})}function Mr(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Dr(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function Hr(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{maxResults:"number"==typeof t?.max_uses?t.max_uses:5,allowedDomains:t?.allowed_domains,blockedDomains:t?.blocked_domains}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!qr())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await jr(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_${Mr()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{type:"web_search_tool_result",tool_use_id:n,content:Dr(e)}];return{id:`msg_ws_${Mr()}`,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_${Mr()}`,r=`msg_ws_${Mr()}`,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:{type:"web_search_tool_result",tool_use_id:n,content:Dr(e)}},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),M(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const Br=(e,t)=>!(!e||!t||e===t);async function Fr(e){let t=await e.req.json();if(function(e){let t=e.tools;if(!t||1!==t.length)return!1;let o=t[0].type;return"string"==typeof o&&o.startsWith("web_search")}(t))return Hr(e,t);await Zo(X),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort;t=function(e,t){return Vn(t,X.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let a=function(e,t){return me.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),Fn(n,t,e.req.header("anthropic-beta"));let r=Ho(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=fr(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),$e.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 Do)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:t.message}},t.statusCode)};throw t}finally{n.end()}})}(e,t);if(!a.ok)return a.response;if(t=a.payload,!X._t1&&!await Yt())return d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503);if(Bo(t.model))return async function(e,t){let r=performance.now(),a=me.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),hr(t)}finally{e.end()}});De.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),X.manualApprove&&await Wo();let i=performance.now(),s=await Kn(a),l=performance.now()-i;if(qe.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Gr(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Yo({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=me.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)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:br(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 De.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return M(e,async t=>{let n=null,r=0,s=performance.now(),d=ln(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++,Ce.add(1,{model:a.model,endpoint_type:"responses"});let c=Lr(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Yo(n),t._d1=l,e.set("requestData",t)}let u=xr(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"};je.record(u,p),Ue.record(r,p),cn(e,i)}catch(t){throw We(u,e.get("requestSpan"),t),t}finally{n&&Xo(u,n),u.end(),p()}let f=e.get("requestId");f&&se.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t,o){let n=mr(t,X.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:Br(o,a),streaming:!!n.stream}),X.manualApprove&&await Wo(),me.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),Fn(t,n,r.anthropicBeta);try{let o=performance.now(),a=await Ln(n,r,{onStructuredOutputFallback:(e,o)=>{let n=Cr(e,o,X.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(qe.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=Yo(zr(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 M(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=ln(e,o);try{try{for await(let e of s)d(),e.data&&"[DONE]"!==e.data?(a++,Ce.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),Kr(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"};je.record(e,t),Ue.record(a,t)}finally{if(cn(e,o),p){let t=zr(u);Xo(l,t);let o=e.get("requestData")||{};o.tokenUsage=Yo(t),e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&se.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Ke(t,e),t.end(),e}})}(e,t,r);let i=performance.now(),s=me.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),Xn(t,X.models)}finally{o.end()}});De.record(performance.now()-i,{direction:"anthropic_to_openai"}),s=rn(s,X.models),o.debug("Translated OpenAI request payload:",s);let l=t.output_config?.effort;e.set("requestData",{model:s.model,reasoningEffort:l,effortClamped:Br(r,l),streaming:!!s.stream});let c=performance.now();X.manualApprove&&await Wo();let u=await Tn(s),p=performance.now()-c;if(qe.record(p,{model:s.model,target:"chat_completions",streaming:String(!!s.stream)}),Ur(u)){let t=e.get("requestData")||{};u.usage&&(t.tokenUsage=Yo(u.usage)),t._d1=p,t.upstreamTtfbMs=p,t.upstreamTotalMs=p,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(u).slice(-400));let r=performance.now(),a=me.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=ir(a.message),i=ar(a.message.content),s=sr(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:Yn(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(u);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 De.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:m,span:f,release:h}=u;return M(e,async t=>{let n=null,r=0,a=performance.now(),i=ln(e,c),l={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of m){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let c;try{c=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,Ce.add(1,{model:s.model,endpoint_type:"anthropic"}),c.usage){n=c.usage;let t=e.get("requestData")||{};t.tokenUsage=Yo(n),t._d1=p,e.set("requestData",t)}let u=Sr(c,l);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()-a,d={model:s.model,endpoint_type:"anthropic"};if(je.record(u,d),Ue.record(r,d),cn(e,c),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Yo(n),t._d1=p,e.set("requestData",t))}}catch(t){throw We(f,e.get("requestSpan"),t),t}finally{n&&Xo(f,n),f.end(),h()}let u=e.get("requestId");u&&se.executeCompletion(u)}finally{e.get("resolveStreamComplete")?.()}})}function Lr(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}const Ur=e=>Object.hasOwn(e,"choices"),Gr=e=>Object.hasOwn(e,"output");function zr(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 Kr(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}const Wr=new q;Wr.post("/",async e=>{try{return await Fr(e)}catch(t){return await It(e,t)}});const Jr=new q;function Vr(e){return me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Ho(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),$e.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 Yr(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=Yo(o),n._d1=t._d1,t.c.set("requestData",n)}Jr.get("/",async e=>{try{X.models||await Ht();let t=X.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 It(e,t)}});const Xr=new Set(["message","function_call","function_call_output"]),Zr=new Set(["type","name","description","parameters"]);async function Qr(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||!qr())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await jr(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function ea(e){if(qr())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Qr(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function ta(e){if(!qr())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 Qr(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function oa(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 na(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&&oa(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)oa(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function ra(e){return null!=e}function aa(e){let t=e.input,o="string"==typeof t?t:t.map(e=>function(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 Xr.has(e.type)||"web_search_call"===e.type?e:null}}(e)).filter(e=>null!==e),n={model:e.model,input:o};for(let t of["instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])ra(e[t])&&(n[t]=e[t]);let r=new Set;if(ra(e.tools)){let t=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))Zr.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);n.tools=t.tools,r=t.customToolNames}if(ra(e.reasoning)&&"object"==typeof e.reasoning){let t=e.reasoning;n.reasoning={},ra(t.effort)&&(n.reasoning.effort=t.effort),ra(t.summary)&&(n.reasoning.summary=t.summary)}if(ra(e.text)&&"object"==typeof e.text){let t=e.text;ra(t.format)&&(n.text={format:t.format})}return{payload:n,customToolNames:r}}async function ia(e){return X._t1||await Yt()?null:(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}async function sa(e){await Zo(X);let{payload:t,customToolNames:n}=aa(await e.req.json()),r=t;o.debug(`Responses API [${Array.isArray(r.input)?r.input.length:1} items]`),n.size>0&&o.debug(`Custom tools detected: ${[...n].join(", ")}`);let a=function(e,t){try{return{ok:!0,payload:Vr(t)}}catch(t){if(t instanceof Do)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,r);if(!a.ok)return a.response;r=a.payload;let i=await ia(e);if(i)return i;e.set("requestData",{model:r.model,reasoningEffort:r.reasoning?.effort,streaming:!!r.stream}),X.manualApprove&&await Wo();let s=performance.now(),l=await Kn(r),c=performance.now()-s;if(qe.record(c,{model:r.model,target:"responses",streaming:String(!!r.stream)}),la(l))return async function(e,t,o){await ea(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Yo({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,l,c);let{events:u,span:p,release:d}=l;return M(e,async t=>{let o={value:null},a=0,i=performance.now(),l=ln(e,s);try{try{for await(let i of u)if(l(),i.data&&"[DONE]"!==i.data){a++;let s=na(i.data,n);s=await ta(s);let l=s===i.data?i:{...i,data:s};Ce.add(1,{model:r.model,endpoint_type:"responses"}),Yr(s,{usageRef:o,c:e,_d1:c}),await t.writeSSE(l)}else await t.writeSSE(i);let p=performance.now()-i,d={model:r.model,endpoint_type:"responses"};je.record(p,d),Ue.record(a,d),cn(e,s)}catch(t){throw We(p,e.get("requestSpan"),t),t}finally{o.value&&Xo(p,o.value),p.end(),d()}let m=e.get("requestId");m&&se.executeCompletion(m)}finally{e.get("resolveStreamComplete")?.()}})}const la=e=>Object.hasOwn(e,"output"),ca=new q;ca.post("/",async e=>{try{return await sa(e)}catch(t){return await It(e,t)}});const ua=new q;ua.get("/",e=>{try{return X.showToken?e.json({token:X._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 pa=new q;pa.get("/",async e=>{try{let t=await to();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const da=new q;da.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=ht(i),p=function(e){return e===Go}(e.req.header(Uo));e.set("requestId",r),e.set("isSelfTest",p),e.header("x-request-id",r);let m=me.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();Ve.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>Ko?t.slice(0,Ko):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||se.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(()=>zo(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{}}):zo(y)}),da.use(j()),da.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()}),da.get("/",e=>e.text("Server running")),da.route("/health",Pn),da.route("/chat/completions",On),da.route("/models",Jr),da.route("/embeddings",In),da.route("/usage",pa),da.route("/token",ua),da.route("/v1/chat/completions",On),da.route("/v1/models",Jr),da.route("/v1/embeddings",In),da.route("/v1/messages",Wr),da.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=jn.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=jn.perMessage+Mn(e)*jn.contentMultiplier}for(let e of t.messages)o+=jn.perMessage,o+=Mn(e.role),"string"==typeof e.content?o+=Mn(e.content)*jn.contentMultiplier:Array.isArray(e.content)&&(o+=Dn(e.content));return t.tools&&t.tools.length>0&&(o+=function(e){let t=jn.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=jn.perTool),t+=Mn(n.name),n.description&&(t+=jn.perDesc+Mn(n.description)),t+=Hn(n.input_schema);return t}(t.tools)),e.json({input_tokens:Math.round(o)})}),da.route("/v1/responses",ca),da.route("/responses",ca);const ma="text-embedding";function fa(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 Fo(o).slice(0,200)}catch{}let t=Fo(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 ha(e={}){let t=performance.now(),o=e.model&&function(e){return(X.models?.data.some(t=>t.id===e)??!1)&&!e.startsWith(ma)&&!Bo(e)}(e.model)?e.model:function(){let e=X.models?.data??[];if(0===e.length)return;let t=e.filter(e=>!e.id.startsWith(ma)&&"embeddings"!==e.capabilities.type&&!Bo(e.id));if(0===t.length)return;let o=t.find(e=>/haiku|mini|flash|nano|small|lite/i.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}();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 da.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[Uo]:Go},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:fa(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)}}const ga=e=>`[1m${e}[0m`,_a=e=>`[2m${e}[0m`,ya=e=>`[32m${e}[0m`,ka=e=>`[31m${e}[0m`,wa=e=>`[33m${e}[0m`,ba=_a(" ─────────────────────────────────────────────────────────────");function va(e,t,o){console.log(` ${function(e){return"ok"===e?ya("✓"):"warn"===e?wa("⚠"):ka("✗")}(e)} ${ga(t.padEnd(14))} ${o}`)}function $a(e){console.log(` ${_a("↳")} ${_a(e)}`)}function xa(e){return e instanceof xt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function Ta(){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 Aa(){try{await Ht();let e=(X.models?.data.length??0)>0;return va(e?"ok":"warn","Model catalog",e?function(){let e=X.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 va("fail","Model catalog",xa(e)),$a("Could not fetch /models — check connectivity/auth."),!1}}async function Sa(e){X.accountType=e.accountType;let t=await So(),o=Eo();if(console.log(""),console.log(` ${ga("COPILOT-API DOCTOR")} ${_a(`v${t}`)}`),console.log(ba),va("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await J(),Bt(),!await async function(){let e=await Ta();if(!e)return va("fail","Auth token","not found"),void $a("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");X._t2=e.token,va("ok","Auth token",`found (${e.source})`);try{let e=await Rt();return await at(X,e.login),va("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return va("fail","GitHub auth",xa(e)),void $a("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(ba),console.log(` ${ka("✗")} ${ga("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await Pt();return X._t1=e,va("ok","Service token","acquired"),!0}catch(e){let t=e instanceof xt?e.response.status:0;return va("fail","Service token",xa(e)),$a(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 Aa();await async function(){try{let e=await to(),t=e.quota_snapshots.premium_interactions;va("ok","Copilot plan",`${e.copilot_plan} · premium ${t.percent_remaining.toFixed(0)}% remaining `+_a(`(resets ${e.quota_reset_date})`))}catch(e){va("warn","Copilot plan",`unavailable (${xa(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await ha();return e.ok?(va("ok","Generation",`works via ${e.model} ${_a(`(${e.durationMs}ms)`)}`),!0):(va("fail","Generation",`${e.reason}${e.status?_a(` [HTTP ${e.status}]`):""}`),!1)}():va("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){va(t,"Client config","potential base-URL issue");for(let t of e)$a(t)}else va("ok","Client config","no base-URL issues detected");$a("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(ba),a?(console.log(` ${ya("✓")} ${ga("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${wa("⚠")} ${ga("Some checks need attention")} — see the ${ka("✗")}/${wa("⚠")} lines above.`),console.log(""),2)}const Ea=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 Sa({accountType:e["account-type"]});g.exit(t)}}),Ca="copilot-api-node20",Oa=`https://registry.npmjs.org/${Ca}/latest`,Ia=e=>`[1m${e}[0m`,Pa=e=>`[33m${e}[0m`;async function Ra(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Oa,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Na(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}function qa(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 ja=e=>`[1m${e}[0m`,Ma=e=>`[2m${e}[0m`,Da=e=>`[36m${e}[0m`,Ha=e=>`[32m${e}[0m`,Ba=e=>`[33m${e}[0m`,Fa=e=>`[4m${e}[0m`,La=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Ua="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Ga="https://github.com/johnib/copilot-api-issues/issues",za=Ma(" ─────────────────────────────────────────────────────────────");function Ka(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Wa(e){return e&&0!==e.length?e.join("·"):"—"}const Ja=[{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"},{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"},{title:"Claude Code's Compaction Engine: What the Source Code Actually Reveals",teaser:"What's actually running beneath every long session.",url:"https://barazany.dev/blog/claude-codes-compaction-engine"}];function Va(e){if(0===e.length)return[];let t=["",za,` ${ja("BARAZANY.DEV")} ${Ma("— Recent Posts")}`,za,""];for(let[o,n]of e.entries()){let e=La(`${n.url}${Ua}`,ja(Fa(`[${o+1}]`)));t.push(` ${e} ${Da(n.title)}`,` ${Ma("→")} ${Ma(n.teaser)}`,"")}return t.push(za,` ${La(`https://barazany.dev/blog${Ua}`,"barazany.dev/blog")}`,za),t}function Ya(e){let t=[];X.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):X.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(Ma(" → "))} ${Ha("✓")}`:Ma("off"),n=["",` ${ja("COPILOT-API")} ${Ma(`v${e.version}`)}`,za,` ${Ma("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Ma("User")} ${e.user} ${Ma("·")} ${e.accountType}`];return X._v1&&n.push(` ${Ma("Client")} VSCode ${X._v1}`),n.push(` ${Ma("Network")} ${t.join(Ma(" · "))}`,` ${Ma("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Ma("Clipboard")} Claude Code command ${Ha("✓")}`),n.push(za),n}function Xa(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${ja("Active")}`];if(e.model){let o=X.models?.data.find(t=>t.id===e.model),n=Ka(o?.capabilities.limits?.max_context_window_tokens),r=Wa(o?.capabilities.supports.reasoning_effort);t.push(` ${Da(e.model.padEnd(32))} ${Ma("ctx")} ${ja(n.padStart(5))} ${Ma("effort")} ${Ma(r)} ${Ba("← main")}`)}if(e.smallModel){let o=X.models?.data.find(t=>t.id===e.smallModel),n=Ka(o?.capabilities.limits?.max_context_window_tokens),r=Wa(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Ma("ctx")} ${n.padStart(5)} ${Ma("effort")} ${Ma(r)} ${Ba("← small")}`)}return t}function Za(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of X.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("",` ${ja(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Da("●"):Ma("·"),i=n?Da(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Ka(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Wa(r.effort)}`;t.push(` ${a} ${i} ${Ma(s)}${Ma(l)}`)}}return t}function Qa(){let e=Ga.replace(/^https:\/\//,""),t=La(`${Ga}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",za,` ${ja("FOUND A BUG?")} ${Ma("— Report it on GitHub")}`,za,"",` ${Da("→")} ${Da(t)}`,` ${Ma("Bug reports, feature requests, and questions welcome.")}`,"",za]}function ei(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=["",za,` ${ja("Claude Cowork")} ${Ma("— Settings → Inference Provider")}`,za,"",` ${Ma("Paste into")} ${ja("inferenceGatewayBaseUrl")}${Ma(":")}`,` ${ja(Da(r))}`];return n||a.push("",` ${Ma("Your Tailscale hostname is shown by:")} ${Da("tailscale status --self")}`),a.push("",` ${Ma("Docs:")} ${Da("https://claude.com/docs/cowork/3p/installation")}`),a}function ti(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",za,` ${ja("HTTPS")} ${Ma("— self-signed cert")}`,za,"",` ${Ma("Cert")} ${t}`];switch(o.push("",` ${ja("Trust this cert")} ${Ma("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${Ma("macOS:")}`,` ${Da("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Da(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Ma("Windows (PowerShell as Administrator):")}`,` ${Da(`Import-Certificate -FilePath "${t}" \``)}`,` ${Da("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Ma("Linux (Debian/Ubuntu):")}`,` ${Da(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Da("sudo update-ca-certificates")}`,` ${Ma("Linux (Fedora/RHEL/Arch):")}`,` ${Da(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Da("sudo update-ca-trust")}`);break;default:o.push(` ${Ma("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Ma("Or, for Node CLIs only (no admin needed):")}`,` ${Da(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,za),o}function oi(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 ni=s.join(W.APP_DIR,"certs"),ri=s.join(ni,"cert.pem"),ai=s.join(ni,"key.pem"),ii=s.join(ni,"cert.meta.json");async function si(e){try{return await a.readFile(e,"utf8")}catch{return}}async function li(e){let t=await si(ri),o=await si(ai),n=await async function(){let e=await si(ii);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 ci(e){return 0!==G(e)}async function ui(e){await a.mkdir(ni,{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)ci(t)?i.add(t):r.add(t);let s=await z([{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:[...[...r].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))]}]});return await a.writeFile(ri,s.cert,{mode:420}),await a.writeFile(ai,s.private,{mode:384}),await async function(e){await a.writeFile(ii,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:s.cert,key:s.private,certPath:ri,keyPath:ai,generated:!0}}const pi=[],di=Date.now();let mi="";function fi(){let e=async(e,t=0)=>{let n=me.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()-di)/1e3}});for(let t of pi)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=La("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",za,` ${ja("COPILOT-API")} ${Ma(`v${e}`)} ${Ma("·")} ${oi(t)} uptime`,za,""," Check in from time to time on",` ${Da(o)}`,"",za,""];console.log(n.join("\n"))}(mi,Date.now()-di),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)})}function hi(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function gi(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=me.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Je({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:hi(t)},runtime:n,identity:{_u1:r.login,machineId:X.machineId,sessionId:X.sessionId,_v1:X._v1},connectivity:X.connectivity,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-di},"copilot_api")});if(X.models?.data)for(let e of X.models.data)a.addEvent("copilot_api.model.available",Je(e,"model"));a.end(),ze(_.INFO,"INFO","Server started",Je({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-di},"copilot_api"))}async function _i(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 li(e)){let e=await si(ri),t=await si(ai);if(e&&t)return{cert:e,key:t,certPath:ri,keyPath:ai,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),ui(e)}(e.httpsHosts)}}async function yi(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=wo;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(fi(),pi.push(()=>{o.debug("Cleaning up connectivity monitor"),Qe.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),Lt&&=void clearInterval(Lt),Gt&&=void Qe.off("online",Gt),zt&&=void Qe.off("offline",zt),Ut=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),fn&&=void clearInterval(fn),hn&&=void clearInterval(hn);let e=[...pn.keys(),...dn];pn.clear(),dn.clear(),un.clear(),mn=void 0;for(let t of e)gn(t)&&(Pe.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!le)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([le.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");X.accountType=t.accountType,X.manualApprove=t.manual,X.rateLimitSeconds=t.rateLimit,X.rateLimitWait=t.rateLimitWait,X.showToken=t.showToken,X.timeoutMs=t.timeout,X.connectivity.timeoutMs=t.connectTimeout,X.webSearchProviders=t.webSearchProviders,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;X.connectivity.h2=t,X.connectivity.h2Keepalive=e}(),await J(),Bt();let n=await So();mi=n;let r=Eo();(function(e,t){t&&(ue=t),ce=crypto.randomUUID();let o=v({[S]:"copilot-api",[E]:e,[A]:ce}),{endpoint:n,headers:r}=de();le=new T({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new x({exporter:new w({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new $(new k({url:`${n}/v1/logs`,headers:r}))],instrumentations:[]}),le.start()})(n,di),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?(X._t2=i,o.info("Using provided Auth token")):await Xt();try{a=await Rt(),await at(X,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 Pt();X._t1=e,o.debug("Service token fetched successfully!"),X.showToken&&o.info("Service token:",e),Lt=setInterval(()=>{Vt(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),Qe.start(),Gt=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Vt(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},zt=()=>{o.debug("Network connectivity lost")},Qe.on("online",Gt),Qe.on("offline",zt)})(),await async function(){try{return await Ht(),!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(()=>{Ht().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{Ht().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)}}();pi.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),X.connectivity.h2&&(kn(yn(it(X))),X.connectivity.h2Keepalive&&bn()),gi({options:t,version:n,runtime:r,_u1:a});let l=await _i(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await async function(e,t,n){if(!e._cc1)return!1;let r,a;if(X.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)),e.model&&e.smallModel){let t=X.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}`);if(!t.includes(e.smallModel))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid small model: ${e.smallModel}`);r=e.model,a=e.smallModel}else{if(e.model||e.smallModel)throw Error("Both --model and --small-model must be specified for model selection");r=await o.prompt("Select a model to use",{type:"select",options:X.models.data.map(e=>e.id)}),a=await o.prompt("Select a small model to use",{type:"select",options:X.models.data.map(e=>e.id)})}let i=qa({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(i),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(i),!1}}(t,u,l)||await async function(e,t,n){if(!e.codex)return!1;let r;if(X.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=X.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:X.models.data.map(e=>e.id)});let a=qa({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=[...Ya(e),...Xa(e),...Za(e),...Qa(),"",...Va(Ja),...ei(e),...ti(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 so()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),U({fetch:da.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 ha({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: ${Fo(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 ki(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const wi=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"},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:ki(t,"--rate-limit"),r=e.timeout,a=void 0===r?Y:ki(r,"--timeout"),i=e["connect-timeout"]??g.env.COPILOT_CONNECT_TIMEOUT_MS,s=void 0===i?15e3:ki(i,"--connect-timeout");if(s<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${s}`);let l=e["https-hosts"],c=l?l.split(",").map(e=>e.trim()).filter(Boolean):[],u=e["web-search-provider"]??g.env.WEB_SEARCH_PROVIDER,p=u?u.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 d=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!Nr(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${Rr.join(", ")}`);let r=n.length>0?n:Rr,a=new Set,i=n.length>0,s=[];for(let e of r){if(!Nr(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:p}),m=(g.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),f=""!==m&&"0"!==m&&"false"!==m;return yi({port:ki(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:s,webSearchProviders:d,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:c,claudeCowork:e["claude-cowork"],smokeTest:e["smoke-test"]&&!f})}});await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([So(),Ra()]);if("unknown"===e||!t||!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}(e,t))return;!function(e,t){let o=`npx ${Ca}@latest`,n=Pa("│"),r=` ${Ia("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${Ia(o)} to update`,i=" ".repeat(54),s=Pa(`╭${"─".repeat(54)}╮`),l=Pa(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${Na(r,54)}${n}`,`${n}${i}${n}`,`${n}${Na(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(e,t)}catch{}}(),await t(e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:eo,start:wi,"check-usage":oo,debug:Io,doctor:Ea,"cowork-setup":Ao}}));export{};
|