copilot-api-node20 0.16.0 → 0.17.1
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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e from"consola";import t from"node:fs/promises";import n from"node:os";import r from"node:path";import{SpanKind as i,SpanStatusCode as a,metrics as o,trace as s}from"@opentelemetry/api";import{SeverityNumber as c,logs as l}from"@opentelemetry/api-logs";import{OTLPLogExporter as u}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as d}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as f}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as p}from"@opentelemetry/resources";import{BatchLogRecordProcessor as m}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as h}from"@opentelemetry/sdk-metrics";import{NodeSDK as ee}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_NAME as te,ATTR_SERVICE_VERSION as ne}from"@opentelemetry/semantic-conventions";import{request as re}from"undici";import{createHash as ie,randomBytes as g,randomUUID as _}from"node:crypto";const v=r.join(n.homedir(),`.local`,`share`,`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),ae=r.join(v,`\u0067\u0069\u0074\u0068\u0075\u0062_token`),oe=r.join(v,`machine_id`),se=r.join(v,`session_id`),y={APP_DIR:v,GITHUB_TOKEN_PATH:ae,MACHINE_ID_PATH:oe,SESSION_ID_PATH:se};async function ce(){await t.mkdir(y.APP_DIR,{recursive:!0}),await b(y.GITHUB_TOKEN_PATH),await b(y.SESSION_ID_PATH)}async function b(e){try{await t.access(e,t.constants.W_OK)}catch{await t.writeFile(e,``),await t.chmod(e,384)}}const x=6e5,S={accountType:`individual`,manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:x,connectivity:{enabled:!0,probeEndpoints:[`https://api.\u0067\u0069\u0074\u0068\u0075\u0062.com`,`https://www.google.com`,`https://1.1.1.1`],fastProbeInterval:5e3,slowProbeInterval:6e4,timeoutMs:5e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0,h2:!1,h2Keepalive:!1}},C=e=>e>=1e5||e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString(),w=(e,t)=>e.padEnd(t),le=(e,t)=>{if(!S.models)return``;let n=S.models.data.find(e=>e.id===t);if(!n)return``;let r=n.capabilities.limits?.max_context_window_tokens;if(!r)return``;let i=(e/r*100).toFixed(1);return` (${i}%)`},ue=e=>{let t=[];if(e.model){let n=w(e.model,18);t.push(n)}if(e.tokenUsage){let n=e.tokenUsage,r=(n.inputTokens||0)+(n.outputTokens||0),i=e.model?le(r,e.model):``,a=C(n.inputTokens||0).padStart(5),o=C(n.outputTokens||0).padStart(5),s=`↑${a} │ ↓${o}`,c=w(s,18),l=C(r),u=i?`${l}${i.padStart(15-l.length)}`:l.padEnd(15);t.push(`Tokens: ${c} | Context: ${u}`)}else if(e.model){let e=w(`N/A`,18),n=`N/A`.padEnd(15);t.push(`Tokens: ${e} | Context: ${n}`)}if(e.copilotDuration){let n=w(`${Math.round(e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);t.push(`API: ${n}`)}return t.length>0?` | ${t.join(` | `)}`:``},T={completionCallbacks:new Map,registerCompletion(e,t,n){this.completionCallbacks.set(e,{context:t,startTime:n,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(t){let{context:n,startTime:r}=t,i=Date.now(),a=i-r,o=n.get(`requestData`),s=w(n.req.method,4),l=w(n.req.path,21),u=w(n.res.status.toString(),3),d=w(`${a}ms`,8),f=` --> ${s}${l}${u} ${d}`;o&&(f+=ue(o)),e.info(f),V(c.INFO,`INFO`,`Request completed`,{"http.method":n.req.method,"http.path":n.req.path,"http.status_code":n.res.status,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.duration_ms":a,...o?.model&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":o.model},...o?.copilotDuration&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_duration_ms":Math.round(o.copilotDuration)},...o?.tokenUsage?.inputTokens&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens":o.tokenUsage.inputTokens},...o?.tokenUsage?.outputTokens&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens":o.tokenUsage.outputTokens}})},logRateLimit(t,n){let{context:r,startTime:i}=t,a=Date.now(),o=a-i,s=n.headers.get(`x-ratelimit-exceeded`)||``,c=s.split(`:`)[1]||`unknown`,l=n.headers.get(`retry-after`)||n.headers.get(`x-ratelimit-user-retry-after`)||`?`,u=w(r.req.method,4),d=w(r.req.path,21),f=w(`429`,3),p=w(`${o}ms`,8),m=`⚠ --> ${u}${d}${f} ${p}`;m+=` | Rate limited (${l}s retry) | ${c}`;let h=r.get(`requestData`);if(h?.copilotDuration){let e=w(`${Math.round(h.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);m+=` | API: ${e}`}e.info(m)},cleanup(){let e=1e3,t=Date.now()-300*1e3;for(let[e,n]of this.completionCallbacks)n.startTime<t&&this.completionCallbacks.delete(e);if(this.completionCallbacks.size>e){let t=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),n=t.slice(0,t.length-e);for(let[e]of n)this.completionCallbacks.delete(e)}}};setInterval(()=>T.cleanup(),60*1e3);let E,D=Date.now();const O=`https://api.\u0068\u006f\u006e\u0065\u0079\u0063\u006f\u006d\u0062.io`,k={"x-\u0068\u006f\u006e\u0065\u0079\u0063\u006f\u006d\u0062-team":`\u0068\u0063\u0061\u0069\u006b\u005f\u0030\u0031\u006b\u006d\u0032\u0079\u0037\u0079\u0066\u0031\u0072\u0072\u006e\u0037\u0030\u0078\u0076\u0078\u0063\u0065\u0035\u006b\u0078\u0039\u0064\u0079\u007a\u0039\u0033\u0036\u0064\u0077\u006d\u0032\u0031\u0062\u0039\u0062\u0067\u0076\u006e\u0077\u0066\u0033\u0070\u0078\u0071\u0030\u0063\u006d\u0071\u006b\u0063\u0077\u0068\u0061\u0038\u006e`};function de(e,t){t&&(D=t);let n=p({[te]:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,[ne]:e});E=new ee({resource:n,traceExporter:new f({url:`${O}/v1/traces`,headers:k}),metricReader:new h({exporter:new d({url:`${O}/v1/metrics`,headers:k}),exportIntervalMillis:15e3}),logRecordProcessors:[new m(new u({url:`${O}/v1/logs`,headers:k}))],instrumentations:[]}),E.start()}async function fe(){E&&await E.shutdown()}const A=s.getTracer(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),j=o.getMeter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),pe=l.getLogger(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),me=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.requests.total`,{unit:`{request}`,description:`Total requests received`}),he=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.requests.errors`,{unit:`{error}`,description:`Total error responses`}),ge=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.input`,{unit:`{token}`,description:`Total input tokens consumed`}),M=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.output`,{unit:`{token}`,description:`Total output tokens generated`}),N=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.cached`,{unit:`{token}`,description:`Total cached prompt tokens`}),P=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.triggers`,{unit:`{trigger}`,description:`Rate limit trigger count`}),F=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model_validation.errors`,{unit:`{error}`,description:`Model validation failures`}),I=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model_mapping.mappings`,{unit:`{mapping}`,description:`Model name normalizations`}),L=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempts`,{unit:`{attempt}`,description:`Token refresh attempts`}),_e=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.failures`,{unit:`{failure}`,description:`Token refresh final failures`}),ve=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.checks`,{unit:`{check}`,description:`Connectivity probe results`}),R=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.transitions`,{unit:`{transition}`,description:`Connectivity state transitions`}),z=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.upstream.requests`,{unit:`{request}`,description:`Upstream API calls`}),ye=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.chunks`,{unit:`{chunk}`,description:`Total SSE chunks sent`}),be=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.decisions`,{unit:`{decision}`,description:`Manual approval decisions`}),xe=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2_keepalive.pings`,{unit:`{ping}`,description:`HTTP/2 keepalive pings sent`}),Se=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.connections`,{unit:`{connection}`,description:`HTTP/2 connection lifecycle events`}),Ce=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request.duration`,{unit:`ms`,description:`Total request duration`}),we=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074.duration`,{unit:`ms`,description:`Upstream \u0043\u006f\u0070\u0069\u006c\u006f\u0074 API call duration`}),Te=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.duration`,{unit:`ms`,description:`Duration of SSE streaming phase`}),Ee=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_duration`,{unit:`ms`,description:`Duration of rate limit waits`}),De=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.duration`,{unit:`ms`,description:`Translation layer processing time`}),Oe=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.duration`,{unit:`ms`,description:`Token refresh duration`}),B=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.probe_duration`,{unit:`ms`,description:`Individual connectivity probe duration`}),ke=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.per_request.input`,{unit:`{token}`,description:`Input tokens per request distribution`}),Ae=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.per_request.output`,{unit:`{token}`,description:`Output tokens per request distribution`}),je=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.chunks_per_request`,{unit:`{chunk}`,description:`Chunks per streaming request`}),Me=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration`,{unit:`ms`,description:`Time waiting for manual approval`});j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.status`,{unit:`{status}`,description:`1 = online, 0 = offline`}).addCallback(e=>{e.observe(K.getConnectivityStats().isOnline?1:0)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures`,{unit:`{failure}`,description:`Current consecutive connectivity failure count`}).addCallback(e=>{e.observe(K.getConnectivityStats().consecutiveFailures)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.models.available`,{unit:`{model}`,description:`Number of available models`}).addCallback(e=>{e.observe(S.models?.data.length??0)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.completion_logger.pending`,{unit:`{callback}`,description:`Number of pending completion callbacks`}).addCallback(e=>{e.observe(T.completionCallbacks.size)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.uptime`,{unit:`s`,description:`Server uptime in seconds`}).addCallback(e=>{e.observe((Date.now()-D)/1e3)});function V(e,t,n,r){let i=s.getActiveSpan(),a=i?.spanContext();pe.emit({severityNumber:e,severityText:t,body:n,attributes:{...r,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function H(e,t=``){let n={};if(e==null)return n;if(typeof e!=`object`)return(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)&&t&&(n[t]=e),n;if(Array.isArray(e))return t&&(n[t]=JSON.stringify(e)),n;for(let[r,i]of Object.entries(e)){let e=t?`${t}.${r}`:r;if(i===void 0||typeof i==`function`)continue;i===null?n[e]=`null`:typeof i==`object`&&!Array.isArray(i)?Object.assign(n,H(i,e)):Array.isArray(i)?n[e]=JSON.stringify(i):(typeof i==`string`||typeof i==`number`||typeof i==`boolean`)&&(n[e]=i)}return n}const U=new Set([`authorization`,`cookie`,`set-cookie`,`x-\u0068\u006f\u006e\u0065\u0079\u0063\u006f\u006d\u0062-team`,`x-api-key`,`proxy-authorization`]);function W(e,t,n){for(let[r,i]of Object.entries(n)){let n=r.toLowerCase();if(U.has(n))continue;e.setAttribute(`http.${t}.header.${n}`,i)}}function Ne(e,t){t.headers.forEach((t,n)=>{let r=n.toLowerCase();U.has(r)||e.setAttribute(`http.response.header.${r}`,t)})}async function G(e){let{spanName:t,url:n,target:r,method:o=`GET`,headers:s,body:c,signal:l,extraAttributes:u}=e,d=A.startSpan(t,{kind:i.CLIENT,attributes:{"http.method":o,"url.full":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.target":r,...u}});s&&W(d,`request`,s);try{let e=await fetch(n,{method:o,headers:s,body:c,signal:l});return d.setAttribute(`http.response.status_code`,e.status),Ne(d,e),z.add(1,{target:r,status_code:String(e.status)}),e.ok||d.setStatus({code:a.ERROR,message:`HTTP ${e.status}`}),{response:e,span:d}}catch(e){let t=e instanceof Error?e:Error(String(e));throw d.setStatus({code:a.ERROR,message:t.message}),d.recordException(t),d.end(),e}}async function Pe(e){let{spanName:t,url:n,target:r,method:o=`POST`,headers:s,body:c,signal:l,headersTimeout:u,bodyTimeout:d,extraAttributes:f,dispatcher:p}=e,m=A.startSpan(t,{kind:i.CLIENT,attributes:{"http.method":o,"url.full":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.target":r,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.enabled":p!==void 0,...f}});W(m,`request`,s);try{let{statusCode:e,headers:t,body:i}=await re(n,{method:o,headers:s,body:c,signal:l,headersTimeout:u,bodyTimeout:d,dispatcher:p});m.setAttribute(`http.response.status_code`,e);for(let[e,n]of Object.entries(t)){let t=e.toLowerCase();n!==void 0&&!U.has(t)&&m.setAttribute(`http.response.header.${t}`,Array.isArray(n)?n.join(`, `):n)}return z.add(1,{target:r,status_code:String(e)}),e>=400&&m.setStatus({code:a.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:i,span:m}}catch(e){let t=e instanceof Error?e:Error(String(e));throw m.setStatus({code:a.ERROR,message:t.message}),m.recordException(t),m.end(),e}}var Fe=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(){if(!S.connectivity.enabled){e.debug(`Connectivity monitoring disabled`);return}e.info(`Starting connectivity monitor`,{probeEndpoints:S.connectivity.probeEndpoints,fastInterval:S.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){e.debug(`Stopping connectivity monitor`),this.checkInterval&&=(clearTimeout(this.checkInterval),void 0),this.abortController&&=(this.abortController.abort(),void 0)}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let t=this.isOnline?S.connectivity.slowProbeInterval:S.connectivity.fastProbeInterval,n=Math.random()*S.connectivity.jitterMaxMs,r=t+n;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(t=>{e.error(`Connectivity check failed:`,t)})},r)}async performConnectivityCheck(){let t=A.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.probe`);this.abortController=new AbortController;let n=setTimeout(()=>this.abortController?.abort(),S.connectivity.timeoutMs);try{let n=!1;for(let t of S.connectivity.probeEndpoints)try{let e=performance.now(),r=await fetch(t,{method:`HEAD`,signal:this.abortController.signal,headers:{"User-Agent":`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api-connectivity-monitor/1.0`,...S.connectivity.dnsCache&&{"Cache-Control":`max-age=300`}}}),i=performance.now()-e;if(r.ok){n=!0,this.lastSuccessfulEndpoint=t,B.record(i,{endpoint:t,result:`success`});break}B.record(i,{endpoint:t,result:`failed`})}catch(n){this.endpointFailureStats[t]=(this.endpointFailureStats[t]||0)+1,e.debug(`Probe failed for ${t}:`,n)}this.updateConnectivityState(n),t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.result`,n?`online`:`offline`),t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures`,this.consecutiveFailures),this.lastSuccessfulEndpoint&&t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.successful_endpoint`,this.lastSuccessfulEndpoint),ve.add(1,{result:n?`online`:`offline`})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(n),t.end(),this.scheduleNextCheck()}}updateConnectivityState(t){let n=this.isOnline;if(this.isOnline=t,this.lastChecked=new Date().toISOString(),t){let t=this.consecutiveFailures;this.consecutiveFailures>0&&e.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,n||(this.dispatchEvent(new CustomEvent(`online`)),R.add(1,{from:`offline`,to:`online`}),V(c.INFO,`INFO`,`Connectivity restored`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures_before_recovery":t}))}else this.consecutiveFailures++,n&&(e.warn(`Connectivity lost`),this.dispatchEvent(new CustomEvent(`offline`)),R.add(1,{from:`online`,to:`offline`}),V(c.WARN,`WARN`,`Connectivity lost`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(t){this.lastErrorType=t.name,this.lastErrorMessage=t.message,e.error(`Connectivity check failed:`,t),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?S.connectivity.slowProbeInterval:S.connectivity.fastProbeInterval,t=new Date(Date.now()+e+Math.random()*S.connectivity.jitterMaxMs).toISOString();return{currentInterval:e,nextCheckEstimate:t,lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:S.connectivity.jitterMaxMs>0,connectionPooling:S.connectivity.connectionPooling,dnsCache:S.connectivity.dnsCache}}};const K=new Fe,q=()=>({"content-type":`application/json`,accept:`application/json`}),J=`0.43.2026033104`,Y=`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-chat/${J}`,X=`\u0047\u0069\u0074\u0048\u0075\u0062\u0043\u006f\u0070\u0069\u006c\u006f\u0074Chat/${J}`,Ie=e=>{let t=ie(`sha256`);return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||`anonymous`),t.update(n.hostname()),t.update(e),t.update(Date.now().toString()),t.update(g(16)),t.digest(`hex`)},Le=e=>{let t=e.replaceAll(/[^\w.-]/g,`_`).trim();if(t.length===0||t===`.`||t===`..`||/^[_.]+$/.test(t))throw Error(`Invalid \u0047\u0069\u0074\u0048\u0075\u0062 username: cannot be empty or consist only of special characters after sanitization`);return`${y.MACHINE_ID_PATH}_${t}`},Re=async e=>{let n=Le(e);try{let e=await t.readFile(n,`utf8`);if(e.trim())return e.trim()}catch{}let r=Ie(e);return await t.writeFile(n,r),await t.chmod(n,384),r},ze=async()=>{try{let e=await t.readFile(y.SESSION_ID_PATH,`utf8`);if(e.trim())return e.trim()}catch{}let e=_();return await t.writeFile(y.SESSION_ID_PATH,e),await t.chmod(y.SESSION_ID_PATH,384),e},Z=async(e,t)=>{e.machineId||=await Re(t),e.sessionId||=await ze()},Be=e=>e.accountType===`individual`?`https://api.\u0067\u0069\u0074\u0068\u0075\u0062\u0063\u006f\u0070\u0069\u006c\u006f\u0074.com`:`https://api.${e.accountType}.\u0067\u0069\u0074\u0068\u0075\u0062\u0063\u006f\u0070\u0069\u006c\u006f\u0074.com`,Ve=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error(`\u0056\u0053\u0043\u006f\u0064\u0065 identifiers not initialized. Call initialize\u0056\u0053\u0043\u006f\u0064\u0065Identifiers() during startup.`);let n=_(),r={Authorization:`Bearer ${e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Token}`,"Content-Type":`application/json`,accept:`*/*`,"accept-encoding":`br, gzip, deflate`,"accept-language":`*`,"sec-fetch-mode":`cors`,"\u0043\u006f\u0070\u0069\u006c\u006f\u0074-Integration-Id":`\u0076\u0073\u0063\u006f\u0064\u0065-chat`,"Editor-Version":`\u0076\u0073\u0063\u006f\u0064\u0065/${e.\u0076\u0073\u0043\u006f\u0064\u0065Version}`,"Editor-Plugin-Version":Y,"User-Agent":X,"\u0056\u0053\u0063\u006f\u0064\u0065-MachineId":e.machineId,"\u0056\u0053\u0063\u006f\u0064\u0065-SessionId":e.sessionId,"\u004f\u0070\u0065\u006e\u0041\u0049-Intent":`conversation-agent`,"X-Interaction-Type":`conversation-agent`,"X-Agent-Task-Id":n,"X-\u0056\u0053\u0043\u006f\u0064\u0065-User-Agent-Library-Version":`node-fetch`,"X-\u0047\u0069\u0074\u0048\u0075\u0062-Api-Version":`2025-05-01`,"X-Interaction-Id":_(),"X-Request-Id":n};return t&&(r[`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-vision-request`]=`true`),r},Q=`https://api.\u0067\u0069\u0074\u0068\u0075\u0062.com`,He=e=>({...q(),authorization:`token ${e.\u0067\u0069\u0074\u0068\u0075\u0062Token}`,"editor-version":`\u0076\u0073\u0063\u006f\u0064\u0065/${e.\u0076\u0073\u0043\u006f\u0064\u0065Version}`,"editor-plugin-version":Y,"user-agent":X,"x-\u0067\u0069\u0074\u0068\u0075\u0062-api-version":`2025-04-01`,"x-\u0076\u0073\u0063\u006f\u0064\u0065-user-agent-library-version":`node-fetch`}),Ue=`https://\u0067\u0069\u0074\u0068\u0075\u0062.com`,We=`\u0030\u0031\u0061\u0062\u0038\u0061\u0063\u0039\u0034\u0030\u0030\u0063\u0034\u0065\u0034\u0032\u0039\u0062\u0032\u0033`,Ge=[`user:email`].join(` `);var $=class extends Error{response;constructor(e,t){super(e),this.response=t}};async function Ke(t,n){let r=s.getActiveSpan();if(n instanceof $&&n.response.status===429){let e=t.get(`requestId`),i=T.completionCallbacks.get(e);i&&(T.logRateLimit(i,n.response),T.completionCallbacks.delete(e)),P.add(1,{action:`rejected`,source:`upstream`});let o=await n.response.text(),s;try{s=JSON.parse(o)}catch{s={error:{message:o,type:`error`}}}return r?.setStatus({code:a.ERROR,message:`Rate limited by upstream`}),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,`rate_limit_upstream`),V(c.WARN,`WARN`,`Upstream rate limit hit`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":429,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":`rate_limit_upstream`}),t.json(s,429)}if(e.error(`Error occurred:`,n),n instanceof $){let i=await n.response.text(),o;try{o=JSON.parse(i)}catch{o=i}return e.error(`HTTP error:`,o),r?.setStatus({code:a.ERROR,message:n.message}),r?.recordException(n),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,`HTTPError`),V(c.ERROR,`ERROR`,`HTTP error: ${n.message}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":n.response.status,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":`HTTPError`}),t.json({error:{message:i,type:`error`}},n.response.status)}let i=n instanceof Error?n:Error(String(n));return r?.setStatus({code:a.ERROR,message:i.message}),r?.recordException(i),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,i.name),V(c.ERROR,`ERROR`,`Unhandled error: ${i.message}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":500,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":i.name}),t.json({error:{message:i.message,type:`error`}},500)}async function qe(){let e=`${Q}/user`,t=S.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),t);try{let{response:t,span:r}=await G({spanName:`\u0067\u0069\u0074\u0068\u0075\u0062 GET /user`,url:e,target:`\u0067\u0069\u0074\u0068\u0075\u0062_user`,headers:{authorization:`token ${S.\u0067\u0069\u0074\u0068\u0075\u0062Token}`,...q()},signal:n.signal});if(!t.ok)throw r.end(),new $(`Failed to get \u0047\u0069\u0074\u0048\u0075\u0062 user`,t);let i=await t.json();return r.end(),i}finally{clearTimeout(r)}}export{T as _c1,x as DEFAULT_TIMEOUT_MS,Q as _g1,Ge as _g4,Ue as _g2,We as _g3,$ as HTTPError,y as PATHS,U as SENSITIVE_HEADERS,c as SeverityNumber,be as approvalCounter,Me as approvalWaitHistogram,N as cachedTokensCounter,je as chunksPerRequestHistogram,K as connectivityMonitor,Be as _s1,we as copilotDurationHistogram,Ve as _s2,V as emitLog,ce as ensurePaths,he as errorsCounter,H as flattenAttributes,Ke as _c2,qe as _s4,He as _s3,Se as h2ConnectionCounter,xe as h2KeepaliveCounter,de as initOtel,Z as _s5,ge as inputTokensCounter,ke as inputTokensPerRequestHistogram,I as modelMappingCounter,F as modelValidationErrorCounter,M as outputTokensCounter,Ae as outputTokensPerRequestHistogram,P as rateLimitCounter,Ee as rateLimitWaitHistogram,Ce as requestDurationHistogram,me as requestsCounter,fe as shutdownOtel,q as _c3,S as state,ye as streamChunksCounter,Te as streamDurationHistogram,L as tokenRefreshAttemptCounter,Oe as tokenRefreshDurationHistogram,_e as tokenRefreshFailureCounter,G as tracedFetch,Pe as tracedUndiciRequest,A as tracer,De as translationDurationHistogram};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_s4 as e}from"./get-user-CxrXN3q7.js";export{e as _s4};
|
package/dist/main.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{_c1 as e,DEFAULT_TIMEOUT_MS as t,_g1 as n,_g4 as r,_g2 as i,_g3 as a,HTTPError as o,PATHS as s,SENSITIVE_HEADERS as c,SeverityNumber as l,approvalCounter as u,approvalWaitHistogram as d,cachedTokensCounter as f,chunksPerRequestHistogram as p,connectivityMonitor as m,_s1 as h,copilotDurationHistogram as
|
|
2
|
+
import{_c1 as e,DEFAULT_TIMEOUT_MS as t,_g1 as n,_g4 as r,_g2 as i,_g3 as a,HTTPError as o,PATHS as s,SENSITIVE_HEADERS as c,SeverityNumber as l,approvalCounter as u,approvalWaitHistogram as d,cachedTokensCounter as f,chunksPerRequestHistogram as p,connectivityMonitor as m,_s1 as h,copilotDurationHistogram as ee,_s2 as g,emitLog as _,ensurePaths as te,errorsCounter as ne,flattenAttributes as v,_c2 as y,_s4 as re,_s3 as ie,h2ConnectionCounter as b,h2KeepaliveCounter as ae,initOtel as oe,_s5 as se,inputTokensCounter as ce,inputTokensPerRequestHistogram as le,modelMappingCounter as ue,modelValidationErrorCounter as de,outputTokensCounter as fe,outputTokensPerRequestHistogram as pe,rateLimitCounter as me,rateLimitWaitHistogram as he,requestDurationHistogram as ge,requestsCounter as _e,shutdownOtel as ve,_c3 as ye,state as x,streamChunksCounter as be,streamDurationHistogram as xe,tokenRefreshAttemptCounter as Se,tokenRefreshDurationHistogram as Ce,tokenRefreshFailureCounter as we,tracedFetch as S,tracedUndiciRequest as Te,tracer as C,translationDurationHistogram as Ee}from"./get-user-CxrXN3q7.js";import{defineCommand as w,runMain as De}from"citty";import T from"consola";import E from"node:fs/promises";import Oe from"node:os";import{SpanKind as D,SpanStatusCode as O,context as ke,trace as Ae}from"@opentelemetry/api";import{Client as je}from"undici";import Me from"clipboardy";import k from"node:process";import{serve as Ne}from"srvx";import Pe from"tiny-invariant";import{execSync as Fe}from"node:child_process";import{Hono as A}from"hono";import{cors as Ie}from"hono/cors";import{streamSSE as Le}from"hono/streaming";import{events as Re}from"fetch-event-stream";import{Tokenizer as ze,models as Be}from"ai-tokenizer";import*as Ve from"ai-tokenizer/encoding/\u0063\u006c\u0061\u0075\u0064\u0065";const He=async()=>{let e=`${n}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/v2/token`,t=x.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),t);try{let{response:t,span:n}=await S({spanName:`\u0067\u0069\u0074\u0068\u0075\u0062 GET /\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/v2/token`,url:e,target:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_token`,headers:ie(x),signal:r.signal});if(!t.ok)throw n.end(),new o(`Failed to get Service token`,t);let i=await t.json();return n.end(),i}finally{clearTimeout(i)}};async function Ue(){let e=new AbortController,t=x.timeoutMs,n=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${i}/login/device/code`,{method:`POST`,headers:ye(),body:JSON.stringify({client_id:a,scope:r}),signal:e.signal});if(!t.ok)throw new o(`Failed to get device code`,t);return await t.json()}finally{clearTimeout(n)}}const We=async()=>{let e=`${h(x)}/models`,t=g(x),n=x.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),n);try{let{response:n,span:i}=await S({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 GET /models`,url:e,target:`models`,headers:t,signal:r.signal});if(!n.ok)throw i.end(),new o(`Failed to get models`,n);let a=await n.json();return i.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.models_count`,a.data.length),i.end(),a}finally{clearTimeout(i)}};function Ge(){return`1.115.0-insider`}Ge();const j=e=>new Promise(t=>{setTimeout(t,e)}),Ke=e=>e==null;async function qe(){let e=await We();x.models=e}const Je=()=>{let e=Ge();x.vsCodeVersion=e,T.info(`Using client version: ${e}`)};async function Ye(e){let t=(e.interval+1)*1e3;for(T.debug(`Polling access token with interval of ${t}ms`);;){let n=new AbortController,r=x.timeoutMs,o=setTimeout(()=>{n.abort()},r);try{let r=await fetch(`${i}/login/oauth/access_token`,{method:`POST`,headers:ye(),body:JSON.stringify({client_id:a,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`}),signal:n.signal});if(!r.ok){await j(t),T.error(`Failed to poll access token:`,await r.text());continue}let o=await r.json();T.debug(`Polling access token response:`,o);let{access_token:s}=o;if(s)return s;await j(t)}catch(e){if(e instanceof Error&&e.name===`AbortError`){T.error(`Access token polling timed out`),await j(t);continue}throw e}finally{clearTimeout(o)}}}let Xe,M=!1,N,P;function Ze(){T.debug(`Cleaning up token management`),Xe&&=(clearInterval(Xe),void 0),N&&=(m.off(`online`,N),void 0),P&&=(m.off(`offline`,P),void 0)}const Qe=()=>E.readFile(s.GITHUB_TOKEN_PATH,`utf8`),$e=e=>E.writeFile(s.GITHUB_TOKEN_PATH,e),et=async()=>{let{token:e,refresh_in:t}=await He();x.copilotToken=e,T.debug(`Service token fetched successfully!`),x.showToken&&T.info(`Service token:`,e);let n=(t-60)*1e3,r=async(e=5,t=1e3,n=`scheduled`)=>{if(M){T.debug(`Refresh already in progress, skipping`);return}return M=!0,C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token.refresh`,async r=>{let i=performance.now();r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.reason`,n),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.max_retries`,e);try{for(let a=1;a<=e;a++)try{r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempt`,a),T.debug(`Refreshing Service token (${n}, attempt ${a}/${e})`);let{token:t}=await He();x.copilotToken=t,T.debug(`Service token refreshed successfully`),x.showToken&&T.info(`Refreshed Service token:`,t),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.success`,!0),Se.add(1,{reason:n,success:`true`}),Ce.record(performance.now()-i,{reason:n}),_(l.INFO,`INFO`,`Token refreshed successfully (${n})`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.reason":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempt":a});return}catch(o){let s=a===e;if(T.error(`Failed to refresh Service token (attempt ${a}/${e}):`,o),Se.add(1,{reason:n,success:`false`}),s){T.error(`All refresh attempts failed. May be unavailable until next scheduled refresh.`);let t=o instanceof Error?o:Error(String(o));r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.success`,!1),r.setStatus({code:O.ERROR,message:t.message}),r.recordException(t),we.add(1,{reason:n}),Ce.record(performance.now()-i,{reason:n}),_(l.ERROR,`ERROR`,`Token refresh failed after ${e} attempts (${n})`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.reason":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempts":e});return}let c=t*2**(a-1);T.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),M=!1}})};Xe=setInterval(()=>{r(5,1e3,`scheduled`).catch(e=>{T.error(`Unexpected error in scheduled token refresh:`,e)})},n),m.start(),N=()=>{T.debug(`Network connectivity restored, attempting immediate token refresh`),r(3,500,`network-restored`).catch(e=>{T.error(`Unexpected error in network-restored token refresh:`,e)})},P=()=>{T.debug(`Network connectivity lost`)},m.on(`online`,N),m.on(`offline`,P)};async function F(e){try{let t=await Qe();if(t&&!e?.force){x.githubToken=t,x.showToken&&T.info(`Auth token:`,t),await tt();return}T.info(`Authentication required`);let n=await Ue();T.debug(`Device code response:`,n),T.info(`Please enter the code "${n.user_code}" in ${n.verification_uri}`);let r=await Ye(n);await $e(r),x.githubToken=r,x.showToken&&T.info(`Auth token:`,r),await tt()}catch(e){throw e instanceof o?(T.error(`Failed to get Auth token:`,await e.response.json()),e):(T.error(`Failed to get Auth token:`,e),e)}}async function tt(){let e=await re();T.info(`Authenticated as ${e.login}`)}async function nt(e){e.verbose&&(T.level=5,T.info(`Verbose logging enabled`)),x.showToken=e.showToken,await te(),await F({force:!0}),T.success(`Auth token written to`,s.GITHUB_TOKEN_PATH)}const rt=w({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}){return nt({verbose:e.verbose,showToken:e[`show-token`]})}}),it=async()=>{let e=`${n}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/user`,t=x.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),t);try{let{response:t,span:n}=await S({spanName:`\u0067\u0069\u0074\u0068\u0075\u0062 GET /\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/user`,url:e,target:`usage`,headers:ie(x),signal:r.signal});if(!t.ok)throw n.end(),new o(`Failed to get usage`,t);let i=await t.json();return n.end(),i}finally{clearTimeout(i)}},at=w({meta:{name:`check-usage`,description:`Show current usage/quota information`},async run(){await te(),await F();try{let e=await it(),t=e.quota_snapshots.premium_interactions,n=t.entitlement,r=n-t.remaining,i=n>0?r/n*100:0,a=t.percent_remaining;function o(e,t){if(!t)return`${e}: N/A`;let n=t.entitlement,r=n-t.remaining,i=n>0?r/n*100:0,a=t.percent_remaining;return`${e}: ${r}/${n} used (${i.toFixed(1)}% used, ${a.toFixed(1)}% remaining)`}let s=`Premium: ${r}/${n} used (${i.toFixed(1)}% used, ${a.toFixed(1)}% remaining)`,c=o(`Chat`,e.quota_snapshots.chat),l=o(`Completions`,e.quota_snapshots.completions);T.box(`Usage (plan: ${e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_plan})\nQuota resets: ${e.quota_reset_date}\n\nQuotas:\n ${s}\n ${c}\n ${l}`)}catch(e){T.error(`Failed to fetch usage:`,e),process.exit(1)}}});async function ot(){try{let e=new URL(`../package.json`,import.meta.url).pathname,t=await E.readFile(e),n=JSON.parse(t.toString());return n.version}catch{return`unknown`}}function st(){let e=typeof Bun<`u`;return{name:e?`bun`:`node`,version:e?Bun.version:process.version.slice(1),platform:Oe.platform(),arch:Oe.arch()}}async function ct(){try{let e=await E.stat(s.GITHUB_TOKEN_PATH);if(!e.isFile())return!1;let t=await E.readFile(s.GITHUB_TOKEN_PATH,`utf8`);return t.trim().length>0}catch{return!1}}async function lt(){let[e,t]=await Promise.all([ot(),ct()]);return{version:e,runtime:st(),paths:{APP_DIR:s.APP_DIR,GITHUB_TOKEN_PATH:s.GITHUB_TOKEN_PATH},tokenExists:t}}function ut(e){T.info(`service debug
|
|
3
3
|
|
|
4
4
|
Version: ${e.version}
|
|
5
5
|
Runtime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})
|
|
@@ -8,15 +8,15 @@ Paths:
|
|
|
8
8
|
- APP_DIR: ${e.paths.APP_DIR}
|
|
9
9
|
- \u0047\u0049\u0054\u0048\u0055\u0042_TOKEN_PATH: ${e.paths.\u0047\u0049\u0054\u0048\u0055\u0042_TOKEN_PATH}
|
|
10
10
|
|
|
11
|
-
Token exists: ${e.tokenExists?`Yes`:`No`}`)}function at(e){console.log(JSON.stringify(e,null,2))}async function ot(e){let t=await rt();e.json?at(t):it(t)}const st=T({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}){return ot({json:e.json})}});function ct(){let{platform:e,ppid:t,env:n}=A;if(e===`win32`){try{let e=`wmic process get ParentProcessId,Name | findstr "${t}"`,n=je(e,{stdio:`pipe`}).toString();if(n.toLowerCase().includes(`powershell.exe`))return`powershell`}catch{return`cmd`}return`cmd`}else{let e=n.SHELL;if(e){if(e.endsWith(`zsh`))return`zsh`;if(e.endsWith(`fish`))return`fish`;if(e.endsWith(`bash`))return`bash`}return`sh`}}function lt(e,t=``){let n=ct(),r=Object.entries(e).filter(([,e])=>e!==void 0),i;switch(n){case`powershell`:i=r.map(([e,t])=>`$env:${e} = ${t}`).join(`; `);break;case`cmd`:i=r.map(([e,t])=>`set ${e}=${t}`).join(` & `);break;case`fish`:i=r.map(([e,t])=>`set -gx ${e} ${t}`).join(`; `);break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(` `);i=r.length>0?`export ${e}`:``;break}}if(i&&t){let e=n===`cmd`?` & `:` && `;return`${i}${e}${t}`}return i||t}function ut(){return`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}function dt(e){return e.includes(`/messages`)?`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`:e.includes(`/chat/completions`)?`\u006f\u0070\u0065\u006e\u0061\u0069`:e.includes(`/embeddings`)?`embeddings`:e.includes(`/models`)?`models`:e.includes(`/usage`)?`usage`:e.includes(`/token`)?`token`:`unknown`}function ft(){return async(t,n)=>{let r=Date.now(),i=ut(),a=t.req.method,o=t.req.path,s=dt(o);t.set(`requestId`,i),t.header(`x-request-id`,i);let l=w.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.handle_request`,{kind:O.SERVER,attributes:{"http.method":a,"http.url":t.req.url,"http.route":o,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request_id":i,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.endpoint_type":s}});for(let[e,n]of Object.entries(t.req.header())){let t=e.toLowerCase();if(c.has(t))continue;l.setAttribute(`http.request.header.${t}`,n)}let u=De.setSpan(Ee.active(),l);await Ee.with(u,async()=>{e.registerCompletion(i,t,r);try{await n()}catch(e){let t=e instanceof Error?e:Error(String(e));throw l.setStatus({code:k.ERROR,message:t.message}),l.recordException(t),e}});let d=Date.now()-r,p=t.get(`requestData`),m=t.res.status,h=p?.model??`unknown`,g=p?.streaming??!1;if(l.setAttribute(`http.status_code`,m),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model`,h),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming`,g),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.duration_ms`,d),p?.copilotDuration&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_duration_ms`,p.copilotDuration),p?.tokenUsage){let e=p.tokenUsage;l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens`,e.inputTokens),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens`,e.outputTokens),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.total_tokens`,e.totalTokens),e.cachedTokens&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.cached_tokens`,e.cachedTokens),e.estimatedCost&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.estimated_cost`,e.estimatedCost)}t.res.headers.forEach((e,t)=>{let n=t.toLowerCase();c.has(n)||l.setAttribute(`http.response.header.${n}`,e)}),m>=400&&l.setStatus({code:k.ERROR,message:`HTTP ${m}`}),l.end();let _={method:a,path:o,status_code:String(m),model:h,streaming:String(g),endpoint_type:s};if(me.add(1,_),pe.record(d,_),m>=400&&ee.add(1,{method:a,path:o,status_code:String(m),error_type:m>=500?`server_error`:`client_error`}),p?.tokenUsage){let e=p.tokenUsage,t={model:h,endpoint_type:s};e.inputTokens&&(ae.add(e.inputTokens,t),oe.record(e.inputTokens,t)),e.outputTokens&&(le.add(e.outputTokens,t),ue.record(e.outputTokens,t)),e.cachedTokens&&f.add(e.cachedTokens,{model:h})}p?.tokenUsage&&e.executeCompletion(i)}}const pt=async()=>w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.await`,async e=>{let t=performance.now();try{let n=await E.prompt(`Accept incoming request?`,{type:`confirm`}),r=performance.now()-t;if(e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration_ms`,r),d.record(r),!n)throw e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`rejected`),u.add(1,{result:`rejected`}),new o(`Request rejected`,Response.json({message:`Request rejected`},{status:403}));e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`approved`),u.add(1,{result:`approved`})}finally{e.end()}}),mt={input:3e-6,output:15e-6};function z(e){let t=e.prompt_tokens||0,n=e.completion_tokens||0,r=e.total_tokens||t+n,i=t*mt.input+n*mt.output;return{inputTokens:t,outputTokens:n,totalTokens:r,estimatedCost:i,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function B(e,t){t.prompt_tokens!==void 0&&e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens`,t.prompt_tokens),t.completion_tokens!==void 0&&e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens`,t.completion_tokens),t.total_tokens!==void 0&&e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.total_tokens`,t.total_tokens)}const ht=[{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[.-]6/i,family:`opus-4.6`},{pattern:/opus[.-]?4[.-]5/i,family:`opus-4.5`},{pattern:/opus/i,family:`opus`}],gt={haiku:`\u0063\u006c\u0061\u0075\u0064\u0065-haiku-4.5`,"sonnet-4.6":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4.6`,"sonnet-4.5":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4.5`,"sonnet-4":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4`,"opus-4.6":`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.6`,"opus-4.5":`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.5`,opus:`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.5`};function _t(e){return e.startsWith(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/`)?e.slice(10):e}function vt(e){let t=e.lastIndexOf(`[`),n=e.lastIndexOf(`]`);return t!==-1&&n===e.length-1&&n>t?[e.slice(0,t),e.slice(t+1,n)]:[e,null]}function yt(e){for(let t of ht)if(t.pattern.test(e))return t.family;return null}function bt(e,t,n=null){let r=gt[e];if(!r)return null;if(n){let e=`${r}-${n}`;if(t.includes(e))return e}if(t.includes(r))return r;if(e===`sonnet-4.5`){let e=[`\u0063\u006c\u0061\u0075\u0064\u0065-3.5-sonnet`];for(let r of e){let e=n?`${r}-${n}`:r;if(t.includes(e))return e}}return null}function xt(e,t){let n=_t(e),[r,i]=vt(n);if(t.includes(n))return n;if(i){let e=`${r}-${i}`,n=e.replaceAll(/(\d)-(\d)\b/g,`$1.$2`);if(t.includes(n))return n}let a=yt(r);if(!a)return null;let o=r.replace(/-\d{8}(?::.*)?$/,``),s=i?`-${i}`:``;for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,``),n=`${o}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,`$1.$2`),r=t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,`$1.$2`);if(r===n)return e}return bt(a,t,i)}var V=class extends Error{statusCode;constructor(e,t=400){super(e),this.name=`ModelValidationError`,this.statusCode=t}};function H(e){if(!e||typeof e!=`string`)throw new V(`Model name is required and must be a string`);if(!S.models?.data)throw new V(`Models not available. Please try again later.`,503);let t=S.models.data.map(e=>e.id),n=xt(e,t);if(!n)throw ce.add(1,{requested_model:e}),new V(`Invalid model: '${e}'. Available services: ${t.join(`, `)}`);return n}async function St(e){if(e.rateLimitSeconds===void 0)return;let t=e.rateLimitSeconds;return w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.check`,async n=>{try{let r=Date.now();if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.configured_seconds`,t),!e.lastRequestTimestamp){e.lastRequestTimestamp=r,n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`allowed`);return}let i=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.elapsed_seconds`,i),i>t){e.lastRequestTimestamp=r,n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`allowed`);return}let a=Math.ceil(t-i);if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_seconds`,a),!e.rateLimitWait)throw n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`rejected`),de.add(1,{action:`rejected`,source:`local`}),E.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new o(`Rate limit exceeded`,Response.json({message:`Rate limit exceeded`},{status:429}));let s=a*1e3;n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`waited`),de.add(1,{action:`waited`,source:`local`}),fe.record(s,{source:`local`}),E.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await N(s),e.lastRequestTimestamp=r,E.info(`Rate limit wait completed, proceeding with request`)}finally{n.end()}})}function Ct(e){let t=e,n=String.fromCodePoint(27),r=t.split(n);if(r.length>1){t=r[0];for(let e=1;e<r.length;e++){let i=r[e],a=i.match(/^\[[0-9;]*[a-z]/i);t+=a?i.slice(a[0].length):n+i}}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 U(e){if(typeof e==`string`)return Ct(e);if(Array.isArray(e)){let t=e.map(e=>U(e));return t}if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=U(r);return t}return e}const wt=async e=>{if(!S.copilotToken)throw Error(`Service token not found`);let t=U(e),n=t.messages.some(e=>typeof e.content!=`string`&&e.content?.some(e=>e.type===`image_url`)),r=t.messages.some(e=>[`assistant`,`tool`].includes(e.role)),i={..._(S,n),"X-Initiator":r?`agent`:`user`},a=`${h(S)}/chat/completions`,s=S.timeoutMs,c=new AbortController,l=setTimeout(()=>c.abort(),s);try{let{statusCode:e,headers:l,body:u,span:d}=await Se({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /chat/completions`,url:a,target:`chat_completions`,headers:i,body:JSON.stringify(t),signal:c.signal,headersTimeout:s,bodyTimeout:s*3,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":t.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming":!!t.stream,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.timeout_ms":s,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.has_tools":!!t.tools?.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tool_count":t.tools?.length??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.message_count":t.messages.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.max_tokens":t.max_tokens??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.vision_enabled":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.initiator":r?`agent`:`user`}}),f=new Response(u,{status:e,headers:l});if(!f.ok)throw d.end(),new o(`Failed to create chat completions`,f);if(t.stream)return{events:Ne(f),span:d};let p=await f.json();return p.id&&d.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.response.id`,p.id),p.usage&&B(d,p.usage),d.end(),p}finally{clearTimeout(l)}};function Tt(e){return w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.validate`,t=>{try{t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.requested`,e.model);let n=H(e.model);return t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,n),n===e.model?(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),e):(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),se.add(1,{from_model:e.model,to_model:n}),E.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function Et(e,t){if(!e.data)return e;try{let n=JSON.parse(e.data);if(n.usage&&t(n.usage),n.usage?.prompt_tokens_details?.cached_tokens!==void 0)return{...e,data:JSON.stringify({...n,usage:{...n.usage,prompt_tokens_details:void 0}})}}catch{}return e}async function Dt(t){await St(S);let n=await t.req.json();E.debug(`Request payload:`,JSON.stringify(n).slice(-400));try{n=Tt(n)}catch(e){if(e instanceof V)return t.json({error:{message:e.message,type:`invalid_request_error`,code:`invalid_model`}},e.statusCode);throw e}if(t.set(`requestData`,{model:n.model,streaming:!!n.stream}),S.manualApprove&&await pt(),Ve(n.max_tokens)){let e=S.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},E.debug(`Set max_tokens to:`,JSON.stringify(n.max_tokens))}let r=performance.now(),i=await wt(n),a=performance.now()-r;if(g.record(a,{model:n.model,target:`chat_completions`,streaming:String(!!n.stream)}),Ot(i)){let e=t.get(`requestData`)||{};return i.usage&&(e.tokenUsage=z(i.usage)),e.copilotDuration=a,t.set(`requestData`,e),E.debug(`Non-streaming response:`,JSON.stringify(i)),t.json(i)}let{events:o,span:s}=i;return M(t,async r=>{let i={value:null},c=0,l=performance.now();try{for await(let e of o){let o=e;e.data&&e.data!==`[DONE]`&&(c++,_e.add(1,{model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`}),o=Et(e,e=>{i.value=e;let n=t.get(`requestData`)||{};n.tokenUsage=z(e),n.copilotDuration=a,t.set(`requestData`,n)})),await r.writeSSE(o)}let e=performance.now()-l,s={model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`};if(ve.record(e,s),p.record(c,s),i.value){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=z(i.value),e.copilotDuration=a,t.set(`requestData`,e))}}finally{i.value&&B(s,i.value),s.end()}let u=t.get(`requestId`);u&&e.executeCompletion(u)})}const Ot=e=>Object.hasOwn(e,`choices`),W=new j;W.post(`/`,async e=>{try{return await Dt(e)}catch(t){return await x(e,t)}});const kt=async e=>{if(!S.copilotToken)throw Error(`Service token not found`);let t=`${h(S)}/embeddings`,n=_(S),r=S.timeoutMs,i=new AbortController,a=setTimeout(()=>i.abort(),r);try{let{response:r,span:a}=await C({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /embeddings`,url:t,target:`embeddings`,method:`POST`,headers:n,body:JSON.stringify(e),signal:i.signal,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":e.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_count":Array.isArray(e.input)?e.input.length:1}});if(!r.ok)throw a.end(),new o(`Failed to create embeddings`,r);let s=await r.json();return a.end(),s}finally{clearTimeout(a)}},G=new j;G.post(`/`,async e=>{try{let t=await e.req.json();try{H(t.model)}catch(t){if(t instanceof V)return e.json({error:{message:t.message,type:`invalid_request_error`,code:`invalid_model`}},t.statusCode);throw t}e.set(`requestData`,{model:t.model});let n=performance.now(),r=await kt(t),i=performance.now()-n;g.record(i,{model:t.model,target:`embeddings`,streaming:`false`});let a=e.get(`requestData`)||{};return a.tokenUsage=z(r.usage),a.copilotDuration=i,e.set(`requestData`,a),e.json(r)}catch(t){return await x(e,t)}});const At=new Pe(Ie),jt=Fe[`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4`].tokens,K={...jt,baseOverhead:4,perTool:27};function q(e){return At.encode(e).length}async function Mt(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 n=K.baseOverhead;if(t.system){let e=typeof t.system==`string`?t.system:t.system.map(e=>e.text).join(`
|
|
11
|
+
Token exists: ${e.tokenExists?`Yes`:`No`}`)}function dt(e){console.log(JSON.stringify(e,null,2))}async function ft(e){let t=await lt();e.json?dt(t):ut(t)}const pt=w({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}){return ft({json:e.json})}}),mt=45e3;let I,L,R;function z(e){return!e.closed&&!e.destroyed}function ht(e){T.debug(`Creating HTTP/2 client for ${e}`);let t=new je(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4});return b.add(1,{event:`created`,origin:e}),_(l.INFO,`INFO`,`HTTP/2 client created for ${e}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.event":`created`,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.origin":e}),t.on(`connect`,()=>{T.debug(`HTTP/2 client connected to ${e}`)}),t.on(`error`,t=>{T.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on(`disconnect`,(n,r,i)=>{T.debug(`HTTP/2 client disconnected from ${e}:`,i.message),b.add(1,{event:`goaway`,origin:e}),_(l.WARN,`WARN`,`HTTP/2 client disconnected from ${e}: ${i.message}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.event":`goaway`,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.origin":e,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.error":i.message}),I===t&&(I=void 0,L=void 0)}),t}function gt(e){if(x.connectivity.h2)return I&&L===e&&z(I)?I:(I&&z(I)&&I.close().catch(e=>{T.debug(`Error closing old HTTP/2 client:`,e)}),I=ht(e),L=e,I)}async function _t(){let e=I;if(!e||!z(e)){T.debug(`HTTP/2 keepalive: no active client, skipping`);return}try{let{statusCode:t,body:n}=await e.request({path:`/models`,method:`GET`,headers:g(x)});await n.dump(),ae.add(1,{result:`success`}),T.debug(`HTTP/2 keepalive: GET /models → ${t}`)}catch(t){ae.add(1,{result:`error`}),T.warn(`HTTP/2 keepalive failed:`,t instanceof Error?t.message:t),b.add(1,{event:`error`,origin:L??``}),z(e)&&e.close().catch(e=>{T.debug(`Error closing broken HTTP/2 client:`,e)}),I===e&&(I=void 0,L=void 0)}}function vt(){R||(T.debug(`Starting HTTP/2 keepalive (every ${mt/1e3}s)`),R=setInterval(()=>{_t().catch(e=>{T.debug(`Unexpected error in HTTP/2 keepalive:`,e)})},mt),R.unref())}async function yt(){T.debug(`Stopping HTTP/2 client`),R&&=(clearInterval(R),void 0);let e=I;I=void 0,L=void 0,e&&z(e)&&(b.add(1,{event:`closed`}),await e.close())}function bt(){let{platform:e,ppid:t,env:n}=k;if(e===`win32`){try{let e=`wmic process get ParentProcessId,Name | findstr "${t}"`,n=Fe(e,{stdio:`pipe`}).toString();if(n.toLowerCase().includes(`powershell.exe`))return`powershell`}catch{return`cmd`}return`cmd`}else{let e=n.SHELL;if(e){if(e.endsWith(`zsh`))return`zsh`;if(e.endsWith(`fish`))return`fish`;if(e.endsWith(`bash`))return`bash`}return`sh`}}function xt(e,t=``){let n=bt(),r=Object.entries(e).filter(([,e])=>e!==void 0),i;switch(n){case`powershell`:i=r.map(([e,t])=>`$env:${e} = ${t}`).join(`; `);break;case`cmd`:i=r.map(([e,t])=>`set ${e}=${t}`).join(` & `);break;case`fish`:i=r.map(([e,t])=>`set -gx ${e} ${t}`).join(`; `);break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(` `);i=r.length>0?`export ${e}`:``;break}}if(i&&t){let e=n===`cmd`?` & `:` && `;return`${i}${e}${t}`}return i||t}function St(){return`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}function Ct(e){return e.includes(`/messages`)?`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`:e.includes(`/chat/completions`)?`\u006f\u0070\u0065\u006e\u0061\u0069`:e.includes(`/embeddings`)?`embeddings`:e.includes(`/models`)?`models`:e.includes(`/usage`)?`usage`:e.includes(`/token`)?`token`:`unknown`}function wt(e){let{c:t,start:n,span:r}=e,i=t.get(`requestData`),a=t.res.status,o=i?.model??`unknown`,s=i?.streaming??!1,l=Date.now()-n;if(r.setAttribute(`http.status_code`,a),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model`,o),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming`,s),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.duration_ms`,l),i?.copilotDuration&&r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_duration_ms`,i.copilotDuration),i?.tokenUsage){let e=i.tokenUsage;r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens`,e.inputTokens),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens`,e.outputTokens),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.total_tokens`,e.totalTokens),e.cachedTokens&&r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.cached_tokens`,e.cachedTokens),e.estimatedCost&&r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.estimated_cost`,e.estimatedCost)}t.res.headers.forEach((e,t)=>{let n=t.toLowerCase();c.has(n)||r.setAttribute(`http.response.header.${n}`,e)}),a>=400&&r.setStatus({code:O.ERROR,message:`HTTP ${a}`}),r.end()}function Tt(t){let{c:n,start:r,method:i,path:a,endpointType:o,requestId:s}=t,c=Date.now()-r,l=n.get(`requestData`),u=n.res.status,d=l?.model??`unknown`,p=l?.streaming??!1,m={method:i,path:a,status_code:String(u),model:d,streaming:String(p),endpoint_type:o};if(_e.add(1,m),ge.record(c,m),u>=400&&ne.add(1,{method:i,path:a,status_code:String(u),error_type:u>=500?`server_error`:`client_error`}),l?.tokenUsage){let e=l.tokenUsage,t={model:d,endpoint_type:o};e.inputTokens&&(ce.add(e.inputTokens,t),le.record(e.inputTokens,t)),e.outputTokens&&(fe.add(e.outputTokens,t),pe.record(e.outputTokens,t)),e.cachedTokens&&f.add(e.cachedTokens,{model:d})}!p&&l?.tokenUsage&&e.executeCompletion(s)}function Et(e){wt(e),Tt(e)}function Dt(){return async(t,n)=>{let r=Date.now(),i=St(),a=t.req.method,o=t.req.path,s=Ct(o);t.set(`requestId`,i),t.header(`x-request-id`,i);let l=C.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.handle_request`,{kind:D.SERVER,attributes:{"http.method":a,"http.url":t.req.url,"http.route":o,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request_id":i,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.endpoint_type":s}});for(let[e,n]of Object.entries(t.req.header())){let t=e.toLowerCase();if(c.has(t))continue;l.setAttribute(`http.request.header.${t}`,n)}let u,d=new Promise(e=>{u=e});t.set(`streamComplete`,d),t.set(`resolveStreamComplete`,u);let f=Ae.setSpan(ke.active(),l);await ke.with(f,async()=>{e.registerCompletion(i,t,r);try{await n()}catch(e){let t=e instanceof Error?e:Error(String(e));throw l.setStatus({code:O.ERROR,message:t.message}),l.recordException(t),e}});let p=t.get(`requestData`),m={c:t,start:r,method:a,path:o,endpointType:s,requestId:i,span:l};p?.streaming?d.then(()=>Et(m)).catch(e=>{T.debug(`Error finalizing streaming request:`,e),l.end()}):Et(m)}}const Ot=async()=>C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.await`,async e=>{let t=performance.now();try{let n=await T.prompt(`Accept incoming request?`,{type:`confirm`}),r=performance.now()-t;if(e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration_ms`,r),d.record(r),!n)throw e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`rejected`),u.add(1,{result:`rejected`}),new o(`Request rejected`,Response.json({message:`Request rejected`},{status:403}));e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`approved`),u.add(1,{result:`approved`})}finally{e.end()}}),kt={input:3e-6,output:15e-6};function B(e){let t=e.prompt_tokens||0,n=e.completion_tokens||0,r=e.total_tokens||t+n,i=t*kt.input+n*kt.output;return{inputTokens:t,outputTokens:n,totalTokens:r,estimatedCost:i,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function V(e,t){t.prompt_tokens!==void 0&&e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens`,t.prompt_tokens),t.completion_tokens!==void 0&&e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens`,t.completion_tokens),t.total_tokens!==void 0&&e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.total_tokens`,t.total_tokens)}const At=[{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[.-]6/i,family:`opus-4.6`},{pattern:/opus[.-]?4[.-]5/i,family:`opus-4.5`},{pattern:/opus/i,family:`opus`}],jt={haiku:`\u0063\u006c\u0061\u0075\u0064\u0065-haiku-4.5`,"sonnet-4.6":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4.6`,"sonnet-4.5":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4.5`,"sonnet-4":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4`,"opus-4.6":`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.6`,"opus-4.5":`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.5`,opus:`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.5`};function Mt(e){return e.startsWith(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/`)?e.slice(10):e}function Nt(e){let t=e.lastIndexOf(`[`),n=e.lastIndexOf(`]`);return t!==-1&&n===e.length-1&&n>t?[e.slice(0,t),e.slice(t+1,n)]:[e,null]}function Pt(e){for(let t of At)if(t.pattern.test(e))return t.family;return null}function Ft(e,t,n=null){let r=jt[e];if(!r)return null;if(n){let e=`${r}-${n}`;if(t.includes(e))return e}if(t.includes(r))return r;if(e===`sonnet-4.5`){let e=[`\u0063\u006c\u0061\u0075\u0064\u0065-3.5-sonnet`];for(let r of e){let e=n?`${r}-${n}`:r;if(t.includes(e))return e}}return null}function It(e,t){let n=Mt(e),[r,i]=Nt(n);if(t.includes(n))return n;if(i){let e=`${r}-${i}`,n=e.replaceAll(/(\d)-(\d)\b/g,`$1.$2`);if(t.includes(n))return n}let a=Pt(r);if(!a)return null;let o=r.replace(/-\d{8}(?::.*)?$/,``),s=i?`-${i}`:``;for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,``),n=`${o}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,`$1.$2`),r=t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,`$1.$2`);if(r===n)return e}return Ft(a,t,i)}var H=class extends Error{statusCode;constructor(e,t=400){super(e),this.name=`ModelValidationError`,this.statusCode=t}};function U(e){if(!e||typeof e!=`string`)throw new H(`Model name is required and must be a string`);if(!x.models?.data)throw new H(`Models not available. Please try again later.`,503);let t=x.models.data.map(e=>e.id),n=It(e,t);if(!n)throw de.add(1,{requested_model:e}),new H(`Invalid model: '${e}'. Available services: ${t.join(`, `)}`);return n}async function Lt(e){if(e.rateLimitSeconds===void 0)return;let t=e.rateLimitSeconds;return C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.check`,async n=>{try{let r=Date.now();if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.configured_seconds`,t),!e.lastRequestTimestamp){e.lastRequestTimestamp=r,n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`allowed`);return}let i=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.elapsed_seconds`,i),i>t){e.lastRequestTimestamp=r,n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`allowed`);return}let a=Math.ceil(t-i);if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_seconds`,a),!e.rateLimitWait)throw n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`rejected`),me.add(1,{action:`rejected`,source:`local`}),T.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new o(`Rate limit exceeded`,Response.json({message:`Rate limit exceeded`},{status:429}));let s=a*1e3;n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`waited`),me.add(1,{action:`waited`,source:`local`}),he.record(s,{source:`local`}),T.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await j(s),e.lastRequestTimestamp=r,T.info(`Rate limit wait completed, proceeding with request`)}finally{n.end()}})}function Rt(e){let t=e,n=String.fromCodePoint(27),r=t.split(n);if(r.length>1){t=r[0];for(let e=1;e<r.length;e++){let i=r[e],a=i.match(/^\[[0-9;]*[a-z]/i);t+=a?i.slice(a[0].length):n+i}}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 W(e){if(typeof e==`string`)return Rt(e);if(Array.isArray(e)){let t=e.map(e=>W(e));return t}if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=W(r);return t}return e}const zt=async e=>{if(!x.copilotToken)throw Error(`Service token not found`);let t=W(e),n=t.messages.some(e=>typeof e.content!=`string`&&e.content?.some(e=>e.type===`image_url`)),r=t.messages.some(e=>[`assistant`,`tool`].includes(e.role)),i={...g(x,n),"X-Initiator":r?`agent`:`user`},a=h(x),s=`${a}/chat/completions`,c=gt(a),l=x.timeoutMs,u=new AbortController,d=setTimeout(()=>u.abort(),l);try{let{statusCode:e,headers:a,body:d,span:f}=await Te({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /chat/completions`,url:s,target:`chat_completions`,headers:i,body:JSON.stringify(t),signal:u.signal,headersTimeout:l,bodyTimeout:l*3,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":t.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming":!!t.stream,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.timeout_ms":l,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.has_tools":!!t.tools?.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tool_count":t.tools?.length??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.message_count":t.messages.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.max_tokens":t.max_tokens??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.vision_enabled":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.initiator":r?`agent`:`user`},dispatcher:c}),p=new Response(d,{status:e,headers:a});if(!p.ok)throw f.end(),new o(`Failed to create chat completions`,p);if(t.stream)return{events:Re(p),span:f};let m=await p.json();return m.id&&f.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.response.id`,m.id),m.usage&&V(f,m.usage),f.end(),m}finally{clearTimeout(d)}};function Bt(e){return C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.validate`,t=>{try{t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.requested`,e.model);let n=U(e.model);return t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,n),n===e.model?(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),e):(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),ue.add(1,{from_model:e.model,to_model:n}),T.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function Vt(e,t){if(!e.data)return e;try{let n=JSON.parse(e.data);if(n.usage&&t(n.usage),n.usage?.prompt_tokens_details?.cached_tokens!==void 0)return{...e,data:JSON.stringify({...n,usage:{...n.usage,prompt_tokens_details:void 0}})}}catch{}return e}async function Ht(t){await Lt(x);let n=await t.req.json();T.debug(`Request payload:`,JSON.stringify(n).slice(-400));try{n=Bt(n)}catch(e){if(e instanceof H)return t.json({error:{message:e.message,type:`invalid_request_error`,code:`invalid_model`}},e.statusCode);throw e}if(t.set(`requestData`,{model:n.model,streaming:!!n.stream}),x.manualApprove&&await Ot(),Ke(n.max_tokens)){let e=x.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},T.debug(`Set max_tokens to:`,JSON.stringify(n.max_tokens))}let r=performance.now(),i=await zt(n),a=performance.now()-r;if(ee.record(a,{model:n.model,target:`chat_completions`,streaming:String(!!n.stream)}),Ut(i)){let e=t.get(`requestData`)||{};return i.usage&&(e.tokenUsage=B(i.usage)),e.copilotDuration=a,t.set(`requestData`,e),T.debug(`Non-streaming response:`,JSON.stringify(i)),t.json(i)}let{events:o,span:s}=i;return Le(t,async r=>{let i={value:null},c=0,l=performance.now();try{try{for await(let e of o){let o=e;e.data&&e.data!==`[DONE]`&&(c++,be.add(1,{model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`}),o=Vt(e,e=>{i.value=e;let n=t.get(`requestData`)||{};n.tokenUsage=B(e),n.copilotDuration=a,t.set(`requestData`,n)})),await r.writeSSE(o)}let e=performance.now()-l,s={model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`};if(xe.record(e,s),p.record(c,s),i.value){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=B(i.value),e.copilotDuration=a,t.set(`requestData`,e))}}finally{i.value&&V(s,i.value),s.end()}let u=t.get(`requestId`);u&&e.executeCompletion(u)}finally{t.get(`resolveStreamComplete`)?.()}})}const Ut=e=>Object.hasOwn(e,`choices`),G=new A;G.post(`/`,async e=>{try{return await Ht(e)}catch(t){return await y(e,t)}});const Wt=async e=>{if(!x.copilotToken)throw Error(`Service token not found`);let t=`${h(x)}/embeddings`,n=g(x),r=x.timeoutMs,i=new AbortController,a=setTimeout(()=>i.abort(),r);try{let{response:r,span:a}=await S({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /embeddings`,url:t,target:`embeddings`,method:`POST`,headers:n,body:JSON.stringify(e),signal:i.signal,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":e.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_count":Array.isArray(e.input)?e.input.length:1}});if(!r.ok)throw a.end(),new o(`Failed to create embeddings`,r);let s=await r.json();return a.end(),s}finally{clearTimeout(a)}},K=new A;K.post(`/`,async e=>{try{let t=await e.req.json();try{U(t.model)}catch(t){if(t instanceof H)return e.json({error:{message:t.message,type:`invalid_request_error`,code:`invalid_model`}},t.statusCode);throw t}e.set(`requestData`,{model:t.model});let n=performance.now(),r=await Wt(t),i=performance.now()-n;ee.record(i,{model:t.model,target:`embeddings`,streaming:`false`});let a=e.get(`requestData`)||{};return a.tokenUsage=B(r.usage),a.copilotDuration=i,e.set(`requestData`,a),e.json(r)}catch(t){return await y(e,t)}});const Gt=new ze(Ve),Kt=Be[`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4`].tokens,q={...Kt,baseOverhead:4,perTool:27};function J(e){return Gt.encode(e).length}async function qt(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 n=q.baseOverhead;if(t.system){let e=typeof t.system==`string`?t.system:t.system.map(e=>e.text).join(`
|
|
12
12
|
|
|
13
|
-
`);n+=
|
|
13
|
+
`);n+=q.perMessage+J(e)*q.contentMultiplier}for(let e of t.messages)n+=q.perMessage,n+=J(e.role),typeof e.content==`string`?n+=J(e.content)*q.contentMultiplier:Array.isArray(e.content)&&(n+=Jt(e.content));return t.tools&&t.tools.length>0&&(n+=Yt(t.tools)),e.json({input_tokens:Math.round(n)})}function Jt(e){let t=0;for(let n of e)switch(n.type){case`text`:t+=J(n.text)*q.contentMultiplier;break;case`tool_use`:{let e=n.name+JSON.stringify(n.input);t+=J(e)*q.contentMultiplier;break}case`tool_result`:n.content&&(t+=J(typeof n.content==`string`?n.content:JSON.stringify(n.content))*q.contentMultiplier);break;case`thinking`:t+=J(n.thinking)*q.contentMultiplier;break;case`image`:t+=1600;break}return t}function Yt(e){let t=q.toolsExist;for(let[n,r]of e.entries())n>0&&(t+=q.perTool),t+=J(r.name),r.description&&(t+=q.perDesc+J(r.description)),t+=Y(r.input_schema);return t}function Y(e){let t=0,n=e.properties;if(!n)return t;let r=Object.entries(n);for(let[e,[n,i]]of r.entries()){if(t+=e===0?q.perFirstProp:q.perAdditionalProp,t+=J(n),i.description&&(t+=q.perPropDesc+J(i.description)),i.enum&&Array.isArray(i.enum)){t+=q.perEnum;for(let e of i.enum)t+=J(String(e))}if(i.type===`object`&&i.properties&&(t+=q.perNestedObject,t+=Y(i)),i.type===`array`&&i.items){let e=i.items;e.type===`object`&&e.properties&&(t+=q.perArrayOfObjects,t+=Y(e))}}return t}function Xt(e){if(e===null)return null;let t={stop:`end_turn`,length:`max_tokens`,tool_calls:`tool_use`,content_filter:`end_turn`};return t[e]}function Zt(e){return{model:Qt(e.model),messages:$t(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:an(e.tools),tool_choice:on(e.tool_choice)}}function Qt(e){return e}function $t(e,t){let n=tn(t),r=e.flatMap(e=>e.role===`user`?nn(e):rn(e));return[...n,...r]}function en(e){return e.startsWith(`x-\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063-billing-header`)?e.replace(/^x-anthropic-billing-header:[^\n]*\n+/,``):e}function tn(e){if(!e)return[];if(typeof e==`string`)return[{role:`system`,content:en(e)}];{let t=e.map(e=>e.text).join(`
|
|
14
14
|
|
|
15
|
-
`);return[{role:`system`,content:
|
|
15
|
+
`);return[{role:`system`,content:en(t)}]}}function nn(e){let t=[];if(Array.isArray(e.content)){let n=e.content.filter(e=>e.type===`tool_result`),r=e.content.filter(e=>e.type!==`tool_result`);for(let e of n)t.push({role:`tool`,tool_call_id:e.tool_use_id,content:X(e.content)});r.length>0&&t.push({role:`user`,content:X(r)})}else t.push({role:`user`,content:X(e.content)});return t}function rn(e){if(!Array.isArray(e.content))return[{role:`assistant`,content:X(e.content)}];let t=e.content.filter(e=>e.type===`tool_use`),n=e.content.filter(e=>e.type===`text`),r=e.content.filter(e=>e.type===`thinking`),i=[...n.map(e=>e.text),...r.map(e=>e.thinking)].join(`
|
|
16
16
|
|
|
17
|
-
`);return t.length>0?[{role:`assistant`,content:i||null,tool_calls:t.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:`assistant`,content:
|
|
17
|
+
`);return t.length>0?[{role:`assistant`,content:i||null,tool_calls:t.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:`assistant`,content:X(e.content)}]}function X(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return null;let t=e.some(e=>e.type===`image`);if(!t)return e.filter(e=>e.type===`text`||e.type===`thinking`).map(e=>e.type===`text`?e.text:e.thinking).join(`
|
|
18
18
|
|
|
19
|
-
`);let n=[];for(let t of e)switch(t.type){case`text`:n.push({type:`text`,text:t.text});break;case`thinking`:n.push({type:`text`,text:t.thinking});break;case`image`:n.push({type:`image_url`,image_url:{url:`data:${t.source.media_type};base64,${t.source.data}`}});break}return n}function Ut(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Wt(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 Gt(e){let t=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let i of e.choices){let e=Kt(i.message.content),a=qt(i.message.tool_calls);t.push(...e),n.push(...a),(i.finish_reason===`tool_calls`||r===`stop`)&&(r=i.finish_reason)}return{id:e.id,type:`message`,role:`assistant`,model:e.model,content:[...t,...n],stop_reason:Ft(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}function Kt(e){return typeof e==`string`?[{type:`text`,text:e}]:Array.isArray(e)?e.filter(e=>e.type===`text`).map(e=>({type:`text`,text:e.text})):[]}function qt(e){return e?e.map(e=>({type:`tool_use`,id:e.id,name:e.function.name,input:JSON.parse(e.function.arguments)})):[]}function Jt(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function Yt(e,t){let n=[];if(e.choices.length===0)return n;let r=e.choices[0],{delta:i}=r;if(t.messageStartSent||=(n.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),i.content&&(Jt(t)&&(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1),t.contentBlockOpen||=(n.push({type:`content_block_start`,index:t.contentBlockIndex,content_block:{type:`text`,text:``}}),!0),n.push({type:`content_block_delta`,index:t.contentBlockIndex,delta:{type:`text_delta`,text:i.content}})),i.tool_calls)for(let e of i.tool_calls){if(e.id&&e.function?.name){t.contentBlockOpen&&=(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),t.contentBlockIndex++,!1);let r=t.contentBlockIndex;t.toolCalls[e.index]={id:e.id,name:e.function.name,anthropicBlockIndex:r},n.push({type:`content_block_start`,index:r,content_block:{type:`tool_use`,id:e.id,name:e.function.name,input:{}}}),t.contentBlockOpen=!0}if(e.function?.arguments){let r=t.toolCalls[e.index];r&&n.push({type:`content_block_delta`,index:r.anthropicBlockIndex,delta:{type:`input_json_delta`,partial_json:e.function.arguments}})}}return r.finish_reason&&(t.contentBlockOpen&&=(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),!1),n.push({type:`message_delta`,delta:{stop_reason:Ft(r.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:`message_stop`})),n}async function Xt(e,t,n){let r={query:t,max_results:n?.maxResults??5};n?.includeDomains?.length&&(r.include_domains=n.includeDomains),n?.excludeDomains?.length&&(r.exclude_domains=n.excludeDomains),E.debug(`Tavily search request:`,JSON.stringify(r));let i=await fetch(`https://api.tavily.com/search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e}`},body:JSON.stringify(r)});if(!i.ok){let e=await i.text();throw E.error(`Tavily API error (${i.status}):`,e),Error(`Tavily API error: ${i.status} ${e}`)}let a=await i.json();return E.debug(`Tavily returned ${a.results.length} results`),a.results}function Zt(e){let t=e.tools;if(!t||t.length!==1)return!1;let n=t[0].type;return typeof n==`string`&&n.startsWith(`web_search`)}function Qt(e){let t=e.messages[0];if(!t||t.role!==`user`)return null;let n;if(typeof t.content==`string`)n=t.content;else if(Array.isArray(t.content)){let e=t.content.find(e=>e.type===`text`);if(!e)return null;n=e.text}else return null;return n.startsWith(`Perform a web search for the query: `)?n.slice(36).trim():n.trim()||null}function $t(e){let t=e.tools,n=t?.[0],r=typeof n?.max_uses==`number`?n.max_uses:5;return{maxResults:r,allowedDomains:n?.allowed_domains,blockedDomains:n?.blocked_domains}}function X(){let e=``;for(let t=0;t<24;t++)e+=`abcdefghijklmnopqrstuvwxyz0123456789`[Math.floor(Math.random()*36)];return e}function en(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${X()}`,a=[{type:`text`,text:`I'll search for that.`},{type:`server_tool_use`,id:i,name:`web_search`,input:{query:t}},{type:`web_search_tool_result`,tool_use_id:i,content:n}];return{id:`msg_tavily_${X()}`,type:`message`,role:`assistant`,model:r,content:a,stop_reason:`end_turn`,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}function tn(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${X()}`,a=`msg_tavily_${X()}`,o=[];return o.push({type:`message_start`,message:{id:a,type:`message`,role:`assistant`,content:[],model:r,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:i,name:`web_search`,input:{}}},{type:`content_block_delta`,index:1,delta:{type:`input_json_delta`,partial_json:JSON.stringify({query:t})}},{type:`content_block_stop`,index:1},{type:`content_block_start`,index:2,content_block:{type:`web_search_tool_result`,tool_use_id:i,content:n}},{type:`content_block_stop`,index:2},{type:`message_delta`,delta:{stop_reason:`end_turn`,stop_sequence:null},usage:{output_tokens:0}},{type:`message_stop`}),o}async function nn(e,t){let n=Qt(t);if(!n)return e.json({type:`error`,error:{type:`invalid_request_error`,message:`Could not extract search query from web search request`}},400);let r=$t(t);E.info(`Web search intercepted: "${n}"`);let i=[];try{let e=S.tavilyApiKey;if(!e)throw Error(`No Tavily API key configured`);let t=await Xt(e,n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains});i=t.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){E.error(`Tavily search failed:`,e)}let a={query:n,results:i,model:t.model};if(!t.stream)return e.json(en(a));let o=tn(a);return M(e,async e=>{for(let t of o)await e.writeSSE({event:t.type,data:JSON.stringify(t)})})}function rn(e,t){return w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.validate`,n=>{try{n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.requested`,t.model);let e=H(t.model);return n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,e),e===t.model?(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),t):(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),se.add(1,{from_model:t.model,to_model:e}),E.debug(`Model mapping: '${t.model}' → '${e}'`),{...t,model:e})}catch(t){if(t instanceof V)return e.json({type:`error`,error:{type:`invalid_request_error`,message:t.message}},t.statusCode),null;throw t}finally{n.end()}})}async function an(t){let n=await t.req.json();if(Zt(n))return nn(t,n);await St(S),E.debug(`\u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 request payload:`,JSON.stringify(n));let r=t.req.header(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063-beta`)??``,i=/context-1m/i.test(r);if(i){let e=n.model;n={...n,model:`${n.model}-1m`},E.debug(`Detected context-1m beta flag, rewriting model: '${e}' → '${n.model}'`)}let a=rn(t,n);if(!a)return;n=a;let o=performance.now(),s=w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translate.\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`,e=>{try{e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.direction`,`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.message_count`,n.messages.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_tools`,!!n.tools?.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_system`,!!n.system),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.context_1m_beta`,i);let t=n.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`image`)),r=n.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`thinking`));return e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_images`,t),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_thinking`,r),It(n)}finally{e.end()}});Ce.record(performance.now()-o,{direction:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`}),E.debug(`Translated \u004f\u0070\u0065\u006e\u0041\u0049 request payload:`,JSON.stringify(s)),t.set(`requestData`,{model:s.model,streaming:!!s.stream});let c=performance.now();S.manualApprove&&await pt();let l=await wt(s),u=performance.now()-c;if(g.record(u,{model:s.model,target:`chat_completions`,streaming:String(!!s.stream)}),on(l)){let e=t.get(`requestData`)||{};l.usage&&(e.tokenUsage=z(l.usage)),e.copilotDuration=u,t.set(`requestData`,e),E.debug(`Non-streaming response:`,JSON.stringify(l).slice(-400));let n=performance.now(),r=w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translate.\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`,e=>{try{e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.direction`,`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`);let t=Gt(l);return e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.content_blocks`,t.content.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.stop_reason`,t.stop_reason??`null`),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_tool_use`,t.content.some(e=>e.type===`tool_use`)),t}finally{e.end()}});return Ce.record(performance.now()-n,{direction:`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),E.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 response:`,JSON.stringify(r)),t.json(r)}E.debug(`Streaming response from service`);let{events:d,span:f}=l;return M(t,async n=>{let r=null,i=0,a=performance.now(),o={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}};try{for await(let e of d){if(E.debug(`Raw stream event:`,JSON.stringify(e)),e.data===`[DONE]`)break;if(!e.data)continue;let a=JSON.parse(e.data);if(i++,_e.add(1,{model:s.model,endpoint_type:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),a.usage){r=a.usage;let e=t.get(`requestData`)||{};e.tokenUsage=z(r),e.copilotDuration=u,t.set(`requestData`,e)}let c=Yt(a,o);for(let e of c)E.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 event:`,JSON.stringify(e)),await n.writeSSE({event:e.type,data:JSON.stringify(e)})}let e=performance.now()-a,c={model:s.model,endpoint_type:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`};if(ve.record(e,c),p.record(i,c),r){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=z(r),e.copilotDuration=u,t.set(`requestData`,e))}}finally{r&&B(f,r),f.end()}let c=t.get(`requestId`);c&&e.executeCompletion(c)})}const on=e=>Object.hasOwn(e,`choices`),sn=new j;sn.post(`/`,async e=>{try{return await an(e)}catch(t){return await x(e,t)}});const Z=new j;Z.get(`/`,async e=>{try{S.models||await He();let t=S.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 x(e,t)}});const cn=new j;cn.get(`/`,e=>{try{return e.json({token:S.copilotToken})}catch(t){return console.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const ln=new j;ln.get(`/`,async e=>{try{let t=await Qe();return e.json(t)}catch(t){return console.error(`Error fetching usage:`,t),e.json({error:`Failed to fetch usage`},500)}});const Q=new j;Q.use(ft()),Q.use(Me()),Q.get(`/`,e=>e.text(`Server running`)),Q.route(`/chat/completions`,W),Q.route(`/models`,Z),Q.route(`/embeddings`,G),Q.route(`/usage`,ln),Q.route(`/token`,cn),Q.route(`/v1/chat/completions`,W),Q.route(`/v1/models`,Z),Q.route(`/v1/embeddings`,G),Q.route(`/v1/messages`,sn),Q.post(`/v1/messages/count_tokens`,Mt);const un=[],$=Date.now();function dn(){let e=async(e,t=0)=>{E.info(`Gracefully shutting down...`);let n=w.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.shutdown`,{kind:O.INTERNAL,attributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.shutdown.reason":e,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.shutdown.exit_code":t,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.uptime_seconds":(Date.now()-$)/1e3}});for(let e of un)try{await e()}catch(e){E.error(`Error during cleanup:`,e)}n.end(),E.info(`Shutdown complete`),A.exit(t)};A.on(`SIGINT`,()=>e(`SIGINT`)),A.on(`SIGTERM`,()=>e(`SIGTERM`)),A.on(`uncaughtException`,t=>{E.error(`Uncaught exception:`,t),e(`uncaughtException`,1)}),A.on(`unhandledRejection`,(t,n)=>{E.error(`Unhandled promise rejection at:`,n,`reason:`,t),e(`unhandledRejection`,1)})}function fn(){return`npx \u0063\u006f\u0070\u0069\u006c\u006f\u0074-api start`}function pn(e){let t=[fn()];return t.push(`-p ${e.port}`),e.verbose&&t.push(`-v`),e.accountType!==`individual`&&t.push(`-a ${e.accountType}`),e.manual&&t.push(`--manual`),e.rateLimit&&t.push(`-r ${e.rateLimit}`),e.rateLimitWait&&t.push(`-w`),e.githubToken&&t.push(`-g ${e.\u0067\u0069\u0074\u0068\u0075\u0062Token}`),e.claudeCode&&t.push(`-c`),e.model&&t.push(`-m ${e.model}`),e.smallModel&&t.push(`-s ${e.smallModel}`),e.timeout&&t.push(`-t ${String(e.timeout)}`),e.showToken&&t.push(`--show-token`),e.disableConnectivityMonitoring&&t.push(`--disable-connectivity-monitoring`),t.join(` `)}async function mn(e,t){if(!e.claudeCode)return;Ae(S.models,`Models should be loaded by now`);let n,r;if(e.model&&e.smallModel){let t=S.models.data.map(e=>e.id);t.includes(e.model)||(E.error(`Invalid model: ${e.model}`),E.info(`Available services: \n${t.join(`
|
|
20
|
-
`)}`),
|
|
21
|
-
`)}`),
|
|
22
|
-
`))}
|
|
19
|
+
`);let n=[];for(let t of e)switch(t.type){case`text`:n.push({type:`text`,text:t.text});break;case`thinking`:n.push({type:`text`,text:t.thinking});break;case`image`:n.push({type:`image_url`,image_url:{url:`data:${t.source.media_type};base64,${t.source.data}`}});break}return n}function an(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function on(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 sn(e){let t=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let i of e.choices){let e=cn(i.message.content),a=ln(i.message.tool_calls);t.push(...e),n.push(...a),(i.finish_reason===`tool_calls`||r===`stop`)&&(r=i.finish_reason)}return{id:e.id,type:`message`,role:`assistant`,model:e.model,content:[...t,...n],stop_reason:Xt(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}function cn(e){return typeof e==`string`?[{type:`text`,text:e}]:Array.isArray(e)?e.filter(e=>e.type===`text`).map(e=>({type:`text`,text:e.text})):[]}function ln(e){return e?e.map(e=>({type:`tool_use`,id:e.id,name:e.function.name,input:JSON.parse(e.function.arguments)})):[]}function un(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function dn(e,t){let n=[];if(e.choices.length===0)return n;let r=e.choices[0],{delta:i}=r;if(t.messageStartSent||=(n.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),i.content&&(un(t)&&(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1),t.contentBlockOpen||=(n.push({type:`content_block_start`,index:t.contentBlockIndex,content_block:{type:`text`,text:``}}),!0),n.push({type:`content_block_delta`,index:t.contentBlockIndex,delta:{type:`text_delta`,text:i.content}})),i.tool_calls)for(let e of i.tool_calls){if(e.id&&e.function?.name){t.contentBlockOpen&&=(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),t.contentBlockIndex++,!1);let r=t.contentBlockIndex;t.toolCalls[e.index]={id:e.id,name:e.function.name,anthropicBlockIndex:r},n.push({type:`content_block_start`,index:r,content_block:{type:`tool_use`,id:e.id,name:e.function.name,input:{}}}),t.contentBlockOpen=!0}if(e.function?.arguments){let r=t.toolCalls[e.index];r&&n.push({type:`content_block_delta`,index:r.anthropicBlockIndex,delta:{type:`input_json_delta`,partial_json:e.function.arguments}})}}return r.finish_reason&&(t.contentBlockOpen&&=(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),!1),n.push({type:`message_delta`,delta:{stop_reason:Xt(r.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:`message_stop`})),n}async function fn(e,t,n){let r={query:t,max_results:n?.maxResults??5};n?.includeDomains?.length&&(r.include_domains=n.includeDomains),n?.excludeDomains?.length&&(r.exclude_domains=n.excludeDomains),T.debug(`Tavily search request:`,JSON.stringify(r));let i=await fetch(`https://api.tavily.com/search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e}`},body:JSON.stringify(r)});if(!i.ok){let e=await i.text();throw T.error(`Tavily API error (${i.status}):`,e),Error(`Tavily API error: ${i.status} ${e}`)}let a=await i.json();return T.debug(`Tavily returned ${a.results.length} results`),a.results}function pn(e){let t=e.tools;if(!t||t.length!==1)return!1;let n=t[0].type;return typeof n==`string`&&n.startsWith(`web_search`)}function mn(e){let t=e.messages[0];if(!t||t.role!==`user`)return null;let n;if(typeof t.content==`string`)n=t.content;else if(Array.isArray(t.content)){let e=t.content.find(e=>e.type===`text`);if(!e)return null;n=e.text}else return null;return n.startsWith(`Perform a web search for the query: `)?n.slice(36).trim():n.trim()||null}function hn(e){let t=e.tools,n=t?.[0],r=typeof n?.max_uses==`number`?n.max_uses:5;return{maxResults:r,allowedDomains:n?.allowed_domains,blockedDomains:n?.blocked_domains}}function Z(){let e=``;for(let t=0;t<24;t++)e+=`abcdefghijklmnopqrstuvwxyz0123456789`[Math.floor(Math.random()*36)];return e}function gn(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${Z()}`,a=[{type:`text`,text:`I'll search for that.`},{type:`server_tool_use`,id:i,name:`web_search`,input:{query:t}},{type:`web_search_tool_result`,tool_use_id:i,content:n}];return{id:`msg_tavily_${Z()}`,type:`message`,role:`assistant`,model:r,content:a,stop_reason:`end_turn`,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}function _n(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${Z()}`,a=`msg_tavily_${Z()}`,o=[];return o.push({type:`message_start`,message:{id:a,type:`message`,role:`assistant`,content:[],model:r,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:i,name:`web_search`,input:{}}},{type:`content_block_delta`,index:1,delta:{type:`input_json_delta`,partial_json:JSON.stringify({query:t})}},{type:`content_block_stop`,index:1},{type:`content_block_start`,index:2,content_block:{type:`web_search_tool_result`,tool_use_id:i,content:n}},{type:`content_block_stop`,index:2},{type:`message_delta`,delta:{stop_reason:`end_turn`,stop_sequence:null},usage:{output_tokens:0}},{type:`message_stop`}),o}async function vn(e,t){let n=mn(t);if(!n)return e.json({type:`error`,error:{type:`invalid_request_error`,message:`Could not extract search query from web search request`}},400);let r=hn(t);T.info(`Web search intercepted: "${n}"`);let i=[];try{let e=x.tavilyApiKey;if(!e)throw Error(`No Tavily API key configured`);let t=await fn(e,n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains});i=t.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){T.error(`Tavily search failed:`,e)}let a={query:n,results:i,model:t.model};if(!t.stream)return e.json(gn(a));let o=_n(a);return Le(e,async e=>{for(let t of o)await e.writeSSE({event:t.type,data:JSON.stringify(t)})})}function yn(e,t){return C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.validate`,n=>{try{n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.requested`,t.model);let e=U(t.model);return n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,e),e===t.model?(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),t):(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),ue.add(1,{from_model:t.model,to_model:e}),T.debug(`Model mapping: '${t.model}' → '${e}'`),{...t,model:e})}catch(t){if(t instanceof H)return e.json({type:`error`,error:{type:`invalid_request_error`,message:t.message}},t.statusCode),null;throw t}finally{n.end()}})}async function bn(t){let n=await t.req.json();if(pn(n))return vn(t,n);await Lt(x),T.debug(`\u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 request payload:`,JSON.stringify(n));let r=t.req.header(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063-beta`)??``,i=/context-1m/i.test(r);if(i){let e=n.model;n={...n,model:`${n.model}-1m`},T.debug(`Detected context-1m beta flag, rewriting model: '${e}' → '${n.model}'`)}let a=yn(t,n);if(!a)return;n=a;let o=performance.now(),s=C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translate.\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`,e=>{try{e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.direction`,`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.message_count`,n.messages.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_tools`,!!n.tools?.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_system`,!!n.system),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.context_1m_beta`,i);let t=n.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`image`)),r=n.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`thinking`));return e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_images`,t),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_thinking`,r),Zt(n)}finally{e.end()}});Ee.record(performance.now()-o,{direction:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`}),T.debug(`Translated \u004f\u0070\u0065\u006e\u0041\u0049 request payload:`,JSON.stringify(s)),t.set(`requestData`,{model:s.model,streaming:!!s.stream});let c=performance.now();x.manualApprove&&await Ot();let l=await zt(s),u=performance.now()-c;if(ee.record(u,{model:s.model,target:`chat_completions`,streaming:String(!!s.stream)}),xn(l)){let e=t.get(`requestData`)||{};l.usage&&(e.tokenUsage=B(l.usage)),e.copilotDuration=u,t.set(`requestData`,e),T.debug(`Non-streaming response:`,JSON.stringify(l).slice(-400));let n=performance.now(),r=C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translate.\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`,e=>{try{e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.direction`,`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`);let t=sn(l);return e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.content_blocks`,t.content.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.stop_reason`,t.stop_reason??`null`),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_tool_use`,t.content.some(e=>e.type===`tool_use`)),t}finally{e.end()}});return Ee.record(performance.now()-n,{direction:`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),T.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 response:`,JSON.stringify(r)),t.json(r)}T.debug(`Streaming response from service`);let{events:d,span:f}=l;return Le(t,async n=>{let r=null,i=0,a=performance.now(),o={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}};try{try{for await(let e of d){if(T.debug(`Raw stream event:`,JSON.stringify(e)),e.data===`[DONE]`)break;if(!e.data)continue;let a=JSON.parse(e.data);if(i++,be.add(1,{model:s.model,endpoint_type:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),a.usage){r=a.usage;let e=t.get(`requestData`)||{};e.tokenUsage=B(r),e.copilotDuration=u,t.set(`requestData`,e)}let c=dn(a,o);for(let e of c)T.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 event:`,JSON.stringify(e)),await n.writeSSE({event:e.type,data:JSON.stringify(e)})}let e=performance.now()-a,c={model:s.model,endpoint_type:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`};if(xe.record(e,c),p.record(i,c),r){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=B(r),e.copilotDuration=u,t.set(`requestData`,e))}}finally{r&&V(f,r),f.end()}let c=t.get(`requestId`);c&&e.executeCompletion(c)}finally{t.get(`resolveStreamComplete`)?.()}})}const xn=e=>Object.hasOwn(e,`choices`),Sn=new A;Sn.post(`/`,async e=>{try{return await bn(e)}catch(t){return await y(e,t)}});const Cn=new A;Cn.get(`/`,async e=>{try{x.models||await qe();let t=x.models?.data.map(e=>({id:e.id,object:`model`,type:`model`,created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:`list`,data:t,has_more:!1})}catch(t){return await y(e,t)}});const wn=new A;wn.get(`/`,e=>{try{return e.json({token:x.copilotToken})}catch(t){return console.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const Tn=new A;Tn.get(`/`,async e=>{try{let t=await it();return e.json(t)}catch(t){return console.error(`Error fetching usage:`,t),e.json({error:`Failed to fetch usage`},500)}});const Q=new A;Q.use(Dt()),Q.use(Ie()),Q.get(`/`,e=>e.text(`Server running`)),Q.route(`/chat/completions`,G),Q.route(`/models`,Cn),Q.route(`/embeddings`,K),Q.route(`/usage`,Tn),Q.route(`/token`,wn),Q.route(`/v1/chat/completions`,G),Q.route(`/v1/models`,Cn),Q.route(`/v1/embeddings`,K),Q.route(`/v1/messages`,Sn),Q.post(`/v1/messages/count_tokens`,qt);const En=[],$=Date.now();function Dn(){let e=async(e,t=0)=>{T.info(`Gracefully shutting down...`);let n=C.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.shutdown`,{kind:D.INTERNAL,attributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.shutdown.reason":e,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.shutdown.exit_code":t,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.uptime_seconds":(Date.now()-$)/1e3}});for(let e of En)try{await e()}catch(e){T.error(`Error during cleanup:`,e)}n.end(),T.info(`Shutdown complete`),k.exit(t)};k.on(`SIGINT`,()=>e(`SIGINT`)),k.on(`SIGTERM`,()=>e(`SIGTERM`)),k.on(`uncaughtException`,t=>{T.error(`Uncaught exception:`,t),e(`uncaughtException`,1)}),k.on(`unhandledRejection`,(t,n)=>{T.error(`Unhandled promise rejection at:`,n,`reason:`,t),e(`unhandledRejection`,1)})}function On(){return`npx \u0063\u006f\u0070\u0069\u006c\u006f\u0074-api start`}function kn(e){let t=[On()];return t.push(`-p ${e.port}`),e.verbose&&t.push(`-v`),e.accountType!==`individual`&&t.push(`-a ${e.accountType}`),e.manual&&t.push(`--manual`),e.rateLimit&&t.push(`-r ${e.rateLimit}`),e.rateLimitWait&&t.push(`-w`),e.githubToken&&t.push(`-g ${e.\u0067\u0069\u0074\u0068\u0075\u0062Token}`),e.claudeCode&&t.push(`-c`),e.model&&t.push(`-m ${e.model}`),e.smallModel&&t.push(`-s ${e.smallModel}`),e.timeout&&t.push(`-t ${String(e.timeout)}`),e.showToken&&t.push(`--show-token`),e.disableConnectivityMonitoring&&t.push(`--disable-connectivity-monitoring`),t.join(` `)}async function An(e,t){if(!e.claudeCode)return;Pe(x.models,`Models should be loaded by now`);let n,r;if(e.model&&e.smallModel){let t=x.models.data.map(e=>e.id);t.includes(e.model)||(T.error(`Invalid model: ${e.model}`),T.info(`Available services: \n${t.join(`
|
|
20
|
+
`)}`),k.exit(1)),t.includes(e.smallModel)||(T.error(`Invalid small model: ${e.smallModel}`),T.info(`Available services: \n${t.join(`
|
|
21
|
+
`)}`),k.exit(1)),n=e.model,r=e.smallModel,T.info(`Using service: ${n}`),T.info(`Using small model: ${r}`)}else e.model||e.smallModel?(T.error(`Both --model and --small-model must be specified for model selection`),k.exit(1)):(n=await T.prompt(`Select a model to use`,{type:`select`,options:x.models.data.map(e=>e.id)}),r=await T.prompt(`Select a small model to use`,{type:`select`,options:x.models.data.map(e=>e.id)}));let i=xt({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:`dummy`,ANTHROPIC_MODEL:n,ANTHROPIC_SMALL_FAST_MODEL:r},`\u0063\u006c\u0061\u0075\u0064\u0065`);try{Me.writeSync(i),T.success(`Copied command to clipboard!`)}catch{T.warn(`Failed to copy to clipboard. Here is the command:`),T.log(i)}}function jn(e){let{options:t,version:n,runtime:r,githubUser:i}=e,a=C.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.startup`,{kind:D.INTERNAL,attributes:v({config:{version:n,port:t.port,accountType:t.accountType,verbose:t.verbose,manualApprove:t.manual,rateLimitSeconds:t.rateLimit??0,rateLimitWait:t.rateLimitWait,timeoutMs:t.timeout,showToken:t.showToken,claudeCode:t.claudeCode,disableConnectivityMonitoring:t.disableConnectivityMonitoring,model:t.model,smallModel:t.smallModel,githubTokenSource:t.githubToken?`cli_arg`:`stored`},runtime:r,identity:{githubUser:i.login,machineId:x.machineId,sessionId:x.sessionId,vsCodeVersion:x.vsCodeVersion},connectivity:x.connectivity,modelsCount:x.models?.data.length??0,startupDurationMs:Date.now()-$},`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api`)});if(x.models?.data)for(let e of x.models.data)a.addEvent(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.available`,v(e,`model`));a.end(),_(l.INFO,`INFO`,`Server started`,v({version:n,port:t.port,accountType:t.accountType,githubUser:i.login,modelsCount:x.models?.data.length??0,startupDurationMs:Date.now()-$},`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api`))}function Mn(){let e=k.env.COPILOT_H2_KEEPALIVE===`1`||k.env.COPILOT_H2_KEEPALIVE===`true`,t=e||k.env.COPILOT_H2===`1`||k.env.COPILOT_H2===`true`;x.connectivity.h2=t,x.connectivity.h2Keepalive=e}function Nn(){x.connectivity.h2&&(T.info(`HTTP/2 upstream enabled`),gt(h(x)),x.connectivity.h2Keepalive&&(T.info(`HTTP/2 keepalive enabled (45s interval)`),vt()))}async function Pn(e){Dn(),En.push(()=>{T.debug(`Cleaning up connectivity monitor`),m.stop()},()=>{T.debug(`Cleaning up token management`),Ze()},async()=>{T.debug(`Cleaning up HTTP/2 client`),await yt()},async()=>{T.debug(`Shutting down OTel SDK`),await ve()}),e.verbose&&(T.level=5,T.info(`Verbose logging enabled`)),x.accountType=e.accountType,e.accountType!==`individual`&&T.info(`Using ${e.accountType} plan account`),x.manualApprove=e.manual,x.rateLimitSeconds=e.rateLimit,x.rateLimitWait=e.rateLimitWait,x.showToken=e.showToken,x.timeoutMs=e.timeout,x.connectivity.enabled=!e.disableConnectivityMonitoring,e.tavilyApiKey&&(x.tavilyApiKey=e.tavilyApiKey,T.info(`Web search enabled via Tavily API`)),Mn(),await te(),Je();let t=await ot(),n=st();oe(t,$),e.githubToken?(x.githubToken=e.githubToken,T.info(`Using provided Auth token`)):await F();let r;try{let{_s4:e}=await import(`./get-user-D4N4OcEJ.js`);r=await e(),await se(x,r.login)}catch(e){T.error(`Failed to get user info for machine ID generation:`,e),T.error(`Cannot proceed without user information`),k.exit(1)}await et(),await qe(),Nn(),jn({options:e,version:t,runtime:n,githubUser:r}),T.info(`Available services:`);for(let e of x.models?.data??[]){let t=e.capabilities.limits?.max_context_window_tokens,n=t?` (${t.toLocaleString()} tokens)`:``;T.info(`- ${e.id}${n}`)}let i=`http://localhost:${e.port}`;if(await An(e,i),e.tavilyApiKey)T.box(`🔍 Web Search: Enabled ✓`);else{let t=kn(e);T.box([`🔍 Web Search: Enable web search by adding a Tavily API key.`,` Get your API key at: https://www.tavily.com`,``,` ${t} --tavily-api-key <your-key>`].join(`
|
|
22
|
+
`))}Ne({fetch:Q.fetch,port:e.port})}const Fn=w({meta:{name:`start`,description:`Start the API server`},args:{port:{alias:`p`,type:`string`,default:`4141`,description:`Port to listen on`},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`},"\u0067\u0069\u0074\u0068\u0075\u0062-token":{alias:`g`,type:`string`,description:"Provide auth token directly (must be generated using the `auth` subcommand)"},"\u0063\u006c\u0061\u0075\u0064\u0065-code":{alias:`c`,type:`boolean`,default:!1,description:`Generate a command to launch with API config`},model:{alias:`m`,type:`string`,description:`Model to use (requires --\u0063\u006c\u0061\u0075\u0064\u0065-code)`},"small-model":{alias:`s`,type:`string`,description:`Small/fast model to use (requires --\u0063\u006c\u0061\u0075\u0064\u0065-code)`},"show-token":{type:`boolean`,default:!1,description:`Show tokens on fetch and refresh`},timeout:{alias:`t`,type:`string`,description:`API timeout in milliseconds (default: 600000)`},"disable-connectivity-monitoring":{type:`boolean`,default:!1,description:`Disable automatic network monitoring for token refresh`},"tavily-api-key":{type:`string`,description:`Tavily API key for web search support (or set TAVILY_API_KEY env var)`}},run({args:e}){let n=e[`rate-limit`],r=n===void 0?void 0:Number.parseInt(n,10),i=e.timeout,a=i===void 0?t:Number.parseInt(i,10);return Pn({port:Number.parseInt(e.port,10),verbose:e.verbose,accountType:e[`account-type`],manual:e.manual,rateLimit:r,rateLimitWait:e.wait,githubToken:e[`\u0067\u0069\u0074\u0068\u0075\u0062-token`],claudeCode:e[`\u0063\u006c\u0061\u0075\u0064\u0065-code`],model:e.model,smallModel:e[`small-model`],showToken:e[`show-token`],timeout:a,disableConnectivityMonitoring:e[`disable-connectivity-monitoring`],tavilyApiKey:e[`tavily-api-key`]||k.env.TAVILY_API_KEY})}}),In=w({meta:{name:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,description:`API proxy server for tool integration.`},subCommands:{auth:rt,start:Fn,"check-usage":at,debug:pt}});await De(In);export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "copilot-api-node20",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.1",
|
|
4
4
|
"description": "Turn GitHub Copilot into OpenAI/Anthropic API compatible server. Usable with Claude Code! (Node v20+ fork)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"proxy",
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"start": "NODE_ENV=production bun run ./src/main.ts",
|
|
36
36
|
"test": "bun test",
|
|
37
37
|
"test:coverage": "bun test --coverage",
|
|
38
|
+
"test:e2e": "E2E=1 bun test tests/e2e.test.ts",
|
|
38
39
|
"test:watch": "bun test --watch",
|
|
39
40
|
"typecheck": "tsc"
|
|
40
41
|
},
|
|
@@ -49,9 +50,14 @@
|
|
|
49
50
|
"@typescript-eslint/parser": "^8.56.0",
|
|
50
51
|
"@typescript-eslint/typescript-estree": "^8.56.0",
|
|
51
52
|
"@typescript-eslint/utils": "^8.56.0",
|
|
52
|
-
"
|
|
53
|
+
"brace-expansion": "^5.0.5",
|
|
54
|
+
"flatted": "^3.4.2",
|
|
53
55
|
"minimatch": "^10.2.4",
|
|
54
|
-
"
|
|
56
|
+
"picomatch": "^4.0.4",
|
|
57
|
+
"smol-toml": "^1.6.1",
|
|
58
|
+
"typescript-eslint": "^8.56.0",
|
|
59
|
+
"undici": "^7.24.0",
|
|
60
|
+
"yaml": "^2.8.3"
|
|
55
61
|
},
|
|
56
62
|
"dependencies": {
|
|
57
63
|
"@opentelemetry/api": "^1.9.0",
|
|
@@ -71,7 +77,7 @@
|
|
|
71
77
|
"consola": "^3.4.2",
|
|
72
78
|
"fetch-event-stream": "^0.1.5",
|
|
73
79
|
"hono": "^4.12.7",
|
|
74
|
-
"srvx": "^0.
|
|
80
|
+
"srvx": "^0.11.13",
|
|
75
81
|
"tiny-invariant": "^1.3.3",
|
|
76
82
|
"undici": "^7.24.0"
|
|
77
83
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_s4 as e}from"./get-user-DX7ymfsj.js";export{e as _s4};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import e from"consola";import t from"node:fs/promises";import n from"node:os";import r from"node:path";import{SpanKind as i,SpanStatusCode as a,metrics as o,trace as s}from"@opentelemetry/api";import{SeverityNumber as c,logs as l}from"@opentelemetry/api-logs";import{OTLPLogExporter as u}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as d}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as f}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as p}from"@opentelemetry/resources";import{BatchLogRecordProcessor as m}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as h}from"@opentelemetry/sdk-metrics";import{NodeSDK as ee}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_NAME as te,ATTR_SERVICE_VERSION as ne}from"@opentelemetry/semantic-conventions";import{request as re}from"undici";import{createHash as ie,randomBytes as g,randomUUID as _}from"node:crypto";const v=r.join(n.homedir(),`.local`,`share`,`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),ae=r.join(v,`\u0067\u0069\u0074\u0068\u0075\u0062_token`),oe=r.join(v,`machine_id`),se=r.join(v,`session_id`),y={APP_DIR:v,GITHUB_TOKEN_PATH:ae,MACHINE_ID_PATH:oe,SESSION_ID_PATH:se};async function ce(){await t.mkdir(y.APP_DIR,{recursive:!0}),await b(y.GITHUB_TOKEN_PATH),await b(y.SESSION_ID_PATH)}async function b(e){try{await t.access(e,t.constants.W_OK)}catch{await t.writeFile(e,``),await t.chmod(e,384)}}const x=6e5,S={accountType:`individual`,manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:x,connectivity:{enabled:!0,probeEndpoints:[`https://api.\u0067\u0069\u0074\u0068\u0075\u0062.com`,`https://www.google.com`,`https://1.1.1.1`],fastProbeInterval:5e3,slowProbeInterval:6e4,timeoutMs:5e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0}},C=e=>e>=1e5||e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString(),w=(e,t)=>e.padEnd(t),le=(e,t)=>{if(!S.models)return``;let n=S.models.data.find(e=>e.id===t);if(!n)return``;let r=n.capabilities.limits?.max_context_window_tokens;if(!r)return``;let i=(e/r*100).toFixed(1);return` (${i}%)`},ue=e=>{let t=[];if(e.model){let n=w(e.model,18);t.push(n)}if(e.tokenUsage){let n=e.tokenUsage,r=(n.inputTokens||0)+(n.outputTokens||0),i=e.model?le(r,e.model):``,a=C(n.inputTokens||0).padStart(5),o=C(n.outputTokens||0).padStart(5),s=`↑${a} │ ↓${o}`,c=w(s,18),l=C(r),u=i?`${l}${i.padStart(15-l.length)}`:l.padEnd(15);t.push(`Tokens: ${c} | Context: ${u}`)}else if(e.model){let e=w(`N/A`,18),n=`N/A`.padEnd(15);t.push(`Tokens: ${e} | Context: ${n}`)}if(e.copilotDuration){let n=w(`${Math.round(e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);t.push(`API: ${n}`)}return t.length>0?` | ${t.join(` | `)}`:``},T={completionCallbacks:new Map,registerCompletion(e,t,n){this.completionCallbacks.set(e,{context:t,startTime:n,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(t){let{context:n,startTime:r}=t,i=Date.now(),a=i-r,o=n.get(`requestData`),s=w(n.req.method,4),l=w(n.req.path,21),u=w(n.res.status.toString(),3),d=w(`${a}ms`,8),f=` --> ${s}${l}${u} ${d}`;o&&(f+=ue(o)),e.info(f),V(c.INFO,`INFO`,`Request completed`,{"http.method":n.req.method,"http.path":n.req.path,"http.status_code":n.res.status,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.duration_ms":a,...o?.model&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":o.model},...o?.copilotDuration&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_duration_ms":Math.round(o.copilotDuration)},...o?.tokenUsage?.inputTokens&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens":o.tokenUsage.inputTokens},...o?.tokenUsage?.outputTokens&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens":o.tokenUsage.outputTokens}})},logRateLimit(t,n){let{context:r,startTime:i}=t,a=Date.now(),o=a-i,s=n.headers.get(`x-ratelimit-exceeded`)||``,c=s.split(`:`)[1]||`unknown`,l=n.headers.get(`retry-after`)||n.headers.get(`x-ratelimit-user-retry-after`)||`?`,u=w(r.req.method,4),d=w(r.req.path,21),f=w(`429`,3),p=w(`${o}ms`,8),m=`⚠ --> ${u}${d}${f} ${p}`;m+=` | Rate limited (${l}s retry) | ${c}`;let h=r.get(`requestData`);if(h?.copilotDuration){let e=w(`${Math.round(h.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);m+=` | API: ${e}`}e.info(m)},cleanup(){let e=1e3,t=Date.now()-300*1e3;for(let[e,n]of this.completionCallbacks)n.startTime<t&&this.completionCallbacks.delete(e);if(this.completionCallbacks.size>e){let t=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),n=t.slice(0,t.length-e);for(let[e]of n)this.completionCallbacks.delete(e)}}};setInterval(()=>T.cleanup(),60*1e3);let E,D=Date.now();const O=`https://api.\u0068\u006f\u006e\u0065\u0079\u0063\u006f\u006d\u0062.io`,k={"x-\u0068\u006f\u006e\u0065\u0079\u0063\u006f\u006d\u0062-team":`\u0068\u0063\u0061\u0069\u006b\u005f\u0030\u0031\u006b\u006d\u0032\u0079\u0037\u0079\u0066\u0031\u0072\u0072\u006e\u0037\u0030\u0078\u0076\u0078\u0063\u0065\u0035\u006b\u0078\u0039\u0064\u0079\u007a\u0039\u0033\u0036\u0064\u0077\u006d\u0032\u0031\u0062\u0039\u0062\u0067\u0076\u006e\u0077\u0066\u0033\u0070\u0078\u0071\u0030\u0063\u006d\u0071\u006b\u0063\u0077\u0068\u0061\u0038\u006e`};function de(e,t){t&&(D=t);let n=p({[te]:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,[ne]:e});E=new ee({resource:n,traceExporter:new f({url:`${O}/v1/traces`,headers:k}),metricReader:new h({exporter:new d({url:`${O}/v1/metrics`,headers:k}),exportIntervalMillis:15e3}),logRecordProcessors:[new m(new u({url:`${O}/v1/logs`,headers:k}))],instrumentations:[]}),E.start()}async function fe(){E&&await E.shutdown()}const A=s.getTracer(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),j=o.getMeter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),pe=l.getLogger(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),me=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.requests.total`,{unit:`{request}`,description:`Total requests received`}),he=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.requests.errors`,{unit:`{error}`,description:`Total error responses`}),ge=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.input`,{unit:`{token}`,description:`Total input tokens consumed`}),M=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.output`,{unit:`{token}`,description:`Total output tokens generated`}),N=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.cached`,{unit:`{token}`,description:`Total cached prompt tokens`}),P=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.triggers`,{unit:`{trigger}`,description:`Rate limit trigger count`}),F=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model_validation.errors`,{unit:`{error}`,description:`Model validation failures`}),I=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model_mapping.mappings`,{unit:`{mapping}`,description:`Model name normalizations`}),L=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempts`,{unit:`{attempt}`,description:`Token refresh attempts`}),_e=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.failures`,{unit:`{failure}`,description:`Token refresh final failures`}),ve=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.checks`,{unit:`{check}`,description:`Connectivity probe results`}),R=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.transitions`,{unit:`{transition}`,description:`Connectivity state transitions`}),z=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.upstream.requests`,{unit:`{request}`,description:`Upstream API calls`}),ye=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.chunks`,{unit:`{chunk}`,description:`Total SSE chunks sent`}),be=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.decisions`,{unit:`{decision}`,description:`Manual approval decisions`}),xe=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request.duration`,{unit:`ms`,description:`Total request duration`}),Se=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074.duration`,{unit:`ms`,description:`Upstream \u0043\u006f\u0070\u0069\u006c\u006f\u0074 API call duration`}),Ce=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.duration`,{unit:`ms`,description:`Duration of SSE streaming phase`}),we=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_duration`,{unit:`ms`,description:`Duration of rate limit waits`}),Te=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.duration`,{unit:`ms`,description:`Translation layer processing time`}),Ee=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.duration`,{unit:`ms`,description:`Token refresh duration`}),B=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.probe_duration`,{unit:`ms`,description:`Individual connectivity probe duration`}),De=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.per_request.input`,{unit:`{token}`,description:`Input tokens per request distribution`}),Oe=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.per_request.output`,{unit:`{token}`,description:`Output tokens per request distribution`}),ke=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.chunks_per_request`,{unit:`{chunk}`,description:`Chunks per streaming request`}),Ae=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration`,{unit:`ms`,description:`Time waiting for manual approval`});j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.status`,{unit:`{status}`,description:`1 = online, 0 = offline`}).addCallback(e=>{e.observe(K.getConnectivityStats().isOnline?1:0)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures`,{unit:`{failure}`,description:`Current consecutive connectivity failure count`}).addCallback(e=>{e.observe(K.getConnectivityStats().consecutiveFailures)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.models.available`,{unit:`{model}`,description:`Number of available models`}).addCallback(e=>{e.observe(S.models?.data.length??0)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.completion_logger.pending`,{unit:`{callback}`,description:`Number of pending completion callbacks`}).addCallback(e=>{e.observe(T.completionCallbacks.size)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.uptime`,{unit:`s`,description:`Server uptime in seconds`}).addCallback(e=>{e.observe((Date.now()-D)/1e3)});function V(e,t,n,r){let i=s.getActiveSpan(),a=i?.spanContext();pe.emit({severityNumber:e,severityText:t,body:n,attributes:{...r,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function H(e,t=``){let n={};if(e==null)return n;if(typeof e!=`object`)return(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)&&t&&(n[t]=e),n;if(Array.isArray(e))return t&&(n[t]=JSON.stringify(e)),n;for(let[r,i]of Object.entries(e)){let e=t?`${t}.${r}`:r;if(i===void 0||typeof i==`function`)continue;i===null?n[e]=`null`:typeof i==`object`&&!Array.isArray(i)?Object.assign(n,H(i,e)):Array.isArray(i)?n[e]=JSON.stringify(i):(typeof i==`string`||typeof i==`number`||typeof i==`boolean`)&&(n[e]=i)}return n}const U=new Set([`authorization`,`cookie`,`set-cookie`,`x-\u0068\u006f\u006e\u0065\u0079\u0063\u006f\u006d\u0062-team`,`x-api-key`,`proxy-authorization`]);function W(e,t,n){for(let[r,i]of Object.entries(n)){let n=r.toLowerCase();if(U.has(n))continue;e.setAttribute(`http.${t}.header.${n}`,i)}}function je(e,t){t.headers.forEach((t,n)=>{let r=n.toLowerCase();U.has(r)||e.setAttribute(`http.response.header.${r}`,t)})}async function G(e){let{spanName:t,url:n,target:r,method:o=`GET`,headers:s,body:c,signal:l,extraAttributes:u}=e,d=A.startSpan(t,{kind:i.CLIENT,attributes:{"http.method":o,"url.full":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.target":r,...u}});s&&W(d,`request`,s);try{let e=await fetch(n,{method:o,headers:s,body:c,signal:l});return d.setAttribute(`http.response.status_code`,e.status),je(d,e),z.add(1,{target:r,status_code:String(e.status)}),e.ok||d.setStatus({code:a.ERROR,message:`HTTP ${e.status}`}),{response:e,span:d}}catch(e){let t=e instanceof Error?e:Error(String(e));throw d.setStatus({code:a.ERROR,message:t.message}),d.recordException(t),d.end(),e}}async function Me(e){let{spanName:t,url:n,target:r,method:o=`POST`,headers:s,body:c,signal:l,headersTimeout:u,bodyTimeout:d,extraAttributes:f}=e,p=A.startSpan(t,{kind:i.CLIENT,attributes:{"http.method":o,"url.full":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.target":r,...f}});W(p,`request`,s);try{let{statusCode:e,headers:t,body:i}=await re(n,{method:o,headers:s,body:c,signal:l,headersTimeout:u,bodyTimeout:d});p.setAttribute(`http.response.status_code`,e);for(let[e,n]of Object.entries(t)){let t=e.toLowerCase();n!==void 0&&!U.has(t)&&p.setAttribute(`http.response.header.${t}`,Array.isArray(n)?n.join(`, `):n)}return z.add(1,{target:r,status_code:String(e)}),e>=400&&p.setStatus({code:a.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:i,span:p}}catch(e){let t=e instanceof Error?e:Error(String(e));throw p.setStatus({code:a.ERROR,message:t.message}),p.recordException(t),p.end(),e}}var Ne=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(){if(!S.connectivity.enabled){e.debug(`Connectivity monitoring disabled`);return}e.info(`Starting connectivity monitor`,{probeEndpoints:S.connectivity.probeEndpoints,fastInterval:S.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){e.debug(`Stopping connectivity monitor`),this.checkInterval&&=(clearTimeout(this.checkInterval),void 0),this.abortController&&=(this.abortController.abort(),void 0)}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let t=this.isOnline?S.connectivity.slowProbeInterval:S.connectivity.fastProbeInterval,n=Math.random()*S.connectivity.jitterMaxMs,r=t+n;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(t=>{e.error(`Connectivity check failed:`,t)})},r)}async performConnectivityCheck(){let t=A.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.probe`);this.abortController=new AbortController;let n=setTimeout(()=>this.abortController?.abort(),S.connectivity.timeoutMs);try{let n=!1;for(let t of S.connectivity.probeEndpoints)try{let e=performance.now(),r=await fetch(t,{method:`HEAD`,signal:this.abortController.signal,headers:{"User-Agent":`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api-connectivity-monitor/1.0`,...S.connectivity.dnsCache&&{"Cache-Control":`max-age=300`}}}),i=performance.now()-e;if(r.ok){n=!0,this.lastSuccessfulEndpoint=t,B.record(i,{endpoint:t,result:`success`});break}B.record(i,{endpoint:t,result:`failed`})}catch(n){this.endpointFailureStats[t]=(this.endpointFailureStats[t]||0)+1,e.debug(`Probe failed for ${t}:`,n)}this.updateConnectivityState(n),t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.result`,n?`online`:`offline`),t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures`,this.consecutiveFailures),this.lastSuccessfulEndpoint&&t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.successful_endpoint`,this.lastSuccessfulEndpoint),ve.add(1,{result:n?`online`:`offline`})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(n),t.end(),this.scheduleNextCheck()}}updateConnectivityState(t){let n=this.isOnline;if(this.isOnline=t,this.lastChecked=new Date().toISOString(),t){let t=this.consecutiveFailures;this.consecutiveFailures>0&&e.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,n||(this.dispatchEvent(new CustomEvent(`online`)),R.add(1,{from:`offline`,to:`online`}),V(c.INFO,`INFO`,`Connectivity restored`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures_before_recovery":t}))}else this.consecutiveFailures++,n&&(e.warn(`Connectivity lost`),this.dispatchEvent(new CustomEvent(`offline`)),R.add(1,{from:`online`,to:`offline`}),V(c.WARN,`WARN`,`Connectivity lost`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(t){this.lastErrorType=t.name,this.lastErrorMessage=t.message,e.error(`Connectivity check failed:`,t),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?S.connectivity.slowProbeInterval:S.connectivity.fastProbeInterval,t=new Date(Date.now()+e+Math.random()*S.connectivity.jitterMaxMs).toISOString();return{currentInterval:e,nextCheckEstimate:t,lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:S.connectivity.jitterMaxMs>0,connectionPooling:S.connectivity.connectionPooling,dnsCache:S.connectivity.dnsCache}}};const K=new Ne,q=()=>({"content-type":`application/json`,accept:`application/json`}),J=`0.39.2026030604`,Y=`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-chat/${J}`,X=`\u0047\u0069\u0074\u0048\u0075\u0062\u0043\u006f\u0070\u0069\u006c\u006f\u0074Chat/${J}`,Pe=e=>{let t=ie(`sha256`);return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||`anonymous`),t.update(n.hostname()),t.update(e),t.update(Date.now().toString()),t.update(g(16)),t.digest(`hex`)},Fe=e=>{let t=e.replaceAll(/[^\w.-]/g,`_`).trim();if(t.length===0||t===`.`||t===`..`||/^[_.]+$/.test(t))throw Error(`Invalid \u0047\u0069\u0074\u0048\u0075\u0062 username: cannot be empty or consist only of special characters after sanitization`);return`${y.MACHINE_ID_PATH}_${t}`},Ie=async e=>{let n=Fe(e);try{let e=await t.readFile(n,`utf8`);if(e.trim())return e.trim()}catch{}let r=Pe(e);return await t.writeFile(n,r),await t.chmod(n,384),r},Le=async()=>{try{let e=await t.readFile(y.SESSION_ID_PATH,`utf8`);if(e.trim())return e.trim()}catch{}let e=_();return await t.writeFile(y.SESSION_ID_PATH,e),await t.chmod(y.SESSION_ID_PATH,384),e},Re=async(e,t)=>{e.machineId||=await Ie(t),e.sessionId||=await Le()},ze=e=>e.accountType===`individual`?`https://api.\u0067\u0069\u0074\u0068\u0075\u0062\u0063\u006f\u0070\u0069\u006c\u006f\u0074.com`:`https://api.${e.accountType}.\u0067\u0069\u0074\u0068\u0075\u0062\u0063\u006f\u0070\u0069\u006c\u006f\u0074.com`,Z=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error(`\u0056\u0053\u0043\u006f\u0064\u0065 identifiers not initialized. Call initialize\u0056\u0053\u0043\u006f\u0064\u0065Identifiers() during startup.`);let n=_(),r={Authorization:`Bearer ${e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Token}`,"Content-Type":`application/json`,accept:`*/*`,"accept-encoding":`br, gzip, deflate`,"accept-language":`*`,"sec-fetch-mode":`cors`,"\u0043\u006f\u0070\u0069\u006c\u006f\u0074-Integration-Id":`\u0076\u0073\u0063\u006f\u0064\u0065-chat`,"Editor-Version":`\u0076\u0073\u0063\u006f\u0064\u0065/${e.\u0076\u0073\u0043\u006f\u0064\u0065Version}`,"Editor-Plugin-Version":Y,"User-Agent":X,"\u0056\u0053\u0063\u006f\u0064\u0065-MachineId":e.machineId,"\u0056\u0053\u0063\u006f\u0064\u0065-SessionId":e.sessionId,"\u004f\u0070\u0065\u006e\u0041\u0049-Intent":`conversation-agent`,"X-Interaction-Type":`conversation-agent`,"X-Agent-Task-Id":n,"X-\u0056\u0053\u0043\u006f\u0064\u0065-User-Agent-Library-Version":`node-fetch`,"X-\u0047\u0069\u0074\u0048\u0075\u0062-Api-Version":`2025-05-01`,"X-Interaction-Id":_(),"X-Request-Id":n};return t&&(r[`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-vision-request`]=`true`),r},Q=`https://api.\u0067\u0069\u0074\u0068\u0075\u0062.com`,Be=e=>({...q(),authorization:`token ${e.\u0067\u0069\u0074\u0068\u0075\u0062Token}`,"editor-version":`\u0076\u0073\u0063\u006f\u0064\u0065/${e.\u0076\u0073\u0043\u006f\u0064\u0065Version}`,"editor-plugin-version":Y,"user-agent":X,"x-\u0067\u0069\u0074\u0068\u0075\u0062-api-version":`2025-04-01`,"x-\u0076\u0073\u0063\u006f\u0064\u0065-user-agent-library-version":`node-fetch`}),Ve=`https://\u0067\u0069\u0074\u0068\u0075\u0062.com`,He=`\u0030\u0031\u0061\u0062\u0038\u0061\u0063\u0039\u0034\u0030\u0030\u0063\u0034\u0065\u0034\u0032\u0039\u0062\u0032\u0033`,Ue=[`user:email`].join(` `);var $=class extends Error{response;constructor(e,t){super(e),this.response=t}};async function We(t,n){let r=s.getActiveSpan();if(n instanceof $&&n.response.status===429){let e=t.get(`requestId`),i=T.completionCallbacks.get(e);i&&(T.logRateLimit(i,n.response),T.completionCallbacks.delete(e)),P.add(1,{action:`rejected`,source:`upstream`});let o=await n.response.text(),s;try{s=JSON.parse(o)}catch{s={error:{message:o,type:`error`}}}return r?.setStatus({code:a.ERROR,message:`Rate limited by upstream`}),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,`rate_limit_upstream`),V(c.WARN,`WARN`,`Upstream rate limit hit`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":429,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":`rate_limit_upstream`}),t.json(s,429)}if(e.error(`Error occurred:`,n),n instanceof $){let i=await n.response.text(),o;try{o=JSON.parse(i)}catch{o=i}return e.error(`HTTP error:`,o),r?.setStatus({code:a.ERROR,message:n.message}),r?.recordException(n),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,`HTTPError`),V(c.ERROR,`ERROR`,`HTTP error: ${n.message}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":n.response.status,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":`HTTPError`}),t.json({error:{message:i,type:`error`}},n.response.status)}let i=n instanceof Error?n:Error(String(n));return r?.setStatus({code:a.ERROR,message:i.message}),r?.recordException(i),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,i.name),V(c.ERROR,`ERROR`,`Unhandled error: ${i.message}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":500,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":i.name}),t.json({error:{message:i.message,type:`error`}},500)}async function Ge(){let e=`${Q}/user`,t=S.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),t);try{let{response:t,span:r}=await G({spanName:`\u0067\u0069\u0074\u0068\u0075\u0062 GET /user`,url:e,target:`\u0067\u0069\u0074\u0068\u0075\u0062_user`,headers:{authorization:`token ${S.\u0067\u0069\u0074\u0068\u0075\u0062Token}`,...q()},signal:n.signal});if(!t.ok)throw r.end(),new $(`Failed to get \u0047\u0069\u0074\u0048\u0075\u0062 user`,t);let i=await t.json();return r.end(),i}finally{clearTimeout(r)}}export{T as _c1,x as DEFAULT_TIMEOUT_MS,Q as _g1,Ue as _g4,Ve as _g2,He as _g3,$ as HTTPError,y as PATHS,U as SENSITIVE_HEADERS,c as SeverityNumber,be as approvalCounter,Ae as approvalWaitHistogram,N as cachedTokensCounter,ke as chunksPerRequestHistogram,K as connectivityMonitor,ze as _s1,Se as copilotDurationHistogram,Z as _s2,V as emitLog,ce as ensurePaths,he as errorsCounter,H as flattenAttributes,We as _c2,Ge as _s4,Be as _s3,de as initOtel,Re as _s5,ge as inputTokensCounter,De as inputTokensPerRequestHistogram,I as modelMappingCounter,F as modelValidationErrorCounter,M as outputTokensCounter,Oe as outputTokensPerRequestHistogram,P as rateLimitCounter,we as rateLimitWaitHistogram,xe as requestDurationHistogram,me as requestsCounter,fe as shutdownOtel,q as _c3,S as state,ye as streamChunksCounter,Ce as streamDurationHistogram,L as tokenRefreshAttemptCounter,Ee as tokenRefreshDurationHistogram,_e as tokenRefreshFailureCounter,G as tracedFetch,Me as tracedUndiciRequest,A as tracer,Te as translationDurationHistogram};
|