copilot-api-node20 0.42.6 → 0.43.0
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 +2 -0
- package/dist/main.mjs +1 -1
- package/package.json +3 -4
package/README.md
CHANGED
|
@@ -295,6 +295,8 @@ This tool collects anonymous usage telemetry via [OpenTelemetry](https://opentel
|
|
|
295
295
|
|
|
296
296
|
When a server-side error occurs, an anonymous, sanitized error report (error type, status code, model, route, and runtime/version metadata -- never prompts, completions, headers, or tokens) is automatically sent to help diagnose and fix bugs. Disable it with `--no-error-reporting` or `COPILOT_API_ERROR_REPORTING=0`.
|
|
297
297
|
|
|
298
|
+
The startup banner's "Recent Posts" list is refreshed in the background at most once a day from `https://barazany.dev/posts.json` (a plain GET, nothing sent). It never delays startup and falls back to a cached or bundled list when offline. Disable it with `COPILOT_API_NO_BLOG=1` (`COPILOT_API_SKIP_UPDATE_CHECK=1` also disables it).
|
|
299
|
+
|
|
298
300
|
**By using copilot-api, you agree to this telemetry data collection.**
|
|
299
301
|
|
|
300
302
|
---
|
package/dist/main.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{SpanKind as l,SpanStatusCode as c,context as u,metrics as p,trace as d}from"@opentelemetry/api";import m from"clipboardy";import{execFile as f,execSync as h}from"node:child_process";import g from"node:process";import{SeverityNumber as _,logs as y}from"@opentelemetry/api-logs";import{OTLPLogExporter as w}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as b}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as T}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as A,ATTR_SERVICE_NAME as S,ATTR_SERVICE_VERSION as E}from"@opentelemetry/semantic-conventions";import{Client as C,request as O}from"undici";import{createHash as I,randomBytes as R,randomUUID as P}from"node:crypto";import{promisify as N}from"node:util";import{Hono as q}from"hono";import{cors as j}from"hono/cors";import{streamSSE as D}from"hono/streaming";import{events as M}from"fetch-event-stream";import{Tokenizer as H,models as B}from"ai-tokenizer";import*as U from"ai-tokenizer/encoding/claude";import{accessSync as F}from"node:fs";import{serve as L}from"srvx";import{isIP as G}from"node:net";import{generate as J}from"selfsigned";const W=s.join(i.homedir(),".local","share","copilot-api"),z={APP_DIR:W,GITHUB_TOKEN_PATH:s.join(W,"github_token"),MACHINE_ID_PATH:s.join(W,"machine_id"),SESSION_ID_PATH:s.join(W,"session_id")};async function K(){await a.mkdir(z.APP_DIR,{recursive:!0}),await V(z.GITHUB_TOKEN_PATH),await V(z.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:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}},Z=" │ ",Q=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()},ee=(e,t)=>e.padEnd(t),te=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),oe=(e,t,o)=>` --\x3e ${ee(e,4)} ${ee(t,21)} ${ee(o,3)}`,ne=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return ee(t,22)})(e.model??"—")+ee(t,8)},re=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?Q(Math.max(t-o,0)):"—",r=e?Q(e.outputTokens??0):"—",a=o?Q(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},ae=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${ee("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=Q(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},ie=e=>{if(void 0===e.ttfbMs)return`e2e ${te(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${te(e.ttfbMs)} → e2e ${te(e.e2eMs)} ${t}`},se=e=>e?X.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,le=e=>({...e?.inputTokens&&{"copilot_api.input_tokens":e.inputTokens},...e?.inputTokens&&{"copilot_api.fresh_input_tokens":Math.max(e.inputTokens-(e.cachedTokens??0),0)},...e?.outputTokens&&{"copilot_api.output_tokens":e.outputTokens},...e?.cachedTokens&&{"copilot_api.cached_tokens":e.cachedTokens}}),ce={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=>[oe(e.method,e.path,e.status),ne(e),re(e.tokenUsage),ae(e.tokenUsage,e.maxContextTokens),ie({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(Z))({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:se(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),ze(_.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:o,duration:n,upstreamTotal:r}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":n,...o?.model&&{"copilot_api.model":o.model},...o?.reasoningEffort&&{"copilot_api.reasoning_effort":o.reasoningEffort},...o?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==o?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(o.upstreamTtfbMs)},...void 0!==r&&{"copilot_api.upstream_total_ms":Math.round(r),"copilot_api.copilot_duration_ms":Math.round(r)},...le(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=n.get("requestData");o.warn((e=>[oe(e.method,e.path,"429"),ne(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${te(e.e2eMs)}`].join(Z))({method:n.req.method,path:n.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},logError(e,t,n){let{context:r,startTime:a}=e,i=Math.round(performance.now()-a),s=r.get("requestData");o.error((e=>{let t=oe(e.method,e.path,e.status.toString()),o=ne(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${te(e.e2eMs)}`].join(Z)})({method:r.req.method,path:r.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:n,e2eMs:i}))},cleanup(){let e=performance.now()-12e5;for(let[t,o]of this.completionCallbacks)o.startTime<e&&this.completionCallbacks.delete(t);if(this.completionCallbacks.size>1e3){let e=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),t=e.slice(0,e.length-1e3);for(let[e]of t)this.completionCallbacks.delete(e)}}};setInterval(()=>ce.cleanup(),6e4);let ue,pe,de=Date.now();const me={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function fe(){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):me;return{endpoint:e.replace(/\/$/,""),headers:t}}const he=d.getTracer("copilot-api"),ge=p.getMeter("copilot-api"),_e=y.getLogger("copilot-api"),ye=ge.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),we=ge.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),ke=ge.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),be=ge.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),ve=ge.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),xe=ge.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),Te=ge.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),$e=ge.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Ae=ge.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Se=ge.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ee=ge.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Ce=ge.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Oe=ge.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Ie=ge.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Re=ge.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Pe=ge.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Ne=ge.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),qe=ge.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),je=ge.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),De=ge.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Me=ge.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),He=ge.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Be=ge.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Ue=ge.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Fe=ge.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Le=ge.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Ge=ge.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Je=ge.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),We=ge.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function ze(e,t,o,n,r){let a=d.getActiveSpan()?.spanContext()??r;_e.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function Ke(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:c.ERROR,message:o??n.message}),e.recordException(n)}function Ve(e,t,o){Ke(e,o),t&&t!==e&&Ke(t,o)}function Ye(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,Ye(r,e)))}return o}ge.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!tt.getConnectivityStats().isOnline)}),ge.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(tt.getConnectivityStats().consecutiveFailures)}),ge.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(X.models?.data.length??0)}),ge.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ce.completionCallbacks.size)}),ge.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-de)/1e3)});const Xe=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","proxy-authorization"]);function Ze(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Xe.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function Qe(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:u}=e,p=he.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&Ze(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();Xe.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),Oe.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:c.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw Ke(p,e),p.end(),e}}async function et(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=he.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Ze(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&&!Xe.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Oe.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:c.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:l,span:f}}catch(e){throw Ke(f,e),f.end(),e}}const tt=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=he.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,Fe.record(r,{endpoint:e,result:"success"});break}Fe.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),Ee.add(1,{result:n?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&o.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),Ce.add(1,{from:"offline",to:"online"}),ze(_.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(o.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),Ce.add(1,{from:"online",to:"offline"}),ze(_.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,o.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*X.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:X.connectivity.jitterMaxMs>0,connectionPooling:X.connectivity.connectionPooling,dnsCache:X.connectivity.dnsCache}}},ot=()=>({"content-type":"application/json",accept:"application/json"}),nt="0.48.1",rt=`copilot-chat/${nt}`,at=`GitHubCopilotChat/${nt}`,it=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${z.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=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(R(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},st=async(e,t)=>{e.machineId||=await it(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(z.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=P();return await a.writeFile(z.SESSION_ID_PATH,e),await a.chmod(z.SESSION_ID_PATH,384),e})()},lt=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,ct=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=P(),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":rt,"User-Agent":at,"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":P(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},ut=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const pt=(e,t,o)=>{let n=ct(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&&ut.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},dt="https://api.github.com",mt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":rt,"user-agent":at,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),ft="https://github.com",ht="01ab8ac9400c4e429b23",gt=["user:email"].join(" ");function _t(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const yt=32768,wt=[{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_***"}],kt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);function bt(e){let t=e;for(let{regex:e,mask:o}of wt)t=t.replace(e,o);return t}const vt=new Map;function xt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function Tt(e,t,o){let n=bt(o),r=8*yt,a=n.length>r,i=a?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(i.length<=yt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=yt)e.setAttribute(`${t}.part_${o/yt}`,i.slice(o,o+yt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/yt))}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 $t(e,t){let o=function(e){if(vt.size>=1e3&&!vt.has(e)){let e=vt.keys().next().value;void 0!==e&&vt.delete(e)}let t,o=(vt.get(e)??0)+1;return vt.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&&Tt(e,"copilot_api.incoming_request_body",n);let r=At(t.c.req.header());return r&&Tt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&Tt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Tt(e,"copilot_api.outgoing_headers",At(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Tt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function At(e){let t={};for(let[o,n]of Object.entries(e))kt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function St(){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 Et(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:i.platform(),arch:i.arch()}}async function Ct(){try{return!!(await a.stat(z.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(z.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Ot(e){let t=await async function(){let[e,t]=await Promise.all([St(),Ct()]);return{version:e,runtime:Et(),paths:{APP_DIR:z.APP_DIR,GITHUB_TOKEN_PATH:z.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const It=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})=>Ot({json:e.json})}),Rt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Pt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Nt=new Set;let qt;function jt(e){if(X.errorReporting&&!(e.statusCode<500)&&!Nt.has(e.signature)){if(Nt.size>=1e3){let e=Nt.values().next().value;void 0!==e&&Nt.delete(e)}Nt.add(e.signature),async function(e){qt??=St();let t=await qt,o=Et(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(bt(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:_t(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(Rt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Pt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function Dt(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const Mt=new WeakSet;async function Ht(e,{attempt:t,maxRetries:n,operation:r}){return Dt(e)&&t<n?(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&Mt.add(e)}(e),!1)}var Bt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Ut=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Ft(e,t){return setTimeout(()=>e.abort(new Ut(t)),t)}const Lt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),Gt=RegExp(`\\b(?:${[...Lt].join("|")})\\b`);function Jt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function Wt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Jt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function zt(e){let t=e.code;return"string"==typeof t?t:void 0}function Kt(e){if(void 0===e.cause)return"";let t=Wt(e);if(t===e)return"";let o=zt(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function Vt(e){if(!(e instanceof Error))return!1;let{codes:t,messages:o}=function(e){let t=[],o=[],n=new Set,r=(e,a)=>{if(a>4||!(e instanceof Error)||n.has(e))return;n.add(e);let{code:i,errors:s,cause:l}=e;if("string"==typeof i&&t.push(i),o.push(e.message),Array.isArray(s))for(let e of s)r(e,a+1);r(l,a+1)};return r(e,0),{codes:t,messages:o}}(e);return!!t.some(e=>Lt.has(e))||!(t.length>0)&&(!!o.some(e=>Gt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Yt(e){return e.req.path.startsWith("/v1/messages")}function Xt(e,t){if(Yt(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}function Zt(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type?o.type=t.type:"string"==typeof t.code&&(o.type=t.code),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function Qt(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 eo(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 to(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=xt({endpointType:_t(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});$t(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function oo(e,t,o){let n=e.get("requestId"),r=ce.completionCallbacks.get(n);r&&(ce.logError(r,t,o),ce.completionCallbacks.delete(n))}function no(e,t){(function(e){return"object"==typeof e&&!!e&&Mt.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason","h2_retry_exhausted")}function ro(e){return Vt(e)||function(e){return Dt(e)||e instanceof Error&&Dt(e.cause)}(e)}async function ao(e,t){if(no(d.getActiveSpan(),t),t instanceof Bt&&429===t.response.status)return async function(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=ce.completionCallbacks.get(n);r&&(ce.logRateLimit(r,t.response),ce.completionCallbacks.delete(n)),xe.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=Xt(a,e),s=Zt(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),Qt(o,s),ze(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...eo(s)}),to({c:e,error:t,errorText:a,upstream:s}),e.json(i,429)}(e,t);if(t instanceof SyntaxError){d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),ze(_.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let o=Yt(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 oo(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Bt)return async function(e,t){let o=d.getActiveSpan(),n=await t.response.text(),r=Xt(n,e),a=Zt(r);return oo(e,t.response.status,a.message??t.message),o?.setStatus({code:c.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),Qt(o,a),ze(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...eo(a)}),to({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&jt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:xt({endpointType:_t(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message}),e.json(r,t.response.status)}(e,t);if(function(e){return e instanceof Ut||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Ut}(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Upstream request timed out"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","request_timeout");let n="Upstream request timed out (gateway timeout). Increase the timeout or retry.";ze(_.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=Yt(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return oo(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(ro(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?Wt(t):void 0,r=(n&&zt(n))??"none",a=n?.message??String(t);o?.setAttribute("copilot_api.transport_cause_code",r),o?.setAttribute("copilot_api.transport_cause_message",a);let i="Temporary upstream connection failure. Please retry.";ze(_.WARN,"WARN",i,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":r,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=Yt(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return oo(e,503,t instanceof Error?`${t.message}${Kt(t)}`:i),e.json(s,503)}(e,t);let n=d.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:c.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),ze(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),jt({route:e.req.path,statusCode:500,errorClass:r.name,signature:xt({endpointType:_t(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${Kt(r)}`}),oo(e,500,r.message),o.error(r);let a=Yt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const io=async()=>{let e=`${dt}/copilot_internal/v2/token`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Qe({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:mt(X),signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get Service token",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function so(){let e=`${dt}/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Qe({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 Bt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let lo=null;function co(){return lo||=io().then(({token:e})=>{X._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{lo=null}),lo}const uo=async()=>{let e=`${lt(X)}/models`,t=ct(X),o=X.timeoutMs,n=new AbortController,r=Ft(n,o);try{let{response:o,span:r}=await Qe({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Bt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Ke(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const po=e=>new Promise(t=>{setTimeout(t,e)}),mo=e=>null==e;async function fo(){let e=await(async()=>{try{return await uo()}catch(e){if(e instanceof Bt&&401===e.response.status)return await co(),uo();throw e}})();X.models=e}const ho=()=>{X._v1="1.140.0-insider"};var go=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let _o,yo,wo,ko,bo,vo=!1,xo=!1,To=!1;function $o(){return Ao()?bo:void 0}function Ao(){return void 0!==bo&&Date.now()-bo.at<6e4}function So(){return To?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const Eo=()=>a.readFile(z.GITHUB_TOKEN_PATH,"utf8");function Co(e){let{span:t,error:n,reason:r,refreshStart:a,attempt:i}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";X._t1=void 0,bo={status:s,message:l,at:Date.now()},clearInterval(_o),_o=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Ae.add(1,{reason:r,success:"false"}),Se.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:c.ERROR,message:n.message}),t.recordException(n),Ue.record(performance.now()-a,{reason:r}),ze(_.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":i,"copilot_api.token_refresh.terminal_status":s})}function Oo(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),Se.add(1,{reason:r}),Ue.record(performance.now()-a,{reason:r}),ze(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Io=async(e=5,t=1e3,n="scheduled")=>vo?(o.debug("Token refresh already in progress, coalescing"),yo):(vo=!0,yo=he.startActiveSpan("copilot_api.token.refresh",async r=>{let a=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let i=1;i<=e;i++)try{r.setAttribute("copilot_api.token_refresh.attempt",i),o.debug(`Refreshing Service token (${n}, attempt ${i}/${e})`);let{token:t,refresh_in:s}=await io();return X._t1=t,bo=void 0,xo&&void 0===_o&&(o.info("Token refresh recovered, resuming scheduled refresh"),Po(s)),o.debug("Service token refreshed successfully"),X.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Ae.add(1,{reason:n,success:"true"}),Ue.record(performance.now()-a,{reason:n}),void ze(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Bt&&(401===s.response.status||403===s.response.status))return void Co({span:r,error:s,reason:n,refreshStart:a,attempt:i});let l=i===e;if(o.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),Ae.add(1,{reason:n,success:"false"}),l)return void Oo({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(),vo=!1,yo=void 0}}),yo);async function Ro(){return!!X._t1||!Ao()&&(void 0!==bo&&To&&await async function(){if(yo)return;let e=(await Eo().catch(()=>{}))?.trim();e&&e!==X._t2?.trim()&&(X._t2=e,o.info("Picked up re-authenticated Auth token from disk"),X.showToken&&o.info("Auth token:",e))}(),await Io(3,250,"on-demand"),!!X._t1)}function Po(e){_o&&clearInterval(_o);let t=Math.max(1e3*(e-60),6e4);_o=setInterval(()=>{Io(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function No(e){try{let t=await Eo();if(t&&!e?.force)return X._t2=t,To=!0,X.showToken&&o.info("Auth token:",t),void await qo();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(`${ft}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:ht,scope:gt}),signal:e.signal});if(!t.ok)throw new Bt("Failed to get device code",t);return await t.json()}finally{clearTimeout(o)}}();o.debug("Device code response:",n),o.info(`Please enter the code "${n.user_code}" at ${n.verification_uri}`);try{m.writeSync(n.user_code),o.success("Code copied to clipboard — opening browser...")}catch{o.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,o=g.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",f(t,[e],()=>{})}catch{}}(n.verification_uri);let r=await async function(e){let t=1e3*(e.interval+1);o.debug(`Polling access token with interval of ${t}ms`),o.start("Waiting for authorization...");let n=Date.now(),r=1e3*e.expires_in;for(;;){if(Date.now()-n>=r)throw new go("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(`${ft}/login/oauth/access_token`,{method:"POST",headers:ot(),body:JSON.stringify({client_id:ht,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await po(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 go("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new go("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 po(t);continue}if(r.access_token)return r.access_token;await po(t)}catch(e){if(e instanceof go)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await po(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(z.GITHUB_TOKEN_PATH,e,{mode:384}))(r),X._t2=r,To=!0,X.showToken&&o.info("Auth token:",r),await qo()}catch(e){throw e instanceof Bt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function qo(){let e=await so();o.success(`Authenticated as ${e.login}`)}async function jo(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),X.showToken=e.showToken,await K(),await No({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 Do=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})=>jo({verbose:e.verbose,showToken:e["show-token"]})}),Mo=.01,Ho=864e5,Bo=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Uo=new Intl.NumberFormat("en-US"),Fo=e=>Bo.format(e*Mo),Lo=e=>e.credits_used??e.entitlement-e.remaining,Go=(e,t,o)=>{let n=(e=>{let t=new Date(`${e}T00:00:00Z`);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-1,1))})(t),r=(o.getTime()-n.getTime())/Ho;if(r<.5)return;let a=Lo(e),i=a*Mo/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Mo,c=new Date(n.getTime()+l/i*Ho);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Jo=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Uo.format(Lo(e))} of ${Uo.format(e.entitlement)} used`:"n/a",Wo=e=>e.padEnd(14),zo=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Wo("AI credits")}unlimited`);else{let e=Lo(o),t=o.percent_remaining;n.push(`${Wo("AI credits")}${Fo(e)} / ${Fo(o.entitlement)} ${t.toFixed(1)}% left`,`${Wo("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Wo("")}${Uo.format(e)} of ${Uo.format(o.entitlement)} credits`)}if(n.push("",`${Wo("Chat")}${Jo(e.quota_snapshots.chat)}`,`${Wo("Completions")}${Jo(e.quota_snapshots.completions)}`,"",`${Wo("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Ho)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=Go(o,e.quota_reset_date,t);r&&n.push(`${Wo("Burn rate")}~${Bo.format(r.usdPerDay)}/day${(e=>e.exhausted?" — allowance already exhausted":e.exhaustsOn?` — on track to exhaust ${(e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}))(e.exhaustsOn)}`:" — within allowance")(r)}`);let a=o.overage_permitted?"permitted, "+(o.overage_count>0?`${Uo.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Wo("Overage")}${a}`)}return n.join("\n")},Ko=async()=>{let e=`${dt}/copilot_internal/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Qe({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:mt(X),signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get usage",t);return await t.json()}catch(e){throw Ke(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Vo=()=>g.stdout.write("[2J[H"),Yo=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Xo=async()=>{let e=await Ko();return zo(e)},Zo=e({meta:{name:"check-usage",description:"Show current usage/quota information"},args:{watch:{alias:"w",type:"boolean",default:!1,description:"Keep running and refresh the report on an interval"},interval:{alias:"i",type:"string",default:"60",description:"Seconds between refreshes in --watch mode (min 10)"}},async run({args:e}){if(await K(),await No(),!e.watch){try{o.box(await Xo())}catch(e){o.error("Failed to fetch usage:",e),g.exit(1)}g.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?o.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&o.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),n=g.stdout.isTTY,r=()=>g.exit(0);for(g.on("SIGINT",r),g.on("SIGTERM",r);;){try{let e=await Xo();n&&Vo(),o.box(e),o.log(Yo(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Qo=N(f);async function en(){let e="win32"===g.platform?"where.exe":"which";try{return await Qo(e,["tailscale"]),!0}catch{return!1}}async function tn(){try{let{stdout:e}=await Qo("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function on(e){return e.replace(/\.$/,"")}async function nn(){let e=await tn();if(e?.Online)return on(e.DNSName)}const rn=N(f),an=e=>`[1m${e}[0m`,sn=e=>`[2m${e}[0m`,ln=e=>`[36m${e}[0m`,cn=e=>`[32m${e}[0m`,un=e=>`[31m${e}[0m`,pn=e=>`[33m${e}[0m`,dn=sn(" ─────────────────────────────────────────────────────────────"),mn=s.join(z.APP_DIR,"certs","tailscale"),fn=s.join(mn,"cert.pem"),hn=s.join(mn,"key.pem"),gn={certDir:mn,certPath:fn,keyPath:hn};function _n(){switch(g.platform){case"darwin":return[` ${sn("Install Tailscale for macOS:")}`,` ${ln("https://tailscale.com/download/mac")}`,` ${sn("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${sn("After installing, open the Tailscale app and sign in.")}`,` ${sn("Then re-run this command.")}`].join("\n");case"linux":return[` ${sn("Install Tailscale for Linux:")}`,` ${ln("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${ln("sudo tailscale up")}`,` ${sn("or")} ${ln("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${sn("Install Tailscale for Windows:")}`,` ${ln("https://tailscale.com/download/windows")}`,"",` ${sn("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${sn("Install Tailscale:")} ${ln("https://tailscale.com/download")}`}}function yn(){let e=[` ${un("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${sn("Open the Tailscale app from Applications and sign in.")}`,` ${sn("Download:")} ${ln("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${sn("Open the Tailscale app and sign in.")}`,` ${sn("Download:")} ${ln("https://tailscale.com/download/windows")}`):e.push(` ${sn("Connect with:")} ${ln("sudo tailscale up")}`),e.push("",` ${sn("Then re-run this command.")}`),e.join("\n")}async function wn(){try{return await a.access(fn),await a.access(hn),!0}catch{return!1}}function kn(e){console.log(""),console.log(dn),console.log(` ${an("Claude Cowork Setup")} ${sn("— Diagnostic")}`),console.log(dn),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?cn("✅"):"missing"===n.status?un("❌"):pn("❓");let r=n.detail?sn(` ${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(` ${cn("All checks passed.")}`):console.log(` ${un(`${t.length} issue(s).`)} Run ${ln("copilot-api cowork-setup install")} to fix.`),console.log("")}const bn={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},vn=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await en();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return kn(e),console.log(""),console.log(_n()),void console.log("");let o=await tn();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},kn(e),console.log(yn()),void console.log("");let n=on(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await wn();e["tailscale-cert"]=r?{status:"ok",detail:fn}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),kn(e)}(),g.exit(0)}}),xn=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:bn},async run({args:e}){await async function(e){if(console.log(""),console.log(dn),console.log(` ${an("Claude Cowork Setup")} ${sn("— Install")}`),console.log(dn),console.log(""),!await en())return console.log(` ${un("Tailscale is not installed.")}`),console.log(""),console.log(_n()),console.log(""),console.log(` ${sn("After installing, run")} ${ln("tailscale up")} ${sn("to connect, then re-run this command.")}`),void console.log("");let t=await tn();if(!t||!t.Online)return console.log(yn()),void console.log("");let n=on(t.DNSName);if(console.log(` ${sn("Tailscale hostname:")} ${an(n)}`),console.log(""),console.log(` ${an("Generating TLS certificate via Tailscale…")}`),console.log(` ${sn("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${ln(`$ tailscale cert --cert-file ${fn} --key-file ${hn} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(mn,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await rn("tailscale",["cert","--cert-file",fn,"--key-file",hn,n]),console.log(` ${cn("✓ 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(dn),console.log(` ${an("Next steps")}`),console.log(dn),console.log(""),console.log(` ${an("1.")} Start the proxy:`),console.log(` ${ln("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${an("2.")} In Cowork ${sn("→")} Settings ${sn("→")} Inference Provider, set:`),console.log(` ${an("inferenceGatewayBaseUrl")} = ${ln(`https://${n}:<port>`)}`),console.log(` ${sn("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${an("3.")} Restart Cowork ${sn("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${sn("For Cowork's own configuration docs, see:")}`),console.log(` ${ln("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),Tn=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:bn},async run({args:e}){await async function(e){if(console.log(""),console.log(dn),console.log(` ${an("Claude Cowork Setup")} ${sn("— Revert")}`),console.log(dn),console.log(""),!await wn())return console.log(` ${sn("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${an("Remove Tailscale cert files:")}`),console.log(` ${sn(fn)}`),console.log(` ${sn(hn)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(mn,{recursive:!0}),console.log(` ${cn("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${sn("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),$n=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:vn,install:xn,revert:Tn}});function An(e){let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],a=r.match(/^\[[0-9;]*[a-z]/i);t+=a?r.slice(a[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function Sn(e){if("string"==typeof e)return An(e);if(Array.isArray(e))return e.map(e=>Sn(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?Sn(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}const En="x-copilot-api-self-test",Cn=P();const On=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function In(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==e.capabilities.type&&!function(e){let t=e.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e.id)}(e)&&!function(e){return"disabled"===e.policy?.state}(e)}function Rn(e){try{!function(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),a=t.res.status,i=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",a),n.setAttribute("copilot_api.model",i),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();Xe.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:c.ERROR,message:`HTTP ${a}`})}(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:a,requestId:i}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:a};if(ye.add(1,d),je.record(s,d),c>=400&&we.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&&(ke.add(e.inputTokens,t),Le.record(e.inputTokens,t)),e.outputTokens&&(be.add(e.outputTokens,t),Ge.record(e.outputTokens,t)),e.cachedTokens&&ve.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ce.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const Pn=1048576;const Nn=async()=>he.startActiveSpan("copilot_api.approval.await",async e=>{let t=performance.now();try{let n=await o.prompt("Accept incoming request?",{type:"confirm"}),r=performance.now()-t;if(e.setAttribute("copilot_api.approval.wait_duration_ms",r),We.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Re.add(1,{result:"rejected"}),new Bt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Re.add(1,{result:"approved"})}finally{e.end()}});async function qn(e){if(X._t1||await Ro())return null;let t=$o();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; re-authenticate with \`copilot-api auth\`, then restart the proxy`,type:"authentication_error"}},401)):(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function jn(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function Dn(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 Mn=[{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"}],Hn="claude-haiku-4.5",Bn={haiku:Hn,"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){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of Mn)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=Bn[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 Fn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Ln(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=Fn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=Fn.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 Te.add(1,{requested_model:e}),new Gn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Wn(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)}async function zn(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return he.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"),xe.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Bt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),xe.add(1,{action:"waited",source:"local"}),He.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await po(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Kn=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Vn(e){if(e instanceof Kn)return{type:e.type,message:e.message};if(e instanceof Bt){let t=e.response.status;return{type:529===t?"overloaded_error":`upstream_error_${t}`,message:`Upstream error (${t}) while streaming response`}}return{type:"api_error",message:"Stream interrupted before completion"}}async function Yn(e,t){let{type:n,message:r}=Vn(t);try{await e.writeSSE({event:"error",data:JSON.stringify({type:"error",error:{type:n,message:r}})})}catch(e){o.debug("Failed to emit Anthropic stream error frame:",e)}}async function Xn(e,t){let{type:n,message:r}=Vn(t);try{await e.writeSSE({event:"error",data:JSON.stringify({error:{message:r,type:n}})})}catch(e){o.debug("Failed to emit OpenAI stream error frame:",e)}}function Zn(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 Qn(e,t,o){return Math.min(Math.max(e,t),o)}function er(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 er(JSON.parse(r),t+1)}catch{return null}}function tr(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Zn(o.capabilities.supports.min_thinking_budget),r=Zn(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Zn(o.capabilities.limits?.max_output_tokens)??void 0}}function or(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Qn(Zn(e.requestedBudget)??o,o,n),a=Zn(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 nr(e,t){if(mo(e.thinking_budget))return e;let o=tr(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=or({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 rr(e){return"invalid_thinking_budget"===er(e)}async function ar(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(mo(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(!rr(i))return null;let l=tr(n,t.model);return l?function(e,t){let o=or({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=Zn(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 ir(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 sr(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const lr=new Map,cr=new Map,ur=new Set;let pr,dr,mr;function fr(e){return!e.closed&&!e.destroyed}function hr(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 lr.set(t,Date.now()),Ne.add(1,{event:"created",origin:e}),ze(_.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{o.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{o.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(n,r,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=ur.has(t);Ne.add(1,{event:"goaway",origin:e}),ze(i?_.WARN:_.DEBUG,i?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),cr.delete(t),ur.delete(t),lr.delete(t),fr(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function gr(e,t){if(!X.connectivity.h2)return;if(pr&&pr!==e&&function(){for(let e of[...cr.keys(),...ur])fr(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});cr.clear(),ur.clear(),lr.clear()}(),pr=e,t?.fresh){let t=hr(e);return ur.add(t),t}let n=Date.now();for(let[t]of cr)if(n-(lr.get(t)??0)>=6e5)cr.delete(t),lr.delete(t),fr(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ne.add(1,{event:"rotated",origin:e}),ze(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(fr(t))return cr.delete(t),ur.add(t),t;cr.delete(t),lr.delete(t)}let r=hr(e);return ur.add(r),r}function _r(e){e&&ur.delete(e)&&(fr(e)?cr.set(e,Date.now()):lr.delete(e))}function yr(){mr||(mr=setInterval(()=>{!function(){let e=Date.now(),t=X.connectivity.h2Keepalive,n=cr.size;for(let[r,a]of cr)e-a<6e4||t&&n<=1||(cr.delete(r),lr.delete(r),n--,fr(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ne.add(1,{event:"idle_reaped",origin:pr??""}),ze(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${pr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":pr??""}))}()},3e4),mr.unref())}function wr(){dr||(o.debug("Starting HTTP/2 keepalive (every 45s)"),dr=setInterval(()=>{(async function(){if(0===cr.size&&0===ur.size){if(pr){let e=hr(pr);cr.set(e,Date.now())}return}let e=[...cr.keys()];for(let t of e)cr.delete(t);await Promise.allSettled(e.map(async e=>{if(fr(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:ct(X)});await n.dump(),Pe.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),cr.set(e,Date.now())}catch(t){Pe.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ne.add(1,{event:"error",origin:pr??""}),lr.delete(e),fr(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else lr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),dr.unref(),yr())}function kr(e){return e.max_completion_tokens??e.max_tokens}async function br(e,t,o){try{if(!e.ok)throw new Bt("Failed to create chat completions",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&Dn(t,n.usage),n}catch(e){throw Ke(t,e),e}finally{t.end()}}const vr=async e=>{let t=Sn(e);try{return await xr(t)}catch(e){if(e instanceof Bt&&401===e.response.status)return await co(),xr(t);let n;if(e instanceof Bt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await ar({payload:t,error:e,models:X.models,errorBodyText:n});if(r)return e instanceof Bt&&void 0!==n&&o.warn(`Upstream rejected thinking_budget (status ${e.response.status}): ${n.slice(0,500)}`),o.warn("Adjusting thinking_budget payload and retrying once..."),await xr(Sn(r));throw e}},xr=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)),o=e.messages.some(e=>["assistant","tool"].includes(e.role)),n={...ct(X,t),"X-Initiator":o?"agent":"user"},r=lt(X),a=`${r}/chat/completions`,i=X.timeoutMs,s=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=kr(e);return null==i?a:{...a,max_completion_tokens:i}}(e,X.models),l=JSON.stringify(s),c={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":i,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":kr(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=gr(r,{fresh:t>0}),s=new AbortController,u=Ft(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await et({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}),m=new Response(p,{status:r,headers:u});if(e.stream){if(!m.ok)throw d.end(),new Bt("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:M(m),span:d,release:()=>_r(o)}}try{return await br(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{_r(o)}}catch(e){if(_r(o),await Ht(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Tr(e,t,o){try{if(!e.ok)throw new Bt("Failed to create responses",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&Dn(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Ke(t,e),e}finally{t.end()}}const $r=async e=>{try{return await Ar(e)}catch(t){if(t instanceof Bt&&401===t.response.status)return await co(),Ar(e);throw t}},Ar=async e=>{if(!X._t1)throw Error("Service token not found");let t=Sn(e),o={...ct(X),"X-Initiator":"agent"},n=lt(X),r=`${n}/responses`,a=X.timeoutMs,i=JSON.stringify(t),s={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":a,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let l=gr(n,{fresh:e>0}),c=new AbortController,u=Ft(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await et({spanName:"copilot POST /responses",url:r,target:"responses",headers:o,body:i,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...s,"copilot_api.h2.retry_attempt":e},dispatcher:l}),m=new Response(p,{status:n,headers:u});if(t.stream){if(!m.ok)throw d.end(),new Bt("Failed to create responses",m,{outgoingBody:i,outgoingHeaders:o});return{events:M(m),span:d,release:()=>_r(l)}}try{return await Tr(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{_r(l)}}catch(t){if(_r(l),await Ht(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Sr=e=>Object.hasOwn(e,"output");function Er(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens}:null}var Cr=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const Or=new Set(["model","messages","max_tokens","max_completion_tokens","temperature","top_p","stream","stream_options","tools","tool_choice","parallel_tool_calls","user","reasoning_effort","response_format"]);function Ir(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Cr(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Cr(`logprobs is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","logprobs")}(e);let t=function(e){return e.filter(e=>"system"===e.role||"developer"===e.role).map(e=>Pr(e.content)).filter(Boolean).join("\n\n")||void 0}(e.messages),o=function(e){let t=[];for(let o of e)switch(o.role){case"user":{let e=Nr(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=Pr(o.content);e&&t.push({type:"message",role:"assistant",content:[{type:"output_text",text:e}]});for(let e of o.tool_calls??[])t.push({type:"function_call",call_id:e.id,name:e.function.name,arguments:e.function.arguments});break}case"tool":t.push({type:"function_call_output",call_id:o.tool_call_id??"",output:Pr(o.content)})}return t}(e.messages);if(0===o.length)throw new Cr("request has no translatable message content","invalid_request","messages");let n={model:e.model,input:o,store:!1};t&&(n.instructions=t);let r=e.max_completion_tokens??e.max_tokens;"number"==typeof r&&(n.max_output_tokens=Math.max(r,16)),e.stream&&(n.stream=!0),Rr(e.temperature)&&(n.temperature=e.temperature),Rr(e.top_p)&&(n.top_p=e.top_p),Rr(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),Rr(e.user)&&(n.user=e.user),e.reasoning_effort&&(n.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(n.tools=e.tools.filter(e=>"function"===e.type).map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters}))),e.tool_choice&&(n.tool_choice="string"==typeof e.tool_choice?e.tool_choice:{type:"function",name:e.tool_choice.function.name});let a=function(e){if(e)switch(e.type){case"json_schema":{let{name:t,description:o,schema:n,strict:r}=e.json_schema;return{type:"json_schema",name:t,description:o,schema:n,strict:r}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return a&&(n.text={format:a}),n}function Rr(e){return null!=e}function Pr(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Nr(e){if("string"==typeof e)return e?[{type:"input_text",text:e}]:[];let t=[];for(let o of e??[])if("text"===o.type)o.text&&t.push({type:"input_text",text:o.text});else{if("image_url"!==o.type)throw new Cr(`content part type '${o.type}' is not supported for models served via the Responses API`,"unsupported_content_type","messages");t.push({type:"input_image",image_url:o.image_url.url,detail:"low"===o.image_url.detail?"low":"high"})}return t}function qr(e){let t={prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens};return void 0!==e.input_tokens_details?.cached_tokens&&(t.prompt_tokens_details={cached_tokens:e.input_tokens_details.cached_tokens}),void 0!==e.output_tokens_details?.reasoning_tokens&&(t.completion_tokens_details={reasoning_tokens:e.output_tokens_details.reasoning_tokens}),t}function jr(e,t){if("incomplete"===e.status){let t=e.incomplete_details?.reason;if("content_filter"===t)return"content_filter";if("max_output_tokens"===t)return"length"}return t?"tool_calls":"stop"}function Dr(e,t,o=null){let n=e.roleSent?t:{role:"assistant",...t};return e.roleSent=!0,{id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[{index:0,delta:n,logprobs:null,finish_reason:o}]}}function Mr(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Hr(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Mr(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Dr(t,{tool_calls:[{index:r,function:{arguments:o.arguments}}]})]):[];let a=function(e,t,o){let n=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,n),e.toolCallIndexByOutputIndex.set(o,n),n}(t,o.id,e.output_index),i=n?o.arguments:"";return i&&t.toolCallsWithArgs.add(a),[Dr(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Br(e,t){let o=[Dr(e,{},jr(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=qr(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Ur(e,t){switch(e.type){case"response.created":case"response.in_progress":return t.id=e.response.id||t.id,t.model=e.response.model||t.model,e.response.created_at&&(t.created=e.response.created_at),{chunks:[]};case"response.output_text.delta":case"response.refusal.delta":return e.delta?{chunks:[Dr(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Hr(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Mr(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Dr(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Br(t,e.response),done:!0};case"response.failed":return{chunks:[],error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}};case"error":return{chunks:[],error:{type:e.code??"api_error",message:e.message??"Response generation failed"}};default:return{chunks:[]}}}const Fr="openai_responses";function Lr(e){let t=performance.now(),n=he.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),Ir(e)}finally{t.end()}});Be.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!Or.has(e)&&null!=t).map(([e])=>e)}(e);return r.length>0&&o.debug(`Dropped chat-only fields with no Responses API equivalent: ${r.join(", ")}`),n}function Gr(e){let t=performance.now(),o=he.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",o=!1,n=[];for(let r of e.output)if("message"===r.type)for(let e of r.content)"output_text"===e.type?(t+=e.text,o=!0):"refusal"===e.type&&(t+=e.refusal,o=!0);else"function_call"===r.type&&n.push({id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments}});let r={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:o?t:null,...n.length>0&&{tool_calls:n}},logprobs:null,finish_reason:jr(e,n.length>0)}]};return e.usage&&(r.usage=qr(e.usage)),r}(e)}finally{t.end()}});return Be.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Jr(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=qr(t.usage);a.tokenUsage=jn(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(Gr(t))}async function Wr(e,t,n){let r;try{r=Lr(t)}catch(t){if(t instanceof Cr)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),X.manualApprove&&!n.isSelfTest&&await Nn();let a=await qn(e);if(a)return a;let i=performance.now(),s=await $r(r),l=performance.now()-i;if(De.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Sr(s))return Jr(e,s,l);let{events:c,span:u,release:p}=s,m=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return D(e,async t=>{let n=null,a=0,s=performance.now(),d=ir(e,i);try{try{for await(let i of c){if(d(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Ie.add(1,{model:r.model,endpoint_type:Fr});let c=Er(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=jn(c),t._d1=l,e.set("requestData",t)}let u=Ur(s,m);if(u.error)throw new Kn(u.error.type,u.error.message);for(let e of u.chunks)await t.writeSSE({data:JSON.stringify(e)});u.done&&await t.writeSSE({data:"[DONE]"})}let u={model:r.model,endpoint_type:Fr};Me.record(performance.now()-s,u),Je.record(a,u),sr(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await Xn(t,o),o}finally{n&&Dn(u,n),u.end(),p()}let f=e.get("requestId");f&&ce.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function zr(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 Kr(e){let t=!0===e.get("isSelfTest");t||await zn(X);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return he.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),$e.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}(n)}catch(t){if(t instanceof 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(Wn(n.model))return Wr(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),X.manualApprove&&!t&&await Nn(),n=function(e){if(!mo(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!mo(e.max_tokens))return e;let t=(X.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return o.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(n),n=nr(n,X.models),mo(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await qn(e);if(r)return r;let a=performance.now(),i=await vr(n),s=performance.now()-a;if(De.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Vr(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=jn(i.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return D(e,async t=>{let o={value:null},r=0,i=performance.now(),p=ir(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Ie.add(1,{model:n.model,endpoint_type:"openai"}),i=zr(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=jn(t),n._d1=s,e.set("requestData",n)})),await t.writeSSE(i)}let c=performance.now()-i,u={model:n.model,endpoint_type:"openai"};if(Me.record(c,u),Je.record(r,u),sr(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=jn(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw Ve(c,e.get("requestSpan"),o),await Xn(t,o),o}finally{o.value&&Dn(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ce.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Vr=e=>Object.hasOwn(e,"choices"),Yr=new q;Yr.post("/",async e=>{try{return await Kr(e)}catch(t){return await ao(e,t)}});const Xr=new q;Xr.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=await qn(e);if(o)return o;let n=performance.now(),r=await(async e=>{if(!X._t1)throw Error("Service token not found");let t=`${lt(X)}/embeddings`,o=ct(X),n=X.timeoutMs,r=new AbortController,a=Ft(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await Qe({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1}});try{if(!n.ok)throw new Bt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Ke(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),a=performance.now()-n;De.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=jn(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await ao(e,t)}});const Zr=new q;let Qr=null,ea=null;function ta(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function oa(e){return!ta(e)}Zr.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=Qr;return t&&e-t.timestamp<3e4?{result:t.result}:ea||(ea=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${lt(X)}/models`,n=await fetch(t,{method:"GET",headers:ct(X),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Qr={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Qr={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),ea=null}})(),ea)}();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.42.6",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 na=new H(U),ra={...B["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function aa(e){try{return na.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function ia(e){let t=0;for(let o of e)switch(o.type){case"text":t+=aa(o.text)*ra.contentMultiplier;break;case"tool_use":t+=aa(o.name+JSON.stringify(o.input))*ra.contentMultiplier;break;case"tool_result":o.content&&(t+=aa("string"==typeof o.content?o.content:JSON.stringify(o.content))*ra.contentMultiplier);break;case"thinking":t+=aa(o.thinking)*ra.contentMultiplier;break;case"image":t+=1600}return t}function sa(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?ra.perFirstProp:ra.perAdditionalProp,t+=aa(o),r.description&&(t+=ra.perPropDesc+aa(r.description)),r.enum&&Array.isArray(r.enum)){t+=ra.perEnum;for(let e of r.enum)t+=aa(String(e))}if("object"===r.type&&r.properties&&(t+=ra.perNestedObject,t+=sa(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=ra.perArrayOfObjects,t+=sa(e))}}return t}function la(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 ca(e,t,o){let n=la(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const ua=async(e,t,n)=>{try{return await pa(e,t)}catch(r){if(r instanceof Bt&&401===r.response.status)return await co(),pa(e,t);if(r instanceof Bt&&400===r.response.status&&n?.onStructuredOutputFallback){let a;try{a=await r.response.clone().text()}catch{a=void 0}let i=n.onStructuredOutputFallback(e,a);if(i)return o.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${i.model}`),pa(i,t)}throw r}};const pa=async(e,t)=>{if(!X._t1)throw Error("Service token not found");let{metadata:o,...n}=Sn(e),r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...pt(X,t,r),"X-Initiator":"agent"},i=lt(X),s=`${i}/v1/messages`,l=X.timeoutMs,c=JSON.stringify(n),u=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",...la(e,t?.anthropicBeta)}}(n,t,l);for(let e=0;e<=1;e++){let t=gr(i,{fresh:e>0}),r=new AbortController,p=Ft(r,l);try{let{statusCode:o,headers:i,body:p,span:d}=await et({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:a,body:c,signal:r.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(p,{status:o,headers:i});if(!m.ok)throw d.end(),new Bt("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:a});if(n.stream)return{events:M(m),span:d,release:()=>_r(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&&Dn(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(),_r(t)}}catch(o){if(_r(t),await Ht(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},da=new Set(["low","medium","high","max","xhigh"]);function ma(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=Ln(t,n);if(!r||!da.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 fa(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function ha(e,t){let o={model:e.model,messages:ga(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:ba(e.tools),tool_choice:va(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=tr(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=Zn(t),a=r&&r>1?r-1:o.min;return Qn(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=nr({...o,thinking_budget:a},t)}}return o}function ga(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:_a(e)}]:[{role:"system",content:_a(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:ka(e.content)});n.length>0&&t.push({role:"user",content:ka(n)})}else t.push({role:"user",content:ka(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:wa(e.reasoning_text),reasoning_opaque:wa(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:ka(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:ka(e.content),...t}]}(e));return[...o,...n]}function _a(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const ya=32768;function wa(e){if("string"==typeof e)return e.length<=ya?e:e.slice(0,ya)}function ka(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 ba(e){if(e)return e.filter(oa).map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function va(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 xa(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 Ta(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function $a(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 Aa=new Set(["low","medium","high","max","xhigh"]);function Sa(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&&Aa.has(e)?e:null)(Ln(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 Ea(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 Ca=/[^\w-]/g;function Oa(e){return e.replaceAll(Ca,"_")}function Ia(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=Sa(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:Ea(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:Oa(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Oa(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Ra(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 Pa(e,t,o=400){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function Na(e,t){return he.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),ca(n,t,e.req.header("anthropic-beta"));let r=Jn(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Ra(t);return a?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}):r===t.model?(n.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(n.setAttribute("copilot_api.model.was_mapped",!0),$e.add(1,{from_model:t.model,to_model:r}),o.debug(`Model mapping: '${t.model}' → '${r}'`),{ok:!0,payload:{...t,model:r}})}catch(t){if(t instanceof Gn)return{ok:!1,response:Pa(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function qa(e){let t=function(e){let t=[];for(let o of e)"user"===o.role?t.push(...Da(o)):t.push(...Ha(o));return t}(e.messages);if(0===t.length)throw new Bt("request has no translatable message content",Response.json({type:"error",error:{type:"invalid_request_error",message:"request has no translatable message content"}},{status:400}));let o={model:e.model,input:t,max_output_tokens:Math.max(e.max_tokens,16),stream:e.stream,temperature:e.temperature,top_p:e.top_p,store:!1,user:e.metadata?.user_id?.slice(0,64)},n=function(e){return e?function(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}("string"==typeof e?e:e.map(e=>e.text).join("\n\n")):null}(e.system);return n&&(o.instructions=n),e.tools?.length&&(o.tools=e.tools.filter(oa).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(o.tool_choice=function(e){switch(e.type){case"auto":return"auto";case"any":return"required";case"none":return"none";case"tool":return e.name?{type:"function",name:e.name}:void 0;default:return}}(e.tool_choice)),"adaptive"===e.thinking?.type?o.reasoning={effort:ja(e.output_config?.effort??"high")}:"enabled"===e.thinking?.type&&e.thinking.budget_tokens&&(o.reasoning=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens)),o}function ja(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Da(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(Ma(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)"text"===t.type?e.push({type:"input_text",text:t.text}):e.push({type:"input_image",image_url:`data:${t.source.media_type};base64,${t.source.data}`,detail:"high"});t.push({type:"message",role:"user",content:e})}else{let e=n.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function Ma(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 Ha(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 Ba(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 Ua(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Fa(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":Fa(t,o,{responseId:e.response.id,model:e.response.model});break;case"response.in_progress":case"response.output_text.done":case"response.function_call_arguments.done":break;case"response.output_item.added":if("function_call"===e.item.type){Fa(t,o),Ua(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":Fa(t,o),Ua(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":Ua(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":{Ua(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:Ba(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":{Fa(t,o),Ua(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":Fa(t,o),Ua(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":Fa(t,o),Ua(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":Fa(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 Ga(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 Ja(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Wa(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&&(Ga(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&&(Ga(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Ja(t,o)),r.content&&(Ja(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){Ja(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&&(Ja(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:fa(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 za=/structured_outputs|output_config\.format/i;function Ka(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&za.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Ia({...e,model:Hn},o):null}var Va=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Ya=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const Xa={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 Qe({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("tavily.results_count",e.results.length),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw Ke(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Ya: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 Qe({spanName:"exa POST /search",url:"https://api.exa.ai/search",target:"exa_search",method:"POST",headers:{"Content-Type":"application/json","x-api-key":e},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"exa.max_results":n?.maxResults??5,"exa.has_include_domains":!!n?.includeDomains?.length,"exa.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("exa.results_count",e.results.length),o.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw Ke(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Va:e}finally{clearTimeout(i)}}},Za=["tavily","exa"];function Qa(e){return"tavily"===e||"exa"===e}function ei(){return X.webSearchProviders.length>0}async function ti(e,t){return async function(e,t,n){let{providers:r,searchFns:a=Xa}=n;if(0===r.length)throw Error("No web search provider configured");let i,s=[];for(let[n,l]of r.entries())try{let n=await a[l.name](l.key,e,t);return s.length>0&&o.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),n}catch(e){i=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);n!==r.length-1&&o.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${r[n+1].name}".`)}let l=i instanceof Error?i.message:String(i);throw o.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),i instanceof Error?i:Error("All web search providers failed")}(e,t,{providers:X.webSearchProviders})}function oi(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function ni(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function ri(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return t&&ta(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!ei())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await ti(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_${oi()}`,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:ni(e)}];return{id:`msg_ws_${oi()}`,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_${oi()}`,r=`msg_ws_${oi()}`,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:ni(e)}},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),D(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const ai=(e,t)=>!(!e||!t||e===t);async function ii(e){if(X._t1||await Ro())return null;let t=$o();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${So()}`}},401)):(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function si(e,t){let o=t.model;return o&&"string"==typeof o?null:Pa(e,"Model name is required and must be a string")}async function li(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&ta(t[0])}(t))return si(e,t)??ri(e,t);await zn(X),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=si(e,t);if(a)return a;t=function(e,t){return ma(t,X.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Na(e,t);if(!i.ok)return i.response;t=i.payload;let s=await ii(e);if(s)return s;if(Wn(t.model))return di(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t,o){let n=Ia(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:ai(o,a),streaming:!!n.stream}),X.manualApprove&&await Nn(),he.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),ca(t,n,r.anthropicBeta);try{let o=performance.now(),a=await ua(n,r,{onStructuredOutputFallback:(e,o)=>{let n=Ka(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(De.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=jn(ui(t)),o._d1=i,o.upstreamTtfbMs=i,o.upstreamTotalMs=i,e.set("requestData",o)}return t.end(),e.json(o)}let{events:s,span:l,release:c}=a;return D(e,async r=>{let a=0,i=performance.now(),u={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=ir(e,o);try{try{for await(let e of s)d(),e.data&&"[DONE]"!==e.data?(a++,Ie.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),pi(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"};Me.record(e,t),Je.record(a,t)}catch(t){throw Ve(l,e.get("requestSpan"),t),await Yn(r,t),t}finally{if(sr(e,o),p){let t=ui(u);Dn(l,t);let o=e.get("requestData")||{};o.tokenUsage=jn(t),e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&ce.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Ke(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=he.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),ha(t,X.models)}finally{o.end()}});Be.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=nr(c,X.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:ai(r,u),streaming:!!c.stream});let p=performance.now();X.manualApprove&&await Nn();let d=await vr(c),m=performance.now()-p;if(De.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),ci(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=jn(d.usage)),t._d1=m,t.upstreamTtfbMs=m,t.upstreamTotalMs=m,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(d).slice(-400));let r=performance.now(),a=he.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=Ta(a.message),i=xa(a.message.content),s=$a(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:fa(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(d);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return Be.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}o.debug("Streaming response from service");let{events:f,span:h,release:g}=d;return D(e,async t=>{let n=null,r=0,a=performance.now(),i=ir(e,p),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of f){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let l;try{l=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,Ie.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=jn(n),t._d1=m,e.set("requestData",t)}let u=Wa(l,s);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let l=performance.now()-a,u={model:c.model,endpoint_type:"anthropic"};if(Me.record(l,u),Je.record(r,u),sr(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=jn(n),t._d1=m,e.set("requestData",t))}}catch(o){throw Ve(h,e.get("requestSpan"),o),await Yn(t,o),o}finally{n&&Dn(h,n),h.end(),g()}let l=e.get("requestId");l&&ce.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const ci=e=>Object.hasOwn(e,"choices");function ui(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 pi(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}async function di(e,t){let r=performance.now(),a=he.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),qa(t)}finally{e.end()}});Be.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),X.manualApprove&&await Nn();let i=performance.now(),s=await $r(a),l=performance.now()-i;if(De.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Sr(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=jn({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=he.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:Ba(e.status,o),stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}(s)}finally{e.end()}});return Be.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return D(e,async t=>{let n=null,r=0,s=performance.now(),d=ir(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++,Ie.add(1,{model:a.model,endpoint_type:"responses"});let c=Er(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=jn(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"};Me.record(u,p),Je.record(r,p),sr(e,i)}catch(o){throw Ve(u,e.get("requestSpan"),o),await Yn(t,o),o}finally{n&&Dn(u,n),u.end(),p()}let f=e.get("requestId");f&&ce.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const mi=new q;mi.post("/",async e=>{try{return await li(e)}catch(t){return await ao(e,t)}});const fi=new q;function hi(e){return he.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),$e.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function gi(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=jn(o),n._d1=t._d1,t.c.set("requestData",n)}fi.get("/",async e=>{try{X.models||await fo();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 ao(e,t)}});const _i=new Set(["message","function_call","function_call_output"]),yi=new Set(["type","name","description","parameters"]);async function wi(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||!ei())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await ti(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function ki(e){if(ei())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await wi(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function bi(e){if(!ei())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 wi(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function vi(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 _i.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function xi(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 Ti(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&&xi(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)xi(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function $i(e){return null!=e}function Ai(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Si(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Ei(e){let t={model:e.model},{input:o,droppedInputTypes:n}=function(e){if(!Array.isArray(e))return{input:e,droppedInputTypes:[]};let t=new Set,o=[];for(let n of e){if(!Ai(n)){o.push(n);continue}let e=vi(n);null===e?t.add(Si(n.type)):o.push(e)}return{input:o,droppedInputTypes:[...t]}}(e.input);void 0!==o&&(t.input=o);for(let o of["previous_response_id","prompt","conversation","instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])$i(e[o])&&(t[o]=e[o]);let r=new Set;if($i(e.tools)){let o=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let o=e.type;if("web_search"===o||o.startsWith("web_search_"))return{type:e.type};let n={};for(let t of Object.keys(e))yi.has(t)&&(n[t]=e[t]);return"custom"===n.type&&(n.type="function",t.add(n.name),n.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),n}),customToolNames:t}}(e.tools);t.tools=o.tools,r=o.customToolNames}if($i(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},$i(o.effort)&&(t.reasoning.effort=o.effort),$i(o.summary)&&(t.reasoning.summary=o.summary)}if($i(e.text)&&"object"==typeof e.text){let o=e.text;$i(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Ci(e,t){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Oi(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=d.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||$i(n.previous_response_id)||$i(n.prompt)||$i(n.conversation)?null:Ci(e,`input contains no supported items: every item was dropped (unsupported item types: ${r.join(", ")}). Provide at least one message, function_call or function_call_output item, or previous_response_id, prompt or conversation.`)}async function Ii(e){if(X._t1)return null;if(!await Ro()){let t=$o();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${So()}`,type:"authentication_error"}},401)):(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}return null}async function Ri(e){await zn(X);let t=await e.req.json();if(!Ai(t))return Ci(e,"request body must be a JSON object");let n=Ei(t),{customToolNames:r}=n,a=n.payload;o.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),r.size>0&&o.debug(`Custom tools detected: ${[...r].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:hi(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,a);if(!i.ok)return i.response;a=i.payload;let s=Oi(e,t.input,n);if(s)return s;let l=await Ii(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),X.manualApprove&&await Nn();let c=performance.now(),u=await $r(a),p=performance.now()-c;if(De.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Pi(u))return async function(e,t,o){await ki(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=jn({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return D(e,async t=>{let o={value:null},n=0,i=performance.now(),s=ir(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Ti(i.data,r);s=await bi(s);let l=s===i.data?i:{...i,data:s};Ie.add(1,{model:a.model,endpoint_type:"responses"}),gi(s,{usageRef:o,c:e,_d1:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};Me.record(l,u),Je.record(n,u),sr(e,c)}catch(o){throw Ve(m,e.get("requestSpan"),o),await Xn(t,o),o}finally{o.value&&Dn(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ce.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Pi=e=>Object.hasOwn(e,"output"),Ni=new q;Ni.post("/",async e=>{try{return await Ri(e)}catch(t){return await ao(e,t)}});const qi=new q;qi.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 ji=new q;ji.get("/",async e=>{try{let t=await Ko();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Di=new q;function Mi(){return function(e){let t=e.filter(e=>In(e));if(0===t.length)return;let o=t.find(e=>On.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(X.models?.data??[])}function Hi(e,t,o){let n=function(e){if(!e)return;try{let t=JSON.parse(e),o=t.error?.message??t.message;if("string"==typeof o&&o.length>0)return An(o).slice(0,200)}catch{}let t=An(e).trim();return t.length>0?t.slice(0,200):void 0}(t),r=n?` (upstream: ${n})`:"";switch(!0){case 401===e:case 403===e:return`Authentication/entitlement failed (HTTP ${e}). Your GitHub Copilot subscription may be inactive, or the Auth token is invalid. Run \`copilot-api auth\` to re-authenticate; if it persists, this account has no active Copilot access${r}.`;case 402===e:return`Premium monthly quota exhausted (HTTP 402). Switch to a non-premium model (e.g. claude-haiku-4.5) or wait for the monthly quota reset${r}.`;case 400===e:return`Model '${o}' was rejected (HTTP 400). On individual plans only some models are entitled — try claude-haiku-4.5, or run \`copilot-api doctor\` to see what works${r}.`;case 413===e:return`Request too large (HTTP 413)${r}.`;case 429===e:return`Rate limited upstream (HTTP 429) — wait and retry${r}.`;case 503===e:return`Service not ready (HTTP 503) — the model catalog or Service token is still warming up. Retry in a few seconds${r}.`;case e>=500:return`Upstream error (HTTP ${e})${r}.`;default:return`Unexpected response (HTTP ${e})${r}.`}}async function Bi(e={}){let t=performance.now(),o=e.model&&function(e){let t=X.models?.data.find(t=>t.id===e);return void 0!==t&&In(t)}(e.model)?e.model:Mi();if(!o)return{ok:!1,durationMs:0,reason:"No models available — the catalog is empty (upstream /models failed at startup). Check connectivity and authentication."};let n,r=e.timeoutMs??3e4,a=()=>Math.round(performance.now()-t),i=(async()=>{try{let e=await Di.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[En]:Cn},body:JSON.stringify({model:o,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(e.ok)return{ok:!0,model:o,status:e.status,durationMs:a()};let t=await e.text().catch(()=>"");return{ok:!1,model:o,status:e.status,durationMs:a(),reason:Hi(e.status,t,o),detail:t.slice(0,400)||void 0}}catch(e){let t=e instanceof Error?e.message:String(e);return{ok:!1,model:o,durationMs:a(),reason:`Request failed before a usable response: ${t}`,detail:t}}})(),s=new Promise(e=>{n=setTimeout(()=>{e({ok:!1,model:o,durationMs:a(),reason:`Did not complete within ${r}ms. If you started with --manual, approve the request or use --no-smoke-test; otherwise the upstream may be slow or unreachable.`})},r)});try{return await Promise.race([i,s])}finally{n&&clearTimeout(n)}}Di.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=_t(i),p=function(e){return e===Cn}(e.req.header(En));e.set("requestId",r),e.set("isSelfTest",p),e.header("x-request-id",r);let m=he.startSpan("copilot_api.handle_request",{kind:l.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",m),e.set("requestTraceContext",m.spanContext()),p&&m.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Xe.has(e)||"x-copilot-api-self-test"!==e&&m.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=await e.req.raw.clone().text();e.set("rawBody",t.length>Pn?t.slice(0,Pn):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let f,h=new Promise(e=>{f=e});e.set("streamComplete",h),e.set("resolveStreamComplete",f);let g=d.setSpan(u.active(),m);await u.with(g,async()=>{p||ce.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw m.setStatus({code:c.ERROR,message:t.message}),m.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:m};_?.streaming&&e.res.status<400?h.then(()=>Rn(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{m.recordException(t),m.setStatus({code:c.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{m.end()}catch{}}):Rn(y)}),Di.use(j()),Di.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()}),Di.get("/",e=>e.text("Server running")),Di.route("/health",Zr),Di.route("/chat/completions",Yr),Di.route("/models",fi),Di.route("/embeddings",Xr),Di.route("/usage",ji),Di.route("/token",qi),Di.route("/v1/chat/completions",Yr),Di.route("/v1/models",fi),Di.route("/v1/embeddings",Xr),Di.route("/v1/messages",mi),Di.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=ra.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=ra.perMessage+aa(e)*ra.contentMultiplier}for(let e of t.messages)o+=ra.perMessage,o+=aa(e.role),"string"==typeof e.content?o+=aa(e.content)*ra.contentMultiplier:Array.isArray(e.content)&&(o+=ia(e.content));let n=t.tools?.filter(oa);return n&&n.length>0&&(o+=function(e){let t=ra.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=ra.perTool),t+=aa(n.name),n.description&&(t+=ra.perDesc+aa(n.description)),t+=sa(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),Di.route("/v1/responses",Ni),Di.route("/responses",Ni),Di.onError((e,t)=>ao(t,e));const Ui=e=>`[1m${e}[0m`,Fi=e=>`[2m${e}[0m`,Li=e=>`[32m${e}[0m`,Gi=e=>`[31m${e}[0m`,Ji=e=>`[33m${e}[0m`,Wi=Fi(" ─────────────────────────────────────────────────────────────");function zi(e,t,o){console.log(` ${function(e){return"ok"===e?Li("✓"):"warn"===e?Ji("⚠"):Gi("✗")}(e)} ${Ui(t.padEnd(14))} ${o}`)}function Ki(e){console.log(` ${Fi("↳")} ${Fi(e)}`)}function Vi(e){return e instanceof Bt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function Yi(){let e=g.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await a.readFile(z.GITHUB_TOKEN_PATH,"utf8")).trim();return e.length>0?e:void 0}catch{return}}();return t?{token:t,source:"stored file"}:void 0}async function Xi(){try{await fo();let e=(X.models?.data.length??0)>0;return zi(e?"ok":"warn","Model catalog",e?function(){let e=X.models?.data??[],t={Claude:0,OpenAI:0,Gemini:0,Embedding:0};for(let o of e)o.id.startsWith("text-embedding")?t.Embedding++:"Anthropic"===o.vendor?t.Claude++:"Google"===o.vendor?t.Gemini++:t.OpenAI++;let o=Object.entries(t).filter(([,e])=>e>0).map(([e,t])=>`${e}: ${t}`);return`${e.length} models (${o.join(", ")})`}():"empty"),e}catch(e){return zi("fail","Model catalog",Vi(e)),Ki("Could not fetch /models — check connectivity/auth."),!1}}async function Zi(e){X.accountType=e.accountType;let t=await St(),o=Et();if(console.log(""),console.log(` ${Ui("COPILOT-API DOCTOR")} ${Fi(`v${t}`)}`),console.log(Wi),zi("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await K(),ho(),!await async function(){let e=await Yi();if(!e)return zi("fail","Auth token","not found"),void Ki("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");X._t2=e.token,zi("ok","Auth token",`found (${e.source})`);try{let e=await so();return await st(X,e.login),zi("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return zi("fail","GitHub auth",Vi(e)),void Ki("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(Wi),console.log(` ${Gi("✗")} ${Ui("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await io();return X._t1=e,zi("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Bt?e.response.status:0;return zi("fail","Service token",Vi(e)),Ki(401===t?"Auth token is invalid/expired — run `copilot-api auth`.":403===t?"No active GitHub Copilot subscription on this account. Re-auth won't help.":"Transient/network issue — check connectivity and retry."),!1}}(),r=!!n&&await Xi();await async function(){try{let e=await Ko(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Fo(Lo(t))} of ${Fo(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;zi("ok","Copilot plan",`${e.copilot_plan} · ${o} `+Fi(`(resets ${e.quota_reset_date})`))}catch(e){zi("warn","Copilot plan",`unavailable (${Vi(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Bi();return e.ok?(zi("ok","Generation",`works via ${e.model} ${Fi(`(${e.durationMs}ms)`)}`),!0):(zi("fail","Generation",`${e.reason}${e.status?Fi(` [HTTP ${e.status}]`):""}`),!1)}():zi("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let o of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let n=g.env[o];n&&("ANTHROPIC_BASE_URL"===o&&/\/v1\/*$/.test(n)&&(t="warn",e.push(`${o}=${n} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(n)&&(t="warn",e.push(`${o}=${n} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){zi(t,"Client config","potential base-URL issue");for(let t of e)Ki(t)}else zi("ok","Client config","no base-URL issues detected");Ki("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(Wi),a?(console.log(` ${Li("✓")} ${Ui("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Ji("⚠")} ${Ui("Some checks need attention")} — see the ${Gi("✗")}/${Ji("⚠")} lines above.`),console.log(""),2)}const Qi=e({meta:{name:"doctor",description:"Diagnose your setup end-to-end: token, auth, entitlement, model catalog, and one real generation. Tells you exactly what's wrong and how to fix it."},args:{"account-type":{alias:"a",type:"string",default:"individual",description:"Account type to check against (individual, business, enterprise)"}},async run({args:e}){let t=await Zi({accountType:e["account-type"]});g.exit(t)}});function es(e){return{log(t,r){let a=o.level>=n.debug;if(t.level!==n.warn||a)for(let o of e)o.log(t,r)}}}let ts=!1;const os="copilot-api-node20",ns=`https://registry.npmjs.org/${os}/latest`,rs=e=>`[1m${e}[0m`,as=e=>`[33m${e}[0m`;async function is(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(ns,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function ss(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}function ls(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=g;if("win32"===e){try{if(h(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=o.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),r=Object.entries(e).filter(([,e])=>void 0!==e);switch(n){case"powershell":o=r.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":o=r.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":o=r.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(" ");o=r.length>0?`export ${e}`:"";break}}return o&&t?`${o}${"cmd"===n?" & ":" && "}${t}`:o||t}const cs=e=>`[1m${e}[0m`,us=e=>`[2m${e}[0m`,ps=e=>`[36m${e}[0m`,ds=e=>`[32m${e}[0m`,ms=e=>`[33m${e}[0m`,fs=e=>`[4m${e}[0m`,hs=(e,t)=>`]8;;${e}\\${t}]8;;\\`,gs="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",_s="https://github.com/johnib/copilot-api-issues/issues",ys=us(" ─────────────────────────────────────────────────────────────");function ws(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function ks(e){return e&&0!==e.length?e.join("·"):"—"}const bs=[{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 vs(e){if(0===e.length)return[];let t=["",ys,` ${cs("BARAZANY.DEV")} ${us("— Recent Posts")}`,ys,""];for(let[o,n]of e.entries()){let e=`${n.url}${gs}`,r=hs(e,cs(fs(`[${o+1}]`)));t.push(` ${r} ${ps(n.title)}`,` ${us("→")} ${us(n.teaser)}`,"")}return t.push(ys,` ${hs(`https://barazany.dev/blog${gs}`,"barazany.dev/blog")}`,ys),t}function xs(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(us(" → "))} ${ds("✓")}`:us("off"),n=["",` ${cs("COPILOT-API")} ${us(`v${e.version}`)}`,ys,` ${us("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${us("User")} ${e.user} ${us("·")} ${e.accountType}`];return X._v1&&n.push(` ${us("Client")} VSCode ${X._v1}`),n.push(` ${us("Network")} ${t.join(us(" · "))}`,` ${us("Search")} ${o}`),e.clipboardCopied&&n.push(` ${us("Clipboard")} Claude Code command ${ds("✓")}`),n.push(ys),n}function Ts(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${cs("Active")}`];if(e.model){let o=X.models?.data.find(t=>t.id===e.model),n=ws(o?.capabilities.limits?.max_context_window_tokens),r=ks(o?.capabilities.supports.reasoning_effort);t.push(` ${ps(e.model.padEnd(32))} ${us("ctx")} ${cs(n.padStart(5))} ${us("effort")} ${us(r)} ${ms("← main")}`)}if(e.smallModel){let o=X.models?.data.find(t=>t.id===e.smallModel),n=ws(o?.capabilities.limits?.max_context_window_tokens),r=ks(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${us("ctx")} ${n.padStart(5)} ${us("effort")} ${us(r)} ${ms("← small")}`)}return t}function $s(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("",` ${cs(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?ps("●"):us("·"),i=n?ps(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?ws(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${ks(r.effort)}`;t.push(` ${a} ${i} ${us(s)}${us(l)}`)}}return t}function As(){let e=_s.replace(/^https:\/\//,""),t=hs(`${_s}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",ys,` ${cs("FOUND A BUG?")} ${us("— Report it on GitHub")}`,ys,"",` ${ps("→")} ${ps(t)}`,` ${us("Bug reports, feature requests, and questions welcome.")}`,"",ys]}function Ss(e){if(!e.endpoints)return[];let{scheme:t,port:o,hostname:n}=e.endpoints,r=n?`${t}://${n}:${o}`:`${t}://<your-tailscale-hostname>:${o}`,a=["",ys,` ${cs("Claude Cowork")} ${us("— Settings → Inference Provider")}`,ys,"",` ${us("Paste into")} ${cs("inferenceGatewayBaseUrl")}${us(":")}`,` ${cs(ps(r))}`];return n||a.push("",` ${us("Your Tailscale hostname is shown by:")} ${ps("tailscale status --self")}`),a.push("",` ${us("Docs:")} ${ps("https://claude.com/docs/cowork/3p/installation")}`),a}function Es(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",ys,` ${cs("HTTPS")} ${us("— self-signed cert")}`,ys,"",` ${us("Cert")} ${t}`];switch(o.push("",` ${cs("Trust this cert")} ${us("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${us("macOS:")}`,` ${ps("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${ps(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${us("Windows (PowerShell as Administrator):")}`,` ${ps(`Import-Certificate -FilePath "${t}" \``)}`,` ${ps("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${us("Linux (Debian/Ubuntu):")}`,` ${ps(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${ps("sudo update-ca-certificates")}`,` ${us("Linux (Fedora/RHEL/Arch):")}`,` ${ps(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${ps("sudo update-ca-trust")}`);break;default:o.push(` ${us("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${us("Or, for Node CLIs only (no admin needed):")}`,` ${ps(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,ys),o}function Cs(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 Os=s.join(z.APP_DIR,"certs"),Is=s.join(Os,"cert.pem"),Rs=s.join(Os,"key.pem"),Ps=s.join(Os,"cert.meta.json");async function Ns(e){try{return await a.readFile(e,"utf8")}catch{return}}async function qs(e){let t=await Ns(Is),o=await Ns(Rs),n=await async function(){let e=await Ns(Ps);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 js(e){return 0!==G(e)}async function Ds(e){await a.mkdir(Os,{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)js(t)?i.add(t):r.add(t);let s=[...[...r].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))],l=await J([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:o,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:s}]});return await a.writeFile(Is,l.cert,{mode:420}),await a.writeFile(Rs,l.private,{mode:384}),await async function(e){await a.writeFile(Ps,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:Is,keyPath:Rs,generated:!0}}const Ms=[],Hs=Date.now();let Bs="";function Us(){let e=async(e,t=0)=>{let n=he.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()-Hs)/1e3}});for(let t of Ms)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=hs("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",ys,` ${cs("COPILOT-API")} ${us(`v${e}`)} ${us("·")} ${Cs(t)} uptime`,ys,""," Check in from time to time on",` ${ps(o)}`,"",ys,""];console.log(n.join("\n"))}(Bs,Date.now()-Hs),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 Fs(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function Ls(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=he.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Ye({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:Fs(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()-Hs},"copilot_api")});if(X.models?.data)for(let e of X.models.data)a.addEvent("copilot_api.model.available",Ye(e,"model"));a.end(),ze(_.INFO,"INFO","Server started",Ye({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-Hs},"copilot_api"))}async function Gs(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 qs(e)){let e=await Ns(Is),t=await Ns(Rs);if(e&&t)return{cert:e,key:t,certPath:Is,keyPath:Rs,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Ds(e)}(e.httpsHosts)}}async function Js(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=gn;try{F(t),F(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(Us(),Ms.push(()=>{o.debug("Cleaning up connectivity monitor"),tt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),xo=!1,_o&&=void clearInterval(_o),wo&&=void tt.off("online",wo),ko&&=void tt.off("offline",ko),yo=void 0,bo=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),dr&&=void clearInterval(dr),mr&&=void clearInterval(mr);let e=[...cr.keys(),...ur];cr.clear(),ur.clear(),lr.clear(),pr=void 0;for(let t of e)fr(t)&&(Ne.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!ue)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([ue.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,X.errorReporting=function(e){let t=g.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===g.env.COPILOT_H2_KEEPALIVE||"true"===g.env.COPILOT_H2_KEEPALIVE,t=e||"1"===g.env.COPILOT_H2||"true"===g.env.COPILOT_H2;X.connectivity.h2=t,X.connectivity.h2Keepalive=e}(),await K(),ho();let n=await St();Bs=n;let r=Et();(function(e,t){t&&(de=t),pe=crypto.randomUUID();let o=v({[S]:"copilot-api",[E]:e,[A]:pe}),{endpoint:n,headers:r}=fe();ue=new $({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new T({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x({exporter:new w({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),ue.start()})(n,Hs),t._t2&&o.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let a,i=t._t2||g.env.GH_TOKEN;i?(function(e){X._t2=e,To=!1}(i),o.info("Using provided Auth token")):await No();try{a=await so(),await st(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 io();X._t1=e,o.debug("Service token fetched successfully!"),X.showToken&&o.info("Service token:",e),xo=!0,Po(t),tt.start(),wo=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Io(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},ko=()=>{o.debug("Network connectivity lost")},tt.on("online",wo),tt.on("offline",ko)})(),await async function(){try{return await fo(),!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(()=>{fo().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{fo().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)}}();Ms.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),X.connectivity.h2&&(_r(gr(lt(X))),X.connectivity.h2Keepalive&&wr()),Ls({options:t,version:n,runtime:r,_u1:a});let l=await Gs(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=ls({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=ls({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=[...xs(e),...Ts(e),...$s(e),...As(),"",...vs(bs),...Ss(e),...Es(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 nn()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),L({fetch:Di.fetch,port:t.port,hostname:t.hostname,tls:l?{cert:l.cert,key:l.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(c,t.hostname,t.port),t.smokeTest&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await Bi({model:t});if(r.ok){let t=void 0===n||["::1","127.0.0.1","localhost"].includes(n)?`Point your client at ${e}`:`Point your client at ${e} — you bound ${n}, so from another machine/container replace \`localhost\` with this host's reachable IP/hostname.`;return void o.success(`Self-test passed — generation works via ${r.model} (${r.durationMs}ms). ${t}`)}let a=r.status?` (HTTP ${r.status})`:"";o.warn(`Self-test FAILED${a}: ${r.reason??"unknown error"}`),r.detail&&o.info(` detail: ${An(r.detail)}`),o.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){o.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(u,t.smallModel??t.model,t.hostname)}function Ws(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const zs=e({meta:{name:"start",description:"Start the API server"},args:{port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},"error-reporting":{type:"boolean",default:!0,description:"Send anonymous, sanitized error reports to the maintainer to help fix bugs (no prompts, completions, or tokens). Use --no-error-reporting or COPILOT_API_ERROR_REPORTING=0 to disable."},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"[DEPRECATED — set the TAVILY_API_KEY env var instead] Tavily API key for web search."},"web-search-provider":{type:"string",description:'Web search failover order, e.g. "exa,tavily" (first = primary, rest = fallbacks). Web search turns on when TAVILY_API_KEY and/or EXA_API_KEY are set; this flag is optional and only orders the providers you configured.'},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"},"smoke-test":{type:"boolean",default:!0,description:"After startup, run one tiny self-test generation to verify the proxy works end-to-end and print a clear PASS/FAIL. Disable with --no-smoke-test (or COPILOT_API_NO_SMOKE_TEST=1)."}},run({args:e}){let t=e["rate-limit"],n=void 0===t?void 0:Ws(t,"--rate-limit"),r=e.timeout,a=void 0===r?Y:Ws(r,"--timeout"),i=e["connect-timeout"]??g.env.COPILOT_CONNECT_TIMEOUT_MS,s=void 0===i?15e3:Ws(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(!Qa(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${Za.join(", ")}`);let r=n.length>0?n:Za,a=new Set,i=n.length>0,s=[];for(let e of r){if(!Qa(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||g.env.TAVILY_API_KEY,exaApiKey:g.env.EXA_API_KEY,order:p}),m=(g.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),f=""!==m&&"0"!==m&&"false"!==m;return Js({port:Ws(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"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!f})}});ts||(ts=!0,o.setReporters([es(o.options.reporters)])),await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([St(),is()]);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 ${os}@latest`,n=as("│"),r=` ${rs("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${rs(o)} to update`,i=" ".repeat(54),s=as(`╭${"─".repeat(54)}╮`),l=as(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${ss(r,54)}${n}`,`${n}${i}${n}`,`${n}${ss(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(e,t)}catch{}}();const Ks=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Do,start:zs,"check-usage":Zo,debug:It,doctor:Qi,"cowork-setup":$n}});await t(Ks);export{};
|
|
2
|
+
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{SpanKind as l,SpanStatusCode as c,context as u,metrics as p,trace as d}from"@opentelemetry/api";import m from"clipboardy";import{execFile as f,execSync as h}from"node:child_process";import g from"node:process";import{SeverityNumber as _,logs as y}from"@opentelemetry/api-logs";import{OTLPLogExporter as w}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as b}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as T}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as A,ATTR_SERVICE_NAME as S,ATTR_SERVICE_VERSION as E}from"@opentelemetry/semantic-conventions";import{Client as C,request as O}from"undici";import{createHash as I,randomBytes as P,randomUUID as R}from"node:crypto";import{promisify as N}from"node:util";import{Hono as q}from"hono";import{cors as j}from"hono/cors";import{streamSSE as D}from"hono/streaming";import{events as M}from"fetch-event-stream";import{Tokenizer as H,models as F}from"ai-tokenizer";import*as B from"ai-tokenizer/encoding/claude";import U,{accessSync as L}from"node:fs";import{serve as G}from"srvx";import{isIP as z}from"node:net";import{generate as J}from"selfsigned";const W=s.join(i.homedir(),".local","share","copilot-api"),K={APP_DIR:W,GITHUB_TOKEN_PATH:s.join(W,"github_token"),MACHINE_ID_PATH:s.join(W,"machine_id"),SESSION_ID_PATH:s.join(W,"session_id")};async function V(){await a.mkdir(K.APP_DIR,{recursive:!0}),await Y(K.GITHUB_TOKEN_PATH),await Y(K.SESSION_ID_PATH)}async function Y(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const X=6e5,Z={accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:X,webSearchProviders:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}},Q=" │ ",ee=e=>{if(e>=1e6){let t=e/1e6;return Number.isInteger(t)?`${t}M`:`${t.toFixed(1)}M`}return e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString()},te=(e,t)=>e.padEnd(t),oe=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),ne=(e,t,o)=>` --\x3e ${te(e,4)} ${te(t,21)} ${te(o,3)}`,re=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return te(t,22)})(e.model??"—")+te(t,8)},ae=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ee(Math.max(t-o,0)):"—",r=e?ee(e.outputTokens??0):"—",a=o?ee(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},ie=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${te("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ee(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},se=e=>{if(void 0===e.ttfbMs)return`e2e ${oe(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${oe(e.ttfbMs)} → e2e ${oe(e.e2eMs)} ${t}`},le=e=>e?Z.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,ce=e=>({...e?.inputTokens&&{"copilot_api.input_tokens":e.inputTokens},...e?.inputTokens&&{"copilot_api.fresh_input_tokens":Math.max(e.inputTokens-(e.cachedTokens??0),0)},...e?.outputTokens&&{"copilot_api.output_tokens":e.outputTokens},...e?.cachedTokens&&{"copilot_api.cached_tokens":e.cachedTokens}}),ue={completionCallbacks:new Map,registerCompletion(e,t,o){this.completionCallbacks.set(e,{context:t,startTime:o,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(e){let{context:t,startTime:n}=e,r=Math.round(performance.now()-n),a=t.get("requestData"),i=a?.upstreamTotalMs??a?._d1,s=(e=>[ne(e.method,e.path,e.status),re(e),ae(e.tokenUsage),ie(e.tokenUsage,e.maxContextTokens),se({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(Q))({method:t.req.method,path:t.req.path,status:t.res.status.toString(),model:a?.model,reasoningEffort:a?.reasoningEffort,effortClamped:a?.effortClamped,tokenUsage:a?.tokenUsage,maxContextTokens:le(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),Ke(_.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:o,duration:n,upstreamTotal:r}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":n,...o?.model&&{"copilot_api.model":o.model},...o?.reasoningEffort&&{"copilot_api.reasoning_effort":o.reasoningEffort},...o?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==o?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(o.upstreamTtfbMs)},...void 0!==r&&{"copilot_api.upstream_total_ms":Math.round(r),"copilot_api.copilot_duration_ms":Math.round(r)},...ce(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=n.get("requestData");o.warn((e=>[ne(e.method,e.path,"429"),re(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${oe(e.e2eMs)}`].join(Q))({method:n.req.method,path:n.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},logError(e,t,n){let{context:r,startTime:a}=e,i=Math.round(performance.now()-a),s=r.get("requestData");o.error((e=>{let t=ne(e.method,e.path,e.status.toString()),o=re(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${oe(e.e2eMs)}`].join(Q)})({method:r.req.method,path:r.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:n,e2eMs:i}))},cleanup(){let e=performance.now()-12e5;for(let[t,o]of this.completionCallbacks)o.startTime<e&&this.completionCallbacks.delete(t);if(this.completionCallbacks.size>1e3){let e=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),t=e.slice(0,e.length-1e3);for(let[e]of t)this.completionCallbacks.delete(e)}}};setInterval(()=>ue.cleanup(),6e4);let pe,de,me=Date.now();const fe={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function he(){let e=process.env.OTEL_EXPORTER_OTLP_ENDPOINT??"https://api.honeycomb.io",t=process.env.OTEL_EXPORTER_OTLP_HEADERS?function(e){return e?Object.fromEntries(e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf("=");return-1===t?[e,""]:[decodeURIComponent(e.slice(0,t)),decodeURIComponent(e.slice(t+1))]})):{}}(process.env.OTEL_EXPORTER_OTLP_HEADERS):fe;return{endpoint:e.replace(/\/$/,""),headers:t}}const ge=d.getTracer("copilot-api"),_e=p.getMeter("copilot-api"),ye=y.getLogger("copilot-api"),we=_e.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),ke=_e.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),be=_e.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),ve=_e.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),xe=_e.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),Te=_e.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),$e=_e.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Ae=_e.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Se=_e.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Ee=_e.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ce=_e.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Oe=_e.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Ie=_e.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Pe=_e.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Re=_e.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ne=_e.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),qe=_e.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),je=_e.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),De=_e.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Me=_e.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),He=_e.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Fe=_e.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Be=_e.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Ue=_e.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Le=_e.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Ge=_e.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),ze=_e.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Je=_e.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),We=_e.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function Ke(e,t,o,n,r){let a=d.getActiveSpan()?.spanContext()??r;ye.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function Ve(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:c.ERROR,message:o??n.message}),e.recordException(n)}function Ye(e,t,o){Ve(e,o),t&&t!==e&&Ve(t,o)}function Xe(e,t=""){let o={};if(null==e)return o;if("object"!=typeof e)return("string"==typeof e||"number"==typeof e||"boolean"==typeof e)&&t&&(o[t]=e),o;if(Array.isArray(e))return t&&(o[t]=JSON.stringify(e)),o;for(let[n,r]of Object.entries(e)){let e=t?`${t}.${n}`:n;void 0!==r&&"function"!=typeof r&&(null===r?o[e]="null":"object"!=typeof r||Array.isArray(r)?Array.isArray(r)?o[e]=JSON.stringify(r):("string"==typeof r||"number"==typeof r||"boolean"==typeof r)&&(o[e]=r):Object.assign(o,Xe(r,e)))}return o}_e.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!ot.getConnectivityStats().isOnline)}),_e.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(ot.getConnectivityStats().consecutiveFailures)}),_e.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(Z.models?.data.length??0)}),_e.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ue.completionCallbacks.size)}),_e.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-me)/1e3)});const Ze=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","proxy-authorization"]);function Qe(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Ze.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function et(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:u}=e,p=ge.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&Qe(p,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();Ze.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),Ie.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:c.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw Ve(p,e),p.end(),e}}async function tt(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=ge.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Qe(f,"request",a);try{let{statusCode:e,headers:t,body:l}=await O(o,{method:r,headers:a,body:i,signal:s,headersTimeout:u,bodyTimeout:p,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!Ze.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Ie.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:c.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:l,span:f}}catch(e){throw Ve(f,e),f.end(),e}}const ot=new class extends EventTarget{isOnline=!0;lastChecked=(new Date).toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){o.debug("Starting connectivity monitor",{probeEndpoints:Z.connectivity.probeEndpoints,fastInterval:Z.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){o.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval)+Math.random()*Z.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ge.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),Z.connectivity.timeoutMs);try{let n=!1;for(let e of Z.connectivity.probeEndpoints)try{let t=performance.now(),o=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...Z.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Le.record(r,{endpoint:e,result:"success"});break}Le.record(r,{endpoint:e,result:"failed"})}catch(t){this.endpointFailureStats[e]=(this.endpointFailureStats[e]||0)+1,o.debug(`Probe failed for ${e}:`,t)}this.updateConnectivityState(n);let r=n?"online":"offline";e.setAttribute("copilot_api.connectivity.result",r),e.setAttribute("copilot_api.connectivity.consecutive_failures",this.consecutiveFailures),this.lastSuccessfulEndpoint&&e.setAttribute("copilot_api.connectivity.successful_endpoint",this.lastSuccessfulEndpoint),Ce.add(1,{result:n?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&o.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),Oe.add(1,{from:"offline",to:"online"}),Ke(_.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(o.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),Oe.add(1,{from:"online",to:"offline"}),Ke(_.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,o.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?Z.connectivity.slowProbeInterval:Z.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*Z.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:Z.connectivity.jitterMaxMs>0,connectionPooling:Z.connectivity.connectionPooling,dnsCache:Z.connectivity.dnsCache}}},nt=()=>({"content-type":"application/json",accept:"application/json"}),rt="0.48.1",at=`copilot-chat/${rt}`,it=`GitHubCopilotChat/${rt}`,st=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${K.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=I("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},lt=async(e,t)=>{e.machineId||=await st(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(K.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=R();return await a.writeFile(K.SESSION_ID_PATH,e),await a.chmod(K.SESSION_ID_PATH,384),e})()},ct=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,ut=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=R(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":at,"User-Agent":it,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":R(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},pt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const dt=(e,t,o)=>{let n=ut(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,a=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&pt.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta):void 0;if(a)for(let e of a.split(","))r.add(e);if(o)for(let e of o)r.add(e);return r.size>0&&(n["anthropic-beta"]=[...r].join(",")),n},mt="https://api.github.com",ft=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":at,"user-agent":it,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),ht="https://github.com",gt="01ab8ac9400c4e429b23",_t=["user:email"].join(" ");function yt(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const wt=32768,kt=[{regex:/Bearer\s+[\w.-]{20,}/g,mask:"Bearer ***"},{regex:/\bghu_[A-Za-z0-9]{20,}/g,mask:"ghu_***"},{regex:/\bghp_[A-Za-z0-9]{20,}/g,mask:"ghp_***"},{regex:/\bgho_[A-Za-z0-9]{20,}/g,mask:"gho_***"},{regex:/\bghs_[A-Za-z0-9]{20,}/g,mask:"ghs_***"},{regex:/\bghr_[A-Za-z0-9]{20,}/g,mask:"ghr_***"},{regex:/\bsk-[A-Za-z0-9-]{20,}/g,mask:"sk-***"},{regex:/\bhcaik_[A-Za-z0-9]{20,}/g,mask:"hcaik_***"}],bt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);function vt(e){let t=e;for(let{regex:e,mask:o}of kt)t=t.replace(e,o);return t}const xt=new Map;function Tt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function $t(e,t,o){let n=vt(o),r=8*wt,a=n.length>r,i=a?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(i.length<=wt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=wt)e.setAttribute(`${t}.part_${o/wt}`,i.slice(o,o+wt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/wt))}e.setAttribute(`${t}.bytes`,n.length),e.setAttribute(`${t}.sha256`,s),a&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,n.length-i.length))}function At(e,t){let o=function(e){if(xt.size>=1e3&&!xt.has(e)){let e=xt.keys().next().value;void 0!==e&&xt.delete(e)}let t,o=(xt.get(e)??0)+1;return xt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",je.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",o),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===o)return{decision:o};if("suppressed"===o)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:o};let n=t.c.get("rawBody");n&&$t(e,"copilot_api.incoming_request_body",n);let r=St(t.c.req.header());return r&&$t(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&$t(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&$t(e,"copilot_api.outgoing_headers",St(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&$t(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function St(e){let t={};for(let[o,n]of Object.entries(e))bt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Et(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await a.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function Ct(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:i.platform(),arch:i.arch()}}async function Ot(){try{return!!(await a.stat(K.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(K.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function It(e){let t=await async function(){let[e,t]=await Promise.all([Et(),Ot()]);return{version:e,runtime:Ct(),paths:{APP_DIR:K.APP_DIR,GITHUB_TOKEN_PATH:K.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const Pt=e({meta:{name:"debug",description:"Print debug information about the application"},args:{json:{type:"boolean",default:!1,description:"Output debug information as JSON"}},run:({args:e})=>It({json:e.json})}),Rt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Nt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",qt=new Set;let jt;function Dt(e){if(Z.errorReporting&&!(e.statusCode<500)&&!qt.has(e.signature)){if(qt.size>=1e3){let e=qt.values().next().value;void 0!==e&&qt.delete(e)}qt.add(e.signature),async function(e){jt??=Et();let t=await jt,o=Ct(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(vt(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:yt(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(Rt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Nt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function Mt(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const Ht=new WeakSet;async function Ft(e,{attempt:t,maxRetries:n,operation:r}){return Mt(e)&&t<n?(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&Ht.add(e)}(e),!1)}var Bt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},Ut=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function Lt(e,t){return setTimeout(()=>e.abort(new Ut(t)),t)}const Gt=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),zt=RegExp(`\\b(?:${[...Gt].join("|")})\\b`);function Jt(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function Wt(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=Jt(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function Kt(e){let t=e.code;return"string"==typeof t?t:void 0}function Vt(e){if(void 0===e.cause)return"";let t=Wt(e);if(t===e)return"";let o=Kt(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function Yt(e){if(!(e instanceof Error))return!1;let{codes:t,messages:o}=function(e){let t=[],o=[],n=new Set,r=(e,a)=>{if(a>4||!(e instanceof Error)||n.has(e))return;n.add(e);let{code:i,errors:s,cause:l}=e;if("string"==typeof i&&t.push(i),o.push(e.message),Array.isArray(s))for(let e of s)r(e,a+1);r(l,a+1)};return r(e,0),{codes:t,messages:o}}(e);return!!t.some(e=>Gt.has(e))||!(t.length>0)&&(!!o.some(e=>zt.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function Xt(e){return e.req.path.startsWith("/v1/messages")}function Zt(e,t){if(Xt(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}function Qt(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type?o.type=t.type:"string"==typeof t.code&&(o.type=t.code),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function eo(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",t.message))}function to(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=e.message),t}function oo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=d.getActiveSpan();if(!a)return;let i=Tt({endpointType:yt(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});At(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function no(e,t,o){let n=e.get("requestId"),r=ue.completionCallbacks.get(n);r&&(ue.logError(r,t,o),ue.completionCallbacks.delete(n))}function ro(e,t){(function(e){return"object"==typeof e&&!!e&&Ht.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",Z.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function ao(e){return Yt(e)||function(e){return Mt(e)||e instanceof Error&&Mt(e.cause)}(e)}async function io(e,t){if(ro(d.getActiveSpan(),t),t instanceof Bt&&429===t.response.status)return async function(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=ue.completionCallbacks.get(n);r&&(ue.logRateLimit(r,t.response),ue.completionCallbacks.delete(n)),Te.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=Zt(a,e),s=Qt(i);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),eo(o,s),Ke(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...to(s)}),oo({c:e,error:t,errorText:a,upstream:s}),e.json(i,429)}(e,t);if(t instanceof SyntaxError){d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),Ke(_.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let o=Xt(e)?{type:"error",error:{type:"invalid_request_error",message:"Invalid JSON in request body"}}:{error:{message:"Invalid JSON in request body",type:"invalid_request_error"}};return no(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof Bt)return async function(e,t){let o=d.getActiveSpan(),n=await t.response.text(),r=Zt(n,e),a=Qt(r);return no(e,t.response.status,a.message??t.message),o?.setStatus({code:c.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),eo(o,a),Ke(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...to(a)}),oo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&Dt({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Tt({endpointType:yt(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message}),e.json(r,t.response.status)}(e,t);if(function(e){return e instanceof Ut||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof Ut}(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Upstream request timed out"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","request_timeout");let n="Upstream request timed out (gateway timeout). Increase the timeout or retry.";Ke(_.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=Xt(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return no(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(ao(t))return function(e,t){let o=d.getActiveSpan();o?.setStatus({code:c.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?Wt(t):void 0,r=(n&&Kt(n))??"none",a=n?.message??String(t);o?.setAttribute("copilot_api.transport_cause_code",r),o?.setAttribute("copilot_api.transport_cause_message",a);let i="Temporary upstream connection failure. Please retry.";Ke(_.WARN,"WARN",i,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":r,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=Xt(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return no(e,503,t instanceof Error?`${t.message}${Vt(t)}`:i),e.json(s,503)}(e,t);let n=d.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:c.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),Ke(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),Dt({route:e.req.path,statusCode:500,errorClass:r.name,signature:Tt({endpointType:yt(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${Vt(r)}`}),no(e,500,r.message),o.error(r);let a=Xt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const so=async()=>{let e=`${mt}/copilot_internal/v2/token`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:ft(Z),signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get Service token",t);return await t.json()}catch(e){throw Ve(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function lo(){let e=`${mt}/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${Z._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Ve(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let co=null;function uo(){return co||=so().then(({token:e})=>{Z._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{co=null}),co}const po=async()=>{let e=`${ct(Z)}/models`,t=ut(Z),o=Z.timeoutMs,n=new AbortController,r=Lt(n,o);try{let{response:o,span:r}=await et({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new Bt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Ve(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const mo=e=>new Promise(t=>{setTimeout(t,e)}),fo=e=>null==e;async function ho(){let e=await(async()=>{try{return await po()}catch(e){if(e instanceof Bt&&401===e.response.status)return await uo(),po();throw e}})();Z.models=e}const go=()=>{Z._v1="1.140.0-insider"};var _o=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let yo,wo,ko,bo,vo,xo=!1,To=!1,$o=!1;function Ao(){return So()?vo:void 0}function So(){return void 0!==vo&&Date.now()-vo.at<6e4}function Eo(){return $o?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const Co=()=>a.readFile(K.GITHUB_TOKEN_PATH,"utf8");function Oo(e){let{span:t,error:n,reason:r,refreshStart:a,attempt:i}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";Z._t1=void 0,vo={status:s,message:l,at:Date.now()},clearInterval(yo),yo=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Se.add(1,{reason:r,success:"false"}),Ee.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:c.ERROR,message:n.message}),t.recordException(n),Ue.record(performance.now()-a,{reason:r}),Ke(_.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":i,"copilot_api.token_refresh.terminal_status":s})}function Io(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;Z._t1=void 0,o.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=n instanceof Error?n:Error(String(n));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:c.ERROR,message:s.message}),t.recordException(s),Ee.add(1,{reason:r}),Ue.record(performance.now()-a,{reason:r}),Ke(_.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const Po=async(e=5,t=1e3,n="scheduled")=>xo?(o.debug("Token refresh already in progress, coalescing"),wo):(xo=!0,wo=ge.startActiveSpan("copilot_api.token.refresh",async r=>{let a=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let i=1;i<=e;i++)try{r.setAttribute("copilot_api.token_refresh.attempt",i),o.debug(`Refreshing Service token (${n}, attempt ${i}/${e})`);let{token:t,refresh_in:s}=await so();return Z._t1=t,vo=void 0,To&&void 0===yo&&(o.info("Token refresh recovered, resuming scheduled refresh"),No(s)),o.debug("Service token refreshed successfully"),Z.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Se.add(1,{reason:n,success:"true"}),Ue.record(performance.now()-a,{reason:n}),void Ke(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof Bt&&(401===s.response.status||403===s.response.status))return void Oo({span:r,error:s,reason:n,refreshStart:a,attempt:i});let l=i===e;if(o.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),Se.add(1,{reason:n,success:"false"}),l)return void Io({span:r,error:s,reason:n,refreshStart:a,maxRetries:e});let c=t*2**(i-1);o.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),xo=!1,wo=void 0}}),wo);async function Ro(){return!!Z._t1||!So()&&(void 0!==vo&&$o&&await async function(){if(wo)return;let e=(await Co().catch(()=>{}))?.trim();e&&e!==Z._t2?.trim()&&(Z._t2=e,o.info("Picked up re-authenticated Auth token from disk"),Z.showToken&&o.info("Auth token:",e))}(),await Po(3,250,"on-demand"),!!Z._t1)}function No(e){yo&&clearInterval(yo);let t=Math.max(1e3*(e-60),6e4);yo=setInterval(()=>{Po(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function qo(e){try{let t=await Co();if(t&&!e?.force)return Z._t2=t,$o=!0,Z.showToken&&o.info("Auth token:",t),void await jo();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=Z.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${ht}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:gt,scope:_t}),signal:e.signal});if(!t.ok)throw new Bt("Failed to get device code",t);return await t.json()}finally{clearTimeout(o)}}();o.debug("Device code response:",n),o.info(`Please enter the code "${n.user_code}" at ${n.verification_uri}`);try{m.writeSync(n.user_code),o.success("Code copied to clipboard — opening browser...")}catch{o.info("Open the link above and enter the code to authenticate")}!function(e){try{let t,o=g.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",f(t,[e],()=>{})}catch{}}(n.verification_uri);let r=await async function(e){let t=1e3*(e.interval+1);o.debug(`Polling access token with interval of ${t}ms`),o.start("Waiting for authorization...");let n=Date.now(),r=1e3*e.expires_in;for(;;){if(Date.now()-n>=r)throw new _o("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=Z.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${ht}/login/oauth/access_token`,{method:"POST",headers:nt(),body:JSON.stringify({client_id:gt,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await mo(t),o.error("Failed to poll access token:",await n.text());continue}let r=await n.json();if(o.debug("Polling access token response:",r),r.error){if("expired_token"===r.error)throw new _o("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new _o("Authorization was denied. Please run the command again and approve the request.");"authorization_pending"!==r.error&&"slow_down"!==r.error&&o.warn(`Unexpected auth error: ${r.error}`),await mo(t);continue}if(r.access_token)return r.access_token;await mo(t)}catch(e){if(e instanceof _o)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await mo(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(K.GITHUB_TOKEN_PATH,e,{mode:384}))(r),Z._t2=r,$o=!0,Z.showToken&&o.info("Auth token:",r),await jo()}catch(e){throw e instanceof Bt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function jo(){let e=await lo();o.success(`Authenticated as ${e.login}`)}async function Do(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),Z.showToken=e.showToken,await V(),await qo({force:!0}),console.log([""," Get started:",""," $ npx copilot-api-node20@latest start --claude-code"," $ npx copilot-api-node20@latest start --codex",""," Full docs: https://www.npmjs.com/package/copilot-api-node20",""].join("\n")),process.exit(0)}const Mo=e({meta:{name:"auth",description:"Run authentication flow"},args:{verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"show-token":{type:"boolean",default:!1,description:"Show token on auth"}},run:({args:e})=>Do({verbose:e.verbose,showToken:e["show-token"]})}),Ho=.01,Fo=864e5,Bo=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),Uo=new Intl.NumberFormat("en-US"),Lo=e=>Bo.format(e*Ho),Go=e=>e.credits_used??e.entitlement-e.remaining,zo=(e,t,o)=>{let n=(e=>{let t=new Date(`${e}T00:00:00Z`);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-1,1))})(t),r=(o.getTime()-n.getTime())/Fo;if(r<.5)return;let a=Go(e),i=a*Ho/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*Ho,c=new Date(n.getTime()+l/i*Fo);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},Jo=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${Uo.format(Go(e))} of ${Uo.format(e.entitlement)} used`:"n/a",Wo=e=>e.padEnd(14),Ko=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Wo("AI credits")}unlimited`);else{let e=Go(o),t=o.percent_remaining;n.push(`${Wo("AI credits")}${Lo(e)} / ${Lo(o.entitlement)} ${t.toFixed(1)}% left`,`${Wo("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Wo("")}${Uo.format(e)} of ${Uo.format(o.entitlement)} credits`)}if(n.push("",`${Wo("Chat")}${Jo(e.quota_snapshots.chat)}`,`${Wo("Completions")}${Jo(e.quota_snapshots.completions)}`,"",`${Wo("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/Fo)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=zo(o,e.quota_reset_date,t);r&&n.push(`${Wo("Burn rate")}~${Bo.format(r.usdPerDay)}/day${(e=>e.exhausted?" — allowance already exhausted":e.exhaustsOn?` — on track to exhaust ${(e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}))(e.exhaustsOn)}`:" — within allowance")(r)}`);let a=o.overage_permitted?"permitted, "+(o.overage_count>0?`${Uo.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Wo("Overage")}${a}`)}return n.join("\n")},Vo=async()=>{let e=`${mt}/copilot_internal/user`,t=Z.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await et({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:ft(Z),signal:o.signal});try{if(!t.ok)throw new Bt("Failed to get usage",t);return await t.json()}catch(e){throw Ve(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Yo=()=>g.stdout.write("[2J[H"),Xo=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Zo=async()=>{let e=await Vo();return Ko(e)},Qo=e({meta:{name:"check-usage",description:"Show current usage/quota information"},args:{watch:{alias:"w",type:"boolean",default:!1,description:"Keep running and refresh the report on an interval"},interval:{alias:"i",type:"string",default:"60",description:"Seconds between refreshes in --watch mode (min 10)"}},async run({args:e}){if(await V(),await qo(),!e.watch){try{o.box(await Zo())}catch(e){o.error("Failed to fetch usage:",e),g.exit(1)}g.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?o.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&o.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),n=g.stdout.isTTY,r=()=>g.exit(0);for(g.on("SIGINT",r),g.on("SIGTERM",r);;){try{let e=await Zo();n&&Yo(),o.box(e),o.log(Xo(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),en=N(f);async function tn(){let e="win32"===g.platform?"where.exe":"which";try{return await en(e,["tailscale"]),!0}catch{return!1}}async function on(){try{let{stdout:e}=await en("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function nn(e){return e.replace(/\.$/,"")}async function rn(){let e=await on();if(e?.Online)return nn(e.DNSName)}const an=N(f),sn=e=>`[1m${e}[0m`,ln=e=>`[2m${e}[0m`,cn=e=>`[36m${e}[0m`,un=e=>`[32m${e}[0m`,pn=e=>`[31m${e}[0m`,dn=e=>`[33m${e}[0m`,mn=ln(" ─────────────────────────────────────────────────────────────"),fn=s.join(K.APP_DIR,"certs","tailscale"),hn=s.join(fn,"cert.pem"),gn=s.join(fn,"key.pem"),_n={certDir:fn,certPath:hn,keyPath:gn};function yn(){switch(g.platform){case"darwin":return[` ${ln("Install Tailscale for macOS:")}`,` ${cn("https://tailscale.com/download/mac")}`,` ${ln("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`,` ${ln("Then re-run this command.")}`].join("\n");case"linux":return[` ${ln("Install Tailscale for Linux:")}`,` ${cn("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${cn("sudo tailscale up")}`,` ${ln("or")} ${cn("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${ln("Install Tailscale for Windows:")}`,` ${cn("https://tailscale.com/download/windows")}`,"",` ${ln("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${ln("Install Tailscale:")} ${cn("https://tailscale.com/download")}`}}function wn(){let e=[` ${pn("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${ln("Open the Tailscale app from Applications and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${ln("Open the Tailscale app and sign in.")}`,` ${ln("Download:")} ${cn("https://tailscale.com/download/windows")}`):e.push(` ${ln("Connect with:")} ${cn("sudo tailscale up")}`),e.push("",` ${ln("Then re-run this command.")}`),e.join("\n")}async function kn(){try{return await a.access(hn),await a.access(gn),!0}catch{return!1}}function bn(e){console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Diagnostic")}`),console.log(mn),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?un("✅"):"missing"===n.status?pn("❌"):dn("❓");let r=n.detail?ln(` ${n.detail}`):"";t.push(` ${e} ${o}${r}`)}return t}(e))console.log(t);console.log("");let t=Object.values(e).filter(e=>"missing"===e.status);0===t.length?console.log(` ${un("All checks passed.")}`):console.log(` ${pn(`${t.length} issue(s).`)} Run ${cn("copilot-api cowork-setup install")} to fix.`),console.log("")}const vn={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},xn=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await tn();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return bn(e),console.log(""),console.log(yn()),void console.log("");let o=await on();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},bn(e),console.log(wn()),void console.log("");let n=nn(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await kn();e["tailscale-cert"]=r?{status:"ok",detail:hn}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),bn(e)}(),g.exit(0)}}),Tn=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Install")}`),console.log(mn),console.log(""),!await tn())return console.log(` ${pn("Tailscale is not installed.")}`),console.log(""),console.log(yn()),console.log(""),console.log(` ${ln("After installing, run")} ${cn("tailscale up")} ${ln("to connect, then re-run this command.")}`),void console.log("");let t=await on();if(!t||!t.Online)return console.log(wn()),void console.log("");let n=nn(t.DNSName);if(console.log(` ${ln("Tailscale hostname:")} ${sn(n)}`),console.log(""),console.log(` ${sn("Generating TLS certificate via Tailscale…")}`),console.log(` ${ln("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${cn(`$ tailscale cert --cert-file ${hn} --key-file ${gn} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(fn,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await an("tailscale",["cert","--cert-file",hn,"--key-file",gn,n]),console.log(` ${un("✓ Certificate generated")}`)}catch(e){let t=e instanceof Error?e.message:String(e);return void o.error(`Failed to generate cert: ${t}`)}console.log(""),console.log(mn),console.log(` ${sn("Next steps")}`),console.log(mn),console.log(""),console.log(` ${sn("1.")} Start the proxy:`),console.log(` ${cn("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${sn("2.")} In Cowork ${ln("→")} Settings ${ln("→")} Inference Provider, set:`),console.log(` ${sn("inferenceGatewayBaseUrl")} = ${cn(`https://${n}:<port>`)}`),console.log(` ${ln("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${sn("3.")} Restart Cowork ${ln("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${ln("For Cowork's own configuration docs, see:")}`),console.log(` ${cn("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),$n=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:vn},async run({args:e}){await async function(e){if(console.log(""),console.log(mn),console.log(` ${sn("Claude Cowork Setup")} ${ln("— Revert")}`),console.log(mn),console.log(""),!await kn())return console.log(` ${ln("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${sn("Remove Tailscale cert files:")}`),console.log(` ${ln(hn)}`),console.log(` ${ln(gn)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(fn,{recursive:!0}),console.log(` ${un("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${ln("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),An=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:xn,install:Tn,revert:$n}}),Sn=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function En(e){if(!Sn.test(e))return e;let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],a=r.match(/^\[[0-9;]*[a-z]/i);t+=a?r.slice(a[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function Cn(e){return"string"==typeof e?En(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=Cn(n);!t&&r!==n&&(t=e.slice(0,o)),t?.push(r)}return t??e}(e):e&&"object"==typeof e?function(e){let t,o=Object.entries(e),n="thinking"===e.type;for(let e=0;e<o.length;e++){let[r,a]=o[e],i=!n||"thinking"!==r&&"signature"!==r?Cn(a):a;!t&&(i!==a||"__proto__"===r)&&(t=On({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=On({},o,o.length),t.properties={}),t??e}(e):e}function On(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const In="x-copilot-api-self-test",Pn=R();const Rn=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function Nn(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==e.capabilities.type&&!function(e){let t=e.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e.id)}(e)&&!function(e){return"disabled"===e.policy?.state}(e)}function qn(e){try{!function(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),a=t.res.status,i=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",a),n.setAttribute("copilot_api.model",i),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();Ze.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:c.ERROR,message:`HTTP ${a}`})}(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:a,requestId:i}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:a};if(we.add(1,d),De.record(s,d),c>=400&&ke.add(1,{method:n,path:r,status_code:String(c),error_type:c>=500?"server_error":"client_error"}),l?.tokenUsage){let e=l.tokenUsage,t={model:u,endpoint_type:a};e.inputTokens&&(be.add(e.inputTokens,t),Ge.record(e.inputTokens,t)),e.outputTokens&&(ve.add(e.outputTokens,t),ze.record(e.outputTokens,t)),e.cachedTokens&&xe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ue.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const jn=1048576;const Dn=async()=>ge.startActiveSpan("copilot_api.approval.await",async e=>{let t=performance.now();try{let n=await o.prompt("Accept incoming request?",{type:"confirm"}),r=performance.now()-t;if(e.setAttribute("copilot_api.approval.wait_duration_ms",r),We.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Re.add(1,{result:"rejected"}),new Bt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Re.add(1,{result:"approved"})}finally{e.end()}});async function Mn(e){if(Z._t1||await Ro())return null;let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${Eo()}`,type:"authentication_error"}},401)):(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function Hn(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function Fn(e,t){void 0!==t.prompt_tokens&&e.setAttribute("copilot_api.input_tokens",t.prompt_tokens),void 0!==t.completion_tokens&&e.setAttribute("copilot_api.output_tokens",t.completion_tokens),void 0!==t.total_tokens&&e.setAttribute("copilot_api.total_tokens",t.total_tokens)}const Bn=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],Un="claude-haiku-4.5",Ln={haiku:Un,"sonnet-4.6":"claude-sonnet-4.6","sonnet-4.5":"claude-sonnet-4.5","sonnet-4":"claude-sonnet-4","opus-4.7":"claude-opus-4.7","opus-4.6":"claude-opus-4.6","opus-4.5":"claude-opus-4.5",opus:"claude-opus-4.5"};function Gn(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of Bn)if(t.pattern.test(e))return t.family;return null}(n);if(!a)return null;let i=n.replace(/-\d{8}(?::.*)?$/,""),s=r?`-${r}`:"";for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,""),o=`${i}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2")===o)return e}return function(e,t,o=null){let n=Ln[e];if(!n)return null;if(o){let e=`${n}-${o}`;if(t.includes(e))return e}if(t.includes(n))return n;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let n=o?`${e}-${o}`:e;if(t.includes(n))return n}return null}(a,t,r)}const zn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Jn(e,t){if(!e||!t||0===t.length)return null;let o=function(e){return"max"===e?"xhigh":e}(e);if(t.includes(o))return o;let n=zn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=zn.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}var Wn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Kn(e){if(!e||"string"!=typeof e)throw new Wn("Model name is required and must be a string");if(!Z.models?.data)throw new Wn("Models not available. Please try again later.",503);let t=Z.models.data.map(e=>e.id);if(t.includes(e))return e;let o=Gn(e,t);if(!o)throw $e.add(1,{requested_model:e}),new Wn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function Vn(e){let t=Z.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e)}async function Yn(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return ge.startActiveSpan("copilot_api.rate_limit.check",async n=>{try{let r=Date.now();if(n.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let a=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute("copilot_api.rate_limit.elapsed_seconds",a),a>t)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let i=Math.ceil(t-a);if(n.setAttribute("copilot_api.rate_limit.wait_seconds",i),!e.rateLimitWait)throw n.setAttribute("copilot_api.rate_limit.action","rejected"),Te.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new Bt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),Te.add(1,{action:"waited",source:"local"}),Fe.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await mo(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Xn=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function Zn(e){if(e instanceof Xn)return{type:e.type,message:e.message};if(e instanceof Bt){let t=e.response.status;return{type:529===t?"overloaded_error":`upstream_error_${t}`,message:`Upstream error (${t}) while streaming response`}}return{type:"api_error",message:"Stream interrupted before completion"}}async function Qn(e,t){let{type:n,message:r}=Zn(t);try{await e.writeSSE({event:"error",data:JSON.stringify({type:"error",error:{type:n,message:r}})})}catch(e){o.debug("Failed to emit Anthropic stream error frame:",e)}}async function er(e,t){let{type:n,message:r}=Zn(t);try{await e.writeSSE({event:"error",data:JSON.stringify({error:{message:r,type:n}})})}catch(e){o.debug("Failed to emit OpenAI stream error frame:",e)}}function tr(e){if("number"==typeof e){if(!Number.isFinite(e))return null;let t=Math.floor(e);return t>0?t:null}if("string"==typeof e){let t=e.trim();if(!t)return null;let o=Number(t);if(!Number.isFinite(o))return null;let n=Math.floor(o);return n>0?n:null}return null}function or(e,t,o){return Math.min(Math.max(e,t),o)}function nr(e,t=0){if(t>5||!e||"object"!=typeof e)return null;let o=e.error;if(!o||"object"!=typeof o)return null;let n=o.code;if("string"==typeof n)return n;let r=o.message;if("string"!=typeof r)return null;try{return nr(JSON.parse(r),t+1)}catch{return null}}function rr(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=tr(o.capabilities.supports.min_thinking_budget),r=tr(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:tr(o.capabilities.limits?.max_output_tokens)??void 0}}function ar(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=or(tr(e.requestedBudget)??o,o,n),a=tr(e.maxTokens);if(a||=r+1,t.maxOutputTokens&&a>t.maxOutputTokens&&(a=t.maxOutputTokens),a<=r){let e=Math.min(r,a-1);if(e>=o)r=e;else{let e=o+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:a};a=e,r=o}}return a<=r?{thinkingBudget:null,maxTokens:a}:{thinkingBudget:r,maxTokens:a}}function ir(e,t){if(fo(e.thinking_budget))return e;let o=rr(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=ar({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:o});return null===n.thinkingBudget?{...e,max_tokens:n.maxTokens,thinking_budget:void 0}:{...e,max_tokens:n.maxTokens,thinking_budget:n.thinkingBudget}}function sr(e){return"invalid_thinking_budget"===nr(e)}async function lr(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(fo(t.thinking_budget)||!(o instanceof Error))return null;let a,i,s=o;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==r)a=r;else try{a=await s.response.clone().text()}catch{return null}try{i=JSON.parse(a)}catch{return null}if(!sr(i))return null;let l=rr(n,t.model);return l?function(e,t){let o=ar({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:t});if(null===o.thinkingBudget)return{...e,max_tokens:o.maxTokens,thinking_budget:void 0};let n=o.thinkingBudget,r=tr(e.thinking_budget);if(r&&r===o.thinkingBudget){let e=n+1;e<=t.bounds.max&&(!o.maxTokens||e<o.maxTokens)&&(n=e)}let a=o.maxTokens;if((!a||a<=n)&&(a=n+1),t.maxOutputTokens&&a>t.maxOutputTokens){if(!(t.maxOutputTokens>n))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};a=t.maxOutputTokens}return{...e,max_tokens:a,thinking_budget:n}}(t,l):{...t,thinking_budget:void 0}}function cr(e,t){let o=!1;return()=>{if(o)return;o=!0;let n=e.get("requestData")||{};n.upstreamTtfbMs=performance.now()-t,e.set("requestData",n)}}function ur(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const pr=new Map,dr=new Map,mr=new Set;let fr,hr,gr;function _r(e){return!e.closed&&!e.destroyed}function yr(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new C(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return pr.set(t,Date.now()),qe.add(1,{event:"created",origin:e}),Ke(_.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{o.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{o.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(n,r,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=mr.has(t);qe.add(1,{event:"goaway",origin:e}),Ke(i?_.WARN:_.DEBUG,i?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),dr.delete(t),mr.delete(t),pr.delete(t),_r(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function wr(e,t){if(!Z.connectivity.h2)return;if(fr&&fr!==e&&function(){for(let e of[...dr.keys(),...mr])_r(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});dr.clear(),mr.clear(),pr.clear()}(),fr=e,t?.fresh){let t=yr(e);return mr.add(t),t}let n=Date.now();for(let[t]of dr)if(n-(pr.get(t)??0)>=6e5)dr.delete(t),pr.delete(t),_r(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),qe.add(1,{event:"rotated",origin:e}),Ke(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(_r(t))return dr.delete(t),mr.add(t),t;dr.delete(t),pr.delete(t)}let r=yr(e);return mr.add(r),r}function kr(e){e&&mr.delete(e)&&(_r(e)?dr.set(e,Date.now()):pr.delete(e))}function br(){gr||(gr=setInterval(()=>{!function(){let e=Date.now(),t=Z.connectivity.h2Keepalive,n=dr.size;for(let[r,a]of dr)e-a<6e4||t&&n<=1||(dr.delete(r),pr.delete(r),n--,_r(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),qe.add(1,{event:"idle_reaped",origin:fr??""}),Ke(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${fr}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":fr??""}))}()},3e4),gr.unref())}function vr(){hr||(o.debug("Starting HTTP/2 keepalive (every 45s)"),hr=setInterval(()=>{(async function(){if(0===dr.size&&0===mr.size){if(fr){let e=yr(fr);dr.set(e,Date.now())}return}let e=[...dr.keys()];for(let t of e)dr.delete(t);await Promise.allSettled(e.map(async e=>{if(_r(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:ut(Z)});await n.dump(),Ne.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),dr.set(e,Date.now())}catch(t){Ne.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),qe.add(1,{event:"error",origin:fr??""}),pr.delete(e),_r(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else pr.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),hr.unref(),br())}function xr(e){return e.max_completion_tokens??e.max_tokens}async function Tr(e,t,o){try{if(!e.ok)throw new Bt("Failed to create chat completions",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&Fn(t,n.usage),n}catch(e){throw Ve(t,e),e}finally{t.end()}}const $r=async e=>{let t=Cn(e);try{return await Ar(t)}catch(e){if(e instanceof Bt&&401===e.response.status)return await uo(),Ar(t);let n;if(e instanceof Bt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await lr({payload:t,error:e,models:Z.models,errorBodyText:n});if(r)return e instanceof Bt&&void 0!==n&&o.warn(`Upstream rejected thinking_budget (status ${e.response.status}): ${n.slice(0,500)}`),o.warn("Adjusting thinking_budget payload and retrying once..."),await Ar(Cn(r));throw e}},Ar=async e=>{if(!Z._t1)throw Error("Service token not found");let t=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),o=e.messages.some(e=>["assistant","tool"].includes(e.role)),n={...ut(Z,t),"X-Initiator":o?"agent":"user"},r=ct(Z),a=`${r}/chat/completions`,i=Z.timeoutMs,s=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=xr(e);return null==i?a:{...a,max_completion_tokens:i}}(e,Z.models),l=JSON.stringify(s),c={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":i,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":xr(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user"};for(let t=0;t<=1;t++){let o=wr(r,{fresh:t>0}),s=new AbortController,u=Lt(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await tt({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}),m=new Response(p,{status:r,headers:u});if(e.stream){if(!m.ok)throw d.end(),new Bt("Failed to create chat completions",m,{outgoingBody:l,outgoingHeaders:n});return{events:M(m),span:d,release:()=>kr(o)}}try{return await Tr(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{kr(o)}}catch(e){if(kr(o),await Ft(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Sr(e,t,o){try{if(!e.ok)throw new Bt("Failed to create responses",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&Fn(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Ve(t,e),e}finally{t.end()}}const Er=async e=>{try{return await Cr(e)}catch(t){if(t instanceof Bt&&401===t.response.status)return await uo(),Cr(e);throw t}},Cr=async e=>{if(!Z._t1)throw Error("Service token not found");let t=Cn(e),o={...ut(Z),"X-Initiator":"agent"},n=ct(Z),r=`${n}/responses`,a=Z.timeoutMs,i=JSON.stringify(t),s={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":a,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let l=wr(n,{fresh:e>0}),c=new AbortController,u=Lt(c,a);try{let{statusCode:n,headers:u,body:p,span:d}=await tt({spanName:"copilot POST /responses",url:r,target:"responses",headers:o,body:i,signal:c.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...s,"copilot_api.h2.retry_attempt":e},dispatcher:l}),m=new Response(p,{status:n,headers:u});if(t.stream){if(!m.ok)throw d.end(),new Bt("Failed to create responses",m,{outgoingBody:i,outgoingHeaders:o});return{events:M(m),span:d,release:()=>kr(l)}}try{return await Sr(m,d,{outgoingBody:i,outgoingHeaders:o})}finally{kr(l)}}catch(t){if(kr(l),await Ft(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Or=e=>Object.hasOwn(e,"output");function Ir(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens}:null}var Pr=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const Rr=new Set(["model","messages","max_tokens","max_completion_tokens","temperature","top_p","stream","stream_options","tools","tool_choice","parallel_tool_calls","user","reasoning_effort","response_format"]);function Nr(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new Pr(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new Pr(`logprobs is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","logprobs")}(e);let t=function(e){return e.filter(e=>"system"===e.role||"developer"===e.role).map(e=>jr(e.content)).filter(Boolean).join("\n\n")||void 0}(e.messages),o=function(e){let t=[];for(let o of e)switch(o.role){case"user":{let e=Dr(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=jr(o.content);e&&t.push({type:"message",role:"assistant",content:[{type:"output_text",text:e}]});for(let e of o.tool_calls??[])t.push({type:"function_call",call_id:e.id,name:e.function.name,arguments:e.function.arguments});break}case"tool":t.push({type:"function_call_output",call_id:o.tool_call_id??"",output:jr(o.content)})}return t}(e.messages);if(0===o.length)throw new Pr("request has no translatable message content","invalid_request","messages");let n={model:e.model,input:o,store:!1};t&&(n.instructions=t);let r=e.max_completion_tokens??e.max_tokens;"number"==typeof r&&(n.max_output_tokens=Math.max(r,16)),e.stream&&(n.stream=!0),qr(e.temperature)&&(n.temperature=e.temperature),qr(e.top_p)&&(n.top_p=e.top_p),qr(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),qr(e.user)&&(n.user=e.user),e.reasoning_effort&&(n.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(n.tools=e.tools.filter(e=>"function"===e.type).map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters}))),e.tool_choice&&(n.tool_choice="string"==typeof e.tool_choice?e.tool_choice:{type:"function",name:e.tool_choice.function.name});let a=function(e){if(e)switch(e.type){case"json_schema":{let{name:t,description:o,schema:n,strict:r}=e.json_schema;return{type:"json_schema",name:t,description:o,schema:n,strict:r}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return a&&(n.text={format:a}),n}function qr(e){return null!=e}function jr(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function Dr(e){if("string"==typeof e)return e?[{type:"input_text",text:e}]:[];let t=[];for(let o of e??[])if("text"===o.type)o.text&&t.push({type:"input_text",text:o.text});else{if("image_url"!==o.type)throw new Pr(`content part type '${o.type}' is not supported for models served via the Responses API`,"unsupported_content_type","messages");t.push({type:"input_image",image_url:o.image_url.url,detail:"low"===o.image_url.detail?"low":"high"})}return t}function Mr(e){let t={prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens};return void 0!==e.input_tokens_details?.cached_tokens&&(t.prompt_tokens_details={cached_tokens:e.input_tokens_details.cached_tokens}),void 0!==e.output_tokens_details?.reasoning_tokens&&(t.completion_tokens_details={reasoning_tokens:e.output_tokens_details.reasoning_tokens}),t}function Hr(e,t){if("incomplete"===e.status){let t=e.incomplete_details?.reason;if("content_filter"===t)return"content_filter";if("max_output_tokens"===t)return"length"}return t?"tool_calls":"stop"}function Fr(e,t,o=null){let n=e.roleSent?t:{role:"assistant",...t};return e.roleSent=!0,{id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[{index:0,delta:n,logprobs:null,finish_reason:o}]}}function Br(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Ur(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Br(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[Fr(t,{tool_calls:[{index:r,function:{arguments:o.arguments}}]})]):[];let a=function(e,t,o){let n=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,n),e.toolCallIndexByOutputIndex.set(o,n),n}(t,o.id,e.output_index),i=n?o.arguments:"";return i&&t.toolCallsWithArgs.add(a),[Fr(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function Lr(e,t){let o=[Fr(e,{},Hr(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=Mr(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Gr(e,t){switch(e.type){case"response.created":case"response.in_progress":return t.id=e.response.id||t.id,t.model=e.response.model||t.model,e.response.created_at&&(t.created=e.response.created_at),{chunks:[]};case"response.output_text.delta":case"response.refusal.delta":return e.delta?{chunks:[Fr(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Ur(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Br(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[Fr(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:Lr(t,e.response),done:!0};case"response.failed":return{chunks:[],error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}};case"error":return{chunks:[],error:{type:e.code??"api_error",message:e.message??"Response generation failed"}};default:return{chunks:[]}}}const zr="openai_responses";function Jr(e){let t=performance.now(),n=ge.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),Nr(e)}finally{t.end()}});Be.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!Rr.has(e)&&null!=t).map(([e])=>e)}(e);return r.length>0&&o.debug(`Dropped chat-only fields with no Responses API equivalent: ${r.join(", ")}`),n}function Wr(e){let t=performance.now(),o=ge.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",o=!1,n=[];for(let r of e.output)if("message"===r.type)for(let e of r.content)"output_text"===e.type?(t+=e.text,o=!0):"refusal"===e.type&&(t+=e.refusal,o=!0);else"function_call"===r.type&&n.push({id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments}});let r={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:o?t:null,...n.length>0&&{tool_calls:n}},logprobs:null,finish_reason:Hr(e,n.length>0)}]};return e.usage&&(r.usage=Mr(e.usage)),r}(e)}finally{t.end()}});return Be.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Kr(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=Mr(t.usage);a.tokenUsage=Hn(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(Wr(t))}async function Vr(e,t,n){let r;try{r=Jr(t)}catch(t){if(t instanceof Pr)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),Z.manualApprove&&!n.isSelfTest&&await Dn();let a=await Mn(e);if(a)return a;let i=performance.now(),s=await Er(r),l=performance.now()-i;if(Me.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Or(s))return Kr(e,s,l);let{events:c,span:u,release:p}=s,m=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return D(e,async t=>{let n=null,a=0,s=performance.now(),d=cr(e,i);try{try{for await(let i of c){if(d(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Pe.add(1,{model:r.model,endpoint_type:zr});let c=Ir(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Hn(c),t._d1=l,e.set("requestData",t)}let u=Gr(s,m);if(u.error)throw new Xn(u.error.type,u.error.message);for(let e of u.chunks)await t.writeSSE({data:JSON.stringify(e)});u.done&&await t.writeSSE({data:"[DONE]"})}let u={model:r.model,endpoint_type:zr};He.record(performance.now()-s,u),Je.record(a,u),ur(e,i)}catch(o){throw Ye(u,e.get("requestSpan"),o),await er(t,o),o}finally{n&&Fn(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Yr(e,t){if(!e.data)return e;try{let o=JSON.parse(e.data);if(o.usage&&t(o.usage),void 0!==o.usage?.prompt_tokens_details?.cached_tokens)return{...e,data:JSON.stringify({...o,usage:{...o.usage,prompt_tokens_details:void 0}})}}catch(t){o.warn("Failed to parse streaming chunk:",e.data.slice(0,200),t)}return e}async function Xr(e){let t=!0===e.get("isSelfTest");t||await Yn(Z);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return ge.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Kn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}(n)}catch(t){if(t instanceof Wn)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(Vn(n.model))return Vr(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),Z.manualApprove&&!t&&await Dn(),n=function(e){if(!fo(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!fo(e.max_tokens))return e;let t=(Z.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return o.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(n),n=ir(n,Z.models),fo(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await Mn(e);if(r)return r;let a=performance.now(),i=await $r(n),s=performance.now()-a;if(Me.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Zr(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=Hn(i.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return D(e,async t=>{let o={value:null},r=0,i=performance.now(),p=cr(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Pe.add(1,{model:n.model,endpoint_type:"openai"}),i=Yr(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=Hn(t),n._d1=s,e.set("requestData",n)})),await t.writeSSE(i)}let c=performance.now()-i,u={model:n.model,endpoint_type:"openai"};if(He.record(c,u),Je.record(r,u),ur(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Hn(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw Ye(c,e.get("requestSpan"),o),await er(t,o),o}finally{o.value&&Fn(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ue.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Zr=e=>Object.hasOwn(e,"choices"),Qr=new q;Qr.post("/",async e=>{try{return await Xr(e)}catch(t){return await io(e,t)}});const ea=new q;ea.post("/",async e=>{try{let t=await e.req.json();try{t.model=Kn(t.model)}catch(t){if(t instanceof Wn)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=await Mn(e);if(o)return o;let n=performance.now(),r=await(async e=>{if(!Z._t1)throw Error("Service token not found");let t=`${ct(Z)}/embeddings`,o=ut(Z),n=Z.timeoutMs,r=new AbortController,a=Lt(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await et({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1}});try{if(!n.ok)throw new Bt("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw Ve(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),a=performance.now()-n;Me.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=Hn(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await io(e,t)}});const ta=new q;let oa=null,na=null;function ra(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function aa(e){return!ra(e)}ta.get("/",async e=>{let t,o=function(){let e=Z._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let o=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),n=JSON.parse(atob(o)),r="object"==typeof n&&n&&"exp"in n&&"number"==typeof n.exp?n.exp:void 0;return void 0!==r&&1e3*r<Date.now()?"expired":"valid"}catch{return"expired"}}(),n=await async function(){let e=Date.now(),t=oa;return t&&e-t.timestamp<3e4?{result:t.result}:na||(na=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${ct(Z)}/models`,n=await fetch(t,{method:"GET",headers:ut(Z),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return oa={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return oa={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),na=null}})(),na)}();t="valid"===o&&"reachable"===n.result?"ok":"valid"!==o&&"reachable"!==n.result?"unhealthy":"degraded";let r={status:t,copilot_token:o,upstream:n.result,version:"0.43.0",timestamp:(new Date).toISOString()};void 0!==n.latencyMs&&(r.upstream_latency_ms=n.latencyMs);let a="ok"===t?200:503;return e.json(r,a)});const ia=new H(B),sa={...F["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function la(e){try{return ia.encode(e,[],[]).length}catch(t){return o.debug("count_tokens: tokenizer failed, using length/4",t),Math.ceil(e.length/4)}}function ca(e){let t=0;for(let o of e)switch(o.type){case"text":t+=la(o.text)*sa.contentMultiplier;break;case"tool_use":t+=la(o.name+JSON.stringify(o.input))*sa.contentMultiplier;break;case"tool_result":o.content&&(t+=la("string"==typeof o.content?o.content:JSON.stringify(o.content))*sa.contentMultiplier);break;case"thinking":t+=la(o.thinking)*sa.contentMultiplier;break;case"image":t+=1600}return t}function ua(e){let t=0,o=e.properties;if(!o)return t;let n=Object.entries(o);for(let[e,[o,r]]of n.entries()){if(t+=0===e?sa.perFirstProp:sa.perAdditionalProp,t+=la(o),r.description&&(t+=sa.perPropDesc+la(r.description)),r.enum&&Array.isArray(r.enum)){t+=sa.perEnum;for(let e of r.enum)t+=la(String(e))}if("object"===r.type&&r.properties&&(t+=sa.perNestedObject,t+=ua(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=sa.perArrayOfObjects,t+=ua(e))}}return t}function pa(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")};return e.thinking&&(o["copilot_api.thinking.type"]=e.thinking.type,"budget_tokens"in e.thinking&&e.thinking.budget_tokens&&(o["copilot_api.thinking.budget_tokens"]=e.thinking.budget_tokens)),e.output_config?.effort&&(o["copilot_api.output_config.effort"]=e.output_config.effort),o}function da(e,t,o){let n=pa(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const ma=async(e,t,n)=>{try{return await fa(e,t)}catch(r){if(r instanceof Bt&&401===r.response.status)return await uo(),fa(e,t);if(r instanceof Bt&&400===r.response.status&&n?.onStructuredOutputFallback){let a;try{a=await r.response.clone().text()}catch{a=void 0}let i=n.onStructuredOutputFallback(e,a);if(i)return o.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${i.model}`),fa(i,t)}throw r}};const fa=async(e,t)=>{if(!Z._t1)throw Error("Service token not found");let{metadata:o,...n}=Cn(e),r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...dt(Z,t,r),"X-Initiator":"agent"},i=ct(Z),s=`${i}/v1/messages`,l=Z.timeoutMs,c=JSON.stringify(n),u=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",...pa(e,t?.anthropicBeta)}}(n,t,l);for(let e=0;e<=1;e++){let t=wr(i,{fresh:e>0}),r=new AbortController,p=Lt(r,l);try{let{statusCode:o,headers:i,body:p,span:d}=await tt({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:a,body:c,signal:r.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(p,{status:o,headers:i});if(!m.ok)throw d.end(),new Bt("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:a});if(n.stream)return{events:M(m),span:d,release:()=>kr(t)};try{let e=await m.json();"string"==typeof e.id&&d.setAttribute("copilot_api.response.id",e.id);let t=e.usage;return t&&Fn(d,{prompt_tokens:t.input_tokens??0,completion_tokens:t.output_tokens??0,total_tokens:(t.input_tokens??0)+(t.output_tokens??0)}),e}finally{d.end(),kr(t)}}catch(o){if(kr(t),await Ft(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ha=new Set(["low","medium","high","max","xhigh"]);function ga(e,t,n){let r=t.includes(e.model)?e.model:Gn(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=Gn(e,t);if(!n)return null;let r=new Set(t);if(o.context1m){let e=function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,r);if(e)return e}if(o.effort){let e=function(e,t,o){let n=null;if("high"===o?n="high":("max"===o||"xhigh"===o)&&(n="xhigh"),!n)return null;let r=`${e}-${n}`;return t.has(r)?r:null}(n,r,o.effort);if(e)return e}return null}(a.model,t,{context1m:n.context1m,effort:a.output_config?.effort}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=d.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",a.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),s={...a,model:i}}return function(e){let t=e.output_config?.effort;if(!t)return e;let n=Z.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Jn(t,n);if(!r||!ha.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=d.getActiveSpan();return i?.setAttribute("copilot_api.effort.requested",t),i?.setAttribute("copilot_api.effort.clamped_to",a),{...e,output_config:{...e.output_config,effort:a}}}(s)}function _a(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function ya(e,t){let o={model:e.model,messages:wa(e.messages,e.system),max_tokens:e.max_tokens,stop:e.stop_sequences,stream:e.stream,temperature:e.temperature,top_p:e.top_p,user:e.metadata?.user_id,tools:Ta(e.tools),tool_choice:$a(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=rr(t,o.model);if(r){let a="enabled"===n.type&&"number"==typeof n.budget_tokens?n.budget_tokens:function(e,t,o){let n=function(e,t){return"max"===e||"xhigh"===e?t:"high"===e?16e3:"medium"===e?8e3:1024}(e,o.max),r=tr(t),a=r&&r>1?r-1:o.min;return or(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=ir({...o,thinking_budget:a},t)}}return o}function wa(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:ka(e)}]:[{role:"system",content:ka(e.map(e=>e.text).join("\n\n"))}]:[]}(t),n=e.flatMap(e=>"user"===e.role?function(e){let t=[];if(Array.isArray(e.content)){let o=e.content.filter(e=>"tool_result"===e.type),n=e.content.filter(e=>"tool_result"!==e.type);for(let e of o)t.push({role:"tool",tool_call_id:e.tool_use_id,content:xa(e.content)});n.length>0&&t.push({role:"user",content:xa(n)})}else t.push({role:"user",content:xa(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:va(e.reasoning_text),reasoning_opaque:va(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:xa(e.content),...t}];let o=e.content.filter(e=>"tool_use"===e.type),n=e.content.filter(e=>"text"===e.type),r=e.content.filter(e=>"thinking"===e.type),a=[...n.map(e=>e.text),...r.map(e=>e.thinking)].join("\n\n");return o.length>0?[{role:"assistant",content:a||null,...t,tool_calls:o.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:"assistant",content:xa(e.content),...t}]}(e));return[...o,...n]}function ka(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const ba=32768;function va(e){if("string"==typeof e)return e.length<=ba?e:e.slice(0,ba)}function xa(e){if("string"==typeof e)return e;if(!Array.isArray(e))return null;if(!e.some(e=>"image"===e.type))return e.filter(e=>"text"===e.type||"thinking"===e.type).map(e=>"text"===e.type?e.text:e.thinking).join("\n\n");let t=[];for(let o of e)switch(o.type){case"text":t.push({type:"text",text:o.text});break;case"thinking":t.push({type:"text",text:o.thinking});break;case"image":t.push({type:"image_url",image_url:{url:`data:${o.source.media_type};base64,${o.source.data}`}})}return t}function Ta(e){if(e)return e.filter(aa).map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function $a(e){if(e)switch(e.type){case"auto":return"auto";case"any":return"required";case"tool":return e.name?{type:"function",function:{name:e.name}}:void 0;case"none":return"none";default:return}}function Aa(e){return"string"==typeof e?[{type:"text",text:e}]:Array.isArray(e)?e.filter(e=>"text"===e.type).map(e=>({type:"text",text:e.text})):[]}function Sa(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Ea(e){return e?e.map(e=>{let t={};try{t=JSON.parse(e.function.arguments)}catch{r.warn(`Failed to parse tool call arguments for "${e.function.name}": ${e.function.arguments.slice(0,200)}`)}return{type:"tool_use",id:e.id,name:e.function.name,input:t}}):[]}const Ca=new Set(["low","medium","high","max","xhigh"]);function Oa(e,t){let o=e.thinking;if(!o||"enabled"!==o.type)return e;let n=t?.data.find(t=>t.id===e.model);if(!n||!n.capabilities.supports.adaptive_thinking)return e;let r={...e,thinking:{type:"adaptive"}};if(!e.output_config?.effort){let t=(e=>null!==e&&Ca.has(e)?e:null)(Jn(function(e){return!e||e<=0?"medium":e<8e3?"low":e<24e3?"medium":"high"}(o.budget_tokens),n.capabilities.supports.reasoning_effort));t&&(r.output_config={...e.output_config,effort:t})}return r}function Ia(e){return"string"!=typeof e&&Array.isArray(e)?e.map(e=>{let t=e;if(!t.cache_control||"object"!=typeof t.cache_control)return e;let o=t.cache_control;if("string"!=typeof o.type){let{cache_control:e,...o}=t;return o}let n={type:o.type};return void 0!==o.ttl&&(n.ttl=o.ttl),{...t,cache_control:n}}):e}const Pa=/[^\w-]/g;function Ra(e){return e.replaceAll(Pa,"_")}function Na(e,t){let o=function(e,t){if(!e.output_config?.effort)return e;let o=t?.data.find(t=>t.id===e.model);if(!o)return e;let n=o.capabilities.supports.reasoning_effort;if(Array.isArray(n)&&n.length>0)return e;let{effort:r,...a}=e.output_config;if(0===Object.keys(a).length){let{output_config:t,...o}=e;return o}return{...e,output_config:a}}(e,t);return o=Oa(o,t),o=function(e,t){let o=e.max_tokens;if("number"!=typeof o)return e;let n=t?.data.find(t=>t.id===e.model);if(!n)return e;let r=n.capabilities.limits;if(!r)return e;let a=(!1===e.stream?r.max_non_streaming_output_tokens:void 0)??r.max_output_tokens;if("number"!=typeof a||a<=0)return e;let i=Math.max(Math.min(o,a),16);return i===o?e:{...e,max_tokens:i}}(o,t),o={...o,system:Ia(o.system)},o=function(e){let t=e.messages.map(e=>{if(!Array.isArray(e.content))return e;let t=e.content.map(e=>{let t=e;return"tool_use"===t.type&&"string"==typeof t.id?{...t,id:Ra(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Ra(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function qa(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t)return"thinking must be an object";let o=t,n=new Set(["enabled","adaptive","disabled"]);return"string"==typeof o.type&&n.has(o.type)?"enabled"!==o.type||void 0===o.budget_tokens||"number"==typeof o.budget_tokens&&Number.isFinite(o.budget_tokens)&&!(o.budget_tokens<=0)&&Number.isInteger(o.budget_tokens)?null:"thinking.budget_tokens must be a positive integer":"thinking.type must be one of: enabled, adaptive, disabled"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t)return"output_config must be an object";let o=t;if(void 0===o.effort)return null;let n=new Set(["low","medium","high","max","xhigh"]);return"string"==typeof o.effort&&n.has(o.effort)?null:"output_config.effort must be one of: low, medium, high, max, xhigh"}(e)}function ja(e,t,o=400){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function Da(e,t){return ge.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),da(n,t,e.req.header("anthropic-beta"));let r=Kn(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=qa(t);return a?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}):r===t.model?(n.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(n.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:t.model,to_model:r}),o.debug(`Model mapping: '${t.model}' → '${r}'`),{ok:!0,payload:{...t,model:r}})}catch(t){if(t instanceof Wn)return{ok:!1,response:ja(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function Ma(e){let t=function(e){let t=[];for(let o of e)"user"===o.role?t.push(...Fa(o)):t.push(...Ua(o));return t}(e.messages);if(0===t.length)throw new Bt("request has no translatable message content",Response.json({type:"error",error:{type:"invalid_request_error",message:"request has no translatable message content"}},{status:400}));let o={model:e.model,input:t,max_output_tokens:Math.max(e.max_tokens,16),stream:e.stream,temperature:e.temperature,top_p:e.top_p,store:!1,user:e.metadata?.user_id?.slice(0,64)},n=function(e){return e?function(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}("string"==typeof e?e:e.map(e=>e.text).join("\n\n")):null}(e.system);return n&&(o.instructions=n),e.tools?.length&&(o.tools=e.tools.filter(aa).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(o.tool_choice=function(e){switch(e.type){case"auto":return"auto";case"any":return"required";case"none":return"none";case"tool":return e.name?{type:"function",name:e.name}:void 0;default:return}}(e.tool_choice)),"adaptive"===e.thinking?.type?o.reasoning={effort:Ha(e.output_config?.effort??"high")}:"enabled"===e.thinking?.type&&e.thinking.budget_tokens&&(o.reasoning=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens)),o}function Ha(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Fa(e){if("string"==typeof e.content)return[{type:"message",role:"user",content:e.content}];let t=[],o=e.content.filter(e=>"tool_result"===e.type),n=e.content.filter(e=>"tool_result"!==e.type);for(let e of o)t.push(Ba(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)"text"===t.type?e.push({type:"input_text",text:t.text}):e.push({type:"input_image",image_url:`data:${t.source.media_type};base64,${t.source.data}`,detail:"high"});t.push({type:"message",role:"user",content:e})}else{let e=n.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function Ba(e){let t;return t="string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.filter(e=>"text"===e.type).map(e=>e.text).join("\n"):"",e.is_error&&(t=`[ERROR] ${t}`),{type:"function_call_output",call_id:e.tool_use_id,output:t}}function Ua(e){if("string"==typeof e.content)return[{type:"message",role:"assistant",content:e.content}];let t=[],o=e.content.filter(e=>"text"===e.type),n=e.content.filter(e=>"thinking"===e.type),r=e.content.filter(e=>"tool_use"===e.type),a=[...o.map(e=>e.text),...n.map(e=>e.thinking)].join("\n\n");a&&t.push({type:"message",role:"assistant",content:a});for(let e of r)t.push({type:"function_call",call_id:e.id,name:e.name,arguments:JSON.stringify(e.input)});return t}function La(e,t){if(t)return"tool_use";switch(e){case"completed":case"cancelled":case"failed":return"end_turn";case"incomplete":return"max_tokens";default:return null}}function Ga(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function za(e,t,o){e.messageStartSent||=(e.responseId=o?.responseId??e.responseId,e.model=o?.model??e.model,t.push({type:"message_start",message:{id:e.responseId,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}),!0)}function Ja(e,t){let o=[];switch(e.type){case"response.created":za(t,o,{responseId:e.response.id,model:e.response.model});break;case"response.in_progress":case"response.output_text.done":case"response.function_call_arguments.done":break;case"response.output_item.added":if("function_call"===e.item.type){za(t,o),Ga(t,o);let n=e.item;t.toolCalls[e.output_index]={call_id:n.call_id,name:n.name,_bi1:t.contentBlockIndex},o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"tool_use",id:n.call_id,name:n.name,input:{}}}),t.contentBlockOpen=!0}break;case"response.content_part.added":za(t,o),Ga(t,o),o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),t.contentBlockOpen=!0;break;case"response.output_text.delta":o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}});break;case"response.content_part.done":Ga(t,o);break;case"response.function_call_arguments.delta":{let n=t.toolCalls[e.output_index];n&&o.push({type:"content_block_delta",index:n._bi1,delta:{type:"input_json_delta",partial_json:e.delta}});break}case"response.output_item.done":if("function_call"===e.item.type){let n=t.toolCalls[e.output_index];n&&t.contentBlockOpen&&(o.push({type:"content_block_stop",index:n._bi1}),t.contentBlockIndex++,t.contentBlockOpen=!1)}break;case"response.completed":{Ga(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:La(e.response.status,n),stop_sequence:null},usage:{input_tokens:r?.input_tokens??0,output_tokens:r?.output_tokens??0}},{type:"message_stop"});break}case"response.incomplete":{za(t,o),Ga(t,o);let n=e.response.usage;o.push({type:"message_delta",delta:{stop_reason:"max_tokens",stop_sequence:null},usage:{input_tokens:n?.input_tokens??0,output_tokens:n?.output_tokens??0}},{type:"message_stop"});break}case"response.failed":za(t,o),Ga(t,o),o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":za(t,o),Ga(t,o),o.push({type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{input_tokens:0,output_tokens:0}},{type:"message_stop"});break;case"response.refusal.delta":za(t,o),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:e.delta}})}return o}function Wa(e,t){e.thinkingBlockOpen||(e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1),t.push({type:"content_block_start",index:e.contentBlockIndex,content_block:{type:"thinking",thinking:""}}),e.thinkingBlockOpen=!0,e.contentBlockOpen=!0)}function Ka(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Va(e,t){let o=[];if(0===e.choices.length)return o;let n=e.choices[0],{delta:r}=n;if(t.messageStartSent||=(o.push({type:"message_start",message:{id:e.id,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:0}}}),!0),"string"==typeof r.reasoning_text&&""!==r.reasoning_text&&(Wa(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"thinking_delta",thinking:r.reasoning_text}})),"string"==typeof r.reasoning_opaque&&""!==r.reasoning_opaque&&(Wa(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Ka(t,o)),r.content&&(Ka(t,o),function(e){return!!e.contentBlockOpen&&Object.values(e.toolCalls).some(t=>t._bi1===e.contentBlockIndex)}(t)&&(o.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1),t.contentBlockOpen||=(o.push({type:"content_block_start",index:t.contentBlockIndex,content_block:{type:"text",text:""}}),!0),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"text_delta",text:r.content}})),r.tool_calls){Ka(t,o);for(let e of r.tool_calls){if(e.id&&e.function?.name){t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),t.contentBlockIndex++,!1);let n=t.contentBlockIndex;t.toolCalls[e.index]={id:e.id,name:e.function.name,_bi1:n},o.push({type:"content_block_start",index:n,content_block:{type:"tool_use",id:e.id,name:e.function.name,input:{}}}),t.contentBlockOpen=!0}if(e.function?.arguments){let n=t.toolCalls[e.index];n&&o.push({type:"content_block_delta",index:n._bi1,delta:{type:"input_json_delta",partial_json:e.function.arguments}})}}}return n.finish_reason&&(Ka(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:_a(n.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:"message_stop"})),o}const Ya=/structured_outputs|output_config\.format/i;function Xa(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Ya.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Na({...e,model:Un},o):null}var Za=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var Qa=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const ei={tavily:async function(e,t,n){let r=function(e,t){let o={query:e,max_results:t?.maxResults??5};return t?.includeDomains?.length&&(o.include_domains=t.includeDomains),t?.excludeDomains?.length&&(o.exclude_domains=t.excludeDomains),o}(t,n);o.debug("Tavily search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await et({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("tavily.results_count",e.results.length),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw Ve(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Qa:e}finally{clearTimeout(i)}},exa:async function(e,t,n){let r=function(e,t){let o={query:e,numResults:t?.maxResults??5,contents:{text:!0}};return t?.includeDomains?.length&&(o.includeDomains=t.includeDomains),t?.excludeDomains?.length&&(o.excludeDomains=t.excludeDomains),o}(t,n);o.debug("Exa search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await et({spanName:"exa POST /search",url:"https://api.exa.ai/search",target:"exa_search",method:"POST",headers:{"Content-Type":"application/json","x-api-key":e},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"exa.max_results":n?.maxResults??5,"exa.has_include_domains":!!n?.includeDomains?.length,"exa.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("exa.results_count",e.results.length),o.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw Ve(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Za:e}finally{clearTimeout(i)}}},ti=["tavily","exa"];function oi(e){return"tavily"===e||"exa"===e}function ni(){return Z.webSearchProviders.length>0}async function ri(e,t){return async function(e,t,n){let{providers:r,searchFns:a=ei}=n;if(0===r.length)throw Error("No web search provider configured");let i,s=[];for(let[n,l]of r.entries())try{let n=await a[l.name](l.key,e,t);return s.length>0&&o.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),n}catch(e){i=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);n!==r.length-1&&o.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${r[n+1].name}".`)}let l=i instanceof Error?i.message:String(i);throw o.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),i instanceof Error?i:Error("All web search providers failed")}(e,t,{providers:Z.webSearchProviders})}function ai(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function ii(e,t){let o=[{type:"web_search_tool_result_error",error_code:t.errorCode??"unavailable"}];return{type:"web_search_tool_result",tool_use_id:e,content:t.searchFailed?o:t.results}}async function si(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return t&&ra(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!ni())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await ri(n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains})).map(e=>({type:"web_search_result",url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString("base64"),page_age:null}))}catch(e){o.error("Web search failed:",e),s=!0,a??="unavailable"}let l={query:n,results:i,model:t.model,searchFailed:s,errorCode:a};if(!t.stream)return e.set("requestData",{model:t.model,streaming:!1}),e.json(function(e){let{query:t,model:o}=e,n=`srvtoolu_${ai()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...ii(n,e)}];return{id:`msg_ws_${ai()}`,type:"message",role:"assistant",model:o,content:r,stop_reason:"end_turn",stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}(l));let c=function(e){let{query:t,model:o}=e,n=`srvtoolu_${ai()}`,r=`msg_ws_${ai()}`,a=[];return a.push({type:"message_start",message:{id:r,type:"message",role:"assistant",content:[],model:o,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:"content_block_start",index:0,content_block:{type:"text",text:""}},{type:"content_block_delta",index:0,delta:{type:"text_delta",text:"I'll search for that."}},{type:"content_block_stop",index:0},{type:"content_block_start",index:1,content_block:{type:"server_tool_use",id:n,name:"web_search",input:{}}},{type:"content_block_delta",index:1,delta:{type:"input_json_delta",partial_json:JSON.stringify({query:t})}},{type:"content_block_stop",index:1},{type:"content_block_start",index:2,content_block:ii(n,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),D(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const li=(e,t)=>!(!e||!t||e===t);async function ci(e){if(Z._t1||await Ro())return null;let t=Ao();return t?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${Eo()}`}},401)):(d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function ui(e,t){let o=t.model;return o&&"string"==typeof o?null:ja(e,"Model name is required and must be a string")}async function pi(e){let t=await e.req.json();if(function(e){let t=e.tools;return!(!t||1!==t.length)&&ra(t[0])}(t))return ui(e,t)??si(e,t);await Yn(Z),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=ui(e,t);if(a)return a;t=function(e,t){return ga(t,Z.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Da(e,t);if(!i.ok)return i.response;t=i.payload;let s=await ci(e);if(s)return s;if(Vn(t.model))return hi(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t,o){let n=Na(t,Z.models),r={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},a=n.output_config?.effort;return e.set("requestData",{model:n.model,reasoningEffort:a,effortClamped:li(o,a),streaming:!!n.stream}),Z.manualApprove&&await Dn(),ge.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",n.model),t.setAttribute("copilot_api.streaming",!!n.stream),da(t,n,r.anthropicBeta);try{let o=performance.now(),a=await ma(n,r,{onStructuredOutputFallback:(e,o)=>{let n=Xa(e,o,Z.models);return n&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",n.model)),n}}),i=performance.now()-o;if(Me.record(i,{model:n.model,target:"anthropic_messages",streaming:String(!!n.stream)}),!n.stream){let o=a,n=o.usage;if(n){let t={input_tokens:n.input_tokens||0,output_tokens:n.output_tokens||0,cache_read_input_tokens:n.cache_read_input_tokens||0,cache_creation_input_tokens:n.cache_creation_input_tokens||0},o=e.get("requestData")||{};o.tokenUsage=Hn(mi(t)),o._d1=i,o.upstreamTtfbMs=i,o.upstreamTotalMs=i,e.set("requestData",o)}return t.end(),e.json(o)}let{events:s,span:l,release:c}=a;return D(e,async r=>{let a=0,i=performance.now(),u={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=cr(e,o);try{try{for await(let e of s)d(),e.data&&"[DONE]"!==e.data?(a++,Pe.add(1,{model:n.model,endpoint_type:"anthropic_messages"}),fi(e.data,u)&&(p=!0),await r.writeSSE(e)):await r.writeSSE(e);let e=performance.now()-i,t={model:n.model,endpoint_type:"anthropic_messages"};He.record(e,t),Je.record(a,t)}catch(t){throw Ye(l,e.get("requestSpan"),t),await Qn(r,t),t}finally{if(ur(e,o),p){let t=mi(u);Fn(l,t);let o=e.get("requestData")||{};o.tokenUsage=Hn(t),e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&ue.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Ve(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=ge.startActiveSpan("copilot_api.translate.anthropic_to_openai",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),o.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),o.setAttribute("copilot_api.translation.has_system",!!t.system),o.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let n=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)),r=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));return o.setAttribute("copilot_api.translation.has_images",n),o.setAttribute("copilot_api.translation.has_thinking",r),ya(t,Z.models)}finally{o.end()}});Be.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=ir(c,Z.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:li(r,u),streaming:!!c.stream});let p=performance.now();Z.manualApprove&&await Dn();let d=await $r(c),m=performance.now()-p;if(Me.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),di(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=Hn(d.usage)),t._d1=m,t.upstreamTtfbMs=m,t.upstreamTotalMs=m,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(d).slice(-400));let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.openai_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","openai_to_anthropic");let t=function(e){let t=[],o=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let a of e.choices){let e=Sa(a.message),i=Aa(a.message.content),s=Ea(a.message.tool_calls);t.push(...e),o.push(...i),n.push(...s),("tool_calls"===a.finish_reason||"stop"===r)&&(r=a.finish_reason)}return{id:e.id,type:"message",role:"assistant",model:e.model,content:[...t,...o,...n],stop_reason:_a(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(d);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return Be.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}o.debug("Streaming response from service");let{events:f,span:h,release:g}=d;return D(e,async t=>{let n=null,r=0,a=performance.now(),i=cr(e,p),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of f){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let l;try{l=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,Pe.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=Hn(n),t._d1=m,e.set("requestData",t)}let u=Va(l,s);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let l=performance.now()-a,u={model:c.model,endpoint_type:"anthropic"};if(He.record(l,u),Je.record(r,u),ur(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=Hn(n),t._d1=m,e.set("requestData",t))}}catch(o){throw Ye(h,e.get("requestSpan"),o),await Qn(t,o),o}finally{n&&Fn(h,n),h.end(),g()}let l=e.get("requestId");l&&ue.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const di=e=>Object.hasOwn(e,"choices");function mi(e){let t=e.input_tokens+e.cache_read_input_tokens+e.cache_creation_input_tokens;return{prompt_tokens:t,completion_tokens:e.output_tokens,total_tokens:t+e.output_tokens,prompt_tokens_details:{cached_tokens:e.cache_read_input_tokens}}}function fi(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}async function hi(e,t){let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.anthropic_to_responses",e=>{try{return e.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),e.setAttribute("copilot_api.translation.message_count",t.messages.length),Ma(t)}finally{e.end()}});Be.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream}),Z.manualApprove&&await Dn();let i=performance.now(),s=await Er(a),l=performance.now()-i;if(Me.record(l,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Or(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=Hn({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens})),t._d1=l,t.upstreamTtfbMs=l,t.upstreamTotalMs=l,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(s).slice(-400)),"failed"===s.status)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:s.error?.code??"api_error",message:s.error?.message??"Response generation failed"}},500);let r=performance.now(),a=ge.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:La(e.status,o),stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}(s)}finally{e.end()}});return Be.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return D(e,async t=>{let n=null,r=0,s=performance.now(),d=cr(e,i),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let i of c){if(d(),o.debug("Responses API raw stream event:",i),!i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}r++,Pe.add(1,{model:a.model,endpoint_type:"responses"});let c=Ir(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=Hn(n),t._d1=l,e.set("requestData",t)}let u=Ja(s,m);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let u=performance.now()-s,p={model:a.model,endpoint_type:"responses"};He.record(u,p),Je.record(r,p),ur(e,i)}catch(o){throw Ye(u,e.get("requestSpan"),o),await Qn(t,o),o}finally{n&&Fn(u,n),u.end(),p()}let f=e.get("requestId");f&&ue.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}const gi=new q;gi.post("/",async e=>{try{return await pi(e)}catch(t){return await io(e,t)}});const _i=new q;function yi(e){return ge.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Kn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),Ae.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function wi(e,t){let o=function(e){try{let t=JSON.parse(e);if(("response.completed"===t.type||"response.incomplete"===t.type)&&t.response?.usage){let e=t.response.usage;return{prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=Hn(o),n._d1=t._d1,t.c.set("requestData",n)}_i.get("/",async e=>{try{Z.models||await ho();let t=Z.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await io(e,t)}});const ki=new Set(["message","function_call","function_call_output"]),bi=new Set(["type","name","description","parameters"]);async function vi(e){if(!e)return!1;let t=e.sources;if(t&&t.length>0)return!1;let n=e.query??e.queries?.[0];return!(!n||!ni())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await ri(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function xi(e){if(ni())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await vi(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Ti(e){if(!ni())return e;try{let t=JSON.parse(e);if("response.output_item.done"===t.type){let e=t.item;if("web_search_call"===e?.type&&await vi(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function $i(e){switch(e.type){case"custom_tool_call":{let t=e.input;return{type:"function_call",call_id:e.call_id,name:e.name,arguments:JSON.stringify("string"==typeof t?{input:t}:t)}}case"custom_tool_call_output":return{type:"function_call_output",call_id:e.call_id,output:e.output};default:return ki.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Ai(e,t){if("function_call"!==e.type||!t.has(e.name))return!1;if(e.type="custom_tool_call","string"==typeof e.arguments){try{e.input=JSON.parse(e.arguments).input??e.arguments}catch{e.input=e.arguments}delete e.arguments}return!0}function Si(e,t){if(0===t.size)return e;try{let o=JSON.parse(e),n=o.type;if("response.output_item.added"===n||"response.output_item.done"===n){let e=o.item;if(e&&Ai(e,t))return JSON.stringify(o)}if("response.completed"===n){let n=o.response?.output;if(!n)return e;let r=!1;for(let e of n)Ai(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Ei(e){return null!=e}function Ci(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Oi(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Ii(e){let t={model:e.model},{input:o,droppedInputTypes:n}=function(e){if(!Array.isArray(e))return{input:e,droppedInputTypes:[]};let t=new Set,o=[];for(let n of e){if(!Ci(n)){o.push(n);continue}let e=$i(n);null===e?t.add(Oi(n.type)):o.push(e)}return{input:o,droppedInputTypes:[...t]}}(e.input);void 0!==o&&(t.input=o);for(let o of["previous_response_id","prompt","conversation","instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])Ei(e[o])&&(t[o]=e[o]);let r=new Set;if(Ei(e.tools)){let o=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let o=e.type;if("web_search"===o||o.startsWith("web_search_"))return{type:e.type};let n={};for(let t of Object.keys(e))bi.has(t)&&(n[t]=e[t]);return"custom"===n.type&&(n.type="function",t.add(n.name),n.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),n}),customToolNames:t}}(e.tools);t.tools=o.tools,r=o.customToolNames}if(Ei(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Ei(o.effort)&&(t.reasoning.effort=o.effort),Ei(o.summary)&&(t.reasoning.summary=o.summary)}if(Ei(e.text)&&"object"==typeof e.text){let o=e.text;Ei(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Pi(e,t){return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Ri(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=d.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||Ei(n.previous_response_id)||Ei(n.prompt)||Ei(n.conversation)?null:Pi(e,`input contains no supported items: every item was dropped (unsupported item types: ${r.join(", ")}). Provide at least one message, function_call or function_call_output item, or previous_response_id, prompt or conversation.`)}async function Ni(e){await Yn(Z);let t=await e.req.json();if(!Ci(t))return Pi(e,"request body must be a JSON object");let n=Ii(t),{customToolNames:r}=n,a=n.payload;o.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),r.size>0&&o.debug(`Custom tools detected: ${[...r].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:yi(t)}}catch(t){if(t instanceof Wn)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,a);if(!i.ok)return i.response;a=i.payload;let s=Ri(e,t.input,n);if(s)return s;let l=await Mn(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),Z.manualApprove&&await Dn();let c=performance.now(),u=await Er(a),p=performance.now()-c;if(Me.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),qi(u))return async function(e,t,o){await xi(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=Hn({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return D(e,async t=>{let o={value:null},n=0,i=performance.now(),s=cr(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Si(i.data,r);s=await Ti(s);let l=s===i.data?i:{...i,data:s};Pe.add(1,{model:a.model,endpoint_type:"responses"}),wi(s,{usageRef:o,c:e,_d1:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};He.record(l,u),Je.record(n,u),ur(e,c)}catch(o){throw Ye(m,e.get("requestSpan"),o),await er(t,o),o}finally{o.value&&Fn(m,o.value),m.end(),f()}let l=e.get("requestId");l&&ue.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const qi=e=>Object.hasOwn(e,"output"),ji=new q;ji.post("/",async e=>{try{return await Ni(e)}catch(t){return await io(e,t)}});const Di=new q;Di.get("/",e=>{try{return Z.showToken?e.json({token:Z._t1}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return o.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const Mi=new q;Mi.get("/",async e=>{try{let t=await Vo();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Hi=new q;function Fi(){return function(e){let t=e.filter(e=>Nn(e));if(0===t.length)return;let o=t.find(e=>Rn.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(Z.models?.data??[])}function Bi(e,t,o){let n=function(e){if(!e)return;try{let t=JSON.parse(e),o=t.error?.message??t.message;if("string"==typeof o&&o.length>0)return En(o).slice(0,200)}catch{}let t=En(e).trim();return t.length>0?t.slice(0,200):void 0}(t),r=n?` (upstream: ${n})`:"";switch(!0){case 401===e:case 403===e:return`Authentication/entitlement failed (HTTP ${e}). Your GitHub Copilot subscription may be inactive, or the Auth token is invalid. Run \`copilot-api auth\` to re-authenticate; if it persists, this account has no active Copilot access${r}.`;case 402===e:return`Premium monthly quota exhausted (HTTP 402). Switch to a non-premium model (e.g. claude-haiku-4.5) or wait for the monthly quota reset${r}.`;case 400===e:return`Model '${o}' was rejected (HTTP 400). On individual plans only some models are entitled — try claude-haiku-4.5, or run \`copilot-api doctor\` to see what works${r}.`;case 413===e:return`Request too large (HTTP 413)${r}.`;case 429===e:return`Rate limited upstream (HTTP 429) — wait and retry${r}.`;case 503===e:return`Service not ready (HTTP 503) — the model catalog or Service token is still warming up. Retry in a few seconds${r}.`;case e>=500:return`Upstream error (HTTP ${e})${r}.`;default:return`Unexpected response (HTTP ${e})${r}.`}}async function Ui(e={}){let t=performance.now(),o=e.model&&function(e){let t=Z.models?.data.find(t=>t.id===e);return void 0!==t&&Nn(t)}(e.model)?e.model:Fi();if(!o)return{ok:!1,durationMs:0,reason:"No models available — the catalog is empty (upstream /models failed at startup). Check connectivity and authentication."};let n,r=e.timeoutMs??3e4,a=()=>Math.round(performance.now()-t),i=(async()=>{try{let e=await Hi.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[In]:Pn},body:JSON.stringify({model:o,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(e.ok)return{ok:!0,model:o,status:e.status,durationMs:a()};let t=await e.text().catch(()=>"");return{ok:!1,model:o,status:e.status,durationMs:a(),reason:Bi(e.status,t,o),detail:t.slice(0,400)||void 0}}catch(e){let t=e instanceof Error?e.message:String(e);return{ok:!1,model:o,durationMs:a(),reason:`Request failed before a usable response: ${t}`,detail:t}}})(),s=new Promise(e=>{n=setTimeout(()=>{e({ok:!1,model:o,durationMs:a(),reason:`Did not complete within ${r}ms. If you started with --manual, approve the request or use --no-smoke-test; otherwise the upstream may be slow or unreachable.`})},r)});try{return await Promise.race([i,s])}finally{n&&clearTimeout(n)}}Hi.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=yt(i),p=function(e){return e===Pn}(e.req.header(In));e.set("requestId",r),e.set("isSelfTest",p),e.header("x-request-id",r);let m=ge.startSpan("copilot_api.handle_request",{kind:l.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",m),e.set("requestTraceContext",m.spanContext()),p&&m.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Ze.has(e)||"x-copilot-api-self-test"!==e&&m.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=await e.req.raw.clone().text();e.set("rawBody",t.length>jn?t.slice(0,jn):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let f,h=new Promise(e=>{f=e});e.set("streamComplete",h),e.set("resolveStreamComplete",f);let g=d.setSpan(u.active(),m);await u.with(g,async()=>{p||ue.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw m.setStatus({code:c.ERROR,message:t.message}),m.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:m};_?.streaming&&e.res.status<400?h.then(()=>qn(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{m.recordException(t),m.setStatus({code:c.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{m.end()}catch{}}):qn(y)}),Hi.use(j()),Hi.use(async(e,t)=>{let o=e.req.header("content-length");if(o){let t=Number(o);if(Number.isFinite(t)&&t>33554432)return r.warn(`Rejected oversized request: ${t} bytes on ${e.req.path} (UA: ${e.req.header("user-agent")??"unknown"})`),e.json({type:"error",error:{type:"request_too_large",message:`Request body exceeds 32 MB limit (got ${t} bytes).`}},413)}await t()}),Hi.get("/",e=>e.text("Server running")),Hi.route("/health",ta),Hi.route("/chat/completions",Qr),Hi.route("/models",_i),Hi.route("/embeddings",ea),Hi.route("/usage",Mi),Hi.route("/token",Di),Hi.route("/v1/chat/completions",Qr),Hi.route("/v1/models",_i),Hi.route("/v1/embeddings",ea),Hi.route("/v1/messages",gi),Hi.post("/v1/messages/count_tokens",async function(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:"invalid_request_error",message:"Invalid JSON"}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let o=sa.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=sa.perMessage+la(e)*sa.contentMultiplier}for(let e of t.messages)o+=sa.perMessage,o+=la(e.role),"string"==typeof e.content?o+=la(e.content)*sa.contentMultiplier:Array.isArray(e.content)&&(o+=ca(e.content));let n=t.tools?.filter(aa);return n&&n.length>0&&(o+=function(e){let t=sa.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=sa.perTool),t+=la(n.name),n.description&&(t+=sa.perDesc+la(n.description)),t+=ua(n.input_schema);return t}(n)),e.json({input_tokens:Math.round(o)})}),Hi.route("/v1/responses",ji),Hi.route("/responses",ji),Hi.onError((e,t)=>io(t,e));const Li=e=>`[1m${e}[0m`,Gi=e=>`[2m${e}[0m`,zi=e=>`[32m${e}[0m`,Ji=e=>`[31m${e}[0m`,Wi=e=>`[33m${e}[0m`,Ki=Gi(" ─────────────────────────────────────────────────────────────");function Vi(e,t,o){console.log(` ${function(e){return"ok"===e?zi("✓"):"warn"===e?Wi("⚠"):Ji("✗")}(e)} ${Li(t.padEnd(14))} ${o}`)}function Yi(e){console.log(` ${Gi("↳")} ${Gi(e)}`)}function Xi(e){return e instanceof Bt?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function Zi(){let e=g.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await a.readFile(K.GITHUB_TOKEN_PATH,"utf8")).trim();return e.length>0?e:void 0}catch{return}}();return t?{token:t,source:"stored file"}:void 0}async function Qi(){try{await ho();let e=(Z.models?.data.length??0)>0;return Vi(e?"ok":"warn","Model catalog",e?function(){let e=Z.models?.data??[],t={Claude:0,OpenAI:0,Gemini:0,Embedding:0};for(let o of e)o.id.startsWith("text-embedding")?t.Embedding++:"Anthropic"===o.vendor?t.Claude++:"Google"===o.vendor?t.Gemini++:t.OpenAI++;let o=Object.entries(t).filter(([,e])=>e>0).map(([e,t])=>`${e}: ${t}`);return`${e.length} models (${o.join(", ")})`}():"empty"),e}catch(e){return Vi("fail","Model catalog",Xi(e)),Yi("Could not fetch /models — check connectivity/auth."),!1}}async function es(e){Z.accountType=e.accountType;let t=await Et(),o=Ct();if(console.log(""),console.log(` ${Li("COPILOT-API DOCTOR")} ${Gi(`v${t}`)}`),console.log(Ki),Vi("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await V(),go(),!await async function(){let e=await Zi();if(!e)return Vi("fail","Auth token","not found"),void Yi("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");Z._t2=e.token,Vi("ok","Auth token",`found (${e.source})`);try{let e=await lo();return await lt(Z,e.login),Vi("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return Vi("fail","GitHub auth",Xi(e)),void Yi("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(Ki),console.log(` ${Ji("✗")} ${Li("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await so();return Z._t1=e,Vi("ok","Service token","acquired"),!0}catch(e){let t=e instanceof Bt?e.response.status:0;return Vi("fail","Service token",Xi(e)),Yi(401===t?"Auth token is invalid/expired — run `copilot-api auth`.":403===t?"No active GitHub Copilot subscription on this account. Re-auth won't help.":"Transient/network issue — check connectivity and retry."),!1}}(),r=!!n&&await Qi();await async function(){try{let e=await Vo(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${Lo(Go(t))} of ${Lo(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;Vi("ok","Copilot plan",`${e.copilot_plan} · ${o} `+Gi(`(resets ${e.quota_reset_date})`))}catch(e){Vi("warn","Copilot plan",`unavailable (${Xi(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await Ui();return e.ok?(Vi("ok","Generation",`works via ${e.model} ${Gi(`(${e.durationMs}ms)`)}`),!0):(Vi("fail","Generation",`${e.reason}${e.status?Gi(` [HTTP ${e.status}]`):""}`),!1)}():Vi("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let o of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let n=g.env[o];n&&("ANTHROPIC_BASE_URL"===o&&/\/v1\/*$/.test(n)&&(t="warn",e.push(`${o}=${n} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(n)&&(t="warn",e.push(`${o}=${n} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){Vi(t,"Client config","potential base-URL issue");for(let t of e)Yi(t)}else Vi("ok","Client config","no base-URL issues detected");Yi("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(Ki),a?(console.log(` ${zi("✓")} ${Li("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${Wi("⚠")} ${Li("Some checks need attention")} — see the ${Ji("✗")}/${Wi("⚠")} lines above.`),console.log(""),2)}const ts=e({meta:{name:"doctor",description:"Diagnose your setup end-to-end: token, auth, entitlement, model catalog, and one real generation. Tells you exactly what's wrong and how to fix it."},args:{"account-type":{alias:"a",type:"string",default:"individual",description:"Account type to check against (individual, business, enterprise)"}},async run({args:e}){let t=await es({accountType:e["account-type"]});g.exit(t)}});function os(e){return{log(t,r){let a=o.level>=n.debug;if(t.level!==n.warn||a)for(let o of e)o.log(t,r)}}}let ns=!1;const rs="copilot-api-node20",as=`https://registry.npmjs.org/${rs}/latest`,is=e=>`[1m${e}[0m`,ss=e=>`[33m${e}[0m`;async function ls(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(as,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function cs(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}let us,ps;async function ds(e){try{let[t,o]=await Promise.all([Et(),ls(e)]);return"unknown"!==t&&o&&function(e,t){let o=e.split(".").map(Number),n=t.split(".").map(Number),r=Math.max(o.length,n.length);for(let e=0;e<r;e++){let t=o[e]??0,r=n[e]??0;if(t<r)return!0;if(t>r)return!1}return!1}(t,o)?{current:t,latest:o}:null}catch{return null}}function ms(){if(!us||!ps)return;let{signal:e}=ps;us.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${rs}@latest`,n=ss("│"),r=` ${is("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${is(o)} to update`,i=" ".repeat(54),s=ss(`╭${"─".repeat(54)}╮`),l=ss(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${cs(r,54)}${n}`,`${n}${i}${n}`,`${n}${cs(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var fs={posts:[{title:"I Almost Bought an AI Code Reviewer. Then I Did the Math.",teaser:"100+ repos. Every PR reviewed by AI. Under $1K a month.",url:"https://barazany.dev/blog/claude-code-pr-reviewer",date:"2026-06-09"},{title:"I Had Claude Mine 30 Days of My Own Messages. What It Found Was Uncomfortably Accurate.",teaser:"I had Claude read a month of my messages. It nailed me.",url:"https://barazany.dev/blog/mining-claude-history-ultracode",date:"2026-06-05"},{title:"The 5-Hour Quota, Boris's Tweet, and What the Source Code Actually Reveals",teaser:"Claude Code's caching story — decoded from the source.",url:"https://barazany.dev/blog/claude-code-token-caching",date:"2026-04-01"}]};const hs=262144,gs="https://barazany.dev",_s=/^[a-z0-9][a-z0-9-]*$/i,ys=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function ws(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(ys," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function ks(e){if("object"!=typeof e||!e)return null;let t=e,o=ws(t.title,100),n=ws(t.teaser??t.excerpt??t.description,120),r=function(e){if("string"!=typeof e||e.length>2048)return null;let t;try{t=new URL(e)}catch{return null}if(t.origin!==gs||t.username||t.password)return null;let o=t.href;return/^[\x21-\x7E]+$/.test(o)?o:null}(t.url);if(null===r&&void 0===t.url&&"string"==typeof t.slug&&_s.test(t.slug)&&(r=`${gs}/blog/${t.slug}`),!o||!n||null===r)return null;let a=function(e){if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e))return Number.isFinite(Date.parse(e))?e.slice(0,10):void 0}(t.date);return a?{title:o,teaser:n,url:r,date:a}:{title:o,teaser:n,url:r}}function bs(e){let t=e;if(!Array.isArray(e)&&"object"==typeof e&&e&&(t=e.posts),!Array.isArray(t))return[];let o=[];for(let e of t){let t=ks(e);t&&o.push(t)}let n=e=>e.date?Date.parse(e.date):-1/0;return o.sort((e,t)=>n(t)-n(e)).slice(0,3)}let vs=null;function xs(e){return s.join(e,"blog-posts.json")}function Ts(e=K.APP_DIR){try{if(vs&&vs.length>0)return vs;let t=function(e){try{let t=xs(e);return U.statSync(t).size>hs?[]:bs(JSON.parse(U.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:bs(fs)}catch{return[]}}function $s(e){return e>-6e4&&e<864e5}async function As(e){let t=new AbortController,o=setTimeout(()=>t.abort(),e);"object"==typeof o&&"unref"in o&&o.unref();try{let e=await fetch("https://barazany.dev/posts.json",{signal:t.signal,headers:{accept:"application/json"}});if(!e.ok)return await(e.body?.cancel().catch(()=>{})),[];let o=await async function(e,t){let o=Number(e.headers.get("content-length"));if(Number.isFinite(o)&&o>hs)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>hs?null:t}let n=e.body.getReader(),r=()=>{n.cancel().catch(()=>{})};t.addEventListener("abort",r,{once:!0});let a=[],i=0;try{for(;;){let{done:e,value:t}=await n.read();if(e)break;if(i+=t.byteLength,i>hs)return await n.cancel().catch(()=>{}),null;a.push(t)}}finally{t.removeEventListener("abort",r)}return t.aborted?null:Buffer.concat(a).toString("utf8")}(e,t.signal);return null===o?[]:bs(JSON.parse(o))}finally{clearTimeout(o)}}async function Ss(e={}){try{if("1"===g.env.COPILOT_API_NO_BLOG||"1"===g.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??K.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=xs(e),n=await U.promises.stat(o);if(n.size<=hs){let e=await U.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return $s(t-n.fetchedAt)}return $s(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await As(e.timeoutMs??3e3);if(0===n.length)return;vs=n,await async function(e,t,o){let n=xs(e),r=`${n}.${g.pid}.tmp`;try{await U.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await U.promises.rename(r,n)}catch(e){throw await U.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}function Es(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=g;if("win32"===e){try{if(h(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:"pipe"}).toString().toLowerCase().includes("powershell.exe"))return"powershell"}catch{return"cmd"}return"cmd"}{let e=o.SHELL;if(e){if(e.endsWith("zsh"))return"zsh";if(e.endsWith("fish"))return"fish";if(e.endsWith("bash"))return"bash"}return"sh"}}(),r=Object.entries(e).filter(([,e])=>void 0!==e);switch(n){case"powershell":o=r.map(([e,t])=>`$env:${e} = ${t}`).join("; ");break;case"cmd":o=r.map(([e,t])=>`set ${e}=${t}`).join(" & ");break;case"fish":o=r.map(([e,t])=>`set -gx ${e} ${t}`).join("; ");break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(" ");o=r.length>0?`export ${e}`:"";break}}return o&&t?`${o}${"cmd"===n?" & ":" && "}${t}`:o||t}const Cs=e=>`[1m${e}[0m`,Os=e=>`[2m${e}[0m`,Is=e=>`[36m${e}[0m`,Ps=e=>`[32m${e}[0m`,Rs=e=>`[33m${e}[0m`,Ns=e=>`[4m${e}[0m`,qs=(e,t)=>`]8;;${e}\\${t}]8;;\\`,js="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Ds="https://github.com/johnib/copilot-api-issues/issues",Ms=Os(" ─────────────────────────────────────────────────────────────");function Hs(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function Fs(e){return e&&0!==e.length?e.join("·"):"—"}function Bs(e){if(0===e.length)return[];let t=["",Ms,` ${Cs("BARAZANY.DEV")} ${Os("— Recent Posts")}`,Ms,""];for(let[o,n]of e.entries()){let e=`${n.url}${js}`,r=qs(e,Cs(Ns(`[${o+1}]`)));t.push(` ${r} ${Is(n.title)}`,` ${Os("→")} ${Os(n.teaser)}`,"")}return t.push(Ms,` ${qs(`https://barazany.dev/blog${js}`,"barazany.dev/blog")}`,Ms),t}function Us(e){let t=[];Z.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):Z.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearchProviders.length>0?`${e.webSearchProviders.map(e=>(e=>e&&e[0].toUpperCase()+e.slice(1))(e)).join(Os(" → "))} ${Ps("✓")}`:Os("off"),n=["",` ${Cs("COPILOT-API")} ${Os(`v${e.version}`)}`,Ms,` ${Os("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Os("User")} ${e.user} ${Os("·")} ${e.accountType}`];return Z._v1&&n.push(` ${Os("Client")} VSCode ${Z._v1}`),n.push(` ${Os("Network")} ${t.join(Os(" · "))}`,` ${Os("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Os("Clipboard")} Claude Code command ${Ps("✓")}`),n.push(Ms),n}function Ls(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Cs("Active")}`];if(e.model){let o=Z.models?.data.find(t=>t.id===e.model),n=Hs(o?.capabilities.limits?.max_context_window_tokens),r=Fs(o?.capabilities.supports.reasoning_effort);t.push(` ${Is(e.model.padEnd(32))} ${Os("ctx")} ${Cs(n.padStart(5))} ${Os("effort")} ${Os(r)} ${Rs("← main")}`)}if(e.smallModel){let o=Z.models?.data.find(t=>t.id===e.smallModel),n=Hs(o?.capabilities.limits?.max_context_window_tokens),r=Fs(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Os("ctx")} ${n.padStart(5)} ${Os("effort")} ${Os(r)} ${Rs("← small")}`)}return t}function Gs(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of Z.models?.data??[]){let a=r.capabilities.limits?.max_context_window_tokens,i={id:r.id,ctx:a,effort:r.capabilities.supports.reasoning_effort};r.id.startsWith("text-embedding")?n.push(i):"Anthropic"===r.vendor?e.push(i):"Google"===r.vendor?o.push(i):t.push(i)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${Cs(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Is("●"):Os("·"),i=n?Is(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Hs(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${Fs(r.effort)}`;t.push(` ${a} ${i} ${Os(s)}${Os(l)}`)}}return t}function zs(){let e=Ds.replace(/^https:\/\//,""),t=qs(`${Ds}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Ms,` ${Cs("FOUND A BUG?")} ${Os("— Report it on GitHub")}`,Ms,"",` ${Is("→")} ${Is(t)}`,` ${Os("Bug reports, feature requests, and questions welcome.")}`,"",Ms]}function Js(e){if(!e.endpoints)return[];let{scheme:t,port:o,hostname:n}=e.endpoints,r=n?`${t}://${n}:${o}`:`${t}://<your-tailscale-hostname>:${o}`,a=["",Ms,` ${Cs("Claude Cowork")} ${Os("— Settings → Inference Provider")}`,Ms,"",` ${Os("Paste into")} ${Cs("inferenceGatewayBaseUrl")}${Os(":")}`,` ${Cs(Is(r))}`];return n||a.push("",` ${Os("Your Tailscale hostname is shown by:")} ${Is("tailscale status --self")}`),a.push("",` ${Os("Docs:")} ${Is("https://claude.com/docs/cowork/3p/installation")}`),a}function Ws(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Ms,` ${Cs("HTTPS")} ${Os("— self-signed cert")}`,Ms,"",` ${Os("Cert")} ${t}`];switch(o.push("",` ${Cs("Trust this cert")} ${Os("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${Os("macOS:")}`,` ${Is("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Is(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Os("Windows (PowerShell as Administrator):")}`,` ${Is(`Import-Certificate -FilePath "${t}" \``)}`,` ${Is("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Os("Linux (Debian/Ubuntu):")}`,` ${Is(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Is("sudo update-ca-certificates")}`,` ${Os("Linux (Fedora/RHEL/Arch):")}`,` ${Is(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Is("sudo update-ca-trust")}`);break;default:o.push(` ${Os("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Os("Or, for Node CLIs only (no admin needed):")}`,` ${Is(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Ms),o}function Ks(e){let t=Math.floor(e/1e3),o=Math.floor(t/3600),n=Math.floor(t%3600/60);return o>0?`${o}h ${n}m`:n>0?`${n}m`:`${t}s`}const Vs=s.join(K.APP_DIR,"certs"),Ys=s.join(Vs,"cert.pem"),Xs=s.join(Vs,"key.pem"),Zs=s.join(Vs,"cert.meta.json");async function Qs(e){try{return await a.readFile(e,"utf8")}catch{return}}async function el(e){let t=await Qs(Ys),o=await Qs(Xs),n=await async function(){let e=await Qs(Zs);if(e)try{let t=JSON.parse(e);return Array.isArray(t.hosts)&&"string"==typeof t.notAfter?t:void 0}catch{return}}();if(!t||!o||!n)return!1;let r=new Set(n.hosts);for(let t of e)if(!r.has(t))return!1;let a=Date.parse(n.notAfter);return!Number.isNaN(a)&&a-Date.now()>2592e6}function tl(e){return 0!==z(e)}async function ol(e){await a.mkdir(Vs,{recursive:!0});let t=new Date,o=new Date;o.setDate(o.getDate()+825);let n=["127.0.0.1","::1"],r=new Set(["localhost"]),i=new Set(n);for(let t of e)tl(t)?i.add(t):r.add(t);let s=[...[...r].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))],l=await J([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:o,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:s}]});return await a.writeFile(Ys,l.cert,{mode:420}),await a.writeFile(Xs,l.private,{mode:384}),await async function(e){await a.writeFile(Zs,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:Ys,keyPath:Xs,generated:!0}}const nl=[],rl=Date.now();let al="";function il(){let e=async(e,t=0)=>{let n=ge.startSpan("copilot_api.server.shutdown",{kind:l.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-rl)/1e3}});for(let t of nl)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=qs("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Ms,` ${Cs("COPILOT-API")} ${Os(`v${e}`)} ${Os("·")} ${Ks(t)} uptime`,Ms,""," Check in from time to time on",` ${Is(o)}`,"",Ms,""];console.log(n.join("\n"))}(al,Date.now()-rl),g.exit(t)};g.on("SIGINT",()=>e("SIGINT")),g.on("SIGTERM",()=>e("SIGTERM")),g.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),g.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}async function sl(e,t,n){if(!e._cc1)return!1;Z.models||(o.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),g.exit(1));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,Z.models.data.map(e=>e.id));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Z.models.data.map(e=>e.id)}),a=await o.prompt("Select a small model to use",{type:"select",options:Z.models.data.map(e=>e.id)}));let s=Es({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:r,ANTHROPIC_SMALL_FAST_MODEL:a,NODE_EXTRA_CA_CERTS:n?.certPath},"claude");try{return m.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function ll(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function cl(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=ge.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Xe({config:{version:o,port:t.port,accountType:t.accountType,verbose:t.verbose,manualApprove:t.manual,rateLimitSeconds:t.rateLimit??0,rateLimitWait:t.rateLimitWait,timeoutMs:t.timeout,showToken:t.showToken,_cc1:t._cc1,model:t.model,smallModel:t.smallModel,_t3:ll(t)},runtime:n,identity:{_u1:r.login,machineId:Z.machineId,sessionId:Z.sessionId,_v1:Z._v1},connectivity:Z.connectivity,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-rl},"copilot_api")});if(Z.models?.data)for(let e of Z.models.data)a.addEvent("copilot_api.model.available",Xe(e,"model"));a.end(),Ke(_.INFO,"INFO","Server started",Xe({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:Z.models?.data.length??0,startupDurationMs:Date.now()-rl},"copilot_api"))}async function ul(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[o,n]=await Promise.all([a.readFile(e,"utf8"),a.readFile(t,"utf8")]);return{cert:o,key:n,certPath:e,keyPath:t,generated:!1}}(e.httpsCert,e.httpsKey);if(e.httpsCert||e.httpsKey)throw Error("Both --https-cert and --https-key must be provided together");return async function(e=[]){if(await el(e)){let e=await Qs(Ys),t=await Qs(Xs);if(e&&t)return{cert:e,key:t,certPath:Ys,keyPath:Xs,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),ol(e)}(e.httpsHosts)}}async function pl(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=_n;try{L(t),L(n)}catch{throw o.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:n}}(e);if(il(),nl.push(()=>{o.debug("Cleaning up connectivity monitor"),ot.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),To=!1,yo&&=void clearInterval(yo),ko&&=void ot.off("online",ko),bo&&=void ot.off("offline",bo),wo=void 0,vo=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),hr&&=void clearInterval(hr),gr&&=void clearInterval(gr);let e=[...dr.keys(),...mr];dr.clear(),mr.clear(),pr.clear(),fr=void 0;for(let t of e)_r(t)&&(qe.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!pe)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([pe.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");Z.accountType=t.accountType,Z.manualApprove=t.manual,Z.rateLimitSeconds=t.rateLimit,Z.rateLimitWait=t.rateLimitWait,Z.showToken=t.showToken,Z.timeoutMs=t.timeout,Z.connectivity.timeoutMs=t.connectTimeout,Z.webSearchProviders=t.webSearchProviders,Z.errorReporting=function(e){let t=g.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===g.env.COPILOT_H2_KEEPALIVE||"true"===g.env.COPILOT_H2_KEEPALIVE,t=e||"1"===g.env.COPILOT_H2||"true"===g.env.COPILOT_H2;Z.connectivity.h2=t,Z.connectivity.h2Keepalive=e}(),await V(),Ss().catch(()=>{}),go();let n=await Et();al=n;let r=Ct();(function(e,t){t&&(me=t),de=crypto.randomUUID();let o=v({[S]:"copilot-api",[E]:e,[A]:de}),{endpoint:n,headers:r}=he();pe=new $({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new T({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x({exporter:new w({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),pe.start()})(n,rl),t._t2&&o.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let a,i=t._t2||g.env.GH_TOKEN;i?(function(e){Z._t2=e,$o=!1}(i),o.info("Using provided Auth token")):await qo();try{a=await lo(),await lt(Z,a.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}await(async()=>{let{token:e,refresh_in:t}=await so();Z._t1=e,o.debug("Service token fetched successfully!"),Z.showToken&&o.info("Service token:",e),To=!0,No(t),ot.start(),ko=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Po(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},bo=()=>{o.debug("Network connectivity lost")},ot.on("online",ko),ot.on("offline",bo)})(),await async function(){try{return await ho(),!0}catch(e){let t="object"==typeof e&&e&&"statusCode"in e&&"number"==typeof e.statusCode?e.statusCode:void 0,n=e instanceof Error?e.message:"Unknown error occurred",r=void 0===t?"":` (HTTP ${t})`;return o.warn(`Could not fetch model list from Copilot${r}: ${n}. This is likely a transient network or authentication issue. The proxy will start anyway; model listing endpoints may return empty until the cache is populated.`),!1}}()||function(e){let t=setTimeout(()=>{ho().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{ho().then(()=>o.debug("Model list refreshed successfully")).catch(e=>{o.warn("Failed to refresh model list; keeping existing cache:",e)})},e);return t.unref(),()=>{clearInterval(t)}}();nl.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),Z.connectivity.h2&&(kr(wr(ct(Z))),Z.connectivity.h2Keepalive&&vr()),cl({options:t,version:n,runtime:r,_u1:a});let l=await ul(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await sl(t,u,l)||await async function(e,t,n){if(!e.codex)return!1;let r;if(Z.models||(o.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),g.exit(1)),e.model){let t=Z.models.data.map(e=>e.id);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);r=e.model}else r=await o.prompt("Select a model to use with Codex CLI",{type:"select",options:Z.models.data.map(e=>e.id)});let a=Es({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return m.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,u,l);(function(e){let t=[...Us(e),...Ls(e),...Gs(e),...zs(),"",...Bs(Ts()),...Js(e),...Ws(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:o,runtime:n,user:r,clipboardCopied:a,tls:i}=e,s=i?"https":"http";return{version:o,runtime:n,user:r,accountType:t.accountType,port:t.port,timeout:t.timeout,webSearchProviders:t.webSearchProviders.map(e=>e.name),model:t.model,smallModel:t.smallModel,clipboardCopied:a,https:i?{certPath:i.certPath,keyPath:i.keyPath,generated:i.generated,selfSigned:!t.httpsCert}:void 0,endpoints:t.claudeCowork?{scheme:s,port:t.port,hostname:await rn()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),ms(),G({fetch:Hi.fetch,port:t.port,hostname:t.hostname,tls:l?{cert:l.cert,key:l.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(c,t.hostname,t.port),t.smokeTest&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await Ui({model:t});if(r.ok){let t=void 0===n||["::1","127.0.0.1","localhost"].includes(n)?`Point your client at ${e}`:`Point your client at ${e} — you bound ${n}, so from another machine/container replace \`localhost\` with this host's reachable IP/hostname.`;return void o.success(`Self-test passed — generation works via ${r.model} (${r.durationMs}ms). ${t}`)}let a=r.status?` (HTTP ${r.status})`:"";o.warn(`Self-test FAILED${a}: ${r.reason??"unknown error"}`),r.detail&&o.info(` detail: ${En(r.detail)}`),o.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){o.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(u,t.smallModel??t.model,t.hostname)}function dl(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const ml=e({meta:{name:"start",description:"Start the API server"},args:{port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},"error-reporting":{type:"boolean",default:!0,description:"Send anonymous, sanitized error reports to the maintainer to help fix bugs (no prompts, completions, or tokens). Use --no-error-reporting or COPILOT_API_ERROR_REPORTING=0 to disable."},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"[DEPRECATED — set the TAVILY_API_KEY env var instead] Tavily API key for web search."},"web-search-provider":{type:"string",description:'Web search failover order, e.g. "exa,tavily" (first = primary, rest = fallbacks). Web search turns on when TAVILY_API_KEY and/or EXA_API_KEY are set; this flag is optional and only orders the providers you configured.'},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"},"smoke-test":{type:"boolean",default:!0,description:"After startup, run one tiny self-test generation to verify the proxy works end-to-end and print a clear PASS/FAIL. Disable with --no-smoke-test (or COPILOT_API_NO_SMOKE_TEST=1)."}},run({args:e}){let t=e["rate-limit"],n=void 0===t?void 0:dl(t,"--rate-limit"),r=e.timeout,a=void 0===r?X:dl(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:dl(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],g.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??g.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!oi(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${ti.join(", ")}`);let r=n.length>0?n:ti,a=new Set,i=n.length>0,s=[];for(let e of r){if(!oi(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||g.env.TAVILY_API_KEY,exaApiKey:g.env.EXA_API_KEY,order:u}),d=(g.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d;return pl({port:dl(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:n,rateLimitWait:e.wait,_t2:e["github-token"],_cc1:e["claude-code"],codex:e.codex,model:e.model,smallModel:e["small-model"],showToken:e["show-token"],timeout:a,connectTimeout:i,webSearchProviders:p,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!m})}});ns||(ns=!0,o.setReporters([os(o.options.reporters)]));const fl=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(us||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;ps=e,us=ds(e).catch(()=>null)})(),fl||ms();const hl=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Mo,start:ml,"check-usage":Qo,debug:Pt,doctor:ts,"cowork-setup":An}});await t(hl),fl||(ps?.abort(),ps=void 0,us=void 0);export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "copilot-api-node20",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.43.0",
|
|
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",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"dist"
|
|
29
29
|
],
|
|
30
30
|
"scripts": {
|
|
31
|
-
"build": "tsdown && node obfuscate-dist.js",
|
|
31
|
+
"build": "bun scripts/fetch-posts.ts || echo fetch-posts skipped && tsdown && node obfuscate-dist.js",
|
|
32
32
|
"build:no-obfuscation": "tsdown",
|
|
33
33
|
"build:readable": "tsdown --no-minify",
|
|
34
34
|
"dev": "bun run --watch ./src/main.ts",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"pre-commit": "bunx lint-staged"
|
|
51
51
|
},
|
|
52
52
|
"lint-staged": {
|
|
53
|
-
"
|
|
53
|
+
"*.{ts,tsx,js,mjs,cjs}": "eslint --fix --fix-type layout --max-warnings=0 --no-warn-ignored"
|
|
54
54
|
},
|
|
55
55
|
"overrides": {
|
|
56
56
|
"@typescript-eslint/eslint-plugin": "^8.56.0",
|
|
@@ -76,7 +76,6 @@
|
|
|
76
76
|
"@opentelemetry/sdk-logs": "^0.222.0",
|
|
77
77
|
"@opentelemetry/sdk-metrics": "^2.6.0",
|
|
78
78
|
"@opentelemetry/sdk-node": "^0.222.0",
|
|
79
|
-
"@opentelemetry/sdk-trace-base": "^2.6.0",
|
|
80
79
|
"@opentelemetry/semantic-conventions": "^1.40.0",
|
|
81
80
|
"ai-tokenizer": "^1.0.6",
|
|
82
81
|
"citty": "^0.2.2",
|