copilot-api-node20 0.28.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.mjs +1 -1
- package/package.json +1 -1
package/dist/main.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{defineCommand as e,runMain as t}from"citty";import o,{consola as n}from"consola";import r from"node:fs/promises";import i from"node:os";import a from"node:path";import{SpanKind as s,SpanStatusCode as l,context as c,metrics as u,trace as p}from"@opentelemetry/api";import d from"clipboardy";import{execFile as m,execSync as f}from"node:child_process";import h from"node:process";import{SeverityNumber as g,logs as _}from"@opentelemetry/api-logs";import{OTLPLogExporter as y}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as w}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as b}from"@opentelemetry/resources";import{BatchLogRecordProcessor as v}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as x}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as T,ATTR_SERVICE_NAME as A,ATTR_SERVICE_VERSION as S}from"@opentelemetry/semantic-conventions";import{Client as C,request as E}from"undici";import{createHash as O,randomBytes as I,randomUUID as P}from"node:crypto";import{promisify as N}from"node:util";import{accessSync as R}from"node:fs";import{serve as q}from"srvx";import{isIP as j}from"node:net";import{generate as D}from"selfsigned";import{Hono as M}from"hono";import{cors as H}from"hono/cors";import{streamSSE as F}from"hono/streaming";import{events as B}from"fetch-event-stream";import{Tokenizer as U,models as L}from"ai-tokenizer";import*as J from"ai-tokenizer/encoding/claude";const G=a.join(i.homedir(),".local","share","copilot-api"),K={APP_DIR:G,GITHUB_TOKEN_PATH:a.join(G,"github_token"),MACHINE_ID_PATH:a.join(G,"machine_id"),SESSION_ID_PATH:a.join(G,"session_id")};async function z(){await r.mkdir(K.APP_DIR,{recursive:!0}),await W(K.GITHUB_TOKEN_PATH),await W(K.SESSION_ID_PATH)}async function W(e){try{await r.access(e,r.constants.W_OK)}catch{await r.writeFile(e,""),await r.chmod(e,384)}}const V=6e5,X={accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:V,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}},Y=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),Z=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(!X.models)return"";let o=X.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(`↑${Y(o.inputTokens||0).padStart(5)} │ ↓${Y(o.outputTokens||0).padStart(5)}`,18),a=Y(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(" | ")}`:""},ee={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+=Z(i)),o.info(a),De(g.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(()=>ee.cleanup(),6e4);let te,oe,ne=Date.now();const re={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function ie(){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):re;return{endpoint:e.replace(/\/$/,""),headers:t}}const ae=p.getTracer("copilot-api"),se=u.getMeter("copilot-api"),le=_.getLogger("copilot-api"),ce=se.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),ue=se.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),pe=se.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),de=se.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),me=se.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),fe=se.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),he=se.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),ge=se.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),_e=se.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),ye=se.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),ke=se.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),we=se.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),be=se.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),ve=se.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),xe=se.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),$e=se.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Te=se.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Ae=se.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Se=se.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Ce=se.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Ee=se.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Oe=se.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Ie=se.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Pe=se.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Ne=se.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),Re=se.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),qe=se.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),je=se.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function De(e,t,o,n,r){let i=p.getActiveSpan()?.spanContext()??r;le.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...i&&{"trace.id":i.traceId,"span.id":i.spanId}}})}function Me(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:l.ERROR,message:o??n.message}),e.recordException(n)}function He(e,t,o){Me(e,o),t&&t!==e&&Me(t,o)}function Fe(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,Fe(r,e)))}return o}se.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!Ge.getConnectivityStats().isOnline)}),se.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(Ge.getConnectivityStats().consecutiveFailures)}),se.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(X.models?.data.length??0)}),se.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ee.completionCallbacks.size)}),se.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-ne)/1e3)});const Be=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","proxy-authorization"]);function Ue(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Be.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function Le(e){let{spanName:t,url:o,target:n,method:r="GET",headers:i,body:a,signal:c,extraAttributes:u}=e,p=ae.startSpan(t,{kind:s.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});i&&Ue(p,"request",i);try{let e=await fetch(o,{method:r,headers:i,body:a,signal:c});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();Be.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),be.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:l.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw Me(p,e),p.end(),e}}async function Je(e){let{spanName:t,url:o,target:n,method:r="POST",headers:i,body:a,signal:c,headersTimeout:u,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=ae.startSpan(t,{kind:s.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Ue(f,"request",i);try{let{statusCode:e,headers:t,body:s}=await E(o,{method:r,headers:i,body:a,signal:c,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&&!Be.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return be.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:l.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:s,span:f}}catch(e){throw Me(f,e),f.end(),e}}const Ge=new class extends EventTarget{isOnline=!0;lastChecked=(new Date).toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){o.debug("Starting connectivity monitor",{probeEndpoints:X.connectivity.probeEndpoints,fastInterval:X.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){o.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval)+Math.random()*X.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ae.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),X.connectivity.timeoutMs);try{let n=!1;for(let e of X.connectivity.probeEndpoints)try{let t=performance.now(),o=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...X.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Pe.record(r,{endpoint:e,result:"success"});break}Pe.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),ke.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"}),De(g.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"}),De(g.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,o.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*X.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:X.connectivity.jitterMaxMs>0,connectionPooling:X.connectivity.connectionPooling,dnsCache:X.connectivity.dnsCache}}},Ke=()=>({"content-type":"application/json",accept:"application/json"}),ze="0.48.1",We=`copilot-chat/${ze}`,Ve=`GitHubCopilotChat/${ze}`,Xe=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${K.MACHINE_ID_PATH}_${t}`})(e);try{let e=await r.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=O("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(I(16)),t.digest("hex")})(e);return await r.writeFile(t,o),await r.chmod(t,384),o},Ye=async(e,t)=>{e.machineId||=await Xe(t),e.sessionId||=await(async()=>{try{let e=await r.readFile(K.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=P();return await r.writeFile(K.SESSION_ID_PATH,e),await r.chmod(K.SESSION_ID_PATH,384),e})()},Qe=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,Ze=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=P(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":We,"User-Agent":Ve,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":P(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},et=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const tt=(e,t)=>{let o=Ze(e);if(delete o["Copilot-Integration-Id"],o["anthropic-version"]=t?.anthropicVersion??"2023-06-01",t?.anthropicBeta){let e=function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&et.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta);e&&(o["anthropic-beta"]=e)}return o},ot="https://api.github.com",nt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":We,"user-agent":Ve,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),rt="https://github.com",it="01ab8ac9400c4e429b23",at=["user:email"].join(" ");var st=class extends Error{response;constructor(e,t){super(e),this.response=t}};function lt(e){return e.req.path.startsWith("/v1/messages")}function ct(e,t){if(lt(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 ut(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 pt(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 dt(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}async function mt(e,t){if(t instanceof st&&429===t.response.status)return async function(e,t){let o=p.getActiveSpan(),n=e.get("requestId"),r=ee.completionCallbacks.get(n);r&&(ee.logRateLimit(r,t.response),ee.completionCallbacks.delete(n)),fe.add(1,{action:"rejected",source:"upstream"});let i=ct(await t.response.text(),e),a=ut(i);return o?.setStatus({code:l.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),pt(o,a),De(g.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...dt(a)}),e.json(i,429)}(e,t);if(t instanceof SyntaxError){p.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),De(g.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=lt(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 st)return async function(e,t){let n=p.getActiveSpan(),r=ct(await t.response.text(),e),i=ut(r);return o.error("HTTP error:",r),n?.setStatus({code:l.ERROR,message:t.message}),n?.recordException(t),n?.setAttribute("copilot_api.error_type","HTTPError"),pt(n,i),De(g.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...dt(i)}),e.json(r,t.response.status)}(e,t);let n=p.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:l.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),De(g.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name});let i=lt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(i,500)}const ft=async()=>{let e=`${ot}/copilot_internal/v2/token`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Le({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:nt(X),signal:o.signal});try{if(!t.ok)throw new st("Failed to get Service token",t);return await t.json()}catch(e){throw Me(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function ht(){let e=`${ot}/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Le({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${X._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new st("Failed to get GitHub user",t);return await t.json()}catch(e){throw Me(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let gt=null;function _t(){return gt||=ft().then(({token:e})=>{X._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{gt=null}),gt}const yt=async()=>{let e=`${Qe(X)}/models`,t=Ze(X),o=X.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),o);try{let{response:o,span:r}=await Le({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new st("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Me(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const kt=e=>new Promise(t=>{setTimeout(t,e)}),wt=e=>null==e;async function bt(){X.models=await(async()=>{try{return await yt()}catch(e){if(e instanceof st&&401===e.response.status)return await _t(),yt();throw e}})()}var vt=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let xt,$t,Tt,At,St=!1;const Ct=()=>r.readFile(K.GITHUB_TOKEN_PATH,"utf8"),Et=e=>r.writeFile(K.GITHUB_TOKEN_PATH,e,{mode:384});function Ot(e){let{span:t,error:n,reason:r,refreshStart:i,attempt:a}=e,s=n.response.status,c=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";X._t1=void 0,clearInterval(xt),xt=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${c}. Scheduled refresh halted. Re-authenticate to resume.`),_e.add(1,{reason:r,success:"false"}),ye.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:l.ERROR,message:n.message}),t.recordException(n),Ie.record(performance.now()-i,{reason:r}),De(g.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${c})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":a,"copilot_api.token_refresh.terminal_status":s})}function It(e){let{span:t,error:n,reason:r,refreshStart:i,maxRetries:a}=e;X._t1=void 0,o.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=n instanceof Error?n:Error(String(n));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:l.ERROR,message:s.message}),t.recordException(s),ye.add(1,{reason:r}),Ie.record(performance.now()-i,{reason:r}),De(g.ERROR,"ERROR",`Token refresh failed after ${a} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":a})}const Pt=async(e=5,t=1e3,n="scheduled")=>St?(o.debug("Token refresh already in progress, coalescing"),$t):(St=!0,$t=ae.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 ft();return X._t1=t,o.debug("Service token refreshed successfully"),X.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),_e.add(1,{reason:n,success:"true"}),Ie.record(performance.now()-i,{reason:n}),void De(g.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":a})}catch(s){if(s instanceof st&&(401===s.response.status||403===s.response.status))return void Ot({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),_e.add(1,{reason:n,success:"false"}),l)return void It({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(),St=!1,$t=void 0}}),$t);async function Nt(e){try{let t=await Ct();if(t&&!e?.force)return X._t2=t,X.showToken&&o.info("Auth token:",t),void await Rt();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=X.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${rt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:it,scope:at}),signal:e.signal});if(!t.ok)throw new st("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{d.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=h.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",m(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 vt("Authorization timed out — the code expired. Please run the command again.");let i=new AbortController,a=X.timeoutMs,s=setTimeout(()=>{i.abort()},a);try{let n=await fetch(`${rt}/login/oauth/access_token`,{method:"POST",headers:Ke(),body:JSON.stringify({client_id:it,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:i.signal});if(!n.ok){await kt(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 vt("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new vt("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 kt(t);continue}if(r.access_token)return r.access_token;await kt(t)}catch(e){if(e instanceof vt)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await kt(t);continue}throw e}finally{clearTimeout(s)}}}(n);await Et(r),X._t2=r,X.showToken&&o.info("Auth token:",r),await Rt()}catch(e){throw e instanceof st?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Rt(){let e=await ht();o.success(`Authenticated as ${e.login}`)}async function qt(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),X.showToken=e.showToken,await z(),await Nt({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 jt=e({meta:{name:"auth",description:"Run authentication flow"},args:{verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"show-token":{type:"boolean",default:!1,description:"Show token on auth"}},run:({args:e})=>qt({verbose:e.verbose,showToken:e["show-token"]})}),Dt=async()=>{let e=`${ot}/copilot_internal/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Le({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:nt(X),signal:o.signal});try{if(!t.ok)throw new st("Failed to get usage",t);return await t.json()}catch(e){throw Me(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Mt=e({meta:{name:"check-usage",description:"Show current usage/quota information"},async run(){await z(),await Nt();try{let e=await Dt(),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)}}}),Ht=N(m);async function Ft(){let e="win32"===h.platform?"where.exe":"which";try{return await Ht(e,["tailscale"]),!0}catch{return!1}}async function Bt(){try{let{stdout:e}=await Ht("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Ut(e){return e.replace(/\.$/,"")}async function Lt(){let e=await Bt();if(e?.Online)return Ut(e.DNSName)}const Jt=N(m),Gt=e=>`[1m${e}[0m`,Kt=e=>`[2m${e}[0m`,zt=e=>`[36m${e}[0m`,Wt=e=>`[32m${e}[0m`,Vt=e=>`[31m${e}[0m`,Xt=e=>`[33m${e}[0m`,Yt=Kt(" ─────────────────────────────────────────────────────────────"),Qt=a.join(K.APP_DIR,"certs","tailscale"),Zt=a.join(Qt,"cert.pem"),eo=a.join(Qt,"key.pem"),to={certDir:Qt,certPath:Zt,keyPath:eo};function oo(){switch(h.platform){case"darwin":return[` ${Kt("Install Tailscale for macOS:")}`,` ${zt("https://tailscale.com/download/mac")}`,` ${Kt("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${Kt("After installing, open the Tailscale app and sign in.")}`,` ${Kt("Then re-run this command.")}`].join("\n");case"linux":return[` ${Kt("Install Tailscale for Linux:")}`,` ${zt("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${zt("sudo tailscale up")}`,` ${Kt("or")} ${zt("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${Kt("Install Tailscale for Windows:")}`,` ${zt("https://tailscale.com/download/windows")}`,"",` ${Kt("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${Kt("Install Tailscale:")} ${zt("https://tailscale.com/download")}`}}function no(){let e=[` ${Vt("Tailscale is not running.")}`];return"darwin"===h.platform?e.push(` ${Kt("Open the Tailscale app from Applications and sign in.")}`,` ${Kt("Download:")} ${zt("https://tailscale.com/download/mac")}`):"win32"===h.platform?e.push(` ${Kt("Open the Tailscale app and sign in.")}`,` ${Kt("Download:")} ${zt("https://tailscale.com/download/windows")}`):e.push(` ${Kt("Connect with:")} ${zt("sudo tailscale up")}`),e.push("",` ${Kt("Then re-run this command.")}`),e.join("\n")}async function ro(){try{return await r.access(Zt),await r.access(eo),!0}catch{return!1}}function io(e){console.log(""),console.log(Yt),console.log(` ${Gt("Claude Cowork Setup")} ${Kt("— Diagnostic")}`),console.log(Yt),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?Wt("✅"):"missing"===n.status?Vt("❌"):Xt("❓");let r=n.detail?Kt(` ${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(` ${Wt("All checks passed.")}`):console.log(` ${Vt(`${t.length} issue(s).`)} Run ${zt("copilot-api cowork-setup install")} to fix.`),console.log("")}const ao={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},so=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 Ft();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return io(e),console.log(""),console.log(oo()),void console.log("");let o=await Bt();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},io(e),console.log(no()),void console.log("");let n=Ut(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await ro();e["tailscale-cert"]=r?{status:"ok",detail:Zt}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),io(e)}(),h.exit(0)}}),install:e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:ao},async run({args:e}){await async function(e){if(console.log(""),console.log(Yt),console.log(` ${Gt("Claude Cowork Setup")} ${Kt("— Install")}`),console.log(Yt),console.log(""),!await Ft())return console.log(` ${Vt("Tailscale is not installed.")}`),console.log(""),console.log(oo()),console.log(""),console.log(` ${Kt("After installing, run")} ${zt("tailscale up")} ${Kt("to connect, then re-run this command.")}`),void console.log("");let t=await Bt();if(!t||!t.Online)return console.log(no()),void console.log("");let n=Ut(t.DNSName);if(console.log(` ${Kt("Tailscale hostname:")} ${Gt(n)}`),console.log(""),console.log(` ${Gt("Generating TLS certificate via Tailscale…")}`),console.log(` ${Kt("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${zt(`$ tailscale cert --cert-file ${Zt} --key-file ${eo} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await r.mkdir(Qt,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Jt("tailscale",["cert","--cert-file",Zt,"--key-file",eo,n]),console.log(` ${Wt("✓ 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(Yt),console.log(` ${Gt("Next steps")}`),console.log(Yt),console.log(""),console.log(` ${Gt("1.")} Start the proxy:`),console.log(` ${zt("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Gt("2.")} In Cowork ${Kt("→")} Settings ${Kt("→")} Inference Provider, set:`),console.log(` ${Gt("inferenceGatewayBaseUrl")} = ${zt(`https://${n}:<port>`)}`),console.log(` ${Kt("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Gt("3.")} Restart Cowork ${Kt("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${Kt("For Cowork's own configuration docs, see:")}`),console.log(` ${zt("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),h.exit(0)}}),revert:e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:ao},async run({args:e}){await async function(e){if(console.log(""),console.log(Yt),console.log(` ${Gt("Claude Cowork Setup")} ${Kt("— Revert")}`),console.log(Yt),console.log(""),!await ro())return console.log(` ${Kt("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${Gt("Remove Tailscale cert files:")}`),console.log(` ${Kt(Zt)}`),console.log(` ${Kt(eo)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await r.rm(Qt,{recursive:!0}),console.log(` ${Wt("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${Kt("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),h.exit(0)}})}});async function lo(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await r.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function co(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:i.platform(),arch:i.arch()}}async function uo(){try{return!!(await r.stat(K.GITHUB_TOKEN_PATH)).isFile()&&(await r.readFile(K.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function po(e){let t=await async function(){let[e,t]=await Promise.all([lo(),uo()]);return{version:e,runtime:co(),paths:{APP_DIR:K.APP_DIR,GITHUB_TOKEN_PATH:K.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const mo=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})=>po({json:e.json})}),fo="copilot-api-node20",ho=`https://registry.npmjs.org/${fo}/latest`,go=e=>`[1m${e}[0m`,_o=e=>`[33m${e}[0m`;async function yo(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(ho,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function ko(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 wo=new Map,bo=new Map,vo=new Set;let xo,$o,To;function Ao(e){return!e.closed&&!e.destroyed}function So(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new C(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return wo.set(t,Date.now()),Te.add(1,{event:"created",origin:e}),De(g.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=vo.has(t);Te.add(1,{event:"goaway",origin:e}),De(a?g.WARN:g.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}),bo.delete(t),vo.delete(t),wo.delete(t),Ao(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Co(e){if(!X.connectivity.h2)return;xo&&xo!==e&&function(){for(let e of[...bo.keys(),...vo])Ao(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});bo.clear(),vo.clear(),wo.clear()}(),xo=e;let t=Date.now();for(let[n]of bo)if(t-(wo.get(n)??0)>=6e5)bo.delete(n),wo.delete(n),Ao(n)&&n.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Te.add(1,{event:"rotated",origin:e}),De(g.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Ao(n))return bo.delete(n),vo.add(n),n;bo.delete(n),wo.delete(n)}let n=So(e);return vo.add(n),n}function Eo(e){e&&vo.delete(e)&&(Ao(e)?bo.set(e,Date.now()):wo.delete(e))}function Oo(){To||(To=setInterval(()=>{!function(){let e=Date.now(),t=X.connectivity.h2Keepalive,n=bo.size;for(let[r,i]of bo)e-i<6e4||t&&n<=1||(bo.delete(r),wo.delete(r),n--,Ao(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Te.add(1,{event:"idle_reaped",origin:xo??""}),De(g.INFO,"INFO",`HTTP/2 idle connection reaped for ${xo}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":xo??""}))}()},3e4),To.unref())}function Io(){$o||(o.debug("Starting HTTP/2 keepalive (every 45s)"),$o=setInterval(()=>{(async function(){if(0===bo.size&&0===vo.size){if(xo){let e=So(xo);bo.set(e,Date.now())}return}let e=[...bo.keys()];for(let t of e)bo.delete(t);await Promise.allSettled(e.map(async e=>{if(Ao(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:Ze(X)});await n.dump(),$e.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),bo.set(e,Date.now())}catch(t){$e.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Te.add(1,{event:"error",origin:xo??""}),wo.delete(e),Ao(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else wo.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),$o.unref(),Oo())}function Po(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=h;if("win32"===e){try{if(f(`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 No=e=>`[1m${e}[0m`,Ro=e=>`[2m${e}[0m`,qo=e=>`[36m${e}[0m`,jo=e=>`[32m${e}[0m`,Do=e=>`[33m${e}[0m`,Mo=e=>`[4m${e}[0m`,Ho=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Fo="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Bo="https://github.com/johnib/copilot-api-issues/issues",Uo=Ro(" ─────────────────────────────────────────────────────────────");function Lo(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}const Jo=[{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 Go(e){if(0===e.length)return[];let t=["",Uo,` ${No("BARAZANY.DEV")} ${Ro("— Recent Posts")}`,Uo,""];for(let[o,n]of e.entries()){let e=Ho(`${n.url}${Fo}`,No(Mo(`[${o+1}]`)));t.push(` ${e} ${qo(n.title)}`,` ${Ro("→")} ${Ro(n.teaser)}`,"")}return t.push(Uo,` ${Ho(`https://barazany.dev/blog${Fo}`,"barazany.dev/blog")}`,Uo),t}function Ko(e){let t=[];X.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):X.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearch?`Tavily ${jo("✓")}`:Ro("off"),n=["",` ${No("COPILOT-API")} ${Ro(`v${e.version}`)}`,Uo,` ${Ro("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Ro("User")} ${e.user} ${Ro("·")} ${e.accountType}`];return X._v1&&n.push(` ${Ro("Client")} VSCode ${X._v1}`),n.push(` ${Ro("Network")} ${t.join(Ro(" · "))}`,` ${Ro("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Ro("Clipboard")} Claude Code command ${jo("✓")}`),n.push(Uo),n}function zo(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${No("Active")}`];if(e.model){let o=X.models?.data.find(t=>t.id===e.model),n=Lo(o?.capabilities.limits?.max_context_window_tokens);t.push(` ${qo(e.model.padEnd(32))} ${Ro("ctx")} ${No(n.padStart(5))} ${Do("← main")}`)}if(e.smallModel){let o=X.models?.data.find(t=>t.id===e.smallModel),n=Lo(o?.capabilities.limits?.max_context_window_tokens);t.push(` ${e.smallModel.padEnd(32)} ${Ro("ctx")} ${n.padStart(5)} ${Do("← small")}`)}return t}function Wo(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of X.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("",` ${No(o)}`);for(let o of n){let n=o.id===e.model||o.id===e.smallModel,r=n?qo("●"):Ro("·"),i=n?qo(o.id.padEnd(34)):o.id.padEnd(34),a=o.ctx?Lo(o.ctx).padStart(5):"";t.push(` ${r} ${i} ${Ro(a)}`)}}return t}function Vo(){let e=Bo.replace(/^https:\/\//,""),t=Ho(`${Bo}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Uo,` ${No("FOUND A BUG?")} ${Ro("— Report it on GitHub")}`,Uo,"",` ${qo("→")} ${qo(t)}`,` ${Ro("Bug reports, feature requests, and questions welcome.")}`,"",Uo]}function Xo(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=["",Uo,` ${No("Claude Cowork")} ${Ro("— Settings → Inference Provider")}`,Uo,"",` ${Ro("Paste into")} ${No("inferenceGatewayBaseUrl")}${Ro(":")}`,` ${No(qo(r))}`];return n||i.push("",` ${Ro("Your Tailscale hostname is shown by:")} ${qo("tailscale status --self")}`),i.push("",` ${Ro("Docs:")} ${qo("https://claude.com/docs/cowork/3p/installation")}`),i}function Yo(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Uo,` ${No("HTTPS")} ${Ro("— self-signed cert")}`,Uo,"",` ${Ro("Cert")} ${t}`];switch(o.push("",` ${No("Trust this cert")} ${Ro("(one-time setup)")}`),h.platform){case"darwin":o.push(` ${Ro("macOS:")}`,` ${qo("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${qo(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Ro("Windows (PowerShell as Administrator):")}`,` ${qo(`Import-Certificate -FilePath "${t}" \``)}`,` ${qo("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Ro("Linux (Debian/Ubuntu):")}`,` ${qo(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${qo("sudo update-ca-certificates")}`,` ${Ro("Linux (Fedora/RHEL/Arch):")}`,` ${qo(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${qo("sudo update-ca-trust")}`);break;default:o.push(` ${Ro("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Ro("Or, for Node CLIs only (no admin needed):")}`,` ${qo(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Uo),o}function Qo(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 Zo=a.join(K.APP_DIR,"certs"),en=a.join(Zo,"cert.pem"),tn=a.join(Zo,"key.pem"),on=a.join(Zo,"cert.meta.json");async function nn(e){try{return await r.readFile(e,"utf8")}catch{return}}async function rn(e){let t=await nn(en),o=await nn(tn),n=await async function(){let e=await nn(on);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 an(e){return 0!==j(e)}async function sn(e){await r.mkdir(Zo,{recursive:!0});let t=new Date,o=new Date;o.setDate(o.getDate()+825);let n=["127.0.0.1","::1"],i=new Set(["localhost"]),a=new Set(n);for(let t of e)an(t)?a.add(t):i.add(t);let s=await D([{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:[...[...i].map(e=>({type:2,value:e})),...[...a].map(e=>({type:7,ip:e}))]}]});return await r.writeFile(en,s.cert,{mode:420}),await r.writeFile(tn,s.private,{mode:384}),await async function(e){await r.writeFile(on,JSON.stringify(e,null,2),{mode:420})}({hosts:[...i,...a].sort(),notAfter:o.toISOString()}),{cert:s.cert,key:s.private,certPath:en,keyPath:tn,generated:!0}}function ln(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,c=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",c),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();Be.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),i>=400&&n.setStatus({code:l.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(ce.add(1,d),Ae.record(s,d),c>=400&&ue.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&&(pe.add(e.inputTokens,t),Ne.record(e.inputTokens,t)),e.outputTokens&&(de.add(e.outputTokens,t),Re.record(e.outputTokens,t)),e.cachedTokens&&me.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ee.executeCompletion(a)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const cn=async()=>ae.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),je.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),xe.add(1,{result:"rejected"}),new st("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),xe.add(1,{result:"approved"})}finally{e.end()}}),un=3e-6,pn=15e-6;function dn(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,estimatedCost:t*un+o*pn,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function mn(e,t){void 0!==t.prompt_tokens&&e.setAttribute("copilot_api.input_tokens",t.prompt_tokens),void 0!==t.completion_tokens&&e.setAttribute("copilot_api.output_tokens",t.completion_tokens),void 0!==t.total_tokens&&e.setAttribute("copilot_api.total_tokens",t.total_tokens)}const fn=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],hn={haiku:"claude-haiku-4.5","sonnet-4.6":"claude-sonnet-4.6","sonnet-4.5":"claude-sonnet-4.5","sonnet-4":"claude-sonnet-4","opus-4.7":"claude-opus-4.7","opus-4.6":"claude-opus-4.6","opus-4.5":"claude-opus-4.5",opus:"claude-opus-4.5"};function gn(e,t){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 fn)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=hn[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 _n=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);var yn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function kn(e){if(!e||"string"!=typeof e)throw new yn("Model name is required and must be a string");if(!X.models?.data)throw new yn("Models not available. Please try again later.",503);let t=X.models.data.map(e=>e.id);if(t.includes(e))return e;let o=gn(e,t);if(!o)throw he.add(1,{requested_model:e}),new yn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}async function wn(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return ae.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"),fe.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new st("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*a;n.setAttribute("copilot_api.rate_limit.action","waited"),fe.add(1,{action:"waited",source:"local"}),Ee.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await kt(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function bn(e){if("number"==typeof e){if(!Number.isFinite(e))return null;let t=Math.floor(e);return t>0?t:null}if("string"==typeof e){let t=e.trim();if(!t)return null;let o=Number(t);if(!Number.isFinite(o))return null;let n=Math.floor(o);return n>0?n:null}return null}function vn(e,t,o){return Math.min(Math.max(e,t),o)}function xn(e,t=0){if(t>5||!e||"object"!=typeof e)return null;let o=e.error;if(!o||"object"!=typeof o)return null;let n=o.code;if("string"==typeof n)return n;let r=o.message;if("string"!=typeof r)return null;try{return xn(JSON.parse(r),t+1)}catch{return null}}function $n(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=bn(o.capabilities.supports.min_thinking_budget),r=bn(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:bn(o.capabilities.limits?.max_output_tokens)??void 0}}function Tn(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=vn(bn(e.requestedBudget)??o,o,n),i=bn(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 An(e,t){if(wt(e.thinking_budget))return e;let o=$n(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Tn({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 Sn(e){return"invalid_thinking_budget"===xn(e)}async function Cn(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(wt(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(!Sn(a))return null;let l=$n(n,t.model);return l?function(e,t){let o=Tn({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=bn(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 En(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 On(){return new Promise(e=>setTimeout(e,100))}function In(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=>In(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?In(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}async function Pn(e,t){try{if(!e.ok)throw new st("Failed to create chat completions",e);let o=await e.json();return o.id&&t.setAttribute("copilot_api.response.id",o.id),o.usage&&mn(t,o.usage),o}catch(e){throw Me(t,e),e}finally{t.end()}}const Nn=async e=>{let t=In(e);try{return await Rn(t)}catch(e){if(e instanceof st&&401===e.response.status)return await _t(),Rn(t);let n;if(e instanceof st)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Cn({payload:t,error:e,models:X.models,errorBodyText:n});if(r)return e instanceof st&&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 Rn(In(r));throw e}},Rn=async e=>{if(!X._t1)throw Error("Service token not found");let t=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),n=e.messages.some(e=>["assistant","tool"].includes(e.role)),r={...Ze(X,t),"X-Initiator":n?"agent":"user"},i=Qe(X),a=`${i}/chat/completions`,s=X.timeoutMs,l=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t))return{...e};let{max_tokens:o,...n}=e;return null==o?{...n}:{...n,max_completion_tokens:o}}(e,X.models),c=JSON.stringify(l),u={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":s,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":e.max_tokens??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":n?"agent":"user"};for(let t=0;t<=1;t++){let n=Co(i),l=new AbortController,p=setTimeout(()=>l.abort(),s);try{let{statusCode:o,headers:i,body:p,span:d}=await Je({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 st("Failed to create chat completions",m);return{events:B(m),span:d,release:()=>Eo(n)}}try{return await Pn(m,d)}finally{Eo(n)}}catch(e){if(Eo(n),En(e)&&t<1){o.warn(`HTTP/2 connection error during chat completions, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await On();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function qn(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 jn(e){await wn(X);let t=await e.req.json();o.debug("Request payload:",JSON.stringify(t).slice(-400));try{t=function(e){return ae.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=kn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),ge.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 yn)return p.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(e.set("requestData",{model:t.model,streaming:!!t.stream}),X.manualApprove&&await cn(),wt(t.max_tokens)){let e=X.models?.data.find(e=>e.id===t.model);t={...t,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(t.max_tokens))}t=An(t,X.models),wt(t.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(t.thinking_budget));let n=performance.now(),r=await Nn(t),i=performance.now()-n;if(Se.record(i,{model:t.model,target:"chat_completions",streaming:String(!!t.stream)}),Dn(r)){let t=e.get("requestData")||{};return r.usage&&(t.tokenUsage=dn(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++,ve.add(1,{model:t.model,endpoint_type:"openai"}),a=qn(s,t=>{n.value=t;let o=e.get("requestData")||{};o.tokenUsage=dn(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(Ce.record(s,l),qe.record(r,l),n.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=dn(n.value),t._d1=i,e.set("requestData",t))}}catch(t){throw He(s,e.get("requestSpan"),t),t}finally{n.value&&mn(s,n.value),s.end(),l()}let u=e.get("requestId");u&&ee.executeCompletion(u)}finally{e.get("resolveStreamComplete")?.()}})}const Dn=e=>Object.hasOwn(e,"choices"),Mn=new M;Mn.post("/",async e=>{try{return await jn(e)}catch(t){return await mt(e,t)}});const Hn=new M;Hn.post("/",async e=>{try{let t=await e.req.json();try{t.model=kn(t.model)}catch(t){if(t instanceof yn)return p.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=performance.now(),n=await(async e=>{if(!X._t1)throw Error("Service token not found");let t=`${Qe(X)}/embeddings`,o=Ze(X),n=X.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),n);try{let{response:n,span:i}=await Le({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:JSON.stringify(e),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 st("Failed to create embeddings",n);return await n.json()}catch(e){throw Me(i,e),e}finally{i.end()}}finally{clearTimeout(i)}})(t),r=performance.now()-o;Se.record(r,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=dn(n.usage),i._d1=r,e.set("requestData",i),e.json(n)}catch(t){return await mt(e,t)}});const Fn=new M;let Bn=null,Un=null;Fn.get("/",async e=>{let t,o=function(){let e=X._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let o=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),n=JSON.parse(atob(o)),r="object"==typeof n&&n&&"exp"in n&&"number"==typeof n.exp?n.exp:void 0;return void 0!==r&&1e3*r<Date.now()?"expired":"valid"}catch{return"expired"}}(),n=await async function(){let e=Date.now(),t=Bn;return t&&e-t.timestamp<3e4?{result:t.result}:Un||(Un=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${Qe(X)}/models`,n=await fetch(t,{method:"GET",headers:Ze(X),signal:e.signal}),r=Math.round(performance.now()-o),i=n.ok?"reachable":"unreachable";return Bn={result:i,timestamp:Date.now()},{result:i,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Bn={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),Un=null}})(),Un)}();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.28.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 Ln=new U(J),Jn={...L["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Gn(e){return Ln.encode(e).length}function Kn(e){let t=0;for(let o of e)switch(o.type){case"text":t+=Gn(o.text)*Jn.contentMultiplier;break;case"tool_use":t+=Gn(o.name+JSON.stringify(o.input))*Jn.contentMultiplier;break;case"tool_result":o.content&&(t+=Gn("string"==typeof o.content?o.content:JSON.stringify(o.content))*Jn.contentMultiplier);break;case"thinking":t+=Gn(o.thinking)*Jn.contentMultiplier;break;case"image":t+=1600}return t}function zn(e){let t=0,o=e.properties;if(!o)return t;let n=Object.entries(o);for(let[e,[o,r]]of n.entries()){if(t+=0===e?Jn.perFirstProp:Jn.perAdditionalProp,t+=Gn(o),r.description&&(t+=Jn.perPropDesc+Gn(r.description)),r.enum&&Array.isArray(r.enum)){t+=Jn.perEnum;for(let e of r.enum)t+=Gn(String(e))}if("object"===r.type&&r.properties&&(t+=Jn.perNestedObject,t+=zn(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=Jn.perArrayOfObjects,t+=zn(e))}}return t}function Wn(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 Vn(e,t,o){let n=Wn(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Xn=async(e,t)=>{if(!X._t1)throw Error("Service token not found");let{metadata:n,...r}=In(e),i={...tt(X,t),"X-Initiator":"agent"},a=Qe(X),s=`${a}/v1/messages`,l=X.timeoutMs,c=JSON.stringify(r),u=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",...Wn(e,t?.anthropicBeta)}}(r,t,l);for(let e=0;e<=1;e++){let t=Co(a),p=new AbortController,d=setTimeout(()=>p.abort(),l);try{let{statusCode:o,headers:n,body:a,span:d}=await Je({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 st("Failed to create anthropic messages",m);if(r.stream)return{events:B(m),span:d,release:()=>Eo(t)};try{let e=await m.json();"string"==typeof e.id&&d.setAttribute("copilot_api.response.id",e.id);let t=e.usage;return t&&mn(d,{prompt_tokens:t.input_tokens??0,completion_tokens:t.output_tokens??0,total_tokens:(t.input_tokens??0)+(t.output_tokens??0)}),e}finally{d.end(),Eo(t)}}catch(n){if(Eo(t),En(n)&&e<1){o.warn(`HTTP/2 connection error during anthropic messages, retrying (attempt ${e+1}): ${n instanceof Error?n.message:String(n)}`),await On();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Yn(e,t){try{if(!e.ok)throw new st("Failed to create responses",e);let o=await e.json();return o.id&&t.setAttribute("copilot_api.response.id",o.id),o.usage&&mn(t,{prompt_tokens:o.usage.input_tokens,completion_tokens:o.usage.output_tokens,total_tokens:o.usage.total_tokens}),o}catch(e){throw Me(t,e),e}finally{t.end()}}const Qn=async e=>{try{return await Zn(e)}catch(t){if(t instanceof st&&401===t.response.status)return await _t(),Zn(e);throw t}},Zn=async e=>{if(!X._t1)throw Error("Service token not found");let t=In(e),n={...Ze(X),"X-Initiator":"agent"},r=Qe(X),i=`${r}/responses`,a=X.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=Co(r),u=new AbortController,p=setTimeout(()=>u.abort(),a);try{let{statusCode:o,headers:r,body:p,span:d}=await Je({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 st("Failed to create responses",m);return{events:B(m),span:d,release:()=>Eo(c)}}try{return await Yn(m,d)}finally{Eo(c)}}catch(t){if(Eo(c),En(t)&&e<1){o.warn(`HTTP/2 connection error during responses, retrying (attempt ${e+1}): ${t instanceof Error?t.message:String(t)}`),await On();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function er(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function tr(e,t){let o={model:e.model,messages:or(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:sr(e.tools),tool_choice:lr(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=$n(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=bn(t),i=r&&r>1?r-1:o.min;return vn(Math.min(n,i),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=An({...o,thinking_budget:i},t)}}return o}function or(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:nr(e)}]:[{role:"system",content:nr(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:ar(e.content)});n.length>0&&t.push({role:"user",content:ar(n)})}else t.push({role:"user",content:ar(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:ir(e.reasoning_text),reasoning_opaque:ir(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:ar(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:ar(e.content),...t}]}(e));return[...o,...n]}function nr(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const rr=32768;function ir(e){if("string"==typeof e)return e.length<=rr?e:e.slice(0,rr)}function ar(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 sr(e){if(e)return e.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function lr(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 cr(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 ur(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function pr(e){return e?e.map(e=>{let t={};try{t=JSON.parse(e.function.arguments)}catch{n.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}}):[]}function dr(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 mr=/[^\w-]/g;function fr(e){return e.replaceAll(mr,"_")}function hr(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=function(e,t){if(!e.thinking||"disabled"===e.thinking.type)return e;let o=t?.data.find(t=>t.id===e.model);if(void 0!==o&&!o.capabilities.supports.adaptive_thinking){let{thinking:t,...o}=e;return o}return"enabled"===e.thinking.type?{...e,thinking:{type:"adaptive"}}:e}(o,t),o={...o,system:dr(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:fr(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:fr(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function gr(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 _r(e){let t={model:e.model,input:kr(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:yr(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 yr(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function kr(e){let t=[];for(let o of e)"user"===o.role?t.push(...wr(o)):t.push(...vr(o));return t}function wr(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 vr(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 xr(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 $r(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Tr(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 Ar(e,t){let o=[];switch(e.type){case"response.created":Tr(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){Tr(t,o),$r(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":Tr(t,o),$r(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":$r(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":{$r(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:xr(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":{Tr(t,o),$r(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":Tr(t,o),$r(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":Tr(t,o),$r(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":Tr(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 Sr(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 Cr(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Er(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&&(Sr(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&&(Sr(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Cr(t,o)),r.content&&(Cr(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){Cr(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&&(Cr(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:er(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}var Or=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 Ir(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 Le({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 Me(a,e),e}finally{a.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Or:e}finally{clearTimeout(a)}}function Pr(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Nr(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function Rr(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=X.tavilyApiKey;if(!e)throw s=!0,i="unavailable",Error("No Tavily API key configured");a=(await Ir(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_${Pr()}`,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:Nr(e)}];return{id:`msg_tavily_${Pr()}`,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_${Pr()}`,r=`msg_tavily_${Pr()}`,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:Nr(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")?.()})}const qr=new Set(["low","medium","high","max","xhigh"]);function jr(e){let t=e.output_config?.effort;if(!t)return e;let n=X.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=function(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=_n.get(o);if(void 0===n)return t[0]??null;let r=null,i=1/0;for(let e of t){let t=_n.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<i&&(i=o,r=e)}return r}(t,n);if(!r||!qr.has(r))return e;let i=r;if(i===t)return e;o.debug(`Effort clamp: ${t} → ${i}`);let a=p.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}}}function Dr(e,t){let n=X.models?.data.map(e=>e.id)??[],r=/context-1m/i.test(e.req.header("anthropic-beta")??""),i=function(e,t,o={}){let n=gn(e,t);if(!n)return null;let r=new Set(t);if(o.context1m){let e=function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,r);if(e)return e}if(o.effort){let e=function(e,t,o){let n=null;if("high"===o?n="high":("max"===o||"xhigh"===o)&&(n="xhigh"),!n)return null;let r=`${e}-${n}`;return t.has(r)?r:null}(n,r,o.effort);if(e)return e}return null}(t.model,n,{context1m:r,effort:t.output_config?.effort}),a=t;if(i&&i!==t.model){o.debug(`Resolved model variant: ${t.model} → ${i}`);let e=p.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",t.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),a={...t,model:i}}return jr(a)}async function Mr(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 Rr(e,t);await wn(X),o.debug("Anthropic request payload:",JSON.stringify(t)),t=Dr(e,t);let n=function(e,t){return ae.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),Vn(n,t,e.req.header("anthropic-beta"));let r=kn(t.model);n.setAttribute("copilot_api.model.normalized",r);let i=gr(t);return i?(p.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),ge.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 yn)return p.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(!n.ok)return n.response;if(t=n.payload,!X._t1&&!await async function(){return!!X._t1||(await Pt(1,0,"on-demand"),!!X._t1)}())return p.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 n=performance.now(),r=ae.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),_r(t)}finally{e.end()}});Oe.record(performance.now()-n,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",JSON.stringify(r)),e.set("requestData",{model:r.model,streaming:!!r.stream}),X.manualApprove&&await cn();let i=performance.now(),a=await Qn(r),s=performance.now()-i;if(Se.record(s,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Br(a)){let t=e.get("requestData")||{};if(a.usage&&(t.tokenUsage=dn({prompt_tokens:a.usage.input_tokens,completion_tokens:a.usage.output_tokens,total_tokens:a.usage.total_tokens})),t._d1=s,e.set("requestData",t),o.debug("Non-streaming Responses API response:",JSON.stringify(a).slice(-400)),"failed"===a.status)return p.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:a.error?.code??"api_error",message:a.error?.message??"Response generation failed"}},500);let n=performance.now(),r=ae.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:xr(e.status,o),stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}(a)}finally{e.end()}});return Oe.record(performance.now()-n,{direction:"responses_to_anthropic"}),e.json(r)}o.debug("Streaming Responses API response");let{events:l,span:c,release:u}=a;return F(e,async t=>{let n=null,i=0,a=performance.now(),p={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let a of l){if(o.debug("Responses API raw stream event:",JSON.stringify(a)),!a.data)continue;let l;try{l=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}i++,ve.add(1,{model:r.model,endpoint_type:"responses"});let c=Hr(l);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=dn(n),t._d1=s,e.set("requestData",t)}let u=Ar(l,p);for(let e of u)o.debug("Translated Anthropic event:",JSON.stringify(e)),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let c=performance.now()-a,u={model:r.model,endpoint_type:"responses"};Ce.record(c,u),qe.record(i,u)}catch(t){throw He(c,e.get("requestSpan"),t),t}finally{n&&mn(c,n),c.end(),u()}let d=e.get("requestId");d&&ee.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=hr(t,X.models),n={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")};return e.set("requestData",{model:o.model,streaming:!!o.stream}),X.manualApprove&&await cn(),ae.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),Vn(t,o,n.anthropicBeta);try{let r=performance.now(),i=await(async(e,t)=>{try{return await Xn(e,t)}catch(o){if(o instanceof st&&401===o.response.status)return await _t(),Xn(e,t);throw o}})(o,n),a=performance.now()-r;if(Se.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=dn(Ur(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++,ve.add(1,{model:o.model,endpoint_type:"anthropic_messages"}),Lr(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"};Ce.record(e,t),qe.record(i,t)}finally{if(p){let t=Ur(u);mn(l,t);let o=e.get("requestData")||{};o.tokenUsage=dn(t),o._d1=performance.now()-r,e.set("requestData",o)}l.end(),c()}let t=e.get("requestId");t&&ee.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Me(t,e),t.end(),e}})}(e,t);let r=performance.now(),i=ae.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),tr(t,X.models)}finally{o.end()}});Oe.record(performance.now()-r,{direction:"anthropic_to_openai"}),i=An(i,X.models),o.debug("Translated OpenAI request payload:",JSON.stringify(i)),e.set("requestData",{model:i.model,streaming:!!i.stream});let a=performance.now();X.manualApprove&&await cn();let s=await Nn(i),l=performance.now()-a;if(Se.record(l,{model:i.model,target:"chat_completions",streaming:String(!!i.stream)}),Fr(s)){let t=e.get("requestData")||{};s.usage&&(t.tokenUsage=dn(s.usage)),t._d1=l,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(s).slice(-400));let n=performance.now(),r=ae.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=ur(i.message),a=cr(i.message.content),s=pr(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:er(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(s);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 Oe.record(performance.now()-n,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",JSON.stringify(r)),e.json(r)}o.debug("Streaming response from service");let{events:c,span:u,release:d}=s;return F(e,async t=>{let n=null,r=0,a=performance.now(),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of c){if(o.debug("Raw stream event:",JSON.stringify(a)),"[DONE]"===a.data)break;if(!a.data)continue;let c;try{c=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,ve.add(1,{model:i.model,endpoint_type:"anthropic"}),c.usage){n=c.usage;let t=e.get("requestData")||{};t.tokenUsage=dn(n),t._d1=l,e.set("requestData",t)}let u=Er(c,s);for(let e of u)o.debug("Translated Anthropic event:",JSON.stringify(e)),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let u=performance.now()-a,p={model:i.model,endpoint_type:"anthropic"};if(Ce.record(u,p),qe.record(r,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=dn(n),t._d1=l,e.set("requestData",t))}}catch(t){throw He(u,e.get("requestSpan"),t),t}finally{n&&mn(u,n),u.end(),d()}let p=e.get("requestId");p&&ee.executeCompletion(p)}finally{e.get("resolveStreamComplete")?.()}})}function Hr(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 Fr=e=>Object.hasOwn(e,"choices"),Br=e=>Object.hasOwn(e,"output");function Ur(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 Lr(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 Jr=new M;Jr.post("/",async e=>{try{return await Mr(e)}catch(t){return await mt(e,t)}});const Gr=new M;function Kr(e,t){let o=function(e){try{let t=JSON.parse(e);if(("response.completed"===t.type||"response.incomplete"===t.type)&&t.response?.usage){let e=t.response.usage;return{prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=dn(o),n._d1=t._d1,t.c.set("requestData",n)}Gr.get("/",async e=>{try{X.models||await bt();let t=X.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await mt(e,t)}});const zr=new Set(["message","function_call","function_call_output"]),Wr=new Set(["type","name","description","parameters"]);async function Vr(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||!X.tavilyApiKey)&&(o.info(`Enriching web search: "${n}"`),e.sources=(await Ir(X.tavilyApiKey,n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Xr(e){if(X.tavilyApiKey)try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Vr(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Yr(e){if(!X.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 Vr(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Qr(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 Zr(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&&Qr(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)Qr(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function ei(e){return null!=e}function ti(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 zr.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"])ei(e[t])&&(n[t]=e[t]);let r=new Set;if(ei(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))Wr.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(ei(e.reasoning)&&"object"==typeof e.reasoning){let t=e.reasoning;n.reasoning={},ei(t.effort)&&(n.reasoning.effort=t.effort),ei(t.summary)&&(n.reasoning.summary=t.summary)}if(ei(e.text)&&"object"==typeof e.text){let t=e.text;ei(t.format)&&(n.text={format:t.format})}return{payload:n,customToolNames:r}}async function oi(e){await wn(X);let{payload:t,customToolNames:n}=ti(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 ae.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=kn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),ge.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 yn)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}),X.manualApprove&&await cn();let i=performance.now(),a=await Qn(r),s=performance.now()-i;if(Se.record(s,{model:r.model,target:"responses",streaming:String(!!r.stream)}),ni(a))return async function(e,t,o){await Xr(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=dn({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens})),n._d1=o,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=Zr(a.data,n);l=await Yr(l);let c=l===a.data?a:{...a,data:l};ve.add(1,{model:r.model,endpoint_type:"responses"}),Kr(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"};Ce.record(c,u),qe.record(i,u)}catch(t){throw He(c,e.get("requestSpan"),t),t}finally{o.value&&mn(c,o.value),c.end(),u()}let p=e.get("requestId");p&&ee.executeCompletion(p)}finally{e.get("resolveStreamComplete")?.()}})}const ni=e=>Object.hasOwn(e,"output"),ri=new M;ri.post("/",async e=>{try{return await oi(e)}catch(t){return await mt(e,t)}});const ii=new M;ii.get("/",e=>{try{return X.showToken?e.json({token:X._t1}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return o.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const ai=new M;ai.get("/",async e=>{try{let t=await Dt();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const si=new M;si.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,u=function(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}(a);e.set("requestId",r),e.header("x-request-id",r);let d=ae.startSpan("copilot_api.handle_request",{kind:s.SERVER,attributes:{"http.method":i,"http.url":e.req.url,"http.route":a,"copilot_api.request_id":r,"copilot_api.endpoint_type":u}});e.set("requestSpan",d),e.set("requestTraceContext",d.spanContext());for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Be.has(e)||d.setAttribute(`http.request.header.${e}`,o)}let m,f=new Promise(e=>{m=e});e.set("streamComplete",f),e.set("resolveStreamComplete",m);let h=p.setSpan(c.active(),d);await c.with(h,async()=>{ee.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw d.setStatus({code:l.ERROR,message:t.message}),d.recordException(t),e}});let g=e.get("requestData"),_={c:e,start:n,method:i,path:a,endpointType:u,requestId:r,span:d};g?.streaming&&e.res.status<400?f.then(()=>ln(_)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{d.recordException(t),d.setStatus({code:l.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{d.end()}catch{}}):ln(_)}),si.use(H()),si.use(async(e,t)=>{let o=e.req.header("content-length");if(o){let t=Number(o);if(Number.isFinite(t)&&t>33554432)return n.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()}),si.get("/",e=>e.text("Server running")),si.route("/health",Fn),si.route("/chat/completions",Mn),si.route("/models",Gr),si.route("/embeddings",Hn),si.route("/usage",ai),si.route("/token",ii),si.route("/v1/chat/completions",Mn),si.route("/v1/models",Gr),si.route("/v1/embeddings",Hn),si.route("/v1/messages",Jr),si.post("/v1/messages/count_tokens",async function(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:"invalid_request_error",message:"Invalid JSON"}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:"invalid_request_error",message:"messages is required"}},400);let o=Jn.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=Jn.perMessage+Gn(e)*Jn.contentMultiplier}for(let e of t.messages)o+=Jn.perMessage,o+=Gn(e.role),"string"==typeof e.content?o+=Gn(e.content)*Jn.contentMultiplier:Array.isArray(e.content)&&(o+=Kn(e.content));return t.tools&&t.tools.length>0&&(o+=function(e){let t=Jn.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=Jn.perTool),t+=Gn(n.name),n.description&&(t+=Jn.perDesc+Gn(n.description)),t+=zn(n.input_schema);return t}(t.tools)),e.json({input_tokens:Math.round(o)})}),si.route("/v1/responses",ri),si.route("/responses",ri);const li=[],ci=Date.now();let ui="";function pi(){let e=async(e,t=0)=>{let n=ae.startSpan("copilot_api.server.shutdown",{kind:s.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 li)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Ho("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Uo,` ${No("COPILOT-API")} ${Ro(`v${e}`)} ${Ro("·")} ${Qo(t)} uptime`,Uo,""," Check in from time to time on",` ${qo(o)}`,"",Uo,""];console.log(n.join("\n"))}(ui,Date.now()-ci),h.exit(t)};h.on("SIGINT",()=>e("SIGINT")),h.on("SIGTERM",()=>e("SIGTERM")),h.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),h.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}function di(e){return e._t2?"cli_arg":h.env.GH_TOKEN?"env_var":"stored"}function mi(e){let{options:t,version:o,runtime:n,_u1:r}=e,i=ae.startSpan("copilot_api.server.startup",{kind:s.INTERNAL,attributes:Fe({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:di(t)},runtime:n,identity:{_u1:r.login,machineId:X.machineId,sessionId:X.sessionId,_v1:X._v1},connectivity:X.connectivity,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-ci},"copilot_api")});if(X.models?.data)for(let e of X.models.data)i.addEvent("copilot_api.model.available",Fe(e,"model"));i.end(),De(g.INFO,"INFO","Server started",Fe({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-ci},"copilot_api"))}async function fi(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[o,n]=await Promise.all([r.readFile(e,"utf8"),r.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 rn(e)){let e=await nn(en),t=await nn(tn);if(e&&t)return{cert:e,key:t,certPath:en,keyPath:tn,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),sn(e)}(e.httpsHosts)}}async function hi(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=to;try{R(t),R(n)}catch{throw o.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:n}}(e);if(pi(),li.push(()=>{o.debug("Cleaning up connectivity monitor"),Ge.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),xt&&=void clearInterval(xt),Tt&&=void Ge.off("online",Tt),At&&=void Ge.off("offline",At),$t=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),$o&&=void clearInterval($o),To&&=void clearInterval(To);let e=[...bo.keys(),...vo];bo.clear(),vo.clear(),wo.clear(),xo=void 0;for(let t of e)Ao(t)&&(Te.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!te)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([te.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");X.accountType=t.accountType,X.manualApprove=t.manual,X.rateLimitSeconds=t.rateLimit,X.rateLimitWait=t.rateLimitWait,X.showToken=t.showToken,X.timeoutMs=t.timeout,X.connectivity.timeoutMs=t.connectTimeout,t.tavilyApiKey&&(X.tavilyApiKey=t.tavilyApiKey),function(){let e="1"===h.env.COPILOT_H2_KEEPALIVE||"true"===h.env.COPILOT_H2_KEEPALIVE,t=e||"1"===h.env.COPILOT_H2||"true"===h.env.COPILOT_H2;X.connectivity.h2=t,X.connectivity.h2Keepalive=e}(),await z(),X._v1="1.121.0-insider";let n=await lo();ui=n;let r=co();(function(e,t){t&&(ne=t),oe=crypto.randomUUID();let o=b({[A]:"copilot-api",[S]:e,[T]:oe}),{endpoint:n,headers:r}=ie();te=new $({resource:o,traceExporter:new w({url:`${n}/v1/traces`,headers:r}),metricReader:new x({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new v(new y({url:`${n}/v1/logs`,headers:r}))],instrumentations:[]}),te.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||h.env.GH_TOKEN;a?(X._t2=a,o.info("Using provided Auth token")):await Nt();try{i=await ht(),await Ye(X,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 ft();X._t1=e,o.debug("Service token fetched successfully!"),X.showToken&&o.info("Service token:",e),xt=setInterval(()=>{Pt(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),Ge.start(),Tt=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Pt(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},At=()=>{o.debug("Network connectivity lost")},Ge.on("online",Tt),Ge.on("offline",At)})(),await async function(){try{return await bt(),!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(()=>{bt().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{bt().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)}}();li.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),X.connectivity.h2&&(Eo(Co(Qe(X))),X.connectivity.h2Keepalive&&Io()),mi({options:t,version:n,runtime:r,_u1:i});let l=await fi(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(X.models||(o.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),h.exit(1)),e.model&&e.smallModel){let t=X.models.data.map(e=>e.id);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);if(!t.includes(e.smallModel))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid small model: ${e.smallModel}`);r=e.model,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:X.models.data.map(e=>e.id)}),i=await o.prompt("Select a small model to use",{type:"select",options:X.models.data.map(e=>e.id)})}let a=Po({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 d.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(X.models||(o.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),h.exit(1)),e.model){let t=X.models.data.map(e=>e.id);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);r=e.model}else r=await o.prompt("Select a model to use with Codex CLI",{type:"select",options:X.models.data.map(e=>e.id)});let i=Po({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return d.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=[...Ko(e),...zo(e),...Wo(e),...Vo(),"",...Go(Jo),...Xo(e),...Yo(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 Lt()}:void 0}}({options:t,version:n,runtime:r,user:i.login,clipboardCopied:p,tls:l})),q({fetch:si.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 gi(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const _i=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:gi(t,"--rate-limit"),n=e.timeout,r=void 0===n?V:gi(n,"--timeout"),i=e["connect-timeout"]??h.env.COPILOT_CONNECT_TIMEOUT_MS,a=void 0===i?15e3:gi(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 hi({port:gi(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"]||h.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([lo(),yo()]);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 ${fo}@latest`,n=_o("│"),r=` ${go("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,i=` Run ${go(o)} to update`,a=" ".repeat(54),s=_o(`╭${"─".repeat(54)}╮`),l=_o(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${a}${n}`,`${n}${ko(r,54)}${n}`,`${n}${a}${n}`,`${n}${ko(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:jt,start:_i,"check-usage":Mt,debug:mo,"cowork-setup":so}}));export{};
|
|
2
|
+
import{defineCommand as e,runMain as t}from"citty";import o,{consola as n}from"consola";import r from"node:fs/promises";import i from"node:os";import a from"node:path";import{SpanKind as s,SpanStatusCode as l,context as c,metrics as u,trace as p}from"@opentelemetry/api";import d from"clipboardy";import{execFile as m,execSync as f}from"node:child_process";import h from"node:process";import{SeverityNumber as g,logs as _}from"@opentelemetry/api-logs";import{OTLPLogExporter as y}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as k}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as w}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as b}from"@opentelemetry/resources";import{BatchLogRecordProcessor as v}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as x}from"@opentelemetry/sdk-metrics";import{NodeSDK as $}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as T,ATTR_SERVICE_NAME as A,ATTR_SERVICE_VERSION as S}from"@opentelemetry/semantic-conventions";import{Client as C,request as E}from"undici";import{createHash as O,randomBytes as I,randomUUID as P}from"node:crypto";import{promisify as N}from"node:util";import{accessSync as R}from"node:fs";import{serve as q}from"srvx";import{isIP as j}from"node:net";import{generate as D}from"selfsigned";import{Hono as H}from"hono";import{cors as M}from"hono/cors";import{streamSSE as B}from"hono/streaming";import{events as F}from"fetch-event-stream";import{Tokenizer as U,models as L}from"ai-tokenizer";import*as z from"ai-tokenizer/encoding/claude";const J=a.join(i.homedir(),".local","share","copilot-api"),G={APP_DIR:J,GITHUB_TOKEN_PATH:a.join(J,"github_token"),MACHINE_ID_PATH:a.join(J,"machine_id"),SESSION_ID_PATH:a.join(J,"session_id")};async function K(){await r.mkdir(G.APP_DIR,{recursive:!0}),await W(G.GITHUB_TOKEN_PATH),await W(G.SESSION_ID_PATH)}async function W(e){try{await r.access(e,r.constants.W_OK)}catch{await r.writeFile(e,""),await r.chmod(e,384)}}const V=6e5,X={accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:V,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}},Y=e=>e>=1e5||e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString(),Z=(e,t)=>e.padEnd(t),Q=e=>{let t=[];if(e.model){let o=Z(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(!X.models)return"";let o=X.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=Z(`↑${Y(o.inputTokens||0).padStart(5)} │ ↓${Y(o.outputTokens||0).padStart(5)}`,18),a=Y(n),s=r?`${a}${r.padStart(15-a.length)}`:a.padEnd(15);t.push(`Tokens: ${i} | Context: ${s}`)}else if(e.model){let e=Z("N/A",18),o="N/A".padEnd(15);t.push(`Tokens: ${e} | Context: ${o}`)}if(e._d1){let o=Z(`${Math.round(e._d1)}ms`,8);t.push(`API: ${o}`)}return t.length>0?` | ${t.join(" | ")}`:""},ee={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 ${Z(t.req.method,4)}${Z(t.req.path,21)}${Z(t.res.status.toString(),3)} ${Z(`${r}ms`,8)}`;i&&(a+=Q(i)),o.info(a),He(g.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 ${Z(n.req.method,4)}${Z(n.req.path,21)}${Z("429",3)} ${Z(`${i}ms`,8)}`;l+=` | Rate limited (${s}s retry) | ${a}`;let c=n.get("requestData");if(c?._d1){l+=` | API: ${Z(`${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(()=>ee.cleanup(),6e4);let te,oe,ne=Date.now();const re={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function ie(){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):re;return{endpoint:e.replace(/\/$/,""),headers:t}}const ae=p.getTracer("copilot-api"),se=u.getMeter("copilot-api"),le=_.getLogger("copilot-api"),ce=se.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),ue=se.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),pe=se.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),de=se.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),me=se.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),fe=se.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),he=se.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),ge=se.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),_e=se.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),ye=se.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),ke=se.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),we=se.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),be=se.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),ve=se.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),xe=se.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),$e=se.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Te=se.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Ae=se.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Se=se.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Ce=se.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Ee=se.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Oe=se.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Ie=se.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Pe=se.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),Ne=se.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),Re=se.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),qe=se.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),je=se.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),De=se.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function He(e,t,o,n,r){let i=p.getActiveSpan()?.spanContext()??r;le.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...i&&{"trace.id":i.traceId,"span.id":i.spanId}}})}function Me(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:l.ERROR,message:o??n.message}),e.recordException(n)}function Be(e,t,o){Me(e,o),t&&t!==e&&Me(t,o)}function Fe(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,Fe(r,e)))}return o}se.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!Ge.getConnectivityStats().isOnline)}),se.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(Ge.getConnectivityStats().consecutiveFailures)}),se.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(X.models?.data.length??0)}),se.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ee.completionCallbacks.size)}),se.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-ne)/1e3)});const Ue=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","proxy-authorization"]);function Le(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();Ue.has(o)||e.setAttribute(`http.${t}.header.${o}`,r)}}async function ze(e){let{spanName:t,url:o,target:n,method:r="GET",headers:i,body:a,signal:c,extraAttributes:u}=e,p=ae.startSpan(t,{kind:s.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});i&&Le(p,"request",i);try{let e=await fetch(o,{method:r,headers:i,body:a,signal:c});return p.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();Ue.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(p,e),be.add(1,{target:n,status_code:String(e.status)}),e.ok||p.setStatus({code:l.ERROR,message:`HTTP ${e.status}`}),{response:e,span:p}}catch(e){throw Me(p,e),p.end(),e}}async function Je(e){let{spanName:t,url:o,target:n,method:r="POST",headers:i,body:a,signal:c,headersTimeout:u,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=ae.startSpan(t,{kind:s.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});Le(f,"request",i);try{let{statusCode:e,headers:t,body:s}=await E(o,{method:r,headers:i,body:a,signal:c,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&&!Ue.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return be.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:l.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:s,span:f}}catch(e){throw Me(f,e),f.end(),e}}const Ge=new class extends EventTarget{isOnline=!0;lastChecked=(new Date).toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){o.debug("Starting connectivity monitor",{probeEndpoints:X.connectivity.probeEndpoints,fastInterval:X.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){o.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval)+Math.random()*X.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ae.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),X.connectivity.timeoutMs);try{let n=!1;for(let e of X.connectivity.probeEndpoints)try{let t=performance.now(),o=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...X.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,Ne.record(r,{endpoint:e,result:"success"});break}Ne.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),ke.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"}),He(g.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"}),He(g.WARN,"WARN","Connectivity lost",{"copilot_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,o.error("Connectivity check failed:",e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?X.connectivity.slowProbeInterval:X.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*X.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:X.connectivity.jitterMaxMs>0,connectionPooling:X.connectivity.connectionPooling,dnsCache:X.connectivity.dnsCache}}},Ke=()=>({"content-type":"application/json",accept:"application/json"}),We="0.48.1",Ve=`copilot-chat/${We}`,Xe=`GitHubCopilotChat/${We}`,Ye=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`${G.MACHINE_ID_PATH}_${t}`})(e);try{let e=await r.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=O("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(I(16)),t.digest("hex")})(e);return await r.writeFile(t,o),await r.chmod(t,384),o},Ze=async(e,t)=>{e.machineId||=await Ye(t),e.sessionId||=await(async()=>{try{let e=await r.readFile(G.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=P();return await r.writeFile(G.SESSION_ID_PATH,e),await r.chmod(G.SESSION_ID_PATH,384),e})()},Qe=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,et=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=P(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":Ve,"User-Agent":Xe,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":P(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},tt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const ot=(e,t)=>{let o=et(e);if(delete o["Copilot-Integration-Id"],o["anthropic-version"]=t?.anthropicVersion??"2023-06-01",t?.anthropicBeta){let e=function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&tt.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta);e&&(o["anthropic-beta"]=e)}return o},nt="https://api.github.com",rt=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":Ve,"user-agent":Xe,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),it="https://github.com",at="01ab8ac9400c4e429b23",st=["user:email"].join(" ");function lt(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 ct=32768,ut=[{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_***"}],pt=new Set(["authorization","cookie","set-cookie","x-api-key","proxy-authorization"]);const dt=new Map;function mt(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 ft(e,t,o){let n=function(e){let t=e;for(let{regex:e,mask:o}of ut)t=t.replace(e,o);return t}(o),r=8*ct,i=n.length>r,a=i?n.slice(0,r):n,s=O("sha256").update(n).digest("hex");if(a.length<=ct)e.setAttribute(t,a),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<a.length;o+=ct)e.setAttribute(`${t}.part_${o/ct}`,a.slice(o,o+ct));e.setAttribute(`${t}.parts`,Math.ceil(a.length/ct))}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 ht(e,t){let o=function(e){if(dt.size>=1e3&&!dt.has(e)){let e=dt.keys().next().value;void 0!==e&&dt.delete(e)}let t,o=(dt.get(e)??0)+1;return dt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Ae.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&&ft(e,"copilot_api.incoming_request_body",n);let r=gt(t.c.req.header());return r&&ft(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&ft(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&ft(e,"copilot_api.outgoing_headers",gt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&ft(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function gt(e){let t={};for(let[o,n]of Object.entries(e))pt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}var _t=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}};function yt(e){return e.req.path.startsWith("/v1/messages")}function kt(e,t){if(yt(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"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 bt(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 vt(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 xt(e){let{c:t,error:o,errorText:n,upstream:r}=e,i=p.getActiveSpan();if(!i)return;let a=mt({endpointType:lt(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});ht(i,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:a})}async function $t(e,t){if(t instanceof _t&&429===t.response.status)return async function(e,t){let o=p.getActiveSpan(),n=e.get("requestId"),r=ee.completionCallbacks.get(n);r&&(ee.logRateLimit(r,t.response),ee.completionCallbacks.delete(n)),fe.add(1,{action:"rejected",source:"upstream"});let i=await t.response.text(),a=kt(i,e),s=wt(a);return o?.setStatus({code:l.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),bt(o,s),He(g.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...vt(s)}),xt({c:e,error:t,errorText:i,upstream:s}),e.json(a,429)}(e,t);if(t instanceof SyntaxError){p.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),He(g.WARN,"WARN",`Invalid JSON in request body: ${t.message}`,{"copilot_api.status_code":400,"http.path":e.req.path,"copilot_api.error_type":"invalid_json_body"});let o=yt(e)?{type:"error",error:{type:"invalid_request_error",message:"Invalid JSON in request body"}}:{error:{message:"Invalid JSON in request body",type:"invalid_request_error"}};return e.json(o,400)}if(o.error("Error occurred:",t),t instanceof _t)return async function(e,t){let n=p.getActiveSpan(),r=await t.response.text(),i=kt(r,e),a=wt(i);return o.error("HTTP error:",i),n?.setStatus({code:l.ERROR,message:t.message}),n?.recordException(t),n?.setAttribute("copilot_api.error_type","HTTPError"),bt(n,a),He(g.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...vt(a)}),xt({c:e,error:t,errorText:r,upstream:a}),e.json(i,t.response.status)}(e,t);let n=p.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:l.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),He(g.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name});let i=yt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(i,500)}const Tt=async()=>{let e=`${nt}/copilot_internal/v2/token`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await ze({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:rt(X),signal:o.signal});try{if(!t.ok)throw new _t("Failed to get Service token",t);return await t.json()}catch(e){throw Me(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function At(){let e=`${nt}/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await ze({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${X._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new _t("Failed to get GitHub user",t);return await t.json()}catch(e){throw Me(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}let St=null;function Ct(){return St||=Tt().then(({token:e})=>{X._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{St=null}),St}const Et=async()=>{let e=`${Qe(X)}/models`,t=et(X),o=X.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),o);try{let{response:o,span:r}=await ze({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new _t("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw Me(r,e),e}finally{r.end()}}finally{clearTimeout(r)}};const Ot=e=>new Promise(t=>{setTimeout(t,e)}),It=e=>null==e;async function Pt(){X.models=await(async()=>{try{return await Et()}catch(e){if(e instanceof _t&&401===e.response.status)return await Ct(),Et();throw e}})()}var Nt=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Rt,qt,jt,Dt,Ht=!1;const Mt=()=>r.readFile(G.GITHUB_TOKEN_PATH,"utf8"),Bt=e=>r.writeFile(G.GITHUB_TOKEN_PATH,e,{mode:384});function Ft(e){let{span:t,error:n,reason:r,refreshStart:i,attempt:a}=e,s=n.response.status,c=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";X._t1=void 0,clearInterval(Rt),Rt=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${c}. Scheduled refresh halted. Re-authenticate to resume.`),_e.add(1,{reason:r,success:"false"}),ye.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:l.ERROR,message:n.message}),t.recordException(n),Pe.record(performance.now()-i,{reason:r}),He(g.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${c})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":a,"copilot_api.token_refresh.terminal_status":s})}function Ut(e){let{span:t,error:n,reason:r,refreshStart:i,maxRetries:a}=e;X._t1=void 0,o.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=n instanceof Error?n:Error(String(n));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code:l.ERROR,message:s.message}),t.recordException(s),ye.add(1,{reason:r}),Pe.record(performance.now()-i,{reason:r}),He(g.ERROR,"ERROR",`Token refresh failed after ${a} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":a})}const Lt=async(e=5,t=1e3,n="scheduled")=>Ht?(o.debug("Token refresh already in progress, coalescing"),qt):(Ht=!0,qt=ae.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 Tt();return X._t1=t,o.debug("Service token refreshed successfully"),X.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),_e.add(1,{reason:n,success:"true"}),Pe.record(performance.now()-i,{reason:n}),void He(g.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":a})}catch(s){if(s instanceof _t&&(401===s.response.status||403===s.response.status))return void Ft({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),_e.add(1,{reason:n,success:"false"}),l)return void Ut({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(),Ht=!1,qt=void 0}}),qt);async function zt(e){try{let t=await Mt();if(t&&!e?.force)return X._t2=t,X.showToken&&o.info("Auth token:",t),void await Jt();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=X.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${it}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:at,scope:st}),signal:e.signal});if(!t.ok)throw new _t("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{d.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=h.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",m(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 Nt("Authorization timed out — the code expired. Please run the command again.");let i=new AbortController,a=X.timeoutMs,s=setTimeout(()=>{i.abort()},a);try{let n=await fetch(`${it}/login/oauth/access_token`,{method:"POST",headers:Ke(),body:JSON.stringify({client_id:at,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:i.signal});if(!n.ok){await Ot(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 Nt("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Nt("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 Ot(t);continue}if(r.access_token)return r.access_token;await Ot(t)}catch(e){if(e instanceof Nt)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await Ot(t);continue}throw e}finally{clearTimeout(s)}}}(n);await Bt(r),X._t2=r,X.showToken&&o.info("Auth token:",r),await Jt()}catch(e){throw e instanceof _t?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function Jt(){let e=await At();o.success(`Authenticated as ${e.login}`)}async function Gt(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),X.showToken=e.showToken,await K(),await zt({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"]})}),Wt=async()=>{let e=`${nt}/copilot_internal/user`,t=X.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await ze({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:rt(X),signal:o.signal});try{if(!t.ok)throw new _t("Failed to get usage",t);return await t.json()}catch(e){throw Me(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Vt=e({meta:{name:"check-usage",description:"Show current usage/quota information"},async run(){await K(),await zt();try{let e=await Wt(),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)}}}),Xt=N(m);async function Yt(){let e="win32"===h.platform?"where.exe":"which";try{return await Xt(e,["tailscale"]),!0}catch{return!1}}async function Zt(){try{let{stdout:e}=await Xt("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Qt(e){return e.replace(/\.$/,"")}async function eo(){let e=await Zt();if(e?.Online)return Qt(e.DNSName)}const to=N(m),oo=e=>`[1m${e}[0m`,no=e=>`[2m${e}[0m`,ro=e=>`[36m${e}[0m`,io=e=>`[32m${e}[0m`,ao=e=>`[31m${e}[0m`,so=e=>`[33m${e}[0m`,lo=no(" ─────────────────────────────────────────────────────────────"),co=a.join(G.APP_DIR,"certs","tailscale"),uo=a.join(co,"cert.pem"),po=a.join(co,"key.pem"),mo={certDir:co,certPath:uo,keyPath:po};function fo(){switch(h.platform){case"darwin":return[` ${no("Install Tailscale for macOS:")}`,` ${ro("https://tailscale.com/download/mac")}`,` ${no("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${no("After installing, open the Tailscale app and sign in.")}`,` ${no("Then re-run this command.")}`].join("\n");case"linux":return[` ${no("Install Tailscale for Linux:")}`,` ${ro("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${ro("sudo tailscale up")}`,` ${no("or")} ${ro("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${no("Install Tailscale for Windows:")}`,` ${ro("https://tailscale.com/download/windows")}`,"",` ${no("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${no("Install Tailscale:")} ${ro("https://tailscale.com/download")}`}}function ho(){let e=[` ${ao("Tailscale is not running.")}`];return"darwin"===h.platform?e.push(` ${no("Open the Tailscale app from Applications and sign in.")}`,` ${no("Download:")} ${ro("https://tailscale.com/download/mac")}`):"win32"===h.platform?e.push(` ${no("Open the Tailscale app and sign in.")}`,` ${no("Download:")} ${ro("https://tailscale.com/download/windows")}`):e.push(` ${no("Connect with:")} ${ro("sudo tailscale up")}`),e.push("",` ${no("Then re-run this command.")}`),e.join("\n")}async function go(){try{return await r.access(uo),await r.access(po),!0}catch{return!1}}function _o(e){console.log(""),console.log(lo),console.log(` ${oo("Claude Cowork Setup")} ${no("— Diagnostic")}`),console.log(lo),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?io("✅"):"missing"===n.status?ao("❌"):so("❓");let r=n.detail?no(` ${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(` ${io("All checks passed.")}`):console.log(` ${ao(`${t.length} issue(s).`)} Run ${ro("copilot-api cowork-setup install")} to fix.`),console.log("")}const yo={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},ko=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 Yt();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return _o(e),console.log(""),console.log(fo()),void console.log("");let o=await Zt();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},_o(e),console.log(ho()),void console.log("");let n=Qt(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await go();e["tailscale-cert"]=r?{status:"ok",detail:uo}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),_o(e)}(),h.exit(0)}}),install:e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:yo},async run({args:e}){await async function(e){if(console.log(""),console.log(lo),console.log(` ${oo("Claude Cowork Setup")} ${no("— Install")}`),console.log(lo),console.log(""),!await Yt())return console.log(` ${ao("Tailscale is not installed.")}`),console.log(""),console.log(fo()),console.log(""),console.log(` ${no("After installing, run")} ${ro("tailscale up")} ${no("to connect, then re-run this command.")}`),void console.log("");let t=await Zt();if(!t||!t.Online)return console.log(ho()),void console.log("");let n=Qt(t.DNSName);if(console.log(` ${no("Tailscale hostname:")} ${oo(n)}`),console.log(""),console.log(` ${oo("Generating TLS certificate via Tailscale…")}`),console.log(` ${no("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${ro(`$ tailscale cert --cert-file ${uo} --key-file ${po} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await r.mkdir(co,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await to("tailscale",["cert","--cert-file",uo,"--key-file",po,n]),console.log(` ${io("✓ 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(lo),console.log(` ${oo("Next steps")}`),console.log(lo),console.log(""),console.log(` ${oo("1.")} Start the proxy:`),console.log(` ${ro("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${oo("2.")} In Cowork ${no("→")} Settings ${no("→")} Inference Provider, set:`),console.log(` ${oo("inferenceGatewayBaseUrl")} = ${ro(`https://${n}:<port>`)}`),console.log(` ${no("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${oo("3.")} Restart Cowork ${no("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${no("For Cowork's own configuration docs, see:")}`),console.log(` ${ro("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),h.exit(0)}}),revert:e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:yo},async run({args:e}){await async function(e){if(console.log(""),console.log(lo),console.log(` ${oo("Claude Cowork Setup")} ${no("— Revert")}`),console.log(lo),console.log(""),!await go())return console.log(` ${no("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${oo("Remove Tailscale cert files:")}`),console.log(` ${no(uo)}`),console.log(` ${no(po)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await r.rm(co,{recursive:!0}),console.log(` ${io("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${no("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),h.exit(0)}})}});async function wo(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await r.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:i.platform(),arch:i.arch()}}async function vo(){try{return!!(await r.stat(G.GITHUB_TOKEN_PATH)).isFile()&&(await r.readFile(G.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function xo(e){let t=await async function(){let[e,t]=await Promise.all([wo(),vo()]);return{version:e,runtime:bo(),paths:{APP_DIR:G.APP_DIR,GITHUB_TOKEN_PATH:G.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 $o=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})=>xo({json:e.json})}),To="copilot-api-node20",Ao=`https://registry.npmjs.org/${To}/latest`,So=e=>`[1m${e}[0m`,Co=e=>`[33m${e}[0m`;async function Eo(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Ao,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Oo(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 Io=new Map,Po=new Map,No=new Set;let Ro,qo,jo;function Do(e){return!e.closed&&!e.destroyed}function Ho(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new C(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return Io.set(t,Date.now()),Te.add(1,{event:"created",origin:e}),He(g.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=No.has(t);Te.add(1,{event:"goaway",origin:e}),He(a?g.WARN:g.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}),Po.delete(t),No.delete(t),Io.delete(t),Do(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Mo(e){if(!X.connectivity.h2)return;Ro&&Ro!==e&&function(){for(let e of[...Po.keys(),...No])Do(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Po.clear(),No.clear(),Io.clear()}(),Ro=e;let t=Date.now();for(let[n]of Po)if(t-(Io.get(n)??0)>=6e5)Po.delete(n),Io.delete(n),Do(n)&&n.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Te.add(1,{event:"rotated",origin:e}),He(g.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Do(n))return Po.delete(n),No.add(n),n;Po.delete(n),Io.delete(n)}let n=Ho(e);return No.add(n),n}function Bo(e){e&&No.delete(e)&&(Do(e)?Po.set(e,Date.now()):Io.delete(e))}function Fo(){jo||(jo=setInterval(()=>{!function(){let e=Date.now(),t=X.connectivity.h2Keepalive,n=Po.size;for(let[r,i]of Po)e-i<6e4||t&&n<=1||(Po.delete(r),Io.delete(r),n--,Do(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Te.add(1,{event:"idle_reaped",origin:Ro??""}),He(g.INFO,"INFO",`HTTP/2 idle connection reaped for ${Ro}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Ro??""}))}()},3e4),jo.unref())}function Uo(){qo||(o.debug("Starting HTTP/2 keepalive (every 45s)"),qo=setInterval(()=>{(async function(){if(0===Po.size&&0===No.size){if(Ro){let e=Ho(Ro);Po.set(e,Date.now())}return}let e=[...Po.keys()];for(let t of e)Po.delete(t);await Promise.allSettled(e.map(async e=>{if(Do(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:et(X)});await n.dump(),$e.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Po.set(e,Date.now())}catch(t){$e.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Te.add(1,{event:"error",origin:Ro??""}),Io.delete(e),Do(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Io.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),qo.unref(),Fo())}function Lo(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=h;if("win32"===e){try{if(f(`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 zo=e=>`[1m${e}[0m`,Jo=e=>`[2m${e}[0m`,Go=e=>`[36m${e}[0m`,Ko=e=>`[32m${e}[0m`,Wo=e=>`[33m${e}[0m`,Vo=e=>`[4m${e}[0m`,Xo=(e,t)=>`]8;;${e}\\${t}]8;;\\`,Yo="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Zo="https://github.com/johnib/copilot-api-issues/issues",Qo=Jo(" ─────────────────────────────────────────────────────────────");function en(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}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=["",Qo,` ${zo("BARAZANY.DEV")} ${Jo("— Recent Posts")}`,Qo,""];for(let[o,n]of e.entries()){let e=Xo(`${n.url}${Yo}`,zo(Vo(`[${o+1}]`)));t.push(` ${e} ${Go(n.title)}`,` ${Jo("→")} ${Jo(n.teaser)}`,"")}return t.push(Qo,` ${Xo(`https://barazany.dev/blog${Yo}`,"barazany.dev/blog")}`,Qo),t}function nn(e){let t=[];X.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):X.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearch?`Tavily ${Ko("✓")}`:Jo("off"),n=["",` ${zo("COPILOT-API")} ${Jo(`v${e.version}`)}`,Qo,` ${Jo("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Jo("User")} ${e.user} ${Jo("·")} ${e.accountType}`];return X._v1&&n.push(` ${Jo("Client")} VSCode ${X._v1}`),n.push(` ${Jo("Network")} ${t.join(Jo(" · "))}`,` ${Jo("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Jo("Clipboard")} Claude Code command ${Ko("✓")}`),n.push(Qo),n}function rn(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${zo("Active")}`];if(e.model){let o=X.models?.data.find(t=>t.id===e.model),n=en(o?.capabilities.limits?.max_context_window_tokens);t.push(` ${Go(e.model.padEnd(32))} ${Jo("ctx")} ${zo(n.padStart(5))} ${Wo("← main")}`)}if(e.smallModel){let o=X.models?.data.find(t=>t.id===e.smallModel),n=en(o?.capabilities.limits?.max_context_window_tokens);t.push(` ${e.smallModel.padEnd(32)} ${Jo("ctx")} ${n.padStart(5)} ${Wo("← small")}`)}return t}function an(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of X.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("",` ${zo(o)}`);for(let o of n){let n=o.id===e.model||o.id===e.smallModel,r=n?Go("●"):Jo("·"),i=n?Go(o.id.padEnd(34)):o.id.padEnd(34),a=o.ctx?en(o.ctx).padStart(5):"";t.push(` ${r} ${i} ${Jo(a)}`)}}return t}function sn(){let e=Zo.replace(/^https:\/\//,""),t=Xo(`${Zo}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",Qo,` ${zo("FOUND A BUG?")} ${Jo("— Report it on GitHub")}`,Qo,"",` ${Go("→")} ${Go(t)}`,` ${Jo("Bug reports, feature requests, and questions welcome.")}`,"",Qo]}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=["",Qo,` ${zo("Claude Cowork")} ${Jo("— Settings → Inference Provider")}`,Qo,"",` ${Jo("Paste into")} ${zo("inferenceGatewayBaseUrl")}${Jo(":")}`,` ${zo(Go(r))}`];return n||i.push("",` ${Jo("Your Tailscale hostname is shown by:")} ${Go("tailscale status --self")}`),i.push("",` ${Jo("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=["",Qo,` ${zo("HTTPS")} ${Jo("— self-signed cert")}`,Qo,"",` ${Jo("Cert")} ${t}`];switch(o.push("",` ${zo("Trust this cert")} ${Jo("(one-time setup)")}`),h.platform){case"darwin":o.push(` ${Jo("macOS:")}`,` ${Go("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Go(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Jo("Windows (PowerShell as Administrator):")}`,` ${Go(`Import-Certificate -FilePath "${t}" \``)}`,` ${Go("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Jo("Linux (Debian/Ubuntu):")}`,` ${Go(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Go("sudo update-ca-certificates")}`,` ${Jo("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(` ${Jo("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Jo("Or, for Node CLIs only (no admin needed):")}`,` ${Go(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Qo),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=a.join(G.APP_DIR,"certs"),dn=a.join(pn,"cert.pem"),mn=a.join(pn,"key.pem"),fn=a.join(pn,"cert.meta.json");async function hn(e){try{return await r.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!==j(e)}async function yn(e){await r.mkdir(pn,{recursive:!0});let t=new Date,o=new Date;o.setDate(o.getDate()+825);let n=["127.0.0.1","::1"],i=new Set(["localhost"]),a=new Set(n);for(let t of e)_n(t)?a.add(t):i.add(t);let s=await D([{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:[...[...i].map(e=>({type:2,value:e})),...[...a].map(e=>({type:7,ip:e}))]}]});return await r.writeFile(dn,s.cert,{mode:420}),await r.writeFile(mn,s.private,{mode:384}),await async function(e){await r.writeFile(fn,JSON.stringify(e,null,2),{mode:420})}({hosts:[...i,...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,c=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",c),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();Ue.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),i>=400&&n.setStatus({code:l.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(ce.add(1,d),Se.record(s,d),c>=400&&ue.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&&(pe.add(e.inputTokens,t),Re.record(e.inputTokens,t)),e.outputTokens&&(de.add(e.outputTokens,t),qe.record(e.outputTokens,t)),e.cachedTokens&&me.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ee.executeCompletion(a)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const wn=1048576;const bn=async()=>ae.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),De.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),xe.add(1,{result:"rejected"}),new _t("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),xe.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={haiku:"claude-haiku-4.5","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 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=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]]);var On=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function In(e){if(!e||"string"!=typeof e)throw new On("Model name is required and must be a string");if(!X.models?.data)throw new On("Models not available. Please try again later.",503);let t=X.models.data.map(e=>e.id);if(t.includes(e))return e;let o=Cn(e,t);if(!o)throw he.add(1,{requested_model:e}),new On(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}async function Pn(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return ae.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"),fe.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new _t("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*a;n.setAttribute("copilot_api.rate_limit.action","waited"),fe.add(1,{action:"waited",source:"local"}),Oe.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await Ot(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function Nn(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 Rn(e,t,o){return Math.min(Math.max(e,t),o)}function qn(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 qn(JSON.parse(r),t+1)}catch{return null}}function jn(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Nn(o.capabilities.supports.min_thinking_budget),r=Nn(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Nn(o.capabilities.limits?.max_output_tokens)??void 0}}function Dn(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Rn(Nn(e.requestedBudget)??o,o,n),i=Nn(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 Hn(e,t){if(It(e.thinking_budget))return e;let o=jn(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Dn({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 Mn(e){return"invalid_thinking_budget"===qn(e)}async function Bn(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(It(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(!Mn(a))return null;let l=jn(n,t.model);return l?function(e,t){let o=Dn({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=Nn(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 Fn(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 Un(){return new Promise(e=>setTimeout(e,100))}function Ln(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=>Ln(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?Ln(r):r;return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}async function zn(e,t,o){try{if(!e.ok)throw new _t("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 Me(t,e),e}finally{t.end()}}const Jn=async e=>{let t=Ln(e);try{return await Gn(t)}catch(e){if(e instanceof _t&&401===e.response.status)return await Ct(),Gn(t);let n;if(e instanceof _t)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Bn({payload:t,error:e,models:X.models,errorBodyText:n});if(r)return e instanceof _t&&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 Gn(Ln(r));throw e}},Gn=async e=>{if(!X._t1)throw Error("Service token not found");let t=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),n=e.messages.some(e=>["assistant","tool"].includes(e.role)),r={...et(X,t),"X-Initiator":n?"agent":"user"},i=Qe(X),a=`${i}/chat/completions`,s=X.timeoutMs,l=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t))return{...e};let{max_tokens:o,...n}=e;return null==o?{...n}:{...n,max_completion_tokens:o}}(e,X.models),c=JSON.stringify(l),u={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":s,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":e.max_tokens??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":n?"agent":"user"};for(let t=0;t<=1;t++){let n=Mo(i),l=new AbortController,p=setTimeout(()=>l.abort(),s);try{let{statusCode:o,headers:i,body:p,span:d}=await Je({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 _t("Failed to create chat completions",m,{outgoingBody:c,outgoingHeaders:r});return{events:F(m),span:d,release:()=>Bo(n)}}try{return await zn(m,d,{outgoingBody:c,outgoingHeaders:r})}finally{Bo(n)}}catch(e){if(Bo(n),Fn(e)&&t<1){o.warn(`HTTP/2 connection error during chat completions, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await Un();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function Kn(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 Wn(e){await Pn(X);let t=await e.req.json();o.debug("Request payload:",JSON.stringify(t).slice(-400));try{t=function(e){return ae.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=In(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),ge.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 On)return p.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}if(e.set("requestData",{model:t.model,streaming:!!t.stream}),X.manualApprove&&await bn(),It(t.max_tokens)){let e=X.models?.data.find(e=>e.id===t.model);t={...t,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(t.max_tokens))}t=Hn(t,X.models),It(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(Ce.record(i,{model:t.model,target:"chat_completions",streaming:String(!!t.stream)}),Vn(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 B(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++,ve.add(1,{model:t.model,endpoint_type:"openai"}),a=Kn(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(Ee.record(s,l),je.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 Be(s,e.get("requestSpan"),t),t}finally{n.value&&Tn(s,n.value),s.end(),l()}let u=e.get("requestId");u&&ee.executeCompletion(u)}finally{e.get("resolveStreamComplete")?.()}})}const Vn=e=>Object.hasOwn(e,"choices"),Xn=new H;Xn.post("/",async e=>{try{return await Wn(e)}catch(t){return await $t(e,t)}});const Yn=new H;Yn.post("/",async e=>{try{let t=await e.req.json();try{t.model=In(t.model)}catch(t){if(t instanceof On)return p.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=performance.now(),n=await(async e=>{if(!X._t1)throw Error("Service token not found");let t=`${Qe(X)}/embeddings`,o=et(X),n=X.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),n),a=JSON.stringify(e);try{let{response:n,span:i}=await ze({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 _t("Failed to create embeddings",n,{outgoingBody:a,outgoingHeaders:o});return await n.json()}catch(e){throw Me(i,e),e}finally{i.end()}}finally{clearTimeout(i)}})(t),r=performance.now()-o;Ce.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 $t(e,t)}});const Zn=new H;let Qn=null,er=null;Zn.get("/",async e=>{let t,o=function(){let e=X._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let o=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),n=JSON.parse(atob(o)),r="object"==typeof n&&n&&"exp"in n&&"number"==typeof n.exp?n.exp:void 0;return void 0!==r&&1e3*r<Date.now()?"expired":"valid"}catch{return"expired"}}(),n=await async function(){let e=Date.now(),t=Qn;return t&&e-t.timestamp<3e4?{result:t.result}:er||(er=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${Qe(X)}/models`,n=await fetch(t,{method:"GET",headers:et(X),signal:e.signal}),r=Math.round(performance.now()-o),i=n.ok?"reachable":"unreachable";return Qn={result:i,timestamp:Date.now()},{result:i,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Qn={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),er=null}})(),er)}();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.29.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 tr=new U(z),or={...L["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function nr(e){return tr.encode(e).length}function rr(e){let t=0;for(let o of e)switch(o.type){case"text":t+=nr(o.text)*or.contentMultiplier;break;case"tool_use":t+=nr(o.name+JSON.stringify(o.input))*or.contentMultiplier;break;case"tool_result":o.content&&(t+=nr("string"==typeof o.content?o.content:JSON.stringify(o.content))*or.contentMultiplier);break;case"thinking":t+=nr(o.thinking)*or.contentMultiplier;break;case"image":t+=1600}return t}function ir(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?or.perFirstProp:or.perAdditionalProp,t+=nr(o),r.description&&(t+=or.perPropDesc+nr(r.description)),r.enum&&Array.isArray(r.enum)){t+=or.perEnum;for(let e of r.enum)t+=nr(String(e))}if("object"===r.type&&r.properties&&(t+=or.perNestedObject,t+=ir(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=or.perArrayOfObjects,t+=ir(e))}}return t}function ar(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 sr(e,t,o){let n=ar(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const lr=async(e,t)=>{if(!X._t1)throw Error("Service token not found");let{metadata:n,...r}=Ln(e),i={...ot(X,t),"X-Initiator":"agent"},a=Qe(X),s=`${a}/v1/messages`,l=X.timeoutMs,c=JSON.stringify(r),u=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",...ar(e,t?.anthropicBeta)}}(r,t,l);for(let e=0;e<=1;e++){let t=Mo(a),p=new AbortController,d=setTimeout(()=>p.abort(),l);try{let{statusCode:o,headers:n,body:a,span:d}=await Je({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 _t("Failed to create anthropic messages",m,{outgoingBody:c,outgoingHeaders:i});if(r.stream)return{events:F(m),span:d,release:()=>Bo(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(),Bo(t)}}catch(n){if(Bo(t),Fn(n)&&e<1){o.warn(`HTTP/2 connection error during anthropic messages, retrying (attempt ${e+1}): ${n instanceof Error?n.message:String(n)}`),await Un();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function cr(e,t,o){try{if(!e.ok)throw new _t("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 Me(t,e),e}finally{t.end()}}const ur=async e=>{try{return await pr(e)}catch(t){if(t instanceof _t&&401===t.response.status)return await Ct(),pr(e);throw t}},pr=async e=>{if(!X._t1)throw Error("Service token not found");let t=Ln(e),n={...et(X),"X-Initiator":"agent"},r=Qe(X),i=`${r}/responses`,a=X.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=Mo(r),u=new AbortController,p=setTimeout(()=>u.abort(),a);try{let{statusCode:o,headers:r,body:p,span:d}=await Je({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 _t("Failed to create responses",m,{outgoingBody:s,outgoingHeaders:n});return{events:F(m),span:d,release:()=>Bo(c)}}try{return await cr(m,d,{outgoingBody:s,outgoingHeaders:n})}finally{Bo(c)}}catch(t){if(Bo(c),Fn(t)&&e<1){o.warn(`HTTP/2 connection error during responses, retrying (attempt ${e+1}): ${t instanceof Error?t.message:String(t)}`),await Un();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function dr(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function mr(e,t){let o={model:e.model,messages:fr(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:kr(e.tools),tool_choice:wr(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=jn(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=Nn(t),i=r&&r>1?r-1:o.min;return Rn(Math.min(n,i),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Hn({...o,thinking_budget:i},t)}}return o}function fr(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:hr(e)}]:[{role:"system",content:hr(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:yr(e.content)});n.length>0&&t.push({role:"user",content:yr(n)})}else t.push({role:"user",content:yr(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:_r(e.reasoning_text),reasoning_opaque:_r(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:yr(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:yr(e.content),...t}]}(e));return[...o,...n]}function hr(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const gr=32768;function _r(e){if("string"==typeof e)return e.length<=gr?e:e.slice(0,gr)}function yr(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 kr(e){if(e)return e.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function wr(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 br(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 vr(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function xr(e){return e?e.map(e=>{let t={};try{t=JSON.parse(e.function.arguments)}catch{n.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}}):[]}function $r(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 Tr=/[^\w-]/g;function Ar(e){return e.replaceAll(Tr,"_")}function Sr(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={...o,system:$r(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:Ar(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Ar(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Cr(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 Er(e){let t={model:e.model,input:Ir(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:Or(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 Or(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Ir(e){let t=[];for(let o of e)"user"===o.role?t.push(...Pr(o)):t.push(...Rr(o));return t}function Pr(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(Nr(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 Nr(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 Rr(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 qr(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 jr(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function Dr(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 Hr(e,t){let o=[];switch(e.type){case"response.created":Dr(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){Dr(t,o),jr(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":Dr(t,o),jr(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":jr(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":{jr(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:qr(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":{Dr(t,o),jr(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":Dr(t,o),jr(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":Dr(t,o),jr(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":Dr(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 Mr(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 Br(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function Fr(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&&(Mr(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&&(Mr(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),Br(t,o)),r.content&&(Br(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){Br(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&&(Br(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:dr(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}var Ur=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 Lr(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 ze({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 Me(a,e),e}finally{a.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new Ur:e}finally{clearTimeout(a)}}function zr(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Jr(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function Gr(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=X.tavilyApiKey;if(!e)throw s=!0,i="unavailable",Error("No Tavily API key configured");a=(await Lr(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_${zr()}`,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:Jr(e)}];return{id:`msg_tavily_${zr()}`,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_${zr()}`,r=`msg_tavily_${zr()}`,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:Jr(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}),B(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const Kr=new Set(["low","medium","high","max","xhigh"]);function Wr(e){let t=e.output_config?.effort;if(!t)return e;let n=X.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=function(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}(t,n);if(!r||!Kr.has(r))return e;let i=r;if(i===t)return e;o.debug(`Effort clamp: ${t} → ${i}`);let a=p.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}}}function Vr(e,t){let n=X.models?.data.map(e=>e.id)??[],r=/context-1m/i.test(e.req.header("anthropic-beta")??""),i=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}(t.model,n,{context1m:r,effort:t.output_config?.effort}),a=t;if(i&&i!==t.model){o.debug(`Resolved model variant: ${t.model} → ${i}`);let e=p.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",t.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),a={...t,model:i}}return Wr(a)}async function Xr(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 Gr(e,t);await Pn(X),o.debug("Anthropic request payload:",JSON.stringify(t)),t=Vr(e,t);let n=function(e,t){return ae.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),sr(n,t,e.req.header("anthropic-beta"));let r=In(t.model);n.setAttribute("copilot_api.model.normalized",r);let i=Cr(t);return i?(p.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),ge.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 On)return p.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(!n.ok)return n.response;if(t=n.payload,!X._t1&&!await async function(){return!!X._t1||(await Lt(1,0,"on-demand"),!!X._t1)}())return p.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 n=performance.now(),r=ae.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),Er(t)}finally{e.end()}});Ie.record(performance.now()-n,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",JSON.stringify(r)),e.set("requestData",{model:r.model,streaming:!!r.stream}),X.manualApprove&&await bn();let i=performance.now(),a=await ur(r),s=performance.now()-i;if(Ce.record(s,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Qr(a)){let t=e.get("requestData")||{};if(a.usage&&(t.tokenUsage=$n({prompt_tokens:a.usage.input_tokens,completion_tokens:a.usage.output_tokens,total_tokens:a.usage.total_tokens})),t._d1=s,e.set("requestData",t),o.debug("Non-streaming Responses API response:",JSON.stringify(a).slice(-400)),"failed"===a.status)return p.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:a.error?.code??"api_error",message:a.error?.message??"Response generation failed"}},500);let n=performance.now(),r=ae.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:qr(e.status,o),stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}(a)}finally{e.end()}});return Ie.record(performance.now()-n,{direction:"responses_to_anthropic"}),e.json(r)}o.debug("Streaming Responses API response");let{events:l,span:c,release:u}=a;return B(e,async t=>{let n=null,i=0,a=performance.now(),p={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let a of l){if(o.debug("Responses API raw stream event:",JSON.stringify(a)),!a.data)continue;let l;try{l=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}i++,ve.add(1,{model:r.model,endpoint_type:"responses"});let c=Yr(l);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=$n(n),t._d1=s,e.set("requestData",t)}let u=Hr(l,p);for(let e of u)o.debug("Translated Anthropic event:",JSON.stringify(e)),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let c=performance.now()-a,u={model:r.model,endpoint_type:"responses"};Ee.record(c,u),je.record(i,u)}catch(t){throw Be(c,e.get("requestSpan"),t),t}finally{n&&Tn(c,n),c.end(),u()}let d=e.get("requestId");d&&ee.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=Sr(t,X.models),n={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")};return e.set("requestData",{model:o.model,streaming:!!o.stream}),X.manualApprove&&await bn(),ae.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),sr(t,o,n.anthropicBeta);try{let r=performance.now(),i=await(async(e,t)=>{try{return await lr(e,t)}catch(o){if(o instanceof _t&&401===o.response.status)return await Ct(),lr(e,t);throw o}})(o,n),a=performance.now()-r;if(Ce.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(ei(t)),o._d1=a,e.set("requestData",o)}return t.end(),e.json(o)}let{events:s,span:l,release:c}=i;return B(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++,ve.add(1,{model:o.model,endpoint_type:"anthropic_messages"}),ti(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"};Ee.record(e,t),je.record(i,t)}finally{if(p){let t=ei(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&&ee.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Me(t,e),t.end(),e}})}(e,t);let r=performance.now(),i=ae.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),mr(t,X.models)}finally{o.end()}});Ie.record(performance.now()-r,{direction:"anthropic_to_openai"}),i=Hn(i,X.models),o.debug("Translated OpenAI request payload:",JSON.stringify(i)),e.set("requestData",{model:i.model,streaming:!!i.stream});let a=performance.now();X.manualApprove&&await bn();let s=await Jn(i),l=performance.now()-a;if(Ce.record(l,{model:i.model,target:"chat_completions",streaming:String(!!i.stream)}),Zr(s)){let t=e.get("requestData")||{};s.usage&&(t.tokenUsage=$n(s.usage)),t._d1=l,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(s).slice(-400));let n=performance.now(),r=ae.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=vr(i.message),a=br(i.message.content),s=xr(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:dr(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(s);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 Ie.record(performance.now()-n,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",JSON.stringify(r)),e.json(r)}o.debug("Streaming response from service");let{events:c,span:u,release:d}=s;return B(e,async t=>{let n=null,r=0,a=performance.now(),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of c){if(o.debug("Raw stream event:",JSON.stringify(a)),"[DONE]"===a.data)break;if(!a.data)continue;let c;try{c=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,ve.add(1,{model:i.model,endpoint_type:"anthropic"}),c.usage){n=c.usage;let t=e.get("requestData")||{};t.tokenUsage=$n(n),t._d1=l,e.set("requestData",t)}let u=Fr(c,s);for(let e of u)o.debug("Translated Anthropic event:",JSON.stringify(e)),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let u=performance.now()-a,p={model:i.model,endpoint_type:"anthropic"};if(Ee.record(u,p),je.record(r,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=$n(n),t._d1=l,e.set("requestData",t))}}catch(t){throw Be(u,e.get("requestSpan"),t),t}finally{n&&Tn(u,n),u.end(),d()}let p=e.get("requestId");p&&ee.executeCompletion(p)}finally{e.get("resolveStreamComplete")?.()}})}function Yr(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 Zr=e=>Object.hasOwn(e,"choices"),Qr=e=>Object.hasOwn(e,"output");function ei(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 ti(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 oi=new H;oi.post("/",async e=>{try{return await Xr(e)}catch(t){return await $t(e,t)}});const ni=new H;function ri(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)}ni.get("/",async e=>{try{X.models||await Pt();let t=X.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await $t(e,t)}});const ii=new Set(["message","function_call","function_call_output"]),ai=new Set(["type","name","description","parameters"]);async function si(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||!X.tavilyApiKey)&&(o.info(`Enriching web search: "${n}"`),e.sources=(await Lr(X.tavilyApiKey,n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function li(e){if(X.tavilyApiKey)try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await si(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function ci(e){if(!X.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 si(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function ui(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 pi(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&&ui(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)ui(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function di(e){return null!=e}function mi(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 ii.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"])di(e[t])&&(n[t]=e[t]);let r=new Set;if(di(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))ai.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(di(e.reasoning)&&"object"==typeof e.reasoning){let t=e.reasoning;n.reasoning={},di(t.effort)&&(n.reasoning.effort=t.effort),di(t.summary)&&(n.reasoning.summary=t.summary)}if(di(e.text)&&"object"==typeof e.text){let t=e.text;di(t.format)&&(n.text={format:t.format})}return{payload:n,customToolNames:r}}async function fi(e){await Pn(X);let{payload:t,customToolNames:n}=mi(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 ae.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=In(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),ge.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 On)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}),X.manualApprove&&await bn();let i=performance.now(),a=await ur(r),s=performance.now()-i;if(Ce.record(s,{model:r.model,target:"responses",streaming:String(!!r.stream)}),hi(a))return async function(e,t,o){await li(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 B(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=pi(a.data,n);l=await ci(l);let c=l===a.data?a:{...a,data:l};ve.add(1,{model:r.model,endpoint_type:"responses"}),ri(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"};Ee.record(c,u),je.record(i,u)}catch(t){throw Be(c,e.get("requestSpan"),t),t}finally{o.value&&Tn(c,o.value),c.end(),u()}let p=e.get("requestId");p&&ee.executeCompletion(p)}finally{e.get("resolveStreamComplete")?.()}})}const hi=e=>Object.hasOwn(e,"output"),gi=new H;gi.post("/",async e=>{try{return await fi(e)}catch(t){return await $t(e,t)}});const _i=new H;_i.get("/",e=>{try{return X.showToken?e.json({token:X._t1}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return o.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const yi=new H;yi.get("/",async e=>{try{let t=await Wt();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const ki=new H;ki.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,u=lt(a);e.set("requestId",r),e.header("x-request-id",r);let d=ae.startSpan("copilot_api.handle_request",{kind:s.SERVER,attributes:{"http.method":i,"http.url":e.req.url,"http.route":a,"copilot_api.request_id":r,"copilot_api.endpoint_type":u}});e.set("requestSpan",d),e.set("requestTraceContext",d.spanContext());for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();Ue.has(e)||d.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>wn?t.slice(0,wn):t)}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:i,path:a,endpointType:u});let m,f=new Promise(e=>{m=e});e.set("streamComplete",f),e.set("resolveStreamComplete",m);let h=p.setSpan(c.active(),d);await c.with(h,async()=>{ee.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw d.setStatus({code:l.ERROR,message:t.message}),d.recordException(t),e}});let g=e.get("requestData"),_={c:e,start:n,method:i,path:a,endpointType:u,requestId:r,span:d};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{d.recordException(t),d.setStatus({code:l.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{d.end()}catch{}}):kn(_)}),ki.use(M()),ki.use(async(e,t)=>{let o=e.req.header("content-length");if(o){let t=Number(o);if(Number.isFinite(t)&&t>33554432)return n.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()}),ki.get("/",e=>e.text("Server running")),ki.route("/health",Zn),ki.route("/chat/completions",Xn),ki.route("/models",ni),ki.route("/embeddings",Yn),ki.route("/usage",yi),ki.route("/token",_i),ki.route("/v1/chat/completions",Xn),ki.route("/v1/models",ni),ki.route("/v1/embeddings",Yn),ki.route("/v1/messages",oi),ki.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=or.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=or.perMessage+nr(e)*or.contentMultiplier}for(let e of t.messages)o+=or.perMessage,o+=nr(e.role),"string"==typeof e.content?o+=nr(e.content)*or.contentMultiplier:Array.isArray(e.content)&&(o+=rr(e.content));return t.tools&&t.tools.length>0&&(o+=function(e){let t=or.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=or.perTool),t+=nr(n.name),n.description&&(t+=or.perDesc+nr(n.description)),t+=ir(n.input_schema);return t}(t.tools)),e.json({input_tokens:Math.round(o)})}),ki.route("/v1/responses",gi),ki.route("/responses",gi);const wi=[],bi=Date.now();let vi="";function xi(){let e=async(e,t=0)=>{let n=ae.startSpan("copilot_api.server.shutdown",{kind:s.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-bi)/1e3}});for(let t of wi)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Xo("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Qo,` ${zo("COPILOT-API")} ${Jo(`v${e}`)} ${Jo("·")} ${un(t)} uptime`,Qo,""," Check in from time to time on",` ${Go(o)}`,"",Qo,""];console.log(n.join("\n"))}(vi,Date.now()-bi),h.exit(t)};h.on("SIGINT",()=>e("SIGINT")),h.on("SIGTERM",()=>e("SIGTERM")),h.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),h.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}function $i(e){return e._t2?"cli_arg":h.env.GH_TOKEN?"env_var":"stored"}function Ti(e){let{options:t,version:o,runtime:n,_u1:r}=e,i=ae.startSpan("copilot_api.server.startup",{kind:s.INTERNAL,attributes:Fe({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:$i(t)},runtime:n,identity:{_u1:r.login,machineId:X.machineId,sessionId:X.sessionId,_v1:X._v1},connectivity:X.connectivity,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-bi},"copilot_api")});if(X.models?.data)for(let e of X.models.data)i.addEvent("copilot_api.model.available",Fe(e,"model"));i.end(),He(g.INFO,"INFO","Server started",Fe({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:X.models?.data.length??0,startupDurationMs:Date.now()-bi},"copilot_api"))}async function Ai(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[o,n]=await Promise.all([r.readFile(e,"utf8"),r.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 Si(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=mo;try{R(t),R(n)}catch{throw o.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:n}}(e);if(xi(),wi.push(()=>{o.debug("Cleaning up connectivity monitor"),Ge.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),Rt&&=void clearInterval(Rt),jt&&=void Ge.off("online",jt),Dt&&=void Ge.off("offline",Dt),qt=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),qo&&=void clearInterval(qo),jo&&=void clearInterval(jo);let e=[...Po.keys(),...No];Po.clear(),No.clear(),Io.clear(),Ro=void 0;for(let t of e)Do(t)&&(Te.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){if(!te)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([te.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");X.accountType=t.accountType,X.manualApprove=t.manual,X.rateLimitSeconds=t.rateLimit,X.rateLimitWait=t.rateLimitWait,X.showToken=t.showToken,X.timeoutMs=t.timeout,X.connectivity.timeoutMs=t.connectTimeout,t.tavilyApiKey&&(X.tavilyApiKey=t.tavilyApiKey),function(){let e="1"===h.env.COPILOT_H2_KEEPALIVE||"true"===h.env.COPILOT_H2_KEEPALIVE,t=e||"1"===h.env.COPILOT_H2||"true"===h.env.COPILOT_H2;X.connectivity.h2=t,X.connectivity.h2Keepalive=e}(),await K(),X._v1="1.121.0-insider";let n=await wo();vi=n;let r=bo();(function(e,t){t&&(ne=t),oe=crypto.randomUUID();let o=b({[A]:"copilot-api",[S]:e,[T]:oe}),{endpoint:n,headers:r}=ie();te=new $({resource:o,traceExporter:new w({url:`${n}/v1/traces`,headers:r}),metricReader:new x({exporter:new k({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new v(new y({url:`${n}/v1/logs`,headers:r}))],instrumentations:[]}),te.start()})(n,bi),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||h.env.GH_TOKEN;a?(X._t2=a,o.info("Using provided Auth token")):await zt();try{i=await At(),await Ze(X,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 Tt();X._t1=e,o.debug("Service token fetched successfully!"),X.showToken&&o.info("Service token:",e),Rt=setInterval(()=>{Lt(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),Ge.start(),jt=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Lt(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},Dt=()=>{o.debug("Network connectivity lost")},Ge.on("online",jt),Ge.on("offline",Dt)})(),await async function(){try{return await Pt(),!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(()=>{Pt().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{Pt().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)}}();wi.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),X.connectivity.h2&&(Bo(Mo(Qe(X))),X.connectivity.h2Keepalive&&Uo()),Ti({options:t,version:n,runtime:r,_u1:i});let l=await Ai(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(X.models||(o.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),h.exit(1)),e.model&&e.smallModel){let t=X.models.data.map(e=>e.id);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);if(!t.includes(e.smallModel))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid small model: ${e.smallModel}`);r=e.model,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:X.models.data.map(e=>e.id)}),i=await o.prompt("Select a small model to use",{type:"select",options:X.models.data.map(e=>e.id)})}let a=Lo({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 d.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(X.models||(o.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),h.exit(1)),e.model){let t=X.models.data.map(e=>e.id);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);r=e.model}else r=await o.prompt("Select a model to use with Codex CLI",{type:"select",options:X.models.data.map(e=>e.id)});let i=Lo({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return d.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 eo()}:void 0}}({options:t,version:n,runtime:r,user:i.login,clipboardCopied:p,tls:l})),q({fetch:ki.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 Ci(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Ei=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:Ci(t,"--rate-limit"),n=e.timeout,r=void 0===n?V:Ci(n,"--timeout"),i=e["connect-timeout"]??h.env.COPILOT_CONNECT_TIMEOUT_MS,a=void 0===i?15e3:Ci(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 Si({port:Ci(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"]||h.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([wo(),Eo()]);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 ${To}@latest`,n=Co("│"),r=` ${So("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,i=` Run ${So(o)} to update`,a=" ".repeat(54),s=Co(`╭${"─".repeat(54)}╮`),l=Co(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${a}${n}`,`${n}${Oo(r,54)}${n}`,`${n}${a}${n}`,`${n}${Oo(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:Ei,"check-usage":Vt,debug:$o,"cowork-setup":ko}}));export{};
|