copilot-api-node20 0.44.0-preview.21 → 0.44.0-preview.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.mjs +1 -1
- package/package.json +1 -1
package/dist/main.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{AsyncLocalStorage as l}from"node:async_hooks";import{ROOT_CONTEXT as c,SpanKind as u,SpanStatusCode as p,context as d,metrics as m,trace as f}from"@opentelemetry/api";import h from"clipboardy";import{execFile as g,execSync as _}from"node:child_process";import y from"node:process";import{SeverityNumber as w,logs as b}from"@opentelemetry/api-logs";import{OTLPLogExporter as k}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as v}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as x}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as T}from"@opentelemetry/resources";import{BatchLogRecordProcessor as A}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as $}from"@opentelemetry/sdk-metrics";import{NodeSDK as S}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as E,ATTR_SERVICE_NAME as O,ATTR_SERVICE_VERSION as C}from"@opentelemetry/semantic-conventions";import{Client as I,request as R}from"undici";import{createHash as N,randomBytes as P,randomUUID as q}from"node:crypto";import{promisify as D,stripVTControlCharacters as j}from"node:util";import{Hono as M}from"hono";import{cors as F}from"hono/cors";import{getHeapStatistics as H}from"node:v8";import{streamSSE as U}from"hono/streaming";import{events as B}from"fetch-event-stream";import{Tokenizer as L,models as z}from"ai-tokenizer";import*as G from"ai-tokenizer/encoding/claude";import K,{accessSync as J}from"node:fs";import{serve as W}from"srvx";import{isIP as Y}from"node:net";import{generate as V}from"selfsigned";const X=s.join(i.homedir(),".local","share","copilot-api"),Z={APP_DIR:X,GITHUB_TOKEN_PATH:s.join(X,"github_token"),MACHINE_ID_PATH:s.join(X,"machine_id"),SESSION_ID_PATH:s.join(X,"session_id")};async function Q(){await a.mkdir(Z.APP_DIR,{recursive:!0}),await ee(Z.GITHUB_TOKEN_PATH),await ee(Z.SESSION_ID_PATH)}async function ee(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const te=new l;function oe(e,t){return te.run(e,t)}const ne=()=>!0===te.getStore()?.rerun,re=new l;function ae(){let e=re.getStore();e&&(e.start??=performance.now(),e.onSend?.())}const ie=6e5,se={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:ie,webSearchProviders:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}};function le(e){let[t="",o=""]=e.trim().split(/\s+/,2),n=o&&"undefined"!==o&&"null"!==o?/^(?:ghu|gho|ghp|ghs|ghr|github_pat)_/.exec(o)?.[0]??"opaque":"missing";return`${t.toLowerCase()} ${n}`}!function(e){let t=e.provider,o=e.models;Object.defineProperties(e,{provider:{get:()=>te.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=te.getStore();return e?e.models:o},set:e=>{o=e},enumerable:!0,configurable:!0}})}(se);const ce=" │ ",ue=e=>{if(e>=1e6){let t=e/1e6;return Number.isInteger(t)?`${t}M`:`${t.toFixed(1)}M`}return e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString()},pe=(e,t)=>e.padEnd(t),de=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),me=(e,t,o)=>` --\x3e ${pe(e,4)} ${pe(t,21)} ${pe(o,3)}`,fe=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return pe(t,22)})(e.model??"—")+pe(t,8)},he=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?ue(Math.max(t-o,0)):"—",r=e?ue(e.outputTokens??0):"—",a=o?ue(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},ge=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${pe("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=ue(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},_e=e=>{if(void 0===e.ttfbMs)return`e2e ${de(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${de(e.ttfbMs)} → e2e ${de(e.e2eMs)} ${t}`},ye=e=>e?se.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,we=e=>({...e?.inputTokens&&{"copilot_api.input_tokens":e.inputTokens},...e?.inputTokens&&{"copilot_api.fresh_input_tokens":Math.max(e.inputTokens-(e.cachedTokens??0),0)},...e?.outputTokens&&{"copilot_api.output_tokens":e.outputTokens},...e?.cachedTokens&&{"copilot_api.cached_tokens":e.cachedTokens}}),be={completionCallbacks:new Map,registerCompletion(e,t,o){this.completionCallbacks.set(e,{context:t,startTime:o,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(e){let{context:t,startTime:n}=e,r=Math.round(performance.now()-n),a=t.get("requestData"),i=a?.upstreamTotalMs??a?._d1,s=(e=>[me(e.method,e.path,e.status),fe(e),he(e.tokenUsage),ge(e.tokenUsage,e.maxContextTokens),_e({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(ce))({method:t.req.method,path:t.req.path,status:t.res.status.toString(),model:a?.model,reasoningEffort:a?.reasoningEffort,effortClamped:a?.effortClamped,tokenUsage:a?.tokenUsage,maxContextTokens:ye(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),at(w.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:o,duration:n,upstreamTotal:r}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":n,...o?.model&&{"copilot_api.model":o.model},...o?.reasoningEffort&&{"copilot_api.reasoning_effort":o.reasoningEffort},...o?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==o?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(o.upstreamTtfbMs)},...void 0!==r&&{"copilot_api.upstream_total_ms":Math.round(r),"copilot_api.copilot_duration_ms":Math.round(r)},...we(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=n.get("requestData");o.error((e=>[me(e.method,e.path,"429"),fe(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${de(e.e2eMs)}`].join(ce))({method:n.req.method,path:n.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},logError(e,t,n){let{context:r,startTime:a}=e,i=Math.round(performance.now()-a),s=r.get("requestData");o.error((e=>{let t=me(e.method,e.path,e.status.toString()),o=fe(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${de(e.e2eMs)}`].join(ce)})({method:r.req.method,path:r.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:n,e2eMs:i}))},cleanup(){let e=performance.now()-12e5;for(let[t,o]of this.completionCallbacks)o.startTime<e&&this.completionCallbacks.delete(t);if(this.completionCallbacks.size>1e3){let e=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),t=e.slice(0,e.length-1e3);for(let[e]of t)this.completionCallbacks.delete(e)}}};setInterval(()=>be.cleanup(),6e4);let ke,ve,xe=Date.now();const Te={"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):Te;return{endpoint:e.replace(/\/$/,""),headers:t}}async function $e(){if(!ke)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([ke.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}const Se=f.getTracer("copilot-api"),Ee=m.getMeter("copilot-api"),Oe=b.getLogger("copilot-api"),Ce=Ee.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),Ie=Ee.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),Re=Ee.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Ne=Ee.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),Pe=Ee.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),qe=Ee.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),De=Ee.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),je=Ee.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Me=Ee.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),Fe=Ee.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),He=Ee.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Ue=Ee.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Be=Ee.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),Le=Ee.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),ze=Ee.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ge=Ee.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Ke=Ee.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),Je=Ee.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),We=Ee.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Ye=Ee.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Ve=Ee.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Xe=Ee.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Ze=Ee.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),Qe=Ee.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),et=Ee.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),tt=Ee.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),ot=Ee.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),nt=Ee.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),rt=Ee.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function at(e,t,o,n,r){let a=f.getActiveSpan()?.spanContext()??r;Oe.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function it(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:p.ERROR,message:o??n.message}),e.recordException(n)}function st(e,t,o){it(e,o),t&&t!==e&&it(t,o)}function lt(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,lt(r,e)))}return o}Ee.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!mt.getConnectivityStats().isOnline)}),Ee.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(mt.getConnectivityStats().consecutiveFailures)}),Ee.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(se.models?.data.length??0)}),Ee.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(be.completionCallbacks.size)}),Ee.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-xe)/1e3)});const ct=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function ut(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();"authorization"===o&&e.setAttribute(`http.${t}.header.authorization.shape`,le(r)),!ct.has(o)&&e.setAttribute(`http.${t}.header.${o}`,r)}}async function pt(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:l}=e,c=Se.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...l}});a&&ut(c,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return c.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();ct.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(c,e),Be.add(1,{target:n,status_code:String(e.status)}),e.ok||c.setStatus({code:p.ERROR,message:`HTTP ${e.status}`}),{response:e,span:c}}catch(e){throw it(c,e),c.end(),e}}async function dt(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,extraAttributes:d,dispatcher:m}=e,f=Se.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});ut(f,"request",a);try{let{statusCode:e,headers:t,body:u}=await R(o,{method:r,headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!ct.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:p.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:u,span:f}}catch(e){throw it(f,e),f.end(),e}}const mt=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:se.connectivity.probeEndpoints,fastInterval:se.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?se.connectivity.slowProbeInterval:se.connectivity.fastProbeInterval)+Math.random()*se.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=Se.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),se.connectivity.timeoutMs);try{let n=!1;for(let e of se.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",...se.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,et.record(r,{endpoint:e,result:"success"});break}et.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),He.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")),Ue.add(1,{from:"offline",to:"online"}),at(w.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")),Ue.add(1,{from:"online",to:"offline"}),at(w.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?se.connectivity.slowProbeInterval:se.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*se.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:se.connectivity.jitterMaxMs>0,connectionPooling:se.connectivity.connectionPooling,dnsCache:se.connectivity.dnsCache}}},ft=()=>({"content-type":"application/json",accept:"application/json"}),ht="0.48.1",gt=`copilot-chat/${ht}`,_t=`GitHubCopilotChat/${ht}`,yt=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${Z.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=N("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},wt=async(e,t)=>{e.machineId||=await yt(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(Z.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=q();return await a.writeFile(Z.SESSION_ID_PATH,e),await a.chmod(Z.SESSION_ID_PATH,384),e})()},bt=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,kt=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=q(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":gt,"User-Agent":_t,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":q(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},vt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const xt=(e,t,o)=>{let n=kt(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,a=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&vt.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta):void 0;if(a)for(let e of a.split(","))r.add(e);if(o)for(let e of o)r.add(e);return r.size>0&&(n["anthropic-beta"]=[...r].join(",")),n},Tt="https://api.github.com",At=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":gt,"user-agent":_t,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),$t="https://github.com",St="01ab8ac9400c4e429b23",Et=["user:email"].join(" "),Ot=new WeakMap;function Ct(e){let t=e.req.raw,o=Ot.get(t);if(!o){let e=new AbortController;t.signal.aborted?e.abort(t.signal.reason):t.signal.addEventListener("abort",()=>e.abort(t.signal.reason),{once:!0}),Ot.set(t,e),o=e}return o}const It=e=>Ct(e).signal;function Rt(e){Ct(e).abort()}function Nt(e){return!!Ct(e).signal.aborted&&(e.get("requestSpan")?.setAttribute("copilot_api.client_aborted",!0),!0)}function Pt(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const qt=32768,Dt=[{regex:/Bearer\s+[\w.-]{20,}/g,mask:"Bearer ***"},{regex:/\bghu_[A-Za-z0-9]{20,}/g,mask:"ghu_***"},{regex:/\bghp_[A-Za-z0-9]{20,}/g,mask:"ghp_***"},{regex:/\bgho_[A-Za-z0-9]{20,}/g,mask:"gho_***"},{regex:/\bghs_[A-Za-z0-9]{20,}/g,mask:"ghs_***"},{regex:/\bghr_[A-Za-z0-9]{20,}/g,mask:"ghr_***"},{regex:/\bsk-[A-Za-z0-9-]{20,}/g,mask:"sk-***"},{regex:/\bhcaik_[A-Za-z0-9]{20,}/g,mask:"hcaik_***"},{regex:/\bapi-key[\x22\x27]?\s*[:=]\s*[\x22\x27]?[\w-]{20,}/gi,mask:"api-key: ***"}],jt=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Mt(e){let t=e;for(let{regex:e,mask:o}of Dt)t=t.replace(e,o);return t}const Ft=/[\w.%+#!$&*=?^~\x27-]+@[\w-]+(?:\.[\w-]+)+/g;function Ht(e){return Mt(e).replaceAll(Ft,"<redacted-email>")}const Ut=new Map;function Bt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function Lt(e,t,o){let n=Mt(o),r=8*qt,a=n.length>r,i=a?n.slice(0,r):n,s=N("sha256").update(n).digest("hex");if(i.length<=qt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=qt)e.setAttribute(`${t}.part_${o/qt}`,i.slice(o,o+qt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/qt))}e.setAttribute(`${t}.bytes`,n.length),e.setAttribute(`${t}.sha256`,s),a&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,n.length-i.length))}function zt(e,t){let o=function(e){if(Ut.size>=1e3&&!Ut.has(e)){let e=Ut.keys().next().value;void 0!==e&&Ut.delete(e)}let t,o=(Ut.get(e)??0)+1;return Ut.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",Je.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",o),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===o)return{decision:o};if("suppressed"===o)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:o};let n=t.c.get("rawBody");n&&Lt(e,"copilot_api.incoming_request_body",n);let r=Gt(t.c.req.header());return r&&Lt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&Lt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&Lt(e,"copilot_api.outgoing_headers",Gt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&Lt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function Gt(e){let t={};for(let[o,n]of Object.entries(e))jt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Kt(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await a.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function Jt(){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 Wt(){try{return!!(await a.stat(Z.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(Z.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Yt(e){let t=await async function(){let[e,t]=await Promise.all([Kt(),Wt()]);return{version:e,runtime:Jt(),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 Vt=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})=>Yt({json:e.json})}),Xt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Zt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",Qt=new Set;let eo;function to(e){if(se.errorReporting&&!(e.statusCode<500)&&!Qt.has(e.signature)){if(Qt.size>=1e3){let e=Qt.values().next().value;void 0!==e&&Qt.delete(e)}Qt.add(e.signature),async function(e){eo??=Kt();let t=await eo,o=Jt(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(Ht(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:Pt(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(Xt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Zt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function oo(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const no=new WeakSet;async function ro(e,{attempt:t,maxRetries:n,operation:r}){return oo(e)&&t<n?(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&no.add(e)}(e),!1)}var ao=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},io=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function so(e,t){return setTimeout(()=>e.abort(new io(t)),t)}const lo=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),co=RegExp(`\\b(?:${[...lo].join("|")})\\b`);function uo(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function po(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=uo(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function mo(e){let t=e.code;return"string"==typeof t?t:void 0}function fo(e){if(void 0===e.cause)return"";let t=po(e);if(t===e)return"";let o=mo(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function ho(e){if(!(e instanceof Error))return!1;let{codes:t,messages:o}=function(e){let t=[],o=[],n=new Set,r=(e,a)=>{if(a>4||!(e instanceof Error)||n.has(e))return;n.add(e);let{code:i,errors:s,cause:l}=e;if("string"==typeof i&&t.push(i),o.push(e.message),Array.isArray(s))for(let e of s)r(e,a+1);r(l,a+1)};return r(e,0),{codes:t,messages:o}}(e);return!!t.some(e=>lo.has(e))||!(t.length>0)&&(!!o.some(e=>co.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function go(e){return e.req.path.startsWith("/v1/messages")}function _o(e,t){if(go(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}const yo=/maximum context length|exceeds the context window/i;function wo(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type?o.type=t.type:"string"==typeof t.code&&(o.type=t.code),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function bo(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",Ht(t.message)))}function ko(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=Ht(e.message)),t}function vo(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=f.getActiveSpan();if(!a)return;let i=Bt({endpointType:Pt(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});zt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function xo(e,t,o){let n=e.get("requestId"),r=be.completionCallbacks.get(n);r&&(be.logError(r,t,o),be.completionCallbacks.delete(n))}async function To(e,t){let o=f.getActiveSpan(),n=e.get("requestId"),r=be.completionCallbacks.get(n);r&&(be.logRateLimit(r,t.response),be.completionCallbacks.delete(n)),qe.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=_o(a,e),s=wo(i);return o?.setStatus({code:p.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),bo(o,s),at(w.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...ko(s)}),vo({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,o)=>{Ao.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const Ao=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;async function $o(e,t){let o=f.getActiveSpan(),n=await t.response.text(),r=_o(n,e),a=wo(r);xo(e,t.response.status,a.message??t.message),o?.setStatus({code:p.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),bo(o,a),at(w.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...ko(a)}),vo({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&to({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Bt({endpointType:Pt(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message});let i=go(e)?function(e){let t;try{let o=JSON.parse(e);t=o.error&&"object"==typeof o.error?o.error:o}catch{return}let o="string"==typeof t.message?t.message:"";if("context_length_exceeded"!==t.code&&"context_length_exceeded"!==t.type&&!yo.test(o))return;let n=/maximum context length is (\d+)/i.exec(o)?.[1],r=/(?:resulted in|requested) (\d+) tokens/i.exec(o)?.[1];return{type:"error",error:{type:"invalid_request_error",message:n&&r?`prompt is too long: ${r} tokens > ${n} maximum`:`prompt is too long: ${o||"context_length_exceeded"}`}}}(n):void 0;return i?e.json(i,400):e.json(r,t.response.status)}function So(e,t){(function(e){return"object"==typeof e&&!!e&&no.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",se.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function Eo(e){return ho(e)||function(e){return oo(e)||e instanceof Error&&oo(e.cause)}(e)}async function Oo(e,t){return Nt(e)?(be.completionCallbacks.delete(e.get("requestId")),new Response(null,{status:499})):async function(e,t){if(So(f.getActiveSpan(),t),t instanceof ao&&429===t.response.status)return To(e,t);if(t instanceof SyntaxError){f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),at(w.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=go(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 xo(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof ao)return $o(e,t);if(function(e){return e instanceof io||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof io}(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Upstream request timed out"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","request_timeout");let n="Upstream request timed out (gateway timeout). Increase the timeout or retry.";at(w.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=go(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return xo(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(Eo(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?po(t):void 0,r=(n&&mo(n))??"none",a=n?.message??String(t);o?.setAttribute("copilot_api.transport_cause_code",r),o?.setAttribute("copilot_api.transport_cause_message",a);let i="Temporary upstream connection failure. Please retry.";at(w.WARN,"WARN",i,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":r,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=go(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return xo(e,503,t instanceof Error?`${t.message}${fo(t)}`:i),e.json(s,503)}(e,t);let n=f.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:p.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),at(w.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),to({route:e.req.path,statusCode:500,errorClass:r.name,signature:Bt({endpointType:Pt(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${fo(r)}`}),xo(e,500,r.message),o.error(r);let a=go(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}(e,t)}const Co=async()=>{let e=`${Tt}/copilot_internal/v2/token`,t=se.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await pt({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:At(se),signal:o.signal});try{if(!t.ok)throw new ao("Failed to get Service token",t);return await t.json()}catch(e){throw it(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function Io(){let e=`${Tt}/user`,t=se.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await pt({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${se._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new ao("Failed to get GitHub user",t);return await t.json()}catch(e){throw it(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}const Ro=3e5,No=12e4;let Po,qo,Do,jo=null,Mo=0;function Fo(e){Do&&clearTimeout(Do),Do=setTimeout(()=>{Bo("scheduled").catch(e=>{o.warn("Foundry Entra token renewal failed; retrying:",e),Fo(3e4)})},e),Do.unref()}async function Ho(e){let t=qo;if(!Po||!t?.tokenScope)throw Error("Foundry Entra auth is not initialised");let o=Se.startSpan("copilot_api.foundry.entra_token",{kind:u.INTERNAL,attributes:{"copilot_api.foundry.token.trigger":e}},"upstream_401"===e?d.active():c);try{let e=await async function(e,t){let o=AbortSignal.timeout(No),n=new Promise((e,t)=>{o.addEventListener("abort",()=>{t(Error("Entra token request timed out after 120s"))},{once:!0})});return Promise.race([e.getToken(t,{abortSignal:o}),n])}(Po,t.tokenScope);if(!e)throw Error(`No Entra token for scope ${t.tokenScope}`);o.setAttribute("copilot_api.foundry.token.expires_in_s",Math.round((e.expiresOnTimestamp-Date.now())/1e3)),t.bearerToken=e.token,t.bearerExpiresAt=e.expiresOnTimestamp,Mo=Date.now(),Fo(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-Ro;return Math.max(t-Date.now(),3e4)}(e))}catch(e){throw it(o,function(e){let t=e instanceof Error?e:Error(String(e)),o=j(t.message),n=`… (truncated from ${o.length} chars)`,r=Error(o.length>2e3?o.slice(0,2e3-n.length)+n:o);return r.name=t.name,r}(e)),e}finally{o.end()}}async function Uo(e,t){qo=e,Po=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await Ho("startup")}catch(e){throw Error("Foundry Entra ID auth: could not get a token. Run `az login` (or set FOUNDRY_API_KEY for key auth). The identity needs the 'Cognitive Services OpenAI User' role (GPT) or 'Azure AI User' (Claude) on the resource.",{cause:e})}}function Bo(e="upstream_401"){return jo??=Ho(e).finally(()=>{jo=null}),jo}let Lo=null;async function zo(e){if("foundry"===se.provider){if("entra"!==se.foundry?.auth)return!1;let t=e?.outgoingHeaders?.Authorization;return async function(e=!1,t){let n=qo?.bearerToken;if(void 0!==t&&t!==n)return!0;let r=qo?.bearerExpiresAt,a=void 0!==r&&r-Date.now()>Ro;if(e&&a)return!1;if(Date.now()-Mo<3e4)return!0;try{return await Bo(),!0}catch(e){return o.warn("Foundry Entra token renewal after a 401 failed:",e),!1}}(await async function(e){if(!e)return!1;let t=await e.response.clone().text().catch(()=>"");return/"code"\s*:\s*"PermissionDenied"/.test(t)}(e),t?.replace(/^Bearer /,""))}return Lo||=Co().then(({token:e})=>{se._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{Lo=null}),await Lo,!0}function Go(e,t="FOUNDRY_ENDPOINT"){let o,n=e.trim();try{o=new URL(n)}catch{throw Error(`${t} is not a valid URL: "${n}"`)}if("https:"!==o.protocol)throw Error(`${t} must use https, got: "${n}"`);let r=o.pathname.replace(/\/+$/,"").replace(/\/(?:openai|_an1)(?:\/v1)?$/i,"");return`${o.origin}${r}`}const Ko=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function Jo(e){let t=new URL(e),o=Ko.exec(t.hostname)?.[1];return o?`https://${o}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function Wo(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,o]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:o||t}});return t.length>0?t:void 0}function Yo(e){let t=e.FOUNDRY_ENDPOINT,o=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");let n=function(e,t){let o=e?.trim().toLowerCase();if(!o)return t?"key":"entra";if("key"!==o&&"entra"!==o)throw Error(`FOUNDRY_AUTH must be "key" or "entra", got: "${o}"`);if("key"===o&&!t)throw Error("FOUNDRY_AUTH=key requires FOUNDRY_API_KEY");return o}(e.FOUNDRY_AUTH,o),r=Go(t),a=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:r,anthropicEndpoint:a?Go(a,"FOUNDRY_ANTHROPIC_ENDPOINT"):Jo(r),auth:n,..."key"===n?{apiKey:o}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:Wo(e.FOUNDRY_DEPLOYMENTS)}}const Vo=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},Xo=e=>({...Vo(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),Zo=e=>`${e.anthropicEndpoint}/anthropic`,Qo=(e,t)=>({...Vo(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),en=e=>"foundry"===e.provider;function tn(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const on=e=>en(e)?(e=>`${e.endpoint}/openai/v1`)(tn(e)):bt(e),nn=(e,t=!1)=>en(e)?Xo(tn(e)):kt(e,t),rn=e=>en(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const an=[{pattern:/^gpt-6/,context:105e4,output:128e3},{pattern:/^gpt-5/,context:4e5,output:128e3},{pattern:/^gpt-4\.1/,context:1047576,output:32768},{pattern:/^o\d/,context:2e5,output:1e5}],sn={context:128e3,output:16384};function ln(e){return an.find(({pattern:t})=>t.test(e))??sn}const cn=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,un=e=>/^claude/i.test(e),pn=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function dn(e,t){return{id:e.id,name:e.id,object:"model",vendor:t.vendor,version:e.model,preview:!1,model_picker_enabled:!0,supported_endpoints:t.supported_endpoints,capabilities:{family:e.model,object:"model_capabilities",type:"chat",tokenizer:"o200k_base",limits:t.limits&&{max_context_window_tokens:t.limits.context,max_output_tokens:t.limits.output},supports:{tool_calls:!0,parallel_tool_calls:!0}}}}async function mn(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=so(o,se.timeoutMs);try{let{response:n,span:r}=await pt({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:Xo(e),signal:o.signal});try{if(!n.ok)throw new ao("Failed to list Foundry deployments",n);let e=(await n.json()).data.filter(e=>!e.status||"succeeded"===e.status).map(e=>({id:e.id,model:e.model}));return r.setAttribute("copilot_api.models_count",e.length),e}catch(e){throw it(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function fn(e){return{object:"list",data:(e.deployments??await mn(e)).map(e=>function(e){let{model:t}=e;if(!cn.test(t))return(e=>/embedding/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/embeddings"],capabilities:{family:t,object:"model_capabilities",type:"embeddings",tokenizer:"cl100k_base",supports:{}}}:un(t)?dn(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):pn(t)?dn(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:ln(t)}):dn(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:ln(t)})}(e)).filter(e=>void 0!==e)}}const hn=()=>en(se)&&se.foundry?fn(se.foundry):_n(),gn=async()=>{try{return await hn()}catch(e){if(e instanceof ao&&401===e.response.status){if(!await zo(e))throw e;return hn()}throw e}},_n=async()=>{let e=`${on(se)}/models`,t=nn(se),o=se.timeoutMs,n=new AbortController,r=so(n,o);try{let{response:o,span:r}=await pt({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new ao("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw it(r,e),e}finally{r.end()}}finally{clearTimeout(r)}},yn=e=>"embeddings"!==e.capabilities.type,wn=e=>yn(e)&&(e.supported_endpoints?.includes("/responses")??!0);const bn=[{pattern:/haiku/i,family:"haiku"},{pattern:/sonnet[.-]?4[.-]6/i,family:"sonnet-4.6"},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:"sonnet-4.5"},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:"sonnet-4"},{pattern:/opus[.-]?4[.-]7/i,family:"opus-4.7"},{pattern:/opus[.-]?4[.-]6/i,family:"opus-4.6"},{pattern:/opus[.-]?4[.-]5/i,family:"opus-4.5"},{pattern:/opus/i,family:"opus"}],kn="claude-haiku-4.5",vn={haiku:kn,"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"};const xn=/^claude-/i;function Tn(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function An(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of bn)if(t.pattern.test(e))return t.family;return null}(n),i=xn.test(n),s=n.replace(/-\d{8}(?::.*)?$/,""),l=r?`-${r}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let o=Tn(e);for(let e of t)if(Tn(e.replace(/-\d{8}(?::.*)?$/,""))===o)return e}return a?function(e,t,o=null){let n=vn[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):null}const $n=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function Sn(e,t){if(!e||!t||0===t.length)return null;let o=function(e){return"max"===e?"xhigh":e}(e);if(t.includes(o))return o;let n=$n.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=$n.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}const En={messages:yn,responses:wn,chat:e=>yn(e)&&(e.supported_endpoints?.some(e=>"/chat/completions"===e||"/responses"===e)??!0)};let On;const Cn=new Map,In=new Map;function Rn(e,t,o){let n=(e??t??"").trim().toLowerCase();if(""!==n&&"none"!==n){if("copilot"!==n)throw Error(`--fallback must be "copilot", got: "${n}"`);if("foundry"!==o)throw Error("--fallback copilot requires --provider foundry");return n}}async function Nn(){On=await oe({provider:"copilot"},gn)}const Pn=()=>void 0!==On;function qn(e,t=Date.now()){let o=Cn.get(e);return void 0!==o&&(t<o||(Cn.delete(e),!1))}function Dn(e,t=Date.now()){return{id:In.get(e)?.id??0,lapsed:!qn(e,t)}}function jn(e,t,o={}){let n=o.now??Date.now(),r=o.sent??Dn(e,n),a=In.get(e)??{id:0,appliedMs:0},i=Math.max(function(e,t=Date.now()){let o=e.get("retry-after-ms");if(null!==o&&Number.isFinite(Number(o))&&Number(o)>=0)return Number(o);let n=e.get("retry-after");if(null!==n){let e=Number(n);if(""!==n.trim()&&Number.isFinite(e)&&e>=0)return 1e3*e;let o=Date.parse(n);if(!Number.isNaN(o))return Math.max(0,o-t)}return 1e4}(t,n),5e3),s=r.lapsed?r.id+1:r.id;if(s>a.id){let t=Math.min(2*a.appliedMs,6e4);i=Math.max(i,t),In.set(e,{id:s,appliedMs:i})}else s===a.id&&i>a.appliedMs&&In.set(e,{id:a.id,appliedMs:i});let l=Math.max(Cn.get(e)??0,n+i);return Cn.set(e,l),l-n}function Mn(e){if(!Pn()||!en(se)||!e.ok)return;let{headers:t}=e;return t.has("retry-after")||t.has("retry-after-ms")?Response.json({error:{message:"Foundry rate-limited this request (HTTP 200 stream with retry-after).",type:"too_many_requests",code:"rate_limit_exceeded"}},{status:429,headers:t}):void 0}const Fn=new Set([429,408,503]);function Hn(e,t,n){let r=429===t?"rate-limited":`returned ${t} for`;o.info(`Foundry ${r} ${e}; serving it from Copilot for ${Math.ceil(n/1e3)}s`)}function Un(e,t,o){let{model:n,reason:r}=o,a=f.getActiveSpan();return a?.setAttribute("copilot_api.fallback.upstream","copilot"),a?.setAttribute("copilot_api.fallback.reason",r),a?.setAttribute("copilot_api.fallback.foundry_model",n),oe({provider:"copilot",models:On,rerun:"breaker_open"!==r},()=>t(e))}async function Bn(e,t,o){if(!Pn()||!en(se))return o(e);let n=await async function(e){try{let t=await e.req.json();return"string"==typeof t.model?t.model:void 0}catch{return}}(e);if(!n||!function(e,t){let o=On?.data??[],n=o.map(e=>e.id),r=n.includes(e)?e:An(e,n),a=o.find(e=>e.id===r);return a&&En[t](a)?a.id:void 0}(n,t))return o(e);if(qn(n))return Un(e,o,{model:n,reason:"breaker_open"});let r=Dn(n),{attempt:a,sent:i}=function(e){let t;return{attempt:{onSend:()=>{t=Dn(e)}},sent:()=>t}}(n);try{let t=await function(e,t){return re.run(e,t)}(a,()=>o(e)),r=i();return t.ok&&r&&function(e,t){let o=In.get(e);o&&t.lapsed&&t.id===o.id&&In.set(e,{id:o.id,appliedMs:0})}(n,r),t}catch(t){if(!(e=>e instanceof ao&&Fn.has(e.response.status)&&void 0!==e.outgoingBody)(t))throw t;let{status:s}=t.response,l=jn(n,t.response.headers,{sent:i()??r});await(t.response.body?.cancel());let c=f.getActiveSpan();if(c?.setAttribute("copilot_api.fallback.retry_after_ms",l),void 0!==a.start&&c?.setAttribute("copilot_api.fallback.foundry_attempt_ms",Math.round(performance.now()-a.start)),Hn(n,s,l),Nt(e))throw t;return Un(e,o,{model:n,reason:`foundry_${s}`})}}const Ln=e=>new Promise(t=>{setTimeout(t,e)}),zn=e=>null==e;async function Gn({refreshFallback:e=!0}={}){let t=await gn();se.models=t,e&&Pn()&&await Nn().catch(e=>{o.warn("Failed to refresh the Copilot fallback models:",e)})}const Kn=()=>{se._v1="1.140.0-insider"};var Jn=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Wn,Yn,Vn,Xn,Zn,Qn=!1,er=!1,tr=!1;function or(){return nr()?Zn:void 0}function nr(){return void 0!==Zn&&Date.now()-Zn.at<6e4}function rr(){return tr?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const ar=()=>a.readFile(Z.GITHUB_TOKEN_PATH,"utf8");function ir(e){let{span:t,error:n,reason:r,refreshStart:a,attempt:i}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";se._t1=void 0,Zn={status:s,message:l,at:Date.now()},clearInterval(Wn),Wn=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Me.add(1,{reason:r,success:"false"}),Fe.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:p.ERROR,message:n.message}),t.recordException(n),Qe.record(performance.now()-a,{reason:r}),at(w.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":i,"copilot_api.token_refresh.terminal_status":s})}function sr(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;se._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:p.ERROR,message:s.message}),t.recordException(s),Fe.add(1,{reason:r}),Qe.record(performance.now()-a,{reason:r}),at(w.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const lr=async(e=5,t=1e3,n="scheduled")=>Qn?(o.debug("Token refresh already in progress, coalescing"),Yn):(Qn=!0,Yn=Se.startActiveSpan("copilot_api.token.refresh",async r=>{let a=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let i=1;i<=e;i++)try{r.setAttribute("copilot_api.token_refresh.attempt",i),o.debug(`Refreshing Service token (${n}, attempt ${i}/${e})`);let{token:t,refresh_in:s}=await Co();return se._t1=t,Zn=void 0,er&&void 0===Wn&&(o.info("Token refresh recovered, resuming scheduled refresh"),ur(s)),o.debug("Service token refreshed successfully"),se.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Me.add(1,{reason:n,success:"true"}),Qe.record(performance.now()-a,{reason:n}),void at(w.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof ao&&(401===s.response.status||403===s.response.status))return void ir({span:r,error:s,reason:n,refreshStart:a,attempt:i});let l=i===e;if(o.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),Me.add(1,{reason:n,success:"false"}),l)return void sr({span:r,error:s,reason:n,refreshStart:a,maxRetries:e});let c=t*2**(i-1);o.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),Qn=!1,Yn=void 0}}),Yn);async function cr(){return!!se._t1||!nr()&&(void 0!==Zn&&tr&&await async function(){if(Yn)return;let e=(await ar().catch(()=>{}))?.trim();e&&e!==se._t2?.trim()&&(se._t2=e,o.info("Picked up re-authenticated Auth token from disk"),se.showToken&&o.info("Auth token:",e))}(),await lr(3,250,"on-demand"),!!se._t1)}function ur(e){Wn&&clearInterval(Wn);let t=Math.max(1e3*(e-60),6e4);Wn=setInterval(()=>{lr(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function pr(e){try{let t=await ar();if(t&&!e?.force)return se._t2=t,tr=!0,se.showToken&&o.info("Auth token:",t),void await dr();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=se.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${$t}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:St,scope:Et}),signal:e.signal});if(!t.ok)throw new ao("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{h.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=y.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",g(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 Jn("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=se.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${$t}/login/oauth/access_token`,{method:"POST",headers:ft(),body:JSON.stringify({client_id:St,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await Ln(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 Jn("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Jn("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 Ln(t);continue}if(r.access_token)return r.access_token;await Ln(t)}catch(e){if(e instanceof Jn)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await Ln(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(Z.GITHUB_TOKEN_PATH,e,{mode:384}))(r),se._t2=r,tr=!0,se.showToken&&o.info("Auth token:",r),await dr()}catch(e){throw e instanceof ao?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function dr(){let e=await Io();o.success(`Authenticated as ${e.login}`)}async function mr(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),se.showToken=e.showToken,await Q(),await pr({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 fr=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})=>mr({verbose:e.verbose,showToken:e["show-token"]})}),hr=.01,gr=864e5,_r=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),yr=new Intl.NumberFormat("en-US"),wr=e=>_r.format(e*hr),br=e=>e.credits_used??e.entitlement-e.remaining,kr=(e,t,o)=>{let n=(e=>{let t=new Date(`${e}T00:00:00Z`);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-1,1))})(t),r=(o.getTime()-n.getTime())/gr;if(r<.5)return;let a=br(e),i=a*hr/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*hr,c=new Date(n.getTime()+l/i*gr);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},vr=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${yr.format(br(e))} of ${yr.format(e.entitlement)} used`:"n/a",xr=e=>e.padEnd(14),Tr=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${xr("AI credits")}unlimited`);else{let e=br(o),t=o.percent_remaining;n.push(`${xr("AI credits")}${wr(e)} / ${wr(o.entitlement)} ${t.toFixed(1)}% left`,`${xr("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${xr("")}${yr.format(e)} of ${yr.format(o.entitlement)} credits`)}if(n.push("",`${xr("Chat")}${vr(e.quota_snapshots.chat)}`,`${xr("Completions")}${vr(e.quota_snapshots.completions)}`,"",`${xr("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/gr)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=kr(o,e.quota_reset_date,t);r&&n.push(`${xr("Burn rate")}~${_r.format(r.usdPerDay)}/day${(e=>e.exhausted?" — allowance already exhausted":e.exhaustsOn?` — on track to exhaust ${(e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}))(e.exhaustsOn)}`:" — within allowance")(r)}`);let a=o.overage_permitted?"permitted, "+(o.overage_count>0?`${yr.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${xr("Overage")}${a}`)}return n.join("\n")},Ar=async()=>{let e=`${Tt}/copilot_internal/user`,t=se.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await pt({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:At(se),signal:o.signal});try{if(!t.ok)throw new ao("Failed to get usage",t);return await t.json()}catch(e){throw it(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},$r=()=>y.stdout.write("[2J[H"),Sr=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Er=async()=>{let e=await Ar();return Tr(e)},Or=e({meta:{name:"check-usage",description:"Show current usage/quota information"},args:{watch:{alias:"w",type:"boolean",default:!1,description:"Keep running and refresh the report on an interval"},interval:{alias:"i",type:"string",default:"60",description:"Seconds between refreshes in --watch mode (min 10)"}},async run({args:e}){if(await Q(),await pr(),!e.watch){try{o.box(await Er())}catch(e){o.error("Failed to fetch usage:",e),y.exit(1)}y.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?o.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&o.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),n=y.stdout.isTTY,r=()=>y.exit(0);for(y.on("SIGINT",r),y.on("SIGTERM",r);;){try{let e=await Er();n&&$r(),o.box(e),o.log(Sr(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Cr=D(g);async function Ir(){let e="win32"===y.platform?"where.exe":"which";try{return await Cr(e,["tailscale"]),!0}catch{return!1}}async function Rr(){try{let{stdout:e}=await Cr("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function Nr(e){return e.replace(/\.$/,"")}async function Pr(){let e=await Rr();if(e?.Online)return Nr(e.DNSName)}const qr=D(g),Dr=e=>`[1m${e}[0m`,jr=e=>`[2m${e}[0m`,Mr=e=>`[36m${e}[0m`,Fr=e=>`[32m${e}[0m`,Hr=e=>`[31m${e}[0m`,Ur=e=>`[33m${e}[0m`,Br=jr(" ─────────────────────────────────────────────────────────────"),Lr=s.join(Z.APP_DIR,"certs","tailscale"),zr=s.join(Lr,"cert.pem"),Gr=s.join(Lr,"key.pem"),Kr={certDir:Lr,certPath:zr,keyPath:Gr};function Jr(){switch(y.platform){case"darwin":return[` ${jr("Install Tailscale for macOS:")}`,` ${Mr("https://tailscale.com/download/mac")}`,` ${jr("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${jr("After installing, open the Tailscale app and sign in.")}`,` ${jr("Then re-run this command.")}`].join("\n");case"linux":return[` ${jr("Install Tailscale for Linux:")}`,` ${Mr("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Mr("sudo tailscale up")}`,` ${jr("or")} ${Mr("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${jr("Install Tailscale for Windows:")}`,` ${Mr("https://tailscale.com/download/windows")}`,"",` ${jr("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${jr("Install Tailscale:")} ${Mr("https://tailscale.com/download")}`}}function Wr(){let e=[` ${Hr("Tailscale is not running.")}`];return"darwin"===y.platform?e.push(` ${jr("Open the Tailscale app from Applications and sign in.")}`,` ${jr("Download:")} ${Mr("https://tailscale.com/download/mac")}`):"win32"===y.platform?e.push(` ${jr("Open the Tailscale app and sign in.")}`,` ${jr("Download:")} ${Mr("https://tailscale.com/download/windows")}`):e.push(` ${jr("Connect with:")} ${Mr("sudo tailscale up")}`),e.push("",` ${jr("Then re-run this command.")}`),e.join("\n")}async function Yr(){try{return await a.access(zr),await a.access(Gr),!0}catch{return!1}}function Vr(e){console.log(""),console.log(Br),console.log(` ${Dr("Claude Cowork Setup")} ${jr("— Diagnostic")}`),console.log(Br),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?Fr("✅"):"missing"===n.status?Hr("❌"):Ur("❓");let r=n.detail?jr(` ${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(` ${Fr("All checks passed.")}`):console.log(` ${Hr(`${t.length} issue(s).`)} Run ${Mr("copilot-api cowork-setup install")} to fix.`),console.log("")}const Xr={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},Zr=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await Ir();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return Vr(e),console.log(""),console.log(Jr()),void console.log("");let o=await Rr();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},Vr(e),console.log(Wr()),void console.log("");let n=Nr(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await Yr();e["tailscale-cert"]=r?{status:"ok",detail:zr}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),Vr(e)}(),y.exit(0)}}),Qr=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:Xr},async run({args:e}){await async function(e){if(console.log(""),console.log(Br),console.log(` ${Dr("Claude Cowork Setup")} ${jr("— Install")}`),console.log(Br),console.log(""),!await Ir())return console.log(` ${Hr("Tailscale is not installed.")}`),console.log(""),console.log(Jr()),console.log(""),console.log(` ${jr("After installing, run")} ${Mr("tailscale up")} ${jr("to connect, then re-run this command.")}`),void console.log("");let t=await Rr();if(!t||!t.Online)return console.log(Wr()),void console.log("");let n=Nr(t.DNSName);if(console.log(` ${jr("Tailscale hostname:")} ${Dr(n)}`),console.log(""),console.log(` ${Dr("Generating TLS certificate via Tailscale…")}`),console.log(` ${jr("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Mr(`$ tailscale cert --cert-file ${zr} --key-file ${Gr} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(Lr,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await qr("tailscale",["cert","--cert-file",zr,"--key-file",Gr,n]),console.log(` ${Fr("✓ 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(Br),console.log(` ${Dr("Next steps")}`),console.log(Br),console.log(""),console.log(` ${Dr("1.")} Start the proxy:`),console.log(` ${Mr("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Dr("2.")} In Cowork ${jr("→")} Settings ${jr("→")} Inference Provider, set:`),console.log(` ${Dr("inferenceGatewayBaseUrl")} = ${Mr(`https://${n}:<port>`)}`),console.log(` ${jr("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Dr("3.")} Restart Cowork ${jr("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${jr("For Cowork's own configuration docs, see:")}`),console.log(` ${Mr("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),ea=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:Xr},async run({args:e}){await async function(e){if(console.log(""),console.log(Br),console.log(` ${Dr("Claude Cowork Setup")} ${jr("— Revert")}`),console.log(Br),console.log(""),!await Yr())return console.log(` ${jr("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${Dr("Remove Tailscale cert files:")}`),console.log(` ${jr(zr)}`),console.log(` ${jr(Gr)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(Lr,{recursive:!0}),console.log(` ${Fr("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${jr("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),ta=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:Zr,install:Qr,revert:ea}}),oa=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function na(e){if(!oa.test(e))return e;let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],a=r.match(/^\[[0-9;]*[a-z]/i);t+=a?r.slice(a[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function ra(e){return"string"==typeof e?na(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=ra(n);!t&&r!==n&&(t=e.slice(0,o)),t?.push(r)}return t??e}(e):e&&"object"==typeof e?function(e){let t,o=Object.entries(e),n="thinking"===e.type;for(let e=0;e<o.length;e++){let[r,a]=o[e],i=!n||"thinking"!==r&&"signature"!==r?ra(a):a;!t&&(i!==a||"__proto__"===r)&&(t=aa({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=aa({},o,o.length),t.properties={}),t??e}(e):e}function aa(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const ia="x-copilot-api-self-test",sa=q();const la=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function ca(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==e.capabilities.type&&!function(e){let t=e.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e.id)}(e)&&!function(e){return"disabled"===e.policy?.state}(e)}let ua;function pa(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),a=t.res.status,i=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",a),n.setAttribute("copilot_api.model",i),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),function(e){let{heapUsed:t,rss:o}=process.memoryUsage();ua??=H().heap_size_limit,e.setAttribute("copilot_api.process.heap_used_bytes",t),e.setAttribute("copilot_api.process.rss_bytes",o),e.setAttribute("copilot_api.process.heap_limit_bytes",ua),e.setAttribute("copilot_api.process.uptime_s",Math.round(process.uptime()))}(n),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();ct.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:p.ERROR,message:`HTTP ${a}`})}function da(e){try{pa(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:a,requestId:i}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:a};if(Ce.add(1,d),We.record(s,d),c>=400&&Ie.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&&(Re.add(e.inputTokens,t),tt.record(e.inputTokens,t)),e.outputTokens&&(Ne.add(e.outputTokens,t),ot.record(e.outputTokens,t)),e.cachedTokens&&Pe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&be.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}be.completionCallbacks.delete(e.requestId)}const ma=async()=>{if(!ne())return Se.startActiveSpan("copilot_api.approval.await",async e=>{let t=performance.now();try{let n=await o.prompt("Accept incoming request?",{type:"confirm"}),r=performance.now()-t;if(e.setAttribute("copilot_api.approval.wait_duration_ms",r),rt.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),ze.add(1,{result:"rejected"}),new ao("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),ze.add(1,{result:"approved"})}finally{e.end()}})};async function fa(e){if(rn(se)||await cr())return null;let t=or();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${rr()}`,type:"authentication_error"}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function ha(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function ga(e,t){e.setAttributes(function(e){let t={};void 0!==e.prompt_tokens&&(t["copilot_api.input_tokens"]=e.prompt_tokens),void 0!==e.completion_tokens&&(t["copilot_api.output_tokens"]=e.completion_tokens),void 0!==e.total_tokens&&(t["copilot_api.total_tokens"]=e.total_tokens);let o=e.prompt_tokens_details?.cached_tokens;return void 0!==o&&(t["copilot_api.cached_tokens"]=o),t}(t))}var _a=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function ya(e){if(!e||"string"!=typeof e)throw new _a("Model name is required and must be a string");if("foundry"===se.provider)return e;if(!se.models?.data)throw new _a("Models not available. Please try again later.",503);let t=se.models.data.map(e=>e.id);if(t.includes(e))return e;let o=An(e,t);if(!o)throw De.add(1,{requested_model:e}),new _a(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function wa(e){let t=se.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===se.provider?pn(e):/gpt-[\d.]+-codex/i.test(e)}async function ba(e){if(void 0===e.rateLimitSeconds||ne())return;let t=e.rateLimitSeconds;return Se.startActiveSpan("copilot_api.rate_limit.check",async n=>{try{let r=Date.now();if(n.setAttribute("copilot_api.rate_limit.configured_seconds",t),!e.lastRequestTimestamp)return e.lastRequestTimestamp=r,void n.setAttribute("copilot_api.rate_limit.action","allowed");let 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"),qe.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new ao("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),qe.add(1,{action:"waited",source:"local"}),Xe.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await Ln(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var ka=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function va(e){if(e instanceof ka)return{type:e.type,message:e.message};if(e instanceof ao){let t=e.response.status;return{type:529===t?"overloaded_error":`upstream_error_${t}`,message:`Upstream error (${t}) while streaming response`}}return{type:"api_error",message:"Stream interrupted before completion"}}async function xa(e,t){let{type:n,message:r}=va(t);try{await e.writeSSE({event:"error",data:JSON.stringify({type:"error",error:{type:n,message:r}})})}catch(e){o.debug("Failed to emit Anthropic stream error frame:",e)}}async function Ta(e,t){let{type:n,message:r}=va(t);try{await e.writeSSE({event:"error",data:JSON.stringify({error:{message:r,type:n}})})}catch(e){o.debug("Failed to emit OpenAI stream error frame:",e)}}function Aa(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 $a(e,t,o){return Math.min(Math.max(e,t),o)}function Sa(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 Sa(JSON.parse(r),t+1)}catch{return null}}function Ea(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Aa(o.capabilities.supports.min_thinking_budget),r=Aa(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Aa(o.capabilities.limits?.max_output_tokens)??void 0}}function Oa(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=$a(Aa(e.requestedBudget)??o,o,n),a=Aa(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 Ca(e,t){if(zn(e.thinking_budget))return e;let o=Ea(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Oa({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 Ia(e){return"invalid_thinking_budget"===Sa(e)}async function Ra(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(zn(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(!Ia(i))return null;let l=Ea(n,t.model);return l?function(e,t){let o=Oa({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=Aa(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 Na(e,t){let o=!1;return()=>{if(o)return;o=!0;let n=e.get("requestData")||{};n.upstreamTtfbMs=performance.now()-t,e.set("requestData",n)}}function Pa(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const qa=new Map,Da=new Map,ja=new Set;let Ma,Fa,Ha;function Ua(e){return!e.closed&&!e.destroyed}function Ba(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new I(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return qa.set(t,Date.now()),Ke.add(1,{event:"created",origin:e}),at(w.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{o.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{o.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(n,r,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=ja.has(t);Ke.add(1,{event:"goaway",origin:e}),at(i?w.WARN:w.DEBUG,i?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),Da.delete(t),ja.delete(t),qa.delete(t),Ua(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function La(e,t){if(!se.connectivity.h2)return;if(Ma&&Ma!==e&&function(){for(let e of[...Da.keys(),...ja])Ua(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Da.clear(),ja.clear(),qa.clear()}(),Ma=e,t?.fresh){let t=Ba(e);return ja.add(t),t}let n=Date.now();for(let[t]of Da)if(n-(qa.get(t)??0)>=6e5)Da.delete(t),qa.delete(t),Ua(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Ke.add(1,{event:"rotated",origin:e}),at(w.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Ua(t))return Da.delete(t),ja.add(t),t;Da.delete(t),qa.delete(t)}let r=Ba(e);return ja.add(r),r}function za(e){e&&ja.delete(e)&&(Ua(e)?Da.set(e,Date.now()):qa.delete(e))}function Ga(){Ha||(Ha=setInterval(()=>{!function(){let e=Date.now(),t=se.connectivity.h2Keepalive,n=Da.size;for(let[r,a]of Da)e-a<6e4||t&&n<=1||(Da.delete(r),qa.delete(r),n--,Ua(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Ke.add(1,{event:"idle_reaped",origin:Ma??""}),at(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${Ma}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Ma??""}))}()},3e4),Ha.unref())}function Ka(){Fa||(o.debug("Starting HTTP/2 keepalive (every 45s)"),Fa=setInterval(()=>{(async function(){if(0===Da.size&&0===ja.size){if(Ma){let e=Ba(Ma);Da.set(e,Date.now())}return}let e=[...Da.keys()];for(let t of e)Da.delete(t);await Promise.allSettled(e.map(async e=>{if(Ua(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:kt(se)});await n.dump(),Ge.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Da.set(e,Date.now())}catch(t){Ge.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Ke.add(1,{event:"error",origin:Ma??""}),qa.delete(e),Ua(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else qa.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),Fa.unref(),Ga())}function Ja(e,t){if(e instanceof ReadableStream)return new Response(e,t);let o,n=new ReadableStream({async pull(t){o??=e[Symbol.asyncIterator]();let n=await o.next();n.done?t.close():t.enqueue(n.value)},cancel(t){e.on("error",()=>{}),e.destroy(t instanceof Error?t:void 0)}});return new Response(n,t)}function Wa(e){return e.max_completion_tokens??e.max_tokens}async function Ya(e,t,o){try{if(!e.ok)throw new ao("Failed to create chat completions",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&ga(t,n.usage),n}catch(e){throw it(t,e),e}finally{t.end()}}const Va=e=>en(se)?e:function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=Wa(e);return null==i?a:{...a,max_completion_tokens:i}}(e,se.models),Xa=e=>en(se)?e:ra(e),Za=async e=>{let t=Xa(e);try{return await ei(t)}catch(e){if(e instanceof ao&&401===e.response.status){if(!await zo(e))throw e;return ei(t)}let n;if(e instanceof ao)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Ra({payload:t,error:e,models:se.models,errorBodyText:n});if(r)return e instanceof ao&&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 ei(Xa(r));throw e}},Qa=async(e,t)=>{let o=Mn(e);return o?(t.setAttribute("copilot_api.foundry.throttled_stream",!0),t.setAttribute("copilot_api.upstream.effective_status",429),t.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(e.body?.cancel()),t.end(),o):(e.ok||t.end(),e.ok?void 0:e)},ei=async e=>{if(!rn(se))throw Error("Service token not found");let t=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),o=e.messages.some(e=>["assistant","tool"].includes(e.role)),n={...nn(se,t),"X-Initiator":o?"agent":"user"},r=on(se),a=`${r}/chat/completions`,i=se.timeoutMs,s=Va(e),l=JSON.stringify(s),c={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":i,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":Wa(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user","copilot_api.upstream.provider":se.provider};for(let t=0;t<=1;t++){ae();let o=La(r,{fresh:t>0}),s=new AbortController,u=so(s,i);try{let{statusCode:r,headers:u,body:p,span:d}=await dt({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}),m=Ja(p,{status:r,headers:u});if(e.stream){let e=await Qa(m,d);if(e)throw new ao("Failed to create chat completions",e,{outgoingBody:l,outgoingHeaders:n});return{events:B(m),span:d,release:()=>za(o)}}try{return await Ya(m,d,{outgoingBody:l,outgoingHeaders:n})}finally{za(o)}}catch(e){if(za(o),await ro(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ti=new Map;const oi=["none","minimal","low","medium","high","xhigh","max"];function ni(e,t){if(!e.reasoning)return e;if(0===t.length){let{reasoning:t,...o}=e;return o}let o=e.reasoning.effort;if(!o)return e;let n=function(e,t){if(t.includes(e))return e;let o=oi.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=oi.indexOf(e);if(-1===t)continue;let a=Math.abs(t-o);a<r&&(r=a,n=e)}return n??t[0]}(o,t);return n&&n!==o?{...e,reasoning:{...e.reasoning,effort:n}}:e}function ri(e,t){if(!e.reasoning)return null;let n=function(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}let{param:o,code:n,message:r=""}=t.error??{};if("reasoning.effort"===o||"reasoning"===o){if("unsupported_value"===n){let e=[...(/Supported values are:(.*)$/i.exec(r)?.[1]??"").matchAll(/\x27([^\x27]+)\x27/g)].map(e=>e[1]);return e.length>0?{kind:"unsupported_value",supported:e}:void 0}if("unsupported_parameter"===n)return{kind:"unsupported_parameter"}}}(t);if(!n)return null;let r="unsupported_value"===n.kind?n.supported:[];ti.set(e.model,r);let a=ni(e,r);return a===e?null:(o.debug(`Foundry rejected reasoning.effort=${e.reasoning.effort} on ${e.model}; retrying with ${a.reasoning?.effort??"no reasoning"}`),a)}async function ai(e,t,o){try{if(!e.ok)throw new ao("Failed to create responses",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&ga(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens,prompt_tokens_details:n.usage.input_tokens_details}),n}catch(e){throw it(t,e),e}finally{t.end()}}const ii=async(e,t)=>{let o=en(se),n=o?function(e){let t=ti.get(e.model);return t?ni(e,t):e}(e):e,r=!1,a=!1;for(;;)try{return t?.onAttempt?.(n),await li(n,t?.signal)}catch(e){if(!(e instanceof ao))throw e;if(401===e.response.status&&!r){if(r=!0,!await zo(e))throw e;continue}if(o&&400===e.response.status&&!a){a=!0;let t=ri(n,await e.response.clone().text().catch(()=>{}));if(t){n=t;continue}}throw e}};function si(e,t){let o,n=()=>{o?.destroy(e?.reason),t.abort(e?.reason)};return e?.aborted?n():e?.addEventListener("abort",n,{once:!0}),{attach:e=>o=e,dispose:()=>e?.removeEventListener("abort",n)}}const li=async(e,t)=>{if(!rn(se))throw Error("Service token not found");let o=en(se)?e:ra(e),n={...nn(se),"X-Initiator":"agent"},r=on(se),a=`${r}/responses`,i=se.timeoutMs,s=JSON.stringify(o),l=((e,t)=>({"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":t,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.max_output_tokens":e.max_output_tokens??0,"copilot_api.api_type":"responses","copilot_api.upstream.provider":se.provider}))(o,i);for(let e=0;e<=1;e++){ae();let c=La(r,{fresh:e>0}),u=new AbortController,d=so(u,i),m=si(t,u);try{let{statusCode:t,headers:r,body:d,span:f}=await dt({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.attach(d);let h=Ja(d,{status:t,headers:r});if(o.stream){let e=Mn(h);if(e&&(f.setAttribute("copilot_api.foundry.throttled_stream",!0),f.setAttribute("copilot_api.upstream.effective_status",429),f.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(h.body?.cancel())),!h.ok||e)throw f.end(),new ao("Failed to create responses",e??h,{outgoingBody:s,outgoingHeaders:n});return{events:B(h),span:f,release:()=>{m.dispose(),za(c)}}}try{return await ai(h,f,{outgoingBody:s,outgoingHeaders:n})}finally{m.dispose(),za(c)}}catch(t){if(m.dispose(),za(c),await ro(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{clearTimeout(d)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ci=e=>Object.hasOwn(e,"output");function ui(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,...t.input_tokens_details&&{prompt_tokens_details:{cached_tokens:t.input_tokens_details.cached_tokens}},...t.output_tokens_details&&{completion_tokens_details:{reasoning_tokens:t.output_tokens_details.reasoning_tokens}}}:null}var pi=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const di=new Set(["model","messages","max_tokens","max_completion_tokens","temperature","top_p","stream","stream_options","tools","tool_choice","parallel_tool_calls","user","reasoning_effort","response_format"]);function mi(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new pi(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new pi(`logprobs is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","logprobs")}(e);let t=function(e){return e.filter(e=>"system"===e.role||"developer"===e.role).map(e=>hi(e.content)).filter(Boolean).join("\n\n")||void 0}(e.messages),o=function(e){let t=[];for(let o of e)switch(o.role){case"user":{let e=gi(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=hi(o.content);e&&t.push({type:"message",role:"assistant",content:[{type:"output_text",text:e}]});for(let e of o.tool_calls??[])t.push({type:"function_call",call_id:e.id,name:e.function.name,arguments:e.function.arguments});break}case"tool":t.push({type:"function_call_output",call_id:o.tool_call_id??"",output:hi(o.content)})}return t}(e.messages);if(0===o.length)throw new pi("request has no translatable message content","invalid_request","messages");let n={model:e.model,input:o,store:!1};t&&(n.instructions=t);let r=e.max_completion_tokens??e.max_tokens;"number"==typeof r&&(n.max_output_tokens=Math.max(r,16)),e.stream&&(n.stream=!0),fi(e.temperature)&&(n.temperature=e.temperature),fi(e.top_p)&&(n.top_p=e.top_p),fi(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),fi(e.user)&&(n.user=e.user),e.reasoning_effort&&(n.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(n.tools=e.tools.filter(e=>"function"===e.type).map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters}))),e.tool_choice&&(n.tool_choice="string"==typeof e.tool_choice?e.tool_choice:{type:"function",name:e.tool_choice.function.name});let a=function(e){if(e)switch(e.type){case"json_schema":{let{name:t,description:o,schema:n,strict:r}=e.json_schema;return{type:"json_schema",name:t,description:o,schema:n,strict:r}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return a&&(n.text={format:a}),n}function fi(e){return null!=e}function hi(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function gi(e){if("string"==typeof e)return e?[{type:"input_text",text:e}]:[];let t=[];for(let o of e??[])if("text"===o.type)o.text&&t.push({type:"input_text",text:o.text});else{if("image_url"!==o.type)throw new pi(`content part type '${o.type}' is not supported for models served via the Responses API`,"unsupported_content_type","messages");t.push({type:"input_image",image_url:o.image_url.url,detail:"low"===o.image_url.detail?"low":"high"})}return t}function _i(e){let t={prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens};return void 0!==e.input_tokens_details?.cached_tokens&&(t.prompt_tokens_details={cached_tokens:e.input_tokens_details.cached_tokens}),void 0!==e.output_tokens_details?.reasoning_tokens&&(t.completion_tokens_details={reasoning_tokens:e.output_tokens_details.reasoning_tokens}),t}function yi(e,t){if("incomplete"===e.status){let t=e.incomplete_details?.reason;if("content_filter"===t)return"content_filter";if("max_output_tokens"===t)return"length"}return t?"tool_calls":"stop"}function wi(e,t,o=null){let n=e.roleSent?t:{role:"assistant",...t};return e.roleSent=!0,{id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[{index:0,delta:n,logprobs:null,finish_reason:o}]}}function bi(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function ki(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=bi(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[wi(t,{tool_calls:[{index:r,function:{arguments:o.arguments}}]})]):[];let a=function(e,t,o){let n=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,n),e.toolCallIndexByOutputIndex.set(o,n),n}(t,o.id,e.output_index),i=n?o.arguments:"";return i&&t.toolCallsWithArgs.add(a),[wi(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function vi(e,t){let o=[wi(e,{},yi(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=_i(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function xi(e,t){switch(e.type){case"response.created":case"response.in_progress":return t.id=e.response.id||t.id,t.model=e.response.model||t.model,e.response.created_at&&(t.created=e.response.created_at),{chunks:[]};case"response.output_text.delta":case"response.refusal.delta":return e.delta?{chunks:[wi(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:ki(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=bi(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[wi(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:vi(t,e.response),done:!0};case"response.failed":return{chunks:[],error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}};case"error":return{chunks:[],error:{type:e.code??"api_error",message:e.message??"Response generation failed"}};default:return{chunks:[]}}}const Ti="openai_responses";function Ai(e){let t=performance.now(),n=Se.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),mi(e)}finally{t.end()}});Ze.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!di.has(e)&&null!=t).map(([e])=>e)}(e);return r.length>0&&o.debug(`Dropped chat-only fields with no Responses API equivalent: ${r.join(", ")}`),n}function $i(e){let t=performance.now(),o=Se.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",o=!1,n=[];for(let r of e.output)if("message"===r.type)for(let e of r.content)"output_text"===e.type?(t+=e.text,o=!0):"refusal"===e.type&&(t+=e.refusal,o=!0);else"function_call"===r.type&&n.push({id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments}});let r={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:o?t:null,...n.length>0&&{tool_calls:n}},logprobs:null,finish_reason:yi(e,n.length>0)}]};return e.usage&&(r.usage=_i(e.usage)),r}(e)}finally{t.end()}});return Ze.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Si(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=_i(t.usage);a.tokenUsage=ha(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json($i(t))}async function Ei(e,t,n){let r;try{r=Ai(t)}catch(t){if(t instanceof pi)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),se.manualApprove&&!n.isSelfTest&&await ma();let a=await fa(e);if(a)return a;let i=performance.now(),s=await ii(r),l=performance.now()-i;if(Ye.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),ci(s))return Si(e,s,l);let{events:c,span:u,release:p}=s,d=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return U(e,async t=>{let n=null,a=0,s=performance.now(),m=Na(e,i);try{try{for await(let i of c){if(m(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,Le.add(1,{model:r.model,endpoint_type:Ti});let c=ui(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=ha(c),t._d1=l,e.set("requestData",t)}let u=xi(s,d);if(u.error)throw new ka(u.error.type,u.error.message);for(let e of u.chunks)await t.writeSSE({data:JSON.stringify(e)});u.done&&await t.writeSSE({data:"[DONE]"})}let u={model:r.model,endpoint_type:Ti};Ve.record(performance.now()-s,u),nt.record(a,u),Pa(e,i)}catch(o){throw st(u,e.get("requestSpan"),o),await Ta(t,o),o}finally{n&&ga(u,n),u.end(),p()}let f=e.get("requestId");f&&be.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Oi(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 Ci(e){let t=!0===e.get("isSelfTest");t||await ba(se);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return Se.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=ya(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),je.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}(n)}catch(t){if(t instanceof _a)return f.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(wa(n.model))return Ei(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),se.manualApprove&&!t&&await ma(),"foundry"!==se.provider&&(n=function(e){if(!zn(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!zn(e.max_tokens))return e;let t=(se.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return o.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(n),n=Ca(n,se.models)),zn(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await fa(e);if(r)return r;let a=performance.now(),i=await Za(n),s=performance.now()-a;if(Ye.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),Ii(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=ha(i.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return U(e,async t=>{let o={value:null},r=0,i=performance.now(),p=Na(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,Le.add(1,{model:n.model,endpoint_type:"openai"}),i=Oi(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=ha(t),n._d1=s,e.set("requestData",n)})),await t.writeSSE(i)}let c=performance.now()-i,u={model:n.model,endpoint_type:"openai"};if(Ve.record(c,u),nt.record(r,u),Pa(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=ha(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw st(c,e.get("requestSpan"),o),await Ta(t,o),o}finally{o.value&&ga(c,o.value),c.end(),u()}let d=e.get("requestId");d&&be.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const Ii=e=>Object.hasOwn(e,"choices"),Ri=new M;Ri.post("/",async e=>{try{return await Bn(e,"chat",Ci)}catch(t){return await Oo(e,t)}});const Ni=async e=>{if(!rn(se))throw Error("Service token not found");let t=`${on(se)}/embeddings`,o=nn(se),n=se.timeoutMs,r=new AbortController,a=so(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await pt({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1,"copilot_api.upstream.provider":se.provider}});try{if(!n.ok)throw new ao("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw it(a,e),e}finally{a.end()}}finally{clearTimeout(a)}},Pi=new M;Pi.post("/",async e=>{try{let t=await e.req.json();try{t.model=ya(t.model)}catch(t){if(t instanceof _a)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=await fa(e);if(o)return o;let n=performance.now(),r=await(async e=>{try{return await Ni(e)}catch(t){if(t instanceof ao&&401===t.response.status){if(!await zo(t))throw t;return Ni(e)}throw t}})(t),a=performance.now()-n;Ye.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=ha(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await Oo(e,t)}});const qi=new M;let Di=null,ji=null;function Mi(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function Fi(e){return!Mi(e)}qi.get("/",async e=>{let t,o=function(){if(en(se)){if(!rn(se))return"missing";let e=se.foundry?.bearerExpiresAt;return void 0!==e&&e<=Date.now()?"expired":"valid"}let e=se._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=Di;return t&&e-t.timestamp<3e4?{result:t.result}:ji||(ji=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${on(se)}/models`,n=await fetch(t,{method:"GET",headers:nn(se),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Di={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Di={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),ji=null}})(),ji)}();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.44.0-preview.21",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 Hi=new L(G);let Ui;const Bi={...z["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Li(e,t){try{return e.encode(t,[],[]).length}catch(e){return o.debug("count_tokens: tokenizer failed, using length/4",e),Math.ceil(t.length/4)}}function zi(e,t){let o=0;for(let n of e)switch(n.type){case"text":o+=t(n.text)*Bi.contentMultiplier;break;case"tool_use":o+=t(n.name+JSON.stringify(n.input))*Bi.contentMultiplier;break;case"tool_result":n.content&&(o+=t("string"==typeof n.content?n.content:JSON.stringify(n.content))*Bi.contentMultiplier);break;case"thinking":o+=t(n.thinking)*Bi.contentMultiplier;break;case"image":o+=1600}return o}function Gi(e,t){let o=0,n=e.properties;if(!n)return o;let r=Object.entries(n);for(let[e,[n,a]]of r.entries()){if(o+=0===e?Bi.perFirstProp:Bi.perAdditionalProp,o+=t(n),a.description&&(o+=Bi.perPropDesc+t(a.description)),a.enum&&Array.isArray(a.enum)){o+=Bi.perEnum;for(let e of a.enum)o+=t(String(e))}if("object"===a.type&&a.properties&&(o+=Bi.perNestedObject,o+=Gi(a,t)),"array"===a.type&&a.items){let e=a.items;"object"===e.type&&e.properties&&(o+=Bi.perArrayOfObjects,o+=Gi(e,t))}}return o}function Ki(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")},n=e.thinking;if(n&&"object"==typeof n){let{type:e,budget_tokens:t}=n;"string"==typeof e&&(o["copilot_api.thinking.type"]=e),"number"==typeof t&&t&&(o["copilot_api.thinking.budget_tokens"]=t)}let r=e.output_config?.effort;return"string"==typeof r&&r&&(o["copilot_api.output_config.effort"]=r),o}function Ji(e,t,o){let n=Ki(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const Wi=async(e,t,n)=>{try{return await Yi(e,t)}catch(r){if(r instanceof ao&&401===r.response.status){if(!await zo(r))throw r;return Yi(e,t)}if(r instanceof ao&&400===r.response.status&&n?.onStructuredOutputFallback){let a;try{a=await r.response.clone().text()}catch{a=void 0}let i=n.onStructuredOutputFallback(e,a);if(i)return o.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${i.model}`),Yi(i,t)}throw r}};const Yi=async(e,t)=>{if(!rn(se))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=en(se)&&se.foundry?{baseUrl:Zo(se.foundry),headers:Qo(se.foundry,t),cleanPayload:e}:function(e,t){let{metadata:o,...n}=e,r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...xt(se,t,r),"X-Initiator":"agent"};return{baseUrl:bt(se),headers:a,cleanPayload:n}}(ra(e),t),a=`${o}/v1/messages`,i=se.timeoutMs,s=JSON.stringify(r),l=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","copilot_api.upstream.provider":se.provider,...Ki(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){ae();let t=La(o,{fresh:e>0}),c=new AbortController,u=so(c,i);try{let{statusCode:o,headers:u,body:p,span:d}=await dt({spanName:"copilot POST /v1/messages",url:a,target:"anthropic_messages",headers:n,body:s,signal:c.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:t}),m=Ja(p,{status:o,headers:u});if(!m.ok)throw d.end(),new ao("Failed to create anthropic messages",m,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:B(m),span:d,release:()=>za(t)};try{let e=await m.json();"string"==typeof e.id&&d.setAttribute("copilot_api.response.id",e.id);let t=e.usage;return t&&ga(d,{prompt_tokens:t.input_tokens??0,completion_tokens:t.output_tokens??0,total_tokens:(t.input_tokens??0)+(t.output_tokens??0)}),e}finally{d.end(),za(t)}}catch(o){if(za(t),await ro(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{clearTimeout(u)}}throw Error("Unexpected: exhausted GOAWAY retries without result")},Vi=new Set(["low","medium","high","max","xhigh"]),Xi=(e,t)=>!(!e||!t||e===t);function Zi(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!Vi.has(t))return e;let n=se.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=Sn(t,n);if(!r||!Vi.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=f.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 Qi(e,t,n){if("foundry"===se.provider)return Zi(e);let r=t.includes(e.model)?e.model:An(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=An(e,t);return n&&o.context1m?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,new Set(t)):null}(a.model,t,{context1m:n.context1m}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=f.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",a.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),s={...a,model:i}}return Zi(s)}const es=e=>"object"==typeof e&&!!e&&!Array.isArray(e),ts=["properties","patternProperties","$defs","definitions"],os=["items","additionalProperties","propertyNames","contains","not","if","then","else"],ns=["anyOf","allOf","oneOf","prefixItems"];const rs=()=>["string","number","boolean"].map(e=>({type:e})),as=()=>({anyOf:[...rs(),{type:"array",items:{anyOf:rs()}},{type:"object"}]}),is=e=>!0===e||es(e)&&0===Object.keys(e).length,ss=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function ls(e,t){let o={...e};for(let e of ts){let n=o[e];es(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,es(o)?ls(o,t):o])))}for(let e of os){let n=o[e];es(n)&&(o[e]=ls(n,t))}for(let e of ns){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>es(e)?ls(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(es(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>is(e)?as().anyOf:es(e)?[e]:[]);if(0===o.length)return;let n=[...new Map(o.map(e=>[JSON.stringify(e),e]))].map(([,e])=>e);e.items=1===n.length?n[0]:{anyOf:n}}(o)),ss(o)&&(!("items"in o)||is(o.items))&&(t.add("items"),o.items=as()),is(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function cs(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=ps(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function us(e){return ds(ps(e))}function ps(e){return"string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.flatMap(e=>"text"===e.type&&"string"==typeof e.text?[e.text]:[]).join("\n\n"):""}function ds(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function ms(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>ds(e)).filter(Boolean).join("\n\n")}const fs=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),hs=new Set(["text","image"]);function gs(e,t){if(Array.isArray(e?.content))for(let o of e.content){if(t.size>=20)return;let e=String(o?.type).slice(0,64);hs.has(e)||t.add(`block:tool_result:${e}`)}}const _s=new Set;function ys(e,t){e.setAttribute("copilot_api.translation.system_message_count",t.filter(e=>"system"===e.role).length),e.setAttribute("copilot_api.translation.has_images",function(e){return e.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type||"tool_result"===e.type&&Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)))}(t));let o=function(e){let t=new Set;for(let o of e){if(t.size>=20)break;let e=String(o.role).slice(0,64),n=fs.get(e);if(n){if(Array.isArray(o.content))for(let r of o.content){let o=String(r?.type).slice(0,64);if(n.has(o)||t.add(`block:${e}:${o}`),"tool_result"===o&&gs(r,t),t.size>=20)break}}else t.add(`role:${e}`)}return[...t].sort()}(t);if(0===o.length)return;e.setAttribute("copilot_api.translation.unknown_shapes",o.join(","));let n=function(e){let t=[];for(let o of e){if(_s.size>=100)break;_s.has(o)||(_s.add(o),t.push(o))}return t}(o);0!==n.length&&r.warn(`Request contains message shapes the translator does not handle (dropped): ${n.join(", ")}`)}const ws=e=>N("sha256").update(e).digest("hex").slice(0,12);function bs(e,t){e.setAttribute("copilot_api.translation.system_hash",ws(t.system)),e.setAttribute("copilot_api.translation.tools_hash",ws(JSON.stringify(t.tools??[])))}function ks(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function vs(e){return e.toLowerCase().startsWith("claude-")}function xs(e,t){let o={model:e.model,messages:Ts(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:Rs(e.tools,e.model),tool_choice:Ns(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Ea(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:"medium"===e?8e3:"low"===e?1024:16e3}(e,o.max),r=Aa(t),a=r&&r>1?r-1:o.min;return $a(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Ca({...o,thinking_budget:a},t)}}return o}function Ts(e,t){let{leadingSystemTexts:o,messages:n}=cs(e),r=function(e,t){let o=ms(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=us(e);if(!t)break;As(r)?a.push(t):$s(r,t);break}case"user":r.push(...Ss(e));for(let e of a)$s(r,e);a=[];break;case"assistant":r.push(...Es(e))}for(let e of a)$s(r,e);return r}function As(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function $s(e,t){let o=function(e){return e.trimStart().startsWith("<system-reminder>")?e:`<system-reminder>\n${e}\n</system-reminder>`}(t),n=e.at(-1);"user"===n?.role?Array.isArray(n.content)?n.content.push({type:"text",text:o}):n.content=n.content?`${n.content}\n\n${o}`:o:e.push({role:"user",content:o})}function Ss(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:Is(e.content)});n.length>0&&t.push({role:"user",content:Is(n)})}else t.push({role:"user",content:Is(e.content)});return t}function Es(e){let t=function(e){return{reasoning_text:Cs(e.reasoning_text),reasoning_opaque:Cs(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:Is(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:Is(e.content),...t}]}const Os=32768;function Cs(e){if("string"==typeof e)return e.length<=Os?e:e.slice(0,Os)}function Is(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 Rs(e,t){if(!e)return;let o=e.filter(Fi),n=function(e){return e.toLowerCase().startsWith("gemini")}(t),r=new Set,a=o.map(e=>{let t=e.input_schema;if(n){let e=function(e){let t=new Set;return{schema:ls(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)r.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return r.size>0&&f.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function Ns(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 Ps(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 qs(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Ds(e){return e?e.map(e=>{let t={};try{t=JSON.parse(e.function.arguments)}catch{r.warn(`Failed to parse tool call arguments for "${e.function.name}": ${e.function.arguments.slice(0,200)}`)}return{type:"tool_use",id:e.id,name:e.function.name,input:t}}):[]}const js=new Set(["low","medium","high","max","xhigh"]);function Ms(e,t){let o=e.thinking;if(!o||"enabled"!==o.type)return e;let n=t?.data.find(t=>t.id===e.model);if(!n||!n.capabilities.supports.adaptive_thinking)return e;let r={...e,thinking:{type:"adaptive"}};if(!e.output_config?.effort){let t=(e=>null!==e&&js.has(e)?e:null)(Sn(function(e){return!e||e<=0?"medium":e<8e3?"low":e<24e3?"medium":"high"}(o.budget_tokens),n.capabilities.supports.reasoning_effort));t&&(r.output_config={...e.output_config,effort:t})}return r}function Fs(e){return"string"!=typeof e&&Array.isArray(e)?e.map(e=>{let t=e;if(!t.cache_control||"object"!=typeof t.cache_control)return e;let o=t.cache_control;if("string"!=typeof o.type){let{cache_control:e,...o}=t;return o}let n={type:o.type};return void 0!==o.ttl&&(n.ttl=o.ttl),{...t,cache_control:n}}):e}const Hs=/[^\w-]/g;function Us(e){return e.replaceAll(Hs,"_")}function Bs(e,t){let o=function(e,t){if(!e.output_config?.effort)return e;let o=t?.data.find(t=>t.id===e.model);if(!o)return e;let n=o.capabilities.supports.reasoning_effort;if(Array.isArray(n)&&n.length>0)return e;let{effort:r,...a}=e.output_config;if(0===Object.keys(a).length){let{output_config:t,...o}=e;return o}return{...e,output_config:a}}(e,t);return o=Ms(o,t),o=function(e,t){let o=e.max_tokens;if("number"!=typeof o)return e;let n=t?.data.find(t=>t.id===e.model);if(!n)return e;let r=n.capabilities.limits;if(!r)return e;let a=(!1===e.stream?r.max_non_streaming_output_tokens:void 0)??r.max_output_tokens;if("number"!=typeof a||a<=0)return e;let i=Math.max(Math.min(o,a),16);return i===o?e:{...e,max_tokens:i}}(o,t),o={...o,system:Fs(o.system)},o=function(e){let t=e.messages.map(e=>{if(!Array.isArray(e.content))return e;let t=e.content.map(e=>{let t=e;return"tool_use"===t.type&&"string"==typeof t.id?{...t,id:Us(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Us(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Ls(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"thinking must be an object";let o=t;return"string"==typeof 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 a string"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"output_config must be an object";let o=t;return void 0===o.effort||"string"==typeof o.effort?null:"output_config.effort must be a string"}(e)}function zs(e,t,o=400){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function Gs(e,t){return Se.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),Ji(n,t,e.req.header("anthropic-beta"));let r=ya(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Ls(t);return a?(f.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),je.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 _a)return{ok:!1,response:zs(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function Ks(e,t,o){let{leadingSystemTexts:n,messages:r}=cs(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=us(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(Zs(e));break}case"user":t.push(...Qs(n),...o.map(e=>Zs(e))),o=[];break;case"assistant":t.push(...ol(n))}return t.push(...o.map(e=>Zs(e))),t}(r);if(0===a.length)throw new ao("request has no translatable message content",Response.json({type:"error",error:{type:"invalid_request_error",message:"request has no translatable message content"}},{status:400}));let i={model:e.model,input:a,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)},s=function(e,t){return ms(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(Fi).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(i.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));let l=function(e,t,o){if("adaptive"===e.thinking?.type){let t=e.output_config?.effort??"high";return o&&"max"===t?{effort:"max"}:{effort:Xs(t)}}if("enabled"===e.thinking?.type&&e.thinking.budget_tokens){let{effort:o}=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens),n=Sn(o,t);return{effort:Vs(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function Js(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${N("sha256").update(o).digest("hex").slice(0,32)}`}function Ws(e){let t=e?.input_tokens??0,o=e?.input_tokens_details?.cached_tokens;return{input_tokens:void 0===o?t:Math.max(t-o,0),output_tokens:e?.output_tokens??0,...void 0===o?{}:{cache_read_input_tokens:o}}}const Ys=new Set(["low","medium","high","xhigh"]),Vs=e=>null!==e&&Ys.has(e);function Xs(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function Zs(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function Qs(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(tl(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)switch(t.type){case"text":e.push({type:"input_text",text:t.text});break;case"image":e.push(el(t))}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 el(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function tl(e){if(Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)){let t=e.content.filter(e=>["image","text"].includes(e.type)).map(e=>"image"===e.type?el(e):{type:"input_text",text:e.text});return e.is_error&&t.unshift({type:"input_text",text:"[ERROR]"}),{type:"function_call_output",call_id:e.tool_use_id,output:t}}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 ol(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 nl(e,t){if("incomplete"===e.status)return"content_filter"===e.incomplete_details?.reason?"refusal":"max_tokens";if(t)return"tool_use";switch(e.status){case"completed":case"cancelled":case"failed":return"end_turn";default:return null}}function rl(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function al(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 il(e,t){let o=[];switch(e.type){case"response.created":al(t,o,{responseId:e.response.id,model:e.response.model});break;case"response.in_progress":case"response.output_text.done":case"response.function_call_arguments.done":break;case"response.output_item.added":if("function_call"===e.item.type){al(t,o),rl(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":al(t,o),rl(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":rl(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":{rl(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage,a=nl(e.response,n);t.terminalEvent=e.type,t.stopReason=a,o.push({type:"message_delta",delta:{stop_reason:a,stop_sequence:null},usage:Ws(r)},{type:"message_stop"});break}case"response.incomplete":{al(t,o),rl(t,o);let n=e.response.usage,r=nl(e.response,!1);t.terminalEvent=e.type,t.stopReason=r,o.push({type:"message_delta",delta:{stop_reason:r,stop_sequence:null},usage:Ws(n)},{type:"message_stop"});break}case"response.failed":al(t,o),rl(t,o),t.terminalEvent=e.type,o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":al(t,o),rl(t,o),t.terminalEvent=e.type,t.stopReason="end_turn",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":al(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}});break;case"error":t.terminalEvent=e.type,o.push({type:"error",error:{type:e.code??"api_error",message:e.message??"Response generation failed"}})}return o}function sl(e,t,o){let n=t.reasoning?.effort,r=e.get("requestData")||{};r.reasoningEffort=n,r.effortClamped=Xi(o,n),e.set("requestData",r)}function ll(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function cl(e,t,n){for(let r of t){if(o.debug("Translated Anthropic event:",r),"error"===r.type)throw n?.setAttribute("copilot_api.error_type","upstream_failure"),new ka(r.error.type,r.error.message);await e.writeSSE({event:r.type,data:JSON.stringify(r)})}}async function ul(e,t,r){let a=performance.now(),i=Se.startActiveSpan("copilot_api.translate.anthropic_to_responses",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),ys(o,t.messages);let n=Ks(t,se.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===se.provider,promptCacheKey:"foundry"===se.provider?Js(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return bs(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});Ze.record(performance.now()-a,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",i),e.set("requestData",{model:i.model,streaming:!!i.stream}),sl(e,i,r),se.manualApprove&&await ma();let s=performance.now(),l=await ii(i,{onAttempt:t=>sl(e,t,r),signal:It(e)}),c=performance.now()-s;if(Ye.record(c,{model:i.model,target:"responses",streaming:String(!!i.stream)}),ci(l)){let t=e.get("requestData")||{};if(ll(e.get("requestSpan"),l.usage?.output_tokens_details?.reasoning_tokens),l.usage&&(t.tokenUsage=ha({prompt_tokens:l.usage.input_tokens,completion_tokens:l.usage.output_tokens,total_tokens:l.usage.total_tokens,prompt_tokens_details:l.usage.input_tokens_details})),t._d1=c,t.upstreamTtfbMs=c,t.upstreamTotalMs=c,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(l).slice(-400)),"failed"===l.status)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:l.error?.code??"api_error",message:l.error?.message??"Response generation failed"}},500);let r=performance.now(),a=Se.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","responses_to_anthropic");let t=function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:nl(e,o),stop_sequence:null,usage:Ws(e.usage)}}(l);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return Ze.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:u,span:p,release:d}=l;return U(e,async t=>{t.onAbort(()=>Rt(e));let n=null,r=0,a=performance.now(),l=Na(e,s),m={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let a of u){if(l(),o.debug("Responses API raw stream event:",a),!a.data)continue;let s;try{s=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}r++,Le.add(1,{model:i.model,endpoint_type:"responses"});let u=ui(s);if(u){n=u;let t=e.get("requestData")||{};t.tokenUsage=ha(n),t._d1=c,e.set("requestData",t)}await cl(t,il(s,m),e.get("requestSpan"))}!function(e,t){if(!t.terminalEvent)throw e?.setAttribute("copilot_api.error_type","stream_incomplete"),new ka("api_error","Upstream stream ended before the response completed")}(e.get("requestSpan"),m);let p=performance.now()-a,d={model:i.model,endpoint_type:"responses"};Ve.record(p,d),nt.record(r,d),Pa(e,s)}catch(o){if(Nt(e))return;throw st(p,e.get("requestSpan"),o),await xa(t,o),o}finally{n&&ga(p,n),function(e,t,o){e&&(ll(e,o?.completion_tokens_details?.reasoning_tokens),e.setAttribute("copilot_api.stream.terminal_event",t.terminalEvent??"none"),void 0!==t.stopReason&&e.setAttribute("copilot_api.translation.stop_reason",t.stopReason??"null"),e.setAttribute("copilot_api.translation.tool_use_count",Object.keys(t.toolCalls).length))}(e.get("requestSpan"),m,n),p.end(),d()}}finally{try{let t=e.get("requestId");t&&be.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}})}function pl(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 dl(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function ml(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&&(pl(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&&(pl(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),dl(t,o)),r.content&&(dl(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){dl(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&&(dl(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:ks(n.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:"message_stop"})),o}const fl=/structured_outputs|output_config\.format/i;function hl(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&fl.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Bs({...e,model:kn},o):null}var gl=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var _l=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const yl={tavily:async function(e,t,n){let r=function(e,t){let o={query:e,max_results:t?.maxResults??5};return t?.includeDomains?.length&&(o.include_domains=t.includeDomains),t?.excludeDomains?.length&&(o.exclude_domains=t.excludeDomains),o}(t,n);o.debug("Tavily search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await pt({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("tavily.results_count",e.results.length),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw it(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new _l:e}finally{clearTimeout(i)}},exa:async function(e,t,n){let r=function(e,t){let o={query:e,numResults:t?.maxResults??5,contents:{text:!0}};return t?.includeDomains?.length&&(o.includeDomains=t.includeDomains),t?.excludeDomains?.length&&(o.excludeDomains=t.excludeDomains),o}(t,n);o.debug("Exa search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await pt({spanName:"exa POST /search",url:"https://api.exa.ai/search",target:"exa_search",method:"POST",headers:{"Content-Type":"application/json","x-api-key":e},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"exa.max_results":n?.maxResults??5,"exa.has_include_domains":!!n?.includeDomains?.length,"exa.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("exa.results_count",e.results.length),o.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw it(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new gl:e}finally{clearTimeout(i)}}},wl=["tavily","exa"];function bl(e){return"tavily"===e||"exa"===e}function kl(){return se.webSearchProviders.length>0}async function vl(e,t){return async function(e,t,n){let{providers:r,searchFns:a=yl}=n;if(0===r.length)throw Error("No web search provider configured");let i,s=[];for(let[n,l]of r.entries())try{let n=await a[l.name](l.key,e,t);return s.length>0&&o.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),n}catch(e){i=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);n!==r.length-1&&o.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${r[n+1].name}".`)}let l=i instanceof Error?i.message:String(i);throw o.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),i instanceof Error?i:Error("All web search providers failed")}(e,t,{providers:se.webSearchProviders})}function xl(e){let t=e.tools;return!(!t||1!==t.length)&&Mi(t[0])}function Tl(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Al(e,t){let o=[{type:"web_search_tool_result_error",error_code:t.errorCode??"unavailable"}];return{type:"web_search_tool_result",tool_use_id:e,content:t.searchFailed?o:t.results}}async function $l(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return t&&Mi(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!kl())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await vl(n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains})).map(e=>({type:"web_search_result",url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString("base64"),page_age:null}))}catch(e){o.error("Web search failed:",e),s=!0,a??="unavailable"}let l={query:n,results:i,model:t.model,searchFailed:s,errorCode:a};if(!t.stream)return e.set("requestData",{model:t.model,streaming:!1}),e.json(function(e){let{query:t,model:o}=e,n=`srvtoolu_${Tl()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...Al(n,e)}];return{id:`msg_ws_${Tl()}`,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_${Tl()}`,r=`msg_ws_${Tl()}`,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:Al(n,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),U(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}async function Sl(e){if(rn(se)||await cr())return null;let t=or();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${rr()}`}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function El(e,t){let o=t.model;return o&&"string"==typeof o?null:zs(e,"Model name is required and must be a string")}async function Ol(e){let t=await e.req.json();if(xl(t))return El(e,t)??$l(e,t);await ba(se),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=El(e,t);if(a)return a;t=function(e,t){return Qi(t,se.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Gs(e,t);if(!i.ok)return i.response;t=i.payload;let s=await Sl(e);if(s)return s;if(wa(t.model))return ul(e,t,r);if(function(e){if("foundry"!==se.provider)return vs(e);let t=se.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:vs(e)}(t.model))return async function(e,t,o){let n="foundry"===se.provider,r=n?t:Bs(t,se.models),a={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},i=r.output_config?.effort;return e.set("requestData",{model:r.model,reasoningEffort:i,effortClamped:Xi(o,i),streaming:!!r.stream}),se.manualApprove&&await ma(),Se.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",r.model),t.setAttribute("copilot_api.streaming",!!r.stream),Ji(t,r,a.anthropicBeta);try{let o=performance.now(),i=await Wi(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=hl(e,o,se.models);return r&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",r.model)),r}}),s=performance.now()-o;if(Ye.record(s,{model:r.model,target:"anthropic_messages",streaming:String(!!r.stream)}),!r.stream){let o=i,n=o.usage;if(n){let t={input_tokens:n.input_tokens||0,output_tokens:n.output_tokens||0,cache_read_input_tokens:n.cache_read_input_tokens||0,cache_creation_input_tokens:n.cache_creation_input_tokens||0},o=e.get("requestData")||{};o.tokenUsage=ha(Il(t)),o._d1=s,o.upstreamTtfbMs=s,o.upstreamTotalMs=s,e.set("requestData",o)}return t.end(),e.json(o)}let{events:l,span:c,release:u}=i;return U(e,async n=>{let a=0,i=performance.now(),s={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=Na(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,Le.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),Rl(e.data,s)&&(p=!0),await n.writeSSE(e)):await n.writeSSE(e);let e=performance.now()-i,t={model:r.model,endpoint_type:"anthropic_messages"};Ve.record(e,t),nt.record(a,t)}catch(t){throw st(c,e.get("requestSpan"),t),await xa(n,t),t}finally{if(Pa(e,o),p){let t=Il(s);ga(c,t);let o=e.get("requestData")||{};o.tokenUsage=ha(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&be.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw it(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=Se.startActiveSpan("copilot_api.translate.anthropic_to_openai",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_openai"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),o.setAttribute("copilot_api.translation.has_tools",!!t.tools?.length),o.setAttribute("copilot_api.translation.has_system",!!t.system),o.setAttribute("copilot_api.translation.context_1m_beta",/context-1m/i.test(e.req.header("anthropic-beta")??""));let n=t.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>"thinking"===e.type));o.setAttribute("copilot_api.translation.has_thinking",n),ys(o,t.messages);let r=xs(t,se.models),a=r.messages.at(0);return bs(o,{system:"system"===a?.role&&"string"==typeof a.content?a.content:"",tools:r.tools}),r}finally{o.end()}});Ze.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=Ca(c,se.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:Xi(r,u),streaming:!!c.stream});let p=performance.now();se.manualApprove&&await ma();let d=await Za(c),m=performance.now()-p;if(Ye.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),Cl(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=ha(d.usage)),t._d1=m,t.upstreamTtfbMs=m,t.upstreamTotalMs=m,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(d).slice(-400));let r=performance.now(),a=Se.startActiveSpan("copilot_api.translate.openai_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","openai_to_anthropic");let t=function(e){let t=[],o=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let a of e.choices){let e=qs(a.message),i=Ps(a.message.content),s=Ds(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:ks(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(d);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return Ze.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}o.debug("Streaming response from service");let{events:f,span:h,release:g}=d;return U(e,async t=>{let n=null,r=0,a=performance.now(),i=Na(e,p),s={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let a of f){if(i(),o.debug("Raw stream event:",a),"[DONE]"===a.data)break;if(!a.data)continue;let l;try{l=JSON.parse(a.data)}catch(e){o.warn("Failed to parse streaming chunk:",a.data.slice(0,200),e);continue}if(r++,Le.add(1,{model:c.model,endpoint_type:"anthropic"}),l.usage){n=l.usage;let t=e.get("requestData")||{};t.tokenUsage=ha(n),t._d1=m,e.set("requestData",t)}let u=ml(l,s);for(let e of u)o.debug("Translated Anthropic event:",e),await t.writeSSE({event:e.type,data:JSON.stringify(e)})}let l=performance.now()-a,u={model:c.model,endpoint_type:"anthropic"};if(Ve.record(l,u),nt.record(r,u),Pa(e,p),n){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=ha(n),t._d1=m,e.set("requestData",t))}}catch(o){throw st(h,e.get("requestSpan"),o),await xa(t,o),o}finally{n&&ga(h,n),h.end(),g()}let l=e.get("requestId");l&&be.executeCompletion(l)}finally{e.get("resolveStreamComplete")?.()}})}const Cl=e=>Object.hasOwn(e,"choices");function Il(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 Rl(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}const Nl=new M;Nl.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&xl(t)}catch{return!1}}(e)?await Ol(e):await Bn(e,"messages",Ol)}catch(t){return await Oo(e,t)}});const Pl=new M;function ql(e){return Se.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=ya(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),je.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function Dl(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,prompt_tokens_details:e.input_tokens_details}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=ha(o),n._d1=t._d1,t.c.set("requestData",n)}Pl.get("/",async e=>{try{se.models||await Gn();let t=se.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 Oo(e,t)}});const jl=new Set(["message","function_call","function_call_output"]),Ml=new Set(["type","name","description","parameters"]);async function Fl(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||!kl())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await vl(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Hl(e){if(kl())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Fl(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Ul(e){if(!kl())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 Fl(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Bl(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 jl.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Ll(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 zl(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&&Ll(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)Ll(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Gl(e){return null!=e}function Kl(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Jl(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function Wl(e){let t={model:e.model},{input:o,droppedInputTypes:n}=function(e){if(!Array.isArray(e))return{input:e,droppedInputTypes:[]};let t=new Set,o=[];for(let n of e){if(!Kl(n)){o.push(n);continue}let e=Bl(n);null===e?t.add(Jl(n.type)):o.push(e)}return{input:o,droppedInputTypes:[...t]}}(e.input);void 0!==o&&(t.input=o);for(let o of["previous_response_id","prompt","conversation","instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])Gl(e[o])&&(t[o]=e[o]);let r=new Set;if(Gl(e.tools)){let o=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let o=e.type;if("web_search"===o||o.startsWith("web_search_"))return{type:e.type};let n={};for(let t of Object.keys(e))Ml.has(t)&&(n[t]=e[t]);return"custom"===n.type&&(n.type="function",t.add(n.name),n.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),n}),customToolNames:t}}(e.tools);t.tools=o.tools,r=o.customToolNames}if(Gl(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Gl(o.effort)&&(t.reasoning.effort=o.effort),Gl(o.summary)&&(t.reasoning.summary=o.summary)}if(Gl(e.text)&&"object"==typeof e.text){let o=e.text;Gl(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function Yl(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function Vl(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=f.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||Gl(n.previous_response_id)||Gl(n.prompt)||Gl(n.conversation)?null:Yl(e,`input contains no supported items: every item was dropped (unsupported item types: ${r.join(", ")}). Provide at least one message, function_call or function_call_output item, or previous_response_id, prompt or conversation.`)}async function Xl(e){await ba(se);let t=await e.req.json();if(!Kl(t))return Yl(e,"request body must be a JSON object");let n=function(e){return"foundry"===se.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:Wl(e)}(t),{customToolNames:r}=n,a=n.payload;o.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),r.size>0&&o.debug(`Custom tools detected: ${[...r].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:ql(t)}}catch(t){if(t instanceof _a)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,a);if(!i.ok)return i.response;a=i.payload;let s=Vl(e,t.input,n);if(s)return s;let l=await fa(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),se.manualApprove&&await ma();let c=performance.now(),u=await ii(a,{signal:It(e)}),p=performance.now()-c;if(Ye.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),Zl(u))return async function(e,t,o){await Hl(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=ha({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens,prompt_tokens_details:t.usage.input_tokens_details})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return U(e,async t=>{t.onAbort(()=>Rt(e));let o={value:null},n=0,i=performance.now(),s=Na(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=zl(i.data,r);s=await Ul(s);let l=s===i.data?i:{...i,data:s};Le.add(1,{model:a.model,endpoint_type:"responses"}),Dl(s,{usageRef:o,c:e,_d1:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};Ve.record(l,u),nt.record(n,u),Pa(e,c)}catch(o){if(Nt(e))return;throw st(m,e.get("requestSpan"),o),await Ta(t,o),o}finally{o.value&&ga(m,o.value),m.end(),f()}}finally{!function(e){try{let t=e.get("requestId");t&&be.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}(e)}})}const Zl=e=>Object.hasOwn(e,"output"),Ql=new M;Ql.post("/",async e=>{try{return await Bn(e,"responses",Xl)}catch(t){return await Oo(e,t)}});const ec=new M;ec.get("/",e=>{try{return se.showToken?e.json({token:se._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 tc=new M;tc.get("/",async e=>{try{let t=await Ar();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const oc=new M;function nc(){return function(e){let t=e.filter(e=>ca(e));if(0===t.length)return;let o=t.find(e=>la.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(se.models?.data??[])}function rc(e,t,o){let n=function(e){if(!e)return;try{let t=JSON.parse(e),o=t.error?.message??t.message;if("string"==typeof o&&o.length>0)return na(o).slice(0,200)}catch{}let t=na(e).trim();return t.length>0?t.slice(0,200):void 0}(t),r=n?` (upstream: ${n})`:"";switch(!0){case 401===e:case 403===e:return`Authentication/entitlement failed (HTTP ${e}). Your GitHub Copilot subscription may be inactive, or the Auth token is invalid. Run \`copilot-api auth\` to re-authenticate; if it persists, this account has no active Copilot access${r}.`;case 402===e:return`Premium monthly quota exhausted (HTTP 402). Switch to a non-premium model (e.g. claude-haiku-4.5) or wait for the monthly quota reset${r}.`;case 400===e:return`Model '${o}' was rejected (HTTP 400). On individual plans only some models are entitled — try claude-haiku-4.5, or run \`copilot-api doctor\` to see what works${r}.`;case 413===e:return`Request too large (HTTP 413)${r}.`;case 429===e:return`Rate limited upstream (HTTP 429) — wait and retry${r}.`;case 503===e:return`Service not ready (HTTP 503) — the model catalog or Service token is still warming up. Retry in a few seconds${r}.`;case e>=500:return`Upstream error (HTTP ${e})${r}.`;default:return`Unexpected response (HTTP ${e})${r}.`}}async function ac(e={}){let t=performance.now(),o=e.model&&function(e){let t=se.models?.data.find(t=>t.id===e);return void 0!==t&&ca(t)}(e.model)?e.model:nc();if(!o)return{ok:!1,durationMs:0,reason:"No models available — the catalog is empty (upstream /models failed at startup). Check connectivity and authentication."};let n,r=e.timeoutMs??3e4,a=()=>Math.round(performance.now()-t),i=(async()=>{try{let e=await oc.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[ia]:sa},body:JSON.stringify({model:o,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(e.ok)return{ok:!0,model:o,status:e.status,durationMs:a()};let t=await e.text().catch(()=>"");return{ok:!1,model:o,status:e.status,durationMs:a(),reason:rc(e.status,t,o),detail:t.slice(0,400)||void 0}}catch(e){let t=e instanceof Error?e.message:String(e);return{ok:!1,model:o,durationMs:a(),reason:`Request failed before a usable response: ${t}`,detail:t}}})(),s=new Promise(e=>{n=setTimeout(()=>{e({ok:!1,model:o,durationMs:a(),reason:`Did not complete within ${r}ms. If you started with --manual, approve the request or use --no-smoke-test; otherwise the upstream may be slow or unreachable.`})},r)});try{return await Promise.race([i,s])}finally{n&&clearTimeout(n)}}oc.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=Pt(i),l=function(e){return e===sa}(e.req.header(ia));e.set("requestId",r),e.set("isSelfTest",l),e.header("x-request-id",r);let c=Se.startSpan("copilot_api.handle_request",{kind:u.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",c),e.set("requestTraceContext",c.spanContext()),l&&c.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();ct.has(e)||"x-copilot-api-self-test"!==e&&c.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=e.req.raw.clone(),o=new Uint8Array(await t.arrayBuffer());e.set("rawBody",(new TextDecoder).decode(o.subarray(0,1048576)))}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let m,h=new Promise(e=>{m=e});e.set("streamComplete",h),e.set("resolveStreamComplete",m);let g=f.setSpan(d.active(),c);await d.with(g,async()=>{l||be.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw c.setStatus({code:p.ERROR,message:t.message}),c.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:c};_?.streaming&&e.res.status<400?h.then(()=>da(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{c.recordException(t),c.setStatus({code:p.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{c.end()}catch{}}):da(y)}),oc.use(F()),oc.use(async(e,t)=>{let o=e.req.header("content-length");if(o){let t=Number(o);if(Number.isFinite(t)&&t>33554432)return r.warn(`Rejected oversized request: ${t} bytes on ${e.req.path} (UA: ${e.req.header("user-agent")??"unknown"})`),e.json({type:"error",error:{type:"request_too_large",message:`Request body exceeds 32 MB limit (got ${t} bytes).`}},413)}await t()}),oc.get("/",e=>e.text("Server running")),oc.route("/health",qi),oc.route("/chat/completions",Ri),oc.route("/models",Pl),oc.route("/embeddings",Pi),oc.route("/usage",tc),oc.route("/token",ec),oc.route("/v1/chat/completions",Ri),oc.route("/v1/models",Pl),oc.route("/v1/embeddings",Pi),oc.route("/v1/messages",Nl),oc.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{name:o,tokenizer:n}=await async function(e){let t=se.models?.data.find(t=>t.id===e);return!t||"Anthropic"===t.vendor||un(t.capabilities.family)||"o200k_base"!==t.capabilities.tokenizer?{name:"claude",tokenizer:Hi}:(Ui??=import("ai-tokenizer/encoding/o200k_base").then(e=>new L(e)),{name:"o200k_base",tokenizer:await Ui})}(t.model),r=e=>Li(n,e),a=Bi.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");a+=Bi.perMessage+r(e)*Bi.contentMultiplier}for(let e of t.messages)a+=Bi.perMessage,a+=r(e.role),"string"==typeof e.content?a+=r(e.content)*Bi.contentMultiplier:Array.isArray(e.content)&&(a+=zi(e.content,r));let i=t.tools?.filter(Fi);i&&i.length>0&&(a+=function(e,t){let o=Bi.toolsExist;for(let[n,r]of e.entries())n>0&&(o+=Bi.perTool),o+=t(r.name),r.description&&(o+=Bi.perDesc+t(r.description)),o+=Gi(r.input_schema,t);return o}(i,r));let s=Math.round(a);"string"==typeof t.model&&e.set("requestData",{model:t.model,streaming:!1});let l=e.get("requestSpan");return l?.setAttribute("copilot_api.count_tokens.estimate",s),l?.setAttribute("copilot_api.count_tokens.tokenizer",o),e.json({input_tokens:s})}),oc.route("/v1/responses",Ql),oc.route("/responses",Ql),oc.onError((e,t)=>Oo(t,e));const ic=e=>`[1m${e}[0m`,sc=e=>`[2m${e}[0m`,lc=e=>`[32m${e}[0m`,cc=e=>`[31m${e}[0m`,uc=e=>`[33m${e}[0m`,pc=sc(" ─────────────────────────────────────────────────────────────");function dc(e,t,o){console.log(` ${function(e){return"ok"===e?lc("✓"):"warn"===e?uc("⚠"):cc("✗")}(e)} ${ic(t.padEnd(14))} ${o}`)}function mc(e){console.log(` ${sc("↳")} ${sc(e)}`)}function fc(e){return e instanceof ao?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function hc(){let e=y.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await a.readFile(Z.GITHUB_TOKEN_PATH,"utf8")).trim();return e.length>0?e:void 0}catch{return}}();return t?{token:t,source:"stored file"}:void 0}async function gc(){try{await Gn();let e=(se.models?.data.length??0)>0;return dc(e?"ok":"warn","Model catalog",e?function(){let e=se.models?.data??[],t={Claude:0,OpenAI:0,Gemini:0,Embedding:0};for(let o of e)o.id.startsWith("text-embedding")?t.Embedding++:"Anthropic"===o.vendor?t.Claude++:"Google"===o.vendor?t.Gemini++:t.OpenAI++;let o=Object.entries(t).filter(([,e])=>e>0).map(([e,t])=>`${e}: ${t}`);return`${e.length} models (${o.join(", ")})`}():"empty"),e}catch(e){return dc("fail","Model catalog",fc(e)),mc("Could not fetch /models — check connectivity/auth."),!1}}async function _c(e){se.accountType=e.accountType;let t=await Kt(),o=Jt();if(console.log(""),console.log(` ${ic("COPILOT-API DOCTOR")} ${sc(`v${t}`)}`),console.log(pc),dc("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await Q(),Kn(),!await async function(){let e=await hc();if(!e)return dc("fail","Auth token","not found"),void mc("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");se._t2=e.token,dc("ok","Auth token",`found (${e.source})`);try{let e=await Io();return await wt(se,e.login),dc("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return dc("fail","GitHub auth",fc(e)),void mc("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(pc),console.log(` ${cc("✗")} ${ic("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await Co();return se._t1=e,dc("ok","Service token","acquired"),!0}catch(e){let t=e instanceof ao?e.response.status:0;return dc("fail","Service token",fc(e)),mc(401===t?"Auth token is invalid/expired — run `copilot-api auth`.":403===t?"No active GitHub Copilot subscription on this account. Re-auth won't help.":"Transient/network issue — check connectivity and retry."),!1}}(),r=!!n&&await gc();await async function(){try{let e=await Ar(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${wr(br(t))} of ${wr(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;dc("ok","Copilot plan",`${e.copilot_plan} · ${o} `+sc(`(resets ${e.quota_reset_date})`))}catch(e){dc("warn","Copilot plan",`unavailable (${fc(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await ac();return e.ok?(dc("ok","Generation",`works via ${e.model} ${sc(`(${e.durationMs}ms)`)}`),!0):(dc("fail","Generation",`${e.reason}${e.status?sc(` [HTTP ${e.status}]`):""}`),!1)}():dc("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let o of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let n=y.env[o];n&&("ANTHROPIC_BASE_URL"===o&&/\/v1\/*$/.test(n)&&(t="warn",e.push(`${o}=${n} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(n)&&(t="warn",e.push(`${o}=${n} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){dc(t,"Client config","potential base-URL issue");for(let t of e)mc(t)}else dc("ok","Client config","no base-URL issues detected");mc("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(pc),a?(console.log(` ${lc("✓")} ${ic("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${uc("⚠")} ${ic("Some checks need attention")} — see the ${cc("✗")}/${uc("⚠")} lines above.`),console.log(""),2)}const yc=e({meta:{name:"doctor",description:"Diagnose your setup end-to-end: token, auth, entitlement, model catalog, and one real generation. Tells you exactly what's wrong and how to fix it."},args:{"account-type":{alias:"a",type:"string",default:"individual",description:"Account type to check against (individual, business, enterprise)"}},async run({args:e}){let t=await _c({accountType:e["account-type"]});y.exit(t)}});function wc(e){return{log(t,r){let a=o.level>=n.debug;if(t.level!==n.warn||a)for(let o of e)o.log(t,r)}}}let bc=!1;const kc="copilot-api-node20",vc=`https://registry.npmjs.org/${kc}/latest`,xc=e=>`[1m${e}[0m`,Tc=e=>`[33m${e}[0m`;async function Ac(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(vc,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function $c(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}let Sc,Ec;async function Oc(e){try{let[t,o]=await Promise.all([Kt(),Ac(e)]);return"unknown"!==t&&o&&function(e,t){let o=e.split(".").map(Number),n=t.split(".").map(Number),r=Math.max(o.length,n.length);for(let e=0;e<r;e++){let t=o[e]??0,r=n[e]??0;if(t<r)return!0;if(t>r)return!1}return!1}(t,o)?{current:t,latest:o}:null}catch{return null}}function Cc(){if(!Sc||!Ec)return;let{signal:e}=Ec;Sc.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${kc}@latest`,n=Tc("│"),r=` ${xc("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${xc(o)} to update`,i=" ".repeat(54),s=Tc(`╭${"─".repeat(54)}╮`),l=Tc(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${$c(r,54)}${n}`,`${n}${i}${n}`,`${n}${$c(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var Ic={posts:[{title:"I Almost Bought an AI Code Reviewer. Then I Did the Math.",teaser:"100+ repos. Every PR reviewed by AI. Under $1K a month.",url:"https://barazany.dev/blog/claude-code-pr-reviewer",date:"2026-06-09"},{title:"I Had Claude Mine 30 Days of My Own Messages. What It Found Was Uncomfortably Accurate.",teaser:"I had Claude read a month of my messages. It nailed me.",url:"https://barazany.dev/blog/mining-claude-history-ultracode",date:"2026-06-05"},{title:"The 5-Hour Quota, Boris's Tweet, and What the Source Code Actually Reveals",teaser:"Claude Code's caching story — decoded from the source.",url:"https://barazany.dev/blog/claude-code-token-caching",date:"2026-04-01"}]};const Rc=262144,Nc="https://barazany.dev",Pc=/^[a-z0-9][a-z0-9-]*$/i,qc=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function Dc(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(qc," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function jc(e){if("object"!=typeof e||!e)return null;let t=e,o=Dc(t.title,100),n=Dc(t.teaser??t.excerpt??t.description,120),r=function(e){if("string"!=typeof e||e.length>2048)return null;let t;try{t=new URL(e)}catch{return null}if(t.origin!==Nc||t.username||t.password)return null;let o=t.href;return/^[\x21-\x7E]+$/.test(o)?o:null}(t.url);if(null===r&&void 0===t.url&&"string"==typeof t.slug&&Pc.test(t.slug)&&(r=`${Nc}/blog/${t.slug}`),!o||!n||null===r)return null;let a=function(e){if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e))return Number.isFinite(Date.parse(e))?e.slice(0,10):void 0}(t.date);return a?{title:o,teaser:n,url:r,date:a}:{title:o,teaser:n,url:r}}function Mc(e){let t=e;if(!Array.isArray(e)&&"object"==typeof e&&e&&(t=e.posts),!Array.isArray(t))return[];let o=[];for(let e of t){let t=jc(e);t&&o.push(t)}let n=e=>e.date?Date.parse(e.date):-1/0;return o.sort((e,t)=>n(t)-n(e)).slice(0,3)}let Fc=null;function Hc(e){return s.join(e,"blog-posts.json")}function Uc(e=Z.APP_DIR){try{if(Fc&&Fc.length>0)return Fc;let t=function(e){try{let t=Hc(e);return K.statSync(t).size>Rc?[]:Mc(JSON.parse(K.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:Mc(Ic)}catch{return[]}}function Bc(e){return e>-6e4&&e<864e5}async function Lc(e){let t=new AbortController,o=setTimeout(()=>t.abort(),e);"object"==typeof o&&"unref"in o&&o.unref();try{let e=await fetch("https://barazany.dev/posts.json",{signal:t.signal,headers:{accept:"application/json"}});if(!e.ok)return await(e.body?.cancel().catch(()=>{})),[];let o=await async function(e,t){let o=Number(e.headers.get("content-length"));if(Number.isFinite(o)&&o>Rc)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>Rc?null:t}let n=e.body.getReader(),r=()=>{n.cancel().catch(()=>{})};t.addEventListener("abort",r,{once:!0});let a=[],i=0;try{for(;;){let{done:e,value:t}=await n.read();if(e)break;if(i+=t.byteLength,i>Rc)return await n.cancel().catch(()=>{}),null;a.push(t)}}finally{t.removeEventListener("abort",r)}return t.aborted?null:Buffer.concat(a).toString("utf8")}(e,t.signal);return null===o?[]:Mc(JSON.parse(o))}finally{clearTimeout(o)}}async function zc(e={}){try{if("1"===y.env.COPILOT_API_NO_BLOG||"1"===y.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??Z.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=Hc(e),n=await K.promises.stat(o);if(n.size<=Rc){let e=await K.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Bc(t-n.fetchedAt)}return Bc(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await Lc(e.timeoutMs??3e3);if(0===n.length)return;Fc=n,await async function(e,t,o){let n=Hc(e),r=`${n}.${y.pid}.tmp`;try{await K.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await K.promises.rename(r,n)}catch(e){throw await K.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function Gc(e){let t;try{({login:t}=await Kc(e))}catch(e){return void o.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await Nn(),o.info("Copilot fallback enabled for Foundry rate limits (429)")}catch(e){o.error("Copilot fallback disabled: could not load the Copilot model list; serving from Foundry only.",e)}return t}async function Kc(e){e._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 t,n=e._t2||process.env.GH_TOKEN;n?(function(e){se._t2=e,tr=!1}(n),o.info("Using provided Auth token")):await pr();try{t=await Io(),await wt(se,t.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}return await(async()=>{let{token:e,refresh_in:t}=await Co();se._t1=e,o.debug("Service token fetched successfully!"),se.showToken&&o.info("Service token:",e),er=!0,ur(t),mt.start(),Vn=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),lr(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},Xn=()=>{o.debug("Network connectivity lost")},mt.on("online",Vn),mt.on("offline",Xn)})(),t}function Jc(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=y;if("win32"===e){try{if(_(`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}function Wc(e,t){return{version:t.version,port:e.port,accountType:e.accountType,verbose:e.verbose,manualApprove:e.manual,rateLimitSeconds:e.rateLimit??0,rateLimitWait:e.rateLimitWait,timeoutMs:e.timeout,showToken:e.showToken,_cc1:e._cc1,model:e.model,smallModel:e.smallModel,_t3:t._t3,provider:e.provider,fallback:e.fallback,foundryAuth:t.foundryAuth}}const Yc=e=>`[1m${e}[0m`,Vc=e=>`[2m${e}[0m`,Xc=e=>`[36m${e}[0m`,Zc=e=>`[32m${e}[0m`,Qc=e=>`[33m${e}[0m`,eu=e=>`[4m${e}[0m`,tu=(e,t)=>`]8;;${e}\\${t}]8;;\\`,ou="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",nu="https://github.com/johnib/copilot-api-issues/issues",ru=Vc(" ─────────────────────────────────────────────────────────────");function au(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function iu(e){return e&&0!==e.length?e.join("·"):"—"}function su(e){if(0===e.length)return[];let t=["",ru,` ${Yc("BARAZANY.DEV")} ${Vc("— Recent Posts")}`,ru,""];for(let[o,n]of e.entries()){let e=`${n.url}${ou}`,r=tu(e,Yc(eu(`[${o+1}]`)));t.push(` ${r} ${Xc(n.title)}`,` ${Vc("→")} ${Vc(n.teaser)}`,"")}return t.push(ru,` ${tu(`https://barazany.dev/blog${ou}`,"barazany.dev/blog")}`,ru),t}function lu(e){let t=[];se.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):se.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearchProviders.length>0?`${e.webSearchProviders.map(e=>(e=>e&&e[0].toUpperCase()+e.slice(1))(e)).join(Vc(" → "))} ${Zc("✓")}`:Vc("off"),n=["",` ${Yc("COPILOT-API")} ${Vc(`v${e.version}`)}`,ru,` ${Vc("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${Vc("User")} ${e.user} ${Vc("·")} ${e.accountType}`];return se._v1&&n.push(` ${Vc("Client")} VSCode ${se._v1}`),n.push(` ${Vc("Network")} ${t.join(Vc(" · "))}`,` ${Vc("Search")} ${o}`),e.clipboardCopied&&n.push(` ${Vc("Clipboard")} Claude Code command ${Zc("✓")}`),n.push(ru),n}function cu(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${Yc("Active")}`];if(e.model){let o=se.models?.data.find(t=>t.id===e.model),n=au(o?.capabilities.limits?.max_context_window_tokens),r=iu(o?.capabilities.supports.reasoning_effort);t.push(` ${Xc(e.model.padEnd(32))} ${Vc("ctx")} ${Yc(n.padStart(5))} ${Vc("effort")} ${Vc(r)} ${Qc("← main")}`)}if(e.smallModel){let o=se.models?.data.find(t=>t.id===e.smallModel),n=au(o?.capabilities.limits?.max_context_window_tokens),r=iu(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${Vc("ctx")} ${n.padStart(5)} ${Vc("effort")} ${Vc(r)} ${Qc("← small")}`)}return t}function uu(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of se.models?.data??[]){let a=r.capabilities.limits?.max_context_window_tokens,i={id:r.id,ctx:a,effort:r.capabilities.supports.reasoning_effort};r.id.startsWith("text-embedding")?n.push(i):"Anthropic"===r.vendor?e.push(i):"Google"===r.vendor?o.push(i):t.push(i)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${Yc(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?Xc("●"):Vc("·"),i=n?Xc(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?au(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${iu(r.effort)}`;t.push(` ${a} ${i} ${Vc(s)}${Vc(l)}`)}}return t}function pu(){let e=nu.replace(/^https:\/\//,""),t=tu(`${nu}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",ru,` ${Yc("FOUND A BUG?")} ${Vc("— Report it on GitHub")}`,ru,"",` ${Xc("→")} ${Xc(t)}`,` ${Vc("Bug reports, feature requests, and questions welcome.")}`,"",ru]}function du(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=["",ru,` ${Yc("Claude Cowork")} ${Vc("— Settings → Inference Provider")}`,ru,"",` ${Vc("Paste into")} ${Yc("inferenceGatewayBaseUrl")}${Vc(":")}`,` ${Yc(Xc(r))}`];return n||a.push("",` ${Vc("Your Tailscale hostname is shown by:")} ${Xc("tailscale status --self")}`),a.push("",` ${Vc("Docs:")} ${Xc("https://claude.com/docs/cowork/3p/installation")}`),a}function mu(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",ru,` ${Yc("HTTPS")} ${Vc("— self-signed cert")}`,ru,"",` ${Vc("Cert")} ${t}`];switch(o.push("",` ${Yc("Trust this cert")} ${Vc("(one-time setup)")}`),y.platform){case"darwin":o.push(` ${Vc("macOS:")}`,` ${Xc("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${Xc(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${Vc("Windows (PowerShell as Administrator):")}`,` ${Xc(`Import-Certificate -FilePath "${t}" \``)}`,` ${Xc("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${Vc("Linux (Debian/Ubuntu):")}`,` ${Xc(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${Xc("sudo update-ca-certificates")}`,` ${Vc("Linux (Fedora/RHEL/Arch):")}`,` ${Xc(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${Xc("sudo update-ca-trust")}`);break;default:o.push(` ${Vc("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${Vc("Or, for Node CLIs only (no admin needed):")}`,` ${Xc(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,ru),o}function fu(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`}async function hu(e,t){let o=lt({config:t,startupStage:"upstream_auth"},"copilot_api"),n=Se.startSpan("copilot_api.server.startup_failed",{kind:u.INTERNAL,attributes:o}),r=function(e){let t=new Set,o=e;for(let e=0;e<=4;e++){if(!(o instanceof Error)||t.has(o))return;if(o instanceof ao)return o;t.add(o),o=uo(o)}}(e);r&&(n.setAttribute("http.response.status_code",r.response.status),n.setAttribute("url.full",r.response.url)),it(n,e),n.end();let a=e instanceof Error?e.message:String(e);at(w.ERROR,"ERROR","Server startup failed",{...o,"exception.message":Ht(r&&r!==e?`${a} (cause: ${r.message})`:a)}),await $e()}const gu=s.join(Z.APP_DIR,"certs"),_u=s.join(gu,"cert.pem"),yu=s.join(gu,"key.pem"),wu=s.join(gu,"cert.meta.json");async function bu(e){try{return await a.readFile(e,"utf8")}catch{return}}async function ku(e){let t=await bu(_u),o=await bu(yu),n=await async function(){let e=await bu(wu);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 vu(e){return 0!==Y(e)}async function xu(e){await a.mkdir(gu,{recursive:!0});let t=new Date,o=new Date;o.setDate(o.getDate()+825);let n=["127.0.0.1","::1"],r=new Set(["localhost"]),i=new Set(n);for(let t of e)vu(t)?i.add(t):r.add(t);let s=[...[...r].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))],l=await V([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:o,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:s}]});return await a.writeFile(_u,l.cert,{mode:420}),await a.writeFile(yu,l.private,{mode:384}),await async function(e){await a.writeFile(wu,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:_u,keyPath:yu,generated:!0}}const Tu=[],Au=Date.now();let $u="";function Su(){let e=async(e,t=0)=>{let n=Se.startSpan("copilot_api.server.shutdown",{kind:u.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-Au)/1e3}});for(let t of Tu)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=tu("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",ru,` ${Yc("COPILOT-API")} ${Vc(`v${e}`)} ${Vc("·")} ${fu(t)} uptime`,ru,""," Check in from time to time on",` ${Xc(o)}`,"",ru,""];console.log(n.join("\n"))}($u,Date.now()-Au),y.exit(t)};y.on("SIGINT",()=>e("SIGINT")),y.on("SIGTERM",()=>e("SIGTERM")),y.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),y.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}const Eu=e=>e.filter(e=>yn(e)).map(e=>e.id),Ou=e=>e.filter(e=>wn(e)).map(e=>e.id);async function Cu(e,t,n){if(!e._cc1)return!1;se.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."),y.exit(1));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,Eu(se.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Eu(se.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:Eu(se.models.data)}));let s=Jc({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 h.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function Iu(e){return e._t2?"cli_arg":y.env.GH_TOKEN?"env_var":"stored"}function Ru(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=Se.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:lt({config:Wc(t,{version:o,_t3:Iu(t),foundryAuth:se.foundry?.auth}),runtime:n,identity:{_u1:r.login,machineId:se.machineId,sessionId:se.sessionId,_v1:se._v1},connectivity:se.connectivity,modelsCount:se.models?.data.length??0,startupDurationMs:Date.now()-Au},"copilot_api")});if(se.models?.data)for(let e of se.models.data)a.addEvent("copilot_api.model.available",lt(e,"model"));a.end(),at(w.INFO,"INFO","Server started",lt({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:se.models?.data.length??0,startupDurationMs:Date.now()-Au},"copilot_api"))}async function Nu(e,t){try{return await async function(e){return"foundry"===e.provider?(se.foundry=Yo(process.env),se.connectivity.h2=!1,se.connectivity.h2Keepalive=!1,"entra"===se.foundry.auth&&await Uo(se.foundry),o.info(`Using Microsoft Foundry upstream: ${se.foundry.endpoint} (${"entra"===se.foundry.auth?"Entra ID":"API key"} auth)`),{login:("copilot"===e.fallback?await Gc(e):void 0)??"foundry"}):Kc(e)}(e)}catch(o){throw await hu(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:Iu(e)}),o}}async function Pu(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[o,n]=await Promise.all([a.readFile(e,"utf8"),a.readFile(t,"utf8")]);return{cert:o,key:n,certPath:e,keyPath:t,generated:!1}}(e.httpsCert,e.httpsKey);if(e.httpsCert||e.httpsKey)throw Error("Both --https-cert and --https-key must be provided together");return async function(e=[]){if(await ku(e)){let e=await bu(_u),t=await bu(yu);if(e&&t)return{cert:e,key:t,certPath:_u,keyPath:yu,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),xu(e)}(e.httpsHosts)}}async function qu(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=Kr;try{J(t),J(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(Su(),Tu.push(()=>{o.debug("Cleaning up connectivity monitor"),mt.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),er=!1,Wn&&=void clearInterval(Wn),Vn&&=void mt.off("online",Vn),Xn&&=void mt.off("offline",Xn),Yn=void 0,Zn=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),Fa&&=void clearInterval(Fa),Ha&&=void clearInterval(Ha);let e=[...Da.keys(),...ja];Da.clear(),ja.clear(),qa.clear(),Ma=void 0;for(let t of e)Ua(t)&&(Ke.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await $e()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");se.provider=t.provider,se.accountType=t.accountType,se.manualApprove=t.manual,se.rateLimitSeconds=t.rateLimit,se.rateLimitWait=t.rateLimitWait,se.showToken=t.showToken,se.timeoutMs=t.timeout,se.connectivity.timeoutMs=t.connectTimeout,se.webSearchProviders=t.webSearchProviders,se.errorReporting=function(e){let t=y.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===y.env.COPILOT_H2_KEEPALIVE||"true"===y.env.COPILOT_H2_KEEPALIVE,t=e||"1"===y.env.COPILOT_H2||"true"===y.env.COPILOT_H2;se.connectivity.h2=t,se.connectivity.h2Keepalive=e}(),await Q(),zc().catch(()=>{}),Kn();let n=await Kt();$u=n;let r=Jt();!function(e,t){t&&(xe=t),ve=crypto.randomUUID();let o=T({[O]:"copilot-api",[C]:e,[E]:ve}),{endpoint:n,headers:r}=Ae();ke=new S({resource:o,traceExporter:new x({url:`${n}/v1/traces`,headers:r}),metricReader:new $({exporter:new v({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new A({exporter:new k({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),ke.start()}(n,Au);let a=await Nu(t,n);await async function(){try{return await Gn({refreshFallback:!1}),!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})`,a="foundry"===se.provider?"Foundry":"Copilot";return o.warn(`Could not fetch model list from ${a}${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(()=>{Gn().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{Gn().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)}}();Tu.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),se.connectivity.h2&&(za(La(bt(se))),se.connectivity.h2Keepalive&&Ka()),Ru({options:t,version:n,runtime:r,_u1:a});let s=await Pu(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await Cu(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(se.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."),y.exit(1)),e.model){let t=Ou(se.models.data);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:Ou(se.models.data)});let a=Jc({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return h.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,c,s);(function(e){let t=[...lu(e),...cu(e),...uu(e),...pu(),"",...su(Uc()),...du(e),...mu(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:o,runtime:n,user:r,clipboardCopied:a,tls:i}=e,s=i?"https":"http";return{version:o,runtime:n,user:r,accountType:t.accountType,port:t.port,timeout:t.timeout,webSearchProviders:t.webSearchProviders.map(e=>e.name),model:t.model,smallModel:t.smallModel,clipboardCopied:a,https:i?{certPath:i.certPath,keyPath:i.keyPath,generated:i.generated,selfSigned:!t.httpsCert}:void 0,endpoints:t.claudeCowork?{scheme:s,port:t.port,hostname:await Pr()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),Cc(),W({fetch:oc.fetch,port:t.port,hostname:t.hostname,tls:s?{cert:s.cert,key:s.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(l,t.hostname,t.port),t.smokeTest&&"copilot"===t.provider&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await ac({model:t});if(r.ok){let t=void 0===n||["::1","127.0.0.1","localhost"].includes(n)?`Point your client at ${e}`:`Point your client at ${e} — you bound ${n}, so from another machine/container replace \`localhost\` with this host's reachable IP/hostname.`;return void o.success(`Self-test passed — generation works via ${r.model} (${r.durationMs}ms). ${t}`)}let a=r.status?` (HTTP ${r.status})`:"";o.warn(`Self-test FAILED${a}: ${r.reason??"unknown error"}`),r.detail&&o.info(` detail: ${na(r.detail)}`),o.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){o.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(c,t.smallModel??t.model,t.hostname)}function Du(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const ju=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT, plus FOUNDRY_API_KEY or an Entra ID login such as az login). Overrides COPILOT_API_PROVIDER.'},fallback:{type:"string",description:'With --provider foundry: "copilot" re-sends a Foundry-rate-limited (429) request to GitHub Copilot and keeps that model on Copilot until Foundry\'s retry-after passes. Overrides COPILOT_API_FALLBACK.'},port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},"error-reporting":{type:"boolean",default:!0,description:"Send anonymous, sanitized error reports to the maintainer to help fix bugs (no prompts, completions, or tokens). Use --no-error-reporting or COPILOT_API_ERROR_REPORTING=0 to disable."},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"[DEPRECATED — set the TAVILY_API_KEY env var instead] Tavily API key for web search."},"web-search-provider":{type:"string",description:'Web search failover order, e.g. "exa,tavily" (first = primary, rest = fallbacks). Web search turns on when TAVILY_API_KEY and/or EXA_API_KEY are set; this flag is optional and only orders the providers you configured.'},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"},"smoke-test":{type:"boolean",default:!0,description:"After startup, run one tiny self-test generation to verify the proxy works end-to-end and print a clear PASS/FAIL. Disable with --no-smoke-test (or COPILOT_API_NO_SMOKE_TEST=1)."}},run({args:e}){let t=e["rate-limit"],n=void 0===t?void 0:Du(t,"--rate-limit"),r=e.timeout,a=void 0===r?ie:Du(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:Du(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],y.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??y.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!bl(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${wl.join(", ")}`);let r=n.length>0?n:wl,a=new Set,i=n.length>0,s=[];for(let e of r){if(!bl(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||y.env.TAVILY_API_KEY,exaApiKey:y.env.EXA_API_KEY,order:u}),d=(y.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d,f=function(e,t){let o=(e??t??"copilot").trim().toLowerCase();if("copilot"===o||"foundry"===o)return o;throw Error(`--provider must be "copilot" or "foundry", got: "${o}"`)}(e.provider,y.env.COPILOT_API_PROVIDER);return qu({provider:f,fallback:Rn(e.fallback,y.env.COPILOT_API_FALLBACK,f),port:Du(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:n,rateLimitWait:e.wait,_t2:e["github-token"],_cc1:e["claude-code"],codex:e.codex,model:e.model,smallModel:e["small-model"],showToken:e["show-token"],timeout:a,connectTimeout:i,webSearchProviders:p,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!m})}});bc||(bc=!0,o.setReporters([wc(o.options.reporters)]));const Mu=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(Sc||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;Ec=e,Sc=Oc(e).catch(()=>null)})(),Mu||Cc();const Fu=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:fr,start:ju,"check-usage":Or,debug:Vt,doctor:yc,"cowork-setup":ta}});await t(Fu),Mu||(Ec?.abort(),Ec=void 0,Sc=void 0);export{};
|
|
2
|
+
import{defineCommand as e,runMain as t}from"citty";import o,{LogLevels as n,consola as r}from"consola";import a from"node:fs/promises";import i from"node:os";import s from"node:path";import{AsyncLocalStorage as l}from"node:async_hooks";import{ROOT_CONTEXT as c,SpanKind as u,SpanStatusCode as p,context as d,metrics as m,trace as f}from"@opentelemetry/api";import h from"clipboardy";import{execFile as g,execSync as _}from"node:child_process";import y from"node:process";import{SeverityNumber as w,logs as b}from"@opentelemetry/api-logs";import{OTLPLogExporter as k}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as v}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as x}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as T}from"@opentelemetry/resources";import{BatchLogRecordProcessor as A}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as $}from"@opentelemetry/sdk-metrics";import{NodeSDK as S}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_INSTANCE_ID as E,ATTR_SERVICE_NAME as O,ATTR_SERVICE_VERSION as C}from"@opentelemetry/semantic-conventions";import{Client as I,request as R}from"undici";import{createHash as N,randomBytes as P,randomUUID as q}from"node:crypto";import{promisify as D,stripVTControlCharacters as j}from"node:util";import{Hono as M}from"hono";import{cors as F}from"hono/cors";import{getHeapStatistics as H}from"node:v8";import{streamSSE as U}from"hono/streaming";import{events as B}from"fetch-event-stream";import{Tokenizer as L,models as z}from"ai-tokenizer";import*as G from"ai-tokenizer/encoding/claude";import K,{accessSync as J}from"node:fs";import{serve as W}from"srvx";import{isIP as Y}from"node:net";import{generate as V}from"selfsigned";const X=s.join(i.homedir(),".local","share","copilot-api"),Z={APP_DIR:X,GITHUB_TOKEN_PATH:s.join(X,"github_token"),MACHINE_ID_PATH:s.join(X,"machine_id"),SESSION_ID_PATH:s.join(X,"session_id")};async function Q(){await a.mkdir(Z.APP_DIR,{recursive:!0}),await ee(Z.GITHUB_TOKEN_PATH),await ee(Z.SESSION_ID_PATH)}async function ee(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,""),await a.chmod(e,384)}}const te=new l;function oe(e,t){return te.run(e,t)}const ne=()=>!0===te.getStore()?.rerun,re=new l;const ae=()=>void 0!==re.getStore();function ie(){let e=re.getStore();e&&(e.start??=performance.now(),e.onSend?.())}const se=6e5,le={provider:"copilot",accountType:"individual",manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:se,webSearchProviders:[],errorReporting:!0,connectivity:{probeEndpoints:["https://api.github.com","https://www.google.com","https://1.1.1.1"],fastProbeInterval:5e3,slowProbeInterval:1e4,timeoutMs:15e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}};function ce(e){let[t="",o=""]=e.trim().split(/\s+/,2),n=o&&"undefined"!==o&&"null"!==o?/^(?:ghu|gho|ghp|ghs|ghr|github_pat)_/.exec(o)?.[0]??"opaque":"missing";return`${t.toLowerCase()} ${n}`}!function(e){let t=e.provider,o=e.models;Object.defineProperties(e,{provider:{get:()=>te.getStore()?.provider??t,set:e=>{t=e},enumerable:!0,configurable:!0},models:{get:()=>{let e=te.getStore();return e?e.models:o},set:e=>{o=e},enumerable:!0,configurable:!0}})}(le);const ue=" │ ",pe=e=>{if(e>=1e6){let t=e/1e6;return Number.isInteger(t)?`${t}M`:`${t.toFixed(1)}M`}return e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString()},de=(e,t)=>e.padEnd(t),me=e=>`${(e/1e3).toFixed(1)}s`.padStart(6),fe=(e,t,o)=>` --\x3e ${de(e,4)} ${de(t,21)} ${de(o,3)}`,he=e=>{let t=(e.reasoningEffort??"-")+(e.effortClamped?"*":"");return(e=>{let t=e.length>21?`${e.slice(0,20)}…`:e;return de(t,22)})(e.model??"—")+de(t,8)},ge=e=>{let t=e?.inputTokens??0,o=e?.cachedTokens??0,n=e?pe(Math.max(t-o,0)):"—",r=e?pe(e.outputTokens??0):"—",a=o?pe(o):"—";return`↑${n.padStart(5)} ⚡${a.padStart(5)} ↓${r.padStart(5)}`},_e=(e,t)=>{if(!e?.inputTokens||!t)return`ctx ${de("—",10)}`;let o=Math.round(e.inputTokens/t*100),n=pe(e.inputTokens).padStart(5),r=`${o}%`;return`ctx ${n}${r.padStart(Math.max(10-n.length,r.length+1))}`},ye=e=>{if(void 0===e.ttfbMs)return`e2e ${me(e.e2eMs)}`;let t=`(+${((e.e2eMs-e.ttfbMs)/1e3).toFixed(1)}s)`.padStart(8);return`ttfb ${me(e.ttfbMs)} → e2e ${me(e.e2eMs)} ${t}`},we=e=>e?le.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_context_window_tokens:void 0,be=e=>({...e?.inputTokens&&{"copilot_api.input_tokens":e.inputTokens},...e?.inputTokens&&{"copilot_api.fresh_input_tokens":Math.max(e.inputTokens-(e.cachedTokens??0),0)},...e?.outputTokens&&{"copilot_api.output_tokens":e.outputTokens},...e?.cachedTokens&&{"copilot_api.cached_tokens":e.cachedTokens}}),ke={completionCallbacks:new Map,registerCompletion(e,t,o){this.completionCallbacks.set(e,{context:t,startTime:o,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(e){let{context:t,startTime:n}=e,r=Math.round(performance.now()-n),a=t.get("requestData"),i=a?.upstreamTotalMs??a?._d1,s=(e=>[fe(e.method,e.path,e.status),he(e),ge(e.tokenUsage),_e(e.tokenUsage,e.maxContextTokens),ye({ttfbMs:e.ttfbMs,e2eMs:e.e2eMs})].join(ue))({method:t.req.method,path:t.req.path,status:t.res.status.toString(),model:a?.model,reasoningEffort:a?.reasoningEffort,effortClamped:a?.effortClamped,tokenUsage:a?.tokenUsage,maxContextTokens:we(a?.model),ttfbMs:a?.upstreamTtfbMs,e2eMs:r});o.info(s),it(w.INFO,"INFO","Request completed",(e=>{let{c:t,requestData:o,duration:n,upstreamTotal:r}=e;return{"http.method":t.req.method,"http.path":t.req.path,"http.status_code":t.res.status,"copilot_api.duration_ms":n,...o?.model&&{"copilot_api.model":o.model},...o?.reasoningEffort&&{"copilot_api.reasoning_effort":o.reasoningEffort},...o?.effortClamped&&{"copilot_api.effort_clamped":!0},...void 0!==o?.upstreamTtfbMs&&{"copilot_api.upstream_ttfb_ms":Math.round(o.upstreamTtfbMs)},...void 0!==r&&{"copilot_api.upstream_total_ms":Math.round(r),"copilot_api.copilot_duration_ms":Math.round(r)},...be(o?.tokenUsage)}})({c:t,requestData:a,duration:r,upstreamTotal:i}),t.get("requestTraceContext"))},logRateLimit(e,t){let{context:n,startTime:r}=e,a=Math.round(performance.now()-r),i=(t.headers.get("x-ratelimit-exceeded")||"").split(":")[1]||"unknown",s=t.headers.get("retry-after")||t.headers.get("x-ratelimit-user-retry-after")||"?",l=n.get("requestData");o.error((e=>[fe(e.method,e.path,"429"),he(e),`rate-limited retry ${e.retry}s (${e.rateLimitType})`.padEnd(37),`e2e ${me(e.e2eMs)}`].join(ue))({method:n.req.method,path:n.req.path,model:l?.model,reasoningEffort:l?.reasoningEffort,effortClamped:l?.effortClamped,retry:s,rateLimitType:i,e2eMs:a}))},logError(e,t,n){let{context:r,startTime:a}=e,i=Math.round(performance.now()-a),s=r.get("requestData");o.error((e=>{let t=fe(e.method,e.path,e.status.toString()),o=he(e),n=e.message.replaceAll(/\s+/g," ").trim();return[t,o,(n.length>37?`${n.slice(0,36)}…`:n).padEnd(37),`e2e ${me(e.e2eMs)}`].join(ue)})({method:r.req.method,path:r.req.path,status:t,model:s?.model,reasoningEffort:s?.reasoningEffort,effortClamped:s?.effortClamped,message:n,e2eMs:i}))},cleanup(){let e=performance.now()-12e5;for(let[t,o]of this.completionCallbacks)o.startTime<e&&this.completionCallbacks.delete(t);if(this.completionCallbacks.size>1e3){let e=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),t=e.slice(0,e.length-1e3);for(let[e]of t)this.completionCallbacks.delete(e)}}};setInterval(()=>ke.cleanup(),6e4);let ve,xe,Te=Date.now();const Ae={"x-honeycomb-team":"hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n"};function $e(){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):Ae;return{endpoint:e.replace(/\/$/,""),headers:t}}async function Se(){if(!ve)return;let e=5e3,t=new Promise(e=>{setTimeout(()=>e("timeout"),5e3).unref()});try{"timeout"===await Promise.race([ve.shutdown(),t])&&o.warn("OTel SDK shutdown timed out after 5000ms; continuing exit")}catch(e){o.warn("OTel SDK shutdown failed; continuing exit",e)}}const Ee=f.getTracer("copilot-api"),Oe=m.getMeter("copilot-api"),Ce=b.getLogger("copilot-api"),Ie=Oe.createCounter("copilot_api.requests.total",{unit:"{request}",description:"Total requests received"}),Re=Oe.createCounter("copilot_api.requests.errors",{unit:"{error}",description:"Total error responses"}),Ne=Oe.createCounter("copilot_api.tokens.input",{unit:"{token}",description:"Total input tokens consumed"}),Pe=Oe.createCounter("copilot_api.tokens.output",{unit:"{token}",description:"Total output tokens generated"}),qe=Oe.createCounter("copilot_api.tokens.cached",{unit:"{token}",description:"Total cached prompt tokens"}),De=Oe.createCounter("copilot_api.rate_limit.triggers",{unit:"{trigger}",description:"Rate limit trigger count"}),je=Oe.createCounter("copilot_api.model_validation.errors",{unit:"{error}",description:"Model validation failures"}),Me=Oe.createCounter("copilot_api.model_mapping.mappings",{unit:"{mapping}",description:"Model name normalizations"}),Fe=Oe.createCounter("copilot_api.token_refresh.attempts",{unit:"{attempt}",description:"Token refresh attempts"}),He=Oe.createCounter("copilot_api.token_refresh.failures",{unit:"{failure}",description:"Token refresh final failures"}),Ue=Oe.createCounter("copilot_api.connectivity.checks",{unit:"{check}",description:"Connectivity probe results"}),Be=Oe.createCounter("copilot_api.connectivity.transitions",{unit:"{transition}",description:"Connectivity state transitions"}),Le=Oe.createCounter("copilot_api.upstream.requests",{unit:"{request}",description:"Upstream API calls"}),ze=Oe.createCounter("copilot_api.stream.chunks",{unit:"{chunk}",description:"Total SSE chunks sent"}),Ge=Oe.createCounter("copilot_api.approval.decisions",{unit:"{decision}",description:"Manual approval decisions"}),Ke=Oe.createCounter("copilot_api.h2_keepalive.pings",{unit:"{ping}",description:"HTTP/2 keepalive pings sent"}),Je=Oe.createCounter("copilot_api.h2.connections",{unit:"{connection}",description:"HTTP/2 connection lifecycle events"}),We=Oe.createCounter("copilot_api.error_capture.decisions",{unit:"{decision}",description:"Per-process daily limiter outcomes (full|suppressed|drop)"}),Ye=Oe.createHistogram("copilot_api.request.duration",{unit:"ms",description:"Total request duration"}),Ve=Oe.createHistogram("copilot_api.copilot.duration",{unit:"ms",description:"Upstream Copilot API call duration"}),Xe=Oe.createHistogram("copilot_api.stream.duration",{unit:"ms",description:"Duration of SSE streaming phase"}),Ze=Oe.createHistogram("copilot_api.rate_limit.wait_duration",{unit:"ms",description:"Duration of rate limit waits"}),Qe=Oe.createHistogram("copilot_api.translation.duration",{unit:"ms",description:"Translation layer processing time"}),et=Oe.createHistogram("copilot_api.token_refresh.duration",{unit:"ms",description:"Token refresh duration"}),tt=Oe.createHistogram("copilot_api.connectivity.probe_duration",{unit:"ms",description:"Individual connectivity probe duration"}),ot=Oe.createHistogram("copilot_api.tokens.per_request.input",{unit:"{token}",description:"Input tokens per request distribution"}),nt=Oe.createHistogram("copilot_api.tokens.per_request.output",{unit:"{token}",description:"Output tokens per request distribution"}),rt=Oe.createHistogram("copilot_api.stream.chunks_per_request",{unit:"{chunk}",description:"Chunks per streaming request"}),at=Oe.createHistogram("copilot_api.approval.wait_duration",{unit:"ms",description:"Time waiting for manual approval"});function it(e,t,o,n,r){let a=f.getActiveSpan()?.spanContext()??r;Ce.emit({severityNumber:e,severityText:t,body:o,attributes:{...n,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function st(e,t,o){let n=t instanceof Error?t:Error(String(t));e.setStatus({code:p.ERROR,message:o??n.message}),e.recordException(n)}function lt(e,t,o){st(e,o),t&&t!==e&&st(t,o)}function ct(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,ct(r,e)))}return o}Oe.createObservableGauge("copilot_api.connectivity.status",{unit:"{status}",description:"1 = online, 0 = offline"}).addCallback(e=>{e.observe(+!!ft.getConnectivityStats().isOnline)}),Oe.createObservableGauge("copilot_api.connectivity.consecutive_failures",{unit:"{failure}",description:"Current consecutive connectivity failure count"}).addCallback(e=>{e.observe(ft.getConnectivityStats().consecutiveFailures)}),Oe.createObservableGauge("copilot_api.models.available",{unit:"{model}",description:"Number of available models"}).addCallback(e=>{e.observe(le.models?.data.length??0)}),Oe.createObservableGauge("copilot_api.completion_logger.pending",{unit:"{callback}",description:"Number of pending completion callbacks"}).addCallback(e=>{e.observe(ke.completionCallbacks.size)}),Oe.createObservableGauge("copilot_api.uptime",{unit:"s",description:"Server uptime in seconds"}).addCallback(e=>{e.observe((Date.now()-Te)/1e3)});const ut=new Set(["authorization","cookie","set-cookie","x-honeycomb-team","x-api-key","api-key","proxy-authorization"]);function pt(e,t,o){for(let[n,r]of Object.entries(o)){let o=n.toLowerCase();"authorization"===o&&e.setAttribute(`http.${t}.header.authorization.shape`,ce(r)),!ut.has(o)&&e.setAttribute(`http.${t}.header.${o}`,r)}}async function dt(e){let{spanName:t,url:o,target:n,method:r="GET",headers:a,body:i,signal:s,extraAttributes:l}=e,c=Ee.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,...l}});a&&pt(c,"request",a);try{let e=await fetch(o,{method:r,headers:a,body:i,signal:s});return c.setAttribute("http.response.status_code",e.status),function(e,t){t.headers.forEach((t,o)=>{let n=o.toLowerCase();ut.has(n)||e.setAttribute(`http.response.header.${n}`,t)})}(c,e),Le.add(1,{target:n,status_code:String(e.status)}),e.ok||c.setStatus({code:p.ERROR,message:`HTTP ${e.status}`}),{response:e,span:c}}catch(e){throw st(c,e),c.end(),e}}async function mt(e){let{spanName:t,url:o,target:n,method:r="POST",headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,extraAttributes:d,dispatcher:m}=e,f=Ee.startSpan(t,{kind:u.CLIENT,attributes:{"http.method":r,"url.full":o,"copilot_api.target":n,"copilot_api.h2.enabled":void 0!==m,...d}});pt(f,"request",a);try{let{statusCode:e,headers:t,body:u}=await R(o,{method:r,headers:a,body:i,signal:s,headersTimeout:l,bodyTimeout:c,dispatcher:m});f.setAttribute("http.response.status_code",e);for(let[e,o]of Object.entries(t)){let t=e.toLowerCase();void 0!==o&&!ut.has(t)&&f.setAttribute(`http.response.header.${t}`,Array.isArray(o)?o.join(", "):o)}return Le.add(1,{target:n,status_code:String(e)}),e>=400&&f.setStatus({code:p.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:u,span:f}}catch(e){throw st(f,e),f.end(),e}}const ft=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:le.connectivity.probeEndpoints,fastInterval:le.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?le.connectivity.slowProbeInterval:le.connectivity.fastProbeInterval)+Math.random()*le.connectivity.jitterMaxMs;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{o.error("Connectivity check failed:",e)})},e)}async performConnectivityCheck(){let e=Ee.startSpan("copilot_api.connectivity.probe");this.abortController=new AbortController;let t=setTimeout(()=>this.abortController?.abort(),le.connectivity.timeoutMs);try{let n=!1;for(let e of le.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",...le.connectivity.dnsCache&&{"Cache-Control":"max-age=300"}}}),r=performance.now()-t;if(o.ok){n=!0,this.lastSuccessfulEndpoint=e,tt.record(r,{endpoint:e,result:"success"});break}tt.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),Ue.add(1,{result:n?"online":"offline"})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(t),e.end(),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=(new Date).toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&o.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent("online")),Be.add(1,{from:"offline",to:"online"}),it(w.INFO,"INFO","Connectivity restored",{"copilot_api.connectivity.consecutive_failures_before_recovery":e}))}else this.consecutiveFailures++,t&&(o.warn("Connectivity lost"),this.dispatchEvent(new CustomEvent("offline")),Be.add(1,{from:"online",to:"offline"}),it(w.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?le.connectivity.slowProbeInterval:le.connectivity.fastProbeInterval;return{currentInterval:e,nextCheckEstimate:new Date(Date.now()+e+Math.random()*le.connectivity.jitterMaxMs).toISOString(),lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:le.connectivity.jitterMaxMs>0,connectionPooling:le.connectivity.connectionPooling,dnsCache:le.connectivity.dnsCache}}},ht=()=>({"content-type":"application/json",accept:"application/json"}),gt="0.48.1",_t=`copilot-chat/${gt}`,yt=`GitHubCopilotChat/${gt}`,wt=async e=>{let t=(e=>{let t=e.replaceAll(/[^\w.-]/g,"_").trim();if(0===t.length||"."===t||".."===t||/^[_.]+$/.test(t))throw Error("Invalid GitHub username: cannot be empty or consist only of special characters after sanitization");return`${Z.MACHINE_ID_PATH}_${t}`})(e);try{let e=await a.readFile(t,"utf8");if(e.trim())return e.trim()}catch{}let o=(e=>{let t=N("sha256");return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||"anonymous"),t.update(i.hostname()),t.update(e),t.update(Date.now().toString()),t.update(P(16)),t.digest("hex")})(e);return await a.writeFile(t,o),await a.chmod(t,384),o},bt=async(e,t)=>{e.machineId||=await wt(t),e.sessionId||=await(async()=>{try{let e=await a.readFile(Z.SESSION_ID_PATH,"utf8");if(e.trim())return e.trim()}catch{}let e=q();return await a.writeFile(Z.SESSION_ID_PATH,e),await a.chmod(Z.SESSION_ID_PATH,384),e})()},kt=e=>"individual"===e.accountType?"https://api.githubcopilot.com":`https://api.${e.accountType}.githubcopilot.com`,vt=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error("VSCode identifiers not initialized. Call initializeVSCodeIdentifiers() during startup.");let o=q(),n={Authorization:`Bearer ${e._t1}`,"Content-Type":"application/json",accept:"*/*","accept-encoding":"br, gzip, deflate","accept-language":"*","sec-fetch-mode":"cors","Copilot-Integration-Id":"vscode-chat","Editor-Version":`vscode/${e._v1}`,"Editor-Plugin-Version":_t,"User-Agent":yt,"VScode-MachineId":e.machineId,"VScode-SessionId":e.sessionId,"OpenAI-Intent":"conversation-agent","X-Interaction-Type":"conversation-agent","X-Agent-Task-Id":o,"X-VSCode-User-Agent-Library-Version":"node-fetch","X-GitHub-Api-Version":"2025-05-01","X-Interaction-Id":q(),"X-Request-Id":o};return t&&(n["copilot-vision-request"]="true"),n},xt=["interleaved-thinking","context-management","advanced-tool-use","redact-thinking"];const Tt=(e,t,o)=>{let n=vt(e);delete n["Copilot-Integration-Id"],n["anthropic-version"]=t?.anthropicVersion??"2023-06-01";let r=new Set,a=t?.anthropicBeta?function(e){let t=e.split(",").map(e=>e.trim()).filter(e=>e&&xt.some(t=>e.startsWith(`${t}-`)));return t.length>0?t.join(","):void 0}(t.anthropicBeta):void 0;if(a)for(let e of a.split(","))r.add(e);if(o)for(let e of o)r.add(e);return r.size>0&&(n["anthropic-beta"]=[...r].join(",")),n},At="https://api.github.com",$t=e=>({"content-type":"application/json",accept:"application/json",authorization:`token ${e._t2}`,"editor-version":`vscode/${e._v1}`,"editor-plugin-version":_t,"user-agent":yt,"x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"node-fetch"}),St="https://github.com",Et="01ab8ac9400c4e429b23",Ot=["user:email"].join(" "),Ct=new WeakMap;function It(e){let t=e.req.raw,o=Ct.get(t);if(!o){let e=new AbortController;t.signal.aborted?e.abort(t.signal.reason):t.signal.addEventListener("abort",()=>e.abort(t.signal.reason),{once:!0}),Ct.set(t,e),o=e}return o}const Rt=e=>It(e).signal;function Nt(e){It(e).abort()}function Pt(e){return!!It(e).signal.aborted&&(e.get("requestSpan")?.setAttribute("copilot_api.client_aborted",!0),!0)}function qt(e){return e.includes("/messages")?"anthropic":e.includes("/chat/completions")?"openai":e.includes("/embeddings")?"embeddings":e.includes("/responses")?"responses":e.includes("/models")?"models":e.includes("/usage")?"usage":e.includes("/token")?"token":"unknown"}const Dt=32768,jt=[{regex:/Bearer\s+[\w.-]{20,}/g,mask:"Bearer ***"},{regex:/\bghu_[A-Za-z0-9]{20,}/g,mask:"ghu_***"},{regex:/\bghp_[A-Za-z0-9]{20,}/g,mask:"ghp_***"},{regex:/\bgho_[A-Za-z0-9]{20,}/g,mask:"gho_***"},{regex:/\bghs_[A-Za-z0-9]{20,}/g,mask:"ghs_***"},{regex:/\bghr_[A-Za-z0-9]{20,}/g,mask:"ghr_***"},{regex:/\bsk-[A-Za-z0-9-]{20,}/g,mask:"sk-***"},{regex:/\bhcaik_[A-Za-z0-9]{20,}/g,mask:"hcaik_***"},{regex:/\bapi-key[\x22\x27]?\s*[:=]\s*[\x22\x27]?[\w-]{20,}/gi,mask:"api-key: ***"}],Mt=new Set(["authorization","cookie","set-cookie","x-api-key","api-key","proxy-authorization"]);function Ft(e){let t=e;for(let{regex:e,mask:o}of jt)t=t.replace(e,o);return t}const Ht=/[\w.%+#!$&*=?^~\x27-]+@[\w-]+(?:\.[\w-]+)+/g;function Ut(e){return Ft(e).replaceAll(Ht,"<redacted-email>")}const Bt=new Map;function Lt(e){let t=function(e=new Date){return e.toISOString().slice(0,10)}(e.now),o=e.upstreamErrorType??"unknown",n=(e.model??"unknown").slice(0,100);return`${e.endpointType}:${e.statusCode}:${o}:${n}:${t}`}function zt(e,t,o){let n=Ft(o),r=8*Dt,a=n.length>r,i=a?n.slice(0,r):n,s=N("sha256").update(n).digest("hex");if(i.length<=Dt)e.setAttribute(t,i),e.setAttribute(`${t}.parts`,1);else{for(let o=0;o<i.length;o+=Dt)e.setAttribute(`${t}.part_${o/Dt}`,i.slice(o,o+Dt));e.setAttribute(`${t}.parts`,Math.ceil(i.length/Dt))}e.setAttribute(`${t}.bytes`,n.length),e.setAttribute(`${t}.sha256`,s),a&&(e.setAttribute(`${t}.truncated`,!0),e.setAttribute(`${t}.dropped_bytes`,n.length-i.length))}function Gt(e,t){let o=function(e){if(Bt.size>=1e3&&!Bt.has(e)){let e=Bt.keys().next().value;void 0!==e&&Bt.delete(e)}let t,o=(Bt.get(e)??0)+1;return Bt.set(e,o),t=o<=2?"full":3===o?"suppressed":"drop",We.add(1,{decision:t}),t}(t.signatureKey);if(e.setAttribute("copilot_api.error_capture.decision",o),e.setAttribute("copilot_api.error_capture.signature_key",t.signatureKey),"drop"===o)return{decision:o};if("suppressed"===o)return e.setAttribute("copilot_api.error_capture.suppressed_today",!0),{decision:o};let n=t.c.get("rawBody");n&&zt(e,"copilot_api.incoming_request_body",n);let r=Kt(t.c.req.header());return r&&zt(e,"copilot_api.incoming_headers",r),void 0!==t.outgoingBody&&zt(e,"copilot_api.outgoing_request_body",t.outgoingBody),void 0!==t.outgoingHeaders&&zt(e,"copilot_api.outgoing_headers",Kt(t.outgoingHeaders)),void 0!==t.upstreamResponseBody&&zt(e,"copilot_api.upstream_response_body",t.upstreamResponseBody),{decision:o}}function Kt(e){let t={};for(let[o,n]of Object.entries(e))Mt.has(o.toLowerCase())||(t[o]=n);return JSON.stringify(t)}async function Jt(){try{let e=new URL("../package.json",import.meta.url).pathname,t=await a.readFile(e);return JSON.parse(t.toString()).version}catch{return"unknown"}}function Wt(){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 Yt(){try{return!!(await a.stat(Z.GITHUB_TOKEN_PATH)).isFile()&&(await a.readFile(Z.GITHUB_TOKEN_PATH,"utf8")).trim().length>0}catch{return!1}}async function Vt(e){let t=await async function(){let[e,t]=await Promise.all([Jt(),Yt()]);return{version:e,runtime:Wt(),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 Xt=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})=>Vt({json:e.json})}),Zt=process.env.COPILOT_API_REPORT_ENDPOINT??"https://copilot-api.barazany.dev/report",Qt=process.env.COPILOT_API_REPORT_KEY??"cai_60fc3498226c9121cbf0da949ab207cddd93e2d74faabbbb",eo=new Set;let to;function oo(e){if(le.errorReporting&&!(e.statusCode<500)&&!eo.has(e.signature)){if(eo.size>=1e3){let e=eo.values().next().value;void 0!==e&&eo.delete(e)}eo.add(e.signature),async function(e){to??=Jt();let t=await to,o=Wt(),n=void 0===e.upstreamErrorMessage?void 0:function(e){return e.replaceAll(/(\/(?:home|Users)\/|\\Users\\)[^/\\\s]+/g,(e,t)=>`${t}***`)}(Ut(e.upstreamErrorMessage)).slice(0,600),r={proxyVersion:t,signature:e.signature,errorClass:e.errorClass,statusCode:e.statusCode,upstreamErrorType:e.upstreamErrorType,upstreamErrorMessage:n,endpointType:qt(e.route),route:e.route,model:e.model?.slice(0,100),platform:`${o.platform}/${o.arch}`,runtime:`${o.name}/${o.version}`,timestamp:(new Date).toISOString()},a=new AbortController,i=setTimeout(()=>a.abort(),4e3);try{await fetch(Zt,{method:"POST",headers:{"content-type":"application/json","x-ingest-key":Qt},body:JSON.stringify(r),signal:a.signal})}finally{clearTimeout(i)}}(e).catch(e=>{o.debug("Error report submission failed:",e)})}}function no(e){return function(e){if(!(e instanceof Error))return!1;let t=e.code;return(!t||"UND_ERR_SOCKET"===t)&&/GOAWAY/i.test(e.message)}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"ECONNRESET"===t||(!t||"UND_ERR_SOCKET"===t)&&(/ECONNRESET/i.test(e.message)||/other side closed/i.test(e.message))}(e)||function(e){if(!(e instanceof Error))return!1;let t=e.code;return"UND_ERR_DESTROYED"===t||"UND_ERR_CLOSED"===t}(e)||function(e){return e instanceof Error&&"UND_ERR_CONNECT_TIMEOUT"===e.code}(e)}const ro=new WeakSet;async function ao(e,{attempt:t,maxRetries:n,operation:r}){return!ae()&&(no(e)&&t<n?(o.warn(`HTTP/2 connection error during ${r}, retrying (attempt ${t+1}): ${e instanceof Error?e.message:String(e)}`),await async function(){return new Promise(e=>setTimeout(e,100))}(),!0):(t>0&&function(e){"object"==typeof e&&e&&ro.add(e)}(e),!1))}var io=class extends Error{response;outgoingBody;outgoingHeaders;constructor(e,t,o){super(e),this.response=t,this.outgoingBody=o?.outgoingBody,this.outgoingHeaders=o?.outgoingHeaders}},so=class extends Error{name="RequestTimeoutError";constructor(e){super(`Upstream request timed out after ${e}ms`)}};function lo(e,t){return setTimeout(()=>e.abort(new so(t)),t)}function co(e){return e instanceof so||e instanceof Error&&"AbortError"===e.name&&e.cause instanceof so}const uo=new Set(["UND_ERR_CONNECT_TIMEOUT","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EADDRNOTAVAIL","EHOSTUNREACH","ENETUNREACH","ENETDOWN","EHOSTDOWN","EPIPE","ECONNRESET","ECONNABORTED"]),po=RegExp(`\\b(?:${[...uo].join("|")})\\b`);function mo(e){let{cause:t,errors:o}=e;return t instanceof Error?t:Array.isArray(o)&&o[0]instanceof Error?o[0]:void 0}function fo(e){let t=e,o=new Set([t]);for(let e=0;e<4;e++){let e=mo(t);if(!e||o.has(e))break;o.add(e),t=e}return t}function ho(e){let t=e.code;return"string"==typeof t?t:void 0}function go(e){if(void 0===e.cause)return"";let t=fo(e);if(t===e)return"";let o=ho(t);return` (cause: ${o?`${o}: `:""}${t.message})`}function _o(e){if(!(e instanceof Error))return!1;let{codes:t,messages:o}=function(e){let t=[],o=[],n=new Set,r=(e,a)=>{if(a>4||!(e instanceof Error)||n.has(e))return;n.add(e);let{code:i,errors:s,cause:l}=e;if("string"==typeof i&&t.push(i),o.push(e.message),Array.isArray(s))for(let e of s)r(e,a+1);r(l,a+1)};return r(e,0),{codes:t,messages:o}}(e);return!!t.some(e=>uo.has(e))||!(t.length>0)&&(!!o.some(e=>po.test(e))||e instanceof TypeError&&"fetch failed"===e.message)}function yo(e){return e.req.path.startsWith("/v1/messages")}function wo(e,t){if(yo(t)){try{let t=JSON.parse(e);if("message"in t&&"string"==typeof t.message&&!("error"in t))return{type:"error",error:{type:"invalid_request_error",message:t.message}};if("error"in t&&"object"==typeof t.error){let e=t.error;return{type:"error",error:{type:"string"==typeof e.type&&e.type||"string"==typeof e.code&&e.code||"api_error",message:"string"==typeof e.message&&e.message||"Unknown error"}}}}catch{}return{type:"error",error:{type:"api_error",message:e}}}try{return JSON.parse(e)}catch{return{error:{message:e,type:"error"}}}}const bo=/maximum context length|exceeds the context window/i;function ko(e){let t=e.error,o={};return t&&"object"==typeof t&&("string"==typeof t.type?o.type=t.type:"string"==typeof t.code&&(o.type=t.code),"string"==typeof t.message&&(o.message=t.message)),!o.message&&"string"==typeof e.message&&(o.message=e.message),o}function vo(e,t){e&&(t.type&&e.setAttribute("copilot_api.upstream.error_type",t.type),t.message&&e.setAttribute("copilot_api.upstream.error_message",Ut(t.message)))}function xo(e){let t={};return e.type&&(t["copilot_api.upstream.error_type"]=e.type),e.message&&(t["copilot_api.upstream.error_message"]=Ut(e.message)),t}function To(e){let{c:t,error:o,errorText:n,upstream:r}=e,a=f.getActiveSpan();if(!a)return;let i=Lt({endpointType:qt(t.req.path),statusCode:o.response.status,upstreamErrorType:r.type,model:t.get("requestData")?.model});Gt(a,{c:t,outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders,upstreamResponseBody:n,signatureKey:i})}function Ao(e,t,o){let n=e.get("requestId"),r=ke.completionCallbacks.get(n);r&&(ke.logError(r,t,o),ke.completionCallbacks.delete(n))}async function $o(e,t){let o=f.getActiveSpan(),n=e.get("requestId"),r=ke.completionCallbacks.get(n);r&&(ke.logRateLimit(r,t.response),ke.completionCallbacks.delete(n)),De.add(1,{action:"rejected",source:"upstream"});let a=await t.response.text(),i=wo(a,e),s=ko(i);return o?.setStatus({code:p.ERROR,message:"Rate limited by upstream"}),o?.setAttribute("copilot_api.error_type","rate_limit_upstream"),vo(o,s),it(w.WARN,"WARN","Upstream rate limit hit",{"copilot_api.status_code":429,"http.path":e.req.path,"copilot_api.error_type":"rate_limit_upstream",...xo(s)}),To({c:e,error:t,errorText:a,upstream:s}),function(e,t){t.headers.forEach((t,o)=>{So.test(o)&&e.header(o,t)})}(e,t.response),e.json(i,429)}const So=/^(?:retry-after(?:-ms)?|x-ratelimit-[\w-]+)$/i;async function Eo(e,t){let o=f.getActiveSpan(),n=await t.response.text(),r=wo(n,e),a=ko(r);Ao(e,t.response.status,a.message??t.message),o?.setStatus({code:p.ERROR,message:t.message}),o?.recordException(t),o?.setAttribute("copilot_api.error_type","HTTPError"),vo(o,a),it(w.ERROR,"ERROR",`HTTP error: ${t.message}`,{"copilot_api.status_code":t.response.status,"http.path":e.req.path,"copilot_api.error_type":"HTTPError",...xo(a)}),To({c:e,error:t,errorText:n,upstream:a}),t.response.status>=500&&oo({route:e.req.path,statusCode:t.response.status,errorClass:"HTTPError",signature:Lt({endpointType:qt(e.req.path),statusCode:t.response.status,upstreamErrorType:a.type,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:a.type,upstreamErrorMessage:a.message});let i=yo(e)?function(e){let t;try{let o=JSON.parse(e);t=o.error&&"object"==typeof o.error?o.error:o}catch{return}let o="string"==typeof t.message?t.message:"";if("context_length_exceeded"!==t.code&&"context_length_exceeded"!==t.type&&!bo.test(o))return;let n=/maximum context length is (\d+)/i.exec(o)?.[1],r=/(?:resulted in|requested) (\d+) tokens/i.exec(o)?.[1];return{type:"error",error:{type:"invalid_request_error",message:n&&r?`prompt is too long: ${r} tokens > ${n} maximum`:`prompt is too long: ${o||"context_length_exceeded"}`}}}(n):void 0;return i?e.json(i,400):e.json(r,t.response.status)}function Oo(e,t){(function(e){return"object"==typeof e&&!!e&&ro.has(e)})(t)&&e?.setAttribute("copilot_api.transport_reason",le.connectivity.h2?"h2_retry_exhausted":"h1_retry_exhausted")}function Co(e){return _o(e)||function(e){return no(e)||e instanceof Error&&no(e.cause)}(e)}async function Io(e,t){return Pt(e)?(ke.completionCallbacks.delete(e.get("requestId")),new Response(null,{status:499})):async function(e,t){if(Oo(f.getActiveSpan(),t),t instanceof io&&429===t.response.status)return $o(e,t);if(t instanceof SyntaxError){f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_json_body"),it(w.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=yo(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 Ao(e,400,"Invalid JSON in request body"),e.json(o,400)}if(t instanceof io)return Eo(e,t);if(co(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Upstream request timed out"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","request_timeout");let n="Upstream request timed out (gateway timeout). Increase the timeout or retry.";it(w.ERROR,"ERROR",n,{"copilot_api.status_code":504,"http.path":e.req.path,"copilot_api.error_type":"request_timeout"});let r=yo(e)?{type:"error",error:{type:"api_error",message:n}}:{error:{message:n,type:"timeout_error"}};return Ao(e,504,t instanceof Error?t.message:n),e.json(r,504)}(e,t);if(Co(t))return function(e,t){let o=f.getActiveSpan();o?.setStatus({code:p.ERROR,message:"Transient upstream connection failure"}),t instanceof Error&&o?.recordException(t),o?.setAttribute("copilot_api.error_type","transient_transport");let n=t instanceof Error?fo(t):void 0,r=(n&&ho(n))??"none",a=n?.message??String(t);o?.setAttribute("copilot_api.transport_cause_code",r),o?.setAttribute("copilot_api.transport_cause_message",a);let i="Temporary upstream connection failure. Please retry.";it(w.WARN,"WARN",i,{"copilot_api.status_code":503,"http.path":e.req.path,"copilot_api.error_type":"transient_transport","copilot_api.transport_cause_code":r,"copilot_api.transport_cause_message":a}),e.header("Retry-After","1");let s=yo(e)?{type:"error",error:{type:"api_error",message:i}}:{error:{message:i,type:"service_unavailable"}};return Ao(e,503,t instanceof Error?`${t.message}${go(t)}`:i),e.json(s,503)}(e,t);let n=f.getActiveSpan(),r=t instanceof Error?t:Error(String(t));n?.setStatus({code:p.ERROR,message:r.message}),n?.recordException(r),n?.setAttribute("copilot_api.error_type",r.name),it(w.ERROR,"ERROR",`Unhandled error: ${r.message}`,{"copilot_api.status_code":500,"http.path":e.req.path,"copilot_api.error_type":r.name}),oo({route:e.req.path,statusCode:500,errorClass:r.name,signature:Lt({endpointType:qt(e.req.path),statusCode:500,upstreamErrorType:r.name,model:e.get("requestData")?.model}),model:e.get("requestData")?.model,upstreamErrorType:r.name,upstreamErrorMessage:`${r.message}${go(r)}`}),Ao(e,500,r.message),o.error(r);let a=yo(e)?{type:"error",error:{type:"api_error",message:r.message}}:{error:{message:r.message,type:"error"}};return e.json(a,500)}(e,t)}const Ro=async()=>{let e=`${At}/copilot_internal/v2/token`,t=le.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await dt({spanName:"github GET /copilot_internal/v2/token",url:e,target:"copilot_token",headers:$t(le),signal:o.signal});try{if(!t.ok)throw new io("Failed to get Service token",t);return await t.json()}catch(e){throw st(n,e),e}finally{n.end()}}finally{clearTimeout(n)}};async function No(){let e=`${At}/user`,t=le.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await dt({spanName:"github GET /user",url:e,target:"github_user",headers:{authorization:`token ${le._t2}`,"content-type":"application/json",accept:"application/json"},signal:o.signal});try{if(!t.ok)throw new io("Failed to get GitHub user",t);return await t.json()}catch(e){throw st(n,e),e}finally{n.end()}}finally{clearTimeout(n)}}const Po=3e5,qo=12e4;let Do,jo,Mo,Fo=null,Ho=0;function Uo(e){Mo&&clearTimeout(Mo),Mo=setTimeout(()=>{zo("scheduled").catch(e=>{o.warn("Foundry Entra token renewal failed; retrying:",e),Uo(3e4)})},e),Mo.unref()}async function Bo(e){let t=jo;if(!Do||!t?.tokenScope)throw Error("Foundry Entra auth is not initialised");let o=Ee.startSpan("copilot_api.foundry.entra_token",{kind:u.INTERNAL,attributes:{"copilot_api.foundry.token.trigger":e}},"upstream_401"===e?d.active():c);try{let e=await async function(e,t){let o=AbortSignal.timeout(qo),n=new Promise((e,t)=>{o.addEventListener("abort",()=>{t(Error("Entra token request timed out after 120s"))},{once:!0})});return Promise.race([e.getToken(t,{abortSignal:o}),n])}(Do,t.tokenScope);if(!e)throw Error(`No Entra token for scope ${t.tokenScope}`);o.setAttribute("copilot_api.foundry.token.expires_in_s",Math.round((e.expiresOnTimestamp-Date.now())/1e3)),t.bearerToken=e.token,t.bearerExpiresAt=e.expiresOnTimestamp,Ho=Date.now(),Uo(function(e){let t=e.refreshAfterTimestamp??e.expiresOnTimestamp-Po;return Math.max(t-Date.now(),3e4)}(e))}catch(e){throw st(o,function(e){let t=e instanceof Error?e:Error(String(e)),o=j(t.message),n=`… (truncated from ${o.length} chars)`,r=Error(o.length>2e3?o.slice(0,2e3-n.length)+n:o);return r.name=t.name,r}(e)),e}finally{o.end()}}async function Lo(e,t){jo=e,Do=t??await async function(){let{DefaultAzureCredential:e}=await import("@azure/identity");return new e}();try{await Bo("startup")}catch(e){throw Error("Foundry Entra ID auth: could not get a token. Run `az login` (or set FOUNDRY_API_KEY for key auth). The identity needs the 'Cognitive Services OpenAI User' role (GPT) or 'Azure AI User' (Claude) on the resource.",{cause:e})}}function zo(e="upstream_401"){return Fo??=Bo(e).finally(()=>{Fo=null}),Fo}let Go=null;async function Ko(e){if("foundry"===le.provider){if("entra"!==le.foundry?.auth)return!1;let t=e?.outgoingHeaders?.Authorization;return async function(e=!1,t){let n=jo?.bearerToken;if(void 0!==t&&t!==n)return!0;let r=jo?.bearerExpiresAt,a=void 0!==r&&r-Date.now()>Po;if(e&&a)return!1;if(Date.now()-Ho<3e4)return!0;try{return await zo(),!0}catch(e){return o.warn("Foundry Entra token renewal after a 401 failed:",e),!1}}(await async function(e){if(!e)return!1;let t=await e.response.clone().text().catch(()=>"");return/"code"\s*:\s*"PermissionDenied"/.test(t)}(e),t?.replace(/^Bearer /,""))}return Go||=Ro().then(({token:e})=>{le._t1=e,o.debug("Service token refreshed on upstream 401")}).finally(()=>{Go=null}),await Go,!0}function Jo(e,t="FOUNDRY_ENDPOINT"){let o,n=e.trim();try{o=new URL(n)}catch{throw Error(`${t} is not a valid URL: "${n}"`)}if("https:"!==o.protocol)throw Error(`${t} must use https, got: "${n}"`);let r=o.pathname.replace(/\/+$/,"").replace(/\/(?:openai|_an1)(?:\/v1)?$/i,"");return`${o.origin}${r}`}const Wo=/^([\w-]+)\.(?:openai\.azure\.com|cognitiveservices\.azure\.com|services\.ai\.azure\.com)$/i;function Yo(e){let t=new URL(e),o=Wo.exec(t.hostname)?.[1];return o?`https://${o}.services.ai.azure.com${t.pathname.replace(/\/+$/,"")}`:e}function Vo(e){if(!e?.trim())return;let t=e.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let[t,o]=e.split(":").map(e=>e.trim());if(!t)throw Error(`Invalid FOUNDRY_DEPLOYMENTS entry: "${e}"`);return{id:t,model:o||t}});return t.length>0?t:void 0}function Xo(e){let t=e.FOUNDRY_ENDPOINT,o=e.FOUNDRY_API_KEY?.trim();if(!t?.trim())throw Error("--provider foundry requires FOUNDRY_ENDPOINT (e.g. https://<resource>.openai.azure.com)");let n=function(e,t){let o=e?.trim().toLowerCase();if(!o)return t?"key":"entra";if("key"!==o&&"entra"!==o)throw Error(`FOUNDRY_AUTH must be "key" or "entra", got: "${o}"`);if("key"===o&&!t)throw Error("FOUNDRY_AUTH=key requires FOUNDRY_API_KEY");return o}(e.FOUNDRY_AUTH,o),r=Jo(t),a=e.FOUNDRY_ANTHROPIC_ENDPOINT?.trim();return{endpoint:r,anthropicEndpoint:a?Jo(a,"FOUNDRY_ANTHROPIC_ENDPOINT"):Yo(r),auth:n,..."key"===n?{apiKey:o}:{tokenScope:e.FOUNDRY_TOKEN_SCOPE?.trim()||"https://cognitiveservices.azure.com/.default"},deployments:Vo(e.FOUNDRY_DEPLOYMENTS)}}const Zo=(e,t)=>"entra"===e.auth?{Authorization:`Bearer ${e.bearerToken??""}`}:{[t]:e.apiKey??""},Qo=e=>({...Zo(e,"api-key"),"Content-Type":"application/json",accept:"*/*"}),en=e=>`${e.anthropicEndpoint}/anthropic`,tn=(e,t)=>({...Zo(e,"x-api-key"),"Content-Type":"application/json",accept:"*/*","anthropic-version":t?.anthropicVersion??"2023-06-01",...t?.anthropicBeta?{"anthropic-beta":t.anthropicBeta}:{}}),on=e=>"foundry"===e.provider;function nn(e){if(!e.foundry)throw Error("Foundry provider selected but not configured");return e.foundry}const rn=e=>on(e)?(e=>`${e.endpoint}/openai/v1`)(nn(e)):kt(e),an=(e,t=!1)=>on(e)?Qo(nn(e)):vt(e,t),sn=e=>on(e)?!!(e.foundry?.apiKey??e.foundry?.bearerToken):!!e._t1;const ln=[{pattern:/^gpt-6/,context:105e4,output:128e3},{pattern:/^gpt-5/,context:4e5,output:128e3},{pattern:/^gpt-4\.1/,context:1047576,output:32768},{pattern:/^o\d/,context:2e5,output:1e5}],cn={context:128e3,output:16384};function un(e){return ln.find(({pattern:t})=>t.test(e))??cn}const pn=/dall-e|gpt-image|image|whisper|tts|transcribe|realtime|audio|speech|sora/i,dn=e=>/^claude/i.test(e),mn=e=>/^(?:gpt-|o\d|codex|chatgpt|computer-use)/i.test(e);function fn(e,t){return{id:e.id,name:e.id,object:"model",vendor:t.vendor,version:e.model,preview:!1,model_picker_enabled:!0,supported_endpoints:t.supported_endpoints,capabilities:{family:e.model,object:"model_capabilities",type:"chat",tokenizer:"o200k_base",limits:t.limits&&{max_context_window_tokens:t.limits.context,max_output_tokens:t.limits.output},supports:{tool_calls:!0,parallel_tool_calls:!0}}}}async function hn(e){let t=`${e.endpoint}/openai/deployments?api-version=2022-12-01`,o=new AbortController,n=lo(o,le.timeoutMs);try{let{response:n,span:r}=await dt({spanName:"foundry GET /openai/deployments",url:t,target:"models",headers:Qo(e),signal:o.signal});try{if(!n.ok)throw new io("Failed to list Foundry deployments",n);let e=(await n.json()).data.filter(e=>!e.status||"succeeded"===e.status).map(e=>({id:e.id,model:e.model}));return r.setAttribute("copilot_api.models_count",e.length),e}catch(e){throw st(r,e),e}finally{r.end()}}finally{clearTimeout(n)}}async function gn(e){return{object:"list",data:(e.deployments??await hn(e)).map(e=>function(e){let{model:t}=e;if(!pn.test(t))return(e=>/embedding/i.test(e))(t)?{id:e.id,name:e.id,object:"model",vendor:"Azure OpenAI",version:t,preview:!1,model_picker_enabled:!1,supported_endpoints:["/embeddings"],capabilities:{family:t,object:"model_capabilities",type:"embeddings",tokenizer:"cl100k_base",supports:{}}}:dn(t)?fn(e,{vendor:"Anthropic",supported_endpoints:["/v1/messages"]}):mn(t)?fn(e,{vendor:"Azure OpenAI",supported_endpoints:["/responses"],limits:un(t)}):fn(e,{vendor:"Foundry",supported_endpoints:["/chat/completions"],limits:un(t)})}(e)).filter(e=>void 0!==e)}}const _n=()=>on(le)&&le.foundry?gn(le.foundry):wn(),yn=async()=>{try{return await _n()}catch(e){if(e instanceof io&&401===e.response.status){if(!await Ko(e))throw e;return _n()}throw e}},wn=async()=>{let e=`${rn(le)}/models`,t=an(le),o=le.timeoutMs,n=new AbortController,r=lo(n,o);try{let{response:o,span:r}=await dt({spanName:"copilot GET /models",url:e,target:"models",headers:t,signal:n.signal});try{if(!o.ok)throw new io("Failed to get models",o);let e=await o.json();return r.setAttribute("copilot_api.models_count",e.data.length),e}catch(e){throw st(r,e),e}finally{r.end()}}finally{clearTimeout(r)}},bn=e=>"embeddings"!==e.capabilities.type,kn=e=>bn(e)&&(e.supported_endpoints?.includes("/responses")??!0);const vn=[{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"}],xn="claude-haiku-4.5",Tn={haiku:xn,"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"};const An=/^claude-/i;function $n(e){return e.toLowerCase().replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2")}function Sn(e,t){if("string"!=typeof e)return null;let o=function(e){return e.startsWith("anthropic/")?e.slice(10):e}(e),[n,r]=function(e){let t=e.lastIndexOf("["),o=e.lastIndexOf("]");return-1!==t&&o===e.length-1&&o>t?[e.slice(0,t),e.slice(t+1,o)]:[e,null]}(o);if(t.includes(o))return o;if(r){let e=`${n}-${r}`.replaceAll(/(\d)-(\d{1,2})\b/g,"$1.$2");if(t.includes(e))return e}let a=function(e){for(let t of vn)if(t.pattern.test(e))return t.family;return null}(n),i=An.test(n),s=n.replace(/-\d{8}(?::.*)?$/,""),l=r?`-${r}`:"",c=l?[`${s}${l}`,s]:[s];for(let e of i?c:[]){let o=$n(e);for(let e of t)if($n(e.replace(/-\d{8}(?::.*)?$/,""))===o)return e}return a?function(e,t,o=null){let n=Tn[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):null}const En=new Map([["none",0],["low",1],["medium",2],["high",3],["xhigh",4]]);function On(e,t){if(!e||!t||0===t.length)return null;let o=function(e){return"max"===e?"xhigh":e}(e);if(t.includes(o))return o;let n=En.get(o);if(void 0===n)return t[0]??null;let r=null,a=1/0;for(let e of t){let t=En.get(e);if(void 0===t)continue;let o=Math.abs(t-n);o<a&&(a=o,r=e)}return r}const Cn={messages:bn,responses:kn,chat:e=>bn(e)&&(e.supported_endpoints?.some(e=>"/chat/completions"===e||"/responses"===e)??!0)};let In;const Rn=new Map,Nn=new Map;function Pn(e,t,o){let n=(e??t??"").trim().toLowerCase();if(""!==n&&"none"!==n){if("copilot"!==n)throw Error(`--fallback must be "copilot", got: "${n}"`);if("foundry"!==o)throw Error("--fallback copilot requires --provider foundry");return n}}async function qn(){In=await oe({provider:"copilot"},yn)}const Dn=()=>void 0!==In;function jn(e,t=Date.now()){let o=Rn.get(e);return void 0!==o&&(t<o||(Rn.delete(e),!1))}function Mn(e,t=Date.now()){return{id:Nn.get(e)?.id??0,lapsed:!jn(e,t)}}function Fn(e,t,o={}){let n=o.now??Date.now(),r=o.sent??Mn(e,n),a=Nn.get(e)??{id:0,appliedMs:0},i=Math.max(function(e,t=Date.now()){let o=e.get("retry-after-ms");if(null!==o&&Number.isFinite(Number(o))&&Number(o)>=0)return Number(o);let n=e.get("retry-after");if(null!==n){let e=Number(n);if(""!==n.trim()&&Number.isFinite(e)&&e>=0)return 1e3*e;let o=Date.parse(n);if(!Number.isNaN(o))return Math.max(0,o-t)}return 1e4}(t,n),5e3),s=r.lapsed?r.id+1:r.id;if(s>a.id){let t=Math.min(2*a.appliedMs,6e4);i=Math.max(i,t),Nn.set(e,{id:s,appliedMs:i})}else s===a.id&&i>a.appliedMs&&Nn.set(e,{id:a.id,appliedMs:i});let l=Math.max(Rn.get(e)??0,n+i);return Rn.set(e,l),l-n}function Hn(e){if(!Dn()||!on(le)||!e.ok)return;let{headers:t}=e;return t.has("retry-after")||t.has("retry-after-ms")?Response.json({error:{message:"Foundry rate-limited this request (HTTP 200 stream with retry-after).",type:"too_many_requests",code:"rate_limit_exceeded"}},{status:429,headers:t}):void 0}const Un=new Set([429,408,500,502,503,504]);function Bn(e,t){let o=lo(e,t),n=ae()?lo(e,9e4):void 0;return{headersArrived:()=>clearTimeout(n),clear:()=>{clearTimeout(o),clearTimeout(n)}}}const Ln={foundry_429:"rate-limited",foundry_timeout:"timed out on",foundry_transport:"could not be reached for"};function zn(e,t,n){let r=Ln[t]??`returned ${t.slice(8)} for`;o.info(`Foundry ${r} ${e}; serving it from Copilot for ${Math.ceil(n/1e3)}s`)}function Gn(e,t,o){let{model:n,reason:r}=o,a=f.getActiveSpan();return a?.setAttribute("copilot_api.fallback.upstream","copilot"),a?.setAttribute("copilot_api.fallback.reason",r),a?.setAttribute("copilot_api.fallback.foundry_model",n),oe({provider:"copilot",models:In,rerun:"breaker_open"!==r},()=>t(e))}async function Kn(e,t,o){if(!Dn()||!on(le))return o(e);let n=await async function(e){try{let t=await e.req.json();return"string"==typeof t.model?t.model:void 0}catch{return}}(e);if(!n||!function(e,t){let o=In?.data??[],n=o.map(e=>e.id),r=n.includes(e)?e:Sn(e,n),a=o.find(e=>e.id===r);return a&&Cn[t](a)?a.id:void 0}(n,t))return o(e);if(jn(n))return Gn(e,o,{model:n,reason:"breaker_open"});let r=Mn(n),{attempt:a,sent:i}=function(e){let t;return{attempt:{onSend:()=>{t=Mn(e)}},sent:()=>t}}(n);try{let t=await function(e,t){return re.run(e,t)}(a,()=>o(e)),r=i();return t.ok&&r&&function(e,t){let o=Nn.get(e);o&&t.lapsed&&t.id===o.id&&Nn.set(e,{id:o.id,appliedMs:0})}(n,r),t}catch(t){let s=i(),l=function(e,t){if(e instanceof io){let{status:t}=e.response;return Un.has(t)&&void 0!==e.outgoingBody?`foundry_${t}`:void 0}if(t){if(co(e))return"foundry_timeout";if(Co(e))return"foundry_transport"}}(t,void 0!==s);if(!l)throw t;let c=await async function(e,t,o){let n=t instanceof io?t.response:void 0,r=Fn(e,n?.headers??new Headers,{sent:o});return await(n?.body?.cancel()),r}(n,t,s??r),u=f.getActiveSpan();if(u?.setAttribute("copilot_api.fallback.retry_after_ms",c),void 0!==a.start&&u?.setAttribute("copilot_api.fallback.foundry_attempt_ms",Math.round(performance.now()-a.start)),zn(n,l,c),Pt(e))throw t;return Gn(e,o,{model:n,reason:l})}}const Jn=e=>new Promise(t=>{setTimeout(t,e)}),Wn=e=>null==e;async function Yn({refreshFallback:e=!0}={}){let t=await yn();le.models=t,e&&Dn()&&await qn().catch(e=>{o.warn("Failed to refresh the Copilot fallback models:",e)})}const Vn=()=>{le._v1="1.140.0-insider"};var Xn=class extends Error{constructor(e){super(e),this.name="AuthorizationError"}};let Zn,Qn,er,tr,or,nr=!1,rr=!1,ar=!1;function ir(){return sr()?or:void 0}function sr(){return void 0!==or&&Date.now()-or.at<6e4}function lr(){return ar?"re-authenticate with `copilot-api auth`; the proxy picks up the new token automatically within a minute":"re-authenticate and update GH_TOKEN / --github-token, then restart the proxy"}const cr=()=>a.readFile(Z.GITHUB_TOKEN_PATH,"utf8");function ur(e){let{span:t,error:n,reason:r,refreshStart:a,attempt:i}=e,s=n.response.status,l=401===s?"Auth token is invalid or expired":"GitHub Copilot subscription not found or not active";le._t1=void 0,or={status:s,message:l,at:Date.now()},clearInterval(Zn),Zn=void 0,o.error(`Token refresh received terminal HTTP ${s} — ${l}. Scheduled refresh halted. Re-authenticate to resume.`),Fe.add(1,{reason:r,success:"false"}),He.add(1,{reason:r}),t.setAttribute("copilot_api.token_refresh.success",!1),t.setAttribute("copilot_api.token_refresh.terminal_status",s),t.setStatus({code:p.ERROR,message:n.message}),t.recordException(n),et.record(performance.now()-a,{reason:r}),it(w.ERROR,"ERROR",`Token refresh terminated — HTTP ${s} (${l})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempt":i,"copilot_api.token_refresh.terminal_status":s})}function pr(e){let{span:t,error:n,reason:r,refreshStart:a,maxRetries:i}=e;le._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:p.ERROR,message:s.message}),t.recordException(s),He.add(1,{reason:r}),et.record(performance.now()-a,{reason:r}),it(w.ERROR,"ERROR",`Token refresh failed after ${i} attempts (${r})`,{"copilot_api.token_refresh.reason":r,"copilot_api.token_refresh.attempts":i})}const dr=async(e=5,t=1e3,n="scheduled")=>nr?(o.debug("Token refresh already in progress, coalescing"),Qn):(nr=!0,Qn=Ee.startActiveSpan("copilot_api.token.refresh",async r=>{let a=performance.now();r.setAttribute("copilot_api.token_refresh.reason",n),r.setAttribute("copilot_api.token_refresh.max_retries",e);try{for(let i=1;i<=e;i++)try{r.setAttribute("copilot_api.token_refresh.attempt",i),o.debug(`Refreshing Service token (${n}, attempt ${i}/${e})`);let{token:t,refresh_in:s}=await Ro();return le._t1=t,or=void 0,rr&&void 0===Zn&&(o.info("Token refresh recovered, resuming scheduled refresh"),fr(s)),o.debug("Service token refreshed successfully"),le.showToken&&o.info("Refreshed Service token:",t),r.setAttribute("copilot_api.token_refresh.success",!0),Fe.add(1,{reason:n,success:"true"}),et.record(performance.now()-a,{reason:n}),void it(w.INFO,"INFO",`Token refreshed successfully (${n})`,{"copilot_api.token_refresh.reason":n,"copilot_api.token_refresh.attempt":i})}catch(s){if(s instanceof io&&(401===s.response.status||403===s.response.status))return void ur({span:r,error:s,reason:n,refreshStart:a,attempt:i});let l=i===e;if(o.error(`Failed to refresh Service token (attempt ${i}/${e}):`,s),Fe.add(1,{reason:n,success:"false"}),l)return void pr({span:r,error:s,reason:n,refreshStart:a,maxRetries:e});let c=t*2**(i-1);o.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),nr=!1,Qn=void 0}}),Qn);async function mr(){return!!le._t1||!sr()&&(void 0!==or&&ar&&await async function(){if(Qn)return;let e=(await cr().catch(()=>{}))?.trim();e&&e!==le._t2?.trim()&&(le._t2=e,o.info("Picked up re-authenticated Auth token from disk"),le.showToken&&o.info("Auth token:",e))}(),await dr(3,250,"on-demand"),!!le._t1)}function fr(e){Zn&&clearInterval(Zn);let t=Math.max(1e3*(e-60),6e4);Zn=setInterval(()=>{dr(5,1e3,"scheduled").catch(e=>{o.error("Unexpected error in scheduled token refresh:",e)})},t)}async function hr(e){try{let t=await cr();if(t&&!e?.force)return le._t2=t,ar=!0,le.showToken&&o.info("Auth token:",t),void await gr();o.info("Authentication required");let n=await async function(){let e=new AbortController,t=le.timeoutMs,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${St}/login/device/code`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({client_id:Et,scope:Ot}),signal:e.signal});if(!t.ok)throw new io("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{h.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=y.platform;t="darwin"===o?"open":"win32"===o?"start":"xdg-open",g(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 Xn("Authorization timed out — the code expired. Please run the command again.");let a=new AbortController,i=le.timeoutMs,s=setTimeout(()=>{a.abort()},i);try{let n=await fetch(`${St}/login/oauth/access_token`,{method:"POST",headers:ht(),body:JSON.stringify({client_id:Et,device_code:e.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:a.signal});if(!n.ok){await Jn(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 Xn("Authorization timed out — the code expired. Please run the command again.");if("access_denied"===r.error)throw new Xn("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 Jn(t);continue}if(r.access_token)return r.access_token;await Jn(t)}catch(e){if(e instanceof Xn)throw e;if(e instanceof Error&&"AbortError"===e.name){o.error("Access token polling timed out"),await Jn(t);continue}throw e}finally{clearTimeout(s)}}}(n);await(e=>a.writeFile(Z.GITHUB_TOKEN_PATH,e,{mode:384}))(r),le._t2=r,ar=!0,le.showToken&&o.info("Auth token:",r),await gr()}catch(e){throw e instanceof io?(o.error("Failed to get Auth token:",await e.response.json()),e):(o.error("Failed to get Auth token:",e),e)}}async function gr(){let e=await No();o.success(`Authenticated as ${e.login}`)}async function _r(e){e.verbose&&(o.level=5,o.info("Verbose logging enabled")),le.showToken=e.showToken,await Q(),await hr({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 yr=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})=>_r({verbose:e.verbose,showToken:e["show-token"]})}),wr=.01,br=864e5,kr=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}),vr=new Intl.NumberFormat("en-US"),xr=e=>kr.format(e*wr),Tr=e=>e.credits_used??e.entitlement-e.remaining,Ar=(e,t,o)=>{let n=(e=>{let t=new Date(`${e}T00:00:00Z`);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()-1,1))})(t),r=(o.getTime()-n.getTime())/br;if(r<.5)return;let a=Tr(e),i=a*wr/r,s=a>=e.entitlement;if(s||i<=0)return{usdPerDay:i,exhaustsOn:void 0,exhausted:s};let l=e.entitlement*wr,c=new Date(n.getTime()+l/i*br);return{usdPerDay:i,exhaustsOn:c<new Date(`${t}T00:00:00Z`)?c:void 0,exhausted:!1}},$r=e=>e?e.unlimited?"unlimited":e.entitlement<=0?"not metered":`${vr.format(Tr(e))} of ${vr.format(e.entitlement)} used`:"n/a",Sr=e=>e.padEnd(14),Er=(e,t=new Date)=>{let o=e.quota_snapshots.premium_interactions,n=[`Usage — ${e.login??"unknown"} (${e.copilot_plan})`,""];if(o.unlimited)n.push(`${Sr("AI credits")}unlimited`);else{let e=Tr(o),t=o.percent_remaining;n.push(`${Sr("AI credits")}${xr(e)} / ${xr(o.entitlement)} ${t.toFixed(1)}% left`,`${Sr("")}${(e=>{let t=Math.round(32*Math.min(Math.max(e,0),1));return"█".repeat(t)+"░".repeat(32-t)})(1-t/100)}`,`${Sr("")}${vr.format(e)} of ${vr.format(o.entitlement)} credits`)}if(n.push("",`${Sr("Chat")}${$r(e.quota_snapshots.chat)}`,`${Sr("Completions")}${$r(e.quota_snapshots.completions)}`,"",`${Sr("Resets")}${e.quota_reset_date} (in ${((e,t)=>Math.max(0,Math.ceil((new Date(`${e}T00:00:00Z`).getTime()-t.getTime())/br)))(e.quota_reset_date,t)} days)`),!o.unlimited){let r=Ar(o,e.quota_reset_date,t);r&&n.push(`${Sr("Burn rate")}~${kr.format(r.usdPerDay)}/day${(e=>e.exhausted?" — allowance already exhausted":e.exhaustsOn?` — on track to exhaust ${(e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"}))(e.exhaustsOn)}`:" — within allowance")(r)}`);let a=o.overage_permitted?"permitted, "+(o.overage_count>0?`${vr.format(o.overage_count)} used`:"none used"):"not permitted";n.push(`${Sr("Overage")}${a}`)}return n.join("\n")},Or=async()=>{let e=`${At}/copilot_internal/user`,t=le.timeoutMs,o=new AbortController,n=setTimeout(()=>o.abort(),t);try{let{response:t,span:n}=await dt({spanName:"github GET /copilot_internal/user",url:e,target:"usage",headers:$t(le),signal:o.signal});try{if(!t.ok)throw new io("Failed to get usage",t);return await t.json()}catch(e){throw st(n,e),e}finally{n.end()}}finally{clearTimeout(n)}},Cr=()=>y.stdout.write("[2J[H"),Ir=(e,t)=>`Updated ${(e=>e.toLocaleTimeString("en-US",{hour12:!1}))(e)} · refreshing every ${t}s · Ctrl-C to exit`,Rr=async()=>{let e=await Or();return Er(e)},Nr=e({meta:{name:"check-usage",description:"Show current usage/quota information"},args:{watch:{alias:"w",type:"boolean",default:!1,description:"Keep running and refresh the report on an interval"},interval:{alias:"i",type:"string",default:"60",description:"Seconds between refreshes in --watch mode (min 10)"}},async run({args:e}){if(await Q(),await hr(),!e.watch){try{o.box(await Rr())}catch(e){o.error("Failed to fetch usage:",e),y.exit(1)}y.exit(0)}(e=>!!e&&Number.isNaN(Number(e)))(e.interval)?o.info(`Ignoring --interval "${e.interval}" (not a number); using 60s`):(e=>{let t=Number(e);return!(!e||Number.isNaN(t))&&Math.floor(t)<10})(e.interval)&&o.info(`Raising --interval "${e.interval}" to the 10s minimum`);let t=(e=>{let t=Number(e);return!e||Number.isNaN(t)?60:Math.max(10,Math.floor(t))})(e.interval),n=y.stdout.isTTY,r=()=>y.exit(0);for(y.on("SIGINT",r),y.on("SIGTERM",r);;){try{let e=await Rr();n&&Cr(),o.box(e),o.log(Ir(new Date,t))}catch(e){o.error("Failed to fetch usage:",e)}await new Promise(e=>setTimeout(e,1e3*t))}}}),Pr=D(g);async function qr(){let e="win32"===y.platform?"where.exe":"which";try{return await Pr(e,["tailscale"]),!0}catch{return!1}}async function Dr(){try{let{stdout:e}=await Pr("tailscale",["status","--self","--json"]);return JSON.parse(e).Self}catch{return}}function jr(e){return e.replace(/\.$/,"")}async function Mr(){let e=await Dr();if(e?.Online)return jr(e.DNSName)}const Fr=D(g),Hr=e=>`[1m${e}[0m`,Ur=e=>`[2m${e}[0m`,Br=e=>`[36m${e}[0m`,Lr=e=>`[32m${e}[0m`,zr=e=>`[31m${e}[0m`,Gr=e=>`[33m${e}[0m`,Kr=Ur(" ─────────────────────────────────────────────────────────────"),Jr=s.join(Z.APP_DIR,"certs","tailscale"),Wr=s.join(Jr,"cert.pem"),Yr=s.join(Jr,"key.pem"),Vr={certDir:Jr,certPath:Wr,keyPath:Yr};function Xr(){switch(y.platform){case"darwin":return[` ${Ur("Install Tailscale for macOS:")}`,` ${Br("https://tailscale.com/download/mac")}`,` ${Ur("(Use the Mac App Store or .pkg download — not brew)")}`,"",` ${Ur("After installing, open the Tailscale app and sign in.")}`,` ${Ur("Then re-run this command.")}`].join("\n");case"linux":return[` ${Ur("Install Tailscale for Linux:")}`,` ${Br("curl -fsSL https://tailscale.com/install.sh | sh")}`,` ${Br("sudo tailscale up")}`,` ${Ur("or")} ${Br("https://tailscale.com/download/linux")}`].join("\n");case"win32":return[` ${Ur("Install Tailscale for Windows:")}`,` ${Br("https://tailscale.com/download/windows")}`,"",` ${Ur("After installing, open the Tailscale app and sign in.")}`].join("\n");default:return` ${Ur("Install Tailscale:")} ${Br("https://tailscale.com/download")}`}}function Zr(){let e=[` ${zr("Tailscale is not running.")}`];return"darwin"===y.platform?e.push(` ${Ur("Open the Tailscale app from Applications and sign in.")}`,` ${Ur("Download:")} ${Br("https://tailscale.com/download/mac")}`):"win32"===y.platform?e.push(` ${Ur("Open the Tailscale app and sign in.")}`,` ${Ur("Download:")} ${Br("https://tailscale.com/download/windows")}`):e.push(` ${Ur("Connect with:")} ${Br("sudo tailscale up")}`),e.push("",` ${Ur("Then re-run this command.")}`),e.join("\n")}async function Qr(){try{return await a.access(Wr),await a.access(Yr),!0}catch{return!1}}function ea(e){console.log(""),console.log(Kr),console.log(` ${Hr("Claude Cowork Setup")} ${Ur("— Diagnostic")}`),console.log(Kr),console.log("");for(let t of function(e){let t=[];for(let[o,n]of Object.entries(e)){let e;e="ok"===n.status?Lr("✅"):"missing"===n.status?zr("❌"):Gr("❓");let r=n.detail?Ur(` ${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(` ${Lr("All checks passed.")}`):console.log(` ${zr(`${t.length} issue(s).`)} Run ${Br("copilot-api cowork-setup install")} to fix.`),console.log("")}const ta={alias:"y",type:"boolean",default:!1,description:"Skip confirmation prompts (non-interactive mode)"},oa=e({meta:{name:"doctor",description:"Diagnose Tailscale + cert status"},async run(){await async function(){let e={},t=await qr();if(e["tailscale-installed"]=t?{status:"ok"}:{status:"missing",detail:"tailscale not found in PATH"},!t)return ea(e),console.log(""),console.log(Xr()),void console.log("");let o=await Dr();if(!o||!o.Online)return e["tailscale-running"]={status:"missing",detail:"not connected"},ea(e),console.log(Zr()),void console.log("");let n=jr(o.DNSName);e["tailscale-running"]={status:"ok",detail:n};let r=await Qr();e["tailscale-cert"]=r?{status:"ok",detail:Wr}:{status:"missing",detail:'Run "copilot-api cowork-setup install" to generate'},r&&(e.ready={status:"ok",detail:`https://${n}:<port>`}),ea(e)}(),y.exit(0)}}),na=e({meta:{name:"install",description:"Generate a Tailscale TLS certificate for Cowork (interactive, or pass --yes)"},args:{yes:ta},async run({args:e}){await async function(e){if(console.log(""),console.log(Kr),console.log(` ${Hr("Claude Cowork Setup")} ${Ur("— Install")}`),console.log(Kr),console.log(""),!await qr())return console.log(` ${zr("Tailscale is not installed.")}`),console.log(""),console.log(Xr()),console.log(""),console.log(` ${Ur("After installing, run")} ${Br("tailscale up")} ${Ur("to connect, then re-run this command.")}`),void console.log("");let t=await Dr();if(!t||!t.Online)return console.log(Zr()),void console.log("");let n=jr(t.DNSName);if(console.log(` ${Ur("Tailscale hostname:")} ${Hr(n)}`),console.log(""),console.log(` ${Hr("Generating TLS certificate via Tailscale…")}`),console.log(` ${Ur("This requests a real Let's Encrypt cert for your Tailscale hostname.")}`),console.log(` ${Br(`$ tailscale cert --cert-file ${Wr} --key-file ${Yr} ${n}`)}`),console.log(""),e||await o.prompt("Generate the certificate?",{type:"confirm",initial:!0})){try{await a.mkdir(Jr,{recursive:!0}),o.start("Generating certificate (this may take a few seconds)…"),await Fr("tailscale",["cert","--cert-file",Wr,"--key-file",Yr,n]),console.log(` ${Lr("✓ 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(Kr),console.log(` ${Hr("Next steps")}`),console.log(Kr),console.log(""),console.log(` ${Hr("1.")} Start the proxy:`),console.log(` ${Br("copilot-api start --claude-cowork")}`),console.log(""),console.log(` ${Hr("2.")} In Cowork ${Ur("→")} Settings ${Ur("→")} Inference Provider, set:`),console.log(` ${Hr("inferenceGatewayBaseUrl")} = ${Br(`https://${n}:<port>`)}`),console.log(` ${Ur("(replace <port> with the port you start the proxy on, default 4141)")}`),console.log(""),console.log(` ${Hr("3.")} Restart Cowork ${Ur("(Cmd+Q and reopen)")}`),console.log(""),console.log(` ${Ur("For Cowork's own configuration docs, see:")}`),console.log(` ${Br("https://claude.com/docs/cowork/3p/installation")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),ra=e({meta:{name:"revert",description:"Remove the generated Tailscale cert files"},args:{yes:ta},async run({args:e}){await async function(e){if(console.log(""),console.log(Kr),console.log(` ${Hr("Claude Cowork Setup")} ${Ur("— Revert")}`),console.log(Kr),console.log(""),!await Qr())return console.log(` ${Ur("No Tailscale cert found. Nothing to revert.")}`),void console.log("");if(console.log(` ${Hr("Remove Tailscale cert files:")}`),console.log(` ${Ur(Wr)}`),console.log(` ${Ur(Yr)}`),console.log(""),e||await o.prompt("Delete these files?",{type:"confirm",initial:!0})){try{await a.rm(Jr,{recursive:!0}),console.log(` ${Lr("✓ Cert files removed.")}`)}catch(e){let t=e instanceof Error?e.message:String(e);o.warn(`Could not remove: ${t}`)}console.log(""),console.log(` ${Ur("Don't forget to update Cowork's inferenceGatewayBaseUrl setting.")}`),console.log("")}else o.info("Skipped.")}(e.yes),y.exit(0)}}),aa=e({meta:{name:"cowork-setup",description:"Set up Tailscale-based HTTPS for Claude Cowork to reach the proxy."},subCommands:{doctor:oa,install:na,revert:ra}}),ia=/[\x00-\x08\v\f\x0E-\x1F\u180E\u2000-\u200D\u2028\u2029\u202F\u205F-\u2064\u206A-\u206F\u3000\uFEFF\uFFF0-\uFFFF]/;function sa(e){if(!ia.test(e))return e;let t=e,o=String.fromCodePoint(27),n=t.split(o);if(n.length>1){t=n[0];for(let e=1;e<n.length;e++){let r=n[e],a=r.match(/^\[[0-9;]*[a-z]/i);t+=a?r.slice(a[0].length):o+r}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,"").replaceAll(/[\u2060-\u2064]/g,"").replaceAll(/[\u206A-\u206F]/g,"").replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,"").replaceAll(/[\uFFF0-\uFFFF]/g,"").replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,"")}function la(e){return"string"==typeof e?sa(e):Array.isArray(e)?function(e){let t;for(let o=0;o<e.length;o++){let n=e[o],r=la(n);!t&&r!==n&&(t=e.slice(0,o)),t?.push(r)}return t??e}(e):e&&"object"==typeof e?function(e){let t,o=Object.entries(e),n="thinking"===e.type;for(let e=0;e<o.length;e++){let[r,a]=o[e],i=!n||"thinking"!==r&&"signature"!==r?la(a):a;!t&&(i!==a||"__proto__"===r)&&(t=ca({},o,e)),t&&(t[r]=i)}let r=t??e;return"object"===r.type&&!("properties"in r)&&(t??=ca({},o,o.length),t.properties={}),t??e}(e):e}function ca(e,t,o){for(let n=0;n<o;n++)e[t[n][0]]=t[n][1];return e}const ua="x-copilot-api-self-test",pa=q();const da=/\b(?:haiku|mini|flash|nano|small|lite)\b/i;function ma(e){return!e.id.startsWith("text-embedding")&&"embeddings"!==e.capabilities.type&&!function(e){let t=e.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):/gpt-[\d.]+-codex/i.test(e.id)}(e)&&!function(e){return"disabled"===e.policy?.state}(e)}let fa;function ha(e){let{c:t,start:o,span:n}=e,r=t.get("requestData"),a=t.res.status,i=r?.model??"unknown",s=r?.streaming??!1,l=Math.round(performance.now()-o);if(n.setAttribute("http.status_code",a),n.setAttribute("copilot_api.model",i),n.setAttribute("copilot_api.streaming",s),n.setAttribute("copilot_api.duration_ms",l),function(e){let{heapUsed:t,rss:o}=process.memoryUsage();fa??=H().heap_size_limit,e.setAttribute("copilot_api.process.heap_used_bytes",t),e.setAttribute("copilot_api.process.rss_bytes",o),e.setAttribute("copilot_api.process.heap_limit_bytes",fa),e.setAttribute("copilot_api.process.uptime_s",Math.round(process.uptime()))}(n),r?._d1&&n.setAttribute("copilot_api.copilot_duration_ms",r._d1),r?.tokenUsage){let e=r.tokenUsage;n.setAttribute("copilot_api.input_tokens",e.inputTokens),n.setAttribute("copilot_api.output_tokens",e.outputTokens),n.setAttribute("copilot_api.total_tokens",e.totalTokens),e.cachedTokens&&n.setAttribute("copilot_api.cached_tokens",e.cachedTokens)}t.res.headers.forEach((e,t)=>{let o=t.toLowerCase();ut.has(o)||n.setAttribute(`http.response.header.${o}`,e)}),a>=400&&n.setStatus({code:p.ERROR,message:`HTTP ${a}`})}function ga(e){try{ha(e)}catch(e){o.warn("Error enriching span during finalization:",e)}try{!function(e){let{c:t,start:o,method:n,path:r,endpointType:a,requestId:i}=e;if(t.get("isSelfTest"))return;let s=Math.round(performance.now()-o),l=t.get("requestData"),c=t.res.status,u=l?.model??"unknown",p=l?.streaming??!1,d={method:n,path:r,status_code:String(c),model:u,streaming:String(p),endpoint_type:a};if(Ie.add(1,d),Ye.record(s,d),c>=400&&Re.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&&(Ne.add(e.inputTokens,t),ot.record(e.inputTokens,t)),e.outputTokens&&(Pe.add(e.outputTokens,t),nt.record(e.outputTokens,t)),e.cachedTokens&&qe.add(e.cachedTokens,{model:u})}!p&&l?.tokenUsage&&ke.executeCompletion(i)}(e)}catch(e){o.warn("Error recording metrics during finalization:",e)}try{e.span.end()}catch{}ke.completionCallbacks.delete(e.requestId)}const _a=async()=>{if(!ne())return Ee.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),at.record(r),!n)throw e.setAttribute("copilot_api.approval.result","rejected"),Ge.add(1,{result:"rejected"}),new io("Request rejected",Response.json({message:"Request rejected"},{status:403}));e.setAttribute("copilot_api.approval.result","approved"),Ge.add(1,{result:"approved"})}finally{e.end()}})};async function ya(e){if(sn(le)||await mr())return null;let t=ir();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({error:{message:`${t.message}; ${lr()}`,type:"authentication_error"}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({error:{message:"Service token not yet available; retry shortly",type:"service_unavailable"}},503))}function wa(e){let t=e.prompt_tokens||0,o=e.completion_tokens||0;return{inputTokens:t,outputTokens:o,totalTokens:e.total_tokens||t+o,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function ba(e,t){e.setAttributes(function(e){let t={};void 0!==e.prompt_tokens&&(t["copilot_api.input_tokens"]=e.prompt_tokens),void 0!==e.completion_tokens&&(t["copilot_api.output_tokens"]=e.completion_tokens),void 0!==e.total_tokens&&(t["copilot_api.total_tokens"]=e.total_tokens);let o=e.prompt_tokens_details?.cached_tokens;return void 0!==o&&(t["copilot_api.cached_tokens"]=o),t}(t))}var ka=class extends Error{statusCode;constructor(e,t=400){super(e),this.name="ModelValidationError",this.statusCode=t}};function va(e){if(!e||"string"!=typeof e)throw new ka("Model name is required and must be a string");if("foundry"===le.provider)return e;if(!le.models?.data)throw new ka("Models not available. Please try again later.",503);let t=le.models.data.map(e=>e.id);if(t.includes(e))return e;let o=Sn(e,t);if(!o)throw je.add(1,{requested_model:e}),new ka(`Invalid model: '${e}'. Available services: ${t.join(", ")}`);return o}function xa(e){let t=le.models?.data.find(t=>t.id===e)?.supported_endpoints;return t?t.includes("/responses")&&!t.includes("/chat/completions"):"foundry"===le.provider?mn(e):/gpt-[\d.]+-codex/i.test(e)}async function Ta(e){if(void 0===e.rateLimitSeconds||ne())return;let t=e.rateLimitSeconds;return Ee.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"),De.add(1,{action:"rejected",source:"local"}),o.warn(`Rate limit exceeded. Need to wait ${i} more seconds.`),new io("Rate limit exceeded",Response.json({message:"Rate limit exceeded"},{status:429}));let s=1e3*i;n.setAttribute("copilot_api.rate_limit.action","waited"),De.add(1,{action:"waited",source:"local"}),Ze.record(s,{source:"local"}),o.warn(`Rate limit reached. Waiting ${i} seconds before proceeding...`),await Jn(s),e.lastRequestTimestamp=r,o.info("Rate limit wait completed, proceeding with request")}finally{n.end()}})}var Aa=class extends Error{name="UpstreamStreamError";type;constructor(e,t){super(t),this.type=e}};function $a(e){if(e instanceof Aa)return{type:e.type,message:e.message};if(e instanceof io){let t=e.response.status;return{type:529===t?"overloaded_error":`upstream_error_${t}`,message:`Upstream error (${t}) while streaming response`}}return{type:"api_error",message:"Stream interrupted before completion"}}async function Sa(e,t){let{type:n,message:r}=$a(t);try{await e.writeSSE({event:"error",data:JSON.stringify({type:"error",error:{type:n,message:r}})})}catch(e){o.debug("Failed to emit Anthropic stream error frame:",e)}}async function Ea(e,t){let{type:n,message:r}=$a(t);try{await e.writeSSE({event:"error",data:JSON.stringify({error:{message:r,type:n}})})}catch(e){o.debug("Failed to emit OpenAI stream error frame:",e)}}function Oa(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 Ca(e,t,o){return Math.min(Math.max(e,t),o)}function Ia(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 Ia(JSON.parse(r),t+1)}catch{return null}}function Ra(e,t){let o=e?.data.find(e=>e.id===t);if(!o)return null;let n=Oa(o.capabilities.supports.min_thinking_budget),r=Oa(o.capabilities.supports.max_thinking_budget);return!n||!r||r<=n?null:{bounds:{min:n,max:r-1},maxOutputTokens:Oa(o.capabilities.limits?.max_output_tokens)??void 0}}function Na(e){let{config:t}=e,o=t.bounds.min,n=t.bounds.max,r=Ca(Oa(e.requestedBudget)??o,o,n),a=Oa(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 Pa(e,t){if(Wn(e.thinking_budget))return e;let o=Ra(t,e.model);if(!o)return{...e,thinking_budget:void 0};let n=Na({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 qa(e){return"invalid_thinking_budget"===Ia(e)}async function Da(e){let{payload:t,error:o,models:n,errorBodyText:r}=e;if(Wn(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(!qa(i))return null;let l=Ra(n,t.model);return l?function(e,t){let o=Na({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=Oa(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 ja(e,t){let o=!1;return()=>{if(o)return;o=!0;let n=e.get("requestData")||{};n.upstreamTtfbMs=performance.now()-t,e.set("requestData",n)}}function Ma(e,t){let o=e.get("requestData")||{};o.upstreamTotalMs=performance.now()-t,o._d1=o.upstreamTotalMs,e.set("requestData",o)}const Fa=new Map,Ha=new Map,Ua=new Set;let Ba,La,za;function Ga(e){return!e.closed&&!e.destroyed}function Ka(e){o.debug(`Creating HTTP/2 client for ${e}`);let t=new I(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4194304,connectionWindowSize:16777216});return Fa.set(t,Date.now()),Je.add(1,{event:"created",origin:e}),it(w.INFO,"INFO",`HTTP/2 client created for ${e}`,{"copilot_api.h2.event":"created","copilot_api.h2.origin":e}),t.on("connect",()=>{o.debug(`HTTP/2 client connected to ${e}`)}),t.on("error",t=>{o.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on("disconnect",(n,r,a)=>{o.debug(`HTTP/2 client disconnected from ${e}:`,a.message);let i=Ua.has(t);Je.add(1,{event:"goaway",origin:e}),it(i?w.WARN:w.DEBUG,i?"WARN":"DEBUG",`HTTP/2 client disconnected from ${e}: ${a.message}`,{"copilot_api.h2.event":"goaway","copilot_api.h2.origin":e,"copilot_api.h2.error":a.message}),Ha.delete(t),Ua.delete(t),Fa.delete(t),Ga(t)&&t.close().catch(e=>{o.debug("Error closing GOAWAY'd HTTP/2 client:",e)})}),t}function Ja(e,t){if(!le.connectivity.h2)return;if(Ba&&Ba!==e&&function(){for(let e of[...Ha.keys(),...Ua])Ga(e)&&e.close().catch(e=>{o.debug("Error closing HTTP/2 pool entry:",e)});Ha.clear(),Ua.clear(),Fa.clear()}(),Ba=e,t?.fresh){let t=Ka(e);return Ua.add(t),t}let n=Date.now();for(let[t]of Ha)if(n-(Fa.get(t)??0)>=6e5)Ha.delete(t),Fa.delete(t),Ga(t)&&t.close().catch(e=>{o.debug("Error closing rotated HTTP/2 client:",e)}),Je.add(1,{event:"rotated",origin:e}),it(w.INFO,"INFO",`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"copilot_api.h2.event":"rotated","copilot_api.h2.origin":e});else{if(Ga(t))return Ha.delete(t),Ua.add(t),t;Ha.delete(t),Fa.delete(t)}let r=Ka(e);return Ua.add(r),r}function Wa(e){e&&Ua.delete(e)&&(Ga(e)?Ha.set(e,Date.now()):Fa.delete(e))}function Ya(){za||(za=setInterval(()=>{!function(){let e=Date.now(),t=le.connectivity.h2Keepalive,n=Ha.size;for(let[r,a]of Ha)e-a<6e4||t&&n<=1||(Ha.delete(r),Fa.delete(r),n--,Ga(r)&&r.close().catch(e=>{o.debug("Error closing idle HTTP/2 client:",e)}),Je.add(1,{event:"idle_reaped",origin:Ba??""}),it(w.INFO,"INFO",`HTTP/2 idle connection reaped for ${Ba}`,{"copilot_api.h2.event":"idle_reaped","copilot_api.h2.origin":Ba??""}))}()},3e4),za.unref())}function Va(){La||(o.debug("Starting HTTP/2 keepalive (every 45s)"),La=setInterval(()=>{(async function(){if(0===Ha.size&&0===Ua.size){if(Ba){let e=Ka(Ba);Ha.set(e,Date.now())}return}let e=[...Ha.keys()];for(let t of e)Ha.delete(t);await Promise.allSettled(e.map(async e=>{if(Ga(e))try{let{statusCode:t,body:n}=await e.request({path:"/models",method:"GET",headers:vt(le)});await n.dump(),Ke.add(1,{result:"success"}),o.debug(`HTTP/2 keepalive: GET /models → ${t}`),Ha.set(e,Date.now())}catch(t){Ke.add(1,{result:"error"}),o.warn("HTTP/2 keepalive failed:",t instanceof Error?t.message:t),Je.add(1,{event:"error",origin:Ba??""}),Fa.delete(e),Ga(e)&&e.close().catch(e=>{o.debug("Error closing broken HTTP/2 client:",e)})}else Fa.delete(e)}))})().catch(e=>{o.debug("Unexpected error in HTTP/2 keepalive:",e)})},45e3),La.unref(),Ya())}function Xa(e,t){if(e instanceof ReadableStream)return new Response(e,t);let o,n=new ReadableStream({async pull(t){o??=e[Symbol.asyncIterator]();let n=await o.next();n.done?t.close():t.enqueue(n.value)},cancel(t){e.on("error",()=>{}),e.destroy(t instanceof Error?t:void 0)}});return new Response(n,t)}function Za(e){return e.max_completion_tokens??e.max_tokens}async function Qa(e,t,o){try{if(!e.ok)throw new io("Failed to create chat completions",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&ba(t,n.usage),n}catch(e){throw st(t,e),e}finally{t.end()}}const ei=e=>on(le)?e:function(e,t){if(!function(e,t){return(t?.data.find(t=>t.id===e)?.capabilities.family??e).startsWith("gpt-5")}(e.model,t)){let{max_completion_tokens:t,...o}=e;return null==t?o:{...o,max_tokens:t}}let{max_tokens:o,max_completion_tokens:n,stop:r,...a}=e,i=Za(e);return null==i?a:{...a,max_completion_tokens:i}}(e,le.models),ti=e=>on(le)?e:la(e),oi=async e=>{let t=ti(e);try{return await ri(t)}catch(e){if(e instanceof io&&401===e.response.status){if(!await Ko(e))throw e;return ri(t)}let n;if(e instanceof io)try{n=await e.response.clone().text()}catch{n=void 0}let r=await Da({payload:t,error:e,models:le.models,errorBodyText:n});if(r)return e instanceof io&&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 ri(ti(r));throw e}},ni=async(e,t)=>{let o=Hn(e);return o?(t.setAttribute("copilot_api.foundry.throttled_stream",!0),t.setAttribute("copilot_api.upstream.effective_status",429),t.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(e.body?.cancel()),t.end(),o):(e.ok||t.end(),e.ok?void 0:e)},ri=async e=>{if(!sn(le))throw Error("Service token not found");let t=e.messages.some(e=>"string"!=typeof e.content&&e.content?.some(e=>"image_url"===e.type)),o=e.messages.some(e=>["assistant","tool"].includes(e.role)),n={...an(le,t),"X-Initiator":o?"agent":"user"},r=rn(le),a=`${r}/chat/completions`,i=le.timeoutMs,s=ei(e),l=JSON.stringify(s),c={"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":i,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.message_count":e.messages.length,"copilot_api.max_tokens":Za(e)??0,"copilot_api.vision_enabled":t,"copilot_api.initiator":o?"agent":"user","copilot_api.upstream.provider":le.provider};for(let t=0;t<=1;t++){ie();let o=Ja(r,{fresh:t>0}),s=new AbortController,u=Bn(s,i);try{let{statusCode:r,headers:p,body:d,span:m}=await mt({spanName:"copilot POST /chat/completions",url:a,target:"chat_completions",headers:n,body:l,signal:s.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...c,"copilot_api.h2.retry_attempt":t},dispatcher:o}).finally(u.headersArrived),f=Xa(d,{status:r,headers:p});if(e.stream){let e=await ni(f,m);if(e)throw new io("Failed to create chat completions",e,{outgoingBody:l,outgoingHeaders:n});return{events:B(f),span:m,release:()=>Wa(o)}}try{return await Qa(f,m,{outgoingBody:l,outgoingHeaders:n})}finally{Wa(o)}}catch(e){if(Wa(o),await ao(e,{attempt:t,maxRetries:1,operation:"chat completions"}))continue;throw e}finally{u.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},ai=new Map;const ii=["none","minimal","low","medium","high","xhigh","max"];function si(e,t){if(!e.reasoning)return e;if(0===t.length){let{reasoning:t,...o}=e;return o}let o=e.reasoning.effort;if(!o)return e;let n=function(e,t){if(t.includes(e))return e;let o=ii.indexOf(e);if(-1===o)return t[0];let n,r=1/0;for(let e of t){let t=ii.indexOf(e);if(-1===t)continue;let a=Math.abs(t-o);a<r&&(r=a,n=e)}return n??t[0]}(o,t);return n&&n!==o?{...e,reasoning:{...e.reasoning,effort:n}}:e}function li(e,t){if(!e.reasoning)return null;let n=function(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}let{param:o,code:n,message:r=""}=t.error??{};if("reasoning.effort"===o||"reasoning"===o){if("unsupported_value"===n){let e=[...(/Supported values are:(.*)$/i.exec(r)?.[1]??"").matchAll(/\x27([^\x27]+)\x27/g)].map(e=>e[1]);return e.length>0?{kind:"unsupported_value",supported:e}:void 0}if("unsupported_parameter"===n)return{kind:"unsupported_parameter"}}}(t);if(!n)return null;let r="unsupported_value"===n.kind?n.supported:[];ai.set(e.model,r);let a=si(e,r);return a===e?null:(o.debug(`Foundry rejected reasoning.effort=${e.reasoning.effort} on ${e.model}; retrying with ${a.reasoning?.effort??"no reasoning"}`),a)}async function ci(e,t,o){try{if(!e.ok)throw new io("Failed to create responses",e,{outgoingBody:o.outgoingBody,outgoingHeaders:o.outgoingHeaders});let n=await e.json();return n.id&&t.setAttribute("copilot_api.response.id",n.id),n.usage&&ba(t,{prompt_tokens:n.usage.input_tokens,completion_tokens:n.usage.output_tokens,total_tokens:n.usage.total_tokens,prompt_tokens_details:n.usage.input_tokens_details}),n}catch(e){throw st(t,e),e}finally{t.end()}}const ui=async(e,t)=>{let o=on(le),n=o?function(e){let t=ai.get(e.model);return t?si(e,t):e}(e):e,r=!1,a=!1;for(;;)try{return t?.onAttempt?.(n),await di(n,t?.signal)}catch(e){if(!(e instanceof io))throw e;if(401===e.response.status&&!r){if(r=!0,!await Ko(e))throw e;continue}if(o&&400===e.response.status&&!a){a=!0;let t=li(n,await e.response.clone().text().catch(()=>{}));if(t){n=t;continue}}throw e}};function pi(e,t){let o,n=()=>{o?.destroy(e?.reason),t.abort(e?.reason)};return e?.aborted?n():e?.addEventListener("abort",n,{once:!0}),{attach:e=>o=e,dispose:()=>e?.removeEventListener("abort",n)}}const di=async(e,t)=>{if(!sn(le))throw Error("Service token not found");let o=on(le)?e:la(e),n={...an(le),"X-Initiator":"agent"},r=rn(le),a=`${r}/responses`,i=le.timeoutMs,s=JSON.stringify(o),l=((e,t)=>({"copilot_api.model":e.model,"copilot_api.streaming":!!e.stream,"copilot_api.timeout_ms":t,"copilot_api.has_tools":!!e.tools?.length,"copilot_api.tool_count":e.tools?.length??0,"copilot_api.max_output_tokens":e.max_output_tokens??0,"copilot_api.api_type":"responses","copilot_api.upstream.provider":le.provider}))(o,i);for(let e=0;e<=1;e++){ie();let c=Ja(r,{fresh:e>0}),u=new AbortController,d=Bn(u,i),m=pi(t,u);try{let{statusCode:t,headers:r,body:f,span:h}=await mt({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}).finally(d.headersArrived);m.attach(f);let g=Xa(f,{status:t,headers:r});if(o.stream){let e=Hn(g);if(e&&(h.setAttribute("copilot_api.foundry.throttled_stream",!0),h.setAttribute("copilot_api.upstream.effective_status",429),h.setStatus({code:p.ERROR,message:"HTTP 200 throttled stream (effective 429)"}),await(g.body?.cancel())),!g.ok||e)throw h.end(),new io("Failed to create responses",e??g,{outgoingBody:s,outgoingHeaders:n});return{events:B(g),span:h,release:()=>{m.dispose(),Wa(c)}}}try{return await ci(g,h,{outgoingBody:s,outgoingHeaders:n})}finally{m.dispose(),Wa(c)}}catch(t){if(m.dispose(),Wa(c),await ao(t,{attempt:e,maxRetries:1,operation:"responses"}))continue;throw t}finally{d.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},mi=e=>Object.hasOwn(e,"output");function fi(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,...t.input_tokens_details&&{prompt_tokens_details:{cached_tokens:t.input_tokens_details.cached_tokens}},...t.output_tokens_details&&{completion_tokens_details:{reasoning_tokens:t.output_tokens_details.reasoning_tokens}}}:null}var hi=class extends Error{name="ChatBridgeRequestError";code;param;constructor(e,t,o=null){super(e),this.code=t,this.param=o}};const gi=new Set(["model","messages","max_tokens","max_completion_tokens","temperature","top_p","stream","stream_options","tools","tool_choice","parallel_tool_calls","user","reasoning_effort","response_format"]);function _i(e){!function(e){if("number"==typeof e.n&&e.n>1)throw new hi(`n > 1 is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","n");if(!0===e.logprobs)throw new hi(`logprobs is not supported for model '${e.model}' (served via the Responses API)`,"unsupported_parameter","logprobs")}(e);let t=function(e){return e.filter(e=>"system"===e.role||"developer"===e.role).map(e=>wi(e.content)).filter(Boolean).join("\n\n")||void 0}(e.messages),o=function(e){let t=[];for(let o of e)switch(o.role){case"user":{let e=bi(o.content);e.length>0&&t.push({type:"message",role:"user",content:e});break}case"assistant":{let e=wi(o.content);e&&t.push({type:"message",role:"assistant",content:[{type:"output_text",text:e}]});for(let e of o.tool_calls??[])t.push({type:"function_call",call_id:e.id,name:e.function.name,arguments:e.function.arguments});break}case"tool":t.push({type:"function_call_output",call_id:o.tool_call_id??"",output:wi(o.content)})}return t}(e.messages);if(0===o.length)throw new hi("request has no translatable message content","invalid_request","messages");let n={model:e.model,input:o,store:!1};t&&(n.instructions=t);let r=e.max_completion_tokens??e.max_tokens;"number"==typeof r&&(n.max_output_tokens=Math.max(r,16)),e.stream&&(n.stream=!0),yi(e.temperature)&&(n.temperature=e.temperature),yi(e.top_p)&&(n.top_p=e.top_p),yi(e.parallel_tool_calls)&&(n.parallel_tool_calls=e.parallel_tool_calls),yi(e.user)&&(n.user=e.user),e.reasoning_effort&&(n.reasoning={effort:e.reasoning_effort}),e.tools?.length&&(n.tools=e.tools.filter(e=>"function"===e.type).map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters}))),e.tool_choice&&(n.tool_choice="string"==typeof e.tool_choice?e.tool_choice:{type:"function",name:e.tool_choice.function.name});let a=function(e){if(e)switch(e.type){case"json_schema":{let{name:t,description:o,schema:n,strict:r}=e.json_schema;return{type:"json_schema",name:t,description:o,schema:n,strict:r}}case"json_object":return{type:"json_object"};default:return{type:"text"}}}(e.response_format);return a&&(n.text={format:a}),n}function yi(e){return null!=e}function wi(e){return"string"==typeof e?e:e?e.filter(e=>"text"===e.type).map(e=>e.text).join("\n\n"):""}function bi(e){if("string"==typeof e)return e?[{type:"input_text",text:e}]:[];let t=[];for(let o of e??[])if("text"===o.type)o.text&&t.push({type:"input_text",text:o.text});else{if("image_url"!==o.type)throw new hi(`content part type '${o.type}' is not supported for models served via the Responses API`,"unsupported_content_type","messages");t.push({type:"input_image",image_url:o.image_url.url,detail:"low"===o.image_url.detail?"low":"high"})}return t}function ki(e){let t={prompt_tokens:e.input_tokens,completion_tokens:e.output_tokens,total_tokens:e.total_tokens};return void 0!==e.input_tokens_details?.cached_tokens&&(t.prompt_tokens_details={cached_tokens:e.input_tokens_details.cached_tokens}),void 0!==e.output_tokens_details?.reasoning_tokens&&(t.completion_tokens_details={reasoning_tokens:e.output_tokens_details.reasoning_tokens}),t}function vi(e,t){if("incomplete"===e.status){let t=e.incomplete_details?.reason;if("content_filter"===t)return"content_filter";if("max_output_tokens"===t)return"length"}return t?"tool_calls":"stop"}function xi(e,t,o=null){let n=e.roleSent?t:{role:"assistant",...t};return e.roleSent=!0,{id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[{index:0,delta:n,logprobs:null,finish_reason:o}]}}function Ti(e,t,o){return e.toolCallIndexByItemId.get(t)??e.toolCallIndexByOutputIndex.get(o)}function Ai(e,t){let o=e.item;if("function_call"!==o.type)return[];let n="response.output_item.done"===e.type,r=Ti(t,o.id,e.output_index);if(void 0!==r)return n&&!t.toolCallsWithArgs.has(r)&&o.arguments?(t.toolCallsWithArgs.add(r),[xi(t,{tool_calls:[{index:r,function:{arguments:o.arguments}}]})]):[];let a=function(e,t,o){let n=e.toolCallCount++;return e.toolCallIndexByItemId.set(t,n),e.toolCallIndexByOutputIndex.set(o,n),n}(t,o.id,e.output_index),i=n?o.arguments:"";return i&&t.toolCallsWithArgs.add(a),[xi(t,{tool_calls:[{index:a,id:o.call_id,type:"function",function:{name:o.name,arguments:i}}]})]}function $i(e,t){let o=[xi(e,{},vi(t,e.toolCallCount>0||t.output.some(e=>"function_call"===e.type)))];if(e.includeUsage&&t.usage){let{prompt_tokens_details:n,...r}=ki(t.usage);o.push({id:e.id,object:"chat.completion.chunk",created:e.created,model:e.model,choices:[],usage:r})}return o}function Si(e,t){switch(e.type){case"response.created":case"response.in_progress":return t.id=e.response.id||t.id,t.model=e.response.model||t.model,e.response.created_at&&(t.created=e.response.created_at),{chunks:[]};case"response.output_text.delta":case"response.refusal.delta":return e.delta?{chunks:[xi(t,{content:e.delta})]}:{chunks:[]};case"response.output_item.added":case"response.output_item.done":return"function_call"===e.item.type?{chunks:Ai(e,t)}:{chunks:[]};case"response.function_call_arguments.delta":{let o=Ti(t,e.item_id,e.output_index);return void 0!==o&&e.delta?(t.toolCallsWithArgs.add(o),{chunks:[xi(t,{tool_calls:[{index:o,function:{arguments:e.delta}}]})]}):{chunks:[]}}case"response.completed":case"response.incomplete":case"response.cancelled":return{chunks:$i(t,e.response),done:!0};case"response.failed":return{chunks:[],error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}};case"error":return{chunks:[],error:{type:e.code??"api_error",message:e.message??"Response generation failed"}};default:return{chunks:[]}}}const Ei="openai_responses";function Oi(e){let t=performance.now(),n=Ee.startActiveSpan("copilot_api.translate.openai_to_responses",t=>{try{return t.setAttribute("copilot_api.translation.direction","openai_to_responses"),t.setAttribute("copilot_api.translation.message_count",e.messages.length),t.setAttribute("copilot_api.translation.has_tools",!!e.tools?.length),_i(e)}finally{t.end()}});Qe.record(performance.now()-t,{direction:"openai_to_responses"});let r=function(e){return Object.entries(e).filter(([e,t])=>!gi.has(e)&&null!=t).map(([e])=>e)}(e);return r.length>0&&o.debug(`Dropped chat-only fields with no Responses API equivalent: ${r.join(", ")}`),n}function Ci(e){let t=performance.now(),o=Ee.startActiveSpan("copilot_api.translate.responses_to_openai",t=>{try{return t.setAttribute("copilot_api.translation.direction","responses_to_openai"),function(e){let t="",o=!1,n=[];for(let r of e.output)if("message"===r.type)for(let e of r.content)"output_text"===e.type?(t+=e.text,o=!0):"refusal"===e.type&&(t+=e.refusal,o=!0);else"function_call"===r.type&&n.push({id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments}});let r={id:e.id,object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:o?t:null,...n.length>0&&{tool_calls:n}},logprobs:null,finish_reason:vi(e,n.length>0)}]};return e.usage&&(r.usage=ki(e.usage)),r}(e)}finally{t.end()}});return Qe.record(performance.now()-t,{direction:"responses_to_openai"}),o}function Ii(e,t,r){let a=e.get("requestData")||{};if(t.usage){let{completion_tokens_details:e,...o}=ki(t.usage);a.tokenUsage=wa(o)}return a._d1=r,a.upstreamTtfbMs=r,a.upstreamTotalMs=r,e.set("requestData",a),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(t).slice(-400)),"failed"===t.status?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({error:{message:t.error?.message??"Response generation failed",type:"api_error",code:t.error?.code??null}},500)):e.json(Ci(t))}async function Ri(e,t,n){let r;try{r=Oi(t)}catch(t){if(t instanceof hi)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t.message,type:"invalid_request_error",param:t.param,code:t.code}},400);throw t}o.debug("Translated chat → Responses API payload:",JSON.stringify(r).slice(-400)),e.set("requestData",{model:r.model,streaming:!!r.stream}),le.manualApprove&&!n.isSelfTest&&await _a();let a=await ya(e);if(a)return a;let i=performance.now(),s=await ui(r),l=performance.now()-i;if(Ve.record(l,{model:r.model,target:"responses",streaming:String(!!r.stream)}),mi(s))return Ii(e,s,l);let{events:c,span:u,release:p}=s,d=function(e){return{id:"",model:e.model,created:Math.floor(Date.now()/1e3),includeUsage:e.includeUsage,roleSent:!1,toolCallCount:0,toolCallIndexByItemId:new Map,toolCallIndexByOutputIndex:new Map,toolCallsWithArgs:new Set}}({model:r.model,includeUsage:!0===t.stream_options?.include_usage});return U(e,async t=>{let n=null,a=0,s=performance.now(),m=ja(e,i);try{try{for await(let i of c){if(m(),!i.data||"[DONE]"===i.data)continue;let s;try{s=JSON.parse(i.data)}catch(e){o.warn("Failed to parse streaming chunk:",i.data.slice(0,200),e);continue}a++,ze.add(1,{model:r.model,endpoint_type:Ei});let c=fi(s);if(c){n=c;let t=e.get("requestData")||{};t.tokenUsage=wa(c),t._d1=l,e.set("requestData",t)}let u=Si(s,d);if(u.error)throw new Aa(u.error.type,u.error.message);for(let e of u.chunks)await t.writeSSE({data:JSON.stringify(e)});u.done&&await t.writeSSE({data:"[DONE]"})}let u={model:r.model,endpoint_type:Ei};Xe.record(performance.now()-s,u),rt.record(a,u),Ma(e,i)}catch(o){throw lt(u,e.get("requestSpan"),o),await Ea(t,o),o}finally{n&&ba(u,n),u.end(),p()}let f=e.get("requestId");f&&ke.executeCompletion(f)}finally{e.get("resolveStreamComplete")?.()}})}function Ni(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 Pi(e){let t=!0===e.get("isSelfTest");t||await Ta(le);let n=await e.req.json();o.debug("Request payload:",JSON.stringify(n).slice(-400));try{n=function(e){return Ee.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=va(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),Me.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}(n)}catch(t){if(t instanceof ka)return f.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(xa(n.model))return Ri(e,n,{isSelfTest:t});e.set("requestData",{model:n.model,streaming:!!n.stream}),le.manualApprove&&!t&&await _a(),"foundry"!==le.provider&&(n=function(e){if(!Wn(e.max_completion_tokens)){let{max_completion_tokens:t,...o}=e;return{...o,max_tokens:t}}if(!Wn(e.max_tokens))return e;let t=(le.models?.data.find(t=>t.id===e.model))?.capabilities.limits?.max_output_tokens;return o.debug("Set max_tokens to:",JSON.stringify(t)),{...e,max_tokens:t}}(n),n=Pa(n,le.models)),Wn(n.thinking_budget)||o.debug("Normalized thinking_budget to:",JSON.stringify(n.thinking_budget));let r=await ya(e);if(r)return r;let a=performance.now(),i=await oi(n),s=performance.now()-a;if(Ve.record(s,{model:n.model,target:"chat_completions",streaming:String(!!n.stream)}),qi(i)){let t=e.get("requestData")||{};return i.usage&&(t.tokenUsage=wa(i.usage)),t._d1=s,t.upstreamTtfbMs=s,t.upstreamTotalMs=s,e.set("requestData",t),o.debug("Non-streaming response:",JSON.stringify(i)),e.json(i)}let{events:l,span:c,release:u}=i;return U(e,async t=>{let o={value:null},r=0,i=performance.now(),p=ja(e,a);try{try{for await(let a of l){p();let i=a;a.data&&"[DONE]"!==a.data&&(r++,ze.add(1,{model:n.model,endpoint_type:"openai"}),i=Ni(a,t=>{o.value=t;let n=e.get("requestData")||{};n.tokenUsage=wa(t),n._d1=s,e.set("requestData",n)})),await t.writeSSE(i)}let c=performance.now()-i,u={model:n.model,endpoint_type:"openai"};if(Xe.record(c,u),rt.record(r,u),Ma(e,a),o.value){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=wa(o.value),t._d1=s,e.set("requestData",t))}}catch(o){throw lt(c,e.get("requestSpan"),o),await Ea(t,o),o}finally{o.value&&ba(c,o.value),c.end(),u()}let d=e.get("requestId");d&&ke.executeCompletion(d)}finally{e.get("resolveStreamComplete")?.()}})}const qi=e=>Object.hasOwn(e,"choices"),Di=new M;Di.post("/",async e=>{try{return await Kn(e,"chat",Pi)}catch(t){return await Io(e,t)}});const ji=async e=>{if(!sn(le))throw Error("Service token not found");let t=`${rn(le)}/embeddings`,o=an(le),n=le.timeoutMs,r=new AbortController,a=lo(r,n),i=JSON.stringify(e);try{let{response:n,span:a}=await dt({spanName:"copilot POST /embeddings",url:t,target:"embeddings",method:"POST",headers:o,body:i,signal:r.signal,extraAttributes:{"copilot_api.model":e.model,"copilot_api.input_count":Array.isArray(e.input)?e.input.length:1,"copilot_api.upstream.provider":le.provider}});try{if(!n.ok)throw new io("Failed to create embeddings",n,{outgoingBody:i,outgoingHeaders:o});return await n.json()}catch(e){throw st(a,e),e}finally{a.end()}}finally{clearTimeout(a)}},Mi=new M;Mi.post("/",async e=>{try{let t=await e.req.json();try{t.model=va(t.model)}catch(t){if(t instanceof ka)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode);throw t}e.set("requestData",{model:t.model});let o=await ya(e);if(o)return o;let n=performance.now(),r=await(async e=>{try{return await ji(e)}catch(t){if(t instanceof io&&401===t.response.status){if(!await Ko(t))throw t;return ji(e)}throw t}})(t),a=performance.now()-n;Ve.record(a,{model:t.model,target:"embeddings",streaming:"false"});let i=e.get("requestData")||{};return i.tokenUsage=wa(r.usage),i._d1=a,e.set("requestData",i),e.json(r)}catch(t){return await Io(e,t)}});const Fi=new M;let Hi=null,Ui=null;function Bi(e){return"type"in e&&"string"==typeof e.type&&e.type.startsWith("web_search")}function Li(e){return!Bi(e)}Fi.get("/",async e=>{let t,o=function(){if(on(le)){if(!sn(le))return"missing";let e=le.foundry?.bearerExpiresAt;return void 0!==e&&e<=Date.now()?"expired":"valid"}let e=le._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=Hi;return t&&e-t.timestamp<3e4?{result:t.result}:Ui||(Ui=(async()=>{let e=new AbortController,t=setTimeout(()=>e.abort(),5e3),o=performance.now();try{let t=`${rn(le)}/models`,n=await fetch(t,{method:"GET",headers:an(le),signal:e.signal}),r=Math.round(performance.now()-o),a=n.ok?"reachable":"unreachable";return Hi={result:a,timestamp:Date.now()},{result:a,latencyMs:r}}catch{let e=Math.round(performance.now()-o);return Hi={result:"unreachable",timestamp:Date.now()},{result:"unreachable",latencyMs:e}}finally{clearTimeout(t),Ui=null}})(),Ui)}();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.44.0-preview.22",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 zi=new L(G);let Gi;const Ki={...z["anthropic/claude-sonnet-4"].tokens,baseOverhead:4,perTool:27};function Ji(e,t){try{return e.encode(t,[],[]).length}catch(e){return o.debug("count_tokens: tokenizer failed, using length/4",e),Math.ceil(t.length/4)}}function Wi(e,t){let o=0;for(let n of e)switch(n.type){case"text":o+=t(n.text)*Ki.contentMultiplier;break;case"tool_use":o+=t(n.name+JSON.stringify(n.input))*Ki.contentMultiplier;break;case"tool_result":n.content&&(o+=t("string"==typeof n.content?n.content:JSON.stringify(n.content))*Ki.contentMultiplier);break;case"thinking":o+=t(n.thinking)*Ki.contentMultiplier;break;case"image":o+=1600}return o}function Yi(e,t){let o=0,n=e.properties;if(!n)return o;let r=Object.entries(n);for(let[e,[n,a]]of r.entries()){if(o+=0===e?Ki.perFirstProp:Ki.perAdditionalProp,o+=t(n),a.description&&(o+=Ki.perPropDesc+t(a.description)),a.enum&&Array.isArray(a.enum)){o+=Ki.perEnum;for(let e of a.enum)o+=t(String(e))}if("object"===a.type&&a.properties&&(o+=Ki.perNestedObject,o+=Yi(a,t)),"array"===a.type&&a.items){let e=a.items;"object"===e.type&&e.properties&&(o+=Ki.perArrayOfObjects,o+=Yi(e,t))}}return o}const Vi={event:"ping",data:JSON.stringify({type:"ping"})};function Xi(e,t=15e3){let o,n=performance.now(),r=!1,a=()=>{if(r||e.aborted||e.closed)return void(o=void 0);let i=performance.now()-n;i>=t?(n=performance.now(),e.writeSSE(Vi).catch(()=>{}),o=setTimeout(a,t)):o=setTimeout(a,t-i)};return o=setTimeout(a,t),{writeSSE:async t=>{await e.writeSSE(t),n=performance.now()},stop:()=>{r=!0,clearTimeout(o),o=void 0}}}function Zi(e,t){let o={"copilot_api.context_1m_beta":/context-1m/i.test(t??"")},n=e.thinking;if(n&&"object"==typeof n){let{type:e,budget_tokens:t}=n;"string"==typeof e&&(o["copilot_api.thinking.type"]=e),"number"==typeof t&&t&&(o["copilot_api.thinking.budget_tokens"]=t)}let r=e.output_config?.effort;return"string"==typeof r&&r&&(o["copilot_api.output_config.effort"]=r),o}function Qi(e,t,o){let n=Zi(t,o);for(let[t,o]of Object.entries(n))void 0!==o&&e.setAttribute(t,o)}const es=async(e,t,n)=>{try{return await ts(e,t)}catch(r){if(r instanceof io&&401===r.response.status){if(!await Ko(r))throw r;return ts(e,t)}if(r instanceof io&&400===r.response.status&&n?.onStructuredOutputFallback){let a;try{a=await r.response.clone().text()}catch{a=void 0}let i=n.onStructuredOutputFallback(e,a);if(i)return o.warn(`Upstream rejected structured outputs on ${e.model}; retrying once against ${i.model}`),ts(i,t)}throw r}};const ts=async(e,t)=>{if(!sn(le))throw Error("Service token not found");let{baseUrl:o,headers:n,cleanPayload:r}=on(le)&&le.foundry?{baseUrl:en(le.foundry),headers:tn(le.foundry,t),cleanPayload:e}:function(e,t){let{metadata:o,...n}=e,r=function(e){return e.context_management?["context-management-2025-06-27"]:[]}(n),a={...Tt(le,t,r),"X-Initiator":"agent"};return{baseUrl:kt(le),headers:a,cleanPayload:n}}(la(e),t),a=`${o}/v1/messages`,i=le.timeoutMs,s=JSON.stringify(r),l=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","copilot_api.upstream.provider":le.provider,...Zi(e,t?.anthropicBeta)}}(r,t,i);for(let e=0;e<=1;e++){ie();let t=Ja(o,{fresh:e>0}),c=new AbortController,u=Bn(c,i);try{let{statusCode:o,headers:p,body:d,span:m}=await mt({spanName:"copilot POST /v1/messages",url:a,target:"anthropic_messages",headers:n,body:s,signal:c.signal,headersTimeout:i,bodyTimeout:3*i,extraAttributes:{...l,"copilot_api.h2.retry_attempt":e},dispatcher:t}).finally(u.headersArrived),f=Xa(d,{status:o,headers:p});if(!f.ok)throw m.end(),new io("Failed to create anthropic messages",f,{outgoingBody:s,outgoingHeaders:n});if(r.stream)return{events:B(f),span:m,release:()=>Wa(t)};try{let e=await f.json();"string"==typeof e.id&&m.setAttribute("copilot_api.response.id",e.id);let t=e.usage;return t&&ba(m,{prompt_tokens:t.input_tokens??0,completion_tokens:t.output_tokens??0,total_tokens:(t.input_tokens??0)+(t.output_tokens??0)}),e}finally{m.end(),Wa(t)}}catch(o){if(Wa(t),await ao(o,{attempt:e,maxRetries:1,operation:"anthropic messages"}))continue;throw o}finally{u.clear()}}throw Error("Unexpected: exhausted GOAWAY retries without result")},os=new Set(["low","medium","high","max","xhigh"]),ns=(e,t)=>!(!e||!t||e===t);function rs(e){let t=e.output_config?.effort;if("string"!=typeof t||!t||!os.has(t))return e;let n=le.models?.data.find(t=>t.id===e.model)?.capabilities.supports.reasoning_effort,r=On(t,n);if(!r||!os.has(r))return e;let a=r;if(a===t)return e;o.debug(`Effort clamp: ${t} → ${a}`);let i=f.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 as(e,t,n){if("foundry"===le.provider)return rs(e);let r=t.includes(e.model)?e.model:Sn(e.model,t)??e.model,a=r===e.model?e:{...e,model:r},i=function(e,t,o={}){let n=Sn(e,t);return n&&o.context1m?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,new Set(t)):null}(a.model,t,{context1m:n.context1m}),s=a;if(i&&i!==a.model){o.debug(`Resolved model variant: ${a.model} → ${i}`);let e=f.getActiveSpan();e?.setAttribute("copilot_api.model.variant_resolved_from",a.model),e?.setAttribute("copilot_api.model.variant_resolved_to",i),s={...a,model:i}}return rs(s)}const is=e=>"object"==typeof e&&!!e&&!Array.isArray(e),ss=["properties","patternProperties","$defs","definitions"],ls=["items","additionalProperties","propertyNames","contains","not","if","then","else"],cs=["anyOf","allOf","oneOf","prefixItems"];const us=()=>["string","number","boolean"].map(e=>({type:e})),ps=()=>({anyOf:[...us(),{type:"array",items:{anyOf:us()}},{type:"object"}]}),ds=e=>!0===e||is(e)&&0===Object.keys(e).length,ms=e=>"array"===e.type||Array.isArray(e.type)&&e.type.includes("array");function fs(e,t){let o={...e};for(let e of ss){let n=o[e];is(n)&&(o[e]=Object.fromEntries(Object.entries(n).map(([e,o])=>[e,is(o)?fs(o,t):o])))}for(let e of ls){let n=o[e];is(n)&&(o[e]=fs(n,t))}for(let e of cs){let n=o[e];Array.isArray(n)&&(o[e]=n.map(e=>is(e)?fs(e,t):e))}return"prefixItems"in o&&(t.add("prefixItems"),function(e){let t=Array.isArray(e.prefixItems)?[...e.prefixItems]:[];delete e.prefixItems,(is(e.items)||!0===e.items)&&t.push(e.items),delete e.items;let o=t.flatMap(e=>ds(e)?ps().anyOf:is(e)?[e]:[]);if(0===o.length)return;let n=[...new Map(o.map(e=>[JSON.stringify(e),e]))].map(([,e])=>e);e.items=1===n.length?n[0]:{anyOf:n}}(o)),ms(o)&&(!("items"in o)||ds(o.items))&&(t.add("items"),o.items=ps()),ds(o.additionalProperties)&&(t.add("additionalProperties"),delete o.additionalProperties),o}function hs(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{if(o.length>0){o.push(n);break}let e=_s(n);e&&t.push(e);break}case"user":case"assistant":o.push(n)}return{leadingSystemTexts:t,messages:o}}function gs(e){return ys(_s(e))}function _s(e){return"string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.flatMap(e=>"text"===e.type&&"string"==typeof e.text?[e.text]:[]).join("\n\n"):""}function ys(e){if(!e.startsWith("x-anthropic-billing-header:"))return e;let t=e.indexOf("\n");return-1===t?"":e.slice(t).replace(/^\n+/,"")}function ws(e,t){return["string"==typeof e?e:(e??[]).map(e=>e.text).join("\n\n"),...t].map(e=>ys(e)).filter(Boolean).join("\n\n")}const bs=new Map([["user",new Set(["text","image","tool_result"])],["assistant",new Set(["text","tool_use","thinking"])],["system",new Set(["text"])]]),ks=new Set(["text","image"]);function vs(e,t){if(Array.isArray(e?.content))for(let o of e.content){if(t.size>=20)return;let e=String(o?.type).slice(0,64);ks.has(e)||t.add(`block:tool_result:${e}`)}}const xs=new Set;function Ts(e,t){e.setAttribute("copilot_api.translation.system_message_count",t.filter(e=>"system"===e.role).length),e.setAttribute("copilot_api.translation.has_images",function(e){return e.some(e=>Array.isArray(e.content)&&e.content.some(e=>"image"===e.type||"tool_result"===e.type&&Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)))}(t));let o=function(e){let t=new Set;for(let o of e){if(t.size>=20)break;let e=String(o.role).slice(0,64),n=bs.get(e);if(n){if(Array.isArray(o.content))for(let r of o.content){let o=String(r?.type).slice(0,64);if(n.has(o)||t.add(`block:${e}:${o}`),"tool_result"===o&&vs(r,t),t.size>=20)break}}else t.add(`role:${e}`)}return[...t].sort()}(t);if(0===o.length)return;e.setAttribute("copilot_api.translation.unknown_shapes",o.join(","));let n=function(e){let t=[];for(let o of e){if(xs.size>=100)break;xs.has(o)||(xs.add(o),t.push(o))}return t}(o);0!==n.length&&r.warn(`Request contains message shapes the translator does not handle (dropped): ${n.join(", ")}`)}const As=e=>N("sha256").update(e).digest("hex").slice(0,12);function $s(e,t){e.setAttribute("copilot_api.translation.system_hash",As(t.system)),e.setAttribute("copilot_api.translation.tools_hash",As(JSON.stringify(t.tools??[])))}function Ss(e){return null===e?null:{stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"end_turn"}[e]}function Es(e){return e.toLowerCase().startsWith("claude-")}function Os(e,t){let o={model:e.model,messages:Cs(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:Ms(e.tools,e.model),tool_choice:Fs(e.tool_choice)},n=e.thinking;if("enabled"===n?.type||"adaptive"===n?.type){let r=Ra(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:"medium"===e?8e3:"low"===e?1024:16e3}(e,o.max),r=Oa(t),a=r&&r>1?r-1:o.min;return Ca(Math.min(n,a),o.min,o.max)}(e.output_config?.effort??"high",o.max_tokens,r.bounds);o=Pa({...o,thinking_budget:a},t)}}return o}function Cs(e,t){let{leadingSystemTexts:o,messages:n}=hs(e),r=function(e,t){let o=ws(e,t);return o?[{role:"system",content:o}]:[]}(t,o),a=[];for(let e of n)switch(e.role){case"system":{let t=gs(e);if(!t)break;Is(r)?a.push(t):Rs(r,t);break}case"user":r.push(...Ns(e));for(let e of a)Rs(r,e);a=[];break;case"assistant":r.push(...Ps(e))}for(let e of a)Rs(r,e);return r}function Is(e){let t=e.at(-1);return"assistant"===t?.role&&!!t.tool_calls?.length}function Rs(e,t){let o=function(e){return e.trimStart().startsWith("<system-reminder>")?e:`<system-reminder>\n${e}\n</system-reminder>`}(t),n=e.at(-1);"user"===n?.role?Array.isArray(n.content)?n.content.push({type:"text",text:o}):n.content=n.content?`${n.content}\n\n${o}`:o:e.push({role:"user",content:o})}function Ns(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:js(e.content)});n.length>0&&t.push({role:"user",content:js(n)})}else t.push({role:"user",content:js(e.content)});return t}function Ps(e){let t=function(e){return{reasoning_text:Ds(e.reasoning_text),reasoning_opaque:Ds(e.reasoning_opaque)}}(e);if(!Array.isArray(e.content))return[{role:"assistant",content:js(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:js(e.content),...t}]}const qs=32768;function Ds(e){if("string"==typeof e)return e.length<=qs?e:e.slice(0,qs)}function js(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 Ms(e,t){if(!e)return;let o=e.filter(Li),n=function(e){return e.toLowerCase().startsWith("gemini")}(t),r=new Set,a=o.map(e=>{let t=e.input_schema;if(n){let e=function(e){let t=new Set;return{schema:fs(e,t),rewritten:[...t]}}(t);t=e.schema;for(let t of e.rewritten)r.add(t)}return{type:"function",function:{name:e.name,description:e.description,parameters:t}}});return r.size>0&&f.getActiveSpan()?.setAttribute("copilot_api.translation.schema_keywords_rewritten",[...r].sort().join(",")),a}function Fs(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 Hs(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 Us(e){return e.reasoning_text?[{type:"thinking",thinking:e.reasoning_text}]:[]}function Bs(e){return e?e.map(e=>{let t={};try{t=JSON.parse(e.function.arguments)}catch{r.warn(`Failed to parse tool call arguments for "${e.function.name}": ${e.function.arguments.slice(0,200)}`)}return{type:"tool_use",id:e.id,name:e.function.name,input:t}}):[]}const Ls=new Set(["low","medium","high","max","xhigh"]);function zs(e,t){let o=e.thinking;if(!o||"enabled"!==o.type)return e;let n=t?.data.find(t=>t.id===e.model);if(!n||!n.capabilities.supports.adaptive_thinking)return e;let r={...e,thinking:{type:"adaptive"}};if(!e.output_config?.effort){let t=(e=>null!==e&&Ls.has(e)?e:null)(On(function(e){return!e||e<=0?"medium":e<8e3?"low":e<24e3?"medium":"high"}(o.budget_tokens),n.capabilities.supports.reasoning_effort));t&&(r.output_config={...e.output_config,effort:t})}return r}function Gs(e){return"string"!=typeof e&&Array.isArray(e)?e.map(e=>{let t=e;if(!t.cache_control||"object"!=typeof t.cache_control)return e;let o=t.cache_control;if("string"!=typeof o.type){let{cache_control:e,...o}=t;return o}let n={type:o.type};return void 0!==o.ttl&&(n.ttl=o.ttl),{...t,cache_control:n}}):e}const Ks=/[^\w-]/g;function Js(e){return e.replaceAll(Ks,"_")}function Ws(e,t){let o=function(e,t){if(!e.output_config?.effort)return e;let o=t?.data.find(t=>t.id===e.model);if(!o)return e;let n=o.capabilities.supports.reasoning_effort;if(Array.isArray(n)&&n.length>0)return e;let{effort:r,...a}=e.output_config;if(0===Object.keys(a).length){let{output_config:t,...o}=e;return o}return{...e,output_config:a}}(e,t);return o=zs(o,t),o=function(e,t){let o=e.max_tokens;if("number"!=typeof o)return e;let n=t?.data.find(t=>t.id===e.model);if(!n)return e;let r=n.capabilities.limits;if(!r)return e;let a=(!1===e.stream?r.max_non_streaming_output_tokens:void 0)??r.max_output_tokens;if("number"!=typeof a||a<=0)return e;let i=Math.max(Math.min(o,a),16);return i===o?e:{...e,max_tokens:i}}(o,t),o={...o,system:Gs(o.system)},o=function(e){let t=e.messages.map(e=>{if(!Array.isArray(e.content))return e;let t=e.content.map(e=>{let t=e;return"tool_use"===t.type&&"string"==typeof t.id?{...t,id:Js(t.id)}:"tool_result"===t.type&&"string"==typeof t.tool_use_id?{...t,tool_use_id:Js(t.tool_use_id)}:e});return{...e,content:t}});return{...e,messages:t}}(o),o}function Ys(e){return function(e){let t=e.thinking;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"thinking must be an object";let o=t;return"string"==typeof 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 a string"}(e)??function(e){let t=e.output_config;if(null==t)return null;if("object"!=typeof t||Array.isArray(t))return"output_config must be an object";let o=t;return void 0===o.effort||"string"==typeof o.effort?null:"output_config.effort must be a string"}(e)}function Vs(e,t,o=400){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_model"),e.json({type:"error",error:{type:"invalid_request_error",message:t}},o)}function Xs(e,t){return Ee.startActiveSpan("copilot_api.model.validate",n=>{try{n.setAttribute("copilot_api.model.requested",t.model),Qi(n,t,e.req.header("anthropic-beta"));let r=va(t.model);n.setAttribute("copilot_api.model.normalized",r);let a=Ys(t);return a?(f.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),Me.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 ka)return{ok:!1,response:Vs(e,t.message,t.statusCode)};throw t}finally{n.end()}})}function Zs(e,t,o){let{leadingSystemTexts:n,messages:r}=hs(e.messages),a=function(e){let t=[],o=[];for(let n of e)switch(n.role){case"system":{let e=gs(n);if(!e)break;"function_call"===t.at(-1)?.type?o.push(e):t.push(rl(e));break}case"user":t.push(...al(n),...o.map(e=>rl(e))),o=[];break;case"assistant":t.push(...ll(n))}return t.push(...o.map(e=>rl(e))),t}(r);if(0===a.length)throw new io("request has no translatable message content",Response.json({type:"error",error:{type:"invalid_request_error",message:"request has no translatable message content"}},{status:400}));let i={model:e.model,input:a,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)},s=function(e,t){return ws(e,t)||null}(e.system,n);s&&(i.instructions=s),e.tools?.length&&(i.tools=e.tools.filter(Li).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema}))),e.tool_choice&&(i.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));let l=function(e,t,o){if("adaptive"===e.thinking?.type){let t=e.output_config?.effort??"high";return o&&"max"===t?{effort:"max"}:{effort:nl(t)}}if("enabled"===e.thinking?.type&&e.thinking.budget_tokens){let{effort:o}=function(e){return e<5e3?{effort:"low"}:e<2e4?{effort:"medium"}:e<32e3?{effort:"high"}:{effort:"xhigh"}}(e.thinking.budget_tokens),n=On(o,t);return{effort:ol(n)?n:o}}}(e,t,o?.keepMax??!1);return l&&(i.reasoning=l),o?.promptCacheKey&&(i.prompt_cache_key=o.promptCacheKey),i}function Qs(e,t){let o=e?.trim()||t?.trim();if(o)return`cc-${N("sha256").update(o).digest("hex").slice(0,32)}`}function el(e){let t=e?.input_tokens??0,o=e?.input_tokens_details?.cached_tokens;return{input_tokens:void 0===o?t:Math.max(t-o,0),output_tokens:e?.output_tokens??0,...void 0===o?{}:{cache_read_input_tokens:o}}}const tl=new Set(["low","medium","high","xhigh"]),ol=e=>null!==e&&tl.has(e);function nl(e){switch(e){case"low":return"low";case"medium":return"medium";case"max":case"xhigh":return"xhigh";default:return"high"}}function rl(e){return{type:"message",role:"developer",content:[{type:"input_text",text:e}]}}function al(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(sl(e));if(n.length>0)if(n.some(e=>"image"===e.type)){let e=[];for(let t of n)switch(t.type){case"text":e.push({type:"input_text",text:t.text});break;case"image":e.push(il(t))}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 il(e){return{type:"input_image",image_url:`data:${e.source.media_type};base64,${e.source.data}`,detail:"high"}}function sl(e){if(Array.isArray(e.content)&&e.content.some(e=>"image"===e.type)){let t=e.content.filter(e=>["image","text"].includes(e.type)).map(e=>"image"===e.type?il(e):{type:"input_text",text:e.text});return e.is_error&&t.unshift({type:"input_text",text:"[ERROR]"}),{type:"function_call_output",call_id:e.tool_use_id,output:t}}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 ll(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 cl(e,t){if("incomplete"===e.status)return"content_filter"===e.incomplete_details?.reason?"refusal":"max_tokens";if(t)return"tool_use";switch(e.status){case"completed":case"cancelled":case"failed":return"end_turn";default:return null}}function ul(e,t){e.contentBlockOpen&&=(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,!1)}function pl(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 dl(e,t){let o=[];switch(e.type){case"response.created":pl(t,o,{responseId:e.response.id,model:e.response.model});break;case"response.in_progress":case"response.output_text.done":case"response.function_call_arguments.done":break;case"response.output_item.added":if("function_call"===e.item.type){pl(t,o),ul(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":pl(t,o),ul(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":ul(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":{ul(t,o);let n=e.response.output.some(e=>"function_call"===e.type),r=e.response.usage,a=cl(e.response,n);t.terminalEvent=e.type,t.stopReason=a,o.push({type:"message_delta",delta:{stop_reason:a,stop_sequence:null},usage:el(r)},{type:"message_stop"});break}case"response.incomplete":{pl(t,o),ul(t,o);let n=e.response.usage,r=cl(e.response,!1);t.terminalEvent=e.type,t.stopReason=r,o.push({type:"message_delta",delta:{stop_reason:r,stop_sequence:null},usage:el(n)},{type:"message_stop"});break}case"response.failed":pl(t,o),ul(t,o),t.terminalEvent=e.type,o.push({type:"error",error:{type:e.response.error?.code??"api_error",message:e.response.error?.message??"Response generation failed"}});break;case"response.cancelled":pl(t,o),ul(t,o),t.terminalEvent=e.type,t.stopReason="end_turn",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":pl(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}});break;case"error":t.terminalEvent=e.type,o.push({type:"error",error:{type:e.code??"api_error",message:e.message??"Response generation failed"}})}return o}function ml(e,t,o){let n=t.reasoning?.effort,r=e.get("requestData")||{};r.reasoningEffort=n,r.effortClamped=ns(o,n),e.set("requestData",r)}function fl(e,t){void 0!==t&&e?.setAttribute("copilot_api.reasoning_tokens",t)}async function hl(e,t,n){for(let r of t){if(o.debug("Translated Anthropic event:",r),"error"===r.type)throw n?.setAttribute("copilot_api.error_type","upstream_failure"),new Aa(r.error.type,r.error.message);await e.writeSSE({event:r.type,data:JSON.stringify(r)})}}async function gl(e,t,r){let a=performance.now(),i=Ee.startActiveSpan("copilot_api.translate.anthropic_to_responses",o=>{try{o.setAttribute("copilot_api.translation.direction","anthropic_to_responses"),o.setAttribute("copilot_api.translation.message_count",t.messages.length),Ts(o,t.messages);let n=Zs(t,le.models?.data.find(e=>e.id===t.model)?.capabilities.supports.reasoning_effort,{keepMax:"foundry"===le.provider,promptCacheKey:"foundry"===le.provider?Qs(e.req.header("x-claude-code-session-id"),t.metadata?.user_id):void 0});return $s(o,{system:n.instructions??"",tools:n.tools}),n}finally{o.end()}});Qe.record(performance.now()-a,{direction:"anthropic_to_responses"}),o.debug("Translated Responses API payload:",i),e.set("requestData",{model:i.model,streaming:!!i.stream}),ml(e,i,r),le.manualApprove&&await _a();let s=performance.now(),l=await ui(i,{onAttempt:t=>ml(e,t,r),signal:Rt(e)}),c=performance.now()-s;if(Ve.record(c,{model:i.model,target:"responses",streaming:String(!!i.stream)}),mi(l)){let t=e.get("requestData")||{};if(fl(e.get("requestSpan"),l.usage?.output_tokens_details?.reasoning_tokens),l.usage&&(t.tokenUsage=wa({prompt_tokens:l.usage.input_tokens,completion_tokens:l.usage.output_tokens,total_tokens:l.usage.total_tokens,prompt_tokens_details:l.usage.input_tokens_details})),t._d1=c,t.upstreamTtfbMs=c,t.upstreamTotalMs=c,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming Responses API response:",JSON.stringify(l).slice(-400)),"failed"===l.status)return f.getActiveSpan()?.setAttribute("copilot_api.error_type","upstream_failure"),e.json({type:"error",error:{type:l.error?.code??"api_error",message:l.error?.message??"Response generation failed"}},500);let r=performance.now(),a=Ee.startActiveSpan("copilot_api.translate.responses_to_anthropic",e=>{try{e.setAttribute("copilot_api.translation.direction","responses_to_anthropic");let t=function(e){let t=[],o=!1;for(let n of e.output)if("message"===n.type)for(let e of n.content)"output_text"===e.type&&e.text&&t.push({type:"text",text:e.text});else if("function_call"===n.type){o=!0;let e={};try{e=JSON.parse(n.arguments)}catch{}t.push({type:"tool_use",id:n.call_id,name:n.name,input:e})}return{id:e.id,type:"message",role:"assistant",model:e.model,content:t,stop_reason:cl(e,o),stop_sequence:null,usage:el(e.usage)}}(l);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return Qe.record(performance.now()-r,{direction:"responses_to_anthropic"}),e.json(a)}o.debug("Streaming Responses API response");let{events:u,span:p,release:d}=l;return U(e,async t=>{let n=Xi(t);t.onAbort(()=>{n.stop(),Nt(e)});let r=null,a=0,l=performance.now(),m=ja(e,s),f={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,responseId:"",model:"",toolCalls:{}};try{try{for await(let t of u){if(m(),o.debug("Responses API raw stream event:",t),!t.data)continue;let s;try{s=JSON.parse(t.data)}catch(e){o.warn("Failed to parse streaming chunk:",t.data.slice(0,200),e);continue}a++,ze.add(1,{model:i.model,endpoint_type:"responses"});let l=fi(s);if(l){r=l;let t=e.get("requestData")||{};t.tokenUsage=wa(r),t._d1=c,e.set("requestData",t)}await hl(n,dl(s,f),e.get("requestSpan"))}!function(e,t){if(!t.terminalEvent)throw e?.setAttribute("copilot_api.error_type","stream_incomplete"),new Aa("api_error","Upstream stream ended before the response completed")}(e.get("requestSpan"),f);let t=performance.now()-l,p={model:i.model,endpoint_type:"responses"};Xe.record(t,p),rt.record(a,p),Ma(e,s)}catch(o){if(Pt(e))return;throw lt(p,e.get("requestSpan"),o),await Sa(t,o),o}finally{r&&ba(p,r),function(e,t,o){e&&(fl(e,o?.completion_tokens_details?.reasoning_tokens),e.setAttribute("copilot_api.stream.terminal_event",t.terminalEvent??"none"),void 0!==t.stopReason&&e.setAttribute("copilot_api.translation.stop_reason",t.stopReason??"null"),e.setAttribute("copilot_api.translation.tool_use_count",Object.keys(t.toolCalls).length))}(e.get("requestSpan"),f,r),p.end(),d()}}finally{n.stop();try{let t=e.get("requestId");t&&ke.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}})}function _l(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 yl(e,t){e.thinkingBlockOpen&&(t.push({type:"content_block_stop",index:e.contentBlockIndex}),e.contentBlockIndex++,e.thinkingBlockOpen=!1,e.contentBlockOpen=!1)}function wl(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&&(_l(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&&(_l(t,o),o.push({type:"content_block_delta",index:t.contentBlockIndex,delta:{type:"signature_delta",signature:r.reasoning_opaque}}),yl(t,o)),r.content&&(yl(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){yl(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&&(yl(t,o),t.contentBlockOpen&&=(o.push({type:"content_block_stop",index:t.contentBlockIndex}),!1),o.push({type:"message_delta",delta:{stop_reason:Ss(n.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:"message_stop"})),o}const bl=/structured_outputs|output_config\.format/i;function kl(e,t,o){return function(e,t,o){return!(!e.output_config?.format||"claude-haiku-4.5"===o||!t)&&bl.test(t)}(e,t,e.model)&&o?.data.some(e=>"claude-haiku-4.5"===e.id)?Ws({...e,model:xn},o):null}var vl=class extends Error{constructor(){super("Exa web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="ExaTimeoutError"}};var xl=class extends Error{constructor(){super("Tavily web search timed out after 15000ms. The search endpoint may be slow or unreachable."),this.name="TavilyTimeoutError"}};const Tl={tavily:async function(e,t,n){let r=function(e,t){let o={query:e,max_results:t?.maxResults??5};return t?.includeDomains?.length&&(o.include_domains=t.includeDomains),t?.excludeDomains?.length&&(o.exclude_domains=t.excludeDomains),o}(t,n);o.debug("Tavily search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await dt({spanName:"tavily POST /search",url:"https://api.tavily.com/search",target:"tavily_search",method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"tavily.max_results":n?.maxResults??5,"tavily.has_include_domains":!!n?.includeDomains?.length,"tavily.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Tavily API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("tavily.results_count",e.results.length),o.debug(`Tavily returned ${e.results.length} results`),e.results}catch(e){throw st(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new xl:e}finally{clearTimeout(i)}},exa:async function(e,t,n){let r=function(e,t){let o={query:e,numResults:t?.maxResults??5,contents:{text:!0}};return t?.includeDomains?.length&&(o.includeDomains=t.includeDomains),t?.excludeDomains?.length&&(o.excludeDomains=t.excludeDomains),o}(t,n);o.debug("Exa search request:",JSON.stringify(r));let a=new AbortController,i=setTimeout(()=>a.abort(),15e3);try{let{response:t,span:i}=await dt({spanName:"exa POST /search",url:"https://api.exa.ai/search",target:"exa_search",method:"POST",headers:{"Content-Type":"application/json","x-api-key":e},body:JSON.stringify(r),signal:a.signal,extraAttributes:{"exa.max_results":n?.maxResults??5,"exa.has_include_domains":!!n?.includeDomains?.length,"exa.has_exclude_domains":!!n?.excludeDomains?.length}});try{let e=await async function(e){if(!e.ok){let t=await e.text();throw Error(`Exa API error: ${e.status} ${t}`)}return await e.json()}(t);return i.setAttribute("exa.results_count",e.results.length),o.debug(`Exa returned ${e.results.length} results`),e.results.map(e=>({title:e.title??"",url:e.url,content:e.text??""}))}catch(e){throw st(i,e),e}finally{i.end()}}catch(e){throw e instanceof DOMException&&"AbortError"===e.name?new vl:e}finally{clearTimeout(i)}}},Al=["tavily","exa"];function $l(e){return"tavily"===e||"exa"===e}function Sl(){return le.webSearchProviders.length>0}async function El(e,t){return async function(e,t,n){let{providers:r,searchFns:a=Tl}=n;if(0===r.length)throw Error("No web search provider configured");let i,s=[];for(let[n,l]of r.entries())try{let n=await a[l.name](l.key,e,t);return s.length>0&&o.info(`Web search recovered: served by "${l.name}" after ${s.join(", ")} failed.`),n}catch(e){i=e,s.push(l.name);let t=e instanceof Error?e.message:String(e);n!==r.length-1&&o.warn(`Web search provider "${l.name}" failed (${t}); falling over to "${r[n+1].name}".`)}let l=i instanceof Error?i.message:String(i);throw o.error(`Web search failed: all providers exhausted (${s.join(", ")}). Last error: ${l}`),i instanceof Error?i:Error("All web search providers failed")}(e,t,{providers:le.webSearchProviders})}function Ol(e){let t=e.tools;return!(!t||1!==t.length)&&Bi(t[0])}function Cl(){let e="";for(let t=0;t<24;t++)e+="abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())];return e}function Il(e,t){let o=[{type:"web_search_tool_result_error",error_code:t.errorCode??"unavailable"}];return{type:"web_search_tool_result",tool_use_id:e,content:t.searchFailed?o:t.results}}async function Rl(e,t){let n=function(e){let t,o=e.messages[0];if(!o||"user"!==o.role)return null;if("string"==typeof o.content)t=o.content;else{if(!Array.isArray(o.content))return null;{let e=o.content.find(e=>"text"===e.type);if(!e)return null;t=e.text}}return t.startsWith("Perform a web search for the query: ")?t.slice(36).trim():t.trim()||null}(t);if(!n)return e.set("requestData",{model:t.model,streaming:!1}),e.json({type:"error",error:{type:"invalid_request_error",message:"Could not extract search query from web search request"}},400);let r=function(e){let t=e.tools?.[0];return t&&Bi(t)?{maxResults:"number"==typeof t.max_uses?t.max_uses:5,allowedDomains:t.allowed_domains,blockedDomains:t.blocked_domains}:{maxResults:5}}(t);o.info(`Web search intercepted: "${n}"`);let a,i=[],s=!1;try{if(!Sl())throw s=!0,a="unavailable",Error("No web search provider configured");i=(await El(n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains})).map(e=>({type:"web_search_result",url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString("base64"),page_age:null}))}catch(e){o.error("Web search failed:",e),s=!0,a??="unavailable"}let l={query:n,results:i,model:t.model,searchFailed:s,errorCode:a};if(!t.stream)return e.set("requestData",{model:t.model,streaming:!1}),e.json(function(e){let{query:t,model:o}=e,n=`srvtoolu_${Cl()}`,r=[{type:"text",text:"I'll search for that."},{type:"server_tool_use",id:n,name:"web_search",input:{query:t}},{...Il(n,e)}];return{id:`msg_ws_${Cl()}`,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_${Cl()}`,r=`msg_ws_${Cl()}`,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:Il(n,e)},{type:"content_block_stop",index:2},{type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{output_tokens:0}},{type:"message_stop"}),a}(l);return e.set("requestData",{model:t.model,streaming:!0}),U(e,async t=>{for(let e of c)await t.writeSSE({event:e.type,data:JSON.stringify(e)});e.get("resolveStreamComplete")?.()})}async function Nl(e){if(sn(le)||await mr())return null;let t=ir();return t?(f.getActiveSpan()?.setAttribute("copilot_api.error_type","authentication_error"),e.json({type:"error",error:{type:"authentication_error",message:`${t.message}; ${lr()}`}},401)):(f.getActiveSpan()?.setAttribute("copilot_api.error_type","service_unavailable"),e.header("Retry-After","1"),e.json({type:"error",error:{type:"service_unavailable",message:"Service token not yet available; retry shortly"}},503))}function Pl(e,t){let o=t.model;return o&&"string"==typeof o?null:Vs(e,"Model name is required and must be a string")}async function ql(e){let t=await e.req.json();if(Ol(t))return Pl(e,t)??Rl(e,t);await Ta(le),o.debug("Anthropic request payload:",t);let r=t.output_config?.effort,a=Pl(e,t);if(a)return a;t=function(e,t){return as(t,le.models?.data.map(e=>e.id)??[],{context1m:/context-1m/i.test(e.req.header("anthropic-beta")??"")})}(e,t);let i=Xs(e,t);if(!i.ok)return i.response;t=i.payload;let s=await Nl(e);if(s)return s;if(xa(t.model))return gl(e,t,r);if(function(e){if("foundry"!==le.provider)return Es(e);let t=le.models?.data.find(t=>t.id===e);return t?"Anthropic"===t.vendor:Es(e)}(t.model))return async function(e,t,o){let n="foundry"===le.provider,r=n?t:Ws(t,le.models),a={anthropicBeta:e.req.header("anthropic-beta"),anthropicVersion:e.req.header("anthropic-version")},i=r.output_config?.effort;return e.set("requestData",{model:r.model,reasoningEffort:i,effortClamped:ns(o,i),streaming:!!r.stream}),le.manualApprove&&await _a(),Ee.startActiveSpan("copilot_api.anthropic_passthrough",async t=>{t.setAttribute("copilot_api.route","anthropic_passthrough"),t.setAttribute("copilot_api.model",r.model),t.setAttribute("copilot_api.streaming",!!r.stream),Qi(t,r,a.anthropicBeta);try{let o=performance.now(),i=await es(r,a,{onStructuredOutputFallback:(e,o)=>{if(n)return null;let r=kl(e,o,le.models);return r&&(t.setAttribute("copilot_api.structured_output_fallback",!0),t.setAttribute("copilot_api.structured_output_fallback.model",r.model)),r}}),s=performance.now()-o;if(Ve.record(s,{model:r.model,target:"anthropic_messages",streaming:String(!!r.stream)}),!r.stream){let o=i,n=o.usage;if(n){let t={input_tokens:n.input_tokens||0,output_tokens:n.output_tokens||0,cache_read_input_tokens:n.cache_read_input_tokens||0,cache_creation_input_tokens:n.cache_creation_input_tokens||0},o=e.get("requestData")||{};o.tokenUsage=wa(jl(t)),o._d1=s,o.upstreamTtfbMs=s,o.upstreamTotalMs=s,e.set("requestData",o)}return t.end(),e.json(o)}let{events:l,span:c,release:u}=i;return U(e,async n=>{let a=0,i=performance.now(),s={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},p=!1,d=ja(e,o);try{try{for await(let e of l)d(),e.data&&"[DONE]"!==e.data?(a++,ze.add(1,{model:r.model,endpoint_type:"anthropic_messages"}),Ml(e.data,s)&&(p=!0),await n.writeSSE(e)):await n.writeSSE(e);let e=performance.now()-i,t={model:r.model,endpoint_type:"anthropic_messages"};Xe.record(e,t),rt.record(a,t)}catch(t){throw lt(c,e.get("requestSpan"),t),await Sa(n,t),t}finally{if(Ma(e,o),p){let t=jl(s);ba(c,t);let o=e.get("requestData")||{};o.tokenUsage=wa(t),e.set("requestData",o)}c.end(),u()}let t=e.get("requestId");t&&ke.executeCompletion(t)}finally{t.end(),e.get("resolveStreamComplete")?.()}})}catch(e){throw st(t,e),t.end(),e}})}(e,t,r);let l=performance.now(),c=Ee.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=>"thinking"===e.type));o.setAttribute("copilot_api.translation.has_thinking",n),Ts(o,t.messages);let r=Os(t,le.models),a=r.messages.at(0);return $s(o,{system:"system"===a?.role&&"string"==typeof a.content?a.content:"",tools:r.tools}),r}finally{o.end()}});Qe.record(performance.now()-l,{direction:"anthropic_to_openai"}),c=Pa(c,le.models),o.debug("Translated OpenAI request payload:",c);let u=t.output_config?.effort;e.set("requestData",{model:c.model,reasoningEffort:u,effortClamped:ns(r,u),streaming:!!c.stream});let p=performance.now();le.manualApprove&&await _a();let d=await oi(c),m=performance.now()-p;if(Ve.record(m,{model:c.model,target:"chat_completions",streaming:String(!!c.stream)}),Dl(d)){let t=e.get("requestData")||{};d.usage&&(t.tokenUsage=wa(d.usage)),t._d1=m,t.upstreamTtfbMs=m,t.upstreamTotalMs=m,e.set("requestData",t),o.level>=n.debug&&o.debug("Non-streaming response:",JSON.stringify(d).slice(-400));let r=performance.now(),a=Ee.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=Us(a.message),i=Hs(a.message.content),s=Bs(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:Ss(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}(d);return e.setAttribute("copilot_api.translation.content_blocks",t.content.length),e.setAttribute("copilot_api.translation.stop_reason",t.stop_reason??"null"),e.setAttribute("copilot_api.translation.has_tool_use",t.content.some(e=>"tool_use"===e.type)),t}finally{e.end()}});return Qe.record(performance.now()-r,{direction:"openai_to_anthropic"}),o.debug("Translated Anthropic response:",a),e.json(a)}o.debug("Streaming response from service");let{events:f,span:h,release:g}=d;return U(e,async t=>{let n=Xi(t);t.onAbort(()=>n.stop());let r=null,a=0,i=performance.now(),s=ja(e,p),l={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,thinkingBlockOpen:!1,toolCalls:{}};try{try{for await(let t of f){if(s(),o.debug("Raw stream event:",t),"[DONE]"===t.data)break;if(!t.data)continue;let i;try{i=JSON.parse(t.data)}catch(e){o.warn("Failed to parse streaming chunk:",t.data.slice(0,200),e);continue}if(a++,ze.add(1,{model:c.model,endpoint_type:"anthropic"}),i.usage){r=i.usage;let t=e.get("requestData")||{};t.tokenUsage=wa(r),t._d1=m,e.set("requestData",t)}let u=wl(i,l);for(let e of u)o.debug("Translated Anthropic event:",e),await n.writeSSE({event:e.type,data:JSON.stringify(e)})}let t=performance.now()-i,u={model:c.model,endpoint_type:"anthropic"};if(Xe.record(t,u),rt.record(a,u),Ma(e,p),r){let t=e.get("requestData")||{};t.tokenUsage||(t.tokenUsage=wa(r),t._d1=m,e.set("requestData",t))}}catch(o){throw lt(h,e.get("requestSpan"),o),await Sa(t,o),o}finally{r&&ba(h,r),h.end(),g()}let u=e.get("requestId");u&&ke.executeCompletion(u)}finally{n.stop(),e.get("resolveStreamComplete")?.()}})}const Dl=e=>Object.hasOwn(e,"choices");function jl(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 Ml(e,t){try{let o=JSON.parse(e);if("message_start"===o.type){let e=o.message?.usage;if(e)return t.input_tokens=e.input_tokens||0,t.cache_read_input_tokens=e.cache_read_input_tokens||0,t.cache_creation_input_tokens=e.cache_creation_input_tokens||0,!0}if("message_delta"===o.type){let e=o.usage;if(e)return t.output_tokens=e.output_tokens||0,!0}}catch{}return!1}const Fl=new M;Fl.post("/",async e=>{try{return await async function(e){try{let t=await e.req.json();return null!==t&&Ol(t)}catch{return!1}}(e)?await ql(e):await Kn(e,"messages",ql)}catch(t){return await Io(e,t)}});const Hl=new M;function Ul(e){return Ee.startActiveSpan("copilot_api.model.validate",t=>{try{t.setAttribute("copilot_api.model.requested",e.model);let n=va(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),Me.add(1,{from_model:e.model,to_model:n}),o.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function Bl(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,prompt_tokens_details:e.input_tokens_details}}}catch{}return null}(e);if(!o)return;t.usageRef.value=o;let n=t.c.get("requestData")||{};n.tokenUsage=wa(o),n._d1=t._d1,t.c.set("requestData",n)}Hl.get("/",async e=>{try{le.models||await Yn();let t=le.models?.data.map(e=>({id:e.id,object:"model",type:"model",created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:"list",data:t,has_more:!1})}catch(t){return await Io(e,t)}});const Ll=new Set(["message","function_call","function_call_output"]),zl=new Set(["type","name","description","parameters"]);async function Gl(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||!Sl())&&(o.info(`Enriching web search: "${n}"`),e.sources=(await El(n,{maxResults:5})).map(e=>({type:"url",url:e.url,title:e.title,content:e.content})),!0)}async function Kl(e){if(Sl())try{for(let t of e.output){let e=t;"web_search_call"===e.type&&await Gl(e.action)}}catch(e){o.error("Failed to enrich non-streaming web search:",e)}}async function Jl(e){if(!Sl())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 Gl(e.action))return JSON.stringify(t)}}catch(e){o.error("Failed to enrich web search:",e)}return e}function Wl(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 Ll.has(e.type)||"web_search_call"===e.type?e:void 0===e.type&&"string"==typeof e.role?{...e,type:"message"}:null}}function Yl(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 Vl(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&&Yl(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)Yl(e,t)&&(r=!0);if(r)return JSON.stringify(o)}}catch{}return e}function Xl(e){return null!=e}function Zl(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function Ql(e){return"string"==typeof e?e:void 0===e?"(untyped)":JSON.stringify(e)}function ec(e){let t={model:e.model},{input:o,droppedInputTypes:n}=function(e){if(!Array.isArray(e))return{input:e,droppedInputTypes:[]};let t=new Set,o=[];for(let n of e){if(!Zl(n)){o.push(n);continue}let e=Wl(n);null===e?t.add(Ql(n.type)):o.push(e)}return{input:o,droppedInputTypes:[...t]}}(e.input);void 0!==o&&(t.input=o);for(let o of["previous_response_id","prompt","conversation","instructions","max_output_tokens","temperature","top_p","stream","tool_choice","parallel_tool_calls","user"])Xl(e[o])&&(t[o]=e[o]);let r=new Set;if(Xl(e.tools)){let o=function(e){let t=new Set;return{tools:e.filter(e=>{let t=e.type;return"function"===t||"custom"===t||"web_search"===t||t.startsWith("web_search_")}).map(e=>{let o=e.type;if("web_search"===o||o.startsWith("web_search_"))return{type:e.type};let n={};for(let t of Object.keys(e))zl.has(t)&&(n[t]=e[t]);return"custom"===n.type&&(n.type="function",t.add(n.name),n.parameters||={type:"object",properties:{input:{type:"string",description:"The freeform tool input content"}},required:["input"],additionalProperties:!1}),n}),customToolNames:t}}(e.tools);t.tools=o.tools,r=o.customToolNames}if(Xl(e.reasoning)&&"object"==typeof e.reasoning){let o=e.reasoning;t.reasoning={},Xl(o.effort)&&(t.reasoning.effort=o.effort),Xl(o.summary)&&(t.reasoning.summary=o.summary)}if(Xl(e.text)&&"object"==typeof e.text){let o=e.text;Xl(o.format)&&(t.text={format:o.format})}return{payload:t,customToolNames:r,droppedInputTypes:n}}function tc(e,t){return f.getActiveSpan()?.setAttribute("copilot_api.error_type","invalid_request"),e.json({error:{message:t,type:"invalid_request_error"}},400)}function oc(e,t,o){let{payload:n,droppedInputTypes:r}=o;if(!Array.isArray(t)||!Array.isArray(n.input))return null;let a=f.getActiveSpan();return a?.setAttribute("copilot_api.responses.input_items_in",t.length),a?.setAttribute("copilot_api.responses.input_items_out",n.input.length),0===t.length||n.input.length>0||Xl(n.previous_response_id)||Xl(n.prompt)||Xl(n.conversation)?null:tc(e,`input contains no supported items: every item was dropped (unsupported item types: ${r.join(", ")}). Provide at least one message, function_call or function_call_output item, or previous_response_id, prompt or conversation.`)}async function nc(e){await Ta(le);let t=await e.req.json();if(!Zl(t))return tc(e,"request body must be a JSON object");let n=function(e){return"foundry"===le.provider?{payload:e,customToolNames:new Set,droppedInputTypes:[]}:ec(e)}(t),{customToolNames:r}=n,a=n.payload;o.debug(`Responses API [${Array.isArray(a.input)?a.input.length:1} items]`),r.size>0&&o.debug(`Custom tools detected: ${[...r].join(", ")}`);let i=function(e,t){try{return{ok:!0,payload:Ul(t)}}catch(t){if(t instanceof ka)return{ok:!1,response:e.json({error:{message:t.message,type:"invalid_request_error",code:"invalid_model"}},t.statusCode)};throw t}}(e,a);if(!i.ok)return i.response;a=i.payload;let s=oc(e,t.input,n);if(s)return s;let l=await ya(e);if(l)return l;e.set("requestData",{model:a.model,reasoningEffort:a.reasoning?.effort,streaming:!!a.stream}),le.manualApprove&&await _a();let c=performance.now(),u=await ui(a,{signal:Rt(e)}),p=performance.now()-c;if(Ve.record(p,{model:a.model,target:"responses",streaming:String(!!a.stream)}),rc(u))return async function(e,t,o){await Kl(t);let n=e.get("requestData")||{};return t.usage&&(n.tokenUsage=wa({prompt_tokens:t.usage.input_tokens,completion_tokens:t.usage.output_tokens,total_tokens:t.usage.total_tokens,prompt_tokens_details:t.usage.input_tokens_details})),n._d1=o,n.upstreamTtfbMs=o,n.upstreamTotalMs=o,e.set("requestData",n),e.json(t)}(e,u,p);let{events:d,span:m,release:f}=u;return U(e,async t=>{t.onAbort(()=>Nt(e));let o={value:null},n=0,i=performance.now(),s=ja(e,c);try{try{for await(let i of d)if(s(),i.data&&"[DONE]"!==i.data){n++;let s=Vl(i.data,r);s=await Jl(s);let l=s===i.data?i:{...i,data:s};ze.add(1,{model:a.model,endpoint_type:"responses"}),Bl(s,{usageRef:o,c:e,_d1:p}),await t.writeSSE(l)}else await t.writeSSE(i);let l=performance.now()-i,u={model:a.model,endpoint_type:"responses"};Xe.record(l,u),rt.record(n,u),Ma(e,c)}catch(o){if(Pt(e))return;throw lt(m,e.get("requestSpan"),o),await Ea(t,o),o}finally{o.value&&ba(m,o.value),m.end(),f()}}finally{!function(e){try{let t=e.get("requestId");t&&ke.executeCompletion(t)}finally{e.get("resolveStreamComplete")?.()}}(e)}})}const rc=e=>Object.hasOwn(e,"output"),ac=new M;ac.post("/",async e=>{try{return await Kn(e,"responses",nc)}catch(t){return await Io(e,t)}});const ic=new M;ic.get("/",e=>{try{return le.showToken?e.json({token:le._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 sc=new M;sc.get("/",async e=>{try{let t=await Or();return e.json(t)}catch(t){return o.error("Error fetching usage:",t),e.json({error:"Failed to fetch usage"},500)}});const lc=new M;function cc(){return function(e){let t=e.filter(e=>ma(e));if(0===t.length)return;let o=t.find(e=>da.test(e.id));return o?o.id:(t.find(e=>"Anthropic"===e.vendor)??t[0]).id}(le.models?.data??[])}function uc(e,t,o){let n=function(e){if(!e)return;try{let t=JSON.parse(e),o=t.error?.message??t.message;if("string"==typeof o&&o.length>0)return sa(o).slice(0,200)}catch{}let t=sa(e).trim();return t.length>0?t.slice(0,200):void 0}(t),r=n?` (upstream: ${n})`:"";switch(!0){case 401===e:case 403===e:return`Authentication/entitlement failed (HTTP ${e}). Your GitHub Copilot subscription may be inactive, or the Auth token is invalid. Run \`copilot-api auth\` to re-authenticate; if it persists, this account has no active Copilot access${r}.`;case 402===e:return`Premium monthly quota exhausted (HTTP 402). Switch to a non-premium model (e.g. claude-haiku-4.5) or wait for the monthly quota reset${r}.`;case 400===e:return`Model '${o}' was rejected (HTTP 400). On individual plans only some models are entitled — try claude-haiku-4.5, or run \`copilot-api doctor\` to see what works${r}.`;case 413===e:return`Request too large (HTTP 413)${r}.`;case 429===e:return`Rate limited upstream (HTTP 429) — wait and retry${r}.`;case 503===e:return`Service not ready (HTTP 503) — the model catalog or Service token is still warming up. Retry in a few seconds${r}.`;case e>=500:return`Upstream error (HTTP ${e})${r}.`;default:return`Unexpected response (HTTP ${e})${r}.`}}async function pc(e={}){let t=performance.now(),o=e.model&&function(e){let t=le.models?.data.find(t=>t.id===e);return void 0!==t&&ma(t)}(e.model)?e.model:cc();if(!o)return{ok:!1,durationMs:0,reason:"No models available — the catalog is empty (upstream /models failed at startup). Check connectivity and authentication."};let n,r=e.timeoutMs??3e4,a=()=>Math.round(performance.now()-t),i=(async()=>{try{let e=await lc.request("/chat/completions",{method:"POST",headers:{"content-type":"application/json",[ua]:pa},body:JSON.stringify({model:o,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1})});if(e.ok)return{ok:!0,model:o,status:e.status,durationMs:a()};let t=await e.text().catch(()=>"");return{ok:!1,model:o,status:e.status,durationMs:a(),reason:uc(e.status,t,o),detail:t.slice(0,400)||void 0}}catch(e){let t=e instanceof Error?e.message:String(e);return{ok:!1,model:o,durationMs:a(),reason:`Request failed before a usable response: ${t}`,detail:t}}})(),s=new Promise(e=>{n=setTimeout(()=>{e({ok:!1,model:o,durationMs:a(),reason:`Did not complete within ${r}ms. If you started with --manual, approve the request or use --no-smoke-test; otherwise the upstream may be slow or unreachable.`})},r)});try{return await Promise.race([i,s])}finally{n&&clearTimeout(n)}}lc.use(async(e,t)=>{let n=performance.now(),r=`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,a=e.req.method,i=e.req.path,s=qt(i),l=function(e){return e===pa}(e.req.header(ua));e.set("requestId",r),e.set("isSelfTest",l),e.header("x-request-id",r);let c=Ee.startSpan("copilot_api.handle_request",{kind:u.SERVER,attributes:{"http.method":a,"http.url":e.req.url,"http.route":i,"copilot_api.request_id":r,"copilot_api.endpoint_type":s}});e.set("requestSpan",c),e.set("requestTraceContext",c.spanContext()),l&&c.setAttribute("copilot_api.self_test",!0);for(let[t,o]of Object.entries(e.req.header())){let e=t.toLowerCase();ut.has(e)||"x-copilot-api-self-test"!==e&&c.setAttribute(`http.request.header.${e}`,o)}await async function(e,t){let{method:n,path:r,endpointType:a}=t;if("POST"===n&&("anthropic"===a||"openai"===a||"embeddings"===a||r.includes("/responses")))try{let t=e.req.raw.clone(),o=new Uint8Array(await t.arrayBuffer());e.set("rawBody",(new TextDecoder).decode(o.subarray(0,1048576)))}catch(e){o.warn("Failed to cache incoming request body for error capture:",e)}}(e,{method:a,path:i,endpointType:s});let m,h=new Promise(e=>{m=e});e.set("streamComplete",h),e.set("resolveStreamComplete",m);let g=f.setSpan(d.active(),c);await d.with(g,async()=>{l||ke.registerCompletion(r,e,n);try{await t()}catch(e){let t=e instanceof Error?e:Error(String(e));throw c.setStatus({code:p.ERROR,message:t.message}),c.recordException(t),e}});let _=e.get("requestData"),y={c:e,start:n,method:a,path:i,endpointType:s,requestId:r,span:c};_?.streaming&&e.res.status<400?h.then(()=>ga(y)).catch(e=>{o.warn("Error finalizing streaming request:",e);let t=e instanceof Error?e:Error(String(e));try{c.recordException(t),c.setStatus({code:p.ERROR,message:`Stream finalization failed: ${t.message}`})}catch{}try{c.end()}catch{}}):ga(y)}),lc.use(F()),lc.use(async(e,t)=>{let o=e.req.header("content-length");if(o){let t=Number(o);if(Number.isFinite(t)&&t>33554432)return r.warn(`Rejected oversized request: ${t} bytes on ${e.req.path} (UA: ${e.req.header("user-agent")??"unknown"})`),e.json({type:"error",error:{type:"request_too_large",message:`Request body exceeds 32 MB limit (got ${t} bytes).`}},413)}await t()}),lc.get("/",e=>e.text("Server running")),lc.route("/health",Fi),lc.route("/chat/completions",Di),lc.route("/models",Hl),lc.route("/embeddings",Mi),lc.route("/usage",sc),lc.route("/token",ic),lc.route("/v1/chat/completions",Di),lc.route("/v1/models",Hl),lc.route("/v1/embeddings",Mi),lc.route("/v1/messages",Fl),lc.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{name:o,tokenizer:n}=await async function(e){let t=le.models?.data.find(t=>t.id===e);return!t||"Anthropic"===t.vendor||dn(t.capabilities.family)||"o200k_base"!==t.capabilities.tokenizer?{name:"claude",tokenizer:zi}:(Gi??=import("ai-tokenizer/encoding/o200k_base").then(e=>new L(e)),{name:"o200k_base",tokenizer:await Gi})}(t.model),r=e=>Ji(n,e),a=Ki.baseOverhead;if(t.system){let e="string"==typeof t.system?t.system:t.system.map(e=>e.text).join("\n\n");a+=Ki.perMessage+r(e)*Ki.contentMultiplier}for(let e of t.messages)a+=Ki.perMessage,a+=r(e.role),"string"==typeof e.content?a+=r(e.content)*Ki.contentMultiplier:Array.isArray(e.content)&&(a+=Wi(e.content,r));let i=t.tools?.filter(Li);i&&i.length>0&&(a+=function(e,t){let o=Ki.toolsExist;for(let[n,r]of e.entries())n>0&&(o+=Ki.perTool),o+=t(r.name),r.description&&(o+=Ki.perDesc+t(r.description)),o+=Yi(r.input_schema,t);return o}(i,r));let s=Math.round(a);"string"==typeof t.model&&e.set("requestData",{model:t.model,streaming:!1});let l=e.get("requestSpan");return l?.setAttribute("copilot_api.count_tokens.estimate",s),l?.setAttribute("copilot_api.count_tokens.tokenizer",o),e.json({input_tokens:s})}),lc.route("/v1/responses",ac),lc.route("/responses",ac),lc.onError((e,t)=>Io(t,e));const dc=e=>`[1m${e}[0m`,mc=e=>`[2m${e}[0m`,fc=e=>`[32m${e}[0m`,hc=e=>`[31m${e}[0m`,gc=e=>`[33m${e}[0m`,_c=mc(" ─────────────────────────────────────────────────────────────");function yc(e,t,o){console.log(` ${function(e){return"ok"===e?fc("✓"):"warn"===e?gc("⚠"):hc("✗")}(e)} ${dc(t.padEnd(14))} ${o}`)}function wc(e){console.log(` ${mc("↳")} ${mc(e)}`)}function bc(e){return e instanceof io?`HTTP ${e.response.status} ${e.message}`:e instanceof Error?e.message:String(e)}async function kc(){let e=y.env.GH_TOKEN;if(e&&e.trim().length>0)return{token:e.trim(),source:"GH_TOKEN env"};let t=await async function(){try{let e=(await a.readFile(Z.GITHUB_TOKEN_PATH,"utf8")).trim();return e.length>0?e:void 0}catch{return}}();return t?{token:t,source:"stored file"}:void 0}async function vc(){try{await Yn();let e=(le.models?.data.length??0)>0;return yc(e?"ok":"warn","Model catalog",e?function(){let e=le.models?.data??[],t={Claude:0,OpenAI:0,Gemini:0,Embedding:0};for(let o of e)o.id.startsWith("text-embedding")?t.Embedding++:"Anthropic"===o.vendor?t.Claude++:"Google"===o.vendor?t.Gemini++:t.OpenAI++;let o=Object.entries(t).filter(([,e])=>e>0).map(([e,t])=>`${e}: ${t}`);return`${e.length} models (${o.join(", ")})`}():"empty"),e}catch(e){return yc("fail","Model catalog",bc(e)),wc("Could not fetch /models — check connectivity/auth."),!1}}async function xc(e){le.accountType=e.accountType;let t=await Jt(),o=Wt();if(console.log(""),console.log(` ${dc("COPILOT-API DOCTOR")} ${mc(`v${t}`)}`),console.log(_c),yc("ok","Runtime",`${o.name} ${o.version} (${o.platform}-${o.arch})`),await Q(),Vn(),!await async function(){let e=await kc();if(!e)return yc("fail","Auth token","not found"),void wc("Run `copilot-api auth` (or `copilot-api start`) to authenticate.");le._t2=e.token,yc("ok","Auth token",`found (${e.source})`);try{let e=await No();return await bt(le,e.login),yc("ok","GitHub auth",`logged in as ${e.login}`),e.login}catch(e){return yc("fail","GitHub auth",bc(e)),void wc("Token looks invalid/expired. Re-run `copilot-api auth`.")}}())return console.log(_c),console.log(` ${hc("✗")} ${dc("Authentication failed")} — cannot continue.`),console.log(""),1;let n=await async function(){try{let{token:e}=await Ro();return le._t1=e,yc("ok","Service token","acquired"),!0}catch(e){let t=e instanceof io?e.response.status:0;return yc("fail","Service token",bc(e)),wc(401===t?"Auth token is invalid/expired — run `copilot-api auth`.":403===t?"No active GitHub Copilot subscription on this account. Re-auth won't help.":"Transient/network issue — check connectivity and retry."),!1}}(),r=!!n&&await vc();await async function(){try{let e=await Or(),t=e.quota_snapshots.premium_interactions,o=t.unlimited?"credits unlimited":`credits ${xr(Tr(t))} of ${xr(t.entitlement)} · ${t.percent_remaining.toFixed(0)}% left`;yc("ok","Copilot plan",`${e.copilot_plan} · ${o} `+mc(`(resets ${e.quota_reset_date})`))}catch(e){yc("warn","Copilot plan",`unavailable (${bc(e)})`)}}();let a=!1;return n&&r?a=await async function(){let e=await pc();return e.ok?(yc("ok","Generation",`works via ${e.model} ${mc(`(${e.durationMs}ms)`)}`),!0):(yc("fail","Generation",`${e.reason}${e.status?mc(` [HTTP ${e.status}]`):""}`),!1)}():yc("warn","Generation","skipped (no token or empty catalog)"),function(){let e=[],t="ok";for(let o of["ANTHROPIC_BASE_URL","OPENAI_BASE_URL"]){let n=y.env[o];n&&("ANTHROPIC_BASE_URL"===o&&/\/v1\/*$/.test(n)&&(t="warn",e.push(`${o}=${n} ends in /v1 — Claude Code appends /v1/messages, producing a doubled /v1/v1/... path (404). Drop the trailing /v1.`)),/\/v1\/v1(?:\/|$)/.test(n)&&(t="warn",e.push(`${o}=${n} contains a doubled /v1/v1 path (404).`)))}if(e.length>0){yc(t,"Client config","potential base-URL issue");for(let t of e)wc(t)}else yc("ok","Client config","no base-URL issues detected");wc("Point clients at http://127.0.0.1:4141. For Docker/LAN, start with --hostname 0.0.0.0.")}(),console.log(_c),a?(console.log(` ${fc("✓")} ${dc("All systems go")} — your proxy can generate. Point your client at it and go.`),console.log(""),0):(console.log(` ${gc("⚠")} ${dc("Some checks need attention")} — see the ${hc("✗")}/${gc("⚠")} lines above.`),console.log(""),2)}const Tc=e({meta:{name:"doctor",description:"Diagnose your setup end-to-end: token, auth, entitlement, model catalog, and one real generation. Tells you exactly what's wrong and how to fix it."},args:{"account-type":{alias:"a",type:"string",default:"individual",description:"Account type to check against (individual, business, enterprise)"}},async run({args:e}){let t=await xc({accountType:e["account-type"]});y.exit(t)}});function Ac(e){return{log(t,r){let a=o.level>=n.debug;if(t.level!==n.warn||a)for(let o of e)o.log(t,r)}}}let $c=!1;const Sc="copilot-api-node20",Ec=`https://registry.npmjs.org/${Sc}/latest`,Oc=e=>`[1m${e}[0m`,Cc=e=>`[33m${e}[0m`;async function Ic(e){let t=setTimeout(()=>e.abort(),5e3);"object"==typeof t&&"unref"in t&&t.unref();try{let t=await fetch(Ec,{signal:e.signal});return t.ok?(await t.json()).version??null:null}catch{return null}finally{clearTimeout(t)}}function Rc(e,t){let o=Math.max(0,t-function(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,"").length}(e));return e+" ".repeat(o)}let Nc,Pc;async function qc(e){try{let[t,o]=await Promise.all([Jt(),Ic(e)]);return"unknown"!==t&&o&&function(e,t){let o=e.split(".").map(Number),n=t.split(".").map(Number),r=Math.max(o.length,n.length);for(let e=0;e<r;e++){let t=o[e]??0,r=n[e]??0;if(t<r)return!0;if(t>r)return!1}return!1}(t,o)?{current:t,latest:o}:null}catch{return null}}function Dc(){if(!Nc||!Pc)return;let{signal:e}=Pc;Nc.then(t=>{t&&!e.aborted&&function(e,t){let o=`npx ${Sc}@latest`,n=Cc("│"),r=` ${Oc("Update available!")} ${(e=>`[2m${e}[0m`)(e)} → ${(e=>`[32m${e}[0m`)(t)}`,a=` Run ${Oc(o)} to update`,i=" ".repeat(54),s=Cc(`╭${"─".repeat(54)}╮`),l=Cc(`╰${"─".repeat(54)}╯`),c=["",s,`${n}${i}${n}`,`${n}${Rc(r,54)}${n}`,`${n}${i}${n}`,`${n}${Rc(a,54)}${n}`,`${n}${i}${n}`,l,""];console.log(c.join("\n"))}(t.current,t.latest)}).catch(()=>{})}var jc={posts:[{title:"I Almost Bought an AI Code Reviewer. Then I Did the Math.",teaser:"100+ repos. Every PR reviewed by AI. Under $1K a month.",url:"https://barazany.dev/blog/claude-code-pr-reviewer",date:"2026-06-09"},{title:"I Had Claude Mine 30 Days of My Own Messages. What It Found Was Uncomfortably Accurate.",teaser:"I had Claude read a month of my messages. It nailed me.",url:"https://barazany.dev/blog/mining-claude-history-ultracode",date:"2026-06-05"},{title:"The 5-Hour Quota, Boris's Tweet, and What the Source Code Actually Reveals",teaser:"Claude Code's caching story — decoded from the source.",url:"https://barazany.dev/blog/claude-code-token-caching",date:"2026-04-01"}]};const Mc=262144,Fc="https://barazany.dev",Hc=/^[a-z0-9][a-z0-9-]*$/i,Uc=/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;function Bc(e,t){if("string"!=typeof e)return"";let o=e.replaceAll(Uc," ").replaceAll(/\s+/g," ").trim(),n=Array.from(o);return n.length<=t?o:`${n.slice(0,t-1).join("").trimEnd()}…`}function Lc(e){if("object"!=typeof e||!e)return null;let t=e,o=Bc(t.title,100),n=Bc(t.teaser??t.excerpt??t.description,120),r=function(e){if("string"!=typeof e||e.length>2048)return null;let t;try{t=new URL(e)}catch{return null}if(t.origin!==Fc||t.username||t.password)return null;let o=t.href;return/^[\x21-\x7E]+$/.test(o)?o:null}(t.url);if(null===r&&void 0===t.url&&"string"==typeof t.slug&&Hc.test(t.slug)&&(r=`${Fc}/blog/${t.slug}`),!o||!n||null===r)return null;let a=function(e){if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e))return Number.isFinite(Date.parse(e))?e.slice(0,10):void 0}(t.date);return a?{title:o,teaser:n,url:r,date:a}:{title:o,teaser:n,url:r}}function zc(e){let t=e;if(!Array.isArray(e)&&"object"==typeof e&&e&&(t=e.posts),!Array.isArray(t))return[];let o=[];for(let e of t){let t=Lc(e);t&&o.push(t)}let n=e=>e.date?Date.parse(e.date):-1/0;return o.sort((e,t)=>n(t)-n(e)).slice(0,3)}let Gc=null;function Kc(e){return s.join(e,"blog-posts.json")}function Jc(e=Z.APP_DIR){try{if(Gc&&Gc.length>0)return Gc;let t=function(e){try{let t=Kc(e);return K.statSync(t).size>Mc?[]:zc(JSON.parse(K.readFileSync(t).toString("utf8")))}catch{return[]}}(e);return t.length>0?t:zc(jc)}catch{return[]}}function Wc(e){return e>-6e4&&e<864e5}async function Yc(e){let t=new AbortController,o=setTimeout(()=>t.abort(),e);"object"==typeof o&&"unref"in o&&o.unref();try{let e=await fetch("https://barazany.dev/posts.json",{signal:t.signal,headers:{accept:"application/json"}});if(!e.ok)return await(e.body?.cancel().catch(()=>{})),[];let o=await async function(e,t){let o=Number(e.headers.get("content-length"));if(Number.isFinite(o)&&o>Mc)return await(e.body?.cancel().catch(()=>{})),null;if(!e.body){let t=await e.text();return Buffer.byteLength(t)>Mc?null:t}let n=e.body.getReader(),r=()=>{n.cancel().catch(()=>{})};t.addEventListener("abort",r,{once:!0});let a=[],i=0;try{for(;;){let{done:e,value:t}=await n.read();if(e)break;if(i+=t.byteLength,i>Mc)return await n.cancel().catch(()=>{}),null;a.push(t)}}finally{t.removeEventListener("abort",r)}return t.aborted?null:Buffer.concat(a).toString("utf8")}(e,t.signal);return null===o?[]:zc(JSON.parse(o))}finally{clearTimeout(o)}}async function Vc(e={}){try{if("1"===y.env.COPILOT_API_NO_BLOG||"1"===y.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let t=e.dir??Z.APP_DIR,o=e.now??Date.now();if(await async function(e,t){try{let o=Kc(e),n=await K.promises.stat(o);if(n.size<=Mc){let e=await K.promises.readFile(o),n=JSON.parse(e.toString("utf8"));if("number"==typeof n.fetchedAt)return Wc(t-n.fetchedAt)}return Wc(t-n.mtimeMs)}catch{return!1}}(t,o))return;let n=await Yc(e.timeoutMs??3e3);if(0===n.length)return;Gc=n,await async function(e,t,o){let n=Kc(e),r=`${n}.${y.pid}.tmp`;try{await K.promises.writeFile(r,`${JSON.stringify({fetchedAt:o,posts:t})}\n`),await K.promises.rename(r,n)}catch(e){throw await K.promises.rm(r,{force:!0}).catch(()=>{}),e}}(t,n,o)}catch(e){o.debug("Blog posts refresh skipped:",e)}}async function Xc(e){let t;try{({login:t}=await Zc(e))}catch(e){return void o.error("Copilot fallback disabled: GitHub Copilot login failed; serving from Foundry only.",e)}try{await qn(),o.info("Copilot fallback enabled for Foundry rate limits, errors and timeouts")}catch(e){o.error("Copilot fallback disabled: could not load the Copilot model list; serving from Foundry only.",e)}return t}async function Zc(e){e._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 t,n=e._t2||process.env.GH_TOKEN;n?(function(e){le._t2=e,ar=!1}(n),o.info("Using provided Auth token")):await hr();try{t=await No(),await bt(le,t.login)}catch(e){throw o.error("Failed to get user info for machine ID generation:",e),Error("Cannot proceed without user information",{cause:e})}return await(async()=>{let{token:e,refresh_in:t}=await Ro();le._t1=e,o.debug("Service token fetched successfully!"),le.showToken&&o.info("Service token:",e),rr=!0,fr(t),ft.start(),er=()=>{o.debug("Network connectivity restored, attempting immediate token refresh"),dr(3,500,"network-restored").catch(e=>{o.error("Unexpected error in network-restored token refresh:",e)})},tr=()=>{o.debug("Network connectivity lost")},ft.on("online",er),ft.on("offline",tr)})(),t}function Qc(e,t=""){let o,n=function(){let{platform:e,ppid:t,env:o}=y;if("win32"===e){try{if(_(`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}function eu(e,t){return{version:t.version,port:e.port,accountType:e.accountType,verbose:e.verbose,manualApprove:e.manual,rateLimitSeconds:e.rateLimit??0,rateLimitWait:e.rateLimitWait,timeoutMs:e.timeout,showToken:e.showToken,_cc1:e._cc1,model:e.model,smallModel:e.smallModel,_t3:t._t3,provider:e.provider,fallback:e.fallback,foundryAuth:t.foundryAuth}}const tu=e=>`[1m${e}[0m`,ou=e=>`[2m${e}[0m`,nu=e=>`[36m${e}[0m`,ru=e=>`[32m${e}[0m`,au=e=>`[33m${e}[0m`,iu=e=>`[4m${e}[0m`,su=(e,t)=>`]8;;${e}\\${t}]8;;\\`,lu="?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=startup_banner",cu="https://github.com/johnib/copilot-api-issues/issues",uu=ou(" ─────────────────────────────────────────────────────────────");function pu(e){return void 0===e?"":e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}function du(e){return e&&0!==e.length?e.join("·"):"—"}function mu(e){if(0===e.length)return[];let t=["",uu,` ${tu("BARAZANY.DEV")} ${ou("— Recent Posts")}`,uu,""];for(let[o,n]of e.entries()){let e=`${n.url}${lu}`,r=su(e,tu(iu(`[${o+1}]`)));t.push(` ${r} ${nu(n.title)}`,` ${ou("→")} ${ou(n.teaser)}`,"")}return t.push(uu,` ${su(`https://barazany.dev/blog${lu}`,"barazany.dev/blog")}`,uu),t}function fu(e){let t=[];le.connectivity.h2Keepalive?t.push("HTTP/2 keepalive"):le.connectivity.h2&&t.push("HTTP/2"),t.push(`timeout ${e.timeout/1e3}s`);let o=e.webSearchProviders.length>0?`${e.webSearchProviders.map(e=>(e=>e&&e[0].toUpperCase()+e.slice(1))(e)).join(ou(" → "))} ${ru("✓")}`:ou("off"),n=["",` ${tu("COPILOT-API")} ${ou(`v${e.version}`)}`,uu,` ${ou("Runtime")} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${ou("User")} ${e.user} ${ou("·")} ${e.accountType}`];return le._v1&&n.push(` ${ou("Client")} VSCode ${le._v1}`),n.push(` ${ou("Network")} ${t.join(ou(" · "))}`,` ${ou("Search")} ${o}`),e.clipboardCopied&&n.push(` ${ou("Clipboard")} Claude Code command ${ru("✓")}`),n.push(uu),n}function hu(e){if(!e.model&&!e.smallModel)return[];let t=["",` ${tu("Active")}`];if(e.model){let o=le.models?.data.find(t=>t.id===e.model),n=pu(o?.capabilities.limits?.max_context_window_tokens),r=du(o?.capabilities.supports.reasoning_effort);t.push(` ${nu(e.model.padEnd(32))} ${ou("ctx")} ${tu(n.padStart(5))} ${ou("effort")} ${ou(r)} ${au("← main")}`)}if(e.smallModel){let o=le.models?.data.find(t=>t.id===e.smallModel),n=pu(o?.capabilities.limits?.max_context_window_tokens),r=du(o?.capabilities.supports.reasoning_effort);t.push(` ${e.smallModel.padEnd(32)} ${ou("ctx")} ${n.padStart(5)} ${ou("effort")} ${ou(r)} ${au("← small")}`)}return t}function gu(e){let t=[];for(let[o,n]of function(){let e=[],t=[],o=[],n=[];for(let r of le.models?.data??[]){let a=r.capabilities.limits?.max_context_window_tokens,i={id:r.id,ctx:a,effort:r.capabilities.supports.reasoning_effort};r.id.startsWith("text-embedding")?n.push(i):"Anthropic"===r.vendor?e.push(i):"Google"===r.vendor?o.push(i):t.push(i)}return[["Claude",e],["OpenAI",t],["Gemini",o],["Embedding",n]]}())if(0!==n.length){t.push("",` ${tu(o)}`);for(let r of n){let n=r.id===e.model||r.id===e.smallModel,a=n?nu("●"):ou("·"),i=n?nu(r.id.padEnd(34)):r.id.padEnd(34),s=r.ctx?pu(r.ctx).padStart(5):"".padStart(5),l="Embedding"===o?"":` ${du(r.effort)}`;t.push(` ${a} ${i} ${ou(s)}${ou(l)}`)}}return t}function _u(){let e=cu.replace(/^https:\/\//,""),t=su(`${cu}?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=issues_banner`,e);return["",uu,` ${tu("FOUND A BUG?")} ${ou("— Report it on GitHub")}`,uu,"",` ${nu("→")} ${nu(t)}`,` ${ou("Bug reports, feature requests, and questions welcome.")}`,"",uu]}function yu(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=["",uu,` ${tu("Claude Cowork")} ${ou("— Settings → Inference Provider")}`,uu,"",` ${ou("Paste into")} ${tu("inferenceGatewayBaseUrl")}${ou(":")}`,` ${tu(nu(r))}`];return n||a.push("",` ${ou("Your Tailscale hostname is shown by:")} ${nu("tailscale status --self")}`),a.push("",` ${ou("Docs:")} ${nu("https://claude.com/docs/cowork/3p/installation")}`),a}function wu(e){if(!e.https||!e.https.selfSigned)return[];let{certPath:t}=e.https,o=["",uu,` ${tu("HTTPS")} ${ou("— self-signed cert")}`,uu,"",` ${ou("Cert")} ${t}`];switch(o.push("",` ${tu("Trust this cert")} ${ou("(one-time setup)")}`),y.platform){case"darwin":o.push(` ${ou("macOS:")}`,` ${nu("sudo security add-trusted-cert -d -r trustRoot \\")}`,` ${nu(`-k /Library/Keychains/System.keychain "${t}"`)}`);break;case"win32":o.push(` ${ou("Windows (PowerShell as Administrator):")}`,` ${nu(`Import-Certificate -FilePath "${t}" \``)}`,` ${nu("-CertStoreLocation Cert:\\LocalMachine\\Root")}`);break;case"linux":o.push(` ${ou("Linux (Debian/Ubuntu):")}`,` ${nu(`sudo cp "${t}" /usr/local/share/ca-certificates/copilot-api.crt`)}`,` ${nu("sudo update-ca-certificates")}`,` ${ou("Linux (Fedora/RHEL/Arch):")}`,` ${nu(`sudo cp "${t}" /etc/pki/ca-trust/source/anchors/copilot-api.crt`)}`,` ${nu("sudo update-ca-trust")}`);break;default:o.push(` ${ou("(Unknown platform — see Node fallback below.)")}`)}return o.push("",` ${ou("Or, for Node CLIs only (no admin needed):")}`,` ${nu(`export NODE_EXTRA_CA_CERTS="${t}"`)}`,uu),o}function bu(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`}async function ku(e,t){let o=ct({config:t,startupStage:"upstream_auth"},"copilot_api"),n=Ee.startSpan("copilot_api.server.startup_failed",{kind:u.INTERNAL,attributes:o}),r=function(e){let t=new Set,o=e;for(let e=0;e<=4;e++){if(!(o instanceof Error)||t.has(o))return;if(o instanceof io)return o;t.add(o),o=mo(o)}}(e);r&&(n.setAttribute("http.response.status_code",r.response.status),n.setAttribute("url.full",r.response.url)),st(n,e),n.end();let a=e instanceof Error?e.message:String(e);it(w.ERROR,"ERROR","Server startup failed",{...o,"exception.message":Ut(r&&r!==e?`${a} (cause: ${r.message})`:a)}),await Se()}const vu=s.join(Z.APP_DIR,"certs"),xu=s.join(vu,"cert.pem"),Tu=s.join(vu,"key.pem"),Au=s.join(vu,"cert.meta.json");async function $u(e){try{return await a.readFile(e,"utf8")}catch{return}}async function Su(e){let t=await $u(xu),o=await $u(Tu),n=await async function(){let e=await $u(Au);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 Eu(e){return 0!==Y(e)}async function Ou(e){await a.mkdir(vu,{recursive:!0});let t=new Date,o=new Date;o.setDate(o.getDate()+825);let n=["127.0.0.1","::1"],r=new Set(["localhost"]),i=new Set(n);for(let t of e)Eu(t)?i.add(t):r.add(t);let s=[...[...r].map(e=>({type:2,value:e})),...[...i].map(e=>({type:7,ip:e}))],l=await V([{name:"commonName",value:"localhost"},{name:"organizationName",value:"copilot-api"}],{keyType:"ec",curve:"P-256",algorithm:"sha256",notBeforeDate:t,notAfterDate:o,extensions:[{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:s}]});return await a.writeFile(xu,l.cert,{mode:420}),await a.writeFile(Tu,l.private,{mode:384}),await async function(e){await a.writeFile(Au,JSON.stringify(e,null,2),{mode:420})}({hosts:[...r,...i].sort(),notAfter:o.toISOString()}),{cert:l.cert,key:l.private,certPath:xu,keyPath:Tu,generated:!0}}const Cu=[],Iu=Date.now();let Ru="";function Nu(){let e=async(e,t=0)=>{let n=Ee.startSpan("copilot_api.server.shutdown",{kind:u.INTERNAL,attributes:{"copilot_api.shutdown.reason":e,"copilot_api.shutdown.exit_code":t,"copilot_api.uptime_seconds":(Date.now()-Iu)/1e3}});for(let t of Cu)try{await t()}catch(e){o.error("Error during cleanup:",e)}n.end(),function(e,t){let o=su("https://barazany.dev?utm_source=copilot-cli&utm_medium=terminal&utm_campaign=goodbye_banner","barazany.dev"),n=["",uu,` ${tu("COPILOT-API")} ${ou(`v${e}`)} ${ou("·")} ${bu(t)} uptime`,uu,""," Check in from time to time on",` ${nu(o)}`,"",uu,""];console.log(n.join("\n"))}(Ru,Date.now()-Iu),y.exit(t)};y.on("SIGINT",()=>e("SIGINT")),y.on("SIGTERM",()=>e("SIGTERM")),y.on("uncaughtException",t=>{o.error("Uncaught exception:",t),e("uncaughtException",1)}),y.on("unhandledRejection",(t,n)=>{o.error("Unhandled promise rejection at:",n,"reason:",t),e("unhandledRejection",1)})}const Pu=e=>e.filter(e=>bn(e)).map(e=>e.id),qu=e=>e.filter(e=>kn(e)).map(e=>e.id);async function Du(e,t,n){if(!e._cc1)return!1;le.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."),y.exit(1));let r,a,i=function(e,t,n){if(e&&t){if(!n.includes(e))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid model: ${e}`);if(!n.includes(t))throw o.info(`Available services: \n${n.join("\n")}`),Error(`Invalid small model: ${t}`);return{model:e,smallModel:t}}if(e||t)throw Error("Both --model and --small-model must be specified for model selection")}(e.model,e.smallModel,Pu(le.models.data));i?(r=i.model,a=i.smallModel):(r=await o.prompt("Select a model to use",{type:"select",options:Pu(le.models.data)}),a=await o.prompt("Select a small model to use",{type:"select",options:Pu(le.models.data)}));let s=Qc({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 h.writeSync(s),!0}catch{return o.warn("Failed to copy to clipboard. Here is the command:"),o.log(s),!1}}function ju(e){return e._t2?"cli_arg":y.env.GH_TOKEN?"env_var":"stored"}function Mu(e){let{options:t,version:o,runtime:n,_u1:r}=e,a=Ee.startSpan("copilot_api.server.startup",{kind:u.INTERNAL,attributes:ct({config:eu(t,{version:o,_t3:ju(t),foundryAuth:le.foundry?.auth}),runtime:n,identity:{_u1:r.login,machineId:le.machineId,sessionId:le.sessionId,_v1:le._v1},connectivity:le.connectivity,modelsCount:le.models?.data.length??0,startupDurationMs:Date.now()-Iu},"copilot_api")});if(le.models?.data)for(let e of le.models.data)a.addEvent("copilot_api.model.available",ct(e,"model"));a.end(),it(w.INFO,"INFO","Server started",ct({version:o,port:t.port,accountType:t.accountType,_u1:r.login,modelsCount:le.models?.data.length??0,startupDurationMs:Date.now()-Iu},"copilot_api"))}async function Fu(e,t){try{return await async function(e){return"foundry"===e.provider?(le.foundry=Xo(process.env),le.connectivity.h2=!1,le.connectivity.h2Keepalive=!1,"entra"===le.foundry.auth&&await Lo(le.foundry),o.info(`Using Microsoft Foundry upstream: ${le.foundry.endpoint} (${"entra"===le.foundry.auth?"Entra ID":"API key"} auth)`),{login:("copilot"===e.fallback?await Xc(e):void 0)??"foundry"}):Zc(e)}(e)}catch(o){throw await ku(o,{version:t,provider:e.provider,accountType:e.accountType,_t3:ju(e)}),o}}async function Hu(e){if(e.https){if(e.httpsCert&&e.httpsKey)return async function(e,t){let[o,n]=await Promise.all([a.readFile(e,"utf8"),a.readFile(t,"utf8")]);return{cert:o,key:n,certPath:e,keyPath:t,generated:!1}}(e.httpsCert,e.httpsKey);if(e.httpsCert||e.httpsKey)throw Error("Both --https-cert and --https-key must be provided together");return async function(e=[]){if(await Su(e)){let e=await $u(xu),t=await $u(Tu);if(e&&t)return{cert:e,key:t,certPath:xu,keyPath:Tu,generated:!1}}return o.info("Generating new self-signed TLS certificate…"),Ou(e)}(e.httpsHosts)}}async function Uu(e){let t=function(e){if(!e.claudeCowork)return e;if(e.httpsCert&&e.httpsKey)return{...e,https:!0};let{certPath:t,keyPath:n}=Vr;try{J(t),J(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(Nu(),Cu.push(()=>{o.debug("Cleaning up connectivity monitor"),ft.stop()},()=>{o.debug("Cleaning up token management"),o.debug("Cleaning up token management"),rr=!1,Zn&&=void clearInterval(Zn),er&&=void ft.off("online",er),tr&&=void ft.off("offline",tr),Qn=void 0,or=void 0},async()=>{o.debug("Cleaning up HTTP/2 client"),await async function(){o.debug("Stopping HTTP/2 pool"),La&&=void clearInterval(La),za&&=void clearInterval(za);let e=[...Ha.keys(),...Ua];Ha.clear(),Ua.clear(),Fa.clear(),Ba=void 0;for(let t of e)Ga(t)&&(Je.add(1,{event:"closed"}),await t.close())}()},async()=>{o.debug("Shutting down OTel SDK"),await Se()}),t.verbose&&(o.level=5,o.info("Verbose logging enabled")),t._cc1&&t.codex)throw Error("Cannot use --claude-code and --codex together");le.provider=t.provider,le.accountType=t.accountType,le.manualApprove=t.manual,le.rateLimitSeconds=t.rateLimit,le.rateLimitWait=t.rateLimitWait,le.showToken=t.showToken,le.timeoutMs=t.timeout,le.connectivity.timeoutMs=t.connectTimeout,le.webSearchProviders=t.webSearchProviders,le.errorReporting=function(e){let t=y.env.COPILOT_API_ERROR_REPORTING;return(void 0===t||!["0","false","no","off"].includes(t.trim().toLowerCase()))&&e}(t.errorReporting),function(){let e="1"===y.env.COPILOT_H2_KEEPALIVE||"true"===y.env.COPILOT_H2_KEEPALIVE,t=e||"1"===y.env.COPILOT_H2||"true"===y.env.COPILOT_H2;le.connectivity.h2=t,le.connectivity.h2Keepalive=e}(),await Q(),Vc().catch(()=>{}),Vn();let n=await Jt();Ru=n;let r=Wt();!function(e,t){t&&(Te=t),xe=crypto.randomUUID();let o=T({[O]:"copilot-api",[C]:e,[E]:xe}),{endpoint:n,headers:r}=$e();ve=new S({resource:o,traceExporter:new x({url:`${n}/v1/traces`,headers:r}),metricReader:new $({exporter:new v({url:`${n}/v1/metrics`,headers:r}),exportIntervalMillis:15e3}),logRecordProcessors:[new A({exporter:new k({url:`${n}/v1/logs`,headers:r})})],instrumentations:[]}),ve.start()}(n,Iu);let a=await Fu(t,n);await async function(){try{return await Yn({refreshFallback:!1}),!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})`,a="foundry"===le.provider?"Foundry":"Copilot";return o.warn(`Could not fetch model list from ${a}${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(()=>{Yn().then(()=>{o.info("Model cache populated successfully on deferred retry")}).catch(()=>{})},e);t.unref()}(3e4);let i=function(e=18e5){let t=setInterval(()=>{Yn().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)}}();Cu.push(()=>{o.debug("Cleaning up model refresh interval"),i()}),le.connectivity.h2&&(Wa(Ja(kt(le))),le.connectivity.h2Keepalive&&Va()),Mu({options:t,version:n,runtime:r,_u1:a});let s=await Hu(t),l=s?"https":"http",c=`${l}://localhost:${t.port}`,u=await Du(t,c,s)||await async function(e,t,n){if(!e.codex)return!1;let r;if(le.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."),y.exit(1)),e.model){let t=qu(le.models.data);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:qu(le.models.data)});let a=Qc({OPENAI_BASE_URL:t,OPENAI_API_KEY:"dummy",NODE_EXTRA_CA_CERTS:n?.certPath},`codex --model ${r}`);try{return h.writeSync(a),!0}catch{return o.warn("Failed to copy to clipboard. Here is the Codex CLI command:"),o.log(a),!1}}(t,c,s);(function(e){let t=[...fu(e),...hu(e),...gu(e),..._u(),"",...mu(Jc()),...yu(e),...wu(e),""];console.log(t.join("\n"))})(await async function(e){let{options:t,version:o,runtime:n,user:r,clipboardCopied:a,tls:i}=e,s=i?"https":"http";return{version:o,runtime:n,user:r,accountType:t.accountType,port:t.port,timeout:t.timeout,webSearchProviders:t.webSearchProviders.map(e=>e.name),model:t.model,smallModel:t.smallModel,clipboardCopied:a,https:i?{certPath:i.certPath,keyPath:i.keyPath,generated:i.generated,selfSigned:!t.httpsCert}:void 0,endpoints:t.claudeCowork?{scheme:s,port:t.port,hostname:await Mr()}:void 0}}({options:t,version:n,runtime:r,user:a.login,clipboardCopied:u,tls:s})),Dc(),W({fetch:lc.fetch,port:t.port,hostname:t.hostname,tls:s?{cert:s.cert,key:s.key}:void 0,bun:{idleTimeout:255}}),function(e,t,n){o.info(`Server listening on ${e}://${t}:${n}`)}(l,t.hostname,t.port),t.smokeTest&&"copilot"===t.provider&&await async function(e,t,n){try{o.start("Running first-run self-test (one tiny generation)…");let r=await pc({model:t});if(r.ok){let t=void 0===n||["::1","127.0.0.1","localhost"].includes(n)?`Point your client at ${e}`:`Point your client at ${e} — you bound ${n}, so from another machine/container replace \`localhost\` with this host's reachable IP/hostname.`;return void o.success(`Self-test passed — generation works via ${r.model} (${r.durationMs}ms). ${t}`)}let a=r.status?` (HTTP ${r.status})`:"";o.warn(`Self-test FAILED${a}: ${r.reason??"unknown error"}`),r.detail&&o.info(` detail: ${sa(r.detail)}`),o.info(" The server is still running. Run `copilot-api doctor` to diagnose, or `--no-smoke-test` to skip this check.")}catch(e){o.warn("First-run self-test could not run:",e instanceof Error?e.message:String(e))}}(c,t.smallModel??t.model,t.hostname)}function Bu(e,t){let o=Number.parseInt(e,10);if(Number.isNaN(o))throw Error(`${t} must be a number, got: "${e}"`);return o}const Lu=e({meta:{name:"start",description:"Start the API server"},args:{provider:{type:"string",description:'Upstream provider: "copilot" (default) or "foundry" (Microsoft Foundry / Azure OpenAI; reads FOUNDRY_ENDPOINT, plus FOUNDRY_API_KEY or an Entra ID login such as az login). Overrides COPILOT_API_PROVIDER.'},fallback:{type:"string",description:'With --provider foundry: "copilot" re-sends a Foundry-rate-limited (429) request to GitHub Copilot and keeps that model on Copilot until Foundry\'s retry-after passes. Overrides COPILOT_API_FALLBACK.'},port:{alias:"p",type:"string",default:"4141",description:"Port to listen on"},hostname:{alias:"H",type:"string",default:"127.0.0.1",description:"Hostname/IP to bind the server to. Defaults to 127.0.0.1 (localhost only) for security. Use 0.0.0.0 only when you intentionally need LAN/network/Docker exposure."},verbose:{alias:"v",type:"boolean",default:!1,description:"Enable verbose logging"},"account-type":{alias:"a",type:"string",default:"individual",description:"Account type (individual, business, enterprise)"},manual:{type:"boolean",default:!1,description:"Enable manual request approval"},"rate-limit":{alias:"r",type:"string",description:"Rate limit in seconds between requests"},wait:{alias:"w",type:"boolean",default:!1,description:"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set"},"github-token":{alias:"g",type:"string",description:"Auth token (visible in process list — prefer GH_TOKEN env var)"},"claude-code":{alias:"c",type:"boolean",default:!1,description:"Generate a command to launch with API config"},codex:{type:"boolean",default:!1,description:"Generate a command to launch Codex CLI with Copilot API config"},model:{alias:"m",type:"string",description:"Model to use (with --claude-code or --codex)"},"small-model":{alias:"s",type:"string",description:"Small/fast model to use (requires --claude-code)"},"show-token":{type:"boolean",default:!1,description:"Show tokens on fetch and refresh"},"error-reporting":{type:"boolean",default:!0,description:"Send anonymous, sanitized error reports to the maintainer to help fix bugs (no prompts, completions, or tokens). Use --no-error-reporting or COPILOT_API_ERROR_REPORTING=0 to disable."},timeout:{alias:"t",type:"string",description:"API timeout in milliseconds (default: 600000)"},"connect-timeout":{type:"string",description:"Connectivity probe timeout in milliseconds (default: 15000). Overrides COPILOT_CONNECT_TIMEOUT_MS env var."},"tavily-api-key":{type:"string",description:"[DEPRECATED — set the TAVILY_API_KEY env var instead] Tavily API key for web search."},"web-search-provider":{type:"string",description:'Web search failover order, e.g. "exa,tavily" (first = primary, rest = fallbacks). Web search turns on when TAVILY_API_KEY and/or EXA_API_KEY are set; this flag is optional and only orders the providers you configured.'},https:{type:"boolean",default:!1,description:"Serve over HTTPS using a self-signed certificate (auto-generated and persisted)"},"https-cert":{type:"string",description:"Path to a PEM-encoded TLS certificate (use with --https-key to bring your own cert)"},"https-key":{type:"string",description:"Path to a PEM-encoded TLS private key (use with --https-cert to bring your own cert)"},"https-hosts":{type:"string",description:"Extra hostnames or IPs to include in the self-signed cert's SANs (comma-separated). Example: --https-hosts host.docker.internal,192.168.1.42"},"claude-cowork":{type:"boolean",default:!1,description:"Print Claude Cowork-specific setup hints (inference endpoint URLs to paste into Cowork's apiHost setting)"},"smoke-test":{type:"boolean",default:!0,description:"After startup, run one tiny self-test generation to verify the proxy works end-to-end and print a clear PASS/FAIL. Disable with --no-smoke-test (or COPILOT_API_NO_SMOKE_TEST=1)."}},run({args:e}){let t=e["rate-limit"],n=void 0===t?void 0:Bu(t,"--rate-limit"),r=e.timeout,a=void 0===r?se:Bu(r,"--timeout"),i=function(e,t){let o=e??t,n=void 0===o?15e3:Bu(o,"--connect-timeout");if(n<1e3)throw Error(`--connect-timeout must be at least 1000ms, got: ${n}`);return n}(e["connect-timeout"],y.env.COPILOT_CONNECT_TIMEOUT_MS),s=e["https-hosts"],l=s?s.split(",").map(e=>e.trim()).filter(Boolean):[],c=e["web-search-provider"]??y.env.WEB_SEARCH_PROVIDER,u=c?c.split(",").map(e=>e.trim()).filter(Boolean):[];e["tavily-api-key"]&&o.warn("--tavily-api-key is deprecated; set the TAVILY_API_KEY environment variable instead.");let p=function(e){let t={tavily:e.tavilyApiKey,exa:e.exaApiKey},n=(e.order??[]).map(e=>e.toLowerCase());for(let e of n)if(!$l(e))throw Error(`Unknown web search provider: "${e}". Valid providers: ${Al.join(", ")}`);let r=n.length>0?n:Al,a=new Set,i=n.length>0,s=[];for(let e of r){if(!$l(e)||a.has(e))continue;a.add(e);let n=t[e];n?s.push({name:e,key:n}):i&&o.warn(`Web search provider "${e}" was requested but no API key is configured — skipping.`)}return s}({tavilyApiKey:e["tavily-api-key"]||y.env.TAVILY_API_KEY,exaApiKey:y.env.EXA_API_KEY,order:u}),d=(y.env.COPILOT_API_NO_SMOKE_TEST??"").trim().toLowerCase(),m=""!==d&&"0"!==d&&"false"!==d,f=function(e,t){let o=(e??t??"copilot").trim().toLowerCase();if("copilot"===o||"foundry"===o)return o;throw Error(`--provider must be "copilot" or "foundry", got: "${o}"`)}(e.provider,y.env.COPILOT_API_PROVIDER);return Uu({provider:f,fallback:Pn(e.fallback,y.env.COPILOT_API_FALLBACK,f),port:Bu(e.port,"--port"),hostname:e.hostname,verbose:e.verbose,accountType:e["account-type"],manual:e.manual,rateLimit:n,rateLimitWait:e.wait,_t2:e["github-token"],_cc1:e["claude-code"],codex:e.codex,model:e.model,smallModel:e["small-model"],showToken:e["show-token"],timeout:a,connectTimeout:i,webSearchProviders:p,https:e.https,httpsCert:e["https-cert"],httpsKey:e["https-key"],httpsHosts:l,claudeCowork:e["claude-cowork"],errorReporting:e["error-reporting"],smokeTest:e["smoke-test"]&&!m})}});$c||($c=!0,o.setReporters([Ac(o.options.reporters)]));const zu=function(e){let t=e.slice(2);return"start"===t.find(e=>!e.startsWith("-"))&&!t.includes("--help")&&!t.includes("-h")}(process.argv);(function(){if(Nc||"1"===process.env.COPILOT_API_SKIP_UPDATE_CHECK)return;let e=new AbortController;Pc=e,Nc=qc(e).catch(()=>null)})(),zu||Dc();const Gu=e({meta:{name:"copilot-api",description:"API proxy server for tool integration."},subCommands:{auth:yr,start:Lu,"check-usage":Nr,debug:Xt,doctor:Tc,"cowork-setup":aa}});await t(Gu),zu||(Pc?.abort(),Pc=void 0,Nc=void 0);export{};
|
package/package.json
CHANGED