copilot-api-node20 0.27.2 → 0.27.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.mjs +1 -1
- package/package.json +7 -7
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 a from"node:os";import i 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 O}from"undici";import{createHash as E,randomBytes as I,randomUUID as P}from"node:crypto";import{promisify as N}from"node:util";import{accessSync as q}from"node:fs";import{serve as R}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 L,models as U}from"ai-tokenizer";import*as J from"ai-tokenizer/encoding/claude";const G=i.join(a.homedir(),".local","share","copilot-api"),z={APP_DIR:G,GITHUB_TOKEN_PATH:i.join(G,"github_token"),MACHINE_ID_PATH:i.join(G,"machine_id"),SESSION_ID_PATH:i.join(G,"session_id")};async function K(){await r.mkdir(z.APP_DIR,{recursive:!0}),await W(z.GITHUB_TOKEN_PATH),await W(z.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,Y={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:5e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}},X=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(!Y.models)return"";let o=Y.models.data.find(e=>e.id===t);if(!o)return"";let n=o.capabilities.limits?.max_context_window_tokens;return n?` (${(e/n*100).toFixed(1)}%)`:""})(n,e.model):"",a=Q(`↑${X(o.inputTokens||0).padStart(5)} │ ↓${X(o.outputTokens||0).padStart(5)}`,18),i=X(n),s=r?`${i}${r.padStart(15-i.length)}`:i.padEnd(15);t.push(`Tokens: ${a} | 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),a=t.get("requestData"),i=` --\x3e ${Q(t.req.method,4)}${Q(t.req.path,21)}${Q(t.res.status.toString(),3)} ${Q(`${r}ms`,8)}`;a&&(i+=Z(a)),o.info(i),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,...a?.model&&{"copilot_api.model":a.model},...a?._d1&&{"copilot_api.copilot_duration_ms":Math.round(a._d1)},...a?.tokenUsage?.inputTokens&&{"copilot_api.input_tokens":a.tokenUsage.inputTokens},...a?.tokenUsage?.outputTokens&&{"copilot_api.output_tokens":a.tokenUsage.outputTokens}},t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=`⚠ --\x3e ${Q(n.req.method,4)}${Q(n.req.path,21)}${Q("429",3)} ${Q(`${a}ms`,8)}`;l+=` | Rate limited (${s}s retry) | ${i}`;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 ae(){let e=process.env.OTEL_EXPORTER_OTLP_ENDPOINT??"https://api.honeycomb.io",t=process.env.OTEL_EXPORTER_OTLP_HEADERS?function(e){return e?Object.fromEntries(e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf("=");return-1===t?[e,""]:[decodeURIComponent(e.slice(0,t)),decodeURIComponent(e.slice(t+1))]})):{}}(process.env.OTEL_EXPORTER_OTLP_HEADERS):re;return{endpoint:e.replace(/\/$/,""),headers:t}}const ie=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"}),Oe=se.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Ee=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"}),qe=se.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Re=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 a=p.getActiveSpan()?.spanContext()??r;le.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.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(Y.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 Le(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 Ue(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:c,extraAttributes:u}=e,p=ie.startSpan(t,{kind:s.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...u}});a&&Le(p,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,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:a,body:i,signal:c,headersTimeout:u,bodyTimeout:p,extraAttributes:d,dispatcher:m}=e,f=ie.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",a);try{let{statusCode:e,headers:t,body:s}=await O(o,{method:r,headers:a,body:i,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:Y.connectivity.probeEndpoints,fastInterval:Y.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){o.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?Y.connectivity.slowProbeInterval:Y.connectivity.fastProbeInterval)+Math.random()*Y.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ie.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),Y.connectivity.timeoutMs);try{let n=!1;for(let e of Y.connectivity.probeEndpoints)try{let t=performance.now(),o=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...Y.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,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?Y.connectivity.slowProbeInterval:Y.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*Y.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:Y.connectivity.jitterMaxMs>0,connectionPooling:Y.connectivity.connectionPooling,dnsCache:Y.connectivity.dnsCache}}},ze=()=>({"content-type":"application/json",accept:"application/json"}),Ke="0.43.2026040705",We=`copilot-chat/${Ke}`,Ve=`GitHubCopilotChat/${Ke}`,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`${z.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=E("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(a.hostname()),t.update(e),t.update(Date.now().toString()),t.update(I(16)),t.digest("hex")})(e);return await r.writeFile(t,o),await r.chmod(t,384),o},Xe=async(e,t)=>{e.machineId||=await Ye(t),e.sessionId||=await(async()=>{try{let e=await r.readFile(z.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=P();return await r.writeFile(z.SESSION_ID_PATH,e),await r.chmod(z.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",at="01ab8ac9400c4e429b23",it=["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 a=ct(await t.response.text(),e),i=ut(a);return o?.setStatus({code:l.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),pt(o,i),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(i)}),e.json(a,429)}(e,t);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),a=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,a),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(a)}),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 a=lt(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}const ft=async()=>{let e=`${ot}/copilot_internal/v2/token`,t=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ue({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:nt(Y),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=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ue({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${Y._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new st("Failed to get GitHub user",t);return await t.json()}catch(e){throw Me(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}const gt=e=>new Promise(t=>{setTimeout(t,e)}),_t=e=>null==e;async function yt(){Y.models=await(async()=>{let e=`${Qe(Y)}/models`,t=Ze(Y),o=Y.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),o);try{let{response:o,span:r}=await Ue({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)}})()}var kt=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let wt,bt,vt,xt=!1;const $t=()=>r.readFile(z.GITHUB_TOKEN_PATH,"utf8"),Tt=e=>r.writeFile(z.GITHUB_TOKEN_PATH,e);const At=async(e=5,t=1e3,n="scheduled")=>{if(!xt)return xt=!0,ie.startActiveSpan("copilot_api.token.refresh",async r=>{let a=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let i=1;i<=e;i++)try{r.setAttribute("copilot_api.token_refresh.attempt",i),o.debug(`Refreshing Service token (${n}, attempt ${i}/${e})`);let{token:t}=await ft();return Y._t1=t,o.debug("Service token refreshed successfully"),Y.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),_e.add(1,{reason:n,success:"true"}),Ie.record(performance.now()-a,{reason:n}),void De(g.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){let c=i===e;if(o.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),_e.add(1,{reason:n,success:"false"}),c){Y._t1=void 0,o.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let t=s instanceof Error?s:Error(String(s));return r.setAttribute("copilot_api.token_refresh.success",!1),r.setStatus({code:l.ERROR,message:t.message}),r.recordException(t),ye.add(1,{reason:n}),Ie.record(performance.now()-a,{reason:n}),void De(g.ERROR,"ERROR",`Token refresh failed after ${e} attempts (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempts":e})}let u=t*2**(i-1);o.debug(`Retrying token refresh in ${u}ms...`),await new Promise(e=>setTimeout(e,u))}}finally{r.end(),xt=!1}});o.debug("Refresh already in progress, skipping")};async function St(e){try{let t=await $t();if(t&&!e?.force)return Y._t2=t,Y.showToken&&o.info("Auth token:",t),void await Ct();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=Y.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${rt}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:at,scope:it}),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 kt("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=Y.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${rt}/login/oauth/access_token`,{method:"POST",headers:ze(),body:JSON.stringify({client_id:at,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await gt(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 kt("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new kt("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 gt(t);continue}if(r.access_token)return r.access_token;await gt(t)}catch(e){if(e instanceof kt)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await gt(t);continue}throw e}finally{clearTimeout(s)}}}(n);await Tt(r),Y._t2=r,Y.showToken&&o.info("Auth token:",r),await Ct()}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 Ct(){let e=await ht();o.success(`Authenticated as ${e.login}`)}async function Ot(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),Y.showToken=e.showToken,await K(),await St({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 Et=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})=>Ot({verbose:e.verbose,showToken:e["show-token"]})}),It=async()=>{let e=`${ot}/copilot_internal/user`,t=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ue({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:nt(Y),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)}},Pt=e({meta:{name:"check-usage",description:"Show current usage/quota information"},async run(){await K(),await St();try{let e=await It(),t=e.quota_snapshots.premium_interactions,n=t.entitlement,r=n-t.remaining,a=n>0?r/n*100:0,i=t.percent_remaining;function s(e,t){if(!t)return`${e}: N/A`;let o=t.entitlement,n=o-t.remaining,r=o>0?n/o*100:0,a=t.percent_remaining;return`${e}: ${n}/${o} used (${r.toFixed(1)}% used, ${a.toFixed(1)}% remaining)`}let l=`Premium: ${r}/${n} used (${a.toFixed(1)}% used, ${i.toFixed(1)}% remaining)`,c=s("Chat",e.quota_snapshots.chat),u=s("Completions",e.quota_snapshots.completions);o.box(`Usage (plan: ${e.copilot_plan})\nQuota resets: ${e.quota_reset_date}\n\nQuotas:\n ${l}\n ${c}\n ${u}`)}catch(p){o.error("Failed to fetch usage:",p),process.exit(1)}}}),Nt=N(m);async function qt(){let e="win32"===h.platform?"where.exe":"which";try{return await Nt(e,["tailscale"]),!0}catch{return!1}}async function Rt(){try{let{stdout:e}=await Nt("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function jt(e){return e.replace(/\.$/,"")}async function Dt(){let e=await Rt();if(e?.Online)return jt(e.DNSName)}const Mt=N(m),Ht=e=>`[1m${e}[0m`,Ft=e=>`[2m${e}[0m`,Bt=e=>`[36m${e}[0m`,Lt=e=>`[32m${e}[0m`,Ut=e=>`[31m${e}[0m`,Jt=e=>`[33m${e}[0m`,Gt=Ft(" ─────────────────────────────────────────────────────────────"),zt=i.join(z.APP_DIR,"certs","tailscale"),Kt=i.join(zt,"cert.pem"),Wt=i.join(zt,"key.pem"),Vt={certDir:zt,certPath:Kt,keyPath:Wt};function Yt(){switch(h.platform){case"darwin":return[` ${Ft("Install Tailscale for macOS:")}`,` ${Bt("https://tailscale.com/download/mac")}`,` ${Ft("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${Ft("After installing, open the Tailscale app and sign in.")}`,` ${Ft("Then re-run this command.")}`].join("\n");case"linux":return[` ${Ft("Install Tailscale for Linux:")}`,` ${Bt("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Bt("sudo tailscale up")}`,` ${Ft("or")} ${Bt("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${Ft("Install Tailscale for Windows:")}`,` ${Bt("https://tailscale.com/download/windows")}`,"",` ${Ft("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${Ft("Install Tailscale:")} ${Bt("https://tailscale.com/download")}`}}function Xt(){let e=[` ${Ut("Tailscale is not running.")}`];return"darwin"===h.platform?e.push(` ${Ft("Open the Tailscale app from Applications and sign in.")}`,` ${Ft("Download:")} ${Bt("https://tailscale.com/download/mac")}`):"win32"===h.platform?e.push(` ${Ft("Open the Tailscale app and sign in.")}`,` ${Ft("Download:")} ${Bt("https://tailscale.com/download/windows")}`):e.push(` ${Ft("Connect with:")} ${Bt("sudo tailscale up")}`),e.push("",` ${Ft("Then re-run this command.")}`),e.join("\n")}async function Qt(){try{return await r.access(Kt),await r.access(Wt),!0}catch{return!1}}function Zt(e){console.log(""),console.log(Gt),console.log(` ${Ht("Claude Cowork Setup")} ${Ft("— Diagnostic")}`),console.log(Gt),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?Lt("✅"):"missing"===n.status?Ut("❌"):Jt("❓");let r=n.detail?Ft(` ${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(` ${Lt("All checks passed.")}`):console.log(` ${Ut(`${t.length} issue(s).`)} Run ${Bt("copilot-api cowork-setup install")} to fix.`),console.log("")}const eo={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},to=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await qt();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return Zt(e),console.log(""),console.log(Yt()),void console.log("");let o=await Rt();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},Zt(e),console.log(Xt()),void console.log("");let n=jt(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await Qt();e["tailscale-cert"]=r?{status:"ok",detail:Kt}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),Zt(e)}(),h.exit(0)}}),install:e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:eo},async run({args:e}){await async function(e){if(console.log(""),console.log(Gt),console.log(` ${Ht("Claude Cowork Setup")} ${Ft("— Install")}`),console.log(Gt),console.log(""),!await qt())return console.log(` ${Ut("Tailscale is not installed.")}`),console.log(""),console.log(Yt()),console.log(""),console.log(` ${Ft("After installing, run")} ${Bt("tailscale up")} ${Ft("to connect, then re-run this command.")}`),void console.log("");let t=await Rt();if(!t||!t.Online)return console.log(Xt()),void console.log("");let n=jt(t.DNSName);if(console.log(` ${Ft("Tailscale hostname:")} ${Ht(n)}`),console.log(""),console.log(` ${Ht("Generating TLS certificate via Tailscale…")}`),console.log(` ${Ft("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Bt(`$ tailscale cert --cert-file ${Kt} --key-file ${Wt} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await r.mkdir(zt,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Mt("tailscale",["cert","--cert-file",Kt,"--key-file",Wt,n]),console.log(` ${Lt("✓ 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(Gt),console.log(` ${Ht("Next steps")}`),console.log(Gt),console.log(""),console.log(` ${Ht("1.")} Start the proxy:`),console.log(` ${Bt("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Ht("2.")} In Cowork ${Ft("→")} Settings ${Ft("→")} Inference Provider, set:`),console.log(` ${Ht("inferenceGatewayBaseUrl")} = ${Bt(`https://${n}:<port>`)}`),console.log(` ${Ft("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Ht("3.")} Restart Cowork ${Ft("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${Ft("For Cowork's own configuration docs, see:")}`),console.log(` ${Bt("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:eo},async run({args:e}){await async function(e){if(console.log(""),console.log(Gt),console.log(` ${Ht("Claude Cowork Setup")} ${Ft("— Revert")}`),console.log(Gt),console.log(""),!await Qt())return console.log(` ${Ft("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${Ht("Remove Tailscale cert files:")}`),console.log(` ${Ft(Kt)}`),console.log(` ${Ft(Wt)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await r.rm(zt,{recursive:!0}),console.log(` ${Lt("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${Ft("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),h.exit(0)}})}});async function oo(){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 no(){let e=typeof Bun<"u";return{name:e?"bun":"node",version:e?Bun.version:process.version.slice(1),platform:a.platform(),arch:a.arch()}}async function ro(){try{return!!(await r.stat(z.GITHUB_TOKEN_PATH)).isFile()&&(await r.readFile(z.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function ao(e){let t=await async function(){let[e,t]=await Promise.all([oo(),ro()]);return{version:e,runtime:no(),paths:{APP_DIR:z.APP_DIR,GITHUB_TOKEN_PATH:z.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const io=e({meta:{name:"debug",description:"Print debug information about the application"},args:{json:{type:"boolean",default:!1,description:"Output debug information as JSON"}},run:({args:e})=>ao({json:e.json})}),so="copilot-api-node20",lo=`https://registry.npmjs.org/${so}/latest`,co=e=>`[1m${e}[0m`,uo=e=>`[33m${e}[0m`;async function po(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(lo,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function mo(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 fo=new Map,ho=new Map,go=new Set;let _o,yo,ko;function wo(e){return!e.closed&&!e.destroyed}function bo(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 fo.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,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message),Te.add(1,{event:"goaway",origin:e}),De(g.WARN,"WARN",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),ho.delete(t),go.delete(t),fo.delete(t),wo(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function vo(e){if(!Y.connectivity.h2)return;_o&&_o!==e&&function(){for(let e of[...ho.keys(),...go])wo(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});ho.clear(),go.clear(),fo.clear()}(),_o=e;let t=Date.now();for(let[n]of ho)if(t-(fo.get(n)??0)>=6e5)ho.delete(n),fo.delete(n),wo(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(wo(n))return ho.delete(n),go.add(n),n;ho.delete(n),fo.delete(n)}let n=bo(e);return go.add(n),n}function xo(e){e&&go.delete(e)&&(wo(e)?ho.set(e,Date.now()):fo.delete(e))}function $o(){ko||(ko=setInterval(()=>{!function(){let e=Date.now(),t=Y.connectivity.h2Keepalive,n=ho.size;for(let[r,a]of ho)e-a<6e4||t&&n<=1||(ho.delete(r),fo.delete(r),n--,wo(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Te.add(1,{event:"idle_reaped",origin:_o??""}),De(g.INFO,"INFO",`HTTP/2 idle connection reaped for ${_o}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":_o??""}))}()},3e4),ko.unref())}function To(){yo||(o.debug("Starting HTTP/2 keepalive (every 45s)"),yo=setInterval(()=>{(async function(){if(0===ho.size&&0===go.size){if(_o){let e=bo(_o);ho.set(e,Date.now())}return}let e=[...ho.keys()];for(let t of e)ho.delete(t);await Promise.allSettled(e.map(async e=>{if(wo(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:Ze(Y)});await n.dump(),$e.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),ho.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:_o??""}),fo.delete(e),wo(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else fo.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),yo.unref(),$o())}function Ao(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 So=e=>`[1m${e}[0m`,Co=e=>`[2m${e}[0m`,Oo=e=>`[36m${e}[0m`,Eo=e=>`[32m${e}[0m`,Io=e=>`[33m${e}[0m`,Po=e=>`[4m${e}[0m`,No=(e,t)=>`]8;;${e}\\${t}]8;;\\`,qo="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Ro=Co(" ─────────────────────────────────────────────────────────────");function jo(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}const Do=[{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 Mo(e){if(0===e.length)return[];let t=["",Ro,` ${So("BARAZANY.DEV")} ${Co("— Recent Posts")}`,Ro,""];for(let[o,n]of e.entries()){let e=No(`${n.url}${qo}`,So(Po(`[${o+1}]`)));t.push(` ${e} ${Oo(n.title)}`,` ${Co("→")} ${Co(n.teaser)}`,"")}return t.push(Ro,` ${No(`https://barazany.dev/blog${qo}`,"barazany.dev/blog")}`,Ro),t}function Ho(e){let t=[];Y.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):Y.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearch?`Tavily ${Eo("✓")}`:Co("off"),n=["",` ${So("COPILOT-API")} ${Co(`v${e.version}`)}`,Ro,` ${Co("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Co("User")} ${e.user} ${Co("·")} ${e.accountType}`];return Y._v1&&n.push(` ${Co("Client")} VSCode ${Y._v1}`),n.push(` ${Co("Network")} ${t.join(Co(" · "))}`,` ${Co("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Co("Clipboard")} Claude Code command ${Eo("✓")}`),n.push(Ro),n}function Fo(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${So("Active")}`];if(e.model){let o=Y.models?.data.find(t=>t.id===e.model),n=jo(o?.capabilities.limits?.max_context_window_tokens);t.push(` ${Oo(e.model.padEnd(32))} ${Co("ctx")} ${So(n.padStart(5))} ${Io("← main")}`)}if(e.smallModel){let o=Y.models?.data.find(t=>t.id===e.smallModel),n=jo(o?.capabilities.limits?.max_context_window_tokens);t.push(` ${e.smallModel.padEnd(32)} ${Co("ctx")} ${n.padStart(5)} ${Io("← small")}`)}return t}function Bo(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of Y.models?.data??[]){let a=r.capabilities.limits?.max_context_window_tokens,i={id:r.id,ctx:a};r.id.startsWith("text-embedding")?n.push(i):"Anthropic"===r.vendor?e.push(i):"Google"===r.vendor?o.push(i):t.push(i)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${So(o)}`);for(let o of n){let n=o.id===e.model||o.id===e.smallModel,r=n?Oo("●"):Co("·"),a=n?Oo(o.id.padEnd(34)):o.id.padEnd(34),i=o.ctx?jo(o.ctx).padStart(5):"";t.push(` ${r} ${a} ${Co(i)}`)}}return t}function Lo(e){if(!e.endpoints)return[];let{scheme:t,port:o,hostname:n}=e.endpoints,r=n?`${t}://${n}:${o}`:`${t}://<your-tailscale-hostname>:${o}`,a=["",Ro,` ${So("Claude Cowork")} ${Co("— Settings → Inference Provider")}`,Ro,"",` ${Co("Paste into")} ${So("inferenceGatewayBaseUrl")}${Co(":")}`,` ${So(Oo(r))}`];return n||a.push("",` ${Co("Your Tailscale hostname is shown by:")} ${Oo("tailscale status --self")}`),a.push("",` ${Co("Docs:")} ${Oo("https://claude.com/docs/cowork/3p/installation")}`),a}function Uo(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Ro,` ${So("HTTPS")} ${Co("— self-signed cert")}`,Ro,"",` ${Co("Cert")} ${t}`];switch(o.push("",` ${So("Trust this cert")} ${Co("(one-time setup)")}`),h.platform){case"darwin":o.push(` ${Co("macOS:")}`,` ${Oo("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Oo(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Co("Windows (PowerShell as Administrator):")}`,` ${Oo(`Import-Certificate -FilePath "${t}" \``)}`,` ${Oo("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Co("Linux (Debian/Ubuntu):")}`,` ${Oo(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Oo("sudo update-ca-certificates")}`,` ${Co("Linux (Fedora/RHEL/Arch):")}`,` ${Oo(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Oo("sudo update-ca-trust")}`);break;default:o.push(` ${Co("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Co("Or, for Node CLIs only (no admin needed):")}`,` ${Oo(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Ro),o}function Jo(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 Go=i.join(z.APP_DIR,"certs"),zo=i.join(Go,"cert.pem"),Ko=i.join(Go,"key.pem"),Wo=i.join(Go,"cert.meta.json");async function Vo(e){try{return await r.readFile(e,"utf8")}catch{return}}async function Yo(e){let t=await Vo(zo),o=await Vo(Ko),n=await async function(){let e=await Vo(Wo);if(e)try{let t=JSON.parse(e);return Array.isArray(t.hosts)&&"string"==typeof t.notAfter?t:void 0}catch{return}}();if(!t||!o||!n)return!1;let r=new Set(n.hosts);for(let t of e)if(!r.has(t))return!1;let a=Date.parse(n.notAfter);return!Number.isNaN(a)&&a-Date.now()>2592e6}function Xo(e){return 0!==j(e)}async function Qo(e){await r.mkdir(Go,{recursive:!0});let t=new Date,o=new Date;o.setDate(o.getDate()+825);let n=["127.0.0.1","::1"],a=new Set(["localhost"]),i=new Set(n);for(let t of e)Xo(t)?i.add(t):a.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:[...[...a].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))]}]});return await r.writeFile(zo,s.cert,{mode:420}),await r.writeFile(Ko,s.private,{mode:384}),await async function(e){await r.writeFile(Wo,JSON.stringify(e,null,2),{mode:420})}({hosts:[...a,...i].sort(),notAfter:o.toISOString()}),{cert:s.cert,key:s.private,certPath:zo,keyPath:Ko,generated:!0}}function Zo(e){try{!function(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),a=t.res.status,i=r?.model??"unknown",s=r?.streaming??!1,c=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",a),n.setAttribute("copilot_api.model",i),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",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)}),a>=400&&n.setStatus({code:l.ERROR,message:`HTTP ${a}`})}(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:a,requestId:i}=e,s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:a};if(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:a};e.inputTokens&&(pe.add(e.inputTokens,t),Ne.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(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}}const en=async()=>ie.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()}}),tn=3e-6,on=15e-6;function nn(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*tn+o*on,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function rn(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 ln(e,t){let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of an)if(t.pattern.test(e))return t.family;return null}(n);if(!a)return null;let i=n.replace(/-\d{8}(?::.*)?$/,""),s=r?`-${r}`:"";for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,""),o=`${i}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2")===o)return e}return function(e,t,o=null){let n=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}(a,t,r)}const cn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);var un=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function pn(e){if(!e||"string"!=typeof e)throw new un("Model name is required and must be a string");if(!Y.models?.data)throw new un("Models not available. Please try again later.",503);let t=Y.models.data.map(e=>e.id);if(t.includes(e))return e;let o=ln(e,t);if(!o)throw he.add(1,{requested_model:e}),new un(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}async function dn(e){if(void 0===e.rateLimitSeconds)return;let t=e.rateLimitSeconds;return ie.startActiveSpan("copilot_api.rate_limit.check",async n=>{try{let r=Date.now();if(n.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let a=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute("copilot_api.rate_limit.elapsed_seconds",a),a>t)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let i=Math.ceil(t-a);if(n.setAttribute("copilot_api.rate_limit.wait_seconds",i),!e.rateLimitWait)throw n.setAttribute("copilot_api.rate_limit.action","rejected"),fe.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new st("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;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 ${i} seconds before proceeding...`),await gt(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function mn(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 fn(e,t,o){return Math.min(Math.max(e,t),o)}function hn(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 hn(JSON.parse(r),t+1)}catch{return null}}function gn(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=mn(o.capabilities.supports.min_thinking_budget),r=mn(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:mn(o.capabilities.limits?.max_output_tokens)??void 0}}function _n(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=fn(mn(e.requestedBudget)??o,o,n),a=mn(e.maxTokens);if(a||=r+1,t.maxOutputTokens&&a>t.maxOutputTokens&&(a=t.maxOutputTokens),a<=r){let e=Math.min(r,a-1);if(e>=o)r=e;else{let e=o+1;if(t.maxOutputTokens&&e>t.maxOutputTokens)return{thinkingBudget:null,maxTokens:a};a=e,r=o}}return a<=r?{thinkingBudget:null,maxTokens:a}:{thinkingBudget:r,maxTokens:a}}function yn(e,t){if(_t(e.thinking_budget))return e;let o=gn(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=_n({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 kn(e){return"invalid_thinking_budget"===hn(e)}async function wn(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(_t(t.thinking_budget)||!(o instanceof Error))return null;let a,i,s=o;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==r)a=r;else try{a=await s.response.clone().text()}catch{return null}try{i=JSON.parse(a)}catch{return null}if(!kn(i))return null;let l=gn(n,t.model);return l?function(e,t){let o=_n({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=mn(e.thinking_budget);if(r&&r===o.thinkingBudget){let e=n+1;e<=t.bounds.max&&(!o.maxTokens||e<o.maxTokens)&&(n=e)}let a=o.maxTokens;if((!a||a<=n)&&(a=n+1),t.maxOutputTokens&&a>t.maxOutputTokens){if(!(t.maxOutputTokens>n))return{...e,max_tokens:t.maxOutputTokens,thinking_budget:void 0};a=t.maxOutputTokens}return{...e,max_tokens:a,thinking_budget:n}}(t,l):{...t,thinking_budget:void 0}}function bn(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}async function vn(){return new Promise(e=>setTimeout(e,100))}function xn(e){if("string"==typeof e)return function(e){let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],a=r.match(/^\[[0-9;]*[a-z]/i);t+=a?r.slice(a[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}(e);if(Array.isArray(e))return e.map(e=>xn(e));if(e&&"object"==typeof e){let t={};for(let[o,n]of Object.entries(e))t[o]=xn(n);return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}async function $n(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&&rn(t,o.usage),o}catch(e){throw Me(t,e),e}finally{t.end()}}const Tn=async e=>{let t=xn(e);try{return await An(t)}catch(e){let n;if(e instanceof st)try{n=await e.response.clone().text()}catch{n=void 0}let r=await wn({payload:t,error:e,models:Y.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 An(xn(r));throw e}},An=async e=>{if(!Y._t1)throw Error("Service token not found");let t=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),n=e.messages.some(e=>["assistant","tool"].includes(e.role)),r={...Ze(Y,t),"X-Initiator":n?"agent":"user"},a=Qe(Y),i=`${a}/chat/completions`,s=Y.timeoutMs,l=JSON.stringify(e),c={"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=vo(a),u=new AbortController,p=setTimeout(()=>u.abort(),s);try{let{statusCode:o,headers:a,body:p,span:d}=await Je({spanName:"copilot POST /chat/completions",url:i,target:"chat_completions",headers:r,body:l,signal:u.signal,headersTimeout:s,bodyTimeout:3*s,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:n}),m=new Response(p,{status:o,headers:a});if(e.stream){if(!m.ok)throw d.end(),new st("Failed to create chat completions",m);return{events:B(m),span:d,release:()=>xo(n)}}try{return await $n(m,d)}finally{xo(n)}}catch(e){if(xo(n),bn(e)&&t<1){o.warn(`HTTP/2 GOAWAY during chat completions, retrying (attempt ${t+1})`),await vn();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function Sn(e,t){if(!e.data)return e;try{let o=JSON.parse(e.data);if(o.usage&&t(o.usage),void 0!==o.usage?.prompt_tokens_details?.cached_tokens)return{...e,data:JSON.stringify({...o,usage:{...o.usage,prompt_tokens_details:void 0}})}}catch(t){o.warn("Failed to parse streaming chunk:",e.data.slice(0,200),t)}return e}async function Cn(e){await dn(Y);let t=await e.req.json();o.debug("Request payload:",JSON.stringify(t).slice(-400));try{t=function(e){return ie.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=pn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),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 un)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}),Y.manualApprove&&await en(),_t(t.max_tokens)){let e=Y.models?.data.find(e=>e.id===t.model);t={...t,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(t.max_tokens))}t=yn(t,Y.models),_t(t.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(t.thinking_budget));let n=performance.now(),r=await Tn(t),a=performance.now()-n;if(Se.record(a,{model:t.model,target:"chat_completions",streaming:String(!!t.stream)}),On(r)){let t=e.get("requestData")||{};return r.usage&&(t.tokenUsage=nn(r.usage)),t._d1=a,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(r)),e.json(r)}let{events:i,span:s,release:l}=r;return F(e,async o=>{let n={value:null},r=0,c=performance.now();try{try{for await(let s of i){let i=s;s.data&&"[DONE]"!==s.data&&(r++,ve.add(1,{model:t.model,endpoint_type:"openai"}),i=Sn(s,t=>{n.value=t;let o=e.get("requestData")||{};o.tokenUsage=nn(t),o._d1=a,e.set("requestData",o)})),await o.writeSSE(i)}let s=performance.now()-c,l={model:t.model,endpoint_type:"openai"};if(Ce.record(s,l),Re.record(r,l),n.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=nn(n.value),t._d1=a,e.set("requestData",t))}}catch(t){throw He(s,e.get("requestSpan"),t),t}finally{n.value&&rn(s,n.value),s.end(),l()}let u=e.get("requestId");u&&ee.executeCompletion(u)}finally{e.get("resolveStreamComplete")?.()}})}const On=e=>Object.hasOwn(e,"choices"),En=new M;En.post("/",async e=>{try{return await Cn(e)}catch(t){return await mt(e,t)}});const In=new M;In.post("/",async e=>{try{let t=await e.req.json();try{pn(t.model)}catch(t){if(t instanceof un)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(!Y._t1)throw Error("Service token not found");let t=`${Qe(Y)}/embeddings`,o=Ze(Y),n=Y.timeoutMs,r=new AbortController,a=setTimeout(()=>r.abort(),n);try{let{response:n,span:a}=await Ue({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(a,e),e}finally{a.end()}}finally{clearTimeout(a)}})(t),r=performance.now()-o;Se.record(r,{model:t.model,target:"embeddings",streaming:"false"});let a=e.get("requestData")||{};return a.tokenUsage=nn(n.usage),a._d1=r,e.set("requestData",a),e.json(n)}catch(t){return await mt(e,t)}});const Pn=new M;let Nn=null,qn=null;Pn.get("/",async e=>{let t,o=function(){let e=Y._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let o=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),n=JSON.parse(atob(o)),r="object"==typeof n&&n&&"exp"in n&&"number"==typeof n.exp?n.exp:void 0;return void 0!==r&&1e3*r<Date.now()?"expired":"valid"}catch{return"expired"}}(),n=await async function(){let e=Date.now(),t=Nn;return t&&e-t.timestamp<3e4?{result:t.result}:qn||(qn=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${Qe(Y)}/models`,n=await fetch(t,{method:"GET",headers:Ze(Y),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Nn={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Nn={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),qn=null}})(),qn)}();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.27.2",timestamp:(new Date).toISOString()};void 0!==n.latencyMs&&(r.upstream_latency_ms=n.latencyMs);let a="ok"===t?200:503;return e.json(r,a)});const Rn=new L(J),jn={...U["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Dn(e){return Rn.encode(e).length}function Mn(e){let t=0;for(let o of e)switch(o.type){case"text":t+=Dn(o.text)*jn.contentMultiplier;break;case"tool_use":t+=Dn(o.name+JSON.stringify(o.input))*jn.contentMultiplier;break;case"tool_result":o.content&&(t+=Dn("string"==typeof o.content?o.content:JSON.stringify(o.content))*jn.contentMultiplier);break;case"thinking":t+=Dn(o.thinking)*jn.contentMultiplier;break;case"image":t+=1600}return t}function Hn(e){let t=0,o=e.properties;if(!o)return t;let n=Object.entries(o);for(let[e,[o,r]]of n.entries()){if(t+=0===e?jn.perFirstProp:jn.perAdditionalProp,t+=Dn(o),r.description&&(t+=jn.perPropDesc+Dn(r.description)),r.enum&&Array.isArray(r.enum)){t+=jn.perEnum;for(let e of r.enum)t+=Dn(String(e))}if("object"===r.type&&r.properties&&(t+=jn.perNestedObject,t+=Hn(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=jn.perArrayOfObjects,t+=Hn(e))}}return t}function Fn(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 Bn(e,t,o){let n=Fn(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Ln=async(e,t)=>{if(!Y._t1)throw Error("Service token not found");let{metadata:n,...r}=xn(e),a={...tt(Y,t),"X-Initiator":"agent"},i=Qe(Y),s=`${i}/v1/messages`,l=Y.timeoutMs,c=JSON.stringify(r),u=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",...Fn(e,t?.anthropicBeta)}}(r,t,l);for(let e=0;e<=1;e++){let t=vo(i),p=new AbortController,d=setTimeout(()=>p.abort(),l);try{let{statusCode:o,headers:n,body:i,span:d}=await Je({spanName:"copilot POST /v1/messages",url:s,target:"anthropic_messages",headers:a,body:c,signal:p.signal,headersTimeout:l,bodyTimeout:3*l,extraAttributes:{...u,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=new Response(i,{status:o,headers:n});if(!m.ok)throw d.end(),new st("Failed to create anthropic messages",m);if(r.stream)return{events:B(m),span:d,release:()=>xo(t)};let f=await m.json();"string"==typeof f.id&&d.setAttribute("copilot_api.response.id",f.id);let h=f.usage;return h&&rn(d,{prompt_tokens:h.input_tokens??0,completion_tokens:h.output_tokens??0,total_tokens:(h.input_tokens??0)+(h.output_tokens??0)}),d.end(),xo(t),f}catch(n){if(xo(t),bn(n)&&e<1){o.warn(`HTTP/2 GOAWAY during anthropic messages, retrying (attempt ${e+1})`),await vn();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Un(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&&rn(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 Jn=async e=>{if(!Y._t1)throw Error("Service token not found");let t=xn(e),n={...Ze(Y),"X-Initiator":"agent"},r=Qe(Y),a=`${r}/responses`,i=Y.timeoutMs,s=JSON.stringify(t),l={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":i,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let c=vo(r),u=new AbortController,p=setTimeout(()=>u.abort(),i);try{let{statusCode:o,headers:r,body:p,span:d}=await Je({spanName:"copilot POST /responses",url:a,target:"responses",headers:n,body:s,signal:u.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:c}),m=new Response(p,{status:o,headers:r});if(t.stream){if(!m.ok)throw d.end(),new st("Failed to create responses",m);return{events:B(m),span:d,release:()=>xo(c)}}try{return await Un(m,d)}finally{xo(c)}}catch(t){if(xo(c),bn(t)&&e<1){o.warn(`HTTP/2 GOAWAY during responses, retrying (attempt ${e+1})`),await vn();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function Gn(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function zn(e,t){let o={model:e.model,messages:Kn(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:Qn(e.tools),tool_choice:Zn(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=gn(t,o.model);if(r){let a="enabled"===n.type&&"number"==typeof n.budget_tokens?n.budget_tokens:function(e,t,o){let n=function(e,t){return"max"===e||"xhigh"===e?t:"high"===e?16e3:"medium"===e?8e3:1024}(e,o.max),r=mn(t),a=r&&r>1?r-1:o.min;return fn(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=yn({...o,thinking_budget:a},t)}}return o}function Kn(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:Wn(e)}]:[{role:"system",content:Wn(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:Xn(e.content)});n.length>0&&t.push({role:"user",content:Xn(n)})}else t.push({role:"user",content:Xn(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:Yn(e.reasoning_text),reasoning_opaque:Yn(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Xn(e.content),...t}];let o=e.content.filter(e=>"tool_use"===e.type),n=e.content.filter(e=>"text"===e.type),r=e.content.filter(e=>"thinking"===e.type),a=[...n.map(e=>e.text),...r.map(e=>e.thinking)].join("\n\n");return o.length>0?[{role:"assistant",content:a||null,...t,tool_calls:o.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:"assistant",content:Xn(e.content),...t}]}(e));return[...o,...n]}function Wn(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const Vn=32768;function Yn(e){if("string"==typeof e)return e.length<=Vn?e:e.slice(0,Vn)}function Xn(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 Qn(e){if(e)return e.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Zn(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 er(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 tr(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function or(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 nr(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 rr(e,t){return ie.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),Bn(n,t,e.req.header("anthropic-beta"));let r=pn(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=nr(t);return a?(p.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),{ok:!1,response:e.json({type:"error",error:{type:"invalid_request_error",message:a}},400)}):r===t.model?(n.setAttribute("copilot_api.model.was_mapped",!1),{ok:!0,payload:t}):(n.setAttribute("copilot_api.model.was_mapped",!0),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 un)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()}})}function ar(e){let t={model:e.model,input:sr(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:ir(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 ir(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function sr(e){let t=[];for(let o of e)"user"===o.role?t.push(...lr(o)):t.push(...ur(o));return t}function lr(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(cr(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 cr(e){let t;return t="string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.filter(e=>"text"===e.type).map(e=>e.text).join("\n"):"",e.is_error&&(t=`[ERROR] ${t}`),{type:"function_call_output",call_id:e.tool_use_id,output:t}}function ur(e){if("string"==typeof e.content)return[{type:"message",role:"assistant",content:e.content}];let t=[],o=e.content.filter(e=>"text"===e.type),n=e.content.filter(e=>"thinking"===e.type),r=e.content.filter(e=>"tool_use"===e.type),a=[...o.map(e=>e.text),...n.map(e=>e.thinking)].join("\n\n");a&&t.push({type:"message",role:"assistant",content:a});for(let e of r)t.push({type:"function_call",call_id:e.id,name:e.name,arguments:JSON.stringify(e.input)});return t}function pr(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 dr(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function mr(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 fr(e,t){let o=[];switch(e.type){case"response.created":mr(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){mr(t,o),dr(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":mr(t,o),dr(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":dr(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":{dr(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:pr(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":{mr(t,o),dr(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":mr(t,o),dr(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":mr(t,o),dr(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":mr(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 hr(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 gr(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function _r(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&&(hr(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&&(hr(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),gr(t,o)),r.content&&(gr(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){gr(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&&(gr(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Gn(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 yr=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};async function kr(e,t,n){let r=function(e,t){let o={query:e,max_results:t?.maxResults??5};return t?.includeDomains?.length&&(o.include_domains=t.includeDomains),t?.excludeDomains?.length&&(o.exclude_domains=t.excludeDomains),o}(t,n);o.debug("Tavily search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await Ue({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw o.error(`Tavily API error (${e.status}):`,t),Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("tavily.results_count",e.results.length),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw Me(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new yr:e}finally{clearTimeout(i)}}function wr(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function br(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function vr(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return{maxResults:"number"==typeof t?.max_uses?t.max_uses:5,allowedDomains:t?.allowed_domains,blockedDomains:t?.blocked_domains}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{let e=Y.tavilyApiKey;if(!e)throw s=!0,a="unavailable",Error("No Tavily API key configured");i=(await kr(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,a??="unavailable"}let l={query:n,results:i,model:t.model,searchFailed:s,errorCode:a};if(!t.stream)return e.set("requestData",{model:t.model,streaming:!1}),e.json(function(e){let{query:t,model:o}=e,n=`srvtoolu_${wr()}`,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:br(e)}];return{id:`msg_tavily_${wr()}`,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_${wr()}`,r=`msg_tavily_${wr()}`,a=[];return a.push({type:"message_start",message:{id:r,type:"message",role:"assistant",content:[],model:o,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:"content_block_start",index:0,content_block:{type:"text",text:""}},{type:"content_block_delta",index:0,delta:{type:"text_delta",text:"I'll search for that."}},{type:"content_block_stop",index:0},{type:"content_block_start",index:1,content_block:{type:"server_tool_use",id:n,name:"web_search",input:{}}},{type:"content_block_delta",index:1,delta:{type:"input_json_delta",partial_json:JSON.stringify({query:t})}},{type:"content_block_stop",index:1},{type:"content_block_start",index:2,content_block:{type:"web_search_tool_result",tool_use_id:n,content:br(e)}},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),F(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}const xr=new Set(["low","medium","high","max","xhigh"]);function $r(e){let t=e.output_config?.effort;if(!t)return e;let n=Y.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=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=cn.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=cn.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}(t,n);if(!r||!xr.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=p.getActiveSpan();return i?.setAttribute("copilot_api.effort.requested",t),i?.setAttribute("copilot_api.effort.clamped_to",a),{...e,output_config:{...e.output_config,effort:a}}}function Tr(e,t){let n=Y.models?.data.map(e=>e.id)??[],r=/context-1m/i.test(e.req.header("anthropic-beta")??""),a=function(e,t,o={}){let n=ln(e,t);if(!n)return null;let r=new Set(t);if(o.context1m){let e=function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,r);if(e)return e}if(o.effort){let e=function(e,t,o){let n=null;if("high"===o?n="high":("max"===o||"xhigh"===o)&&(n="xhigh"),!n)return null;let r=`${e}-${n}`;return t.has(r)?r:null}(n,r,o.effort);if(e)return e}return null}(t.model,n,{context1m:r,effort:t.output_config?.effort}),i=t;if(a&&a!==t.model){o.debug(`Resolved model variant: ${t.model} → ${a}`);let e=p.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",t.model),e?.setAttribute("copilot_api.model.variant_resolved_to",a),i={...t,model:a}}return $r(i)}async function Ar(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 vr(e,t);await dn(Y),o.debug("Anthropic request payload:",JSON.stringify(t)),t=Tr(e,t);let n=rr(e,t);if(!n.ok)return n.response;if(t=n.payload,function(e){return/gpt-[\d.]+-codex/i.test(e)}(t.model))return Pr(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t){let o={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")};return e.set("requestData",{model:t.model,streaming:!!t.stream}),Y.manualApprove&&await en(),ie.startActiveSpan("copilot_api.anthropic_passthrough",async n=>{n.setAttribute("copilot_api.route","anthropic_passthrough"),n.setAttribute("copilot_api.model",t.model),n.setAttribute("copilot_api.streaming",!!t.stream),Bn(n,t,o.anthropicBeta);try{let r=performance.now(),a=await Ln(t,o),i=performance.now()-r;if(Se.record(i,{model:t.model,target:"anthropic_messages",streaming:String(!!t.stream)}),!t.stream){let t=a,o=t.usage;if(o){let t={input_tokens:o.input_tokens||0,output_tokens:o.output_tokens||0,cache_read_input_tokens:o.cache_read_input_tokens||0,cache_creation_input_tokens:o.cache_creation_input_tokens||0},n=e.get("requestData")||{};n.tokenUsage=nn(Er(t)),n._d1=i,e.set("requestData",n)}return n.end(),e.json(t)}let{events:s,span:l,release:c}=a;return F(e,async o=>{let a=0,i=performance.now(),u={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1;try{try{for await(let e of s)e.data&&"[DONE]"!==e.data?(a++,ve.add(1,{model:t.model,endpoint_type:"anthropic_messages"}),Ir(e.data,u)&&(p=!0),await o.writeSSE(e)):await o.writeSSE(e);let e=performance.now()-i,n={model:t.model,endpoint_type:"anthropic_messages"};Ce.record(e,n),Re.record(a,n)}finally{if(p){let t=Er(u);rn(l,t);let o=e.get("requestData")||{};o.tokenUsage=nn(t),o._d1=performance.now()-r,e.set("requestData",o)}l.end(),c()}let n=e.get("requestId");n&&ee.executeCompletion(n)}finally{n.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Me(n,e),n.end(),e}})}(e,t);let r=performance.now(),a=ie.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),zn(t,Y.models)}finally{o.end()}});Ee.record(performance.now()-r,{direction:"anthropic_to_openai"}),a=yn(a,Y.models),o.debug("Translated OpenAI request payload:",JSON.stringify(a)),e.set("requestData",{model:a.model,streaming:!!a.stream});let i=performance.now();Y.manualApprove&&await en();let s=await Tn(a),l=performance.now()-i;if(Se.record(l,{model:a.model,target:"chat_completions",streaming:String(!!a.stream)}),Cr(s)){let t=e.get("requestData")||{};s.usage&&(t.tokenUsage=nn(s.usage)),t._d1=l,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(s).slice(-400));let n=performance.now(),r=ie.startActiveSpan("copilot_api.translate.openai_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","openai_to_anthropic");let t=function(e){let t=[],o=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let a of e.choices){let e=tr(a.message),i=er(a.message.content),s=or(a.message.tool_calls);t.push(...e),o.push(...i),n.push(...s),("tool_calls"===a.finish_reason||"stop"===r)&&(r=a.finish_reason)}return{id:e.id,type:"message",role:"assistant",model:e.model,content:[...t,...o,...n],stop_reason:Gn(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 Ee.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:p}=s;return F(e,async t=>{let n=null,r=0,i=performance.now(),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let i of c){if(o.debug("Raw stream event:",JSON.stringify(i)),"[DONE]"===i.data)break;if(!i.data)continue;let c;try{c=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}if(r++,ve.add(1,{model:a.model,endpoint_type:"anthropic"}),c.usage){n=c.usage;let t=e.get("requestData")||{};t.tokenUsage=nn(n),t._d1=l,e.set("requestData",t)}let u=_r(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()-i,p={model:a.model,endpoint_type:"anthropic"};if(Ce.record(u,p),Re.record(r,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=nn(n),t._d1=l,e.set("requestData",t))}}catch(t){throw He(u,e.get("requestSpan"),t),t}finally{n&&rn(u,n),u.end(),p()}let d=e.get("requestId");d&&ee.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}function Sr(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 Cr=e=>Object.hasOwn(e,"choices"),Or=e=>Object.hasOwn(e,"output");function Er(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 Ir(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}async function Pr(e,t){let n=performance.now(),r=ie.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),ar(t)}finally{e.end()}});Ee.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}),Y.manualApprove&&await en();let a=performance.now(),i=await Jn(r),s=performance.now()-a;if(Se.record(s,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Or(i)){let t=e.get("requestData")||{};if(i.usage&&(t.tokenUsage=nn({prompt_tokens:i.usage.input_tokens,completion_tokens:i.usage.output_tokens,total_tokens:i.usage.total_tokens})),t._d1=s,e.set("requestData",t),o.debug("Non-streaming Responses API response:",JSON.stringify(i).slice(-400)),"failed"===i.status)return p.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:i.error?.code??"api_error",message:i.error?.message??"Response generation failed"}},500);let n=performance.now(),r=ie.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:pr(e.status,o),stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}(i)}finally{e.end()}});return Ee.record(performance.now()-n,{direction:"responses_to_anthropic"}),e.json(r)}o.debug("Streaming Responses API response");let{events:l,span:c,release:u}=i;return F(e,async t=>{let n=null,a=0,i=performance.now(),p={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let i of l){if(o.debug("Responses API raw stream event:",JSON.stringify(i)),!i.data)continue;let l;try{l=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,ve.add(1,{model:r.model,endpoint_type:"responses"});let c=Sr(l);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=nn(n),t._d1=s,e.set("requestData",t)}let u=fr(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()-i,u={model:r.model,endpoint_type:"responses"};Ce.record(c,u),Re.record(a,u)}catch(t){throw He(c,e.get("requestSpan"),t),t}finally{n&&rn(c,n),c.end(),u()}let d=e.get("requestId");d&&ee.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Nr=new M;Nr.post("/",async e=>{try{return await Ar(e)}catch(t){return await mt(e,t)}});const qr=new M;function Rr(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=nn(o),n._d1=t._d1,t.c.set("requestData",n)}qr.get("/",async e=>{try{Y.models||await yt();let t=Y.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await mt(e,t)}});const jr=new Set(["message","function_call","function_call_output"]),Dr=new Set(["type","name","description","parameters"]);async function Mr(e){if(!e)return!1;let t=e.sources;if(t&&t.length>0)return!1;let n=e.query??e.queries?.[0];return!(!n||!Y.tavilyApiKey)&&(o.info(`Enriching web search: "${n}"`),e.sources=(await kr(Y.tavilyApiKey,n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Hr(e){if(Y.tavilyApiKey)try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Mr(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Fr(e){if(!Y.tavilyApiKey)return e;try{let t=JSON.parse(e);if("response.output_item.done"===t.type){let e=t.item;if("web_search_call"===e?.type&&await Mr(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Br(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 Lr(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&&Br(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)Br(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Ur(e){return null!=e}function Jr(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 jr.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"])Ur(e[t])&&(n[t]=e[t]);let r=new Set;if(Ur(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))Dr.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(Ur(e.reasoning)&&"object"==typeof e.reasoning){let t=e.reasoning;n.reasoning={},Ur(t.effort)&&(n.reasoning.effort=t.effort),Ur(t.summary)&&(n.reasoning.summary=t.summary)}if(Ur(e.text)&&"object"==typeof e.text){let t=e.text;Ur(t.format)&&(n.text={format:t.format})}return{payload:n,customToolNames:r}}async function Gr(e){await dn(Y);let{payload:t,customToolNames:n}=Jr(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 ie.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=pn(e.model);return t.setAttribute("copilot_api.model.normalized",n),n===e.model?(t.setAttribute("copilot_api.model.was_mapped",!1),e):(t.setAttribute("copilot_api.model.was_mapped",!0),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 un)return e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:r.model,streaming:!!r.stream}),Y.manualApprove&&await en();let a=performance.now(),i=await Jn(r),s=performance.now()-a;if(Se.record(s,{model:r.model,target:"responses",streaming:String(!!r.stream)}),zr(i))return async function(e,t,o){await Hr(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=nn({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,i,s);let{events:l,span:c,release:u}=i;return F(e,async t=>{let o={value:null},a=0,i=performance.now();try{try{for await(let i of l)if(i.data&&"[DONE]"!==i.data){a++;let l=Lr(i.data,n);l=await Fr(l);let c=l===i.data?i:{...i,data:l};ve.add(1,{model:r.model,endpoint_type:"responses"}),Rr(l,{usageRef:o,c:e,_d1:s}),await t.writeSSE(c)}else await t.writeSSE(i);let c=performance.now()-i,u={model:r.model,endpoint_type:"responses"};Ce.record(c,u),Re.record(a,u)}catch(t){throw He(c,e.get("requestSpan"),t),t}finally{o.value&&rn(c,o.value),c.end(),u()}let p=e.get("requestId");p&&ee.executeCompletion(p)}finally{e.get("resolveStreamComplete")?.()}})}const zr=e=>Object.hasOwn(e,"output"),Kr=new M;Kr.post("/",async e=>{try{return await Gr(e)}catch(t){return await mt(e,t)}});const Wr=new M;Wr.get("/",e=>{try{return Y.showToken?e.json({token:Y._t1}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return o.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const Vr=new M;Vr.get("/",async e=>{try{let t=await It();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Yr=new M;Yr.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,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"}(i);e.set("requestId",r),e.header("x-request-id",r);let d=ie.startSpan("copilot_api.handle_request",{kind:s.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"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:a,path:i,endpointType:u,requestId:r,span:d};g?.streaming&&e.res.status<400?f.then(()=>Zo(_)).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{}}):Zo(_)}),Yr.use(H()),Yr.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()}),Yr.get("/",e=>e.text("Server running")),Yr.route("/health",Pn),Yr.route("/chat/completions",En),Yr.route("/models",qr),Yr.route("/embeddings",In),Yr.route("/usage",Vr),Yr.route("/token",Wr),Yr.route("/v1/chat/completions",En),Yr.route("/v1/models",qr),Yr.route("/v1/embeddings",In),Yr.route("/v1/messages",Nr),Yr.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+Dn(e)*jn.contentMultiplier}for(let e of t.messages)o+=jn.perMessage,o+=Dn(e.role),"string"==typeof e.content?o+=Dn(e.content)*jn.contentMultiplier:Array.isArray(e.content)&&(o+=Mn(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+=Dn(n.name),n.description&&(t+=jn.perDesc+Dn(n.description)),t+=Hn(n.input_schema);return t}(t.tools)),e.json({input_tokens:Math.round(o)})}),Yr.route("/v1/responses",Kr),Yr.route("/responses",Kr);const Xr=[],Qr=Date.now();let Zr="";function ea(){let e=async(e,t=0)=>{let n=ie.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()-Qr)/1e3}});for(let t of Xr)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=No("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Ro,` ${So("COPILOT-API")} ${Co(`v${e}`)} ${Co("·")} ${Jo(t)} uptime`,Ro,""," Check in from time to time on",` ${Oo(o)}`,"",Ro,""];console.log(n.join("\n"))}(Zr,Date.now()-Qr),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 ta(e){return e._t2?"cli_arg":h.env.GH_TOKEN?"env_var":"stored"}function oa(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=ie.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:ta(t)},runtime:n,identity:{_u1:r.login,machineId:Y.machineId,sessionId:Y.sessionId,_v1:Y._v1},connectivity:Y.connectivity,modelsCount:Y.models?.data.length??0,startupDurationMs:Date.now()-Qr},"copilot_api")});if(Y.models?.data)for(let e of Y.models.data)a.addEvent("copilot_api.model.available",Fe(e,"model"));a.end(),De(g.INFO,"INFO","Server started",Fe({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:Y.models?.data.length??0,startupDurationMs:Date.now()-Qr},"copilot_api"))}async function na(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 Yo(e)){let e=await Vo(zo),t=await Vo(Ko);if(e&&t)return{cert:e,key:t,certPath:zo,keyPath:Ko,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Qo(e)}(e.httpsHosts)}}async function ra(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=Vt;try{q(t),q(n)}catch{throw o.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:n}}(e);if(ea(),Xr.push(()=>{o.debug("Cleaning up connectivity monitor"),Ge.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),wt&&=void clearInterval(wt),bt&&=void Ge.off("online",bt),vt&&=void Ge.off("offline",vt)},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),yo&&=void clearInterval(yo),ko&&=void clearInterval(ko);let e=[...ho.keys(),...go];ho.clear(),go.clear(),fo.clear(),_o=void 0;for(let t of e)wo(t)&&(Te.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){te&&await te.shutdown()}()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");Y.accountType=t.accountType,Y.manualApprove=t.manual,Y.rateLimitSeconds=t.rateLimit,Y.rateLimitWait=t.rateLimitWait,Y.showToken=t.showToken,Y.timeoutMs=t.timeout,t.tavilyApiKey&&(Y.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;Y.connectivity.h2=t,Y.connectivity.h2Keepalive=e}(),await K(),Y._v1="1.118.0-insider";let n=await oo();Zr=n;let r=no();(function(e,t){t&&(ne=t),oe=crypto.randomUUID();let o=b({[A]:"copilot-api",[S]:e,[T]:oe}),{endpoint:n,headers:r}=ae();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,Qr),t._t2&&o.warn("Passing the Auth token via --github-token / -g exposes it to other processes on this host (visible in ps/proc). Prefer the GH_TOKEN environment variable instead.");let a,i=t._t2||h.env.GH_TOKEN;i?(Y._t2=i,o.info("Using provided Auth token")):await St();try{a=await ht(),await Xe(Y,a.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}await(async()=>{let{token:e,refresh_in:t}=await ft();Y._t1=e,o.debug("Service token fetched successfully!"),Y.showToken&&o.info("Service token:",e),wt=setInterval(()=>{At(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),Ge.start(),bt=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),At(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},vt=()=>{o.debug("Network connectivity lost")},Ge.on("online",bt),Ge.on("offline",vt)})(),await async function(){try{return await yt(),!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(()=>{yt().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{yt().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)}}();Xr.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),Y.connectivity.h2&&(xo(vo(Qe(Y))),Y.connectivity.h2Keepalive&&To()),oa({options:t,version:n,runtime:r,_u1:a});let l=await na(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await async function(e,t,n){if(!e._cc1)return!1;let r,a;if(Y.models||(o.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),h.exit(1)),e.model&&e.smallModel){let t=Y.models.data.map(e=>e.id);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);if(!t.includes(e.smallModel))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid small model: ${e.smallModel}`);r=e.model,a=e.smallModel}else{if(e.model||e.smallModel)throw Error("Both --model and --small-model must be specified for model selection");r=await o.prompt("Select a model to use",{type:"select",options:Y.models.data.map(e=>e.id)}),a=await o.prompt("Select a small model to use",{type:"select",options:Y.models.data.map(e=>e.id)})}let i=Ao({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:"dummy",ANTHROPIC_MODEL:r,ANTHROPIC_SMALL_FAST_MODEL:a,NODE_EXTRA_CA_CERTS:n?.certPath},"claude");try{return d.writeSync(i),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(i),!1}}(t,u,l)||await async function(e,t,n){if(!e.codex)return!1;let r;if(Y.models||(o.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),h.exit(1)),e.model){let t=Y.models.data.map(e=>e.id);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);r=e.model}else r=await o.prompt("Select a model to use with Codex CLI",{type:"select",options:Y.models.data.map(e=>e.id)});let a=Ao({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return d.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,u,l);(function(e){let t=[...Ho(e),...Fo(e),...Bo(e),"",...Mo(Do),...Lo(e),...Uo(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:o,runtime:n,user:r,clipboardCopied:a,tls:i}=e,s=i?"https":"http";return{version:o,runtime:n,user:r,accountType:t.accountType,port:t.port,timeout:t.timeout,webSearch:!!t.tavilyApiKey,model:t.model,smallModel:t.smallModel,clipboardCopied:a,https:i?{certPath:i.certPath,keyPath:i.keyPath,generated:i.generated,selfSigned:!t.httpsCert}:void 0,endpoints:t.claudeCowork?{scheme:s,port:t.port,hostname:await Dt()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:p,tls:l})),R({fetch:Yr.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 aa(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const ia=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)"},"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:aa(t,"--rate-limit"),n=e.timeout,r=void 0===n?V:aa(n,"--timeout"),a=e["https-hosts"],i=a?a.split(",").map(e=>e.trim()).filter(Boolean):[];return ra({port:aa(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,tavilyApiKey:e["tavily-api-key"]||h.env.TAVILY_API_KEY,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:i,claudeCowork:e["claude-cowork"]})}});await async function(){try{if("1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let[e,t]=await Promise.all([oo(),po()]);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 ${so}@latest`,n=uo("│"),r=` ${co("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${co(o)} to update`,i=" ".repeat(54),s=uo(`╭${"─".repeat(54)}╮`),l=uo(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${mo(r,54)}${n}`,`${n}${i}${n}`,`${n}${mo(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(e,t)}catch{}}(),await t(e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:Et,start:ia,"check-usage":Pt,debug:io,"cowork-setup":to}}));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 O}from"undici";import{createHash as E,randomBytes as I,randomUUID as P}from"node:crypto";import{promisify as N}from"node:util";import{accessSync as q}from"node:fs";import{serve as R}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 L,models as U}from"ai-tokenizer";import*as J from"ai-tokenizer/encoding/claude";const G=a.join(i.homedir(),".local","share","copilot-api"),W={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(W.APP_DIR,{recursive:!0}),await K(W.GITHUB_TOKEN_PATH),await K(W.SESSION_ID_PATH)}async function K(e){try{await r.access(e,r.constants.W_OK)}catch{await r.writeFile(e,""),await r.chmod(e,384)}}const V=6e5,Y={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}},X=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(!Y.models)return"";let o=Y.models.data.find(e=>e.id===t);if(!o)return"";let n=o.capabilities.limits?.max_context_window_tokens;return n?` (${(e/n*100).toFixed(1)}%)`:""})(n,e.model):"",i=Q(`↑${X(o.inputTokens||0).padStart(5)} │ ↓${X(o.outputTokens||0).padStart(5)}`,18),a=X(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"}),Oe=se.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Ee=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"}),qe=se.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),Re=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(Y.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 Le(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 Ue(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();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}});Le(f,"request",i);try{let{statusCode:e,headers:t,body:s}=await O(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:Y.connectivity.probeEndpoints,fastInterval:Y.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){o.debug("Stopping connectivity monitor"),this.checkInterval&&=void clearTimeout(this.checkInterval),this.abortController&&=void this.abortController.abort()}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let e=(this.isOnline?Y.connectivity.slowProbeInterval:Y.connectivity.fastProbeInterval)+Math.random()*Y.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=ae.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),Y.connectivity.timeoutMs);try{let n=!1;for(let e of Y.connectivity.probeEndpoints)try{let t=performance.now(),o=await fetch(e,{method:"HEAD",signal:this.abortController.signal,headers:{"User-Agent":"copilot-api-connectivity-monitor/1.0",...Y.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,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?Y.connectivity.slowProbeInterval:Y.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*Y.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:Y.connectivity.jitterMaxMs>0,connectionPooling:Y.connectivity.connectionPooling,dnsCache:Y.connectivity.dnsCache}}},We=()=>({"content-type":"application/json",accept:"application/json"}),ze="0.43.2026040705",Ke=`copilot-chat/${ze}`,Ve=`GitHubCopilotChat/${ze}`,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`${W.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=E("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},Xe=async(e,t)=>{e.machineId||=await Ye(t),e.sessionId||=await(async()=>{try{let e=await r.readFile(W.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=P();return await r.writeFile(W.SESSION_ID_PATH,e),await r.chmod(W.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":Ke,"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":Ke,"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=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ue({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:nt(Y),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=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ue({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${Y._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new st("Failed to get GitHub user",t);return await t.json()}catch(e){throw Me(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}const gt=e=>new Promise(t=>{setTimeout(t,e)}),_t=e=>null==e;async function yt(){Y.models=await(async()=>{let e=`${Qe(Y)}/models`,t=Ze(Y),o=Y.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),o);try{let{response:o,span:r}=await Ue({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)}})()}var kt=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let wt,bt,vt,xt=!1;const $t=()=>r.readFile(W.GITHUB_TOKEN_PATH,"utf8"),Tt=e=>r.writeFile(W.GITHUB_TOKEN_PATH,e);function At(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";Y._t1=void 0,clearInterval(wt),wt=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 St(e){let{span:t,error:n,reason:r,refreshStart:i,maxRetries:a}=e;Y._t1=void 0,o.error("All token refresh attempts failed. Stale token has been cleared — next request will trigger re-authentication or fail with a clear 'no token' error.");let s=n instanceof Error?n:Error(String(n));t.setAttribute("copilot_api.token_refresh.success",!1),t.setStatus({code: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 Ct=async(e=5,t=1e3,n="scheduled")=>{if(!xt)return xt=!0,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 Y._t1=t,o.debug("Service token refreshed successfully"),Y.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),_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 At({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 St({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(),xt=!1}});o.debug("Refresh already in progress, skipping")};async function Ot(e){try{let t=await $t();if(t&&!e?.force)return Y._t2=t,Y.showToken&&o.info("Auth token:",t),void await Et();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=Y.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${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 kt("Authorization timed out — the code expired. Please run the command again.");let i=new AbortController,a=Y.timeoutMs,s=setTimeout(()=>{i.abort()},a);try{let n=await fetch(`${rt}/login/oauth/access_token`,{method:"POST",headers:We(),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 gt(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 kt("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new kt("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 gt(t);continue}if(r.access_token)return r.access_token;await gt(t)}catch(e){if(e instanceof kt)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await gt(t);continue}throw e}finally{clearTimeout(s)}}}(n);await Tt(r),Y._t2=r,Y.showToken&&o.info("Auth token:",r),await Et()}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 Et(){let e=await ht();o.success(`Authenticated as ${e.login}`)}async function It(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),Y.showToken=e.showToken,await z(),await Ot({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 Pt=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})=>It({verbose:e.verbose,showToken:e["show-token"]})}),Nt=async()=>{let e=`${ot}/copilot_internal/user`,t=Y.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await Ue({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:nt(Y),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)}},qt=e({meta:{name:"check-usage",description:"Show current usage/quota information"},async run(){await z(),await Ot();try{let e=await Nt(),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)}}}),Rt=N(m);async function jt(){let e="win32"===h.platform?"where.exe":"which";try{return await Rt(e,["tailscale"]),!0}catch{return!1}}async function Dt(){try{let{stdout:e}=await Rt("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Mt(e){return e.replace(/\.$/,"")}async function Ht(){let e=await Dt();if(e?.Online)return Mt(e.DNSName)}const Ft=N(m),Bt=e=>`[1m${e}[0m`,Lt=e=>`[2m${e}[0m`,Ut=e=>`[36m${e}[0m`,Jt=e=>`[32m${e}[0m`,Gt=e=>`[31m${e}[0m`,Wt=e=>`[33m${e}[0m`,zt=Lt(" ─────────────────────────────────────────────────────────────"),Kt=a.join(W.APP_DIR,"certs","tailscale"),Vt=a.join(Kt,"cert.pem"),Yt=a.join(Kt,"key.pem"),Xt={certDir:Kt,certPath:Vt,keyPath:Yt};function Qt(){switch(h.platform){case"darwin":return[` ${Lt("Install Tailscale for macOS:")}`,` ${Ut("https://tailscale.com/download/mac")}`,` ${Lt("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${Lt("After installing, open the Tailscale app and sign in.")}`,` ${Lt("Then re-run this command.")}`].join("\n");case"linux":return[` ${Lt("Install Tailscale for Linux:")}`,` ${Ut("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Ut("sudo tailscale up")}`,` ${Lt("or")} ${Ut("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${Lt("Install Tailscale for Windows:")}`,` ${Ut("https://tailscale.com/download/windows")}`,"",` ${Lt("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${Lt("Install Tailscale:")} ${Ut("https://tailscale.com/download")}`}}function Zt(){let e=[` ${Gt("Tailscale is not running.")}`];return"darwin"===h.platform?e.push(` ${Lt("Open the Tailscale app from Applications and sign in.")}`,` ${Lt("Download:")} ${Ut("https://tailscale.com/download/mac")}`):"win32"===h.platform?e.push(` ${Lt("Open the Tailscale app and sign in.")}`,` ${Lt("Download:")} ${Ut("https://tailscale.com/download/windows")}`):e.push(` ${Lt("Connect with:")} ${Ut("sudo tailscale up")}`),e.push("",` ${Lt("Then re-run this command.")}`),e.join("\n")}async function eo(){try{return await r.access(Vt),await r.access(Yt),!0}catch{return!1}}function to(e){console.log(""),console.log(zt),console.log(` ${Bt("Claude Cowork Setup")} ${Lt("— Diagnostic")}`),console.log(zt),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?Jt("✅"):"missing"===n.status?Gt("❌"):Wt("❓");let r=n.detail?Lt(` ${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(` ${Jt("All checks passed.")}`):console.log(` ${Gt(`${t.length} issue(s).`)} Run ${Ut("copilot-api cowork-setup install")} to fix.`),console.log("")}const oo={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},no=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 jt();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return to(e),console.log(""),console.log(Qt()),void console.log("");let o=await Dt();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},to(e),console.log(Zt()),void console.log("");let n=Mt(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await eo();e["tailscale-cert"]=r?{status:"ok",detail:Vt}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),to(e)}(),h.exit(0)}}),install:e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:oo},async run({args:e}){await async function(e){if(console.log(""),console.log(zt),console.log(` ${Bt("Claude Cowork Setup")} ${Lt("— Install")}`),console.log(zt),console.log(""),!await jt())return console.log(` ${Gt("Tailscale is not installed.")}`),console.log(""),console.log(Qt()),console.log(""),console.log(` ${Lt("After installing, run")} ${Ut("tailscale up")} ${Lt("to connect, then re-run this command.")}`),void console.log("");let t=await Dt();if(!t||!t.Online)return console.log(Zt()),void console.log("");let n=Mt(t.DNSName);if(console.log(` ${Lt("Tailscale hostname:")} ${Bt(n)}`),console.log(""),console.log(` ${Bt("Generating TLS certificate via Tailscale…")}`),console.log(` ${Lt("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Ut(`$ tailscale cert --cert-file ${Vt} --key-file ${Yt} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await r.mkdir(Kt,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Ft("tailscale",["cert","--cert-file",Vt,"--key-file",Yt,n]),console.log(` ${Jt("✓ 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(zt),console.log(` ${Bt("Next steps")}`),console.log(zt),console.log(""),console.log(` ${Bt("1.")} Start the proxy:`),console.log(` ${Ut("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Bt("2.")} In Cowork ${Lt("→")} Settings ${Lt("→")} Inference Provider, set:`),console.log(` ${Bt("inferenceGatewayBaseUrl")} = ${Ut(`https://${n}:<port>`)}`),console.log(` ${Lt("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Bt("3.")} Restart Cowork ${Lt("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${Lt("For Cowork's own configuration docs, see:")}`),console.log(` ${Ut("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:oo},async run({args:e}){await async function(e){if(console.log(""),console.log(zt),console.log(` ${Bt("Claude Cowork Setup")} ${Lt("— Revert")}`),console.log(zt),console.log(""),!await eo())return console.log(` ${Lt("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${Bt("Remove Tailscale cert files:")}`),console.log(` ${Lt(Vt)}`),console.log(` ${Lt(Yt)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await r.rm(Kt,{recursive:!0}),console.log(` ${Jt("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${Lt("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),h.exit(0)}})}});async function ro(){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 io(){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 ao(){try{return!!(await r.stat(W.GITHUB_TOKEN_PATH)).isFile()&&(await r.readFile(W.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function so(e){let t=await async function(){let[e,t]=await Promise.all([ro(),ao()]);return{version:e,runtime:io(),paths:{APP_DIR:W.APP_DIR,GITHUB_TOKEN_PATH:W.GITHUB_TOKEN_PATH},tokenExists:t}}();e.json?function(e){console.log(JSON.stringify(e,null,2))}(t):function(e){o.info(`service debug\n\nVersion: ${e.version}\nRuntime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})\n\nPaths:\n- APP_DIR: ${e.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${e.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${e.tokenExists?"Yes":"No"}`)}(t)}const lo=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})=>so({json:e.json})}),co="copilot-api-node20",uo=`https://registry.npmjs.org/${co}/latest`,po=e=>`[1m${e}[0m`,mo=e=>`[33m${e}[0m`;async function fo(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(uo,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function ho(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 go=new Map,_o=new Map,yo=new Set;let ko,wo,bo;function vo(e){return!e.closed&&!e.destroyed}function xo(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 go.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),Te.add(1,{event:"goaway",origin:e}),De(g.WARN,"WARN",`HTTP/2 client disconnected from ${e}: ${i.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":i.message}),_o.delete(t),yo.delete(t),go.delete(t),vo(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function $o(e){if(!Y.connectivity.h2)return;ko&&ko!==e&&function(){for(let e of[..._o.keys(),...yo])vo(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});_o.clear(),yo.clear(),go.clear()}(),ko=e;let t=Date.now();for(let[n]of _o)if(t-(go.get(n)??0)>=6e5)_o.delete(n),go.delete(n),vo(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(vo(n))return _o.delete(n),yo.add(n),n;_o.delete(n),go.delete(n)}let n=xo(e);return yo.add(n),n}function To(e){e&&yo.delete(e)&&(vo(e)?_o.set(e,Date.now()):go.delete(e))}function Ao(){bo||(bo=setInterval(()=>{!function(){let e=Date.now(),t=Y.connectivity.h2Keepalive,n=_o.size;for(let[r,i]of _o)e-i<6e4||t&&n<=1||(_o.delete(r),go.delete(r),n--,vo(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Te.add(1,{event:"idle_reaped",origin:ko??""}),De(g.INFO,"INFO",`HTTP/2 idle connection reaped for ${ko}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":ko??""}))}()},3e4),bo.unref())}function So(){wo||(o.debug("Starting HTTP/2 keepalive (every 45s)"),wo=setInterval(()=>{(async function(){if(0===_o.size&&0===yo.size){if(ko){let e=xo(ko);_o.set(e,Date.now())}return}let e=[..._o.keys()];for(let t of e)_o.delete(t);await Promise.allSettled(e.map(async e=>{if(vo(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:Ze(Y)});await n.dump(),$e.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),_o.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:ko??""}),go.delete(e),vo(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else go.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),wo.unref(),Ao())}function Co(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 Oo=e=>`[1m${e}[0m`,Eo=e=>`[2m${e}[0m`,Io=e=>`[36m${e}[0m`,Po=e=>`[32m${e}[0m`,No=e=>`[33m${e}[0m`,qo=e=>`[4m${e}[0m`,Ro=(e,t)=>`]8;;${e}\\${t}]8;;\\`,jo="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",Do=Eo(" ─────────────────────────────────────────────────────────────");function Mo(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}const Ho=[{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 Fo(e){if(0===e.length)return[];let t=["",Do,` ${Oo("BARAZANY.DEV")} ${Eo("— Recent Posts")}`,Do,""];for(let[o,n]of e.entries()){let e=Ro(`${n.url}${jo}`,Oo(qo(`[${o+1}]`)));t.push(` ${e} ${Io(n.title)}`,` ${Eo("→")} ${Eo(n.teaser)}`,"")}return t.push(Do,` ${Ro(`https://barazany.dev/blog${jo}`,"barazany.dev/blog")}`,Do),t}function Bo(e){let t=[];Y.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):Y.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearch?`Tavily ${Po("✓")}`:Eo("off"),n=["",` ${Oo("COPILOT-API")} ${Eo(`v${e.version}`)}`,Do,` ${Eo("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Eo("User")} ${e.user} ${Eo("·")} ${e.accountType}`];return Y._v1&&n.push(` ${Eo("Client")} VSCode ${Y._v1}`),n.push(` ${Eo("Network")} ${t.join(Eo(" · "))}`,` ${Eo("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Eo("Clipboard")} Claude Code command ${Po("✓")}`),n.push(Do),n}function Lo(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Oo("Active")}`];if(e.model){let o=Y.models?.data.find(t=>t.id===e.model),n=Mo(o?.capabilities.limits?.max_context_window_tokens);t.push(` ${Io(e.model.padEnd(32))} ${Eo("ctx")} ${Oo(n.padStart(5))} ${No("← main")}`)}if(e.smallModel){let o=Y.models?.data.find(t=>t.id===e.smallModel),n=Mo(o?.capabilities.limits?.max_context_window_tokens);t.push(` ${e.smallModel.padEnd(32)} ${Eo("ctx")} ${n.padStart(5)} ${No("← small")}`)}return t}function Uo(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of Y.models?.data??[]){let i=r.capabilities.limits?.max_context_window_tokens,a={id:r.id,ctx:i};r.id.startsWith("text-embedding")?n.push(a):"Anthropic"===r.vendor?e.push(a):"Google"===r.vendor?o.push(a):t.push(a)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${Oo(o)}`);for(let o of n){let n=o.id===e.model||o.id===e.smallModel,r=n?Io("●"):Eo("·"),i=n?Io(o.id.padEnd(34)):o.id.padEnd(34),a=o.ctx?Mo(o.ctx).padStart(5):"";t.push(` ${r} ${i} ${Eo(a)}`)}}return t}function Jo(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=["",Do,` ${Oo("Claude Cowork")} ${Eo("— Settings → Inference Provider")}`,Do,"",` ${Eo("Paste into")} ${Oo("inferenceGatewayBaseUrl")}${Eo(":")}`,` ${Oo(Io(r))}`];return n||i.push("",` ${Eo("Your Tailscale hostname is shown by:")} ${Io("tailscale status --self")}`),i.push("",` ${Eo("Docs:")} ${Io("https://claude.com/docs/cowork/3p/installation")}`),i}function Go(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",Do,` ${Oo("HTTPS")} ${Eo("— self-signed cert")}`,Do,"",` ${Eo("Cert")} ${t}`];switch(o.push("",` ${Oo("Trust this cert")} ${Eo("(one-time setup)")}`),h.platform){case"darwin":o.push(` ${Eo("macOS:")}`,` ${Io("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Io(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Eo("Windows (PowerShell as Administrator):")}`,` ${Io(`Import-Certificate -FilePath "${t}" \``)}`,` ${Io("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Eo("Linux (Debian/Ubuntu):")}`,` ${Io(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Io("sudo update-ca-certificates")}`,` ${Eo("Linux (Fedora/RHEL/Arch):")}`,` ${Io(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Io("sudo update-ca-trust")}`);break;default:o.push(` ${Eo("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Eo("Or, for Node CLIs only (no admin needed):")}`,` ${Io(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,Do),o}function Wo(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(W.APP_DIR,"certs"),Ko=a.join(zo,"cert.pem"),Vo=a.join(zo,"key.pem"),Yo=a.join(zo,"cert.meta.json");async function Xo(e){try{return await r.readFile(e,"utf8")}catch{return}}async function Qo(e){let t=await Xo(Ko),o=await Xo(Vo),n=await async function(){let e=await Xo(Yo);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 Zo(e){return 0!==j(e)}async function en(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)Zo(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(Ko,s.cert,{mode:420}),await r.writeFile(Vo,s.private,{mode:384}),await async function(e){await r.writeFile(Yo,JSON.stringify(e,null,2),{mode:420})}({hosts:[...i,...a].sort(),notAfter:o.toISOString()}),{cert:s.cert,key:s.private,certPath:Ko,keyPath:Vo,generated:!0}}function tn(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),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 on=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()}}),nn=3e-6,rn=15e-6;function an(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*nn+o*rn,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function sn(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 ln=[{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"}],cn={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 un(e,t){let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.includes(e))return e}let i=function(e){for(let t of ln)if(t.pattern.test(e))return t.family;return null}(n);if(!i)return null;let a=n.replace(/-\d{8}(?::.*)?$/,""),s=r?`-${r}`:"";for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,""),o=`${a}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2");if(t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,"$1.$2")===o)return e}return function(e,t,o=null){let n=cn[e];if(!n)return null;if(o){let e=`${n}-${o}`;if(t.includes(e))return e}if(t.includes(n))return n;if("sonnet-4.5"===e)for(let e of["claude-3.5-sonnet"]){let n=o?`${e}-${o}`:e;if(t.includes(n))return n}return null}(i,t,r)}const pn=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);var dn=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function mn(e){if(!e||"string"!=typeof e)throw new dn("Model name is required and must be a string");if(!Y.models?.data)throw new dn("Models not available. Please try again later.",503);let t=Y.models.data.map(e=>e.id);if(t.includes(e))return e;let o=un(e,t);if(!o)throw he.add(1,{requested_model:e}),new dn(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}async function fn(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"}),Oe.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await gt(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}function hn(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 gn(e,t,o){return Math.min(Math.max(e,t),o)}function _n(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 _n(JSON.parse(r),t+1)}catch{return null}}function yn(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=hn(o.capabilities.supports.min_thinking_budget),r=hn(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:hn(o.capabilities.limits?.max_output_tokens)??void 0}}function kn(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=gn(hn(e.requestedBudget)??o,o,n),i=hn(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 wn(e,t){if(_t(e.thinking_budget))return e;let o=yn(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=kn({requestedBudget:e.thinking_budget,maxTokens:e.max_tokens,config:o});return null===n.thinkingBudget?{...e,max_tokens:n.maxTokens,thinking_budget:void 0}:{...e,max_tokens:n.maxTokens,thinking_budget:n.thinkingBudget}}function bn(e){return"invalid_thinking_budget"===_n(e)}async function vn(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(_t(t.thinking_budget)||!(o instanceof Error))return null;let i,a,s=o;if(!(s.response instanceof Response)||400!==s.response.status)return null;if(void 0!==r)i=r;else try{i=await s.response.clone().text()}catch{return null}try{a=JSON.parse(i)}catch{return null}if(!bn(a))return null;let l=yn(n,t.model);return l?function(e,t){let o=kn({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=hn(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 xn(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}async function $n(){return new Promise(e=>setTimeout(e,100))}function Tn(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=>Tn(e));if(e&&"object"==typeof e){let t={};for(let[o,n]of Object.entries(e))t[o]=Tn(n);return"object"===t.type&&!("properties"in t)&&(t.properties={}),t}return e}async function An(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&&sn(t,o.usage),o}catch(e){throw Me(t,e),e}finally{t.end()}}const Sn=async e=>{let t=Tn(e);try{return await Cn(t)}catch(e){let n;if(e instanceof st)try{n=await e.response.clone().text()}catch{n=void 0}let r=await vn({payload:t,error:e,models:Y.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 Cn(Tn(r));throw e}},Cn=async e=>{if(!Y._t1)throw Error("Service token not found");let t=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),n=e.messages.some(e=>["assistant","tool"].includes(e.role)),r={...Ze(Y,t),"X-Initiator":n?"agent":"user"},i=Qe(Y),a=`${i}/chat/completions`,s=Y.timeoutMs,l=function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t))return{...e};let{max_tokens:o,...n}=e;return null==o?{...n}:{...n,max_completion_tokens:o}}(e,Y.models),c=JSON.stringify(l),u={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":s,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":e.max_tokens??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":n?"agent":"user"};for(let t=0;t<=1;t++){let n=$o(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:()=>To(n)}}try{return await An(m,d)}finally{To(n)}}catch(e){if(To(n),xn(e)&&t<1){o.warn(`HTTP/2 GOAWAY during chat completions, retrying (attempt ${t+1})`),await $n();continue}throw e}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function On(e,t){if(!e.data)return e;try{let o=JSON.parse(e.data);if(o.usage&&t(o.usage),void 0!==o.usage?.prompt_tokens_details?.cached_tokens)return{...e,data:JSON.stringify({...o,usage:{...o.usage,prompt_tokens_details:void 0}})}}catch(t){o.warn("Failed to parse streaming chunk:",e.data.slice(0,200),t)}return e}async function En(e){await fn(Y);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=mn(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 dn)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}),Y.manualApprove&&await on(),_t(t.max_tokens)){let e=Y.models?.data.find(e=>e.id===t.model);t={...t,max_tokens:e?.capabilities.limits?.max_output_tokens},o.debug("Set max_tokens to:",JSON.stringify(t.max_tokens))}t=wn(t,Y.models),_t(t.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(t.thinking_budget));let n=performance.now(),r=await Sn(t),i=performance.now()-n;if(Se.record(i,{model:t.model,target:"chat_completions",streaming:String(!!t.stream)}),In(r)){let t=e.get("requestData")||{};return r.usage&&(t.tokenUsage=an(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=On(s,t=>{n.value=t;let o=e.get("requestData")||{};o.tokenUsage=an(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),Re.record(r,l),n.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=an(n.value),t._d1=i,e.set("requestData",t))}}catch(t){throw He(s,e.get("requestSpan"),t),t}finally{n.value&&sn(s,n.value),s.end(),l()}let u=e.get("requestId");u&&ee.executeCompletion(u)}finally{e.get("resolveStreamComplete")?.()}})}const In=e=>Object.hasOwn(e,"choices"),Pn=new M;Pn.post("/",async e=>{try{return await En(e)}catch(t){return await mt(e,t)}});const Nn=new M;Nn.post("/",async e=>{try{let t=await e.req.json();try{mn(t.model)}catch(t){if(t instanceof dn)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(!Y._t1)throw Error("Service token not found");let t=`${Qe(Y)}/embeddings`,o=Ze(Y),n=Y.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),n);try{let{response:n,span:i}=await Ue({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=an(n.usage),i._d1=r,e.set("requestData",i),e.json(n)}catch(t){return await mt(e,t)}});const qn=new M;let Rn=null,jn=null;qn.get("/",async e=>{let t,o=function(){let e=Y._t1;if(!e)return"missing";try{let t=e.split(".");if(t.length<2)return"expired";let o=(t[1]??"").replaceAll("-","+").replaceAll("_","/"),n=JSON.parse(atob(o)),r="object"==typeof n&&n&&"exp"in n&&"number"==typeof n.exp?n.exp:void 0;return void 0!==r&&1e3*r<Date.now()?"expired":"valid"}catch{return"expired"}}(),n=await async function(){let e=Date.now(),t=Rn;return t&&e-t.timestamp<3e4?{result:t.result}:jn||(jn=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${Qe(Y)}/models`,n=await fetch(t,{method:"GET",headers:Ze(Y),signal:e.signal}),r=Math.round(performance.now()-o),i=n.ok?"reachable":"unreachable";return Rn={result:i,timestamp:Date.now()},{result:i,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Rn={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),jn=null}})(),jn)}();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.27.3",timestamp:(new Date).toISOString()};void 0!==n.latencyMs&&(r.upstream_latency_ms=n.latencyMs);let i="ok"===t?200:503;return e.json(r,i)});const Dn=new L(J),Mn={...U["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Hn(e){return Dn.encode(e).length}function Fn(e){let t=0;for(let o of e)switch(o.type){case"text":t+=Hn(o.text)*Mn.contentMultiplier;break;case"tool_use":t+=Hn(o.name+JSON.stringify(o.input))*Mn.contentMultiplier;break;case"tool_result":o.content&&(t+=Hn("string"==typeof o.content?o.content:JSON.stringify(o.content))*Mn.contentMultiplier);break;case"thinking":t+=Hn(o.thinking)*Mn.contentMultiplier;break;case"image":t+=1600}return t}function Bn(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?Mn.perFirstProp:Mn.perAdditionalProp,t+=Hn(o),r.description&&(t+=Mn.perPropDesc+Hn(r.description)),r.enum&&Array.isArray(r.enum)){t+=Mn.perEnum;for(let e of r.enum)t+=Hn(String(e))}if("object"===r.type&&r.properties&&(t+=Mn.perNestedObject,t+=Bn(r)),"array"===r.type&&r.items){let e=r.items;"object"===e.type&&e.properties&&(t+=Mn.perArrayOfObjects,t+=Bn(e))}}return t}function Ln(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 Un(e,t,o){let n=Ln(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Jn=async(e,t)=>{if(!Y._t1)throw Error("Service token not found");let{metadata:n,...r}=Tn(e),i={...tt(Y,t),"X-Initiator":"agent"},a=Qe(Y),s=`${a}/v1/messages`,l=Y.timeoutMs,c=JSON.stringify(r),u=function(e,t,o){return{"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":o,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length||0,"copilot_api.max_tokens":e.max_tokens||0,"copilot_api.api_type":"anthropic_passthrough",...Ln(e,t?.anthropicBeta)}}(r,t,l);for(let e=0;e<=1;e++){let t=$o(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:()=>To(t)};let f=await m.json();"string"==typeof f.id&&d.setAttribute("copilot_api.response.id",f.id);let h=f.usage;return h&&sn(d,{prompt_tokens:h.input_tokens??0,completion_tokens:h.output_tokens??0,total_tokens:(h.input_tokens??0)+(h.output_tokens??0)}),d.end(),To(t),f}catch(n){if(To(t),xn(n)&&e<1){o.warn(`HTTP/2 GOAWAY during anthropic messages, retrying (attempt ${e+1})`),await $n();continue}throw n}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};async function Gn(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&&sn(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 Wn=async e=>{if(!Y._t1)throw Error("Service token not found");let t=Tn(e),n={...Ze(Y),"X-Initiator":"agent"},r=Qe(Y),i=`${r}/responses`,a=Y.timeoutMs,s=JSON.stringify(t),l={"copilot_api.model":t.model,"copilot_api.streaming":!!t.stream,"copilot_api.timeout_ms":a,"copilot_api.has_tools":!!t.tools?.length,"copilot_api.tool_count":t.tools?.length??0,"copilot_api.max_output_tokens":t.max_output_tokens??0,"copilot_api.api_type":"responses"};for(let e=0;e<=1;e++){let c=$o(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:()=>To(c)}}try{return await Gn(m,d)}finally{To(c)}}catch(t){if(To(c),xn(t)&&e<1){o.warn(`HTTP/2 GOAWAY during responses, retrying (attempt ${e+1})`),await $n();continue}throw t}finally{clearTimeout(p)}}throw Error("Unexpected: exhausted GOAWAY retries without result")};function zn(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Kn(e,t){let o={model:e.model,messages:Vn(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:er(e.tools),tool_choice:tr(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=yn(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=hn(t),i=r&&r>1?r-1:o.min;return gn(Math.min(n,i),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=wn({...o,thinking_budget:i},t)}}return o}function Vn(e,t){let o=function(e){return e?"string"==typeof e?[{role:"system",content:Yn(e)}]:[{role:"system",content:Yn(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:Zn(e.content)});n.length>0&&t.push({role:"user",content:Zn(n)})}else t.push({role:"user",content:Zn(e.content)});return t}(e):function(e){let t=function(e){return{reasoning_text:Qn(e.reasoning_text),reasoning_opaque:Qn(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Zn(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:Zn(e.content),...t}]}(e));return[...o,...n]}function Yn(e){return e.startsWith("x-anthropic-billing-header")?e.replace(/^x-_an1-billing-header:[^\n]*\n+/,""):e}const Xn=32768;function Qn(e){if("string"==typeof e)return e.length<=Xn?e:e.slice(0,Xn)}function Zn(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 er(e){if(e)return e.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function tr(e){if(e)switch(e.type){case"auto":return"auto";case"any":return"required";case"tool":return e.name?{type:"function",function:{name:e.name}}:void 0;case"none":return"none";default:return}}function or(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 nr(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function rr(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 ir(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 ar(e,t){return ae.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),Un(n,t,e.req.header("anthropic-beta"));let r=mn(t.model);n.setAttribute("copilot_api.model.normalized",r);let i=ir(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 dn)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()}})}function sr(e){let t={model:e.model,input:cr(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:lr(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 lr(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function cr(e){let t=[];for(let o of e)"user"===o.role?t.push(...ur(o)):t.push(...dr(o));return t}function ur(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(pr(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 pr(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 dr(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 mr(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 fr(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function hr(e,t,o){e.messageStartSent||=(e.responseId=o?.responseId??e.responseId,e.model=o?.model??e.model,t.push({type:"message_start",message:{id:e.responseId,type:"message",role:"assistant",content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}),!0)}function gr(e,t){let o=[];switch(e.type){case"response.created":hr(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){hr(t,o),fr(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":hr(t,o),fr(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":fr(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":{fr(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:mr(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":{hr(t,o),fr(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":hr(t,o),fr(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":hr(t,o),fr(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":hr(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 _r(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 yr(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function kr(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&&(_r(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&&(_r(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),yr(t,o)),r.content&&(yr(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){yr(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&&(yr(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:zn(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 wr=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 br(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 Ue({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 wr:e}finally{clearTimeout(a)}}function vr(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function xr(e){return e.searchFailed?[{type:"web_search_tool_result_error",error_code:e.errorCode??"unavailable"}]:e.results}async function $r(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return{maxResults:"number"==typeof t?.max_uses?t.max_uses:5,allowedDomains:t?.allowed_domains,blockedDomains:t?.blocked_domains}}(t);o.info(`Web search intercepted: "${n}"`);let i,a=[],s=!1;try{let e=Y.tavilyApiKey;if(!e)throw s=!0,i="unavailable",Error("No Tavily API key configured");a=(await br(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_${vr()}`,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:xr(e)}];return{id:`msg_tavily_${vr()}`,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_${vr()}`,r=`msg_tavily_${vr()}`,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:xr(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 Tr=new Set(["low","medium","high","max","xhigh"]);function Ar(e){let t=e.output_config?.effort;if(!t)return e;let n=Y.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=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=pn.get(o);if(void 0===n)return t[0]??null;let r=null,i=1/0;for(let e of t){let t=pn.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||!Tr.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 Sr(e,t){let n=Y.models?.data.map(e=>e.id)??[],r=/context-1m/i.test(e.req.header("anthropic-beta")??""),i=function(e,t,o={}){let n=un(e,t);if(!n)return null;let r=new Set(t);if(o.context1m){let e=function(e,t){let o=`${e}-1m`;if(t.has(o))return o;let n=`${e}-1m-`;for(let e of t)if(e.startsWith(n))return e;return null}(n,r);if(e)return e}if(o.effort){let e=function(e,t,o){let n=null;if("high"===o?n="high":("max"===o||"xhigh"===o)&&(n="xhigh"),!n)return null;let r=`${e}-${n}`;return t.has(r)?r:null}(n,r,o.effort);if(e)return e}return null}(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 Ar(a)}async function Cr(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 $r(e,t);await fn(Y),o.debug("Anthropic request payload:",JSON.stringify(t)),t=Sr(e,t);let n=ar(e,t);if(!n.ok)return n.response;if(t=n.payload,function(e){return/gpt-[\d.]+-codex/i.test(e)}(t.model))return qr(e,t);if(function(e){return e.toLowerCase().startsWith("claude-")}(t.model))return async function(e,t){let o={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")};return e.set("requestData",{model:t.model,streaming:!!t.stream}),Y.manualApprove&&await on(),ae.startActiveSpan("copilot_api.anthropic_passthrough",async n=>{n.setAttribute("copilot_api.route","anthropic_passthrough"),n.setAttribute("copilot_api.model",t.model),n.setAttribute("copilot_api.streaming",!!t.stream),Un(n,t,o.anthropicBeta);try{let r=performance.now(),i=await Jn(t,o),a=performance.now()-r;if(Se.record(a,{model:t.model,target:"anthropic_messages",streaming:String(!!t.stream)}),!t.stream){let t=i,o=t.usage;if(o){let t={input_tokens:o.input_tokens||0,output_tokens:o.output_tokens||0,cache_read_input_tokens:o.cache_read_input_tokens||0,cache_creation_input_tokens:o.cache_creation_input_tokens||0},n=e.get("requestData")||{};n.tokenUsage=an(Pr(t)),n._d1=a,e.set("requestData",n)}return n.end(),e.json(t)}let{events:s,span:l,release:c}=i;return F(e,async o=>{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:t.model,endpoint_type:"anthropic_messages"}),Nr(e.data,u)&&(p=!0),await o.writeSSE(e)):await o.writeSSE(e);let e=performance.now()-a,n={model:t.model,endpoint_type:"anthropic_messages"};Ce.record(e,n),Re.record(i,n)}finally{if(p){let t=Pr(u);sn(l,t);let o=e.get("requestData")||{};o.tokenUsage=an(t),o._d1=performance.now()-r,e.set("requestData",o)}l.end(),c()}let n=e.get("requestId");n&&ee.executeCompletion(n)}finally{n.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw Me(n,e),n.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),Kn(t,Y.models)}finally{o.end()}});Ee.record(performance.now()-r,{direction:"anthropic_to_openai"}),i=wn(i,Y.models),o.debug("Translated OpenAI request payload:",JSON.stringify(i)),e.set("requestData",{model:i.model,streaming:!!i.stream});let a=performance.now();Y.manualApprove&&await on();let s=await Sn(i),l=performance.now()-a;if(Se.record(l,{model:i.model,target:"chat_completions",streaming:String(!!i.stream)}),Er(s)){let t=e.get("requestData")||{};s.usage&&(t.tokenUsage=an(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=nr(i.message),a=or(i.message.content),s=rr(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:zn(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 Ee.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:p}=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=an(n),t._d1=l,e.set("requestData",t)}let u=kr(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),Re.record(r,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=an(n),t._d1=l,e.set("requestData",t))}}catch(t){throw He(u,e.get("requestSpan"),t),t}finally{n&&sn(u,n),u.end(),p()}let d=e.get("requestId");d&&ee.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}function Or(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 Er=e=>Object.hasOwn(e,"choices"),Ir=e=>Object.hasOwn(e,"output");function Pr(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 Nr(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}async function qr(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),sr(t)}finally{e.end()}});Ee.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}),Y.manualApprove&&await on();let i=performance.now(),a=await Wn(r),s=performance.now()-i;if(Se.record(s,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Ir(a)){let t=e.get("requestData")||{};if(a.usage&&(t.tokenUsage=an({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:mr(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 Ee.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=Or(l);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=an(n),t._d1=s,e.set("requestData",t)}let u=gr(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),Re.record(i,u)}catch(t){throw He(c,e.get("requestSpan"),t),t}finally{n&&sn(c,n),c.end(),u()}let d=e.get("requestId");d&&ee.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Rr=new M;Rr.post("/",async e=>{try{return await Cr(e)}catch(t){return await mt(e,t)}});const jr=new M;function Dr(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=an(o),n._d1=t._d1,t.c.set("requestData",n)}jr.get("/",async e=>{try{Y.models||await yt();let t=Y.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await mt(e,t)}});const Mr=new Set(["message","function_call","function_call_output"]),Hr=new Set(["type","name","description","parameters"]);async function Fr(e){if(!e)return!1;let t=e.sources;if(t&&t.length>0)return!1;let n=e.query??e.queries?.[0];return!(!n||!Y.tavilyApiKey)&&(o.info(`Enriching web search: "${n}"`),e.sources=(await br(Y.tavilyApiKey,n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Br(e){if(Y.tavilyApiKey)try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Fr(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Lr(e){if(!Y.tavilyApiKey)return e;try{let t=JSON.parse(e);if("response.output_item.done"===t.type){let e=t.item;if("web_search_call"===e?.type&&await Fr(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Ur(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 Jr(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&&Ur(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)Ur(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Gr(e){return null!=e}function Wr(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 Mr.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"])Gr(e[t])&&(n[t]=e[t]);let r=new Set;if(Gr(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))Hr.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(Gr(e.reasoning)&&"object"==typeof e.reasoning){let t=e.reasoning;n.reasoning={},Gr(t.effort)&&(n.reasoning.effort=t.effort),Gr(t.summary)&&(n.reasoning.summary=t.summary)}if(Gr(e.text)&&"object"==typeof e.text){let t=e.text;Gr(t.format)&&(n.text={format:t.format})}return{payload:n,customToolNames:r}}async function zr(e){await fn(Y);let{payload:t,customToolNames:n}=Wr(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=mn(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 dn)return e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:r.model,streaming:!!r.stream}),Y.manualApprove&&await on();let i=performance.now(),a=await Wn(r),s=performance.now()-i;if(Se.record(s,{model:r.model,target:"responses",streaming:String(!!r.stream)}),Kr(a))return async function(e,t,o){await Br(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=an({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=Jr(a.data,n);l=await Lr(l);let c=l===a.data?a:{...a,data:l};ve.add(1,{model:r.model,endpoint_type:"responses"}),Dr(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),Re.record(i,u)}catch(t){throw He(c,e.get("requestSpan"),t),t}finally{o.value&&sn(c,o.value),c.end(),u()}let p=e.get("requestId");p&&ee.executeCompletion(p)}finally{e.get("resolveStreamComplete")?.()}})}const Kr=e=>Object.hasOwn(e,"output"),Vr=new M;Vr.post("/",async e=>{try{return await zr(e)}catch(t){return await mt(e,t)}});const Yr=new M;Yr.get("/",e=>{try{return Y.showToken?e.json({token:Y._t1}):e.json({error:"Token endpoint disabled. Restart with --show-token to enable it.",token:null},403)}catch(t){return o.error("Error fetching token:",t),e.json({error:"Failed to fetch token",token:null},500)}});const Xr=new M;Xr.get("/",async e=>{try{let t=await Nt();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const Qr=new M;Qr.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(()=>tn(_)).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{}}):tn(_)}),Qr.use(H()),Qr.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()}),Qr.get("/",e=>e.text("Server running")),Qr.route("/health",qn),Qr.route("/chat/completions",Pn),Qr.route("/models",jr),Qr.route("/embeddings",Nn),Qr.route("/usage",Xr),Qr.route("/token",Yr),Qr.route("/v1/chat/completions",Pn),Qr.route("/v1/models",jr),Qr.route("/v1/embeddings",Nn),Qr.route("/v1/messages",Rr),Qr.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=Mn.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");o+=Mn.perMessage+Hn(e)*Mn.contentMultiplier}for(let e of t.messages)o+=Mn.perMessage,o+=Hn(e.role),"string"==typeof e.content?o+=Hn(e.content)*Mn.contentMultiplier:Array.isArray(e.content)&&(o+=Fn(e.content));return t.tools&&t.tools.length>0&&(o+=function(e){let t=Mn.toolsExist;for(let[o,n]of e.entries())o>0&&(t+=Mn.perTool),t+=Hn(n.name),n.description&&(t+=Mn.perDesc+Hn(n.description)),t+=Bn(n.input_schema);return t}(t.tools)),e.json({input_tokens:Math.round(o)})}),Qr.route("/v1/responses",Vr),Qr.route("/responses",Vr);const Zr=[],ei=Date.now();let ti="";function oi(){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()-ei)/1e3}});for(let t of Zr)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=Ro("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",Do,` ${Oo("COPILOT-API")} ${Eo(`v${e}`)} ${Eo("·")} ${Wo(t)} uptime`,Do,""," Check in from time to time on",` ${Io(o)}`,"",Do,""];console.log(n.join("\n"))}(ti,Date.now()-ei),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 ni(e){return e._t2?"cli_arg":h.env.GH_TOKEN?"env_var":"stored"}function ri(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:ni(t)},runtime:n,identity:{_u1:r.login,machineId:Y.machineId,sessionId:Y.sessionId,_v1:Y._v1},connectivity:Y.connectivity,modelsCount:Y.models?.data.length??0,startupDurationMs:Date.now()-ei},"copilot_api")});if(Y.models?.data)for(let e of Y.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:Y.models?.data.length??0,startupDurationMs:Date.now()-ei},"copilot_api"))}async function ii(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 Qo(e)){let e=await Xo(Ko),t=await Xo(Vo);if(e&&t)return{cert:e,key:t,certPath:Ko,keyPath:Vo,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),en(e)}(e.httpsHosts)}}async function ai(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=Xt;try{q(t),q(n)}catch{throw o.error("Tailscale cert not found. Run `copilot-api cowork-setup install` first."),Error("Tailscale cert not found")}return{...e,https:!0,httpsCert:t,httpsKey:n}}(e);if(oi(),Zr.push(()=>{o.debug("Cleaning up connectivity monitor"),Ge.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),wt&&=void clearInterval(wt),bt&&=void Ge.off("online",bt),vt&&=void Ge.off("offline",vt)},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),wo&&=void clearInterval(wo),bo&&=void clearInterval(bo);let e=[..._o.keys(),...yo];_o.clear(),yo.clear(),go.clear(),ko=void 0;for(let t of e)vo(t)&&(Te.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await async function(){te&&await te.shutdown()}()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");Y.accountType=t.accountType,Y.manualApprove=t.manual,Y.rateLimitSeconds=t.rateLimit,Y.rateLimitWait=t.rateLimitWait,Y.showToken=t.showToken,Y.timeoutMs=t.timeout,Y.connectivity.timeoutMs=t.connectTimeout,t.tavilyApiKey&&(Y.tavilyApiKey=t.tavilyApiKey),function(){let e="1"===h.env.COPILOT_H2_KEEPALIVE||"true"===h.env.COPILOT_H2_KEEPALIVE,t=e||"1"===h.env.COPILOT_H2||"true"===h.env.COPILOT_H2;Y.connectivity.h2=t,Y.connectivity.h2Keepalive=e}(),await z(),Y._v1="1.118.0-insider";let n=await ro();ti=n;let r=io();(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,ei),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?(Y._t2=a,o.info("Using provided Auth token")):await Ot();try{i=await ht(),await Xe(Y,i.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}await(async()=>{let{token:e,refresh_in:t}=await ft();Y._t1=e,o.debug("Service token fetched successfully!"),Y.showToken&&o.info("Service token:",e),wt=setInterval(()=>{Ct(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},1e3*(t-60)),Ge.start(),bt=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),Ct(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},vt=()=>{o.debug("Network connectivity lost")},Ge.on("online",bt),Ge.on("offline",vt)})(),await async function(){try{return await yt(),!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(()=>{yt().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let s=function(e=18e5){let t=setInterval(()=>{yt().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)}}();Zr.push(()=>{o.debug("Cleaning up model refresh interval"),s()}),Y.connectivity.h2&&(To($o(Qe(Y))),Y.connectivity.h2Keepalive&&So()),ri({options:t,version:n,runtime:r,_u1:i});let l=await ii(t),c=l?"https":"http",u=`${c}://localhost:${t.port}`,p=await async function(e,t,n){if(!e._cc1)return!1;let r,i;if(Y.models||(o.error("Cannot apply --claude-code defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --claude-code."),h.exit(1)),e.model&&e.smallModel){let t=Y.models.data.map(e=>e.id);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);if(!t.includes(e.smallModel))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid small model: ${e.smallModel}`);r=e.model,i=e.smallModel}else{if(e.model||e.smallModel)throw Error("Both --model and --small-model must be specified for model selection");r=await o.prompt("Select a model to use",{type:"select",options:Y.models.data.map(e=>e.id)}),i=await o.prompt("Select a small model to use",{type:"select",options:Y.models.data.map(e=>e.id)})}let a=Co({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(Y.models||(o.error("Cannot apply --codex defaults: model cache is empty (Copilot API was unreachable at startup). Retry once the network/API is back, or run without --codex."),h.exit(1)),e.model){let t=Y.models.data.map(e=>e.id);if(!t.includes(e.model))throw o.info(`Available services: \n${t.join("\n")}`),Error(`Invalid model: ${e.model}`);r=e.model}else r=await o.prompt("Select a model to use with Codex CLI",{type:"select",options:Y.models.data.map(e=>e.id)});let i=Co({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=[...Bo(e),...Lo(e),...Uo(e),"",...Fo(Ho),...Jo(e),...Go(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 Ht()}:void 0}}({options:t,version:n,runtime:r,user:i.login,clipboardCopied:p,tls:l})),R({fetch:Qr.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 si(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const li=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:si(t,"--rate-limit"),n=e.timeout,r=void 0===n?V:si(n,"--timeout"),i=e["connect-timeout"]??h.env.COPILOT_CONNECT_TIMEOUT_MS,a=void 0===i?15e3:si(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 ai({port:si(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([ro(),fo()]);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 ${co}@latest`,n=mo("│"),r=` ${po("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,i=` Run ${po(o)} to update`,a=" ".repeat(54),s=mo(`╭${"─".repeat(54)}╮`),l=mo(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${a}${n}`,`${n}${ho(r,54)}${n}`,`${n}${a}${n}`,`${n}${ho(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:Pt,start:li,"check-usage":qt,debug:lo,"cowork-setup":no}}));export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "copilot-api-node20",
|
|
3
|
-
"version": "0.27.
|
|
3
|
+
"version": "0.27.3",
|
|
4
4
|
"description": "Turn GitHub Copilot into OpenAI/Anthropic API compatible server. Usable with Claude Code! (Node v20+ fork)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"proxy",
|
|
@@ -66,14 +66,14 @@
|
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
68
|
"@opentelemetry/api": "^1.9.0",
|
|
69
|
-
"@opentelemetry/api-logs": "^0.
|
|
70
|
-
"@opentelemetry/exporter-logs-otlp-http": "^0.
|
|
71
|
-
"@opentelemetry/exporter-metrics-otlp-http": "^0.
|
|
72
|
-
"@opentelemetry/exporter-trace-otlp-http": "^0.
|
|
69
|
+
"@opentelemetry/api-logs": "^0.218.0",
|
|
70
|
+
"@opentelemetry/exporter-logs-otlp-http": "^0.218.0",
|
|
71
|
+
"@opentelemetry/exporter-metrics-otlp-http": "^0.218.0",
|
|
72
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.218.0",
|
|
73
73
|
"@opentelemetry/resources": "^2.6.0",
|
|
74
|
-
"@opentelemetry/sdk-logs": "^0.
|
|
74
|
+
"@opentelemetry/sdk-logs": "^0.218.0",
|
|
75
75
|
"@opentelemetry/sdk-metrics": "^2.6.0",
|
|
76
|
-
"@opentelemetry/sdk-node": "^0.
|
|
76
|
+
"@opentelemetry/sdk-node": "^0.218.0",
|
|
77
77
|
"@opentelemetry/sdk-trace-base": "^2.6.0",
|
|
78
78
|
"@opentelemetry/semantic-conventions": "^1.40.0",
|
|
79
79
|
"ai-tokenizer": "^1.0.6",
|