copilot-api-node20 0.34.0 → 0.34.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -98,19 +98,23 @@ npx copilot-api-node20@latest start --codex --model gpt-5.3-codex
98
98
  Configure `~/.codex/config.toml`:
99
99
 
100
100
  ```toml
101
- model = "gpt-5.3-codex"
101
+ model = "gpt-5.5"
102
102
  model_provider = "local"
103
103
 
104
104
  [model_providers.local]
105
105
  name = "Local Server"
106
106
  base_url = "http://localhost:4141/v1"
107
- env_key = "OPENAI_API_KEY"
107
+ wire_api = "responses"
108
+ requires_openai_auth = false
109
+
110
+ [model_providers.local.http_headers]
111
+ Authorization = "Bearer dummy"
108
112
  ```
109
113
 
110
114
  Then run:
111
115
 
112
116
  ```bash
113
- OPENAI_API_KEY=dummy codex
117
+ codex
114
118
  ```
115
119
 
116
120
  ### Web Search
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 b}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as w}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as T}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as A,ATTR_SERVICE_NAME as S,ATTR_SERVICE_VERSION as E}from"@opentelemetry/semantic-conventions";import{Client as C,request as O}from"undici";import{createHash as I,randomBytes as P,randomUUID as q}from"node:crypto";import{promisify as N}from"node:util";import{accessSync as R}from"node:fs";import{serve as j}from"srvx";import{isIP as D}from"node:net";import{generate as M}from"selfsigned";import{Hono as H}from"hono";import{cors as B}from"hono/cors";import{streamSSE as F}from"hono/streaming";import{events as U}from"fetch-event-stream";import{Tokenizer as L,models as z}from"ai-tokenizer";import*as G from"ai-tokenizer/encoding/claude";const J=s.join(i.homedir(),".local","share","copilot-api"),K={APP_DIR:J,GITHUB_TOKEN_PATH:s.join(J,"github_token"),MACHINE_ID_PATH:s.join(J,"machine_id"),SESSION_ID_PATH:s.join(J,"session_id")};async function W(){await a.mkdir(K.APP_DIR,{recursive:!0}),await V(K.GITHUB_TOKEN_PATH),await V(K.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),Ge(_.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"}),be=fe.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),we=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"}),xe=fe.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Te=fe.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),$e=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"}),qe=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"}),Re=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"}),De=fe.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Me=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"}),Ue=fe.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Le=fe.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),ze=fe.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function Ge(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 Je(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 Ke(e,t,o){Je(e,o),t&&t!==e&&Je(t,o)}function We(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,We(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 Je(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 Je(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"}),Ge(_.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"}),Ge(_.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`${K.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=I("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},at=async(e,t)=>{e.machineId||=await rt(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(K.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=q();return await a.writeFile(K.SESSION_ID_PATH,e),await a.chmod(K.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=q(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":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":q(),"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&&lt.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 bt(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 wt(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",qe.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&&wt(e,"copilot_api.incoming_request_body",n);let r=xt(t.c.req.header());return r&&wt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&wt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&wt(e,"copilot_api.outgoing_headers",xt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&wt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function xt(e){let t={};for(let[o,n]of Object.entries(e))yt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}var Tt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}};function $t(e){return e.req.path.startsWith("/v1/messages")}function At(e,t){if($t(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=bt({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 Tt&&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)),we.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),Ge(_.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"),Ge(_.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=$t(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 Tt)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),Ge(_.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),Ge(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name});let a=$t(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 Tt("Failed to get Service token",t);return await t.json()}catch(e){throw Je(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function qt(){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 Tt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Je(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let Nt=null;function Rt(){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 Tt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Je(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const Dt=e=>new Promise(t=>{setTimeout(t,e)}),Mt=e=>null==e;async function Ht(){X.models=await(async()=>{try{return await jt()}catch(e){if(e instanceof Tt&&401===e.response.status)return await Rt(),jt();throw e}})()}var Bt=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Ft,Ut,Lt,zt,Gt=!1;function Jt(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(Ft),Ft=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Te.add(1,{reason:r,success:"false"}),$e.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}),Ge(_.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 Kt(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),$e.add(1,{reason:r}),He.record(performance.now()-a,{reason:r}),Ge(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Wt=async(e=5,t=1e3,n="scheduled")=>Gt?(o.debug("Token refresh already in progress, coalescing"),Ut):(Gt=!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),Te.add(1,{reason:n,success:"true"}),He.record(performance.now()-a,{reason:n}),void Ge(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Tt&&(401===s.response.status||403===s.response.status))return void Jt({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),Te.add(1,{reason:n,success:"false"}),l)return void Kt({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(),Gt=!1,Ut=void 0}}),Ut);async function Vt(e){try{let t=await a.readFile(K.GITHUB_TOKEN_PATH,"utf8");if(t&&!e?.force)return X._t2=t,X.showToken&&o.info("Auth token:",t),void await Yt();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 Tt("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 Bt("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 Dt(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 Bt("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Bt("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 Dt(t);continue}if(r.access_token)return r.access_token;await Dt(t)}catch(e){if(e instanceof Bt)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await Dt(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(K.GITHUB_TOKEN_PATH,e,{mode:384}))(r),X._t2=r,X.showToken&&o.info("Auth token:",r),await Yt()}catch(e){throw e instanceof Tt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Yt(){let e=await qt();o.success(`Authenticated as ${e.login}`)}async function Xt(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),X.showToken=e.showToken,await W(),await Vt({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 Zt=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})=>Xt({verbose:e.verbose,showToken:e["show-token"]})}),Qt=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 Tt("Failed to get usage",t);return await t.json()}catch(e){throw Je(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},eo=e({meta:{name:"check-usage",description:"Show current usage/quota information"},async run(){await W(),await Vt();try{let e=await Qt(),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)}}}),to=N(f);async function oo(){let e="win32"===g.platform?"where.exe":"which";try{return await to(e,["tailscale"]),!0}catch{return!1}}async function no(){try{let{stdout:e}=await to("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function ro(e){return e.replace(/\.$/,"")}async function ao(){let e=await no();if(e?.Online)return ro(e.DNSName)}const io=N(f),so=e=>`${e}`,lo=e=>`${e}`,co=e=>`${e}`,uo=e=>`${e}`,po=e=>`${e}`,mo=e=>`${e}`,fo=lo(" ─────────────────────────────────────────────────────────────"),ho=s.join(K.APP_DIR,"certs","tailscale"),go=s.join(ho,"cert.pem"),_o=s.join(ho,"key.pem"),yo={certDir:ho,certPath:go,keyPath:_o};function ko(){switch(g.platform){case"darwin":return[` ${lo("Install Tailscale for macOS:")}`,` ${co("https://tailscale.com/download/mac")}`,` ${lo("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${lo("After installing, open the Tailscale app and sign in.")}`,` ${lo("Then re-run this command.")}`].join("\n");case"linux":return[` ${lo("Install Tailscale for Linux:")}`,` ${co("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${co("sudo tailscale up")}`,` ${lo("or")} ${co("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${lo("Install Tailscale for Windows:")}`,` ${co("https://tailscale.com/download/windows")}`,"",` ${lo("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${lo("Install Tailscale:")} ${co("https://tailscale.com/download")}`}}function bo(){let e=[` ${po("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${lo("Open the Tailscale app from Applications and sign in.")}`,` ${lo("Download:")} ${co("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${lo("Open the Tailscale app and sign in.")}`,` ${lo("Download:")} ${co("https://tailscale.com/download/windows")}`):e.push(` ${lo("Connect with:")} ${co("sudo tailscale up")}`),e.push("",` ${lo("Then re-run this command.")}`),e.join("\n")}async function wo(){try{return await a.access(go),await a.access(_o),!0}catch{return!1}}function vo(e){console.log(""),console.log(fo),console.log(` ${so("Claude Cowork Setup")} ${lo("— Diagnostic")}`),console.log(fo),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?uo("✅"):"missing"===n.status?po("❌"):mo("❓");let r=n.detail?lo(` ${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(` ${uo("All checks passed.")}`):console.log(` ${po(`${t.length} issue(s).`)} Run ${co("copilot-api cowork-setup install")} to fix.`),console.log("")}const xo={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},To=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 oo();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return vo(e),console.log(""),console.log(ko()),void console.log("");let o=await no();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},vo(e),console.log(bo()),void console.log("");let n=ro(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await wo();e["tailscale-cert"]=r?{status:"ok",detail:go}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),vo(e)}(),g.exit(0)}}),install:e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:xo},async run({args:e}){await async function(e){if(console.log(""),console.log(fo),console.log(` ${so("Claude Cowork Setup")} ${lo("— Install")}`),console.log(fo),console.log(""),!await oo())return console.log(` ${po("Tailscale is not installed.")}`),console.log(""),console.log(ko()),console.log(""),console.log(` ${lo("After installing, run")} ${co("tailscale up")} ${lo("to connect, then re-run this command.")}`),void console.log("");let t=await no();if(!t||!t.Online)return console.log(bo()),void console.log("");let n=ro(t.DNSName);if(console.log(` ${lo("Tailscale hostname:")} ${so(n)}`),console.log(""),console.log(` ${so("Generating TLS certificate via Tailscale…")}`),console.log(` ${lo("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${co(`$ tailscale cert --cert-file ${go} --key-file ${_o} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(ho,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await io("tailscale",["cert","--cert-file",go,"--key-file",_o,n]),console.log(` ${uo("✓ 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(fo),console.log(` ${so("Next steps")}`),console.log(fo),console.log(""),console.log(` ${so("1.")} Start the proxy:`),console.log(` ${co("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${so("2.")} In Cowork ${lo("→")} Settings ${lo("→")} Inference Provider, set:`),console.log(` ${so("inferenceGatewayBaseUrl")} = ${co(`https://${n}:<port>`)}`),console.log(` ${lo("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${so("3.")} Restart Cowork ${lo("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${lo("For Cowork's own configuration docs, see:")}`),console.log(` ${co("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:xo},async run({args:e}){await async function(e){if(console.log(""),console.log(fo),console.log(` ${so("Claude Cowork Setup")} ${lo("— Revert")}`),console.log(fo),console.log(""),!await wo())return console.log(` ${lo("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${so("Remove Tailscale cert files:")}`),console.log(` ${lo(go)}`),console.log(` ${lo(_o)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(ho,{recursive:!0}),console.log(` ${uo("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${lo("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}})}});async function $o(){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 Ao(){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 So(){try{return!!(await a.stat(K.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(K.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Eo(e){let t=await async function(){let[e,t]=await Promise.all([$o(),So()]);return{version:e,runtime:Ao(),paths:{APP_DIR:K.APP_DIR,GITHUB_TOKEN_PATH:K.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const Co=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})=>Eo({json:e.json})}),Oo="copilot-api-node20",Io=`https://registry.npmjs.org/${Oo}/latest`,Po=e=>`${e}`,qo=e=>`${e}`;async function No(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Io,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Ro(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}const jo=new Map,Do=new Map,Mo=new Set;let Ho,Bo,Fo;function Uo(e){return!e.closed&&!e.destroyed}function Lo(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 jo.set(t,Date.now()),Pe.add(1,{event:"created",origin:e}),Ge(_.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=Mo.has(t);Pe.add(1,{event:"goaway",origin:e}),Ge(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}),Do.delete(t),Mo.delete(t),jo.delete(t),Uo(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function zo(e){if(!X.connectivity.h2)return;Ho&&Ho!==e&&function(){for(let e of[...Do.keys(),...Mo])Uo(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Do.clear(),Mo.clear(),jo.clear()}(),Ho=e;let t=Date.now();for(let[n]of Do)if(t-(jo.get(n)??0)>=6e5)Do.delete(n),jo.delete(n),Uo(n)&&n.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Pe.add(1,{event:"rotated",origin:e}),Ge(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Uo(n))return Do.delete(n),Mo.add(n),n;Do.delete(n),jo.delete(n)}let n=Lo(e);return Mo.add(n),n}function Go(e){e&&Mo.delete(e)&&(Uo(e)?Do.set(e,Date.now()):jo.delete(e))}function Jo(){Fo||(Fo=setInterval(()=>{!function(){let e=Date.now(),t=X.connectivity.h2Keepalive,n=Do.size;for(let[r,a]of Do)e-a<6e4||t&&n<=1||(Do.delete(r),jo.delete(r),n--,Uo(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Pe.add(1,{event:"idle_reaped",origin:Ho??""}),Ge(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${Ho}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Ho??""}))}()},3e4),Fo.unref())}function Ko(){Bo||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Bo=setInterval(()=>{(async function(){if(0===Do.size&&0===Mo.size){if(Ho){let e=Lo(Ho);Do.set(e,Date.now())}return}let e=[...Do.keys()];for(let t of e)Do.delete(t);await Promise.allSettled(e.map(async e=>{if(Uo(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}`),Do.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:Ho??""}),jo.delete(e),Uo(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else jo.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Bo.unref(),Jo())}function Wo(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 Vo=e=>`${e}`,Yo=e=>`${e}`,Xo=e=>`${e}`,Zo=e=>`${e}`,Qo=e=>`${e}`,en=e=>`${e}`,tn=(e,t)=>`]8;;${e}\\${t}]8;;\\`,on="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",nn="https://github.com/johnib/copilot-api-issues/issues",rn=Yo(" ─────────────────────────────────────────────────────────────");function an(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function sn(e){return e&&0!==e.length?e.join("·"):"—"}const ln=[{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 cn(e){if(0===e.length)return[];let t=["",rn,` ${Vo("BARAZANY.DEV")} ${Yo("— Recent Posts")}`,rn,""];for(let[o,n]of e.entries()){let e=tn(`${n.url}${on}`,Vo(en(`[${o+1}]`)));t.push(` ${e} ${Xo(n.title)}`,` ${Yo("→")} ${Yo(n.teaser)}`,"")}return t.push(rn,` ${tn(`https://barazany.dev/blog${on}`,"barazany.dev/blog")}`,rn),t}function un(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(Yo(" → "))} ${Zo("✓")}`:Yo("off"),n=["",` ${Vo("COPILOT-API")} ${Yo(`v${e.version}`)}`,rn,` ${Yo("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Yo("User")} ${e.user} ${Yo("·")} ${e.accountType}`];return X._v1&&n.push(` ${Yo("Client")} VSCode ${X._v1}`),n.push(` ${Yo("Network")} ${t.join(Yo(" · "))}`,` ${Yo("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Yo("Clipboard")} Claude Code command ${Zo("✓")}`),n.push(rn),n}function pn(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Vo("Active")}`];if(e.model){let o=X.models?.data.find(t=>t.id===e.model),n=an(o?.capabilities.limits?.max_context_window_tokens),r=sn(o?.capabilities.supports.reasoning_effort);t.push(` ${Xo(e.model.padEnd(32))} ${Yo("ctx")} ${Vo(n.padStart(5))} ${Yo("effort")} ${Yo(r)} ${Qo("← main")}`)}if(e.smallModel){let o=X.models?.data.find(t=>t.id===e.smallModel),n=an(o?.capabilities.limits?.max_context_window_tokens),r=sn(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Yo("ctx")} ${n.padStart(5)} ${Yo("effort")} ${Yo(r)} ${Qo("← small")}`)}return t}function dn(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("",` ${Vo(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Xo("●"):Yo("·"),i=n?Xo(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?an(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${sn(r.effort)}`;t.push(` ${a} ${i} ${Yo(s)}${Yo(l)}`)}}return t}function mn(){let e=nn.replace(/^https:\/\//,""),t=tn(`${nn}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",rn,` ${Vo("FOUND A BUG?")} ${Yo("— Report it on GitHub")}`,rn,"",` ${Xo("→")} ${Xo(t)}`,` ${Yo("Bug reports, feature requests, and questions welcome.")}`,"",rn]}function fn(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=["",rn,` ${Vo("Claude Cowork")} ${Yo("— Settings → Inference Provider")}`,rn,"",` ${Yo("Paste into")} ${Vo("inferenceGatewayBaseUrl")}${Yo(":")}`,` ${Vo(Xo(r))}`];return n||a.push("",` ${Yo("Your Tailscale hostname is shown by:")} ${Xo("tailscale status --self")}`),a.push("",` ${Yo("Docs:")} ${Xo("https://claude.com/docs/cowork/3p/installation")}`),a}function hn(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",rn,` ${Vo("HTTPS")} ${Yo("— self-signed cert")}`,rn,"",` ${Yo("Cert")} ${t}`];switch(o.push("",` ${Vo("Trust this cert")} ${Yo("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${Yo("macOS:")}`,` ${Xo("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Xo(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Yo("Windows (PowerShell as Administrator):")}`,` ${Xo(`Import-Certificate -FilePath "${t}" \``)}`,` ${Xo("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Yo("Linux (Debian/Ubuntu):")}`,` ${Xo(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Xo("sudo update-ca-certificates")}`,` ${Yo("Linux (Fedora/RHEL/Arch):")}`,` ${Xo(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Xo("sudo update-ca-trust")}`);break;default:o.push(` ${Yo("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Yo("Or, for Node CLIs only (no admin needed):")}`,` ${Xo(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,rn),o}function gn(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 _n=s.join(K.APP_DIR,"certs"),yn=s.join(_n,"cert.pem"),kn=s.join(_n,"key.pem"),bn=s.join(_n,"cert.meta.json");async function wn(e){try{return await a.readFile(e,"utf8")}catch{return}}async function vn(e){let t=await wn(yn),o=await wn(kn),n=await async function(){let e=await wn(bn);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 xn(e){return 0!==D(e)}async function Tn(e){await a.mkdir(_n,{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)xn(t)?i.add(t):r.add(t);let s=await M([{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(yn,s.cert,{mode:420}),await a.writeFile(kn,s.private,{mode:384}),await async function(e){await a.writeFile(bn,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:s.cert,key:s.private,certPath:yn,keyPath:kn,generated:!0}}var $n=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var An=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const Sn={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 o.error(`Tavily API error (${e.status}):`,t),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 Je(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new An: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 o.error(`Exa API error (${e.status}):`,t),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 Je(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new $n:e}finally{clearTimeout(i)}}},En=["tavily","exa"];function Cn(e){return"tavily"===e||"exa"===e}function On(){return X.webSearchProviders.length>0}async function In(e,t){return async function(e,t,n){let r,{providers:a,searchFns:i=Sn}=n;if(0===a.length)throw Error("No web search provider configured");for(let[n,s]of a.entries())try{return await i[s.name](s.key,e,t)}catch(e){r=e,n!==a.length-1&&o.warn(`Web search via "${s.name}" failed, falling over to "${a[n+1].name}":`,e)}throw r instanceof Error?r:Error("All web search providers failed")}(e,t,{providers:X.webSearchProviders})}function Pn(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,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),Ue.record(e.outputTokens,t)),e.cachedTokens&&be.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 qn=1048576;const Nn=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),ze.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Oe.add(1,{result:"rejected"}),new Tt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Oe.add(1,{result:"approved"})}finally{e.end()}}),Rn=3e-6,jn=15e-6;function Dn(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*Rn+o*jn,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function Mn(e,t){void 0!==t.prompt_tokens&&e.setAttribute("copilot_api.input_tokens",t.prompt_tokens),void 0!==t.completion_tokens&&e.setAttribute("copilot_api.output_tokens",t.completion_tokens),void 0!==t.total_tokens&&e.setAttribute("copilot_api.total_tokens",t.total_tokens)}const Hn=[{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"}],Bn="claude-haiku-4.5",Fn={haiku:Bn,"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 Un(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 Hn)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=Fn[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 Ln=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function zn(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=Ln.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=Ln.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var Gn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Jn(e){if(!e||"string"!=typeof e)throw new Gn("Model name is required and must be a string");if(!X.models?.data)throw new Gn("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=Un(e,t);if(!o)throw ve.add(1,{requested_model:e}),new Gn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}async function Kn(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"),we.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Tt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),we.add(1,{action:"waited",source:"local"}),De.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await Dt(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function Wn(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 Vn(e,t,o){return Math.min(Math.max(e,t),o)}function Yn(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 Yn(JSON.parse(r),t+1)}catch{return null}}function Xn(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Wn(o.capabilities.supports.min_thinking_budget),r=Wn(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Wn(o.capabilities.limits?.max_output_tokens)??void 0}}function Zn(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Vn(Wn(e.requestedBudget)??o,o,n),a=Wn(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 Qn(e,t){if(Mt(e.thinking_budget))return e;let o=Xn(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Zn({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 er(e){return"invalid_thinking_budget"===Yn(e)}async function tr(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(Mt(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(!er(i))return null;let l=Xn(n,t.model);return l?function(e,t){let o=Zn({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=Wn(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 or(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 nr(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}function rr(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 ar(){return new Promise(e=>setTimeout(e,100))}function ir(e){if("string"==typeof e)return function(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,"")}(e);if(Array.isArray(e))return e.map(e=>ir(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?ir(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}async function sr(e,t,o){try{if(!e.ok)throw new Tt("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&&Mn(t,n.usage),n}catch(e){throw Je(t,e),e}finally{t.end()}}const lr=async e=>{let t=ir(e);try{return await cr(t)}catch(e){if(e instanceof Tt&&401===e.response.status)return await Rt(),cr(t);let n;if(e instanceof Tt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await tr({payload:t,error:e,models:X.models,errorBodyText:n});if(r)return e instanceof Tt&&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 cr(ir(r));throw e}},cr=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,...n}=e;return null==o?{...n}:{...n,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=zo(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 Tt("Failed to create chat completions",m,{outgoingBody:c,outgoingHeaders:r});return{events:U(m),span:d,release:()=>Go(n)}}try{return await sr(m,d,{outgoingBody:c,outgoingHeaders:r})}finally{Go(n)}}catch(e){if(Go(n),rr(e)&&t<1){o.warn(`HTTP/2 connection error during chat completions, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await ar();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function ur(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 pr(e){await Kn(X);let t=await e.req.json();o.debug("Request payload:",JSON.stringify(t).slice(-400));try{t=function(e){return me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Jn(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),xe.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}(t)}catch(t){if(t instanceof Gn)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:t.model,streaming:!!t.stream}),X.manualApprove&&await Nn(),Mt(t.max_tokens)){let e=X.models?.data.find(e=>e.id===t.model);t={...t,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(t.max_tokens))}t=Qn(t,X.models),Mt(t.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(t.thinking_budget));let n=performance.now(),r=await lr(t),a=performance.now()-n;if(Re.record(a,{model:t.model,target:"chat_completions",streaming:String(!!t.stream)}),dr(r)){let t=e.get("requestData")||{};return r.usage&&(t.tokenUsage=Dn(r.usage)),t._d1=a,t.upstreamTtfbMs=a,t.upstreamTotalMs=a,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(r)),e.json(r)}let{events:i,span:s,release:l}=r;return F(e,async o=>{let r={value:null},c=0,u=performance.now(),p=or(e,n);try{try{for await(let n of i){p();let i=n;n.data&&"[DONE]"!==n.data&&(c++,Ce.add(1,{model:t.model,endpoint_type:"openai"}),i=ur(n,t=>{r.value=t;let o=e.get("requestData")||{};o.tokenUsage=Dn(t),o._d1=a,e.set("requestData",o)})),await o.writeSSE(i)}let s=performance.now()-u,l={model:t.model,endpoint_type:"openai"};if(je.record(s,l),Le.record(c,l),nr(e,n),r.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Dn(r.value),t._d1=a,e.set("requestData",t))}}catch(t){throw Ke(s,e.get("requestSpan"),t),t}finally{r.value&&Mn(s,r.value),s.end(),l()}let d=e.get("requestId");d&&se.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const dr=e=>Object.hasOwn(e,"choices"),mr=new H;mr.post("/",async e=>{try{return await pr(e)}catch(t){return await It(e,t)}});const fr=new H;fr.post("/",async e=>{try{let t=await e.req.json();try{t.model=Jn(t.model)}catch(t){if(t instanceof Gn)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 Tt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Je(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),r=performance.now()-o;Re.record(r,{model:t.model,target:"embeddings",streaming:"false"});let a=e.get("requestData")||{};return a.tokenUsage=Dn(n.usage),a._d1=r,e.set("requestData",a),e.json(n)}catch(t){return await It(e,t)}});const hr=new H;let gr=null,_r=null;hr.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=gr;return t&&e-t.timestamp<3e4?{result:t.result}:_r||(_r=(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 gr={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return gr={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),_r=null}})(),_r)}();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.34.0",timestamp:(new Date).toISOString()};void 0!==n.latencyMs&&(r.upstream_latency_ms=n.latencyMs);let a="ok"===t?200:503;return e.json(r,a)});const yr=new L(G),kr={...z["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function br(e){return yr.encode(e).length}function wr(e){let t=0;for(let o of e)switch(o.type){case"text":t+=br(o.text)*kr.contentMultiplier;break;case"tool_use":t+=br(o.name+JSON.stringify(o.input))*kr.contentMultiplier;break;case"tool_result":o.content&&(t+=br("string"==typeof o.content?o.content:JSON.stringify(o.content))*kr.contentMultiplier);break;case"thinking":t+=br(o.thinking)*kr.contentMultiplier;break;case"image":t+=1600}return t}function vr(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?kr.perFirstProp:kr.perAdditionalProp,t+=br(o),r.description&&(t+=kr.perPropDesc+br(r.description)),r.enum&&Array.isArray(r.enum)){t+=kr.perEnum;for(let e of r.enum)t+=br(String(e))}if("object"===r.type&&r.properties&&(t+=kr.perNestedObject,t+=vr(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=kr.perArrayOfObjects,t+=vr(e))}}return t}function xr(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 Tr(e,t,o){let n=xr(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const $r=async(e,t,n)=>{try{return await Sr(e,t)}catch(r){if(r instanceof Tt&&401===r.response.status)return await Rt(),Sr(e,t);if(r instanceof Tt&&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}`),Sr(i,t)}throw r}};function Ar(e){return e.context_management?["context-management-2025-06-27"]:[]}const Sr=async(e,t)=>{if(!X._t1)throw Error("Service token not found");let{metadata:n,...r}=ir(e),a={...ct(X,t,Ar(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",...xr(e,t?.anthropicBeta)}}(r,t,l);for(let e=0;e<=1;e++){let t=zo(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 Tt("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:a});if(r.stream)return{events:U(m),span:d,release:()=>Go(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&&Mn(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(),Go(t)}}catch(n){if(Go(t),rr(n)&&e<1){o.warn(`HTTP/2 connection error during anthropic messages, retrying (attempt ${e+1}): ${n instanceof Error?n.message:String(n)}`),await ar();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Er(e,t,o){try{if(!e.ok)throw new Tt("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&&Mn(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Je(t,e),e}finally{t.end()}}const Cr=async e=>{try{return await Or(e)}catch(t){if(t instanceof Tt&&401===t.response.status)return await Rt(),Or(e);throw t}},Or=async e=>{if(!X._t1)throw Error("Service token not found");let t=ir(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=zo(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 Tt("Failed to create responses",m,{outgoingBody:s,outgoingHeaders:n});return{events:U(m),span:d,release:()=>Go(c)}}try{return await Er(m,d,{outgoingBody:s,outgoingHeaders:n})}finally{Go(c)}}catch(t){if(Go(c),rr(t)&&e<1){o.warn(`HTTP/2 connection error during responses, retrying (attempt ${e+1}): ${t instanceof Error?t.message:String(t)}`),await ar();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Ir=new Set(["low","medium","high","max","xhigh"]);function Pr(e,t,n){let r=t.includes(e.model)?e.model:Un(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=Un(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=zn(t,n);if(!r||!Ir.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 qr(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Nr(e,t){let o={model:e.model,messages:Rr(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:Br(e.tools),tool_choice:Fr(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Xn(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=Wn(t),a=r&&r>1?r-1:o.min;return Vn(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Qn({...o,thinking_budget:a},t)}}return o}function Rr(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:jr(e)}]:[{role:"system",content:jr(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:Hr(e.content)});n.length>0&&t.push({role:"user",content:Hr(n)})}else t.push({role:"user",content:Hr(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:Mr(e.reasoning_text),reasoning_opaque:Mr(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Hr(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:Hr(e.content),...t}]}(e));return[...o,...n]}function jr(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const Dr=32768;function Mr(e){if("string"==typeof e)return e.length<=Dr?e:e.slice(0,Dr)}function Hr(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 Br(e){if(e)return e.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Fr(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 Ur(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 Lr(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function zr(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 Gr=new Set(["low","medium","high","max","xhigh"]);function Jr(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&&Gr.has(e)?e:null)(zn(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 Kr(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 Wr=/[^\w-]/g;function Vr(e){return e.replaceAll(Wr,"_")}function Yr(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=Jr(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:Kr(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:Vr(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Vr(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Xr(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 Zr(e){let t={model:e.model,input:ea(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:Qr(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 Qr(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function ea(e){let t=[];for(let o of e)"user"===o.role?t.push(...ta(o)):t.push(...na(o));return t}function ta(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(oa(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 oa(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 na(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 ra(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 aa(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function ia(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 sa(e,t){let o=[];switch(e.type){case"response.created":ia(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){ia(t,o),aa(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":ia(t,o),aa(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":aa(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":{aa(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:ra(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":{ia(t,o),aa(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":ia(t,o),aa(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":ia(t,o),aa(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":ia(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 la(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 ca(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function ua(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&&(la(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&&(la(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),ca(t,o)),r.content&&(ca(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){ca(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&&(ca(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:qr(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 pa=/structured_outputs|output_config\.format/i;function da(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&pa.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Yr({...e,model:Bn},o):null}function ma(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function fa(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function ha(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(!On())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await In(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_${ma()}`,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:fa(e)}];return{id:`msg_ws_${ma()}`,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_${ma()}`,r=`msg_ws_${ma()}`,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:fa(e)}},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),F(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const ga=(e,t)=>!(!e||!t||e===t);async function _a(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 ha(e,t);await Kn(X),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort;t=function(e,t){return Pr(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),Tr(n,t,e.req.header("anthropic-beta"));let r=Jn(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Xr(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),xe.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 Gn)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 async function(){return!!X._t1||(await Wt(1,0,"on-demand"),!!X._t1)}())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(function(e){return/gpt-[\d.]+-codex/i.test(e)}(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),Zr(t)}finally{e.end()}});Me.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 Nn();let i=performance.now(),s=await Cr(a),l=performance.now()-i;if(Re.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),ba(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Dn({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:ra(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 Me.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 F(e,async t=>{let n=null,r=0,s=performance.now(),d=or(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=ya(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Dn(n),t._d1=l,e.set("requestData",t)}let u=sa(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),Le.record(r,p),nr(e,i)}catch(t){throw Ke(u,e.get("requestSpan"),t),t}finally{n&&Mn(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=Yr(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:ga(o,a),streaming:!!n.stream}),X.manualApprove&&await Nn(),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),Tr(t,n,r.anthropicBeta);try{let o=performance.now(),a=await $r(n,r,{onStructuredOutputFallback:(e,o)=>{let n=da(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(Re.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=Dn(wa(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 F(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=or(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"}),va(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),Le.record(a,t)}finally{if(nr(e,o),p){let t=wa(u);Mn(l,t);let o=e.get("requestData")||{};o.tokenUsage=Dn(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 Je(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),Nr(t,X.models)}finally{o.end()}});Me.record(performance.now()-i,{direction:"anthropic_to_openai"}),s=Qn(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:ga(r,l),streaming:!!s.stream});let c=performance.now();X.manualApprove&&await Nn();let u=await lr(s),p=performance.now()-c;if(Re.record(p,{model:s.model,target:"chat_completions",streaming:String(!!s.stream)}),ka(u)){let t=e.get("requestData")||{};u.usage&&(t.tokenUsage=Dn(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=Lr(a.message),i=Ur(a.message.content),s=zr(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:qr(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 Me.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 F(e,async t=>{let n=null,r=0,a=performance.now(),i=or(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=Dn(n),t._d1=p,e.set("requestData",t)}let u=ua(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),Le.record(r,d),nr(e,c),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Dn(n),t._d1=p,e.set("requestData",t))}}catch(t){throw Ke(f,e.get("requestSpan"),t),t}finally{n&&Mn(f,n),f.end(),h()}let u=e.get("requestId");u&&se.executeCompletion(u)}finally{e.get("resolveStreamComplete")?.()}})}function ya(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 ka=e=>Object.hasOwn(e,"choices"),ba=e=>Object.hasOwn(e,"output");function wa(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 va(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 xa=new H;xa.post("/",async e=>{try{return await _a(e)}catch(t){return await It(e,t)}});const Ta=new H;function $a(e){return me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Jn(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),xe.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 Aa(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=Dn(o),n._d1=t._d1,t.c.set("requestData",n)}Ta.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 Sa=new Set(["message","function_call","function_call_output"]),Ea=new Set(["type","name","description","parameters"]);async function Ca(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||!On())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await In(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Oa(e){if(On())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Ca(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Ia(e){if(!On())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 Ca(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Pa(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 qa(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&&Pa(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)Pa(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Na(e){return null!=e}function Ra(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 Sa.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"])Na(e[t])&&(n[t]=e[t]);let r=new Set;if(Na(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))Ea.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(Na(e.reasoning)&&"object"==typeof e.reasoning){let t=e.reasoning;n.reasoning={},Na(t.effort)&&(n.reasoning.effort=t.effort),Na(t.summary)&&(n.reasoning.summary=t.summary)}if(Na(e.text)&&"object"==typeof e.text){let t=e.text;Na(t.format)&&(n.text={format:t.format})}return{payload:n,customToolNames:r}}async function ja(e){await Kn(X);let{payload:t,customToolNames:n}=Ra(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:$a(t)}}catch(t){if(t instanceof Gn)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,e.set("requestData",{model:r.model,reasoningEffort:r.reasoning?.effort,streaming:!!r.stream}),X.manualApprove&&await Nn();let i=performance.now(),s=await Cr(r),l=performance.now()-i;if(Re.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Da(s))return async function(e,t,o){await Oa(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Dn({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,s,l);let{events:c,span:u,release:p}=s;return F(e,async t=>{let o={value:null},a=0,s=performance.now(),d=or(e,i);try{try{for await(let i of c)if(d(),i.data&&"[DONE]"!==i.data){a++;let s=qa(i.data,n);s=await Ia(s);let c=s===i.data?i:{...i,data:s};Ce.add(1,{model:r.model,endpoint_type:"responses"}),Aa(s,{usageRef:o,c:e,_d1:l}),await t.writeSSE(c)}else await t.writeSSE(i);let u=performance.now()-s,p={model:r.model,endpoint_type:"responses"};je.record(u,p),Le.record(a,p),nr(e,i)}catch(t){throw Ke(u,e.get("requestSpan"),t),t}finally{o.value&&Mn(u,o.value),u.end(),p()}let m=e.get("requestId");m&&se.executeCompletion(m)}finally{e.get("resolveStreamComplete")?.()}})}const Da=e=>Object.hasOwn(e,"output"),Ma=new H;Ma.post("/",async e=>{try{return await ja(e)}catch(t){return await It(e,t)}});const Ha=new H;Ha.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 Ba=new H;Ba.get("/",async e=>{try{let t=await Qt();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Fa=new H;Fa.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);e.set("requestId",r),e.header("x-request-id",r);let p=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",p),e.set("requestTraceContext",p.spanContext());for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Ve.has(e)||p.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>qn?t.slice(0,qn):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let m,f=new Promise(e=>{m=e});e.set("streamComplete",f),e.set("resolveStreamComplete",m);let h=d.setSpan(u.active(),p);await u.with(h,async()=>{se.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw p.setStatus({code:c.ERROR,message:t.message}),p.recordException(t),e}});let g=e.get("requestData"),_={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:p};g?.streaming&&e.res.status<400?f.then(()=>Pn(_)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{p.recordException(t),p.setStatus({code:c.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{p.end()}catch{}}):Pn(_)}),Fa.use(B()),Fa.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()}),Fa.get("/",e=>e.text("Server running")),Fa.route("/health",hr),Fa.route("/chat/completions",mr),Fa.route("/models",Ta),Fa.route("/embeddings",fr),Fa.route("/usage",Ba),Fa.route("/token",Ha),Fa.route("/v1/chat/completions",mr),Fa.route("/v1/models",Ta),Fa.route("/v1/embeddings",fr),Fa.route("/v1/messages",xa),Fa.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=kr.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=kr.perMessage+br(e)*kr.contentMultiplier}for(let e of t.messages)o+=kr.perMessage,o+=br(e.role),"string"==typeof e.content?o+=br(e.content)*kr.contentMultiplier:Array.isArray(e.content)&&(o+=wr(e.content));return t.tools&&t.tools.length>0&&(o+=function(e){let t=kr.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=kr.perTool),t+=br(n.name),n.description&&(t+=kr.perDesc+br(n.description)),t+=vr(n.input_schema);return t}(t.tools)),e.json({input_tokens:Math.round(o)})}),Fa.route("/v1/responses",Ma),Fa.route("/responses",Ma);const Ua=[],La=Date.now();let za="";function Ga(){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()-La)/1e3}});for(let t of Ua)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=tn("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",rn,` ${Vo("COPILOT-API")} ${Yo(`v${e}`)} ${Yo("·")} ${gn(t)} uptime`,rn,""," Check in from time to time on",` ${Xo(o)}`,"",rn,""];console.log(n.join("\n"))}(za,Date.now()-La),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 Ja(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function Ka(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=me.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:We({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:Ja(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()-La},"copilot_api")});if(X.models?.data)for(let e of X.models.data)a.addEvent("copilot_api.model.available",We(e,"model"));a.end(),Ge(_.INFO,"INFO","Server started",We({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-La},"copilot_api"))}async function Wa(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 vn(e)){let e=await wn(yn),t=await wn(kn);if(e&&t)return{cert:e,key:t,certPath:yn,keyPath:kn,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Tn(e)}(e.httpsHosts)}}async function Va(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=yo;try{R(t),R(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(Ga(),Ua.push(()=>{o.debug("Cleaning up connectivity monitor"),Qe.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),Ft&&=void clearInterval(Ft),Lt&&=void Qe.off("online",Lt),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"),Bo&&=void clearInterval(Bo),Fo&&=void clearInterval(Fo);let e=[...Do.keys(),...Mo];Do.clear(),Mo.clear(),jo.clear(),Ho=void 0;for(let t of e)Uo(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 W(),X._v1="1.121.0-insider";let n=await $o();za=n;let r=Ao();(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 $({resource:o,traceExporter:new w({url:`${n}/v1/traces`,headers:r}),metricReader:new T({exporter:new b({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x(new k({url:`${n}/v1/logs`,headers:r}))],instrumentations:[]}),le.start()})(n,La),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 Vt();try{a=await qt(),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),Ft=setInterval(()=>{Wt(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),Qe.start(),Lt=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Wt(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",Lt),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)}}();Ua.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),X.connectivity.h2&&(Go(zo(it(X))),X.connectivity.h2Keepalive&&Ko()),Ka({options:t,version:n,runtime:r,_u1:a});let l=await Wa(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=Wo({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=Wo({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=[...un(e),...pn(e),...dn(e),...mn(),"",...cn(ln),...fn(e),...hn(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 ao()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),j({fetch:Fa.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)}function Ya(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Xa=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)"}},run({args:e}){let t=e["rate-limit"],n=void 0===t?void 0:Ya(t,"--rate-limit"),r=e.timeout,a=void 0===r?Y:Ya(r,"--timeout"),i=e["connect-timeout"]??g.env.COPILOT_CONNECT_TIMEOUT_MS,s=void 0===i?15e3:Ya(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(!Cn(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${En.join(", ")}`);let r=n.length>0?n:En,a=new Set,i=n.length>0,s=[];for(let e of r){if(!Cn(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});return Va({port:Ya(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"]})}});await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([$o(),No()]);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 ${Oo}@latest`,n=qo("│"),r=` ${Po("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,a=` Run ${Po(o)} to update`,i=" ".repeat(54),s=qo(`╭${"─".repeat(54)}╮`),l=qo(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${Ro(r,54)}${n}`,`${n}${i}${n}`,`${n}${Ro(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:Zt,start:Xa,"check-usage":eo,debug:Co,"cowork-setup":To}}));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 b}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as w}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as T}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as A,ATTR_SERVICE_NAME as S,ATTR_SERVICE_VERSION as E}from"@opentelemetry/semantic-conventions";import{Client as C,request as O}from"undici";import{createHash as I,randomBytes as P,randomUUID as q}from"node:crypto";import{promisify as N}from"node:util";import{accessSync as R}from"node:fs";import{serve as j}from"srvx";import{isIP as D}from"node:net";import{generate as M}from"selfsigned";import{Hono as H}from"hono";import{cors as B}from"hono/cors";import{streamSSE as F}from"hono/streaming";import{events as U}from"fetch-event-stream";import{Tokenizer as L,models as z}from"ai-tokenizer";import*as G from"ai-tokenizer/encoding/claude";const J=s.join(i.homedir(),".local","share","copilot-api"),K={APP_DIR:J,GITHUB_TOKEN_PATH:s.join(J,"github_token"),MACHINE_ID_PATH:s.join(J,"machine_id"),SESSION_ID_PATH:s.join(J,"session_id")};async function W(){await a.mkdir(K.APP_DIR,{recursive:!0}),await V(K.GITHUB_TOKEN_PATH),await V(K.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),Ge(_.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"}),be=fe.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),we=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"}),xe=fe.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Te=fe.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),$e=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"}),qe=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"}),Re=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"}),De=fe.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Me=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"}),Ue=fe.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Le=fe.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),ze=fe.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function Ge(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 Je(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 Ke(e,t,o){Je(e,o),t&&t!==e&&Je(t,o)}function We(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,We(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 Je(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 Je(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"}),Ge(_.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"}),Ge(_.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`${K.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=I("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},at=async(e,t)=>{e.machineId||=await rt(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(K.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=q();return await a.writeFile(K.SESSION_ID_PATH,e),await a.chmod(K.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=q(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":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":q(),"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&&lt.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 bt(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 wt(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",qe.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&&wt(e,"copilot_api.incoming_request_body",n);let r=xt(t.c.req.header());return r&&wt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&wt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&wt(e,"copilot_api.outgoing_headers",xt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&wt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function xt(e){let t={};for(let[o,n]of Object.entries(e))yt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}var Tt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}};function $t(e){return e.req.path.startsWith("/v1/messages")}function At(e,t){if($t(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=bt({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 Tt&&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)),we.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),Ge(_.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"),Ge(_.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=$t(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 Tt)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),Ge(_.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),Ge(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name});let a=$t(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 Tt("Failed to get Service token",t);return await t.json()}catch(e){throw Je(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function qt(){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 Tt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Je(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let Nt=null;function Rt(){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 Tt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Je(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const Dt=e=>new Promise(t=>{setTimeout(t,e)}),Mt=e=>null==e;async function Ht(){X.models=await(async()=>{try{return await jt()}catch(e){if(e instanceof Tt&&401===e.response.status)return await Rt(),jt();throw e}})()}var Bt=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Ft,Ut,Lt,zt,Gt=!1;function Jt(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(Ft),Ft=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Te.add(1,{reason:r,success:"false"}),$e.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}),Ge(_.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 Kt(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),$e.add(1,{reason:r}),He.record(performance.now()-a,{reason:r}),Ge(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Wt=async(e=5,t=1e3,n="scheduled")=>Gt?(o.debug("Token refresh already in progress, coalescing"),Ut):(Gt=!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),Te.add(1,{reason:n,success:"true"}),He.record(performance.now()-a,{reason:n}),void Ge(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Tt&&(401===s.response.status||403===s.response.status))return void Jt({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),Te.add(1,{reason:n,success:"false"}),l)return void Kt({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(),Gt=!1,Ut=void 0}}),Ut);async function Vt(){return!!X._t1||(await Wt(1,0,"on-demand"),!!X._t1)}async function Yt(e){try{let t=await a.readFile(K.GITHUB_TOKEN_PATH,"utf8");if(t&&!e?.force)return X._t2=t,X.showToken&&o.info("Auth token:",t),void await Xt();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 Tt("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 Bt("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 Dt(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 Bt("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Bt("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 Dt(t);continue}if(r.access_token)return r.access_token;await Dt(t)}catch(e){if(e instanceof Bt)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await Dt(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(K.GITHUB_TOKEN_PATH,e,{mode:384}))(r),X._t2=r,X.showToken&&o.info("Auth token:",r),await Xt()}catch(e){throw e instanceof Tt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Xt(){let e=await qt();o.success(`Authenticated as ${e.login}`)}async function Zt(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),X.showToken=e.showToken,await W(),await Yt({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 Qt=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})=>Zt({verbose:e.verbose,showToken:e["show-token"]})}),eo=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 Tt("Failed to get usage",t);return await t.json()}catch(e){throw Je(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},to=e({meta:{name:"check-usage",description:"Show current usage/quota information"},async run(){await W(),await Yt();try{let e=await eo(),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)}}}),oo=N(f);async function no(){let e="win32"===g.platform?"where.exe":"which";try{return await oo(e,["tailscale"]),!0}catch{return!1}}async function ro(){try{let{stdout:e}=await oo("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function ao(e){return e.replace(/\.$/,"")}async function io(){let e=await ro();if(e?.Online)return ao(e.DNSName)}const so=N(f),lo=e=>`${e}`,co=e=>`${e}`,uo=e=>`${e}`,po=e=>`${e}`,mo=e=>`${e}`,fo=e=>`${e}`,ho=co(" ─────────────────────────────────────────────────────────────"),go=s.join(K.APP_DIR,"certs","tailscale"),_o=s.join(go,"cert.pem"),yo=s.join(go,"key.pem"),ko={certDir:go,certPath:_o,keyPath:yo};function bo(){switch(g.platform){case"darwin":return[` ${co("Install Tailscale for macOS:")}`,` ${uo("https://tailscale.com/download/mac")}`,` ${co("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${co("After installing, open the Tailscale app and sign in.")}`,` ${co("Then re-run this command.")}`].join("\n");case"linux":return[` ${co("Install Tailscale for Linux:")}`,` ${uo("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${uo("sudo tailscale up")}`,` ${co("or")} ${uo("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${co("Install Tailscale for Windows:")}`,` ${uo("https://tailscale.com/download/windows")}`,"",` ${co("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${co("Install Tailscale:")} ${uo("https://tailscale.com/download")}`}}function wo(){let e=[` ${mo("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${co("Open the Tailscale app from Applications and sign in.")}`,` ${co("Download:")} ${uo("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${co("Open the Tailscale app and sign in.")}`,` ${co("Download:")} ${uo("https://tailscale.com/download/windows")}`):e.push(` ${co("Connect with:")} ${uo("sudo tailscale up")}`),e.push("",` ${co("Then re-run this command.")}`),e.join("\n")}async function vo(){try{return await a.access(_o),await a.access(yo),!0}catch{return!1}}function xo(e){console.log(""),console.log(ho),console.log(` ${lo("Claude Cowork Setup")} ${co("— Diagnostic")}`),console.log(ho),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?po("✅"):"missing"===n.status?mo("❌"):fo("❓");let r=n.detail?co(` ${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(` ${po("All checks passed.")}`):console.log(` ${mo(`${t.length} issue(s).`)} Run ${uo("copilot-api cowork-setup install")} to fix.`),console.log("")}const To={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},$o=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 no();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 ro();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},xo(e),console.log(wo()),void console.log("");let n=ao(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await vo();e["tailscale-cert"]=r?{status:"ok",detail:_o}:{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(ho),console.log(` ${lo("Claude Cowork Setup")} ${co("— Install")}`),console.log(ho),console.log(""),!await no())return console.log(` ${mo("Tailscale is not installed.")}`),console.log(""),console.log(bo()),console.log(""),console.log(` ${co("After installing, run")} ${uo("tailscale up")} ${co("to connect, then re-run this command.")}`),void console.log("");let t=await ro();if(!t||!t.Online)return console.log(wo()),void console.log("");let n=ao(t.DNSName);if(console.log(` ${co("Tailscale hostname:")} ${lo(n)}`),console.log(""),console.log(` ${lo("Generating TLS certificate via Tailscale…")}`),console.log(` ${co("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${uo(`$ tailscale cert --cert-file ${_o} --key-file ${yo} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(go,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await so("tailscale",["cert","--cert-file",_o,"--key-file",yo,n]),console.log(` ${po("✓ 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(ho),console.log(` ${lo("Next steps")}`),console.log(ho),console.log(""),console.log(` ${lo("1.")} Start the proxy:`),console.log(` ${uo("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${lo("2.")} In Cowork ${co("→")} Settings ${co("→")} Inference Provider, set:`),console.log(` ${lo("inferenceGatewayBaseUrl")} = ${uo(`https://${n}:<port>`)}`),console.log(` ${co("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${lo("3.")} Restart Cowork ${co("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${co("For Cowork's own configuration docs, see:")}`),console.log(` ${uo("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(ho),console.log(` ${lo("Claude Cowork Setup")} ${co("— Revert")}`),console.log(ho),console.log(""),!await vo())return console.log(` ${co("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${lo("Remove Tailscale cert files:")}`),console.log(` ${co(_o)}`),console.log(` ${co(yo)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(go,{recursive:!0}),console.log(` ${po("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${co("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}})}});async function Ao(){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 So(){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 Eo(){try{return!!(await a.stat(K.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(K.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Co(e){let t=await async function(){let[e,t]=await Promise.all([Ao(),Eo()]);return{version:e,runtime:So(),paths:{APP_DIR:K.APP_DIR,GITHUB_TOKEN_PATH:K.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const Oo=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})=>Co({json:e.json})}),Io="copilot-api-node20",Po=`https://registry.npmjs.org/${Io}/latest`,qo=e=>`${e}`,No=e=>`${e}`;async function Ro(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Po,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function jo(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}const Do=new Map,Mo=new Map,Ho=new Set;let Bo,Fo,Uo;function Lo(e){return!e.closed&&!e.destroyed}function zo(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 Do.set(t,Date.now()),Pe.add(1,{event:"created",origin:e}),Ge(_.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=Ho.has(t);Pe.add(1,{event:"goaway",origin:e}),Ge(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}),Mo.delete(t),Ho.delete(t),Do.delete(t),Lo(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Go(e){if(!X.connectivity.h2)return;Bo&&Bo!==e&&function(){for(let e of[...Mo.keys(),...Ho])Lo(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Mo.clear(),Ho.clear(),Do.clear()}(),Bo=e;let t=Date.now();for(let[n]of Mo)if(t-(Do.get(n)??0)>=6e5)Mo.delete(n),Do.delete(n),Lo(n)&&n.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Pe.add(1,{event:"rotated",origin:e}),Ge(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Lo(n))return Mo.delete(n),Ho.add(n),n;Mo.delete(n),Do.delete(n)}let n=zo(e);return Ho.add(n),n}function Jo(e){e&&Ho.delete(e)&&(Lo(e)?Mo.set(e,Date.now()):Do.delete(e))}function Ko(){Uo||(Uo=setInterval(()=>{!function(){let e=Date.now(),t=X.connectivity.h2Keepalive,n=Mo.size;for(let[r,a]of Mo)e-a<6e4||t&&n<=1||(Mo.delete(r),Do.delete(r),n--,Lo(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Pe.add(1,{event:"idle_reaped",origin:Bo??""}),Ge(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${Bo}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Bo??""}))}()},3e4),Uo.unref())}function Wo(){Fo||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Fo=setInterval(()=>{(async function(){if(0===Mo.size&&0===Ho.size){if(Bo){let e=zo(Bo);Mo.set(e,Date.now())}return}let e=[...Mo.keys()];for(let t of e)Mo.delete(t);await Promise.allSettled(e.map(async e=>{if(Lo(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}`),Mo.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:Bo??""}),Do.delete(e),Lo(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Do.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Fo.unref(),Ko())}function Vo(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 Yo=e=>`${e}`,Xo=e=>`${e}`,Zo=e=>`${e}`,Qo=e=>`${e}`,en=e=>`${e}`,tn=e=>`${e}`,on=(e,t)=>`]8;;${e}\\${t}]8;;\\`,nn="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",rn="https://github.com/johnib/copilot-api-issues/issues",an=Xo(" ─────────────────────────────────────────────────────────────");function sn(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function ln(e){return e&&0!==e.length?e.join("·"):"—"}const cn=[{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 un(e){if(0===e.length)return[];let t=["",an,` ${Yo("BARAZANY.DEV")} ${Xo("— Recent Posts")}`,an,""];for(let[o,n]of e.entries()){let e=on(`${n.url}${nn}`,Yo(tn(`[${o+1}]`)));t.push(` ${e} ${Zo(n.title)}`,` ${Xo("→")} ${Xo(n.teaser)}`,"")}return t.push(an,` ${on(`https://barazany.dev/blog${nn}`,"barazany.dev/blog")}`,an),t}function pn(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(Xo(" → "))} ${Qo("✓")}`:Xo("off"),n=["",` ${Yo("COPILOT-API")} ${Xo(`v${e.version}`)}`,an,` ${Xo("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Xo("User")} ${e.user} ${Xo("·")} ${e.accountType}`];return X._v1&&n.push(` ${Xo("Client")} VSCode ${X._v1}`),n.push(` ${Xo("Network")} ${t.join(Xo(" · "))}`,` ${Xo("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Xo("Clipboard")} Claude Code command ${Qo("✓")}`),n.push(an),n}function dn(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Yo("Active")}`];if(e.model){let o=X.models?.data.find(t=>t.id===e.model),n=sn(o?.capabilities.limits?.max_context_window_tokens),r=ln(o?.capabilities.supports.reasoning_effort);t.push(` ${Zo(e.model.padEnd(32))} ${Xo("ctx")} ${Yo(n.padStart(5))} ${Xo("effort")} ${Xo(r)} ${en("← main")}`)}if(e.smallModel){let o=X.models?.data.find(t=>t.id===e.smallModel),n=sn(o?.capabilities.limits?.max_context_window_tokens),r=ln(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Xo("ctx")} ${n.padStart(5)} ${Xo("effort")} ${Xo(r)} ${en("← small")}`)}return t}function mn(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("",` ${Yo(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Zo("●"):Xo("·"),i=n?Zo(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?sn(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${ln(r.effort)}`;t.push(` ${a} ${i} ${Xo(s)}${Xo(l)}`)}}return t}function fn(){let e=rn.replace(/^https:\/\//,""),t=on(`${rn}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",an,` ${Yo("FOUND A BUG?")} ${Xo("— Report it on GitHub")}`,an,"",` ${Zo("→")} ${Zo(t)}`,` ${Xo("Bug reports, feature requests, and questions welcome.")}`,"",an]}function hn(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=["",an,` ${Yo("Claude Cowork")} ${Xo("— Settings → Inference Provider")}`,an,"",` ${Xo("Paste into")} ${Yo("inferenceGatewayBaseUrl")}${Xo(":")}`,` ${Yo(Zo(r))}`];return n||a.push("",` ${Xo("Your Tailscale hostname is shown by:")} ${Zo("tailscale status --self")}`),a.push("",` ${Xo("Docs:")} ${Zo("https://claude.com/docs/cowork/3p/installation")}`),a}function gn(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",an,` ${Yo("HTTPS")} ${Xo("— self-signed cert")}`,an,"",` ${Xo("Cert")} ${t}`];switch(o.push("",` ${Yo("Trust this cert")} ${Xo("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${Xo("macOS:")}`,` ${Zo("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Zo(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Xo("Windows (PowerShell as Administrator):")}`,` ${Zo(`Import-Certificate -FilePath "${t}" \``)}`,` ${Zo("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Xo("Linux (Debian/Ubuntu):")}`,` ${Zo(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Zo("sudo update-ca-certificates")}`,` ${Xo("Linux (Fedora/RHEL/Arch):")}`,` ${Zo(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Zo("sudo update-ca-trust")}`);break;default:o.push(` ${Xo("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Xo("Or, for Node CLIs only (no admin needed):")}`,` ${Zo(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,an),o}function _n(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 yn=s.join(K.APP_DIR,"certs"),kn=s.join(yn,"cert.pem"),bn=s.join(yn,"key.pem"),wn=s.join(yn,"cert.meta.json");async function vn(e){try{return await a.readFile(e,"utf8")}catch{return}}async function xn(e){let t=await vn(kn),o=await vn(bn),n=await async function(){let e=await vn(wn);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 Tn(e){return 0!==D(e)}async function $n(e){await a.mkdir(yn,{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)Tn(t)?i.add(t):r.add(t);let s=await M([{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(kn,s.cert,{mode:420}),await a.writeFile(bn,s.private,{mode:384}),await async function(e){await a.writeFile(wn,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:s.cert,key:s.private,certPath:kn,keyPath:bn,generated:!0}}var An=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Sn=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const En={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 o.error(`Tavily API error (${e.status}):`,t),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 Je(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Sn: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 o.error(`Exa API error (${e.status}):`,t),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 Je(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new An:e}finally{clearTimeout(i)}}},Cn=["tavily","exa"];function On(e){return"tavily"===e||"exa"===e}function In(){return X.webSearchProviders.length>0}async function Pn(e,t){return async function(e,t,n){let r,{providers:a,searchFns:i=En}=n;if(0===a.length)throw Error("No web search provider configured");for(let[n,s]of a.entries())try{return await i[s.name](s.key,e,t)}catch(e){r=e,n!==a.length-1&&o.warn(`Web search via "${s.name}" failed, falling over to "${a[n+1].name}":`,e)}throw r instanceof Error?r:Error("All web search providers failed")}(e,t,{providers:X.webSearchProviders})}function qn(e){try{!function(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),a=t.res.status,i=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",a),n.setAttribute("copilot_api.model",i),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens),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,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),Ue.record(e.outputTokens,t)),e.cachedTokens&&be.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 Nn=1048576;const Rn=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),ze.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Oe.add(1,{result:"rejected"}),new Tt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Oe.add(1,{result:"approved"})}finally{e.end()}}),jn=3e-6,Dn=15e-6;function Mn(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*jn+o*Dn,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function Hn(e,t){void 0!==t.prompt_tokens&&e.setAttribute("copilot_api.input_tokens",t.prompt_tokens),void 0!==t.completion_tokens&&e.setAttribute("copilot_api.output_tokens",t.completion_tokens),void 0!==t.total_tokens&&e.setAttribute("copilot_api.total_tokens",t.total_tokens)}const Bn=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],Fn="claude-haiku-4.5",Un={haiku:Fn,"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 Ln(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 Bn)if(t.pattern.test(e))return t.family;return null}(n);if(!a)return null;let i=n.replace(/-\d{8}(?::.*)?$/,""),s=r?`-${r}`:"";for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,""),o=`${i}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2")===o)return e}return function(e,t,o=null){let n=Un[e];if(!n)return null;if(o){let e=`${n}-${o}`;if(t.includes(e))return e}if(t.includes(n))return n;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let n=o?`${e}-${o}`:e;if(t.includes(n))return n}return null}(a,t,r)}const zn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Gn(e,t){if(!e||!t||0===t.length)return null;let o=function(e){return"max"===e?"xhigh":e}(e);if(t.includes(o))return o;let n=zn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=zn.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var Jn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Kn(e){if(!e||"string"!=typeof e)throw new Jn("Model name is required and must be a string");if(!X.models?.data)throw new Jn("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=Ln(e,t);if(!o)throw ve.add(1,{requested_model:e}),new Jn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}async function Wn(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"),we.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Tt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),we.add(1,{action:"waited",source:"local"}),De.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await Dt(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function Vn(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 Yn(e,t,o){return Math.min(Math.max(e,t),o)}function Xn(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 Xn(JSON.parse(r),t+1)}catch{return null}}function Zn(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Vn(o.capabilities.supports.min_thinking_budget),r=Vn(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Vn(o.capabilities.limits?.max_output_tokens)??void 0}}function Qn(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Yn(Vn(e.requestedBudget)??o,o,n),a=Vn(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 er(e,t){if(Mt(e.thinking_budget))return e;let o=Zn(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Qn({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 tr(e){return"invalid_thinking_budget"===Xn(e)}async function or(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(Mt(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(!tr(i))return null;let l=Zn(n,t.model);return l?function(e,t){let o=Qn({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=Vn(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 nr(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 rr(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}function ar(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 ir(){return new Promise(e=>setTimeout(e,100))}function sr(e){if("string"==typeof e)return function(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,"")}(e);if(Array.isArray(e))return e.map(e=>sr(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?sr(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}async function lr(e,t,o){try{if(!e.ok)throw new Tt("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&&Hn(t,n.usage),n}catch(e){throw Je(t,e),e}finally{t.end()}}const cr=async e=>{let t=sr(e);try{return await ur(t)}catch(e){if(e instanceof Tt&&401===e.response.status)return await Rt(),ur(t);let n;if(e instanceof Tt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await or({payload:t,error:e,models:X.models,errorBodyText:n});if(r)return e instanceof Tt&&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 ur(sr(r));throw e}},ur=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=Go(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 Tt("Failed to create chat completions",m,{outgoingBody:c,outgoingHeaders:r});return{events:U(m),span:d,release:()=>Jo(n)}}try{return await lr(m,d,{outgoingBody:c,outgoingHeaders:r})}finally{Jo(n)}}catch(e){if(Jo(n),ar(e)&&t<1){o.warn(`HTTP/2 connection error during chat completions, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await ir();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function pr(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 dr(e){await Wn(X);let t=await e.req.json();o.debug("Request payload:",JSON.stringify(t).slice(-400));try{t=function(e){return me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Kn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),xe.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}(t)}catch(t){if(t instanceof Jn)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:t.model,streaming:!!t.stream}),X.manualApprove&&await Rn(),Mt(t.max_tokens)){let e=X.models?.data.find(e=>e.id===t.model);t={...t,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(t.max_tokens))}t=er(t,X.models),Mt(t.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(t.thinking_budget));let n=performance.now(),r=await cr(t),a=performance.now()-n;if(Re.record(a,{model:t.model,target:"chat_completions",streaming:String(!!t.stream)}),mr(r)){let t=e.get("requestData")||{};return r.usage&&(t.tokenUsage=Mn(r.usage)),t._d1=a,t.upstreamTtfbMs=a,t.upstreamTotalMs=a,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(r)),e.json(r)}let{events:i,span:s,release:l}=r;return F(e,async o=>{let r={value:null},c=0,u=performance.now(),p=nr(e,n);try{try{for await(let n of i){p();let i=n;n.data&&"[DONE]"!==n.data&&(c++,Ce.add(1,{model:t.model,endpoint_type:"openai"}),i=pr(n,t=>{r.value=t;let o=e.get("requestData")||{};o.tokenUsage=Mn(t),o._d1=a,e.set("requestData",o)})),await o.writeSSE(i)}let s=performance.now()-u,l={model:t.model,endpoint_type:"openai"};if(je.record(s,l),Le.record(c,l),rr(e,n),r.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Mn(r.value),t._d1=a,e.set("requestData",t))}}catch(t){throw Ke(s,e.get("requestSpan"),t),t}finally{r.value&&Hn(s,r.value),s.end(),l()}let d=e.get("requestId");d&&se.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const mr=e=>Object.hasOwn(e,"choices"),fr=new H;fr.post("/",async e=>{try{return await dr(e)}catch(t){return await It(e,t)}});const hr=new H;hr.post("/",async e=>{try{let t=await e.req.json();try{t.model=Kn(t.model)}catch(t){if(t instanceof Jn)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 Tt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Je(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),r=performance.now()-o;Re.record(r,{model:t.model,target:"embeddings",streaming:"false"});let a=e.get("requestData")||{};return a.tokenUsage=Mn(n.usage),a._d1=r,e.set("requestData",a),e.json(n)}catch(t){return await It(e,t)}});const gr=new H;let _r=null,yr=null;gr.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=_r;return t&&e-t.timestamp<3e4?{result:t.result}:yr||(yr=(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 _r={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return _r={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),yr=null}})(),yr)}();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.34.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 kr=new L(G),br={...z["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function wr(e){return kr.encode(e).length}function vr(e){let t=0;for(let o of e)switch(o.type){case"text":t+=wr(o.text)*br.contentMultiplier;break;case"tool_use":t+=wr(o.name+JSON.stringify(o.input))*br.contentMultiplier;break;case"tool_result":o.content&&(t+=wr("string"==typeof o.content?o.content:JSON.stringify(o.content))*br.contentMultiplier);break;case"thinking":t+=wr(o.thinking)*br.contentMultiplier;break;case"image":t+=1600}return t}function xr(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?br.perFirstProp:br.perAdditionalProp,t+=wr(o),r.description&&(t+=br.perPropDesc+wr(r.description)),r.enum&&Array.isArray(r.enum)){t+=br.perEnum;for(let e of r.enum)t+=wr(String(e))}if("object"===r.type&&r.properties&&(t+=br.perNestedObject,t+=xr(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=br.perArrayOfObjects,t+=xr(e))}}return t}function Tr(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 $r(e,t,o){let n=Tr(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Ar=async(e,t,n)=>{try{return await Er(e,t)}catch(r){if(r instanceof Tt&&401===r.response.status)return await Rt(),Er(e,t);if(r instanceof Tt&&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}`),Er(i,t)}throw r}};function Sr(e){return e.context_management?["context-management-2025-06-27"]:[]}const Er=async(e,t)=>{if(!X._t1)throw Error("Service token not found");let{metadata:n,...r}=sr(e),a={...ct(X,t,Sr(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",...Tr(e,t?.anthropicBeta)}}(r,t,l);for(let e=0;e<=1;e++){let t=Go(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 Tt("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:a});if(r.stream)return{events:U(m),span:d,release:()=>Jo(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&&Hn(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(),Jo(t)}}catch(n){if(Jo(t),ar(n)&&e<1){o.warn(`HTTP/2 connection error during anthropic messages, retrying (attempt ${e+1}): ${n instanceof Error?n.message:String(n)}`),await ir();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Cr(e,t,o){try{if(!e.ok)throw new Tt("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&&Hn(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Je(t,e),e}finally{t.end()}}const Or=async e=>{try{return await Ir(e)}catch(t){if(t instanceof Tt&&401===t.response.status)return await Rt(),Ir(e);throw t}},Ir=async e=>{if(!X._t1)throw Error("Service token not found");let t=sr(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=Go(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 Tt("Failed to create responses",m,{outgoingBody:s,outgoingHeaders:n});return{events:U(m),span:d,release:()=>Jo(c)}}try{return await Cr(m,d,{outgoingBody:s,outgoingHeaders:n})}finally{Jo(c)}}catch(t){if(Jo(c),ar(t)&&e<1){o.warn(`HTTP/2 connection error during responses, retrying (attempt ${e+1}): ${t instanceof Error?t.message:String(t)}`),await ir();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Pr=new Set(["low","medium","high","max","xhigh"]);function qr(e,t,n){let r=t.includes(e.model)?e.model:Ln(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=Ln(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=Gn(t,n);if(!r||!Pr.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 Nr(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Rr(e,t){let o={model:e.model,messages:jr(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:Fr(e.tools),tool_choice:Ur(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Zn(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=Vn(t),a=r&&r>1?r-1:o.min;return Yn(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=er({...o,thinking_budget:a},t)}}return o}function jr(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:Dr(e)}]:[{role:"system",content:Dr(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:Br(e.content)});n.length>0&&t.push({role:"user",content:Br(n)})}else t.push({role:"user",content:Br(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:Hr(e.reasoning_text),reasoning_opaque:Hr(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Br(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:Br(e.content),...t}]}(e));return[...o,...n]}function Dr(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const Mr=32768;function Hr(e){if("string"==typeof e)return e.length<=Mr?e:e.slice(0,Mr)}function Br(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 Fr(e){if(e)return e.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Ur(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 Lr(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 zr(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Gr(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 Jr=new Set(["low","medium","high","max","xhigh"]);function Kr(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&&Jr.has(e)?e:null)(Gn(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 Wr(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 Vr=/[^\w-]/g;function Yr(e){return e.replaceAll(Vr,"_")}function Xr(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=Kr(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:Wr(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:Yr(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Yr(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Zr(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 Qr(e){let t={model:e.model,input:ta(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:ea(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 ea(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function ta(e){let t=[];for(let o of e)"user"===o.role?t.push(...oa(o)):t.push(...ra(o));return t}function oa(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(na(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 na(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 ra(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 aa(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 ia(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function sa(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 la(e,t){let o=[];switch(e.type){case"response.created":sa(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){sa(t,o),ia(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":sa(t,o),ia(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":ia(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":{ia(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:aa(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":{sa(t,o),ia(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":sa(t,o),ia(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":sa(t,o),ia(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":sa(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 ca(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 ua(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function pa(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&&(ca(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&&(ca(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),ua(t,o)),r.content&&(ua(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){ua(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&&(ua(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Nr(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 da=/structured_outputs|output_config\.format/i;function ma(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&da.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Xr({...e,model:Fn},o):null}function fa(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function ha(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function ga(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(!In())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await Pn(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_${fa()}`,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:ha(e)}];return{id:`msg_ws_${fa()}`,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_${fa()}`,r=`msg_ws_${fa()}`,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:ha(e)}},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),F(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const _a=(e,t)=>!(!e||!t||e===t);async function ya(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 ga(e,t);await Wn(X),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort;t=function(e,t){return qr(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),$r(n,t,e.req.header("anthropic-beta"));let r=Kn(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Zr(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),xe.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 Jn)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 Vt())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(function(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)}(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),Qr(t)}finally{e.end()}});Me.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 Rn();let i=performance.now(),s=await Or(a),l=performance.now()-i;if(Re.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),wa(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Mn({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:aa(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 Me.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 F(e,async t=>{let n=null,r=0,s=performance.now(),d=nr(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=ka(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Mn(n),t._d1=l,e.set("requestData",t)}let u=la(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),Le.record(r,p),rr(e,i)}catch(t){throw Ke(u,e.get("requestSpan"),t),t}finally{n&&Hn(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=Xr(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:_a(o,a),streaming:!!n.stream}),X.manualApprove&&await Rn(),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),$r(t,n,r.anthropicBeta);try{let o=performance.now(),a=await Ar(n,r,{onStructuredOutputFallback:(e,o)=>{let n=ma(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(Re.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=Mn(va(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 F(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=nr(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"}),xa(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),Le.record(a,t)}finally{if(rr(e,o),p){let t=va(u);Hn(l,t);let o=e.get("requestData")||{};o.tokenUsage=Mn(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 Je(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),Rr(t,X.models)}finally{o.end()}});Me.record(performance.now()-i,{direction:"anthropic_to_openai"}),s=er(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:_a(r,l),streaming:!!s.stream});let c=performance.now();X.manualApprove&&await Rn();let u=await cr(s),p=performance.now()-c;if(Re.record(p,{model:s.model,target:"chat_completions",streaming:String(!!s.stream)}),ba(u)){let t=e.get("requestData")||{};u.usage&&(t.tokenUsage=Mn(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=zr(a.message),i=Lr(a.message.content),s=Gr(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:Nr(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 Me.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 F(e,async t=>{let n=null,r=0,a=performance.now(),i=nr(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=Mn(n),t._d1=p,e.set("requestData",t)}let u=pa(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),Le.record(r,d),rr(e,c),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Mn(n),t._d1=p,e.set("requestData",t))}}catch(t){throw Ke(f,e.get("requestSpan"),t),t}finally{n&&Hn(f,n),f.end(),h()}let u=e.get("requestId");u&&se.executeCompletion(u)}finally{e.get("resolveStreamComplete")?.()}})}function ka(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens}:null}const ba=e=>Object.hasOwn(e,"choices"),wa=e=>Object.hasOwn(e,"output");function va(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 xa(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 Ta=new H;Ta.post("/",async e=>{try{return await ya(e)}catch(t){return await It(e,t)}});const $a=new H;function Aa(e){return me.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Kn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),xe.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 Sa(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=Mn(o),n._d1=t._d1,t.c.set("requestData",n)}$a.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 Ea=new Set(["message","function_call","function_call_output"]),Ca=new Set(["type","name","description","parameters"]);async function Oa(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||!In())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await Pn(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Ia(e){if(In())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Oa(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Pa(e){if(!In())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 Oa(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function qa(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&&qa(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)qa(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Ra(e){return null!=e}function ja(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 Ea.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))Ca.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 Da(e){return X._t1||await Vt()?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 Ma(e){await Wn(X);let{payload:t,customToolNames:n}=ja(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:Aa(t)}}catch(t){if(t instanceof Jn)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 Da(e);if(i)return i;e.set("requestData",{model:r.model,reasoningEffort:r.reasoning?.effort,streaming:!!r.stream}),X.manualApprove&&await Rn();let s=performance.now(),l=await Or(r),c=performance.now()-s;if(Re.record(c,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Ha(l))return async function(e,t,o){await Ia(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Mn({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 F(e,async t=>{let o={value:null},a=0,i=performance.now(),l=nr(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 Pa(s);let l=s===i.data?i:{...i,data:s};Ce.add(1,{model:r.model,endpoint_type:"responses"}),Sa(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),Le.record(a,d),rr(e,s)}catch(t){throw Ke(p,e.get("requestSpan"),t),t}finally{o.value&&Hn(p,o.value),p.end(),d()}let m=e.get("requestId");m&&se.executeCompletion(m)}finally{e.get("resolveStreamComplete")?.()}})}const Ha=e=>Object.hasOwn(e,"output"),Ba=new H;Ba.post("/",async e=>{try{return await Ma(e)}catch(t){return await It(e,t)}});const Fa=new H;Fa.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 Ua=new H;Ua.get("/",async e=>{try{let t=await eo();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const La=new H;La.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);e.set("requestId",r),e.header("x-request-id",r);let p=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",p),e.set("requestTraceContext",p.spanContext());for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Ve.has(e)||p.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>Nn?t.slice(0,Nn):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let m,f=new Promise(e=>{m=e});e.set("streamComplete",f),e.set("resolveStreamComplete",m);let h=d.setSpan(u.active(),p);await u.with(h,async()=>{se.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw p.setStatus({code:c.ERROR,message:t.message}),p.recordException(t),e}});let g=e.get("requestData"),_={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:p};g?.streaming&&e.res.status<400?f.then(()=>qn(_)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{p.recordException(t),p.setStatus({code:c.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{p.end()}catch{}}):qn(_)}),La.use(B()),La.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()}),La.get("/",e=>e.text("Server running")),La.route("/health",gr),La.route("/chat/completions",fr),La.route("/models",$a),La.route("/embeddings",hr),La.route("/usage",Ua),La.route("/token",Fa),La.route("/v1/chat/completions",fr),La.route("/v1/models",$a),La.route("/v1/embeddings",hr),La.route("/v1/messages",Ta),La.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=br.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=br.perMessage+wr(e)*br.contentMultiplier}for(let e of t.messages)o+=br.perMessage,o+=wr(e.role),"string"==typeof e.content?o+=wr(e.content)*br.contentMultiplier:Array.isArray(e.content)&&(o+=vr(e.content));return t.tools&&t.tools.length>0&&(o+=function(e){let t=br.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=br.perTool),t+=wr(n.name),n.description&&(t+=br.perDesc+wr(n.description)),t+=xr(n.input_schema);return t}(t.tools)),e.json({input_tokens:Math.round(o)})}),La.route("/v1/responses",Ba),La.route("/responses",Ba);const za=[],Ga=Date.now();let Ja="";function Ka(){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()-Ga)/1e3}});for(let t of za)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=on("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",an,` ${Yo("COPILOT-API")} ${Xo(`v${e}`)} ${Xo("·")} ${_n(t)} uptime`,an,""," Check in from time to time on",` ${Zo(o)}`,"",an,""];console.log(n.join("\n"))}(Ja,Date.now()-Ga),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 Wa(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function Va(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=me.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:We({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:Wa(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()-Ga},"copilot_api")});if(X.models?.data)for(let e of X.models.data)a.addEvent("copilot_api.model.available",We(e,"model"));a.end(),Ge(_.INFO,"INFO","Server started",We({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-Ga},"copilot_api"))}async function Ya(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 xn(e)){let e=await vn(kn),t=await vn(bn);if(e&&t)return{cert:e,key:t,certPath:kn,keyPath:bn,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),$n(e)}(e.httpsHosts)}}async function Xa(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=ko;try{R(t),R(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(Ka(),za.push(()=>{o.debug("Cleaning up connectivity monitor"),Qe.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),Ft&&=void clearInterval(Ft),Lt&&=void Qe.off("online",Lt),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"),Fo&&=void clearInterval(Fo),Uo&&=void clearInterval(Uo);let e=[...Mo.keys(),...Ho];Mo.clear(),Ho.clear(),Do.clear(),Bo=void 0;for(let t of e)Lo(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 W(),X._v1="1.121.0-insider";let n=await Ao();Ja=n;let r=So();(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 $({resource:o,traceExporter:new w({url:`${n}/v1/traces`,headers:r}),metricReader:new T({exporter:new b({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x(new k({url:`${n}/v1/logs`,headers:r}))],instrumentations:[]}),le.start()})(n,Ga),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 Yt();try{a=await qt(),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),Ft=setInterval(()=>{Wt(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),Qe.start(),Lt=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Wt(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",Lt),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)}}();za.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),X.connectivity.h2&&(Jo(Go(it(X))),X.connectivity.h2Keepalive&&Wo()),Va({options:t,version:n,runtime:r,_u1:a});let l=await Ya(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=Vo({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=Vo({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=[...pn(e),...dn(e),...mn(e),...fn(),"",...un(cn),...hn(e),...gn(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 io()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),j({fetch:La.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)}function Za(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Qa=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)"}},run({args:e}){let t=e["rate-limit"],n=void 0===t?void 0:Za(t,"--rate-limit"),r=e.timeout,a=void 0===r?Y:Za(r,"--timeout"),i=e["connect-timeout"]??g.env.COPILOT_CONNECT_TIMEOUT_MS,s=void 0===i?15e3:Za(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(!On(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${Cn.join(", ")}`);let r=n.length>0?n:Cn,a=new Set,i=n.length>0,s=[];for(let e of r){if(!On(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});return Xa({port:Za(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"]})}});await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([Ao(),Ro()]);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 ${Io}@latest`,n=No("│"),r=` ${qo("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,a=` Run ${qo(o)} to update`,i=" ".repeat(54),s=No(`╭${"─".repeat(54)}╮`),l=No(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${jo(r,54)}${n}`,`${n}${i}${n}`,`${n}${jo(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:Qt,start:Qa,"check-usage":to,debug:Oo,"cowork-setup":$o}}));export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "copilot-api-node20",
3
- "version": "0.34.0",
3
+ "version": "0.34.2",
4
4
  "description": "Turn GitHub Copilot into OpenAI/Anthropic API compatible server. Usable with Claude Code! (Node v20+ fork)",
5
5
  "keywords": [
6
6
  "proxy",
@@ -66,14 +66,14 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "@opentelemetry/api": "^1.9.0",
69
- "@opentelemetry/api-logs": "^0.218.0",
70
- "@opentelemetry/exporter-logs-otlp-http": "^0.218.0",
71
- "@opentelemetry/exporter-metrics-otlp-http": "^0.218.0",
72
- "@opentelemetry/exporter-trace-otlp-http": "^0.218.0",
69
+ "@opentelemetry/api-logs": "^0.219.0",
70
+ "@opentelemetry/exporter-logs-otlp-http": "^0.219.0",
71
+ "@opentelemetry/exporter-metrics-otlp-http": "^0.219.0",
72
+ "@opentelemetry/exporter-trace-otlp-http": "^0.219.0",
73
73
  "@opentelemetry/resources": "^2.6.0",
74
- "@opentelemetry/sdk-logs": "^0.218.0",
74
+ "@opentelemetry/sdk-logs": "^0.219.0",
75
75
  "@opentelemetry/sdk-metrics": "^2.6.0",
76
- "@opentelemetry/sdk-node": "^0.218.0",
76
+ "@opentelemetry/sdk-node": "^0.219.0",
77
77
  "@opentelemetry/sdk-trace-base": "^2.6.0",
78
78
  "@opentelemetry/semantic-conventions": "^1.40.0",
79
79
  "ai-tokenizer": "^1.0.6",