copilot-api-node20 0.30.3 → 0.31.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.
Files changed (2) hide show
  1. package/dist/main.mjs +1 -1
  2. package/package.json +1 -1
package/dist/main.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import i from"node:fs/promises";import a from"node:os";import s from"node:path";import{SpanKind as l,SpanStatusCode as c,context as u,metrics as p,trace as d}from"@opentelemetry/api";import m from"clipboardy";import{execFile as f,execSync as h}from"node:child_process";import g from"node:process";import{SeverityNumber as _,logs as y}from"@opentelemetry/api-logs";import{OTLPLogExporter as k}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as w}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as b}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as $}from"@opentelemetry/sdk-metrics";import{NodeSDK as T}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as A,ATTR_SERVICE_NAME as S,ATTR_SERVICE_VERSION as C}from"@opentelemetry/semantic-conventions";import{Client as E,request as O}from"undici";import{createHash as I,randomBytes as P,randomUUID as N}from"node:crypto";import{promisify as R}from"node:util";import{accessSync as q}from"node:fs";import{serve as j}from"srvx";import{isIP as D}from"node:net";import{generate as H}from"selfsigned";import{Hono as M}from"hono";import{cors as B}from"hono/cors";import{streamSSE as F}from"hono/streaming";import{events as U}from"fetch-event-stream";import{Tokenizer as L,models as z}from"ai-tokenizer";import*as G from"ai-tokenizer/encoding/claude";const K=s.join(a.homedir(),".local","share","copilot-api"),J={APP_DIR:K,GITHUB_TOKEN_PATH:s.join(K,"github_token"),MACHINE_ID_PATH:s.join(K,"machine_id"),SESSION_ID_PATH:s.join(K,"session_id")};async function W(){await i.mkdir(J.APP_DIR,{recursive:!0}),await V(J.GITHUB_TOKEN_PATH),await V(J.SESSION_ID_PATH)}async function V(e){try{await i.access(e,i.constants.W_OK)}catch{await i.writeFile(e,""),await i.chmod(e,384)}}const X=6e5,Y={accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:X,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}},Z=e=>e>=1e5||e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString(),Q=(e,t)=>e.padEnd(t),ee=e=>{let t=[];if(e.model){let o=Q(e.model,18);t.push(o)}if(e.tokenUsage){let o=e.tokenUsage,n=(o.inputTokens||0)+(o.outputTokens||0),r=e.model?((e,t)=>{if(!Y.models)return"";let o=Y.models.data.find(e=>e.id===t);if(!o)return"";let n=o.capabilities.limits?.max_context_window_tokens;return n?` (${(e/n*100).toFixed(1)}%)`:""})(n,e.model):"",i=Q(`↑${Z(o.inputTokens||0).padStart(5)} │ ↓${Z(o.outputTokens||0).padStart(5)}`,18),a=Z(n),s=r?`${a}${r.padStart(15-a.length)}`:a.padEnd(15);t.push(`Tokens: ${i} | Context: ${s}`)}else if(e.model){let e=Q("N/A",18),o="N/A".padEnd(15);t.push(`Tokens: ${e} | Context: ${o}`)}if(e._d1){let o=Q(`${Math.round(e._d1)}ms`,8);t.push(`API: ${o}`)}return t.length>0?` | ${t.join(" | ")}`:""},te={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),i=t.get("requestData"),a=` --\x3e ${Q(t.req.method,4)}${Q(t.req.path,21)}${Q(t.res.status.toString(),3)} ${Q(`${r}ms`,8)}`;i&&(a+=ee(i)),o.info(a),Me(_.INFO,"INFO","Request completed",{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":r,...i?.model&&{"copilot_api.model":i.model},...i?._d1&&{"copilot_api.copilot_duration_ms":Math.round(i._d1)},...i?.tokenUsage?.inputTokens&&{"copilot_api.input_tokens":i.tokenUsage.inputTokens},...i?.tokenUsage?.outputTokens&&{"copilot_api.output_tokens":i.tokenUsage.outputTokens}},t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,i=Math.round(performance.now()-r),a=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=`⚠ --\x3e ${Q(n.req.method,4)}${Q(n.req.path,21)}${Q("429",3)} ${Q(`${i}ms`,8)}`;l+=` | Rate limited (${s}s retry) | ${a}`;let c=n.get("requestData");if(c?._d1){l+=` | API: ${Q(`${Math.round(c._d1)}ms`,8)}`}o.info(l)},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(()=>te.cleanup(),6e4);let oe,ne,re=Date.now();const ie={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function ae(){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):ie;return{endpoint:e.replace(/\/$/,""),headers:t}}const se=d.getTracer("copilot-api"),le=p.getMeter("copilot-api"),ce=y.getLogger("copilot-api"),ue=le.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),pe=le.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),de=le.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),me=le.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),fe=le.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),he=le.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),ge=le.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),_e=le.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),ye=le.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),ke=le.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),we=le.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),be=le.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),ve=le.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),xe=le.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),$e=le.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Te=le.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Ae=le.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Se=le.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Ce=le.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Ee=le.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Oe=le.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Ie=le.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Pe=le.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Ne=le.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Re=le.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),qe=le.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),je=le.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),De=le.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),He=le.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function Me(e,t,o,n,r){let i=d.getActiveSpan()?.spanContext()??r;ce.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...i&&{"trace.id":i.traceId,"span.id":i.spanId}}})}function Be(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 Fe(e,t,o){Be(e,o),t&&t!==e&&Be(t,o)}function Ue(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,Ue(r,e)))}return o}le.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!Je.getConnectivityStats().isOnline)}),le.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(Je.getConnectivityStats().consecutiveFailures)}),le.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(Y.models?.data.length??0)}),le.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(te.completionCallbacks.size)}),le.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-re)/1e3)});const Le=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();Le.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function Ge(e){let{spanName:t,url:o,target:n,method:r="GET",headers:i,body:a,signal:s,extraAttributes:u}=e,p=se.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});i&&ze(p,"request",i);try{let e=await fetch(o,{method:r,headers:i,body:a,signal:s});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();Le.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),ve.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 Be(p,e),p.end(),e}}async function Ke(e){let{spanName:t,url:o,target:n,method:r="POST",headers:i,body:a,signal:s,headersTimeout:u,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=se.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",i);try{let{statusCode:e,headers:t,body:l}=await O(o,{method:r,headers:i,body:a,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&&!Le.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return ve.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 Be(f,e),f.end(),e}}const Je=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:Y.connectivity.probeEndpoints,fastInterval:Y.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?Y.connectivity.slowProbeInterval:Y.connectivity.fastProbeInterval)+Math.random()*Y.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=se.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),Y.connectivity.timeoutMs);try{let n=!1;for(let e of Y.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",...Y.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Re.record(r,{endpoint:e,result:"success"});break}Re.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),we.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")),be.add(1,{from:"offline",to:"online"}),Me(_.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")),be.add(1,{from:"online",to:"offline"}),Me(_.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?Y.connectivity.slowProbeInterval:Y.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*Y.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:Y.connectivity.jitterMaxMs>0,connectionPooling:Y.connectivity.connectionPooling,dnsCache:Y.connectivity.dnsCache}}},We=()=>({"content-type":"application/json",accept:"application/json"}),Ve="0.48.1",Xe=`copilot-chat/${Ve}`,Ye=`GitHubCopilotChat/${Ve}`,Ze=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`${J.MACHINE_ID_PATH}_${t}`})(e);try{let e=await i.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(a.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await i.writeFile(t,o),await i.chmod(t,384),o},Qe=async(e,t)=>{e.machineId||=await Ze(t),e.sessionId||=await(async()=>{try{let e=await i.readFile(J.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=N();return await i.writeFile(J.SESSION_ID_PATH,e),await i.chmod(J.SESSION_ID_PATH,384),e})()},et=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,tt=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=N(),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":Xe,"User-Agent":Ye,"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":N(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},ot=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const nt=(e,t,o)=>{let n=tt(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,i=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&ot.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta):void 0;if(i)for(let e of i.split(","))r.add(e);if(o)for(let e of o)r.add(e);return r.size>0&&(n["anthropic-beta"]=[...r].join(",")),n},rt="https://api.github.com",it=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":Xe,"user-agent":Ye,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),at="https://github.com",st="01ab8ac9400c4e429b23",lt=["user:email"].join(" ");function ct(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 ut=32768,pt=[{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_***"}],dt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);const mt=new Map;function ft(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=e.model??"unknown";return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function ht(e,t,o){let n=function(e){let t=e;for(let{regex:e,mask:o}of pt)t=t.replace(e,o);return t}(o),r=8*ut,i=n.length>r,a=i?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(a.length<=ut)e.setAttribute(t,a),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<a.length;o+=ut)e.setAttribute(`${t}.part_${o/ut}`,a.slice(o,o+ut));e.setAttribute(`${t}.parts`,Math.ceil(a.length/ut))}e.setAttribute(`${t}.bytes`,n.length),e.setAttribute(`${t}.sha256`,s),i&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,n.length-a.length))}function gt(e,t){let o=function(e){if(mt.size>=1e3&&!mt.has(e)){let e=mt.keys().next().value;void 0!==e&&mt.delete(e)}let t,o=(mt.get(e)??0)+1;return mt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Se.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&&ht(e,"copilot_api.incoming_request_body",n);let r=_t(t.c.req.header());return r&&ht(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&ht(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&ht(e,"copilot_api.outgoing_headers",_t(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&ht(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function _t(e){let t={};for(let[o,n]of Object.entries(e))dt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}var yt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}};function kt(e){return e.req.path.startsWith("/v1/messages")}function wt(e,t){if(kt(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}function bt(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type&&(o.type=t.type),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function vt(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 xt(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 $t(e){let{c:t,error:o,errorText:n,upstream:r}=e,i=d.getActiveSpan();if(!i)return;let a=ft({endpointType:ct(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});gt(i,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:a})}async function Tt(e,t){if(t instanceof yt&&429===t.response.status)return async function(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=te.completionCallbacks.get(n);r&&(te.logRateLimit(r,t.response),te.completionCallbacks.delete(n)),he.add(1,{action:"rejected",source:"upstream"});let i=await t.response.text(),a=wt(i,e),s=bt(a);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),vt(o,s),Me(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...xt(s)}),$t({c:e,error:t,errorText:i,upstream:s}),e.json(a,429)}(e,t);if(t instanceof SyntaxError){d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),Me(_.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=kt(e)?{type:"error",error:{type:"invalid_request_error",message:"Invalid JSON in request body"}}:{error:{message:"Invalid JSON in request body",type:"invalid_request_error"}};return e.json(o,400)}if(o.error("Error occurred:",t),t instanceof yt)return async function(e,t){let n=d.getActiveSpan(),r=await t.response.text(),i=wt(r,e),a=bt(i);return o.error("HTTP error:",i),n?.setStatus({code:c.ERROR,message:t.message}),n?.recordException(t),n?.setAttribute("copilot_api.error_type","HTTPError"),vt(n,a),Me(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...xt(a)}),$t({c:e,error:t,errorText:r,upstream:a}),e.json(i,t.response.status)}(e,t);let n=d.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:c.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),Me(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name});let i=kt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(i,500)}const At=async()=>{let e=`${rt}/copilot_internal/v2/token`,t=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ge({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:it(Y),signal:o.signal});try{if(!t.ok)throw new yt("Failed to get Service token",t);return await t.json()}catch(e){throw Be(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function St(){let e=`${rt}/user`,t=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ge({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${Y._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new yt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Be(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let Ct=null;function Et(){return Ct||=At().then(({token:e})=>{Y._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{Ct=null}),Ct}const Ot=async()=>{let e=`${et(Y)}/models`,t=tt(Y),o=Y.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),o);try{let{response:o,span:r}=await Ge({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new yt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Be(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const It=e=>new Promise(t=>{setTimeout(t,e)}),Pt=e=>null==e;async function Nt(){Y.models=await(async()=>{try{return await Ot()}catch(e){if(e instanceof yt&&401===e.response.status)return await Et(),Ot();throw e}})()}var Rt=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let qt,jt,Dt,Ht,Mt=!1;function Bt(e){let{span:t,error:n,reason:r,refreshStart:i,attempt:a}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";Y._t1=void 0,clearInterval(qt),qt=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),ye.add(1,{reason:r,success:"false"}),ke.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),Ne.record(performance.now()-i,{reason:r}),Me(_.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":a,"copilot_api.token_refresh.terminal_status":s})}function Ft(e){let{span:t,error:n,reason:r,refreshStart:i,maxRetries:a}=e;Y._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),ke.add(1,{reason:r}),Ne.record(performance.now()-i,{reason:r}),Me(_.ERROR,"ERROR",`Token refresh failed after ${a} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":a})}const Ut=async(e=5,t=1e3,n="scheduled")=>Mt?(o.debug("Token refresh already in progress, coalescing"),jt):(Mt=!0,jt=se.startActiveSpan("copilot_api.token.refresh",async r=>{let i=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let a=1;a<=e;a++)try{r.setAttribute("copilot_api.token_refresh.attempt",a),o.debug(`Refreshing Service token (${n}, attempt ${a}/${e})`);let{token:t}=await At();return Y._t1=t,o.debug("Service token refreshed successfully"),Y.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),ye.add(1,{reason:n,success:"true"}),Ne.record(performance.now()-i,{reason:n}),void Me(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":a})}catch(s){if(s instanceof yt&&(401===s.response.status||403===s.response.status))return void Bt({span:r,error:s,reason:n,refreshStart:i,attempt:a});let l=a===e;if(o.error(`Failed to refresh Service token (attempt ${a}/${e}):`,s),ye.add(1,{reason:n,success:"false"}),l)return void Ft({span:r,error:s,reason:n,refreshStart:i,maxRetries:e});let c=t*2**(a-1);o.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),Mt=!1,jt=void 0}}),jt);async function Lt(e){try{let t=await i.readFile(J.GITHUB_TOKEN_PATH,"utf8");if(t&&!e?.force)return Y._t2=t,Y.showToken&&o.info("Auth token:",t),void await zt();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=Y.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${at}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:st,scope:lt}),signal:e.signal});if(!t.ok)throw new yt("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 Rt("Authorization timed out — the code expired. Please run the command again.");let i=new AbortController,a=Y.timeoutMs,s=setTimeout(()=>{i.abort()},a);try{let n=await fetch(`${at}/login/oauth/access_token`,{method:"POST",headers:We(),body:JSON.stringify({client_id:st,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:i.signal});if(!n.ok){await It(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 Rt("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Rt("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 It(t);continue}if(r.access_token)return r.access_token;await It(t)}catch(e){if(e instanceof Rt)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await It(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>i.writeFile(J.GITHUB_TOKEN_PATH,e,{mode:384}))(r),Y._t2=r,Y.showToken&&o.info("Auth token:",r),await zt()}catch(e){throw e instanceof yt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function zt(){let e=await St();o.success(`Authenticated as ${e.login}`)}async function Gt(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),Y.showToken=e.showToken,await W(),await Lt({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 Kt=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})=>Gt({verbose:e.verbose,showToken:e["show-token"]})}),Jt=async()=>{let e=`${rt}/copilot_internal/user`,t=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ge({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:it(Y),signal:o.signal});try{if(!t.ok)throw new yt("Failed to get usage",t);return await t.json()}catch(e){throw Be(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Wt=e({meta:{name:"check-usage",description:"Show current usage/quota information"},async run(){await W(),await Lt();try{let e=await Jt(),t=e.quota_snapshots.premium_interactions,n=t.entitlement,r=n-t.remaining,i=n>0?r/n*100:0,a=t.percent_remaining;function s(e,t){if(!t)return`${e}: N/A`;let o=t.entitlement,n=o-t.remaining,r=o>0?n/o*100:0,i=t.percent_remaining;return`${e}: ${n}/${o} used (${r.toFixed(1)}% used, ${i.toFixed(1)}% remaining)`}let l=`Premium: ${r}/${n} used (${i.toFixed(1)}% used, ${a.toFixed(1)}% remaining)`,c=s("Chat",e.quota_snapshots.chat),u=s("Completions",e.quota_snapshots.completions);o.box(`Usage (plan: ${e.copilot_plan})\nQuota resets: ${e.quota_reset_date}\n\nQuotas:\n ${l}\n ${c}\n ${u}`)}catch(p){o.error("Failed to fetch usage:",p),process.exit(1)}}}),Vt=R(f);async function Xt(){let e="win32"===g.platform?"where.exe":"which";try{return await Vt(e,["tailscale"]),!0}catch{return!1}}async function Yt(){try{let{stdout:e}=await Vt("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Zt(e){return e.replace(/\.$/,"")}async function Qt(){let e=await Yt();if(e?.Online)return Zt(e.DNSName)}const eo=R(f),to=e=>`${e}`,oo=e=>`${e}`,no=e=>`${e}`,ro=e=>`${e}`,io=e=>`${e}`,ao=e=>`${e}`,so=oo(" ─────────────────────────────────────────────────────────────"),lo=s.join(J.APP_DIR,"certs","tailscale"),co=s.join(lo,"cert.pem"),uo=s.join(lo,"key.pem"),po={certDir:lo,certPath:co,keyPath:uo};function mo(){switch(g.platform){case"darwin":return[` ${oo("Install Tailscale for macOS:")}`,` ${no("https://tailscale.com/download/mac")}`,` ${oo("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${oo("After installing, open the Tailscale app and sign in.")}`,` ${oo("Then re-run this command.")}`].join("\n");case"linux":return[` ${oo("Install Tailscale for Linux:")}`,` ${no("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${no("sudo tailscale up")}`,` ${oo("or")} ${no("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${oo("Install Tailscale for Windows:")}`,` ${no("https://tailscale.com/download/windows")}`,"",` ${oo("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${oo("Install Tailscale:")} ${no("https://tailscale.com/download")}`}}function fo(){let e=[` ${io("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${oo("Open the Tailscale app from Applications and sign in.")}`,` ${oo("Download:")} ${no("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${oo("Open the Tailscale app and sign in.")}`,` ${oo("Download:")} ${no("https://tailscale.com/download/windows")}`):e.push(` ${oo("Connect with:")} ${no("sudo tailscale up")}`),e.push("",` ${oo("Then re-run this command.")}`),e.join("\n")}async function ho(){try{return await i.access(co),await i.access(uo),!0}catch{return!1}}function go(e){console.log(""),console.log(so),console.log(` ${to("Claude Cowork Setup")} ${oo("— Diagnostic")}`),console.log(so),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?ro("✅"):"missing"===n.status?io("❌"):ao("❓");let r=n.detail?oo(` ${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(` ${ro("All checks passed.")}`):console.log(` ${io(`${t.length} issue(s).`)} Run ${no("copilot-api cowork-setup install")} to fix.`),console.log("")}const _o={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},yo=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Xt();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return go(e),console.log(""),console.log(mo()),void console.log("");let o=await Yt();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},go(e),console.log(fo()),void console.log("");let n=Zt(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await ho();e["tailscale-cert"]=r?{status:"ok",detail:co}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),go(e)}(),g.exit(0)}}),install:e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:_o},async run({args:e}){await async function(e){if(console.log(""),console.log(so),console.log(` ${to("Claude Cowork Setup")} ${oo("— Install")}`),console.log(so),console.log(""),!await Xt())return console.log(` ${io("Tailscale is not installed.")}`),console.log(""),console.log(mo()),console.log(""),console.log(` ${oo("After installing, run")} ${no("tailscale up")} ${oo("to connect, then re-run this command.")}`),void console.log("");let t=await Yt();if(!t||!t.Online)return console.log(fo()),void console.log("");let n=Zt(t.DNSName);if(console.log(` ${oo("Tailscale hostname:")} ${to(n)}`),console.log(""),console.log(` ${to("Generating TLS certificate via Tailscale…")}`),console.log(` ${oo("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${no(`$ tailscale cert --cert-file ${co} --key-file ${uo} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await i.mkdir(lo,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await eo("tailscale",["cert","--cert-file",co,"--key-file",uo,n]),console.log(` ${ro("✓ 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(so),console.log(` ${to("Next steps")}`),console.log(so),console.log(""),console.log(` ${to("1.")} Start the proxy:`),console.log(` ${no("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${to("2.")} In Cowork ${oo("→")} Settings ${oo("→")} Inference Provider, set:`),console.log(` ${to("inferenceGatewayBaseUrl")} = ${no(`https://${n}:<port>`)}`),console.log(` ${oo("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${to("3.")} Restart Cowork ${oo("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${oo("For Cowork's own configuration docs, see:")}`),console.log(` ${no("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),revert:e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:_o},async run({args:e}){await async function(e){if(console.log(""),console.log(so),console.log(` ${to("Claude Cowork Setup")} ${oo("— Revert")}`),console.log(so),console.log(""),!await ho())return console.log(` ${oo("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${to("Remove Tailscale cert files:")}`),console.log(` ${oo(co)}`),console.log(` ${oo(uo)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await i.rm(lo,{recursive:!0}),console.log(` ${ro("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${oo("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}})}});async function ko(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await i.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function wo(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:a.platform(),arch:a.arch()}}async function bo(){try{return!!(await i.stat(J.GITHUB_TOKEN_PATH)).isFile()&&(await i.readFile(J.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function vo(e){let t=await async function(){let[e,t]=await Promise.all([ko(),bo()]);return{version:e,runtime:wo(),paths:{APP_DIR:J.APP_DIR,GITHUB_TOKEN_PATH:J.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 xo=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})=>vo({json:e.json})}),$o="copilot-api-node20",To=`https://registry.npmjs.org/${$o}/latest`,Ao=e=>`${e}`,So=e=>`${e}`;async function Co(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(To,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Eo(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}const Oo=new Map,Io=new Map,Po=new Set;let No,Ro,qo;function jo(e){return!e.closed&&!e.destroyed}function Do(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new E(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return Oo.set(t,Date.now()),Ae.add(1,{event:"created",origin:e}),Me(_.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,i)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,i.message);let a=Po.has(t);Ae.add(1,{event:"goaway",origin:e}),Me(a?_.WARN:_.DEBUG,a?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${i.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":i.message}),Io.delete(t),Po.delete(t),Oo.delete(t),jo(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Ho(e){if(!Y.connectivity.h2)return;No&&No!==e&&function(){for(let e of[...Io.keys(),...Po])jo(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Io.clear(),Po.clear(),Oo.clear()}(),No=e;let t=Date.now();for(let[n]of Io)if(t-(Oo.get(n)??0)>=6e5)Io.delete(n),Oo.delete(n),jo(n)&&n.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ae.add(1,{event:"rotated",origin:e}),Me(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(jo(n))return Io.delete(n),Po.add(n),n;Io.delete(n),Oo.delete(n)}let n=Do(e);return Po.add(n),n}function Mo(e){e&&Po.delete(e)&&(jo(e)?Io.set(e,Date.now()):Oo.delete(e))}function Bo(){qo||(qo=setInterval(()=>{!function(){let e=Date.now(),t=Y.connectivity.h2Keepalive,n=Io.size;for(let[r,i]of Io)e-i<6e4||t&&n<=1||(Io.delete(r),Oo.delete(r),n--,jo(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ae.add(1,{event:"idle_reaped",origin:No??""}),Me(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${No}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":No??""}))}()},3e4),qo.unref())}function Fo(){Ro||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Ro=setInterval(()=>{(async function(){if(0===Io.size&&0===Po.size){if(No){let e=Do(No);Io.set(e,Date.now())}return}let e=[...Io.keys()];for(let t of e)Io.delete(t);await Promise.allSettled(e.map(async e=>{if(jo(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:tt(Y)});await n.dump(),Te.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Io.set(e,Date.now())}catch(t){Te.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ae.add(1,{event:"error",origin:No??""}),Oo.delete(e),jo(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Oo.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Ro.unref(),Bo())}function Uo(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 Lo=e=>`${e}`,zo=e=>`${e}`,Go=e=>`${e}`,Ko=e=>`${e}`,Jo=e=>`${e}`,Wo=e=>`${e}`,Vo=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Xo="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Yo="https://github.com/johnib/copilot-api-issues/issues",Zo=zo(" ─────────────────────────────────────────────────────────────");function Qo(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}const en=[{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"},{title:"We Were About to Buy an Automation Platform. We Already Had One.",teaser:"Governance spirals over n8n. The answer was already deployed.",url:"https://barazany.dev/blog/we-already-had-the-automation-platform"}];function tn(e){if(0===e.length)return[];let t=["",Zo,` ${Lo("BARAZANY.DEV")} ${zo("— Recent Posts")}`,Zo,""];for(let[o,n]of e.entries()){let e=Vo(`${n.url}${Xo}`,Lo(Wo(`[${o+1}]`)));t.push(` ${e} ${Go(n.title)}`,` ${zo("→")} ${zo(n.teaser)}`,"")}return t.push(Zo,` ${Vo(`https://barazany.dev/blog${Xo}`,"barazany.dev/blog")}`,Zo),t}function on(e){let t=[];Y.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):Y.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearch?`Tavily ${Ko("✓")}`:zo("off"),n=["",` ${Lo("COPILOT-API")} ${zo(`v${e.version}`)}`,Zo,` ${zo("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${zo("User")} ${e.user} ${zo("·")} ${e.accountType}`];return Y._v1&&n.push(` ${zo("Client")} VSCode ${Y._v1}`),n.push(` ${zo("Network")} ${t.join(zo(" · "))}`,` ${zo("Search")} ${o}`),e.clipboardCopied&&n.push(` ${zo("Clipboard")} Claude Code command ${Ko("✓")}`),n.push(Zo),n}function nn(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Lo("Active")}`];if(e.model){let o=Y.models?.data.find(t=>t.id===e.model),n=Qo(o?.capabilities.limits?.max_context_window_tokens);t.push(` ${Go(e.model.padEnd(32))} ${zo("ctx")} ${Lo(n.padStart(5))} ${Jo("← main")}`)}if(e.smallModel){let o=Y.models?.data.find(t=>t.id===e.smallModel),n=Qo(o?.capabilities.limits?.max_context_window_tokens);t.push(` ${e.smallModel.padEnd(32)} ${zo("ctx")} ${n.padStart(5)} ${Jo("← small")}`)}return t}function rn(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of Y.models?.data??[]){let i=r.capabilities.limits?.max_context_window_tokens,a={id:r.id,ctx:i};r.id.startsWith("text-embedding")?n.push(a):"Anthropic"===r.vendor?e.push(a):"Google"===r.vendor?o.push(a):t.push(a)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${Lo(o)}`);for(let o of n){let n=o.id===e.model||o.id===e.smallModel,r=n?Go("●"):zo("·"),i=n?Go(o.id.padEnd(34)):o.id.padEnd(34),a=o.ctx?Qo(o.ctx).padStart(5):"";t.push(` ${r} ${i} ${zo(a)}`)}}return t}function an(){let e=Yo.replace(/^https:\/\//,""),t=Vo(`${Yo}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Zo,` ${Lo("FOUND A BUG?")} ${zo("— Report it on GitHub")}`,Zo,"",` ${Go("→")} ${Go(t)}`,` ${zo("Bug reports, feature requests, and questions welcome.")}`,"",Zo]}function sn(e){if(!e.endpoints)return[];let{scheme:t,port:o,hostname:n}=e.endpoints,r=n?`${t}://${n}:${o}`:`${t}://<your-tailscale-hostname>:${o}`,i=["",Zo,` ${Lo("Claude Cowork")} ${zo("— Settings → Inference Provider")}`,Zo,"",` ${zo("Paste into")} ${Lo("inferenceGatewayBaseUrl")}${zo(":")}`,` ${Lo(Go(r))}`];return n||i.push("",` ${zo("Your Tailscale hostname is shown by:")} ${Go("tailscale status --self")}`),i.push("",` ${zo("Docs:")} ${Go("https://claude.com/docs/cowork/3p/installation")}`),i}function ln(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Zo,` ${Lo("HTTPS")} ${zo("— self-signed cert")}`,Zo,"",` ${zo("Cert")} ${t}`];switch(o.push("",` ${Lo("Trust this cert")} ${zo("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${zo("macOS:")}`,` ${Go("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Go(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${zo("Windows (PowerShell as Administrator):")}`,` ${Go(`Import-Certificate -FilePath "${t}" \``)}`,` ${Go("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${zo("Linux (Debian/Ubuntu):")}`,` ${Go(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Go("sudo update-ca-certificates")}`,` ${zo("Linux (Fedora/RHEL/Arch):")}`,` ${Go(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Go("sudo update-ca-trust")}`);break;default:o.push(` ${zo("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${zo("Or, for Node CLIs only (no admin needed):")}`,` ${Go(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Zo),o}function cn(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 un=s.join(J.APP_DIR,"certs"),pn=s.join(un,"cert.pem"),dn=s.join(un,"key.pem"),mn=s.join(un,"cert.meta.json");async function fn(e){try{return await i.readFile(e,"utf8")}catch{return}}async function hn(e){let t=await fn(pn),o=await fn(dn),n=await async function(){let e=await fn(mn);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 i=Date.parse(n.notAfter);return!Number.isNaN(i)&&i-Date.now()>2592e6}function gn(e){return 0!==D(e)}async function _n(e){await i.mkdir(un,{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"]),a=new Set(n);for(let t of e)gn(t)?a.add(t):r.add(t);let s=await H([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:o,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:[...[...r].map(e=>({type:2,value:e})),...[...a].map(e=>({type:7,ip:e}))]}]});return await i.writeFile(pn,s.cert,{mode:420}),await i.writeFile(dn,s.private,{mode:384}),await async function(e){await i.writeFile(mn,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...a].sort(),notAfter:o.toISOString()}),{cert:s.cert,key:s.private,certPath:pn,keyPath:dn,generated:!0}}function yn(e){try{!function(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),i=t.res.status,a=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",i),n.setAttribute("copilot_api.model",a),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens),e.estimatedCost&&n.setAttribute("copilot_api.estimated_cost",e.estimatedCost)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();Le.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),i>=400&&n.setStatus({code:c.ERROR,message:`HTTP ${i}`})}(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:i,requestId:a}=e,s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:i};if(ue.add(1,d),Ce.record(s,d),c>=400&&pe.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:i};e.inputTokens&&(de.add(e.inputTokens,t),qe.record(e.inputTokens,t)),e.outputTokens&&(me.add(e.outputTokens,t),je.record(e.outputTokens,t)),e.cachedTokens&&fe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&te.executeCompletion(a)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const kn=1048576;const wn=async()=>se.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),He.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),$e.add(1,{result:"rejected"}),new yt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),$e.add(1,{result:"approved"})}finally{e.end()}}),bn=3e-6,vn=15e-6;function xn(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,estimatedCost:t*bn+o*vn,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function $n(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 Tn=[{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"}],An="claude-haiku-4.5",Sn={haiku:An,"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 Cn(e,t){let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.includes(e))return e}let i=function(e){for(let t of Tn)if(t.pattern.test(e))return t.family;return null}(n);if(!i)return null;let a=n.replace(/-\d{8}(?::.*)?$/,""),s=r?`-${r}`:"";for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,""),o=`${a}${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=Sn[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}(i,t,r)}const En=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function On(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=En.get(o);if(void 0===n)return t[0]??null;let r=null,i=1/0;for(let e of t){let t=En.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<i&&(i=o,r=e)}return r}var In=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Pn(e){if(!e||"string"!=typeof e)throw new In("Model name is required and must be a string");if(!Y.models?.data)throw new In("Models not available. Please try again later.",503);let t=Y.models.data.map(e=>e.id);if(t.includes(e))return e;let o=Cn(e,t);if(!o)throw ge.add(1,{requested_model:e}),new In(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}async function Nn(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return se.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 i=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute("copilot_api.rate_limit.elapsed_seconds",i),i>t)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let a=Math.ceil(t-i);if(n.setAttribute("copilot_api.rate_limit.wait_seconds",a),!e.rateLimitWait)throw n.setAttribute("copilot_api.rate_limit.action","rejected"),he.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new yt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*a;n.setAttribute("copilot_api.rate_limit.action","waited"),he.add(1,{action:"waited",source:"local"}),Ie.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await It(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function Rn(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 jn(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 jn(JSON.parse(r),t+1)}catch{return null}}function Dn(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Rn(o.capabilities.supports.min_thinking_budget),r=Rn(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Rn(o.capabilities.limits?.max_output_tokens)??void 0}}function Hn(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=qn(Rn(e.requestedBudget)??o,o,n),i=Rn(e.maxTokens);if(i||=r+1,t.maxOutputTokens&&i>t.maxOutputTokens&&(i=t.maxOutputTokens),i<=r){let e=Math.min(r,i-1);if(e>=o)r=e;else{let e=o+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:i};i=e,r=o}}return i<=r?{thinkingBudget:null,maxTokens:i}:{thinkingBudget:r,maxTokens:i}}function Mn(e,t){if(Pt(e.thinking_budget))return e;let o=Dn(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Hn({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 Bn(e){return"invalid_thinking_budget"===jn(e)}async function Fn(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(Pt(t.thinking_budget)||!(o instanceof Error))return null;let i,a,s=o;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==r)i=r;else try{i=await s.response.clone().text()}catch{return null}try{a=JSON.parse(i)}catch{return null}if(!Bn(a))return null;let l=Dn(n,t.model);return l?function(e,t){let o=Hn({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=Rn(e.thinking_budget);if(r&&r===o.thinkingBudget){let e=n+1;e<=t.bounds.max&&(!o.maxTokens||e<o.maxTokens)&&(n=e)}let i=o.maxTokens;if((!i||i<=n)&&(i=n+1),t.maxOutputTokens&&i>t.maxOutputTokens){if(!(t.maxOutputTokens>n))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};i=t.maxOutputTokens}return{...e,max_tokens:i,thinking_budget:n}}(t,l):{...t,thinking_budget:void 0}}function Un(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)}async function Ln(){return new Promise(e=>setTimeout(e,100))}function zn(e){if("string"==typeof e)return function(e){let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],i=r.match(/^\[[0-9;]*[a-z]/i);t+=i?r.slice(i[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}(e);if(Array.isArray(e))return e.map(e=>zn(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?zn(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}async function Gn(e,t,o){try{if(!e.ok)throw new yt("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&&$n(t,n.usage),n}catch(e){throw Be(t,e),e}finally{t.end()}}const Kn=async e=>{let t=zn(e);try{return await Jn(t)}catch(e){if(e instanceof yt&&401===e.response.status)return await Et(),Jn(t);let n;if(e instanceof yt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Fn({payload:t,error:e,models:Y.models,errorBodyText:n});if(r)return e instanceof yt&&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 Jn(zn(r));throw e}},Jn=async e=>{if(!Y._t1)throw Error("Service token not found");let t=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),n=e.messages.some(e=>["assistant","tool"].includes(e.role)),r={...tt(Y,t),"X-Initiator":n?"agent":"user"},i=et(Y),a=`${i}/chat/completions`,s=Y.timeoutMs,l=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t))return{...e};let{max_tokens:o,...n}=e;return null==o?{...n}:{...n,max_completion_tokens:o}}(e,Y.models),c=JSON.stringify(l),u={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":s,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":e.max_tokens??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":n?"agent":"user"};for(let t=0;t<=1;t++){let n=Ho(i),l=new AbortController,p=setTimeout(()=>l.abort(),s);try{let{statusCode:o,headers:i,body:p,span:d}=await Ke({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:r,body:c,signal:l.signal,headersTimeout:s,bodyTimeout:3*s,extraAttributes:{...u,"copilot_api.h2.retry_attempt":t},dispatcher:n}),m=new Response(p,{status:o,headers:i});if(e.stream){if(!m.ok)throw d.end(),new yt("Failed to create chat completions",m,{outgoingBody:c,outgoingHeaders:r});return{events:U(m),span:d,release:()=>Mo(n)}}try{return await Gn(m,d,{outgoingBody:c,outgoingHeaders:r})}finally{Mo(n)}}catch(e){if(Mo(n),Un(e)&&t<1){o.warn(`HTTP/2 connection error during chat completions, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await Ln();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function Wn(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 Vn(e){await Nn(Y);let t=await e.req.json();o.debug("Request payload:",JSON.stringify(t).slice(-400));try{t=function(e){return se.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Pn(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()}})}(t)}catch(t){if(t instanceof In)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(e.set("requestData",{model:t.model,streaming:!!t.stream}),Y.manualApprove&&await wn(),Pt(t.max_tokens)){let e=Y.models?.data.find(e=>e.id===t.model);t={...t,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(t.max_tokens))}t=Mn(t,Y.models),Pt(t.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(t.thinking_budget));let n=performance.now(),r=await Kn(t),i=performance.now()-n;if(Ee.record(i,{model:t.model,target:"chat_completions",streaming:String(!!t.stream)}),Xn(r)){let t=e.get("requestData")||{};return r.usage&&(t.tokenUsage=xn(r.usage)),t._d1=i,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(r)),e.json(r)}let{events:a,span:s,release:l}=r;return F(e,async o=>{let n={value:null},r=0,c=performance.now();try{try{for await(let s of a){let a=s;s.data&&"[DONE]"!==s.data&&(r++,xe.add(1,{model:t.model,endpoint_type:"openai"}),a=Wn(s,t=>{n.value=t;let o=e.get("requestData")||{};o.tokenUsage=xn(t),o._d1=i,e.set("requestData",o)})),await o.writeSSE(a)}let s=performance.now()-c,l={model:t.model,endpoint_type:"openai"};if(Oe.record(s,l),De.record(r,l),n.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=xn(n.value),t._d1=i,e.set("requestData",t))}}catch(t){throw Fe(s,e.get("requestSpan"),t),t}finally{n.value&&$n(s,n.value),s.end(),l()}let u=e.get("requestId");u&&te.executeCompletion(u)}finally{e.get("resolveStreamComplete")?.()}})}const Xn=e=>Object.hasOwn(e,"choices"),Yn=new M;Yn.post("/",async e=>{try{return await Vn(e)}catch(t){return await Tt(e,t)}});const Zn=new M;Zn.post("/",async e=>{try{let t=await e.req.json();try{t.model=Pn(t.model)}catch(t){if(t instanceof In)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=performance.now(),n=await(async e=>{if(!Y._t1)throw Error("Service token not found");let t=`${et(Y)}/embeddings`,o=tt(Y),n=Y.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),n),a=JSON.stringify(e);try{let{response:n,span:i}=await Ge({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:a,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 yt("Failed to create embeddings",n,{outgoingBody:a,outgoingHeaders:o});return await n.json()}catch(e){throw Be(i,e),e}finally{i.end()}}finally{clearTimeout(i)}})(t),r=performance.now()-o;Ee.record(r,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=xn(n.usage),i._d1=r,e.set("requestData",i),e.json(n)}catch(t){return await Tt(e,t)}});const Qn=new M;let er=null,tr=null;Qn.get("/",async e=>{let t,o=function(){let e=Y._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=er;return t&&e-t.timestamp<3e4?{result:t.result}:tr||(tr=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${et(Y)}/models`,n=await fetch(t,{method:"GET",headers:tt(Y),signal:e.signal}),r=Math.round(performance.now()-o),i=n.ok?"reachable":"unreachable";return er={result:i,timestamp:Date.now()},{result:i,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return er={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),tr=null}})(),tr)}();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.30.3",timestamp:(new Date).toISOString()};void 0!==n.latencyMs&&(r.upstream_latency_ms=n.latencyMs);let i="ok"===t?200:503;return e.json(r,i)});const or=new L(G),nr={...z["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function rr(e){return or.encode(e).length}function ir(e){let t=0;for(let o of e)switch(o.type){case"text":t+=rr(o.text)*nr.contentMultiplier;break;case"tool_use":t+=rr(o.name+JSON.stringify(o.input))*nr.contentMultiplier;break;case"tool_result":o.content&&(t+=rr("string"==typeof o.content?o.content:JSON.stringify(o.content))*nr.contentMultiplier);break;case"thinking":t+=rr(o.thinking)*nr.contentMultiplier;break;case"image":t+=1600}return t}function ar(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?nr.perFirstProp:nr.perAdditionalProp,t+=rr(o),r.description&&(t+=nr.perPropDesc+rr(r.description)),r.enum&&Array.isArray(r.enum)){t+=nr.perEnum;for(let e of r.enum)t+=rr(String(e))}if("object"===r.type&&r.properties&&(t+=nr.perNestedObject,t+=ar(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=nr.perArrayOfObjects,t+=ar(e))}}return t}function sr(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 lr(e,t,o){let n=sr(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const cr=async(e,t,n)=>{try{return await pr(e,t)}catch(r){if(r instanceof yt&&401===r.response.status)return await Et(),pr(e,t);if(r instanceof yt&&400===r.response.status&&n?.onStructuredOutputFallback){let i;try{i=await r.response.clone().text()}catch{i=void 0}let a=n.onStructuredOutputFallback(e,i);if(a)return o.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${a.model}`),pr(a,t)}throw r}};function ur(e){return e.context_management?["context-management-2025-06-27"]:[]}const pr=async(e,t)=>{if(!Y._t1)throw Error("Service token not found");let{metadata:n,...r}=zn(e),i={...nt(Y,t,ur(r)),"X-Initiator":"agent"},a=et(Y),s=`${a}/v1/messages`,l=Y.timeoutMs,c=JSON.stringify(r),u=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",...sr(e,t?.anthropicBeta)}}(r,t,l);for(let e=0;e<=1;e++){let t=Ho(a),p=new AbortController,d=setTimeout(()=>p.abort(),l);try{let{statusCode:o,headers:n,body:a,span:d}=await Ke({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:i,body:c,signal:p.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(a,{status:o,headers:n});if(!m.ok)throw d.end(),new yt("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:i});if(r.stream)return{events:U(m),span:d,release:()=>Mo(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&&$n(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(),Mo(t)}}catch(n){if(Mo(t),Un(n)&&e<1){o.warn(`HTTP/2 connection error during anthropic messages, retrying (attempt ${e+1}): ${n instanceof Error?n.message:String(n)}`),await Ln();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function dr(e,t,o){try{if(!e.ok)throw new yt("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&&$n(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Be(t,e),e}finally{t.end()}}const mr=async e=>{try{return await fr(e)}catch(t){if(t instanceof yt&&401===t.response.status)return await Et(),fr(e);throw t}},fr=async e=>{if(!Y._t1)throw Error("Service token not found");let t=zn(e),n={...tt(Y),"X-Initiator":"agent"},r=et(Y),i=`${r}/responses`,a=Y.timeoutMs,s=JSON.stringify(t),l={"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 c=Ho(r),u=new AbortController,p=setTimeout(()=>u.abort(),a);try{let{statusCode:o,headers:r,body:p,span:d}=await Ke({spanName:"copilot POST /responses",url:i,target:"responses",headers:n,body:s,signal:u.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:c}),m=new Response(p,{status:o,headers:r});if(t.stream){if(!m.ok)throw d.end(),new yt("Failed to create responses",m,{outgoingBody:s,outgoingHeaders:n});return{events:U(m),span:d,release:()=>Mo(c)}}try{return await dr(m,d,{outgoingBody:s,outgoingHeaders:n})}finally{Mo(c)}}catch(t){if(Mo(c),Un(t)&&e<1){o.warn(`HTTP/2 connection error during responses, retrying (attempt ${e+1}): ${t instanceof Error?t.message:String(t)}`),await Ln();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},hr=new Set(["low","medium","high","max","xhigh"]);function gr(e,t,n){let r=t.includes(e.model)?e.model:Cn(e.model,t)??e.model,i=r===e.model?e:{...e,model:r},a=function(e,t,o={}){let n=Cn(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}(i.model,t,{context1m:n.context1m,effort:i.output_config?.effort}),s=i;if(a&&a!==i.model){o.debug(`Resolved model variant: ${i.model} → ${a}`);let e=d.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",i.model),e?.setAttribute("copilot_api.model.variant_resolved_to",a),s={...i,model:a}}return function(e){let t=e.output_config?.effort;if(!t)return e;let n=Y.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=On(t,n);if(!r||!hr.has(r))return e;let i=r;if(i===t)return e;o.debug(`Effort clamp: ${t} → ${i}`);let a=d.getActiveSpan();return a?.setAttribute("copilot_api.effort.requested",t),a?.setAttribute("copilot_api.effort.clamped_to",i),{...e,output_config:{...e.output_config,effort:i}}}(s)}function _r(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function yr(e,t){let o={model:e.model,messages:kr(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:$r(e.tools),tool_choice:Tr(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Dn(t,o.model);if(r){let i="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=Rn(t),i=r&&r>1?r-1:o.min;return qn(Math.min(n,i),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Mn({...o,thinking_budget:i},t)}}return o}function kr(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:wr(e)}]:[{role:"system",content:wr(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:xr(e.content)});n.length>0&&t.push({role:"user",content:xr(n)})}else t.push({role:"user",content:xr(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:vr(e.reasoning_text),reasoning_opaque:vr(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:xr(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),i=[...n.map(e=>e.text),...r.map(e=>e.thinking)].join("\n\n");return o.length>0?[{role:"assistant",content:i||null,...t,tool_calls:o.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:"assistant",content:xr(e.content),...t}]}(e));return[...o,...n]}function wr(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const br=32768;function vr(e){if("string"==typeof e)return e.length<=br?e:e.slice(0,br)}function xr(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 $r(e){if(e)return e.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Tr(e){if(e)switch(e.type){case"auto":return"auto";case"any":return"required";case"tool":return e.name?{type:"function",function:{name:e.name}}:void 0;case"none":return"none";default:return}}function Ar(e){return"string"==typeof e?[{type:"text",text:e}]:Array.isArray(e)?e.filter(e=>"text"===e.type).map(e=>({type:"text",text:e.text})):[]}function Sr(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Cr(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 Er=new Set(["low","medium","high","max","xhigh"]);function Or(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&&Er.has(e)?e:null)(On(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 Ir(e){return"string"!=typeof e&&Array.isArray(e)?e.map(e=>{let t=e;if(!t.cache_control||"object"!=typeof t.cache_control)return e;let o=t.cache_control;if("string"!=typeof o.type){let{cache_control:e,...o}=t;return o}let n={type:o.type};return void 0!==o.ttl&&(n.ttl=o.ttl),{...t,cache_control:n}}):e}const Pr=/[^\w-]/g;function Nr(e){return e.replaceAll(Pr,"_")}function Rr(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,...i}=e.output_config;if(0===Object.keys(i).length){let{output_config:t,...o}=e;return o}return{...e,output_config:i}}(e,t);return o=Or(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 i=(!1===e.stream?r.max_non_streaming_output_tokens:void 0)??r.max_output_tokens;if("number"!=typeof i||i<=0)return e;let a=Math.max(Math.min(o,i),16);return a===o?e:{...e,max_tokens:a}}(o,t),o={...o,system:Ir(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:Nr(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Nr(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function qr(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 jr(e){let t={model:e.model,input:Hr(e.messages),max_output_tokens:Math.max(e.max_tokens,16),stream:e.stream,temperature:e.temperature,top_p:e.top_p,store:!1,user:e.metadata?.user_id?.slice(0,64)},o=function(e){return e?function(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}("string"==typeof e?e:e.map(e=>e.text).join("\n\n")):null}(e.system);return o&&(t.instructions=o),e.tools?.length&&(t.tools=e.tools.map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(t.tool_choice=function(e){switch(e.type){case"auto":return"auto";case"any":return"required";case"none":return"none";case"tool":return e.name?{type:"function",name:e.name}:void 0;default:return}}(e.tool_choice)),"adaptive"===e.thinking?.type?t.reasoning={effort:Dr(e.output_config?.effort??"high")}:"enabled"===e.thinking?.type&&e.thinking.budget_tokens&&(t.reasoning=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens)),t}function Dr(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Hr(e){let t=[];for(let o of e)"user"===o.role?t.push(...Mr(o)):t.push(...Fr(o));return t}function Mr(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(Br(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)"text"===t.type?e.push({type:"input_text",text:t.text}):e.push({type:"input_image",image_url:`data:${t.source.media_type};base64,${t.source.data}`});t.push({type:"message",role:"user",content:e})}else{let e=n.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function Br(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 Fr(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),i=[...o.map(e=>e.text),...n.map(e=>e.thinking)].join("\n\n");i&&t.push({type:"message",role:"assistant",content:i});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 Ur(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 Lr(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function zr(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 Gr(e,t){let o=[];switch(e.type){case"response.created":zr(t,o,{responseId:e.response.id,model:e.response.model});break;case"response.in_progress":case"response.output_text.done":case"response.function_call_arguments.done":case"response.refusal.done":case"response.reasoning_summary_text.delta":case"response.reasoning_summary_text.done":default:break;case"response.output_item.added":if("function_call"===e.item.type){zr(t,o),Lr(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":zr(t,o),Lr(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":Lr(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":{Lr(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:Ur(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":{zr(t,o),Lr(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":zr(t,o),Lr(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":zr(t,o),Lr(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":zr(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 Kr(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 Jr(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Wr(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&&(Kr(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&&(Kr(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Jr(t,o)),r.content&&(Jr(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){Jr(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&&(Jr(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:_r(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 Vr=/structured_outputs|output_config\.format/i;function Xr(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Vr.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Rr({...e,model:An},o):null}var Yr=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};async function Zr(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 i=new AbortController,a=setTimeout(()=>i.abort(),15e3);try{let{response:t,span:a}=await Ge({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:i.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw o.error(`Tavily API error (${e.status}):`,t),Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return a.setAttribute("tavily.results_count",e.results.length),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw Be(a,e),e}finally{a.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Yr:e}finally{clearTimeout(a)}}function Qr(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function ei(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function ti(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return{maxResults:"number"==typeof t?.max_uses?t.max_uses:5,allowedDomains:t?.allowed_domains,blockedDomains:t?.blocked_domains}}(t);o.info(`Web search intercepted: "${n}"`);let i,a=[],s=!1;try{let e=Y.tavilyApiKey;if(!e)throw s=!0,i="unavailable",Error("No Tavily API key configured");a=(await Zr(e,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("Tavily search failed:",e),s=!0,i??="unavailable"}let l={query:n,results:a,model:t.model,searchFailed:s,errorCode:i};if(!t.stream)return e.set("requestData",{model:t.model,streaming:!1}),e.json(function(e){let{query:t,model:o}=e,n=`srvtoolu_${Qr()}`,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:ei(e)}];return{id:`msg_tavily_${Qr()}`,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_${Qr()}`,r=`msg_tavily_${Qr()}`,i=[];return i.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:ei(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"}),i}(l);return e.set("requestData",{model:t.model,streaming:!0}),F(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}async function oi(e){let t=await e.req.json();if(function(e){let t=e.tools;if(!t||1!==t.length)return!1;let o=t[0].type;return"string"==typeof o&&o.startsWith("web_search")}(t))return ti(e,t);await Nn(Y),o.debug("Anthropic request payload:",t),t=function(e,t){return gr(t,Y.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let r=function(e,t){return se.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),lr(n,t,e.req.header("anthropic-beta"));let r=Pn(t.model);n.setAttribute("copilot_api.model.normalized",r);let i=qr(t);return i?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:i}},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 In)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:t.message}},t.statusCode)};throw t}finally{n.end()}})}(e,t);if(!r.ok)return r.response;if(t=r.payload,!Y._t1&&!await async function(){return!!Y._t1||(await Ut(1,0,"on-demand"),!!Y._t1)}())return d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503);if(function(e){return/gpt-[\d.]+-codex/i.test(e)}(t.model))return async function(e,t){let r=performance.now(),i=se.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),jr(t)}finally{e.end()}});Pe.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",i),e.set("requestData",{model:i.model,streaming:!!i.stream}),Y.manualApprove&&await wn();let a=performance.now(),s=await mr(i),l=performance.now()-a;if(Ee.record(l,{model:i.model,target:"responses",streaming:String(!!i.stream)}),ii(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=xn({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens})),t._d1=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(),i=se.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:Ur(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 Pe.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(i)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return F(e,async t=>{let n=null,r=0,a=performance.now(),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let a of c){if(o.debug("Responses API raw stream event:",a),!a.data)continue;let c;try{c=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}r++,xe.add(1,{model:i.model,endpoint_type:"responses"});let u=ni(c);if(u){n=u;let t=e.get("requestData")||{};t.tokenUsage=xn(n),t._d1=l,e.set("requestData",t)}let p=Gr(c,s);for(let e of p)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let u=performance.now()-a,p={model:i.model,endpoint_type:"responses"};Oe.record(u,p),De.record(r,p)}catch(t){throw Fe(u,e.get("requestSpan"),t),t}finally{n&&$n(u,n),u.end(),p()}let d=e.get("requestId");d&&te.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t){let o=Rr(t,Y.models),n={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")};return e.set("requestData",{model:o.model,streaming:!!o.stream}),Y.manualApprove&&await wn(),se.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",o.model),t.setAttribute("copilot_api.streaming",!!o.stream),lr(t,o,n.anthropicBeta);try{let r=performance.now(),i=await cr(o,n,{onStructuredOutputFallback:(e,o)=>{let n=Xr(e,o,Y.models);return n&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",n.model)),n}}),a=performance.now()-r;if(Ee.record(a,{model:o.model,target:"anthropic_messages",streaming:String(!!o.stream)}),!o.stream){let o=i,n=o.usage;if(n){let t={input_tokens:n.input_tokens||0,output_tokens:n.output_tokens||0,cache_read_input_tokens:n.cache_read_input_tokens||0,cache_creation_input_tokens:n.cache_creation_input_tokens||0},o=e.get("requestData")||{};o.tokenUsage=xn(ai(t)),o._d1=a,e.set("requestData",o)}return t.end(),e.json(o)}let{events:s,span:l,release:c}=i;return F(e,async n=>{let i=0,a=performance.now(),u={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1;try{try{for await(let e of s)e.data&&"[DONE]"!==e.data?(i++,xe.add(1,{model:o.model,endpoint_type:"anthropic_messages"}),si(e.data,u)&&(p=!0),await n.writeSSE(e)):await n.writeSSE(e);let e=performance.now()-a,t={model:o.model,endpoint_type:"anthropic_messages"};Oe.record(e,t),De.record(i,t)}finally{if(p){let t=ai(u);$n(l,t);let o=e.get("requestData")||{};o.tokenUsage=xn(t),o._d1=performance.now()-r,e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&te.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Be(t,e),t.end(),e}})}(e,t);let i=performance.now(),a=se.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),yr(t,Y.models)}finally{o.end()}});Pe.record(performance.now()-i,{direction:"anthropic_to_openai"}),a=Mn(a,Y.models),o.debug("Translated OpenAI request payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream});let s=performance.now();Y.manualApprove&&await wn();let l=await Kn(a),c=performance.now()-s;if(Ee.record(c,{model:a.model,target:"chat_completions",streaming:String(!!a.stream)}),ri(l)){let t=e.get("requestData")||{};l.usage&&(t.tokenUsage=xn(l.usage)),t._d1=c,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(l).slice(-400));let r=performance.now(),i=se.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 i of e.choices){let e=Sr(i.message),a=Ar(i.message.content),s=Cr(i.message.tool_calls);t.push(...e),o.push(...a),n.push(...s),("tool_calls"===i.finish_reason||"stop"===r)&&(r=i.finish_reason)}return{id:e.id,type:"message",role:"assistant",model:e.model,content:[...t,...o,...n],stop_reason:_r(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(l);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 Pe.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",i),e.json(i)}o.debug("Streaming response from service");let{events:u,span:p,release:m}=l;return F(e,async t=>{let n=null,r=0,i=performance.now(),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let i of u){if(o.debug("Raw stream event:",i),"[DONE]"===i.data)break;if(!i.data)continue;let l;try{l=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}if(r++,xe.add(1,{model:a.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=xn(n),t._d1=c,e.set("requestData",t)}let u=Wr(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()-i,p={model:a.model,endpoint_type:"anthropic"};if(Oe.record(l,p),De.record(r,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=xn(n),t._d1=c,e.set("requestData",t))}}catch(t){throw Fe(p,e.get("requestSpan"),t),t}finally{n&&$n(p,n),p.end(),m()}let l=e.get("requestId");l&&te.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}function ni(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens}:null}const ri=e=>Object.hasOwn(e,"choices"),ii=e=>Object.hasOwn(e,"output");function ai(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 si(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}const li=new M;li.post("/",async e=>{try{return await oi(e)}catch(t){return await Tt(e,t)}});const ci=new M;function ui(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=xn(o),n._d1=t._d1,t.c.set("requestData",n)}ci.get("/",async e=>{try{Y.models||await Nt();let t=Y.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 Tt(e,t)}});const pi=new Set(["message","function_call","function_call_output"]),di=new Set(["type","name","description","parameters"]);async function mi(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||!Y.tavilyApiKey)&&(o.info(`Enriching web search: "${n}"`),e.sources=(await Zr(Y.tavilyApiKey,n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function fi(e){if(Y.tavilyApiKey)try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await mi(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function hi(e){if(!Y.tavilyApiKey)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 mi(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function gi(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 _i(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&&gi(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)gi(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function yi(e){return null!=e}function ki(e){let t=e.input,o="string"==typeof t?t:t.map(e=>function(e){switch(e.type){case"custom_tool_call":{let t=e.input;return{type:"function_call",call_id:e.call_id,name:e.name,arguments:JSON.stringify("string"==typeof t?{input:t}:t)}}case"custom_tool_call_output":return{type:"function_call_output",call_id:e.call_id,output:e.output};default:return pi.has(e.type)||"web_search_call"===e.type?e:null}}(e)).filter(e=>null!==e),n={model:e.model,input:o};for(let t of["instructions","max_output_tokens","temperature","top_p","stream","store","tool_choice","parallel_tool_calls","user"])yi(e[t])&&(n[t]=e[t]);let r=new Set;if(yi(e.tools)){let t=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let o=e.type;if("web_search"===o||o.startsWith("web_search_"))return{type:e.type};let n={};for(let t of Object.keys(e))di.has(t)&&(n[t]=e[t]);return"custom"===n.type&&(n.type="function",t.add(n.name),n.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),n}),customToolNames:t}}(e.tools);n.tools=t.tools,r=t.customToolNames}if(yi(e.reasoning)&&"object"==typeof e.reasoning){let t=e.reasoning;n.reasoning={},yi(t.effort)&&(n.reasoning.effort=t.effort),yi(t.summary)&&(n.reasoning.summary=t.summary)}if(yi(e.text)&&"object"==typeof e.text){let t=e.text;yi(t.format)&&(n.text={format:t.format})}return{payload:n,customToolNames:r}}async function wi(e){await Nn(Y);let{payload:t,customToolNames:n}=ki(await e.req.json()),r=t;o.debug(`Responses API [${Array.isArray(r.input)?r.input.length:1} items]`),n.size>0&&o.debug(`Custom tools detected: ${[...n].join(", ")}`);try{r=function(e){return se.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Pn(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()}})}(r)}catch(t){if(t instanceof In)return e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:r.model,streaming:!!r.stream}),Y.manualApprove&&await wn();let i=performance.now(),a=await mr(r),s=performance.now()-i;if(Ee.record(s,{model:r.model,target:"responses",streaming:String(!!r.stream)}),bi(a))return async function(e,t,o){await fi(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=xn({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n._d1=o,e.set("requestData",n),e.json(t)}(e,a,s);let{events:l,span:c,release:u}=a;return F(e,async t=>{let o={value:null},i=0,a=performance.now();try{try{for await(let a of l)if(a.data&&"[DONE]"!==a.data){i++;let l=_i(a.data,n);l=await hi(l);let c=l===a.data?a:{...a,data:l};xe.add(1,{model:r.model,endpoint_type:"responses"}),ui(l,{usageRef:o,c:e,_d1:s}),await t.writeSSE(c)}else await t.writeSSE(a);let c=performance.now()-a,u={model:r.model,endpoint_type:"responses"};Oe.record(c,u),De.record(i,u)}catch(t){throw Fe(c,e.get("requestSpan"),t),t}finally{o.value&&$n(c,o.value),c.end(),u()}let p=e.get("requestId");p&&te.executeCompletion(p)}finally{e.get("resolveStreamComplete")?.()}})}const bi=e=>Object.hasOwn(e,"output"),vi=new M;vi.post("/",async e=>{try{return await wi(e)}catch(t){return await Tt(e,t)}});const xi=new M;xi.get("/",e=>{try{return Y.showToken?e.json({token:Y._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 $i=new M;$i.get("/",async e=>{try{let t=await Jt();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Ti=new M;Ti.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,i=e.req.method,a=e.req.path,s=ct(a);e.set("requestId",r),e.header("x-request-id",r);let p=se.startSpan("copilot_api.handle_request",{kind:l.SERVER,attributes:{"http.method":i,"http.url":e.req.url,"http.route":a,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",p),e.set("requestTraceContext",p.spanContext());for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Le.has(e)||p.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:i}=t;if("POST"===n&&("anthropic"===i||"openai"===i||"embeddings"===i||r.includes("/responses")))try{let t=await e.req.raw.clone().text();e.set("rawBody",t.length>kn?t.slice(0,kn):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:i,path:a,endpointType:s});let m,f=new Promise(e=>{m=e});e.set("streamComplete",f),e.set("resolveStreamComplete",m);let h=d.setSpan(u.active(),p);await u.with(h,async()=>{te.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw p.setStatus({code:c.ERROR,message:t.message}),p.recordException(t),e}});let g=e.get("requestData"),_={c:e,start:n,method:i,path:a,endpointType:s,requestId:r,span:p};g?.streaming&&e.res.status<400?f.then(()=>yn(_)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{p.recordException(t),p.setStatus({code:c.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{p.end()}catch{}}):yn(_)}),Ti.use(B()),Ti.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()}),Ti.get("/",e=>e.text("Server running")),Ti.route("/health",Qn),Ti.route("/chat/completions",Yn),Ti.route("/models",ci),Ti.route("/embeddings",Zn),Ti.route("/usage",$i),Ti.route("/token",xi),Ti.route("/v1/chat/completions",Yn),Ti.route("/v1/models",ci),Ti.route("/v1/embeddings",Zn),Ti.route("/v1/messages",li),Ti.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=nr.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=nr.perMessage+rr(e)*nr.contentMultiplier}for(let e of t.messages)o+=nr.perMessage,o+=rr(e.role),"string"==typeof e.content?o+=rr(e.content)*nr.contentMultiplier:Array.isArray(e.content)&&(o+=ir(e.content));return t.tools&&t.tools.length>0&&(o+=function(e){let t=nr.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=nr.perTool),t+=rr(n.name),n.description&&(t+=nr.perDesc+rr(n.description)),t+=ar(n.input_schema);return t}(t.tools)),e.json({input_tokens:Math.round(o)})}),Ti.route("/v1/responses",vi),Ti.route("/responses",vi);const Ai=[],Si=Date.now();let Ci="";function Ei(){let e=async(e,t=0)=>{let n=se.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()-Si)/1e3}});for(let t of Ai)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Vo("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Zo,` ${Lo("COPILOT-API")} ${zo(`v${e}`)} ${zo("·")} ${cn(t)} uptime`,Zo,""," Check in from time to time on",` ${Go(o)}`,"",Zo,""];console.log(n.join("\n"))}(Ci,Date.now()-Si),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 Oi(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function Ii(e){let{options:t,version:o,runtime:n,_u1:r}=e,i=se.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Ue({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:Oi(t)},runtime:n,identity:{_u1:r.login,machineId:Y.machineId,sessionId:Y.sessionId,_v1:Y._v1},connectivity:Y.connectivity,modelsCount:Y.models?.data.length??0,startupDurationMs:Date.now()-Si},"copilot_api")});if(Y.models?.data)for(let e of Y.models.data)i.addEvent("copilot_api.model.available",Ue(e,"model"));i.end(),Me(_.INFO,"INFO","Server started",Ue({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:Y.models?.data.length??0,startupDurationMs:Date.now()-Si},"copilot_api"))}async function Pi(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[o,n]=await Promise.all([i.readFile(e,"utf8"),i.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 hn(e)){let e=await fn(pn),t=await fn(dn);if(e&&t)return{cert:e,key:t,certPath:pn,keyPath:dn,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),_n(e)}(e.httpsHosts)}}async function Ni(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=po;try{q(t),q(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(Ei(),Ai.push(()=>{o.debug("Cleaning up connectivity monitor"),Je.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),qt&&=void clearInterval(qt),Dt&&=void Je.off("online",Dt),Ht&&=void Je.off("offline",Ht),jt=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),Ro&&=void clearInterval(Ro),qo&&=void clearInterval(qo);let e=[...Io.keys(),...Po];Io.clear(),Po.clear(),Oo.clear(),No=void 0;for(let t of e)jo(t)&&(Ae.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!oe)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([oe.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");Y.accountType=t.accountType,Y.manualApprove=t.manual,Y.rateLimitSeconds=t.rateLimit,Y.rateLimitWait=t.rateLimitWait,Y.showToken=t.showToken,Y.timeoutMs=t.timeout,Y.connectivity.timeoutMs=t.connectTimeout,t.tavilyApiKey&&(Y.tavilyApiKey=t.tavilyApiKey),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;Y.connectivity.h2=t,Y.connectivity.h2Keepalive=e}(),await W(),Y._v1="1.121.0-insider";let n=await ko();Ci=n;let r=wo();(function(e,t){t&&(re=t),ne=crypto.randomUUID();let o=v({[S]:"copilot-api",[C]:e,[A]:ne}),{endpoint:n,headers:r}=ae();oe=new T({resource:o,traceExporter:new b({url:`${n}/v1/traces`,headers:r}),metricReader:new $({exporter:new w({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x(new k({url:`${n}/v1/logs`,headers:r}))],instrumentations:[]}),oe.start()})(n,Si),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 i,a=t._t2||g.env.GH_TOKEN;a?(Y._t2=a,o.info("Using provided Auth token")):await Lt();try{i=await St(),await Qe(Y,i.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 At();Y._t1=e,o.debug("Service token fetched successfully!"),Y.showToken&&o.info("Service token:",e),qt=setInterval(()=>{Ut(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),Je.start(),Dt=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Ut(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},Ht=()=>{o.debug("Network connectivity lost")},Je.on("online",Dt),Je.on("offline",Ht)})(),await async function(){try{return await Nt(),!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(()=>{Nt().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{Nt().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)}}();Ai.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),Y.connectivity.h2&&(Mo(Ho(et(Y))),Y.connectivity.h2Keepalive&&Fo()),Ii({options:t,version:n,runtime:r,_u1:i});let l=await Pi(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await async function(e,t,n){if(!e._cc1)return!1;let r,i;if(Y.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=Y.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,i=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:Y.models.data.map(e=>e.id)}),i=await o.prompt("Select a small model to use",{type:"select",options:Y.models.data.map(e=>e.id)})}let a=Uo({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:r,ANTHROPIC_SMALL_FAST_MODEL:i,NODE_EXTRA_CA_CERTS:n?.certPath},"claude");try{return m.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(a),!1}}(t,u,l)||await async function(e,t,n){if(!e.codex)return!1;let r;if(Y.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=Y.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:Y.models.data.map(e=>e.id)});let i=Uo({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return m.writeSync(i),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(i),!1}}(t,u,l);(function(e){let t=[...on(e),...nn(e),...rn(e),...an(),"",...tn(en),...sn(e),...ln(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:o,runtime:n,user:r,clipboardCopied:i,tls:a}=e,s=a?"https":"http";return{version:o,runtime:n,user:r,accountType:t.accountType,port:t.port,timeout:t.timeout,webSearch:!!t.tavilyApiKey,model:t.model,smallModel:t.smallModel,clipboardCopied:i,https:a?{certPath:a.certPath,keyPath:a.keyPath,generated:a.generated,selfSigned:!t.httpsCert}:void 0,endpoints:t.claudeCowork?{scheme:s,port:t.port,hostname:await Qt()}:void 0}}({options:t,version:n,runtime:r,user:i.login,clipboardCopied:p,tls:l})),j({fetch:Ti.fetch,port:t.port,hostname:t.hostname,tls:l?{cert:l.cert,key:l.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(c,t.hostname,t.port)}function Ri(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const qi=e({meta:{name:"start",description:"Start the API server"},args:{port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"Tavily API key for web search support (or set TAVILY_API_KEY env var)"},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"}},run({args:e}){let t=e["rate-limit"],o=void 0===t?void 0:Ri(t,"--rate-limit"),n=e.timeout,r=void 0===n?X:Ri(n,"--timeout"),i=e["connect-timeout"]??g.env.COPILOT_CONNECT_TIMEOUT_MS,a=void 0===i?15e3:Ri(i,"--connect-timeout");if(a<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${a}`);let s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[];return Ni({port:Ri(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:o,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:r,connectTimeout:a,tavilyApiKey:e["tavily-api-key"]||g.env.TAVILY_API_KEY,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"]})}});await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([ko(),Co()]);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 ${$o}@latest`,n=So("│"),r=` ${Ao("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,i=` Run ${Ao(o)} to update`,a=" ".repeat(54),s=So(`╭${"─".repeat(54)}╮`),l=So(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${a}${n}`,`${n}${Eo(r,54)}${n}`,`${n}${a}${n}`,`${n}${Eo(i,54)}${n}`,`${n}${a}${n}`,l,""];console.log(c.join("\n"))}(e,t)}catch{}}(),await t(e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Kt,start:qi,"check-usage":Wt,debug:xo,"cowork-setup":yo}}));export{};
2
+ import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import i from"node:fs/promises";import a from"node:os";import s from"node:path";import{SpanKind as l,SpanStatusCode as c,context as u,metrics as p,trace as d}from"@opentelemetry/api";import m from"clipboardy";import{execFile as f,execSync as h}from"node:child_process";import g from"node:process";import{SeverityNumber as _,logs as y}from"@opentelemetry/api-logs";import{OTLPLogExporter as k}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as b}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as w}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as v}from"@opentelemetry/resources";import{BatchLogRecordProcessor as x}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as $}from"@opentelemetry/sdk-metrics";import{NodeSDK as T}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as A,ATTR_SERVICE_NAME as S,ATTR_SERVICE_VERSION as C}from"@opentelemetry/semantic-conventions";import{Client as E,request as O}from"undici";import{createHash as I,randomBytes as P,randomUUID as N}from"node:crypto";import{promisify as R}from"node:util";import{accessSync as q}from"node:fs";import{serve as j}from"srvx";import{isIP as D}from"node:net";import{generate as H}from"selfsigned";import{Hono as M}from"hono";import{cors as B}from"hono/cors";import{streamSSE as F}from"hono/streaming";import{events as U}from"fetch-event-stream";import{Tokenizer as L,models as z}from"ai-tokenizer";import*as G from"ai-tokenizer/encoding/claude";const K=s.join(a.homedir(),".local","share","copilot-api"),J={APP_DIR:K,GITHUB_TOKEN_PATH:s.join(K,"github_token"),MACHINE_ID_PATH:s.join(K,"machine_id"),SESSION_ID_PATH:s.join(K,"session_id")};async function W(){await i.mkdir(J.APP_DIR,{recursive:!0}),await V(J.GITHUB_TOKEN_PATH),await V(J.SESSION_ID_PATH)}async function V(e){try{await i.access(e,i.constants.W_OK)}catch{await i.writeFile(e,""),await i.chmod(e,384)}}const X=6e5,Y={accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:X,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}},Z=e=>e>=1e5||e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString(),Q=(e,t)=>e.padEnd(t),ee=e=>{let t=[];if(e.model){let o=Q(e.model,18);t.push(o)}if(e.tokenUsage){let o=e.tokenUsage,n=(o.inputTokens||0)+(o.outputTokens||0),r=e.model?((e,t)=>{if(!Y.models)return"";let o=Y.models.data.find(e=>e.id===t);if(!o)return"";let n=o.capabilities.limits?.max_context_window_tokens;return n?` (${(e/n*100).toFixed(1)}%)`:""})(n,e.model):"",i=Q(`↑${Z(o.inputTokens||0).padStart(5)} │ ↓${Z(o.outputTokens||0).padStart(5)}`,18),a=Z(n),s=r?`${a}${r.padStart(15-a.length)}`:a.padEnd(15);t.push(`Tokens: ${i} | Context: ${s}`)}else if(e.model){let e=Q("N/A",18),o="N/A".padEnd(15);t.push(`Tokens: ${e} | Context: ${o}`)}if(e._d1){let o=Q(`${Math.round(e._d1)}ms`,8);t.push(`API: ${o}`)}return t.length>0?` | ${t.join(" | ")}`:""},te={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),i=t.get("requestData"),a=` --\x3e ${Q(t.req.method,4)}${Q(t.req.path,21)}${Q(t.res.status.toString(),3)} ${Q(`${r}ms`,8)}`;i&&(a+=ee(i)),o.info(a),Me(_.INFO,"INFO","Request completed",{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":r,...i?.model&&{"copilot_api.model":i.model},...i?._d1&&{"copilot_api.copilot_duration_ms":Math.round(i._d1)},...i?.tokenUsage?.inputTokens&&{"copilot_api.input_tokens":i.tokenUsage.inputTokens},...i?.tokenUsage?.outputTokens&&{"copilot_api.output_tokens":i.tokenUsage.outputTokens}},t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,i=Math.round(performance.now()-r),a=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=`⚠ --\x3e ${Q(n.req.method,4)}${Q(n.req.path,21)}${Q("429",3)} ${Q(`${i}ms`,8)}`;l+=` | Rate limited (${s}s retry) | ${a}`;let c=n.get("requestData");if(c?._d1){l+=` | API: ${Q(`${Math.round(c._d1)}ms`,8)}`}o.info(l)},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(()=>te.cleanup(),6e4);let oe,ne,re=Date.now();const ie={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function ae(){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):ie;return{endpoint:e.replace(/\/$/,""),headers:t}}const se=d.getTracer("copilot-api"),le=p.getMeter("copilot-api"),ce=y.getLogger("copilot-api"),ue=le.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),pe=le.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),de=le.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),me=le.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),fe=le.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),he=le.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),ge=le.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),_e=le.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),ye=le.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),ke=le.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),be=le.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),we=le.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),ve=le.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),xe=le.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),$e=le.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Te=le.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Ae=le.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Se=le.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Ce=le.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Ee=le.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Oe=le.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Ie=le.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Pe=le.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Ne=le.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Re=le.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),qe=le.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),je=le.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),De=le.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),He=le.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function Me(e,t,o,n,r){let i=d.getActiveSpan()?.spanContext()??r;ce.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...i&&{"trace.id":i.traceId,"span.id":i.spanId}}})}function Be(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 Fe(e,t,o){Be(e,o),t&&t!==e&&Be(t,o)}function Ue(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,Ue(r,e)))}return o}le.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!Je.getConnectivityStats().isOnline)}),le.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(Je.getConnectivityStats().consecutiveFailures)}),le.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(Y.models?.data.length??0)}),le.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(te.completionCallbacks.size)}),le.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-re)/1e3)});const Le=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();Le.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function Ge(e){let{spanName:t,url:o,target:n,method:r="GET",headers:i,body:a,signal:s,extraAttributes:u}=e,p=se.startSpan(t,{kind:l.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});i&&ze(p,"request",i);try{let e=await fetch(o,{method:r,headers:i,body:a,signal:s});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();Le.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),ve.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 Be(p,e),p.end(),e}}async function Ke(e){let{spanName:t,url:o,target:n,method:r="POST",headers:i,body:a,signal:s,headersTimeout:u,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=se.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",i);try{let{statusCode:e,headers:t,body:l}=await O(o,{method:r,headers:i,body:a,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&&!Le.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return ve.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 Be(f,e),f.end(),e}}const Je=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:Y.connectivity.probeEndpoints,fastInterval:Y.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?Y.connectivity.slowProbeInterval:Y.connectivity.fastProbeInterval)+Math.random()*Y.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=se.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),Y.connectivity.timeoutMs);try{let n=!1;for(let e of Y.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",...Y.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Re.record(r,{endpoint:e,result:"success"});break}Re.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),be.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")),we.add(1,{from:"offline",to:"online"}),Me(_.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")),we.add(1,{from:"online",to:"offline"}),Me(_.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?Y.connectivity.slowProbeInterval:Y.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*Y.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:Y.connectivity.jitterMaxMs>0,connectionPooling:Y.connectivity.connectionPooling,dnsCache:Y.connectivity.dnsCache}}},We=()=>({"content-type":"application/json",accept:"application/json"}),Ve="0.48.1",Xe=`copilot-chat/${Ve}`,Ye=`GitHubCopilotChat/${Ve}`,Ze=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`${J.MACHINE_ID_PATH}_${t}`})(e);try{let e=await i.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(a.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await i.writeFile(t,o),await i.chmod(t,384),o},Qe=async(e,t)=>{e.machineId||=await Ze(t),e.sessionId||=await(async()=>{try{let e=await i.readFile(J.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=N();return await i.writeFile(J.SESSION_ID_PATH,e),await i.chmod(J.SESSION_ID_PATH,384),e})()},et=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,tt=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=N(),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":Xe,"User-Agent":Ye,"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":N(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},ot=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const nt=(e,t,o)=>{let n=tt(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,i=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&ot.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta):void 0;if(i)for(let e of i.split(","))r.add(e);if(o)for(let e of o)r.add(e);return r.size>0&&(n["anthropic-beta"]=[...r].join(",")),n},rt="https://api.github.com",it=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":Xe,"user-agent":Ye,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),at="https://github.com",st="01ab8ac9400c4e429b23",lt=["user:email"].join(" ");function ct(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 ut=32768,pt=[{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_***"}],dt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);const mt=new Map;function ft(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=e.model??"unknown";return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function ht(e,t,o){let n=function(e){let t=e;for(let{regex:e,mask:o}of pt)t=t.replace(e,o);return t}(o),r=8*ut,i=n.length>r,a=i?n.slice(0,r):n,s=I("sha256").update(n).digest("hex");if(a.length<=ut)e.setAttribute(t,a),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<a.length;o+=ut)e.setAttribute(`${t}.part_${o/ut}`,a.slice(o,o+ut));e.setAttribute(`${t}.parts`,Math.ceil(a.length/ut))}e.setAttribute(`${t}.bytes`,n.length),e.setAttribute(`${t}.sha256`,s),i&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,n.length-a.length))}function gt(e,t){let o=function(e){if(mt.size>=1e3&&!mt.has(e)){let e=mt.keys().next().value;void 0!==e&&mt.delete(e)}let t,o=(mt.get(e)??0)+1;return mt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Se.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&&ht(e,"copilot_api.incoming_request_body",n);let r=_t(t.c.req.header());return r&&ht(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&ht(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&ht(e,"copilot_api.outgoing_headers",_t(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&ht(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function _t(e){let t={};for(let[o,n]of Object.entries(e))dt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}var yt=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}};function kt(e){return e.req.path.startsWith("/v1/messages")}function bt(e,t){if(kt(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}function wt(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type&&(o.type=t.type),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function vt(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 xt(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 $t(e){let{c:t,error:o,errorText:n,upstream:r}=e,i=d.getActiveSpan();if(!i)return;let a=ft({endpointType:ct(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});gt(i,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:a})}async function Tt(e,t){if(t instanceof yt&&429===t.response.status)return async function(e,t){let o=d.getActiveSpan(),n=e.get("requestId"),r=te.completionCallbacks.get(n);r&&(te.logRateLimit(r,t.response),te.completionCallbacks.delete(n)),he.add(1,{action:"rejected",source:"upstream"});let i=await t.response.text(),a=bt(i,e),s=wt(a);return o?.setStatus({code:c.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),vt(o,s),Me(_.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...xt(s)}),$t({c:e,error:t,errorText:i,upstream:s}),e.json(a,429)}(e,t);if(t instanceof SyntaxError){d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),Me(_.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=kt(e)?{type:"error",error:{type:"invalid_request_error",message:"Invalid JSON in request body"}}:{error:{message:"Invalid JSON in request body",type:"invalid_request_error"}};return e.json(o,400)}if(o.error("Error occurred:",t),t instanceof yt)return async function(e,t){let n=d.getActiveSpan(),r=await t.response.text(),i=bt(r,e),a=wt(i);return o.error("HTTP error:",i),n?.setStatus({code:c.ERROR,message:t.message}),n?.recordException(t),n?.setAttribute("copilot_api.error_type","HTTPError"),vt(n,a),Me(_.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...xt(a)}),$t({c:e,error:t,errorText:r,upstream:a}),e.json(i,t.response.status)}(e,t);let n=d.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:c.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),Me(_.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name});let i=kt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(i,500)}const At=async()=>{let e=`${rt}/copilot_internal/v2/token`,t=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ge({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:it(Y),signal:o.signal});try{if(!t.ok)throw new yt("Failed to get Service token",t);return await t.json()}catch(e){throw Be(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function St(){let e=`${rt}/user`,t=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ge({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${Y._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new yt("Failed to get GitHub user",t);return await t.json()}catch(e){throw Be(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let Ct=null;function Et(){return Ct||=At().then(({token:e})=>{Y._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{Ct=null}),Ct}const Ot=async()=>{let e=`${et(Y)}/models`,t=tt(Y),o=Y.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),o);try{let{response:o,span:r}=await Ge({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new yt("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Be(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const It=e=>new Promise(t=>{setTimeout(t,e)}),Pt=e=>null==e;async function Nt(){Y.models=await(async()=>{try{return await Ot()}catch(e){if(e instanceof yt&&401===e.response.status)return await Et(),Ot();throw e}})()}var Rt=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let qt,jt,Dt,Ht,Mt=!1;function Bt(e){let{span:t,error:n,reason:r,refreshStart:i,attempt:a}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";Y._t1=void 0,clearInterval(qt),qt=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),ye.add(1,{reason:r,success:"false"}),ke.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),Ne.record(performance.now()-i,{reason:r}),Me(_.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":a,"copilot_api.token_refresh.terminal_status":s})}function Ft(e){let{span:t,error:n,reason:r,refreshStart:i,maxRetries:a}=e;Y._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),ke.add(1,{reason:r}),Ne.record(performance.now()-i,{reason:r}),Me(_.ERROR,"ERROR",`Token refresh failed after ${a} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":a})}const Ut=async(e=5,t=1e3,n="scheduled")=>Mt?(o.debug("Token refresh already in progress, coalescing"),jt):(Mt=!0,jt=se.startActiveSpan("copilot_api.token.refresh",async r=>{let i=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let a=1;a<=e;a++)try{r.setAttribute("copilot_api.token_refresh.attempt",a),o.debug(`Refreshing Service token (${n}, attempt ${a}/${e})`);let{token:t}=await At();return Y._t1=t,o.debug("Service token refreshed successfully"),Y.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),ye.add(1,{reason:n,success:"true"}),Ne.record(performance.now()-i,{reason:n}),void Me(_.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":a})}catch(s){if(s instanceof yt&&(401===s.response.status||403===s.response.status))return void Bt({span:r,error:s,reason:n,refreshStart:i,attempt:a});let l=a===e;if(o.error(`Failed to refresh Service token (attempt ${a}/${e}):`,s),ye.add(1,{reason:n,success:"false"}),l)return void Ft({span:r,error:s,reason:n,refreshStart:i,maxRetries:e});let c=t*2**(a-1);o.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),Mt=!1,jt=void 0}}),jt);async function Lt(e){try{let t=await i.readFile(J.GITHUB_TOKEN_PATH,"utf8");if(t&&!e?.force)return Y._t2=t,Y.showToken&&o.info("Auth token:",t),void await zt();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=Y.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${at}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:st,scope:lt}),signal:e.signal});if(!t.ok)throw new yt("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 Rt("Authorization timed out — the code expired. Please run the command again.");let i=new AbortController,a=Y.timeoutMs,s=setTimeout(()=>{i.abort()},a);try{let n=await fetch(`${at}/login/oauth/access_token`,{method:"POST",headers:We(),body:JSON.stringify({client_id:st,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:i.signal});if(!n.ok){await It(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 Rt("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Rt("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 It(t);continue}if(r.access_token)return r.access_token;await It(t)}catch(e){if(e instanceof Rt)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await It(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>i.writeFile(J.GITHUB_TOKEN_PATH,e,{mode:384}))(r),Y._t2=r,Y.showToken&&o.info("Auth token:",r),await zt()}catch(e){throw e instanceof yt?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function zt(){let e=await St();o.success(`Authenticated as ${e.login}`)}async function Gt(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),Y.showToken=e.showToken,await W(),await Lt({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 Kt=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})=>Gt({verbose:e.verbose,showToken:e["show-token"]})}),Jt=async()=>{let e=`${rt}/copilot_internal/user`,t=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ge({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:it(Y),signal:o.signal});try{if(!t.ok)throw new yt("Failed to get usage",t);return await t.json()}catch(e){throw Be(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Wt=e({meta:{name:"check-usage",description:"Show current usage/quota information"},async run(){await W(),await Lt();try{let e=await Jt(),t=e.quota_snapshots.premium_interactions,n=t.entitlement,r=n-t.remaining,i=n>0?r/n*100:0,a=t.percent_remaining;function s(e,t){if(!t)return`${e}: N/A`;let o=t.entitlement,n=o-t.remaining,r=o>0?n/o*100:0,i=t.percent_remaining;return`${e}: ${n}/${o} used (${r.toFixed(1)}% used, ${i.toFixed(1)}% remaining)`}let l=`Premium: ${r}/${n} used (${i.toFixed(1)}% used, ${a.toFixed(1)}% remaining)`,c=s("Chat",e.quota_snapshots.chat),u=s("Completions",e.quota_snapshots.completions);o.box(`Usage (plan: ${e.copilot_plan})\nQuota resets: ${e.quota_reset_date}\n\nQuotas:\n ${l}\n ${c}\n ${u}`)}catch(p){o.error("Failed to fetch usage:",p),process.exit(1)}}}),Vt=R(f);async function Xt(){let e="win32"===g.platform?"where.exe":"which";try{return await Vt(e,["tailscale"]),!0}catch{return!1}}async function Yt(){try{let{stdout:e}=await Vt("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Zt(e){return e.replace(/\.$/,"")}async function Qt(){let e=await Yt();if(e?.Online)return Zt(e.DNSName)}const eo=R(f),to=e=>`${e}`,oo=e=>`${e}`,no=e=>`${e}`,ro=e=>`${e}`,io=e=>`${e}`,ao=e=>`${e}`,so=oo(" ─────────────────────────────────────────────────────────────"),lo=s.join(J.APP_DIR,"certs","tailscale"),co=s.join(lo,"cert.pem"),uo=s.join(lo,"key.pem"),po={certDir:lo,certPath:co,keyPath:uo};function mo(){switch(g.platform){case"darwin":return[` ${oo("Install Tailscale for macOS:")}`,` ${no("https://tailscale.com/download/mac")}`,` ${oo("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${oo("After installing, open the Tailscale app and sign in.")}`,` ${oo("Then re-run this command.")}`].join("\n");case"linux":return[` ${oo("Install Tailscale for Linux:")}`,` ${no("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${no("sudo tailscale up")}`,` ${oo("or")} ${no("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${oo("Install Tailscale for Windows:")}`,` ${no("https://tailscale.com/download/windows")}`,"",` ${oo("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${oo("Install Tailscale:")} ${no("https://tailscale.com/download")}`}}function fo(){let e=[` ${io("Tailscale is not running.")}`];return"darwin"===g.platform?e.push(` ${oo("Open the Tailscale app from Applications and sign in.")}`,` ${oo("Download:")} ${no("https://tailscale.com/download/mac")}`):"win32"===g.platform?e.push(` ${oo("Open the Tailscale app and sign in.")}`,` ${oo("Download:")} ${no("https://tailscale.com/download/windows")}`):e.push(` ${oo("Connect with:")} ${no("sudo tailscale up")}`),e.push("",` ${oo("Then re-run this command.")}`),e.join("\n")}async function ho(){try{return await i.access(co),await i.access(uo),!0}catch{return!1}}function go(e){console.log(""),console.log(so),console.log(` ${to("Claude Cowork Setup")} ${oo("— Diagnostic")}`),console.log(so),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?ro("✅"):"missing"===n.status?io("❌"):ao("❓");let r=n.detail?oo(` ${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(` ${ro("All checks passed.")}`):console.log(` ${io(`${t.length} issue(s).`)} Run ${no("copilot-api cowork-setup install")} to fix.`),console.log("")}const _o={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},yo=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Xt();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return go(e),console.log(""),console.log(mo()),void console.log("");let o=await Yt();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},go(e),console.log(fo()),void console.log("");let n=Zt(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await ho();e["tailscale-cert"]=r?{status:"ok",detail:co}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),go(e)}(),g.exit(0)}}),install:e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:_o},async run({args:e}){await async function(e){if(console.log(""),console.log(so),console.log(` ${to("Claude Cowork Setup")} ${oo("— Install")}`),console.log(so),console.log(""),!await Xt())return console.log(` ${io("Tailscale is not installed.")}`),console.log(""),console.log(mo()),console.log(""),console.log(` ${oo("After installing, run")} ${no("tailscale up")} ${oo("to connect, then re-run this command.")}`),void console.log("");let t=await Yt();if(!t||!t.Online)return console.log(fo()),void console.log("");let n=Zt(t.DNSName);if(console.log(` ${oo("Tailscale hostname:")} ${to(n)}`),console.log(""),console.log(` ${to("Generating TLS certificate via Tailscale…")}`),console.log(` ${oo("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${no(`$ tailscale cert --cert-file ${co} --key-file ${uo} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await i.mkdir(lo,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await eo("tailscale",["cert","--cert-file",co,"--key-file",uo,n]),console.log(` ${ro("✓ 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(so),console.log(` ${to("Next steps")}`),console.log(so),console.log(""),console.log(` ${to("1.")} Start the proxy:`),console.log(` ${no("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${to("2.")} In Cowork ${oo("→")} Settings ${oo("→")} Inference Provider, set:`),console.log(` ${to("inferenceGatewayBaseUrl")} = ${no(`https://${n}:<port>`)}`),console.log(` ${oo("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${to("3.")} Restart Cowork ${oo("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${oo("For Cowork's own configuration docs, see:")}`),console.log(` ${no("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}}),revert:e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:_o},async run({args:e}){await async function(e){if(console.log(""),console.log(so),console.log(` ${to("Claude Cowork Setup")} ${oo("— Revert")}`),console.log(so),console.log(""),!await ho())return console.log(` ${oo("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${to("Remove Tailscale cert files:")}`),console.log(` ${oo(co)}`),console.log(` ${oo(uo)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await i.rm(lo,{recursive:!0}),console.log(` ${ro("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${oo("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),g.exit(0)}})}});async function ko(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await i.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function bo(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:a.platform(),arch:a.arch()}}async function wo(){try{return!!(await i.stat(J.GITHUB_TOKEN_PATH)).isFile()&&(await i.readFile(J.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function vo(e){let t=await async function(){let[e,t]=await Promise.all([ko(),wo()]);return{version:e,runtime:bo(),paths:{APP_DIR:J.APP_DIR,GITHUB_TOKEN_PATH:J.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 xo=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})=>vo({json:e.json})}),$o="copilot-api-node20",To=`https://registry.npmjs.org/${$o}/latest`,Ao=e=>`${e}`,So=e=>`${e}`;async function Co(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(To,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Eo(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}const Oo=new Map,Io=new Map,Po=new Set;let No,Ro,qo;function jo(e){return!e.closed&&!e.destroyed}function Do(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new E(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return Oo.set(t,Date.now()),Ae.add(1,{event:"created",origin:e}),Me(_.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,i)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,i.message);let a=Po.has(t);Ae.add(1,{event:"goaway",origin:e}),Me(a?_.WARN:_.DEBUG,a?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${i.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":i.message}),Io.delete(t),Po.delete(t),Oo.delete(t),jo(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Ho(e){if(!Y.connectivity.h2)return;No&&No!==e&&function(){for(let e of[...Io.keys(),...Po])jo(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Io.clear(),Po.clear(),Oo.clear()}(),No=e;let t=Date.now();for(let[n]of Io)if(t-(Oo.get(n)??0)>=6e5)Io.delete(n),Oo.delete(n),jo(n)&&n.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ae.add(1,{event:"rotated",origin:e}),Me(_.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(jo(n))return Io.delete(n),Po.add(n),n;Io.delete(n),Oo.delete(n)}let n=Do(e);return Po.add(n),n}function Mo(e){e&&Po.delete(e)&&(jo(e)?Io.set(e,Date.now()):Oo.delete(e))}function Bo(){qo||(qo=setInterval(()=>{!function(){let e=Date.now(),t=Y.connectivity.h2Keepalive,n=Io.size;for(let[r,i]of Io)e-i<6e4||t&&n<=1||(Io.delete(r),Oo.delete(r),n--,jo(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ae.add(1,{event:"idle_reaped",origin:No??""}),Me(_.INFO,"INFO",`HTTP/2 idle connection reaped for ${No}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":No??""}))}()},3e4),qo.unref())}function Fo(){Ro||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Ro=setInterval(()=>{(async function(){if(0===Io.size&&0===Po.size){if(No){let e=Do(No);Io.set(e,Date.now())}return}let e=[...Io.keys()];for(let t of e)Io.delete(t);await Promise.allSettled(e.map(async e=>{if(jo(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:tt(Y)});await n.dump(),Te.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Io.set(e,Date.now())}catch(t){Te.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ae.add(1,{event:"error",origin:No??""}),Oo.delete(e),jo(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Oo.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Ro.unref(),Bo())}function Uo(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 Lo=e=>`${e}`,zo=e=>`${e}`,Go=e=>`${e}`,Ko=e=>`${e}`,Jo=e=>`${e}`,Wo=e=>`${e}`,Vo=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Xo="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Yo="https://github.com/johnib/copilot-api-issues/issues",Zo=zo(" ─────────────────────────────────────────────────────────────");function Qo(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function en(e){return e&&0!==e.length?e.join("·"):"—"}const tn=[{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"},{title:"We Were About to Buy an Automation Platform. We Already Had One.",teaser:"Governance spirals over n8n. The answer was already deployed.",url:"https://barazany.dev/blog/we-already-had-the-automation-platform"}];function on(e){if(0===e.length)return[];let t=["",Zo,` ${Lo("BARAZANY.DEV")} ${zo("— Recent Posts")}`,Zo,""];for(let[o,n]of e.entries()){let e=Vo(`${n.url}${Xo}`,Lo(Wo(`[${o+1}]`)));t.push(` ${e} ${Go(n.title)}`,` ${zo("→")} ${zo(n.teaser)}`,"")}return t.push(Zo,` ${Vo(`https://barazany.dev/blog${Xo}`,"barazany.dev/blog")}`,Zo),t}function nn(e){let t=[];Y.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):Y.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearch?`Tavily ${Ko("✓")}`:zo("off"),n=["",` ${Lo("COPILOT-API")} ${zo(`v${e.version}`)}`,Zo,` ${zo("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${zo("User")} ${e.user} ${zo("·")} ${e.accountType}`];return Y._v1&&n.push(` ${zo("Client")} VSCode ${Y._v1}`),n.push(` ${zo("Network")} ${t.join(zo(" · "))}`,` ${zo("Search")} ${o}`),e.clipboardCopied&&n.push(` ${zo("Clipboard")} Claude Code command ${Ko("✓")}`),n.push(Zo),n}function rn(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Lo("Active")}`];if(e.model){let o=Y.models?.data.find(t=>t.id===e.model),n=Qo(o?.capabilities.limits?.max_context_window_tokens),r=en(o?.capabilities.supports.reasoning_effort);t.push(` ${Go(e.model.padEnd(32))} ${zo("ctx")} ${Lo(n.padStart(5))} ${zo("effort")} ${zo(r)} ${Jo("← main")}`)}if(e.smallModel){let o=Y.models?.data.find(t=>t.id===e.smallModel),n=Qo(o?.capabilities.limits?.max_context_window_tokens),r=en(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${zo("ctx")} ${n.padStart(5)} ${zo("effort")} ${zo(r)} ${Jo("← small")}`)}return t}function an(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of Y.models?.data??[]){let i=r.capabilities.limits?.max_context_window_tokens,a={id:r.id,ctx:i,effort:r.capabilities.supports.reasoning_effort};r.id.startsWith("text-embedding")?n.push(a):"Anthropic"===r.vendor?e.push(a):"Google"===r.vendor?o.push(a):t.push(a)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${Lo(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,i=n?Go("●"):zo("·"),a=n?Go(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?Qo(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${en(r.effort)}`;t.push(` ${i} ${a} ${zo(s)}${zo(l)}`)}}return t}function sn(){let e=Yo.replace(/^https:\/\//,""),t=Vo(`${Yo}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Zo,` ${Lo("FOUND A BUG?")} ${zo("— Report it on GitHub")}`,Zo,"",` ${Go("→")} ${Go(t)}`,` ${zo("Bug reports, feature requests, and questions welcome.")}`,"",Zo]}function ln(e){if(!e.endpoints)return[];let{scheme:t,port:o,hostname:n}=e.endpoints,r=n?`${t}://${n}:${o}`:`${t}://<your-tailscale-hostname>:${o}`,i=["",Zo,` ${Lo("Claude Cowork")} ${zo("— Settings → Inference Provider")}`,Zo,"",` ${zo("Paste into")} ${Lo("inferenceGatewayBaseUrl")}${zo(":")}`,` ${Lo(Go(r))}`];return n||i.push("",` ${zo("Your Tailscale hostname is shown by:")} ${Go("tailscale status --self")}`),i.push("",` ${zo("Docs:")} ${Go("https://claude.com/docs/cowork/3p/installation")}`),i}function cn(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Zo,` ${Lo("HTTPS")} ${zo("— self-signed cert")}`,Zo,"",` ${zo("Cert")} ${t}`];switch(o.push("",` ${Lo("Trust this cert")} ${zo("(one-time setup)")}`),g.platform){case"darwin":o.push(` ${zo("macOS:")}`,` ${Go("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Go(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${zo("Windows (PowerShell as Administrator):")}`,` ${Go(`Import-Certificate -FilePath "${t}" \``)}`,` ${Go("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${zo("Linux (Debian/Ubuntu):")}`,` ${Go(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Go("sudo update-ca-certificates")}`,` ${zo("Linux (Fedora/RHEL/Arch):")}`,` ${Go(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Go("sudo update-ca-trust")}`);break;default:o.push(` ${zo("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${zo("Or, for Node CLIs only (no admin needed):")}`,` ${Go(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Zo),o}function un(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 pn=s.join(J.APP_DIR,"certs"),dn=s.join(pn,"cert.pem"),mn=s.join(pn,"key.pem"),fn=s.join(pn,"cert.meta.json");async function hn(e){try{return await i.readFile(e,"utf8")}catch{return}}async function gn(e){let t=await hn(dn),o=await hn(mn),n=await async function(){let e=await hn(fn);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 i=Date.parse(n.notAfter);return!Number.isNaN(i)&&i-Date.now()>2592e6}function _n(e){return 0!==D(e)}async function yn(e){await i.mkdir(pn,{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"]),a=new Set(n);for(let t of e)_n(t)?a.add(t):r.add(t);let s=await H([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:o,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:[...[...r].map(e=>({type:2,value:e})),...[...a].map(e=>({type:7,ip:e}))]}]});return await i.writeFile(dn,s.cert,{mode:420}),await i.writeFile(mn,s.private,{mode:384}),await async function(e){await i.writeFile(fn,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...a].sort(),notAfter:o.toISOString()}),{cert:s.cert,key:s.private,certPath:dn,keyPath:mn,generated:!0}}function kn(e){try{!function(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),i=t.res.status,a=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",i),n.setAttribute("copilot_api.model",a),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens),e.estimatedCost&&n.setAttribute("copilot_api.estimated_cost",e.estimatedCost)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();Le.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),i>=400&&n.setStatus({code:c.ERROR,message:`HTTP ${i}`})}(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:i,requestId:a}=e,s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:i};if(ue.add(1,d),Ce.record(s,d),c>=400&&pe.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:i};e.inputTokens&&(de.add(e.inputTokens,t),qe.record(e.inputTokens,t)),e.outputTokens&&(me.add(e.outputTokens,t),je.record(e.outputTokens,t)),e.cachedTokens&&fe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&te.executeCompletion(a)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const bn=1048576;const wn=async()=>se.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),He.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),$e.add(1,{result:"rejected"}),new yt("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),$e.add(1,{result:"approved"})}finally{e.end()}}),vn=3e-6,xn=15e-6;function $n(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,estimatedCost:t*vn+o*xn,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function Tn(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 An=[{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"}],Sn="claude-haiku-4.5",Cn={haiku:Sn,"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 En(e,t){let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.includes(e))return e}let i=function(e){for(let t of An)if(t.pattern.test(e))return t.family;return null}(n);if(!i)return null;let a=n.replace(/-\d{8}(?::.*)?$/,""),s=r?`-${r}`:"";for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,""),o=`${a}${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=Cn[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}(i,t,r)}const On=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function In(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=On.get(o);if(void 0===n)return t[0]??null;let r=null,i=1/0;for(let e of t){let t=On.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<i&&(i=o,r=e)}return r}var Pn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function Nn(e){if(!e||"string"!=typeof e)throw new Pn("Model name is required and must be a string");if(!Y.models?.data)throw new Pn("Models not available. Please try again later.",503);let t=Y.models.data.map(e=>e.id);if(t.includes(e))return e;let o=En(e,t);if(!o)throw ge.add(1,{requested_model:e}),new Pn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}async function Rn(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return se.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 i=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute("copilot_api.rate_limit.elapsed_seconds",i),i>t)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let a=Math.ceil(t-i);if(n.setAttribute("copilot_api.rate_limit.wait_seconds",a),!e.rateLimitWait)throw n.setAttribute("copilot_api.rate_limit.action","rejected"),he.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new yt("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*a;n.setAttribute("copilot_api.rate_limit.action","waited"),he.add(1,{action:"waited",source:"local"}),Ie.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await It(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function qn(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 jn(e,t,o){return Math.min(Math.max(e,t),o)}function Dn(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 Dn(JSON.parse(r),t+1)}catch{return null}}function Hn(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=qn(o.capabilities.supports.min_thinking_budget),r=qn(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:qn(o.capabilities.limits?.max_output_tokens)??void 0}}function Mn(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=jn(qn(e.requestedBudget)??o,o,n),i=qn(e.maxTokens);if(i||=r+1,t.maxOutputTokens&&i>t.maxOutputTokens&&(i=t.maxOutputTokens),i<=r){let e=Math.min(r,i-1);if(e>=o)r=e;else{let e=o+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:i};i=e,r=o}}return i<=r?{thinkingBudget:null,maxTokens:i}:{thinkingBudget:r,maxTokens:i}}function Bn(e,t){if(Pt(e.thinking_budget))return e;let o=Hn(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Mn({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 Fn(e){return"invalid_thinking_budget"===Dn(e)}async function Un(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(Pt(t.thinking_budget)||!(o instanceof Error))return null;let i,a,s=o;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==r)i=r;else try{i=await s.response.clone().text()}catch{return null}try{a=JSON.parse(i)}catch{return null}if(!Fn(a))return null;let l=Hn(n,t.model);return l?function(e,t){let o=Mn({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=qn(e.thinking_budget);if(r&&r===o.thinkingBudget){let e=n+1;e<=t.bounds.max&&(!o.maxTokens||e<o.maxTokens)&&(n=e)}let i=o.maxTokens;if((!i||i<=n)&&(i=n+1),t.maxOutputTokens&&i>t.maxOutputTokens){if(!(t.maxOutputTokens>n))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};i=t.maxOutputTokens}return{...e,max_tokens:i,thinking_budget:n}}(t,l):{...t,thinking_budget:void 0}}function Ln(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)}async function zn(){return new Promise(e=>setTimeout(e,100))}function Gn(e){if("string"==typeof e)return function(e){let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],i=r.match(/^\[[0-9;]*[a-z]/i);t+=i?r.slice(i[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}(e);if(Array.isArray(e))return e.map(e=>Gn(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?Gn(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}async function Kn(e,t,o){try{if(!e.ok)throw new yt("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&&Tn(t,n.usage),n}catch(e){throw Be(t,e),e}finally{t.end()}}const Jn=async e=>{let t=Gn(e);try{return await Wn(t)}catch(e){if(e instanceof yt&&401===e.response.status)return await Et(),Wn(t);let n;if(e instanceof yt)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Un({payload:t,error:e,models:Y.models,errorBodyText:n});if(r)return e instanceof yt&&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 Wn(Gn(r));throw e}},Wn=async e=>{if(!Y._t1)throw Error("Service token not found");let t=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),n=e.messages.some(e=>["assistant","tool"].includes(e.role)),r={...tt(Y,t),"X-Initiator":n?"agent":"user"},i=et(Y),a=`${i}/chat/completions`,s=Y.timeoutMs,l=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t))return{...e};let{max_tokens:o,...n}=e;return null==o?{...n}:{...n,max_completion_tokens:o}}(e,Y.models),c=JSON.stringify(l),u={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":s,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":e.max_tokens??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":n?"agent":"user"};for(let t=0;t<=1;t++){let n=Ho(i),l=new AbortController,p=setTimeout(()=>l.abort(),s);try{let{statusCode:o,headers:i,body:p,span:d}=await Ke({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:r,body:c,signal:l.signal,headersTimeout:s,bodyTimeout:3*s,extraAttributes:{...u,"copilot_api.h2.retry_attempt":t},dispatcher:n}),m=new Response(p,{status:o,headers:i});if(e.stream){if(!m.ok)throw d.end(),new yt("Failed to create chat completions",m,{outgoingBody:c,outgoingHeaders:r});return{events:U(m),span:d,release:()=>Mo(n)}}try{return await Kn(m,d,{outgoingBody:c,outgoingHeaders:r})}finally{Mo(n)}}catch(e){if(Mo(n),Ln(e)&&t<1){o.warn(`HTTP/2 connection error during chat completions, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await zn();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function Vn(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 Xn(e){await Rn(Y);let t=await e.req.json();o.debug("Request payload:",JSON.stringify(t).slice(-400));try{t=function(e){return se.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Nn(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()}})}(t)}catch(t){if(t instanceof Pn)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(e.set("requestData",{model:t.model,streaming:!!t.stream}),Y.manualApprove&&await wn(),Pt(t.max_tokens)){let e=Y.models?.data.find(e=>e.id===t.model);t={...t,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(t.max_tokens))}t=Bn(t,Y.models),Pt(t.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(t.thinking_budget));let n=performance.now(),r=await Jn(t),i=performance.now()-n;if(Ee.record(i,{model:t.model,target:"chat_completions",streaming:String(!!t.stream)}),Yn(r)){let t=e.get("requestData")||{};return r.usage&&(t.tokenUsage=$n(r.usage)),t._d1=i,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(r)),e.json(r)}let{events:a,span:s,release:l}=r;return F(e,async o=>{let n={value:null},r=0,c=performance.now();try{try{for await(let s of a){let a=s;s.data&&"[DONE]"!==s.data&&(r++,xe.add(1,{model:t.model,endpoint_type:"openai"}),a=Vn(s,t=>{n.value=t;let o=e.get("requestData")||{};o.tokenUsage=$n(t),o._d1=i,e.set("requestData",o)})),await o.writeSSE(a)}let s=performance.now()-c,l={model:t.model,endpoint_type:"openai"};if(Oe.record(s,l),De.record(r,l),n.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=$n(n.value),t._d1=i,e.set("requestData",t))}}catch(t){throw Fe(s,e.get("requestSpan"),t),t}finally{n.value&&Tn(s,n.value),s.end(),l()}let u=e.get("requestId");u&&te.executeCompletion(u)}finally{e.get("resolveStreamComplete")?.()}})}const Yn=e=>Object.hasOwn(e,"choices"),Zn=new M;Zn.post("/",async e=>{try{return await Xn(e)}catch(t){return await Tt(e,t)}});const Qn=new M;Qn.post("/",async e=>{try{let t=await e.req.json();try{t.model=Nn(t.model)}catch(t){if(t instanceof Pn)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=performance.now(),n=await(async e=>{if(!Y._t1)throw Error("Service token not found");let t=`${et(Y)}/embeddings`,o=tt(Y),n=Y.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),n),a=JSON.stringify(e);try{let{response:n,span:i}=await Ge({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:a,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 yt("Failed to create embeddings",n,{outgoingBody:a,outgoingHeaders:o});return await n.json()}catch(e){throw Be(i,e),e}finally{i.end()}}finally{clearTimeout(i)}})(t),r=performance.now()-o;Ee.record(r,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=$n(n.usage),i._d1=r,e.set("requestData",i),e.json(n)}catch(t){return await Tt(e,t)}});const er=new M;let tr=null,or=null;er.get("/",async e=>{let t,o=function(){let e=Y._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=tr;return t&&e-t.timestamp<3e4?{result:t.result}:or||(or=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${et(Y)}/models`,n=await fetch(t,{method:"GET",headers:tt(Y),signal:e.signal}),r=Math.round(performance.now()-o),i=n.ok?"reachable":"unreachable";return tr={result:i,timestamp:Date.now()},{result:i,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return tr={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),or=null}})(),or)}();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.31.0",timestamp:(new Date).toISOString()};void 0!==n.latencyMs&&(r.upstream_latency_ms=n.latencyMs);let i="ok"===t?200:503;return e.json(r,i)});const nr=new L(G),rr={...z["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function ir(e){return nr.encode(e).length}function ar(e){let t=0;for(let o of e)switch(o.type){case"text":t+=ir(o.text)*rr.contentMultiplier;break;case"tool_use":t+=ir(o.name+JSON.stringify(o.input))*rr.contentMultiplier;break;case"tool_result":o.content&&(t+=ir("string"==typeof o.content?o.content:JSON.stringify(o.content))*rr.contentMultiplier);break;case"thinking":t+=ir(o.thinking)*rr.contentMultiplier;break;case"image":t+=1600}return t}function sr(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?rr.perFirstProp:rr.perAdditionalProp,t+=ir(o),r.description&&(t+=rr.perPropDesc+ir(r.description)),r.enum&&Array.isArray(r.enum)){t+=rr.perEnum;for(let e of r.enum)t+=ir(String(e))}if("object"===r.type&&r.properties&&(t+=rr.perNestedObject,t+=sr(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=rr.perArrayOfObjects,t+=sr(e))}}return t}function lr(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 cr(e,t,o){let n=lr(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const ur=async(e,t,n)=>{try{return await dr(e,t)}catch(r){if(r instanceof yt&&401===r.response.status)return await Et(),dr(e,t);if(r instanceof yt&&400===r.response.status&&n?.onStructuredOutputFallback){let i;try{i=await r.response.clone().text()}catch{i=void 0}let a=n.onStructuredOutputFallback(e,i);if(a)return o.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${a.model}`),dr(a,t)}throw r}};function pr(e){return e.context_management?["context-management-2025-06-27"]:[]}const dr=async(e,t)=>{if(!Y._t1)throw Error("Service token not found");let{metadata:n,...r}=Gn(e),i={...nt(Y,t,pr(r)),"X-Initiator":"agent"},a=et(Y),s=`${a}/v1/messages`,l=Y.timeoutMs,c=JSON.stringify(r),u=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",...lr(e,t?.anthropicBeta)}}(r,t,l);for(let e=0;e<=1;e++){let t=Ho(a),p=new AbortController,d=setTimeout(()=>p.abort(),l);try{let{statusCode:o,headers:n,body:a,span:d}=await Ke({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:i,body:c,signal:p.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(a,{status:o,headers:n});if(!m.ok)throw d.end(),new yt("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:i});if(r.stream)return{events:U(m),span:d,release:()=>Mo(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&&Tn(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(),Mo(t)}}catch(n){if(Mo(t),Ln(n)&&e<1){o.warn(`HTTP/2 connection error during anthropic messages, retrying (attempt ${e+1}): ${n instanceof Error?n.message:String(n)}`),await zn();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function mr(e,t,o){try{if(!e.ok)throw new yt("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&&Tn(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens}),n}catch(e){throw Be(t,e),e}finally{t.end()}}const fr=async e=>{try{return await hr(e)}catch(t){if(t instanceof yt&&401===t.response.status)return await Et(),hr(e);throw t}},hr=async e=>{if(!Y._t1)throw Error("Service token not found");let t=Gn(e),n={...tt(Y),"X-Initiator":"agent"},r=et(Y),i=`${r}/responses`,a=Y.timeoutMs,s=JSON.stringify(t),l={"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 c=Ho(r),u=new AbortController,p=setTimeout(()=>u.abort(),a);try{let{statusCode:o,headers:r,body:p,span:d}=await Ke({spanName:"copilot POST /responses",url:i,target:"responses",headers:n,body:s,signal:u.signal,headersTimeout:a,bodyTimeout:3*a,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:c}),m=new Response(p,{status:o,headers:r});if(t.stream){if(!m.ok)throw d.end(),new yt("Failed to create responses",m,{outgoingBody:s,outgoingHeaders:n});return{events:U(m),span:d,release:()=>Mo(c)}}try{return await mr(m,d,{outgoingBody:s,outgoingHeaders:n})}finally{Mo(c)}}catch(t){if(Mo(c),Ln(t)&&e<1){o.warn(`HTTP/2 connection error during responses, retrying (attempt ${e+1}): ${t instanceof Error?t.message:String(t)}`),await zn();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},gr=new Set(["low","medium","high","max","xhigh"]);function _r(e,t,n){let r=t.includes(e.model)?e.model:En(e.model,t)??e.model,i=r===e.model?e:{...e,model:r},a=function(e,t,o={}){let n=En(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}(i.model,t,{context1m:n.context1m,effort:i.output_config?.effort}),s=i;if(a&&a!==i.model){o.debug(`Resolved model variant: ${i.model} → ${a}`);let e=d.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",i.model),e?.setAttribute("copilot_api.model.variant_resolved_to",a),s={...i,model:a}}return function(e){let t=e.output_config?.effort;if(!t)return e;let n=Y.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=In(t,n);if(!r||!gr.has(r))return e;let i=r;if(i===t)return e;o.debug(`Effort clamp: ${t} → ${i}`);let a=d.getActiveSpan();return a?.setAttribute("copilot_api.effort.requested",t),a?.setAttribute("copilot_api.effort.clamped_to",i),{...e,output_config:{...e.output_config,effort:i}}}(s)}function yr(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function kr(e,t){let o={model:e.model,messages:br(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:Tr(e.tools),tool_choice:Ar(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Hn(t,o.model);if(r){let i="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=qn(t),i=r&&r>1?r-1:o.min;return jn(Math.min(n,i),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Bn({...o,thinking_budget:i},t)}}return o}function br(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:wr(e)}]:[{role:"system",content:wr(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:$r(e.content)});n.length>0&&t.push({role:"user",content:$r(n)})}else t.push({role:"user",content:$r(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:xr(e.reasoning_text),reasoning_opaque:xr(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:$r(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),i=[...n.map(e=>e.text),...r.map(e=>e.thinking)].join("\n\n");return o.length>0?[{role:"assistant",content:i||null,...t,tool_calls:o.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:"assistant",content:$r(e.content),...t}]}(e));return[...o,...n]}function wr(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const vr=32768;function xr(e){if("string"==typeof e)return e.length<=vr?e:e.slice(0,vr)}function $r(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 Tr(e){if(e)return e.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Ar(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 Sr(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 Cr(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Er(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 Or=new Set(["low","medium","high","max","xhigh"]);function Ir(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&&Or.has(e)?e:null)(In(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 Pr(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 Nr=/[^\w-]/g;function Rr(e){return e.replaceAll(Nr,"_")}function qr(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,...i}=e.output_config;if(0===Object.keys(i).length){let{output_config:t,...o}=e;return o}return{...e,output_config:i}}(e,t);return o=Ir(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 i=(!1===e.stream?r.max_non_streaming_output_tokens:void 0)??r.max_output_tokens;if("number"!=typeof i||i<=0)return e;let a=Math.max(Math.min(o,i),16);return a===o?e:{...e,max_tokens:a}}(o,t),o={...o,system:Pr(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:Rr(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Rr(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function jr(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 Dr(e){let t={model:e.model,input:Mr(e.messages),max_output_tokens:Math.max(e.max_tokens,16),stream:e.stream,temperature:e.temperature,top_p:e.top_p,store:!1,user:e.metadata?.user_id?.slice(0,64)},o=function(e){return e?function(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}("string"==typeof e?e:e.map(e=>e.text).join("\n\n")):null}(e.system);return o&&(t.instructions=o),e.tools?.length&&(t.tools=e.tools.map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(t.tool_choice=function(e){switch(e.type){case"auto":return"auto";case"any":return"required";case"none":return"none";case"tool":return e.name?{type:"function",name:e.name}:void 0;default:return}}(e.tool_choice)),"adaptive"===e.thinking?.type?t.reasoning={effort:Hr(e.output_config?.effort??"high")}:"enabled"===e.thinking?.type&&e.thinking.budget_tokens&&(t.reasoning=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens)),t}function Hr(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Mr(e){let t=[];for(let o of e)"user"===o.role?t.push(...Br(o)):t.push(...Ur(o));return t}function Br(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(Fr(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)"text"===t.type?e.push({type:"input_text",text:t.text}):e.push({type:"input_image",image_url:`data:${t.source.media_type};base64,${t.source.data}`});t.push({type:"message",role:"user",content:e})}else{let e=n.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n");e&&t.push({type:"message",role:"user",content:e})}return t}function Fr(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 Ur(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),i=[...o.map(e=>e.text),...n.map(e=>e.thinking)].join("\n\n");i&&t.push({type:"message",role:"assistant",content:i});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 Lr(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 zr(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Gr(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 Kr(e,t){let o=[];switch(e.type){case"response.created":Gr(t,o,{responseId:e.response.id,model:e.response.model});break;case"response.in_progress":case"response.output_text.done":case"response.function_call_arguments.done":case"response.refusal.done":case"response.reasoning_summary_text.delta":case"response.reasoning_summary_text.done":default:break;case"response.output_item.added":if("function_call"===e.item.type){Gr(t,o),zr(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":Gr(t,o),zr(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":zr(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":{zr(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:Lr(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":{Gr(t,o),zr(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":Gr(t,o),zr(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":Gr(t,o),zr(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":Gr(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 Jr(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 Wr(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Vr(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&&(Jr(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&&(Jr(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Wr(t,o)),r.content&&(Wr(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){Wr(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&&(Wr(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:yr(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 Xr=/structured_outputs|output_config\.format/i;function Yr(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&Xr.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?qr({...e,model:Sn},o):null}var Zr=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};async function Qr(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 i=new AbortController,a=setTimeout(()=>i.abort(),15e3);try{let{response:t,span:a}=await Ge({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:i.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw o.error(`Tavily API error (${e.status}):`,t),Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return a.setAttribute("tavily.results_count",e.results.length),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw Be(a,e),e}finally{a.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Zr:e}finally{clearTimeout(a)}}function ei(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function ti(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function oi(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return{maxResults:"number"==typeof t?.max_uses?t.max_uses:5,allowedDomains:t?.allowed_domains,blockedDomains:t?.blocked_domains}}(t);o.info(`Web search intercepted: "${n}"`);let i,a=[],s=!1;try{let e=Y.tavilyApiKey;if(!e)throw s=!0,i="unavailable",Error("No Tavily API key configured");a=(await Qr(e,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("Tavily search failed:",e),s=!0,i??="unavailable"}let l={query:n,results:a,model:t.model,searchFailed:s,errorCode:i};if(!t.stream)return e.set("requestData",{model:t.model,streaming:!1}),e.json(function(e){let{query:t,model:o}=e,n=`srvtoolu_${ei()}`,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:ti(e)}];return{id:`msg_tavily_${ei()}`,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_${ei()}`,r=`msg_tavily_${ei()}`,i=[];return i.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:ti(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"}),i}(l);return e.set("requestData",{model:t.model,streaming:!0}),F(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}async function ni(e){let t=await e.req.json();if(function(e){let t=e.tools;if(!t||1!==t.length)return!1;let o=t[0].type;return"string"==typeof o&&o.startsWith("web_search")}(t))return oi(e,t);await Rn(Y),o.debug("Anthropic request payload:",t),t=function(e,t){return _r(t,Y.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let r=function(e,t){return se.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),cr(n,t,e.req.header("anthropic-beta"));let r=Nn(t.model);n.setAttribute("copilot_api.model.normalized",r);let i=jr(t);return i?(d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:i}},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 Pn)return d.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:t.message}},t.statusCode)};throw t}finally{n.end()}})}(e,t);if(!r.ok)return r.response;if(t=r.payload,!Y._t1&&!await async function(){return!!Y._t1||(await Ut(1,0,"on-demand"),!!Y._t1)}())return d.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503);if(function(e){return/gpt-[\d.]+-codex/i.test(e)}(t.model))return async function(e,t){let r=performance.now(),i=se.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),Dr(t)}finally{e.end()}});Pe.record(performance.now()-r,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",i),e.set("requestData",{model:i.model,streaming:!!i.stream}),Y.manualApprove&&await wn();let a=performance.now(),s=await fr(i),l=performance.now()-a;if(Ee.record(l,{model:i.model,target:"responses",streaming:String(!!i.stream)}),ai(s)){let t=e.get("requestData")||{};if(s.usage&&(t.tokenUsage=$n({prompt_tokens:s.usage.input_tokens,completion_tokens:s.usage.output_tokens,total_tokens:s.usage.total_tokens})),t._d1=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(),i=se.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{return e.setAttribute("copilot_api.translation.direction","responses_to_anthropic"),function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:Lr(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 Pe.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(i)}o.debug("Streaming Responses API response");let{events:c,span:u,release:p}=s;return F(e,async t=>{let n=null,r=0,a=performance.now(),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let a of c){if(o.debug("Responses API raw stream event:",a),!a.data)continue;let c;try{c=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}r++,xe.add(1,{model:i.model,endpoint_type:"responses"});let u=ri(c);if(u){n=u;let t=e.get("requestData")||{};t.tokenUsage=$n(n),t._d1=l,e.set("requestData",t)}let p=Kr(c,s);for(let e of p)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let u=performance.now()-a,p={model:i.model,endpoint_type:"responses"};Oe.record(u,p),De.record(r,p)}catch(t){throw Fe(u,e.get("requestSpan"),t),t}finally{n&&Tn(u,n),u.end(),p()}let d=e.get("requestId");d&&te.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t){let o=qr(t,Y.models),n={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")};return e.set("requestData",{model:o.model,streaming:!!o.stream}),Y.manualApprove&&await wn(),se.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",o.model),t.setAttribute("copilot_api.streaming",!!o.stream),cr(t,o,n.anthropicBeta);try{let r=performance.now(),i=await ur(o,n,{onStructuredOutputFallback:(e,o)=>{let n=Yr(e,o,Y.models);return n&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",n.model)),n}}),a=performance.now()-r;if(Ee.record(a,{model:o.model,target:"anthropic_messages",streaming:String(!!o.stream)}),!o.stream){let o=i,n=o.usage;if(n){let t={input_tokens:n.input_tokens||0,output_tokens:n.output_tokens||0,cache_read_input_tokens:n.cache_read_input_tokens||0,cache_creation_input_tokens:n.cache_creation_input_tokens||0},o=e.get("requestData")||{};o.tokenUsage=$n(si(t)),o._d1=a,e.set("requestData",o)}return t.end(),e.json(o)}let{events:s,span:l,release:c}=i;return F(e,async n=>{let i=0,a=performance.now(),u={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1;try{try{for await(let e of s)e.data&&"[DONE]"!==e.data?(i++,xe.add(1,{model:o.model,endpoint_type:"anthropic_messages"}),li(e.data,u)&&(p=!0),await n.writeSSE(e)):await n.writeSSE(e);let e=performance.now()-a,t={model:o.model,endpoint_type:"anthropic_messages"};Oe.record(e,t),De.record(i,t)}finally{if(p){let t=si(u);Tn(l,t);let o=e.get("requestData")||{};o.tokenUsage=$n(t),o._d1=performance.now()-r,e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&te.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Be(t,e),t.end(),e}})}(e,t);let i=performance.now(),a=se.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),kr(t,Y.models)}finally{o.end()}});Pe.record(performance.now()-i,{direction:"anthropic_to_openai"}),a=Bn(a,Y.models),o.debug("Translated OpenAI request payload:",a),e.set("requestData",{model:a.model,streaming:!!a.stream});let s=performance.now();Y.manualApprove&&await wn();let l=await Jn(a),c=performance.now()-s;if(Ee.record(c,{model:a.model,target:"chat_completions",streaming:String(!!a.stream)}),ii(l)){let t=e.get("requestData")||{};l.usage&&(t.tokenUsage=$n(l.usage)),t._d1=c,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(l).slice(-400));let r=performance.now(),i=se.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 i of e.choices){let e=Cr(i.message),a=Sr(i.message.content),s=Er(i.message.tool_calls);t.push(...e),o.push(...a),n.push(...s),("tool_calls"===i.finish_reason||"stop"===r)&&(r=i.finish_reason)}return{id:e.id,type:"message",role:"assistant",model:e.model,content:[...t,...o,...n],stop_reason:yr(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(l);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 Pe.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",i),e.json(i)}o.debug("Streaming response from service");let{events:u,span:p,release:m}=l;return F(e,async t=>{let n=null,r=0,i=performance.now(),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let i of u){if(o.debug("Raw stream event:",i),"[DONE]"===i.data)break;if(!i.data)continue;let l;try{l=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}if(r++,xe.add(1,{model:a.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=$n(n),t._d1=c,e.set("requestData",t)}let u=Vr(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()-i,p={model:a.model,endpoint_type:"anthropic"};if(Oe.record(l,p),De.record(r,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=$n(n),t._d1=c,e.set("requestData",t))}}catch(t){throw Fe(p,e.get("requestSpan"),t),t}finally{n&&Tn(p,n),p.end(),m()}let l=e.get("requestId");l&&te.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}function ri(e){if("response.completed"!==e.type&&"response.incomplete"!==e.type)return null;let t=e.response.usage;return t?{prompt_tokens:t.input_tokens,completion_tokens:t.output_tokens,total_tokens:t.total_tokens}:null}const ii=e=>Object.hasOwn(e,"choices"),ai=e=>Object.hasOwn(e,"output");function si(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 li(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}const ci=new M;ci.post("/",async e=>{try{return await ni(e)}catch(t){return await Tt(e,t)}});const ui=new M;function pi(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=$n(o),n._d1=t._d1,t.c.set("requestData",n)}ui.get("/",async e=>{try{Y.models||await Nt();let t=Y.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 Tt(e,t)}});const di=new Set(["message","function_call","function_call_output"]),mi=new Set(["type","name","description","parameters"]);async function fi(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||!Y.tavilyApiKey)&&(o.info(`Enriching web search: "${n}"`),e.sources=(await Qr(Y.tavilyApiKey,n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function hi(e){if(Y.tavilyApiKey)try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await fi(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function gi(e){if(!Y.tavilyApiKey)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 fi(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function _i(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 yi(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&&_i(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)_i(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function ki(e){return null!=e}function bi(e){let t=e.input,o="string"==typeof t?t:t.map(e=>function(e){switch(e.type){case"custom_tool_call":{let t=e.input;return{type:"function_call",call_id:e.call_id,name:e.name,arguments:JSON.stringify("string"==typeof t?{input:t}:t)}}case"custom_tool_call_output":return{type:"function_call_output",call_id:e.call_id,output:e.output};default:return di.has(e.type)||"web_search_call"===e.type?e:null}}(e)).filter(e=>null!==e),n={model:e.model,input:o};for(let t of["instructions","max_output_tokens","temperature","top_p","stream","store","tool_choice","parallel_tool_calls","user"])ki(e[t])&&(n[t]=e[t]);let r=new Set;if(ki(e.tools)){let t=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let o=e.type;if("web_search"===o||o.startsWith("web_search_"))return{type:e.type};let n={};for(let t of Object.keys(e))mi.has(t)&&(n[t]=e[t]);return"custom"===n.type&&(n.type="function",t.add(n.name),n.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),n}),customToolNames:t}}(e.tools);n.tools=t.tools,r=t.customToolNames}if(ki(e.reasoning)&&"object"==typeof e.reasoning){let t=e.reasoning;n.reasoning={},ki(t.effort)&&(n.reasoning.effort=t.effort),ki(t.summary)&&(n.reasoning.summary=t.summary)}if(ki(e.text)&&"object"==typeof e.text){let t=e.text;ki(t.format)&&(n.text={format:t.format})}return{payload:n,customToolNames:r}}async function wi(e){await Rn(Y);let{payload:t,customToolNames:n}=bi(await e.req.json()),r=t;o.debug(`Responses API [${Array.isArray(r.input)?r.input.length:1} items]`),n.size>0&&o.debug(`Custom tools detected: ${[...n].join(", ")}`);try{r=function(e){return se.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=Nn(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()}})}(r)}catch(t){if(t instanceof Pn)return e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:r.model,streaming:!!r.stream}),Y.manualApprove&&await wn();let i=performance.now(),a=await fr(r),s=performance.now()-i;if(Ee.record(s,{model:r.model,target:"responses",streaming:String(!!r.stream)}),vi(a))return async function(e,t,o){await hi(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=$n({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n._d1=o,e.set("requestData",n),e.json(t)}(e,a,s);let{events:l,span:c,release:u}=a;return F(e,async t=>{let o={value:null},i=0,a=performance.now();try{try{for await(let a of l)if(a.data&&"[DONE]"!==a.data){i++;let l=yi(a.data,n);l=await gi(l);let c=l===a.data?a:{...a,data:l};xe.add(1,{model:r.model,endpoint_type:"responses"}),pi(l,{usageRef:o,c:e,_d1:s}),await t.writeSSE(c)}else await t.writeSSE(a);let c=performance.now()-a,u={model:r.model,endpoint_type:"responses"};Oe.record(c,u),De.record(i,u)}catch(t){throw Fe(c,e.get("requestSpan"),t),t}finally{o.value&&Tn(c,o.value),c.end(),u()}let p=e.get("requestId");p&&te.executeCompletion(p)}finally{e.get("resolveStreamComplete")?.()}})}const vi=e=>Object.hasOwn(e,"output"),xi=new M;xi.post("/",async e=>{try{return await wi(e)}catch(t){return await Tt(e,t)}});const $i=new M;$i.get("/",e=>{try{return Y.showToken?e.json({token:Y._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 Ti=new M;Ti.get("/",async e=>{try{let t=await Jt();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Ai=new M;Ai.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,i=e.req.method,a=e.req.path,s=ct(a);e.set("requestId",r),e.header("x-request-id",r);let p=se.startSpan("copilot_api.handle_request",{kind:l.SERVER,attributes:{"http.method":i,"http.url":e.req.url,"http.route":a,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",p),e.set("requestTraceContext",p.spanContext());for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Le.has(e)||p.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:i}=t;if("POST"===n&&("anthropic"===i||"openai"===i||"embeddings"===i||r.includes("/responses")))try{let t=await e.req.raw.clone().text();e.set("rawBody",t.length>bn?t.slice(0,bn):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:i,path:a,endpointType:s});let m,f=new Promise(e=>{m=e});e.set("streamComplete",f),e.set("resolveStreamComplete",m);let h=d.setSpan(u.active(),p);await u.with(h,async()=>{te.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw p.setStatus({code:c.ERROR,message:t.message}),p.recordException(t),e}});let g=e.get("requestData"),_={c:e,start:n,method:i,path:a,endpointType:s,requestId:r,span:p};g?.streaming&&e.res.status<400?f.then(()=>kn(_)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{p.recordException(t),p.setStatus({code:c.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{p.end()}catch{}}):kn(_)}),Ai.use(B()),Ai.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()}),Ai.get("/",e=>e.text("Server running")),Ai.route("/health",er),Ai.route("/chat/completions",Zn),Ai.route("/models",ui),Ai.route("/embeddings",Qn),Ai.route("/usage",Ti),Ai.route("/token",$i),Ai.route("/v1/chat/completions",Zn),Ai.route("/v1/models",ui),Ai.route("/v1/embeddings",Qn),Ai.route("/v1/messages",ci),Ai.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=rr.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=rr.perMessage+ir(e)*rr.contentMultiplier}for(let e of t.messages)o+=rr.perMessage,o+=ir(e.role),"string"==typeof e.content?o+=ir(e.content)*rr.contentMultiplier:Array.isArray(e.content)&&(o+=ar(e.content));return t.tools&&t.tools.length>0&&(o+=function(e){let t=rr.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=rr.perTool),t+=ir(n.name),n.description&&(t+=rr.perDesc+ir(n.description)),t+=sr(n.input_schema);return t}(t.tools)),e.json({input_tokens:Math.round(o)})}),Ai.route("/v1/responses",xi),Ai.route("/responses",xi);const Si=[],Ci=Date.now();let Ei="";function Oi(){let e=async(e,t=0)=>{let n=se.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()-Ci)/1e3}});for(let t of Si)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Vo("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Zo,` ${Lo("COPILOT-API")} ${zo(`v${e}`)} ${zo("·")} ${un(t)} uptime`,Zo,""," Check in from time to time on",` ${Go(o)}`,"",Zo,""];console.log(n.join("\n"))}(Ei,Date.now()-Ci),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 Ii(e){return e._t2?"cli_arg":g.env.GH_TOKEN?"env_var":"stored"}function Pi(e){let{options:t,version:o,runtime:n,_u1:r}=e,i=se.startSpan("copilot_api.server.startup",{kind:l.INTERNAL,attributes:Ue({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:Ii(t)},runtime:n,identity:{_u1:r.login,machineId:Y.machineId,sessionId:Y.sessionId,_v1:Y._v1},connectivity:Y.connectivity,modelsCount:Y.models?.data.length??0,startupDurationMs:Date.now()-Ci},"copilot_api")});if(Y.models?.data)for(let e of Y.models.data)i.addEvent("copilot_api.model.available",Ue(e,"model"));i.end(),Me(_.INFO,"INFO","Server started",Ue({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:Y.models?.data.length??0,startupDurationMs:Date.now()-Ci},"copilot_api"))}async function Ni(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[o,n]=await Promise.all([i.readFile(e,"utf8"),i.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 gn(e)){let e=await hn(dn),t=await hn(mn);if(e&&t)return{cert:e,key:t,certPath:dn,keyPath:mn,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),yn(e)}(e.httpsHosts)}}async function Ri(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=po;try{q(t),q(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(Oi(),Si.push(()=>{o.debug("Cleaning up connectivity monitor"),Je.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),qt&&=void clearInterval(qt),Dt&&=void Je.off("online",Dt),Ht&&=void Je.off("offline",Ht),jt=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),Ro&&=void clearInterval(Ro),qo&&=void clearInterval(qo);let e=[...Io.keys(),...Po];Io.clear(),Po.clear(),Oo.clear(),No=void 0;for(let t of e)jo(t)&&(Ae.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!oe)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([oe.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");Y.accountType=t.accountType,Y.manualApprove=t.manual,Y.rateLimitSeconds=t.rateLimit,Y.rateLimitWait=t.rateLimitWait,Y.showToken=t.showToken,Y.timeoutMs=t.timeout,Y.connectivity.timeoutMs=t.connectTimeout,t.tavilyApiKey&&(Y.tavilyApiKey=t.tavilyApiKey),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;Y.connectivity.h2=t,Y.connectivity.h2Keepalive=e}(),await W(),Y._v1="1.121.0-insider";let n=await ko();Ei=n;let r=bo();(function(e,t){t&&(re=t),ne=crypto.randomUUID();let o=v({[S]:"copilot-api",[C]:e,[A]:ne}),{endpoint:n,headers:r}=ae();oe=new T({resource:o,traceExporter:new w({url:`${n}/v1/traces`,headers:r}),metricReader:new $({exporter:new b({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new x(new k({url:`${n}/v1/logs`,headers:r}))],instrumentations:[]}),oe.start()})(n,Ci),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 i,a=t._t2||g.env.GH_TOKEN;a?(Y._t2=a,o.info("Using provided Auth token")):await Lt();try{i=await St(),await Qe(Y,i.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 At();Y._t1=e,o.debug("Service token fetched successfully!"),Y.showToken&&o.info("Service token:",e),qt=setInterval(()=>{Ut(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),Je.start(),Dt=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Ut(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},Ht=()=>{o.debug("Network connectivity lost")},Je.on("online",Dt),Je.on("offline",Ht)})(),await async function(){try{return await Nt(),!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(()=>{Nt().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{Nt().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)}}();Si.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),Y.connectivity.h2&&(Mo(Ho(et(Y))),Y.connectivity.h2Keepalive&&Fo()),Pi({options:t,version:n,runtime:r,_u1:i});let l=await Ni(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await async function(e,t,n){if(!e._cc1)return!1;let r,i;if(Y.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=Y.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,i=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:Y.models.data.map(e=>e.id)}),i=await o.prompt("Select a small model to use",{type:"select",options:Y.models.data.map(e=>e.id)})}let a=Uo({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:r,ANTHROPIC_SMALL_FAST_MODEL:i,NODE_EXTRA_CA_CERTS:n?.certPath},"claude");try{return m.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(a),!1}}(t,u,l)||await async function(e,t,n){if(!e.codex)return!1;let r;if(Y.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=Y.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:Y.models.data.map(e=>e.id)});let i=Uo({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return m.writeSync(i),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(i),!1}}(t,u,l);(function(e){let t=[...nn(e),...rn(e),...an(e),...sn(),"",...on(tn),...ln(e),...cn(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:o,runtime:n,user:r,clipboardCopied:i,tls:a}=e,s=a?"https":"http";return{version:o,runtime:n,user:r,accountType:t.accountType,port:t.port,timeout:t.timeout,webSearch:!!t.tavilyApiKey,model:t.model,smallModel:t.smallModel,clipboardCopied:i,https:a?{certPath:a.certPath,keyPath:a.keyPath,generated:a.generated,selfSigned:!t.httpsCert}:void 0,endpoints:t.claudeCowork?{scheme:s,port:t.port,hostname:await Qt()}:void 0}}({options:t,version:n,runtime:r,user:i.login,clipboardCopied:p,tls:l})),j({fetch:Ai.fetch,port:t.port,hostname:t.hostname,tls:l?{cert:l.cert,key:l.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(c,t.hostname,t.port)}function qi(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const ji=e({meta:{name:"start",description:"Start the API server"},args:{port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"Tavily API key for web search support (or set TAVILY_API_KEY env var)"},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"}},run({args:e}){let t=e["rate-limit"],o=void 0===t?void 0:qi(t,"--rate-limit"),n=e.timeout,r=void 0===n?X:qi(n,"--timeout"),i=e["connect-timeout"]??g.env.COPILOT_CONNECT_TIMEOUT_MS,a=void 0===i?15e3:qi(i,"--connect-timeout");if(a<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${a}`);let s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[];return Ri({port:qi(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:o,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:r,connectTimeout:a,tavilyApiKey:e["tavily-api-key"]||g.env.TAVILY_API_KEY,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"]})}});await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([ko(),Co()]);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 ${$o}@latest`,n=So("│"),r=` ${Ao("Update available!")} ${(e=>`${e}`)(e)} → ${(e=>`${e}`)(t)}`,i=` Run ${Ao(o)} to update`,a=" ".repeat(54),s=So(`╭${"─".repeat(54)}╮`),l=So(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${a}${n}`,`${n}${Eo(r,54)}${n}`,`${n}${a}${n}`,`${n}${Eo(i,54)}${n}`,`${n}${a}${n}`,l,""];console.log(c.join("\n"))}(e,t)}catch{}}(),await t(e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Kt,start:ji,"check-usage":Wt,debug:xo,"cowork-setup":yo}}));export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "copilot-api-node20",
3
- "version": "0.30.3",
3
+ "version": "0.31.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",