copilot-api-node20 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -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"@open\u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079/api";import{SeverityNumber as c,logs as l}from"@open\u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079/api-logs";import{OTLPLogExporter as u}from"@open\u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079/exporter-logs-otlp-http";import{OTLPMetricExporter as d}from"@open\u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079/exporter-metrics-otlp-http";import{OTLPTraceExporter as f}from"@open\u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079/exporter-trace-otlp-http";import{resourceFromAttributes as p}from"@open\u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079/resources";import{BatchLogRecordProcessor as m}from"@open\u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079/sdk-logs";import{PeriodicExportingMetricReader as h}from"@open\u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079/sdk-metrics";import{NodeSDK as ee}from"@open\u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079/sdk-node";import{ATTR_SERVICE_NAME as te,ATTR_SERVICE_VERSION as ne}from"@open\u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079/semantic-conventions";import{request as re}from"undici";import g from"node:process";import{createHash as ie,randomBytes as ae,randomUUID as _}from"node:crypto";const v=r.join(n.homedir(),`.local`,`share`,`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),oe=r.join(v,`\u0067\u0069\u0074\u0068\u0075\u0062_token`),se=r.join(v,`machine_id`),ce=r.join(v,`session_id`),y={APP_DIR:v,GITHUB_TOKEN_PATH:oe,MACHINE_ID_PATH:se,SESSION_ID_PATH:ce};async function le(){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={accountType:`individual`,manualApprove:!1,rateLimitWait:!1,showToken:!1,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}};let S;const C={byModel:new Map};let w;function T(){if(C.byModel.size!==0){for(let[e,t]of C.byModel)E(`usage_stats`,{model:e},{requests:t.requests,inputTokens:t.inputTokens,outputTokens:t.outputTokens});C.byModel.clear()}}function ue(e,t,n){if(!S)return;let r=C.byModel.get(e);r?(r.requests++,r.inputTokens+=t,r.outputTokens+=n):C.byModel.set(e,{requests:1,inputTokens:t,outputTokens:n})}async function de(e){g.env.OTEL_SERVICE_NAME||(g.env.OTEL_SERVICE_NAME=`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),g.env.OTEL_RESOURCE_ATTRIBUTES=[`service.version=${e.version}`,`service.instance.id=${e.machineId??n.hostname()}`].join(`,`),g.env.AZURE_MONITOR_AUTO_ATTACH=`false`;let t=await import(`applicationinsights`);t.default.setup(e.connectionString).setAutoCollectRequests(!1).setAutoCollectPerformance(!1,!1).setAutoCollectExceptions(!1).setAutoCollectDependencies(!1).setAutoCollectConsole(!1),S=t.default.defaultClient,S.commonProperties={accountType:e.accountType,runtime:e.runtime.name,runtimeVersion:e.runtime.version,userId:e.userId,os:`${e.runtime.platform} ${e.runtime.arch}`},t.default.start(),w&&clearInterval(w),w=setInterval(T,3e5),w.unref()}function E(e,t,n){S?.trackEvent({name:e,properties:t,measurements:n})}function D(e,t,n){S?.trackException({exception:e,properties:t,measurements:n})}async function fe(){S&&(w&&clearInterval(w),T(),await S.flush())}const O=e=>e>=1e5||e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString(),k=(e,t)=>e.padEnd(t),pe=(e,t)=>{if(!x.models)return``;let n=x.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}%)`},me=e=>{let t=[];if(e.model){let n=k(e.model,18);t.push(n)}if(e.tokenUsage){let n=e.tokenUsage,r=(n.inputTokens||0)+(n.outputTokens||0),i=e.model?pe(r,e.model):``,a=O(n.inputTokens||0).padStart(5),o=O(n.outputTokens||0).padStart(5),s=`↑${a} │ ↓${o}`,c=k(s,18),l=O(r),u=i?`${l}${i.padStart(15-l.length)}`:l.padEnd(15);t.push(`Tokens: ${c} | Context: ${u}`)}else if(e.model){let e=k(`N/A`,18),n=`N/A`.padEnd(15);t.push(`Tokens: ${e} | Context: ${n}`)}if(e.copilotDuration){let n=k(`${Math.round(e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);t.push(`API: ${n}`)}return t.length>0?` | ${t.join(` | `)}`:``},A={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=k(n.req.method,4),l=k(n.req.path,21),u=k(n.res.status.toString(),3),d=k(`${a}ms`,8),f=` --> ${s}${l}${u} ${d}`;o&&(f+=me(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}}),o?.model&&o.tokenUsage&&ue(o.model,o.tokenUsage.inputTokens??0,o.tokenUsage.outputTokens??0)},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=k(r.req.method,4),d=k(r.req.path,21),f=k(`429`,3),p=k(`${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=k(`${Math.round(h.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);m+=` | API: ${e}`}e.info(m),E(`rate_limit_upstream`,{model:h?.model??`unknown`,path:r.req.path,rateLimitType:c,retryAfter:l},{durationMs:o})},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(()=>A.cleanup(),60*1e3);let j,M=Date.now();const N=`https://api.honeycomb.io`,P={"x-honeycomb-team":`hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n`};function he(e,t){t&&(M=t);let n=p({[te]:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,[ne]:e});j=new ee({resource:n,traceExporter:new f({url:`${N}/v1/traces`,headers:P}),metricReader:new h({exporter:new d({url:`${N}/v1/metrics`,headers:P}),exportIntervalMillis:15e3}),logRecordProcessors:[new m(new u({url:`${N}/v1/logs`,headers:P}))],instrumentations:[]}),j.start()}async function ge(){j&&await j.shutdown()}const F=s.getTracer(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),I=o.getMeter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),_e=l.getLogger(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),ve=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.requests.total`,{unit:`{request}`,description:`Total requests received`}),ye=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.requests.errors`,{unit:`{error}`,description:`Total error responses`}),be=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.input`,{unit:`{token}`,description:`Total input tokens consumed`}),xe=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.output`,{unit:`{token}`,description:`Total output tokens generated`}),Se=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.cached`,{unit:`{token}`,description:`Total cached prompt tokens`}),L=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.triggers`,{unit:`{trigger}`,description:`Rate limit trigger count`}),Ce=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model_validation.errors`,{unit:`{error}`,description:`Model validation failures`}),we=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model_mapping.mappings`,{unit:`{mapping}`,description:`Model name normalizations`}),Te=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempts`,{unit:`{attempt}`,description:`Token refresh attempts`}),Ee=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.failures`,{unit:`{failure}`,description:`Token refresh final failures`}),De=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.checks`,{unit:`{check}`,description:`Connectivity probe results`}),R=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.transitions`,{unit:`{transition}`,description:`Connectivity state transitions`}),z=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.upstream.requests`,{unit:`{request}`,description:`Upstream API calls`}),Oe=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.chunks`,{unit:`{chunk}`,description:`Total SSE chunks sent`}),ke=I.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.decisions`,{unit:`{decision}`,description:`Manual approval decisions`}),Ae=I.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request.duration`,{unit:`ms`,description:`Total request duration`}),je=I.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`}),Me=I.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.duration`,{unit:`ms`,description:`Duration of SSE streaming phase`}),Ne=I.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_duration`,{unit:`ms`,description:`Duration of rate limit waits`}),Pe=I.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.duration`,{unit:`ms`,description:`Translation layer processing time`}),Fe=I.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.duration`,{unit:`ms`,description:`Token refresh duration`}),B=I.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.probe_duration`,{unit:`ms`,description:`Individual connectivity probe duration`}),Ie=I.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.per_request.input`,{unit:`{token}`,description:`Input tokens per request distribution`}),Le=I.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.per_request.output`,{unit:`{token}`,description:`Output tokens per request distribution`}),Re=I.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.chunks_per_request`,{unit:`{chunk}`,description:`Chunks per streaming request`}),ze=I.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration`,{unit:`ms`,description:`Time waiting for manual approval`});I.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)}),I.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)}),I.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.models.available`,{unit:`{model}`,description:`Number of available models`}).addCallback(e=>{e.observe(x.models?.data.length??0)}),I.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.completion_logger.pending`,{unit:`{callback}`,description:`Number of pending completion callbacks`}).addCallback(e=>{e.observe(A.completionCallbacks.size)}),I.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.uptime`,{unit:`s`,description:`Server uptime in seconds`}).addCallback(e=>{e.observe((Date.now()-M)/1e3)});function V(e,t,n,r){let i=s.getActiveSpan(),a=i?.spanContext();_e.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-honeycomb-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 Be(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=F.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),Be(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 Ve(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=F.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 He=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(!x.connectivity.enabled){e.debug(`Connectivity monitoring disabled`);return}e.info(`Starting connectivity monitor`,{probeEndpoints:x.connectivity.probeEndpoints,fastInterval:x.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?x.connectivity.slowProbeInterval:x.connectivity.fastProbeInterval,n=Math.random()*x.connectivity.jitterMaxMs,r=t+n;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(t=>{e.error(`Connectivity check failed:`,t)})},r)}async performConnectivityCheck(){let t=F.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.probe`);this.abortController=new AbortController;let n=setTimeout(()=>this.abortController?.abort(),x.connectivity.timeoutMs);try{let n=!1;for(let t of x.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`,...x.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),De.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}),E(`connectivity_change`,{status:`online`},{consecutiveFailures: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}),E(`connectivity_change`,{status:`offline`},{consecutiveFailures: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?x.connectivity.slowProbeInterval:x.connectivity.fastProbeInterval,t=new Date(Date.now()+e+Math.random()*x.connectivity.jitterMaxMs).toISOString();return{currentInterval:e,nextCheckEstimate:t,lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:x.connectivity.jitterMaxMs>0,connectionPooling:x.connectivity.connectionPooling,dnsCache:x.connectivity.dnsCache}}};const K=new He,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}`,Ue=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(ae(16)),t.digest(`hex`)},We=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}`},Ge=async e=>{let n=We(e);try{let e=await t.readFile(n,`utf8`);if(e.trim())return e.trim()}catch{}let r=Ue(e);return await t.writeFile(n,r),await t.chmod(n,384),r},Ke=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 Ge(t),e.sessionId||=await Ke()},qe=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`,Je=(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`,Ye=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`}),Xe=`https://\u0067\u0069\u0074\u0068\u0075\u0062.com`,Ze=`\u0030\u0031\u0061\u0062\u0038\u0061\u0063\u0039\u0034\u0030\u0030\u0063\u0034\u0065\u0034\u0032\u0039\u0062\u0032\u0033`,Qe=[`user:email`].join(` `);var $=class extends Error{response;constructor(e,t){super(e),this.response=t}};async function $e(t,n){let r=s.getActiveSpan();if(n instanceof $&&n.response.status===429){let e=t.get(`requestId`),i=A.completionCallbacks.get(e);i&&(A.logRateLimit(i,n.response),A.completionCallbacks.delete(e)),L.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),D(n,{statusCode:String(n.response.status),path:t.req.path,errorType:`HTTPError`}),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 D(i,{path:t.req.path,errorType:i.name}),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 et(){let e=`${Q}/user`,t=x.timeoutMs??12e4,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 ${x.\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{A as _c1,Q as _g1,Qe as _g4,Xe as _g2,Ze as _g3,$ as HTTPError,y as PATHS,U as SENSITIVE_HEADERS,c as SeverityNumber,ke as approvalCounter,ze as approvalWaitHistogram,Se as cachedTokensCounter,Re as chunksPerRequestHistogram,K as connectivityMonitor,qe as _s1,je as copilotDurationHistogram,Je as _s2,V as emitLog,le as ensurePaths,ye as errorsCounter,H as flattenAttributes,fe as _t1,$e as _c2,et as _s4,Ye as _s3,he as initOtel,de as _t2,Z as _s5,be as inputTokensCounter,Ie as inputTokensPerRequestHistogram,we as modelMappingCounter,Ce as modelValidationErrorCounter,xe as outputTokensCounter,Le as outputTokensPerRequestHistogram,L as rateLimitCounter,Ne as rateLimitWaitHistogram,Ae as requestDurationHistogram,ve as requestsCounter,ge as shutdownOtel,q as _c3,x as state,Oe as streamChunksCounter,Me as streamDurationHistogram,Te as tokenRefreshAttemptCounter,Fe as tokenRefreshDurationHistogram,Ee as tokenRefreshFailureCounter,G as tracedFetch,Ve as tracedUndiciRequest,F as tracer,E as _t3,D as _t4,Pe as translationDurationHistogram};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_s4 as e}from"./get-user-BR-wvBP9.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,_g1 as t,_g4 as n,_g2 as r,_g3 as i,HTTPError as a,PATHS as o,_s1 as s,_s2 as c,ensurePaths as l,_t1 as u,_c2 as d,_s4 as ee,_s3 as f,_t2 as te,_s5 as ne,_c3 as p,state as m,_t3 as h,_t4 as re}from"./get-user-CSS558OK.js";import{defineCommand as g,runMain as ie}from"citty";import _ from"consola";import v from"node:fs/promises";import y from"node:os";import b from"node:process";import ae from"clipboardy";import{serve as oe}from"srvx";import se from"tiny-invariant";import{execSync as ce}from"node:child_process";import{Hono as x}from"hono";import{cors as le}from"hono/cors";import{streamSSE as S}from"hono/streaming";import{events as ue}from"fetch-event-stream";import{request as de}from"undici";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(!m.connectivity.enabled){_.debug(`Connectivity monitoring disabled`);return}_.info(`Starting connectivity monitor`,{probeEndpoints:m.connectivity.probeEndpoints,fastInterval:m.connectivity.fastProbeInterval}),this.scheduleNextCheck();let e=()=>{this.stop(),process.exit(0)};process.on(`SIGINT`,e),process.on(`SIGTERM`,e)}stop(){_.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 e=this.isOnline?m.connectivity.slowProbeInterval:m.connectivity.fastProbeInterval,t=Math.random()*m.connectivity.jitterMaxMs,n=e+t;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(e=>{_.error(`Connectivity check failed:`,e)})},n)}async performConnectivityCheck(){this.abortController=new AbortController;let e=setTimeout(()=>this.abortController?.abort(),m.connectivity.timeoutMs);try{let e=!1;for(let t of m.connectivity.probeEndpoints)try{let n=await fetch(t,{method:`HEAD`,signal:this.abortController.signal,headers:{"User-Agent":`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api-connectivity-monitor/1.0`,...m.connectivity.dnsCache&&{"Cache-Control":`max-age=300`}}});if(n.ok){e=!0,this.lastSuccessfulEndpoint=t;break}}catch(e){this.endpointFailureStats[t]=(this.endpointFailureStats[t]||0)+1,_.debug(`Probe failed for ${t}:`,e)}this.updateConnectivityState(e)}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(e),this.scheduleNextCheck()}}updateConnectivityState(e){let t=this.isOnline;if(this.isOnline=e,this.lastChecked=new Date().toISOString(),e){let e=this.consecutiveFailures;this.consecutiveFailures>0&&_.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,t||(this.dispatchEvent(new CustomEvent(`online`)),h(`connectivity_change`,{status:`online`},{consecutiveFailures:e}))}else this.consecutiveFailures++,t&&(_.warn(`Connectivity lost`),this.dispatchEvent(new CustomEvent(`offline`)),h(`connectivity_change`,{status:`offline`},{consecutiveFailures:this.consecutiveFailures}))}handleConnectivityError(e){this.lastErrorType=e.name,this.lastErrorMessage=e.message,_.error(`Connectivity check failed:`,e),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?m.connectivity.slowProbeInterval:m.connectivity.fastProbeInterval,t=new Date(Date.now()+e+Math.random()*m.connectivity.jitterMaxMs).toISOString();return{currentInterval:e,nextCheckEstimate:t,lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:m.connectivity.jitterMaxMs>0,connectionPooling:m.connectivity.connectionPooling,dnsCache:m.connectivity.dnsCache}}};const C=new fe,w=async()=>{let e=new AbortController,n=m.timeoutMs??12e4,r=setTimeout(()=>{e.abort()},n);try{let n=await fetch(`${t}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/v2/token`,{headers:f(m),signal:e.signal});if(!n.ok)throw new a(`Failed to get Service token`,n);return await n.json()}finally{clearTimeout(r)}};async function pe(){let e=new AbortController,t=m.timeoutMs??12e4,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${r}/login/device/code`,{method:`POST`,headers:p(),body:JSON.stringify({client_id:i,scope:n}),signal:e.signal});if(!t.ok)throw new a(`Failed to get device code`,t);return await t.json()}finally{clearTimeout(o)}}const me=async()=>{let e=new AbortController,t=m.timeoutMs??12e4,n=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${s(m)}/models`,{headers:c(m),signal:e.signal});if(!t.ok)throw new a(`Failed to get models`,t);return await t.json()}finally{clearTimeout(n)}};function T(){return`1.111.0-insider`}T();const E=e=>new Promise(t=>{setTimeout(t,e)}),he=e=>e==null;async function ge(){let e=await me();m.models=e}const _e=()=>{let e=T();m.vsCodeVersion=e,_.info(`Using client version: ${e}`)};async function ve(e){let t=(e.interval+1)*1e3;for(_.debug(`Polling access token with interval of ${t}ms`);;){let n=new AbortController,a=m.timeoutMs??12e4,o=setTimeout(()=>{n.abort()},a);try{let a=await fetch(`${r}/login/oauth/access_token`,{method:`POST`,headers:p(),body:JSON.stringify({client_id:i,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`}),signal:n.signal});if(!a.ok){await E(t),_.error(`Failed to poll access token:`,await a.text());continue}let o=await a.json();_.debug(`Polling access token response:`,o);let{access_token:s}=o;if(s)return s;await E(t)}catch(e){if(e instanceof Error&&e.name===`AbortError`){_.error(`Access token polling timed out`),await E(t);continue}throw e}finally{clearTimeout(o)}}}let D,O=!1,k,A;function ye(){_.debug(`Cleaning up token management`),D&&=(clearInterval(D),void 0),k&&=(C.off(`online`,k),void 0),A&&=(C.off(`offline`,A),void 0)}const be=()=>v.readFile(o.GITHUB_TOKEN_PATH,`utf8`),xe=e=>v.writeFile(o.GITHUB_TOKEN_PATH,e),Se=async()=>{let{token:e,refresh_in:t}=await w();m.copilotToken=e,_.debug(`Service token fetched successfully!`),m.showToken&&_.info(`Service token:`,e);let n=(t-60)*1e3,r=async(e=5,t=1e3,n=`scheduled`)=>{if(O){_.debug(`Refresh already in progress, skipping`);return}O=!0;try{for(let r=1;r<=e;r++)try{_.debug(`Refreshing Service token (${n}, attempt ${r}/${e})`);let{token:t}=await w();m.copilotToken=t,_.debug(`Service token refreshed successfully`),m.showToken&&_.info(`Refreshed Service token:`,t),h(`token_refresh`,{reason:n},{attempt:r});return}catch(i){let a=r===e;if(_.error(`Failed to refresh Service token (attempt ${r}/${e}):`,i),a){_.error(`All refresh attempts failed. May be unavailable until next scheduled refresh.`);let t=i instanceof Error?i:Error(String(i));re(t,{reason:n,event:`token_refresh_failed`},{attempt:r,maxRetries:e});return}let o=t*2**(r-1);_.debug(`Retrying token refresh in ${o}ms...`),await new Promise(e=>setTimeout(e,o))}}finally{O=!1}};D=setInterval(()=>{r(5,1e3,`scheduled`).catch(e=>{_.error(`Unexpected error in scheduled token refresh:`,e)})},n),C.start(),k=()=>{_.debug(`Network connectivity restored, attempting immediate token refresh`),r(3,500,`network-restored`).catch(e=>{_.error(`Unexpected error in network-restored token refresh:`,e)})},A=()=>{_.debug(`Network connectivity lost`)},C.on(`online`,k),C.on(`offline`,A)};async function j(e){try{let t=await be();if(t&&!e?.force){m.githubToken=t,m.showToken&&_.info(`Auth token:`,t),await M();return}_.info(`Authentication required`);let n=await pe();_.debug(`Device code response:`,n),_.info(`Please enter the code "${n.user_code}" in ${n.verification_uri}`);let r=await ve(n);await xe(r),m.githubToken=r,m.showToken&&_.info(`Auth token:`,r),await M()}catch(e){throw e instanceof a?(_.error(`Failed to get Auth token:`,await e.response.json()),e):(_.error(`Failed to get Auth token:`,e),e)}}async function M(){let e=await ee();_.info(`Authenticated as ${e.login}`)}async function Ce(e){e.verbose&&(_.level=5,_.info(`Verbose logging enabled`)),m.showToken=e.showToken,await l(),await j({force:!0}),_.success(`Auth token written to`,o.GITHUB_TOKEN_PATH)}const we=g({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 Ce({verbose:e.verbose,showToken:e[`show-token`]})}}),N=async()=>{let e=new AbortController,n=m.timeoutMs??12e4,r=setTimeout(()=>{e.abort()},n);try{let n=await fetch(`${t}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/user`,{headers:f(m),signal:e.signal});if(!n.ok)throw new a(`Failed to get usage`,n);return await n.json()}finally{clearTimeout(r)}},Te=g({meta:{name:`check-usage`,description:`Show current usage/quota information`},async run(){await l(),await j();try{let e=await N(),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);_.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){_.error(`Failed to fetch usage:`,e),process.exit(1)}}});async function P(){try{let e=new URL(`../package.json`,import.meta.url).pathname,t=await v.readFile(e),n=JSON.parse(t.toString());return n.version}catch{return`unknown`}}function F(){let e=typeof Bun<`u`;return{name:e?`bun`:`node`,version:e?Bun.version:process.version.slice(1),platform:y.platform(),arch:y.arch()}}async function Ee(){try{let e=await v.stat(o.GITHUB_TOKEN_PATH);if(!e.isFile())return!1;let t=await v.readFile(o.GITHUB_TOKEN_PATH,`utf8`);return t.trim().length>0}catch{return!1}}async function De(){let[e,t]=await Promise.all([P(),Ee()]);return{version:e,runtime:F(),paths:{APP_DIR:o.APP_DIR,GITHUB_TOKEN_PATH:o.GITHUB_TOKEN_PATH},tokenExists:t}}function Oe(e){_.info(`service debug
|
|
2
|
+
import{_c1 as e,_g1 as t,_g4 as n,_g2 as r,_g3 as i,HTTPError as a,PATHS as o,SENSITIVE_HEADERS as s,SeverityNumber as c,approvalCounter as l,approvalWaitHistogram as u,cachedTokensCounter as d,chunksPerRequestHistogram as f,connectivityMonitor as p,_s1 as m,copilotDurationHistogram as h,_s2 as g,emitLog as _,ensurePaths as v,errorsCounter as ee,flattenAttributes as y,_t1 as te,_c2 as b,_s4 as ne,_s3 as re,initOtel as ie,_t2 as ae,_s5 as oe,inputTokensCounter as se,inputTokensPerRequestHistogram as ce,modelMappingCounter as le,modelValidationErrorCounter as ue,outputTokensCounter as de,outputTokensPerRequestHistogram as fe,rateLimitCounter as x,rateLimitWaitHistogram as pe,requestDurationHistogram as me,requestsCounter as he,shutdownOtel as ge,_c3 as S,state as C,streamChunksCounter as _e,streamDurationHistogram as ve,tokenRefreshAttemptCounter as ye,tokenRefreshDurationHistogram as be,tokenRefreshFailureCounter as xe,tracedFetch as w,tracedUndiciRequest as Se,tracer as T,_t3 as E,_t4 as Ce,translationDurationHistogram as we}from"./get-user-BR-wvBP9.js";import{defineCommand as D,runMain as Te}from"citty";import O from"consola";import k from"node:fs/promises";import Ee from"node:os";import{SpanKind as A,SpanStatusCode as j,context as De,trace as Oe}from"@open\u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079/api";import M from"node:process";import ke from"clipboardy";import{serve as Ae}from"srvx";import je from"tiny-invariant";import{execSync as Me}from"node:child_process";import{Hono as N}from"hono";import{cors as Ne}from"hono/cors";import{streamSSE as Pe}from"hono/streaming";import{events as Fe}from"fetch-event-stream";const P=async()=>{let e=`${t}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/v2/token`,n=C.timeoutMs??12e4,r=new AbortController,i=setTimeout(()=>r.abort(),n);try{let{response:t,span:n}=await w({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:re(C),signal:r.signal});if(!t.ok)throw n.end(),new a(`Failed to get Service token`,t);let i=await t.json();return n.end(),i}finally{clearTimeout(i)}};async function Ie(){let e=new AbortController,t=C.timeoutMs??12e4,o=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${r}/login/device/code`,{method:`POST`,headers:S(),body:JSON.stringify({client_id:i,scope:n}),signal:e.signal});if(!t.ok)throw new a(`Failed to get device code`,t);return await t.json()}finally{clearTimeout(o)}}const Le=async()=>{let e=`${m(C)}/models`,t=g(C),n=C.timeoutMs??12e4,r=new AbortController,i=setTimeout(()=>r.abort(),n);try{let{response:n,span:i}=await w({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 a(`Failed to get models`,n);let o=await n.json();return i.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.models_count`,o.data.length),i.end(),o}finally{clearTimeout(i)}};function F(){return`1.111.0-insider`}F();const I=e=>new Promise(t=>{setTimeout(t,e)}),Re=e=>e==null;async function ze(){let e=await Le();C.models=e}const Be=()=>{let e=F();C.vsCodeVersion=e,O.info(`Using client version: ${e}`)};async function Ve(e){let t=(e.interval+1)*1e3;for(O.debug(`Polling access token with interval of ${t}ms`);;){let n=new AbortController,a=C.timeoutMs??12e4,o=setTimeout(()=>{n.abort()},a);try{let a=await fetch(`${r}/login/oauth/access_token`,{method:`POST`,headers:S(),body:JSON.stringify({client_id:i,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`}),signal:n.signal});if(!a.ok){await I(t),O.error(`Failed to poll access token:`,await a.text());continue}let o=await a.json();O.debug(`Polling access token response:`,o);let{access_token:s}=o;if(s)return s;await I(t)}catch(e){if(e instanceof Error&&e.name===`AbortError`){O.error(`Access token polling timed out`),await I(t);continue}throw e}finally{clearTimeout(o)}}}let L,R=!1,z,B;function He(){O.debug(`Cleaning up token management`),L&&=(clearInterval(L),void 0),z&&=(p.off(`online`,z),void 0),B&&=(p.off(`offline`,B),void 0)}const Ue=()=>k.readFile(o.GITHUB_TOKEN_PATH,`utf8`),We=e=>k.writeFile(o.GITHUB_TOKEN_PATH,e),Ge=async()=>{let{token:e,refresh_in:t}=await P();C.copilotToken=e,O.debug(`Service token fetched successfully!`),C.showToken&&O.info(`Service token:`,e);let n=(t-60)*1e3,r=async(e=5,t=1e3,n=`scheduled`)=>{if(R){O.debug(`Refresh already in progress, skipping`);return}return R=!0,T.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),O.debug(`Refreshing Service token (${n}, attempt ${a}/${e})`);let{token:t}=await P();C.copilotToken=t,O.debug(`Service token refreshed successfully`),C.showToken&&O.info(`Refreshed Service token:`,t),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.success`,!0),ye.add(1,{reason:n,success:`true`}),be.record(performance.now()-i,{reason:n}),_(c.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}),E(`token_refresh`,{reason:n},{attempt:a});return}catch(o){let s=a===e;if(O.error(`Failed to refresh Service token (attempt ${a}/${e}):`,o),ye.add(1,{reason:n,success:`false`}),s){O.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:j.ERROR,message:t.message}),r.recordException(t),xe.add(1,{reason:n}),be.record(performance.now()-i,{reason:n}),_(c.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}),Ce(t,{reason:n,event:`token_refresh_failed`},{attempt:a,maxRetries:e});return}let l=t*2**(a-1);O.debug(`Retrying token refresh in ${l}ms...`),await new Promise(e=>setTimeout(e,l))}}finally{r.end(),R=!1}})};L=setInterval(()=>{r(5,1e3,`scheduled`).catch(e=>{O.error(`Unexpected error in scheduled token refresh:`,e)})},n),p.start(),z=()=>{O.debug(`Network connectivity restored, attempting immediate token refresh`),r(3,500,`network-restored`).catch(e=>{O.error(`Unexpected error in network-restored token refresh:`,e)})},B=()=>{O.debug(`Network connectivity lost`)},p.on(`online`,z),p.on(`offline`,B)};async function V(e){try{let t=await Ue();if(t&&!e?.force){C.githubToken=t,C.showToken&&O.info(`Auth token:`,t),await Ke();return}O.info(`Authentication required`);let n=await Ie();O.debug(`Device code response:`,n),O.info(`Please enter the code "${n.user_code}" in ${n.verification_uri}`);let r=await Ve(n);await We(r),C.githubToken=r,C.showToken&&O.info(`Auth token:`,r),await Ke()}catch(e){throw e instanceof a?(O.error(`Failed to get Auth token:`,await e.response.json()),e):(O.error(`Failed to get Auth token:`,e),e)}}async function Ke(){let e=await ne();O.info(`Authenticated as ${e.login}`)}async function qe(e){e.verbose&&(O.level=5,O.info(`Verbose logging enabled`)),C.showToken=e.showToken,await v(),await V({force:!0}),O.success(`Auth token written to`,o.GITHUB_TOKEN_PATH)}const Je=D({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 qe({verbose:e.verbose,showToken:e[`show-token`]})}}),Ye=async()=>{let e=`${t}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/user`,n=C.timeoutMs??12e4,r=new AbortController,i=setTimeout(()=>r.abort(),n);try{let{response:t,span:n}=await w({spanName:`\u0067\u0069\u0074\u0068\u0075\u0062 GET /\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/user`,url:e,target:`usage`,headers:re(C),signal:r.signal});if(!t.ok)throw n.end(),new a(`Failed to get usage`,t);let i=await t.json();return n.end(),i}finally{clearTimeout(i)}},Xe=D({meta:{name:`check-usage`,description:`Show current usage/quota information`},async run(){await v(),await V();try{let e=await Ye(),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);O.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){O.error(`Failed to fetch usage:`,e),process.exit(1)}}});async function H(){try{let e=new URL(`../package.json`,import.meta.url).pathname,t=await k.readFile(e),n=JSON.parse(t.toString());return n.version}catch{return`unknown`}}function U(){let e=typeof Bun<`u`;return{name:e?`bun`:`node`,version:e?Bun.version:process.version.slice(1),platform:Ee.platform(),arch:Ee.arch()}}async function Ze(){try{let e=await k.stat(o.GITHUB_TOKEN_PATH);if(!e.isFile())return!1;let t=await k.readFile(o.GITHUB_TOKEN_PATH,`utf8`);return t.trim().length>0}catch{return!1}}async function Qe(){let[e,t]=await Promise.all([H(),Ze()]);return{version:e,runtime:U(),paths:{APP_DIR:o.APP_DIR,GITHUB_TOKEN_PATH:o.GITHUB_TOKEN_PATH},tokenExists:t}}function $e(e){O.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,12 +8,12 @@ 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 ke(e){console.log(JSON.stringify(e,null,2))}async function Ae(e){let t=await De();e.json?ke(t):Oe(t)}const je=g({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 Ae({json:e.json})}});function Me(){let{platform:e,ppid:t,env:n}=b;if(e===`win32`){try{let e=`wmic process get ParentProcessId,Name | findstr "${t}"`,n=ce(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 Ne(e,t=``){let n=Me(),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 Pe(){return`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}function Fe(){return async(t,n)=>{let r=Date.now(),i=Pe();t.set(`requestId`,i),t.header(`x-request-id`,i),e.registerCompletion(i,t,r),await n();let a=t.get(`requestData`);a?.tokenUsage&&e.executeCompletion(i)}}const I=async()=>{let e=await _.prompt(`Accept incoming request?`,{type:`confirm`});if(!e)throw new a(`Request rejected`,Response.json({message:`Request rejected`},{status:403}))},L={input:3e-6,output:15e-6};function R(e){let t=e.prompt_tokens||0,n=e.completion_tokens||0,r=e.total_tokens||t+n,i=t*L.input+n*L.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}}const Ie=[{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`}],Le={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 Re(e){return e.startsWith(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/`)?e.slice(10):e}function ze(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 Be(e){for(let t of Ie)if(t.pattern.test(e))return t.family;return null}function Ve(e,t,n=null){let r=Le[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 He(e,t){let n=Re(e),[r,i]=ze(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=Be(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 Ve(a,t,i)}var z=class extends Error{statusCode;constructor(e,t=400){super(e),this.name=`ModelValidationError`,this.statusCode=t}};function B(e){if(!e||typeof e!=`string`)throw new z(`Model name is required and must be a string`);if(!m.models?.data)throw new z(`Models not available. Please try again later.`,503);let t=m.models.data.map(e=>e.id),n=He(e,t);if(!n)throw h(`model_validation_error`,{requestedModel:e}),new z(`Invalid model: '${e}'. Available services: ${t.join(`, `)}`);return n}async function V(e){if(e.rateLimitSeconds===void 0)return;let t=Date.now();if(!e.lastRequestTimestamp){e.lastRequestTimestamp=t;return}let n=(t-e.lastRequestTimestamp)/1e3;if(n>e.rateLimitSeconds){e.lastRequestTimestamp=t;return}let r=Math.ceil(e.rateLimitSeconds-n);if(!e.rateLimitWait)throw _.warn(`Rate limit exceeded. Need to wait ${r} more seconds.`),h(`rate_limit_triggered`,{action:`rejected`},{waitTimeSeconds:r}),new a(`Rate limit exceeded`,Response.json({message:`Rate limit exceeded`},{status:429}));let i=r*1e3;_.warn(`Rate limit reached. Waiting ${r} seconds before proceeding...`),h(`rate_limit_triggered`,{action:`waited`},{waitTimeSeconds:r}),await E(i),e.lastRequestTimestamp=t,_.info(`Rate limit wait completed, proceeding with request`)}function Ue(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 H(e){if(typeof e==`string`)return Ue(e);if(Array.isArray(e)){let t=e.map(e=>H(e));return t}if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=H(r);return t}return e}const U=async e=>{if(!m.copilotToken)throw Error(`Service token not found`);let t=H(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={...c(m,n),"X-Initiator":r?`agent`:`user`},o=new AbortController,l=m.timeoutMs??12e4,u=setTimeout(()=>{o.abort()},l);try{let{statusCode:e,headers:n,body:r}=await de(`${s(m)}/chat/completions`,{method:`POST`,headers:i,body:JSON.stringify(t),signal:o.signal,headersTimeout:l,bodyTimeout:l*3}),c=new Response(r,{status:e,headers:n});if(!c.ok)throw new a(`Failed to create chat completions`,c);return t.stream?ue(c):await c.json()}finally{clearTimeout(u)}};function We(e){let t=B(e.model);return t===e.model?e:(_.debug(`Normalized model from '${e.model}' to '${t}'`),{...e,model:t})}async function Ge(t){await V(m);let n=await t.req.json();_.debug(`Request payload:`,JSON.stringify(n).slice(-400));try{n=We(n)}catch(e){if(e instanceof z)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}),m.manualApprove&&await I(),he(n.max_tokens)){let e=m.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},_.debug(`Set max_tokens to:`,JSON.stringify(n.max_tokens))}let r=performance.now(),i=await U(n),a=performance.now()-r;if(Ke(i)){let e=t.get(`requestData`)||{};return i.usage&&(e.tokenUsage=R(i.usage)),e.copilotDuration=a,t.set(`requestData`,e),_.debug(`Non-streaming response:`,JSON.stringify(i)),t.json(i)}return S(t,async n=>{let r=null;for await(let e of i){let i=e;if(e.data&&e.data!==`[DONE]`)try{let n=JSON.parse(e.data);if(n.usage){r=n.usage;let e=t.get(`requestData`)||{};e.tokenUsage=R(r),e.copilotDuration=a,t.set(`requestData`,e)}if(n.usage?.prompt_tokens_details?.cached_tokens!==void 0){let t={...n,usage:{...n.usage,prompt_tokens_details:void 0}};i={...e,data:JSON.stringify(t)}}}catch{}await n.writeSSE(i)}if(r){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=R(r),e.copilotDuration=a,t.set(`requestData`,e))}let o=t.get(`requestId`);o&&e.executeCompletion(o)})}const Ke=e=>Object.hasOwn(e,`choices`),W=new x;W.post(`/`,async e=>{try{return await Ge(e)}catch(t){return await d(e,t)}});const qe=async e=>{if(!m.copilotToken)throw Error(`Service token not found`);let t=new AbortController,n=m.timeoutMs??12e4,r=setTimeout(()=>{t.abort()},n);try{let n=await fetch(`${s(m)}/embeddings`,{method:`POST`,headers:c(m),body:JSON.stringify(e),signal:t.signal});if(!n.ok)throw new a(`Failed to create embeddings`,n);return await n.json()}finally{clearTimeout(r)}},G=new x;G.post(`/`,async e=>{try{let t=await e.req.json();try{B(t.model)}catch(t){if(t instanceof z)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 qe(t),i=performance.now()-n,a=e.get(`requestData`)||{};return a.tokenUsage=R(r.usage),a.copilotDuration=i,e.set(`requestData`,a),e.json(r)}catch(t){return await d(e,t)}});function K(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 Je(e){return{model:Ye(e.model),messages:Xe(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:et(e.tools),tool_choice:tt(e.tool_choice)}}function Ye(e){return e}function Xe(e,t){let n=Ze(t),r=e.flatMap(e=>e.role===`user`?Qe(e):$e(e));return[...n,...r]}function q(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 Ze(e){if(!e)return[];if(typeof e==`string`)return[{role:`system`,content:q(e)}];{let t=e.map(e=>e.text).join(`
|
|
11
|
+
Token exists: ${e.tokenExists?`Yes`:`No`}`)}function et(e){console.log(JSON.stringify(e,null,2))}async function tt(e){let t=await Qe();e.json?et(t):$e(t)}const nt=D({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 tt({json:e.json})}});function rt(){let{platform:e,ppid:t,env:n}=M;if(e===`win32`){try{let e=`wmic process get ParentProcessId,Name | findstr "${t}"`,n=Me(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 it(e,t=``){let n=rt(),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 at(){return`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}function ot(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 st(){return async(t,n)=>{let r=Date.now(),i=at(),a=t.req.method,o=t.req.path,c=ot(o);t.set(`requestId`,i),t.header(`x-request-id`,i);let l=T.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.handle_request`,{kind:A.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":c}});for(let[e,n]of Object.entries(t.req.header())){let t=e.toLowerCase();if(s.has(t))continue;l.setAttribute(`http.request.header.${t}`,n)}let u=Oe.setSpan(De.active(),l);await De.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:j.ERROR,message:t.message}),l.recordException(t),e}});let f=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`,f),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();s.has(n)||l.setAttribute(`http.response.header.${n}`,e)}),m>=400&&l.setStatus({code:j.ERROR,message:`HTTP ${m}`}),l.end();let _={method:a,path:o,status_code:String(m),model:h,streaming:String(g),endpoint_type:c};if(he.add(1,_),me.record(f,_),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:c};e.inputTokens&&(se.add(e.inputTokens,t),ce.record(e.inputTokens,t)),e.outputTokens&&(de.add(e.outputTokens,t),fe.record(e.outputTokens,t)),e.cachedTokens&&d.add(e.cachedTokens,{model:h})}p?.tokenUsage&&e.executeCompletion(i)}}const ct=async()=>T.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.await`,async e=>{let t=performance.now();try{let n=await O.prompt(`Accept incoming request?`,{type:`confirm`}),r=performance.now()-t;if(e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration_ms`,r),u.record(r),!n)throw e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`rejected`),l.add(1,{result:`rejected`}),new a(`Request rejected`,Response.json({message:`Request rejected`},{status:403}));e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`approved`),l.add(1,{result:`approved`})}finally{e.end()}}),lt={input:3e-6,output:15e-6};function W(e){let t=e.prompt_tokens||0,n=e.completion_tokens||0,r=e.total_tokens||t+n,i=t*lt.input+n*lt.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}}const ut=[{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`}],dt={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 ft(e){return e.startsWith(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/`)?e.slice(10):e}function pt(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 mt(e){for(let t of ut)if(t.pattern.test(e))return t.family;return null}function ht(e,t,n=null){let r=dt[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 gt(e,t){let n=ft(e),[r,i]=pt(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=mt(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 ht(a,t,i)}var G=class extends Error{statusCode;constructor(e,t=400){super(e),this.name=`ModelValidationError`,this.statusCode=t}};function K(e){if(!e||typeof e!=`string`)throw new G(`Model name is required and must be a string`);if(!C.models?.data)throw new G(`Models not available. Please try again later.`,503);let t=C.models.data.map(e=>e.id),n=gt(e,t);if(!n)throw ue.add(1,{requested_model:e}),E(`model_validation_error`,{requestedModel:e}),new G(`Invalid model: '${e}'. Available services: ${t.join(`, `)}`);return n}async function _t(e){if(e.rateLimitSeconds===void 0)return;let t=e.rateLimitSeconds;return T.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 o=Math.ceil(t-i);if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_seconds`,o),!e.rateLimitWait)throw n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`rejected`),x.add(1,{action:`rejected`,source:`local`}),O.warn(`Rate limit exceeded. Need to wait ${o} more seconds.`),E(`rate_limit_triggered`,{action:`rejected`},{waitTimeSeconds:o}),new a(`Rate limit exceeded`,Response.json({message:`Rate limit exceeded`},{status:429}));let s=o*1e3;n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`waited`),x.add(1,{action:`waited`,source:`local`}),pe.record(s,{source:`local`}),O.warn(`Rate limit reached. Waiting ${o} seconds before proceeding...`),E(`rate_limit_triggered`,{action:`waited`},{waitTimeSeconds:o}),await I(s),e.lastRequestTimestamp=r,O.info(`Rate limit wait completed, proceeding with request`)}finally{n.end()}})}function vt(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 q(e){if(typeof e==`string`)return vt(e);if(Array.isArray(e)){let t=e.map(e=>q(e));return t}if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=q(r);return t}return e}const yt=async e=>{if(!C.copilotToken)throw Error(`Service token not found`);let t=q(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(C,n),"X-Initiator":r?`agent`:`user`},o=`${m(C)}/chat/completions`,s=C.timeoutMs??12e4,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:o,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 a(`Failed to create chat completions`,f);if(t.stream)return d.end(),Fe(f);let p=await f.json();return p.id&&d.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.response.id`,p.id),d.end(),p}finally{clearTimeout(l)}};function bt(e){return T.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=K(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),le.add(1,{from_model:e.model,to_model:n}),O.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}async function xt(t){await _t(C);let n=await t.req.json();O.debug(`Request payload:`,JSON.stringify(n).slice(-400));try{n=bt(n)}catch(e){if(e instanceof G)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}),C.manualApprove&&await ct(),Re(n.max_tokens)){let e=C.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},O.debug(`Set max_tokens to:`,JSON.stringify(n.max_tokens))}let r=performance.now(),i=await yt(n),a=performance.now()-r;if(h.record(a,{model:n.model,target:`chat_completions`,streaming:String(!!n.stream)}),St(i)){let e=t.get(`requestData`)||{};return i.usage&&(e.tokenUsage=W(i.usage)),e.copilotDuration=a,t.set(`requestData`,e),O.debug(`Non-streaming response:`,JSON.stringify(i)),t.json(i)}return Pe(t,async r=>{let o=null,s=0,c=performance.now();for await(let e of i){let i=e;if(e.data&&e.data!==`[DONE]`){s++,_e.add(1,{model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`});try{let n=JSON.parse(e.data);if(n.usage){o=n.usage;let e=t.get(`requestData`)||{};e.tokenUsage=W(o),e.copilotDuration=a,t.set(`requestData`,e)}if(n.usage?.prompt_tokens_details?.cached_tokens!==void 0){let t={...n,usage:{...n.usage,prompt_tokens_details:void 0}};i={...e,data:JSON.stringify(t)}}}catch{}}await r.writeSSE(i)}let l=performance.now()-c,u={model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`};if(ve.record(l,u),f.record(s,u),o){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=W(o),e.copilotDuration=a,t.set(`requestData`,e))}let d=t.get(`requestId`);d&&e.executeCompletion(d)})}const St=e=>Object.hasOwn(e,`choices`),J=new N;J.post(`/`,async e=>{try{return await xt(e)}catch(t){return await b(e,t)}});const Ct=async e=>{if(!C.copilotToken)throw Error(`Service token not found`);let t=`${m(C)}/embeddings`,n=g(C),r=C.timeoutMs??12e4,i=new AbortController,o=setTimeout(()=>i.abort(),r);try{let{response:r,span:o}=await w({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 o.end(),new a(`Failed to create embeddings`,r);let s=await r.json();return o.end(),s}finally{clearTimeout(o)}},Y=new N;Y.post(`/`,async e=>{try{let t=await e.req.json();try{K(t.model)}catch(t){if(t instanceof G)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 Ct(t),i=performance.now()-n;h.record(i,{model:t.model,target:`embeddings`,streaming:`false`});let a=e.get(`requestData`)||{};return a.tokenUsage=W(r.usage),a.copilotDuration=i,e.set(`requestData`,a),e.json(r)}catch(t){return await b(e,t)}});function wt(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 Tt(e){return{model:Et(e.model),messages:Dt(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:Mt(e.tools),tool_choice:Nt(e.tool_choice)}}function Et(e){return e}function Dt(e,t){let n=kt(t),r=e.flatMap(e=>e.role===`user`?At(e):jt(e));return[...n,...r]}function Ot(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 kt(e){if(!e)return[];if(typeof e==`string`)return[{role:`system`,content:Ot(e)}];{let t=e.map(e=>e.text).join(`
|
|
12
12
|
|
|
13
|
-
`);return[{role:`system`,content:
|
|
13
|
+
`);return[{role:`system`,content:Ot(t)}]}}function At(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 jt(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(`
|
|
14
14
|
|
|
15
|
-
`);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:
|
|
15
|
+
`);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(`
|
|
16
16
|
|
|
17
|
-
`);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 et(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function tt(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 nt(e){let t=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let i of e.choices){let e=rt(i.message.content),a=it(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:K(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}function rt(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 it(e){return e?e.map(e=>({type:`tool_use`,id:e.id,name:e.function.name,input:JSON.parse(e.function.arguments)})):[]}function at(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function ot(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&&(at(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:K(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}function st(e,t){try{let e=B(t.model);return e===t.model?t:(_.debug(`Model mapping: '${t.model}' → '${e}'`),{...t,model:e})}catch(t){if(t instanceof z)return e.json({type:`error`,error:{type:`invalid_request_error`,message:t.message}},t.statusCode),null;throw t}}async function ct(t){await V(m);let n=await t.req.json();_.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`)??``;if(/context-1m/i.test(r)){let e=n.model;n={...n,model:`${n.model}-1m`},_.debug(`Detected context-1m beta flag, rewriting model: '${e}' → '${n.model}'`)}let i=st(t,n);if(!i)return;n=i;let a=Je(n);_.debug(`Translated \u004f\u0070\u0065\u006e\u0041\u0049 request payload:`,JSON.stringify(a)),t.set(`requestData`,{model:a.model});let o=performance.now();m.manualApprove&&await I();let s=await U(a),c=performance.now()-o;if(lt(s)){let e=t.get(`requestData`)||{};s.usage&&(e.tokenUsage=R(s.usage)),e.copilotDuration=c,t.set(`requestData`,e),_.debug(`Non-streaming response:`,JSON.stringify(s).slice(-400));let n=nt(s);return _.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 response:`,JSON.stringify(n)),t.json(n)}return _.debug(`Streaming response from service`),S(t,async n=>{let r=null,i={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}};for await(let e of s){if(_.debug(`Raw stream event:`,JSON.stringify(e)),e.data===`[DONE]`)break;if(!e.data)continue;let a=JSON.parse(e.data);if(a.usage){r=a.usage;let e=t.get(`requestData`)||{};e.tokenUsage=R(r),e.copilotDuration=c,t.set(`requestData`,e)}let o=ot(a,i);for(let e of o)_.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)})}if(r){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=R(r),e.copilotDuration=c,t.set(`requestData`,e))}let a=t.get(`requestId`);a&&e.executeCompletion(a)})}const lt=e=>Object.hasOwn(e,`choices`),Y=new x;Y.post(`/`,async e=>{try{return await ct(e)}catch(t){return await d(e,t)}});const X=new x;X.get(`/`,async e=>{try{m.models||await ge();let t=m.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 d(e,t)}});const Z=new x;Z.get(`/`,e=>{try{return e.json({token:m.copilotToken})}catch(t){return console.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const Q=new x;Q.get(`/`,async e=>{try{let t=await N();return e.json(t)}catch(t){return console.error(`Error fetching usage:`,t),e.json({error:`Failed to fetch usage`},500)}});const $=new x;$.use(Fe()),$.use(le()),$.get(`/`,e=>e.text(`Server running`)),$.route(`/chat/completions`,W),$.route(`/models`,X),$.route(`/embeddings`,G),$.route(`/usage`,Q),$.route(`/token`,Z),$.route(`/v1/chat/completions`,W),$.route(`/v1/models`,X),$.route(`/v1/embeddings`,G),$.route(`/v1/messages`,Y),$.post(`/v1/messages/count_tokens`,e=>e.json({input_tokens:1}));const ut=[],dt=Date.now();function ft(){let e=async(e,t=0)=>{_.info(`Gracefully shutting down...`),h(`server_shutdown`,{reason:e},{uptimeSeconds:(Date.now()-dt)/1e3});for(let e of ut)try{await e()}catch(e){_.error(`Error during cleanup:`,e)}await u(),_.info(`Shutdown complete`),b.exit(t)};b.on(`SIGINT`,()=>e(`SIGINT`)),b.on(`SIGTERM`,()=>e(`SIGTERM`)),b.on(`uncaughtException`,t=>{_.error(`Uncaught exception:`,t),e(`uncaughtException`,1)}),b.on(`unhandledRejection`,(t,n)=>{_.error(`Unhandled promise rejection at:`,n,`reason:`,t),e(`unhandledRejection`,1)})}async function pt(e,t){let n=b.env.APPLICATIONINSIGHTS_CONNECTION_STRING||`InstrumentationKey=8ffe3e28-3e27-4f6b-9454-011eaeeacd85;IngestionEndpoint=https://northeurope-2.in.applicationinsights.azure.com/;LiveEndpoint=https://northeurope.livediagnostics.monitor.azure.com/;ApplicationId=16380e14-d2f7-4eea-ba03-80995b2815bb`,r=await P(),i=F();try{await te({connectionString:n,version:r,runtime:i,accountType:e.accountType,machineId:m.machineId,userId:t})}catch(e){_.debug(`Failed to initialize \u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079:`,e);return}if(h(`server_started`,{version:r,platform:i.platform,arch:i.arch,accountType:e.accountType,claudeCode:String(e.claudeCode),verbose:String(e.verbose)},{port:e.port,modelsCount:m.models?.data.length??0,rateLimitSeconds:e.rateLimit??0,timeoutMs:e.timeout??12e4}),m.models?.data){let e=m.models.data.map(e=>({id:e.id,vendor:e.vendor,family:e.capabilities.family,contextWindow:e.capabilities.limits?.max_context_window_tokens??0,maxOutputTokens:e.capabilities.limits?.max_output_tokens??0,toolCalls:e.capabilities.supports.tool_calls??!1})),t=JSON.stringify(e);if(t.length<=8192)h(`models_available`,{models:t},{modelsCount:e.length});else for(let t of e)h(`models_available`,{modelId:t.id,vendor:t.vendor,family:t.family,toolCalls:String(t.toolCalls)},{contextWindow:t.contextWindow,maxOutputTokens:t.maxOutputTokens,modelsCount:e.length})}}async function mt(e,t){if(!e.claudeCode)return;se(m.models,`Models should be loaded by now`);let n,r;if(e.model&&e.smallModel){let t=m.models.data.map(e=>e.id);t.includes(e.model)||(_.error(`Invalid model: ${e.model}`),_.info(`Available services: \n${t.join(`
|
|
18
|
-
`)}`),
|
|
19
|
-
`)}`),
|
|
17
|
+
`);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 Mt(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Nt(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 Pt(e){let t=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let i of e.choices){let e=Ft(i.message.content),a=It(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:wt(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}function Ft(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 It(e){return e?e.map(e=>({type:`tool_use`,id:e.id,name:e.function.name,input:JSON.parse(e.function.arguments)})):[]}function Lt(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function Rt(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&&(Lt(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:wt(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}function zt(e,t){return T.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=K(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),le.add(1,{from_model:t.model,to_model:e}),O.debug(`Model mapping: '${t.model}' → '${e}'`),{...t,model:e})}catch(t){if(t instanceof G)return e.json({type:`error`,error:{type:`invalid_request_error`,message:t.message}},t.statusCode),null;throw t}finally{n.end()}})}async function Bt(t){await _t(C);let n=await t.req.json();O.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`},O.debug(`Detected context-1m beta flag, rewriting model: '${e}' → '${n.model}'`)}let a=zt(t,n);if(!a)return;n=a;let o=performance.now(),s=T.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),Tt(n)}finally{e.end()}});we.record(performance.now()-o,{direction:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`}),O.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();C.manualApprove&&await ct();let l=await yt(s),u=performance.now()-c;if(h.record(u,{model:s.model,target:`chat_completions`,streaming:String(!!s.stream)}),Vt(l)){let e=t.get(`requestData`)||{};l.usage&&(e.tokenUsage=W(l.usage)),e.copilotDuration=u,t.set(`requestData`,e),O.debug(`Non-streaming response:`,JSON.stringify(l).slice(-400));let n=performance.now(),r=T.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=Pt(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 we.record(performance.now()-n,{direction:`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),O.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 response:`,JSON.stringify(r)),t.json(r)}return O.debug(`Streaming response from service`),Pe(t,async n=>{let r=null,i=0,a=performance.now(),o={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}};for await(let e of l){if(O.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=W(r),e.copilotDuration=u,t.set(`requestData`,e)}let c=Rt(a,o);for(let e of c)O.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 c=performance.now()-a,d={model:s.model,endpoint_type:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`};if(ve.record(c,d),f.record(i,d),r){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=W(r),e.copilotDuration=u,t.set(`requestData`,e))}let p=t.get(`requestId`);p&&e.executeCompletion(p)})}const Vt=e=>Object.hasOwn(e,`choices`),Ht=new N;Ht.post(`/`,async e=>{try{return await Bt(e)}catch(t){return await b(e,t)}});const Z=new N;Z.get(`/`,async e=>{try{C.models||await ze();let t=C.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 b(e,t)}});const Ut=new N;Ut.get(`/`,e=>{try{return e.json({token:C.copilotToken})}catch(t){return console.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const Wt=new N;Wt.get(`/`,async e=>{try{let t=await Ye();return e.json(t)}catch(t){return console.error(`Error fetching usage:`,t),e.json({error:`Failed to fetch usage`},500)}});const Q=new N;Q.use(st()),Q.use(Ne()),Q.get(`/`,e=>e.text(`Server running`)),Q.route(`/chat/completions`,J),Q.route(`/models`,Z),Q.route(`/embeddings`,Y),Q.route(`/usage`,Wt),Q.route(`/token`,Ut),Q.route(`/v1/chat/completions`,J),Q.route(`/v1/models`,Z),Q.route(`/v1/embeddings`,Y),Q.route(`/v1/messages`,Ht),Q.post(`/v1/messages/count_tokens`,e=>e.json({input_tokens:1}));const Gt=[],$=Date.now();function Kt(){let e=async(e,t=0)=>{O.info(`Gracefully shutting down...`);let n=T.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.shutdown`,{kind:A.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}});E(`server_shutdown`,{reason:e},{uptimeSeconds:(Date.now()-$)/1e3});for(let e of Gt)try{await e()}catch(e){O.error(`Error during cleanup:`,e)}n.end(),await te(),O.info(`Shutdown complete`),M.exit(t)};M.on(`SIGINT`,()=>e(`SIGINT`)),M.on(`SIGTERM`,()=>e(`SIGTERM`)),M.on(`uncaughtException`,t=>{O.error(`Uncaught exception:`,t),e(`uncaughtException`,1)}),M.on(`unhandledRejection`,(t,n)=>{O.error(`Unhandled promise rejection at:`,n,`reason:`,t),e(`unhandledRejection`,1)})}async function qt(e,t){let n=M.env.APPLICATIONINSIGHTS_CONNECTION_STRING||`InstrumentationKey=8ffe3e28-3e27-4f6b-9454-011eaeeacd85;IngestionEndpoint=https://northeurope-2.in.applicationinsights.azure.com/;LiveEndpoint=https://northeurope.livediagnostics.monitor.azure.com/;ApplicationId=16380e14-d2f7-4eea-ba03-80995b2815bb`,r=await H(),i=U();try{await ae({connectionString:n,version:r,runtime:i,accountType:e.accountType,machineId:C.machineId,userId:t})}catch(e){O.debug(`Failed to initialize \u0074\u0065\u006c\u0065\u006d\u0065\u0074\u0072\u0079:`,e);return}if(E(`server_started`,{version:r,platform:i.platform,arch:i.arch,accountType:e.accountType,claudeCode:String(e.claudeCode),verbose:String(e.verbose)},{port:e.port,modelsCount:C.models?.data.length??0,rateLimitSeconds:e.rateLimit??0,timeoutMs:e.timeout??12e4}),C.models?.data){let e=C.models.data.map(e=>({id:e.id,vendor:e.vendor,family:e.capabilities.family,contextWindow:e.capabilities.limits?.max_context_window_tokens??0,maxOutputTokens:e.capabilities.limits?.max_output_tokens??0,toolCalls:e.capabilities.supports.tool_calls??!1})),t=JSON.stringify(e);if(t.length<=8192)E(`models_available`,{models:t},{modelsCount:e.length});else for(let t of e)E(`models_available`,{modelId:t.id,vendor:t.vendor,family:t.family,toolCalls:String(t.toolCalls)},{contextWindow:t.contextWindow,maxOutputTokens:t.maxOutputTokens,modelsCount:e.length})}}async function Jt(e,t){if(!e.claudeCode)return;je(C.models,`Models should be loaded by now`);let n,r;if(e.model&&e.smallModel){let t=C.models.data.map(e=>e.id);t.includes(e.model)||(O.error(`Invalid model: ${e.model}`),O.info(`Available services: \n${t.join(`
|
|
18
|
+
`)}`),M.exit(1)),t.includes(e.smallModel)||(O.error(`Invalid small model: ${e.smallModel}`),O.info(`Available services: \n${t.join(`
|
|
19
|
+
`)}`),M.exit(1)),n=e.model,r=e.smallModel,O.info(`Using service: ${n}`),O.info(`Using small model: ${r}`)}else e.model||e.smallModel?(O.error(`Both --model and --small-model must be specified for model selection`),M.exit(1)):(n=await O.prompt(`Select a model to use`,{type:`select`,options:C.models.data.map(e=>e.id)}),r=await O.prompt(`Select a small model to use`,{type:`select`,options:C.models.data.map(e=>e.id)}));let i=it({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:`dummy`,ANTHROPIC_MODEL:n,ANTHROPIC_SMALL_FAST_MODEL:r},`\u0063\u006c\u0061\u0075\u0064\u0065`);try{ke.writeSync(i),O.success(`Copied command to clipboard!`)}catch{O.warn(`Failed to copy to clipboard. Here is the command:`),O.log(i)}}function Yt(e){let{options:t,version:n,runtime:r,githubUser:i}=e,a=T.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.startup`,{kind:A.INTERNAL,attributes:y({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??12e4,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:C.machineId,sessionId:C.sessionId,vsCodeVersion:C.vsCodeVersion},connectivity:C.connectivity,modelsCount:C.models?.data.length??0,startupDurationMs:Date.now()-$},`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api`)});if(C.models?.data)for(let e of C.models.data)a.addEvent(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.available`,y(e,`model`));a.end(),_(c.INFO,`INFO`,`Server started`,y({version:n,port:t.port,accountType:t.accountType,githubUser:i.login,modelsCount:C.models?.data.length??0,startupDurationMs:Date.now()-$},`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api`))}async function Xt(e){Kt(),Gt.push(()=>{O.debug(`Cleaning up connectivity monitor`),p.stop()},()=>{O.debug(`Cleaning up token management`),He()},async()=>{O.debug(`Shutting down OTel SDK`),await ge()}),e.verbose&&(O.level=5,O.info(`Verbose logging enabled`)),C.accountType=e.accountType,e.accountType!==`individual`&&O.info(`Using ${e.accountType} plan account`),C.manualApprove=e.manual,C.rateLimitSeconds=e.rateLimit,C.rateLimitWait=e.rateLimitWait,C.showToken=e.showToken,C.timeoutMs=e.timeout,C.connectivity.enabled=!e.disableConnectivityMonitoring,await v(),Be();let t=await H(),n=U();ie(t,$),e.githubToken?(C.githubToken=e.githubToken,O.info(`Using provided Auth token`)):await V();let r;try{let{_s4:e}=await import(`./get-user-CjgOKI7b.js`);r=await e(),await oe(C,r.login)}catch(e){O.error(`Failed to get user info for machine ID generation:`,e),O.error(`Cannot proceed without user information`),M.exit(1)}await Ge(),await ze(),await qt(e,r.login),Yt({options:e,version:t,runtime:n,githubUser:r}),O.info(`Available services:`);for(let e of C.models?.data??[]){let t=e.capabilities.limits?.max_context_window_tokens,n=t?` (${t.toLocaleString()} tokens)`:``;O.info(`- ${e.id}${n}`)}let i=`http://localhost:${e.port}`;await Jt(e,i),O.box(`🌐 Usage Viewer: https://ericc-ch.\u0067\u0069\u0074\u0068\u0075\u0062.io/\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api?endpoint=${i}/usage`),Ae({fetch:Q.fetch,port:e.port})}const Zt=D({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: 120000)`},"disable-connectivity-monitoring":{type:`boolean`,default:!1,description:`Disable automatic network monitoring for token refresh`}},run({args:e}){let t=e[`rate-limit`],n=t===void 0?void 0:Number.parseInt(t,10),r=e.timeout,i=r===void 0?12e4:Number.parseInt(r,10);return Xt({port:Number.parseInt(e.port,10),verbose:e.verbose,accountType:e[`account-type`],manual:e.manual,rateLimit:n,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:i,disableConnectivityMonitoring:e[`disable-connectivity-monitoring`]})}}),Qt=D({meta:{name:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,description:`API proxy server for tool integration.`},subCommands:{auth:Je,start:Zt,"check-usage":Xe,debug:nt}});await Te(Qt);export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "copilot-api-node20",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Turn GitHub Copilot into OpenAI/Anthropic API compatible server. Usable with Claude Code! (Node v20+ fork)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"proxy",
|
|
@@ -49,19 +49,31 @@
|
|
|
49
49
|
"@typescript-eslint/parser": "^8.56.0",
|
|
50
50
|
"@typescript-eslint/typescript-estree": "^8.56.0",
|
|
51
51
|
"@typescript-eslint/utils": "^8.56.0",
|
|
52
|
+
"flatted": "^3.4.0",
|
|
52
53
|
"minimatch": "^10.2.4",
|
|
53
54
|
"typescript-eslint": "^8.56.0"
|
|
54
55
|
},
|
|
55
56
|
"dependencies": {
|
|
57
|
+
"@opentelemetry/api": "^1.9.0",
|
|
58
|
+
"@opentelemetry/api-logs": "^0.213.0",
|
|
59
|
+
"@opentelemetry/exporter-logs-otlp-http": "^0.213.0",
|
|
60
|
+
"@opentelemetry/exporter-metrics-otlp-http": "^0.213.0",
|
|
61
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.213.0",
|
|
62
|
+
"@opentelemetry/resources": "^2.6.0",
|
|
63
|
+
"@opentelemetry/sdk-logs": "^0.213.0",
|
|
64
|
+
"@opentelemetry/sdk-metrics": "^2.6.0",
|
|
65
|
+
"@opentelemetry/sdk-node": "^0.213.0",
|
|
66
|
+
"@opentelemetry/sdk-trace-base": "^2.6.0",
|
|
67
|
+
"@opentelemetry/semantic-conventions": "^1.40.0",
|
|
56
68
|
"applicationinsights": "^3.14.0",
|
|
57
69
|
"citty": "^0.1.6",
|
|
58
70
|
"clipboardy": "^4.0.0",
|
|
59
71
|
"consola": "^3.4.2",
|
|
60
72
|
"fetch-event-stream": "^0.1.5",
|
|
61
|
-
"hono": "^4.12.
|
|
73
|
+
"hono": "^4.12.7",
|
|
62
74
|
"srvx": "^0.6.0",
|
|
63
75
|
"tiny-invariant": "^1.3.3",
|
|
64
|
-
"undici": "^7.
|
|
76
|
+
"undici": "^7.24.0"
|
|
65
77
|
},
|
|
66
78
|
"devDependencies": {
|
|
67
79
|
"@echristian/eslint-config": "^0.0.54",
|
|
@@ -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 i from"node:process";import{createHash as a,randomBytes as o,randomUUID as s}from"node:crypto";const c=r.join(n.homedir(),`.local`,`share`,`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),l=r.join(c,`\u0067\u0069\u0074\u0068\u0075\u0062_token`),u=r.join(c,`machine_id`),d=r.join(c,`session_id`),f={APP_DIR:c,GITHUB_TOKEN_PATH:l,MACHINE_ID_PATH:u,SESSION_ID_PATH:d};async function p(){await t.mkdir(f.APP_DIR,{recursive:!0}),await m(f.GITHUB_TOKEN_PATH),await m(f.SESSION_ID_PATH)}async function m(e){try{await t.access(e,t.constants.W_OK)}catch{await t.writeFile(e,``),await t.chmod(e,384)}}const h={accountType:`individual`,manualApprove:!1,rateLimitWait:!1,showToken:!1,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}};let g;const _={byModel:new Map};let v;function y(){if(_.byModel.size!==0){for(let[e,t]of _.byModel)S(`usage_stats`,{model:e},{requests:t.requests,inputTokens:t.inputTokens,outputTokens:t.outputTokens});_.byModel.clear()}}function b(e,t,n){if(!g)return;let r=_.byModel.get(e);r?(r.requests++,r.inputTokens+=t,r.outputTokens+=n):_.byModel.set(e,{requests:1,inputTokens:t,outputTokens:n})}async function x(e){i.env.OTEL_SERVICE_NAME=`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,i.env.OTEL_RESOURCE_ATTRIBUTES=[`service.version=${e.version}`,`service.instance.id=${e.machineId??n.hostname()}`].join(`,`);let t=await import(`applicationinsights`);t.default.setup(e.connectionString).setAutoCollectRequests(!1).setAutoCollectPerformance(!1,!1).setAutoCollectExceptions(!1).setAutoCollectDependencies(!1).setAutoCollectConsole(!1),g=t.default.defaultClient,g.commonProperties={accountType:e.accountType,runtime:e.runtime.name,runtimeVersion:e.runtime.version,userId:e.userId,os:`${e.runtime.platform} ${e.runtime.arch}`},t.default.start(),v&&clearInterval(v),v=setInterval(y,3e5),v.unref()}function S(e,t,n){g?.trackEvent({name:e,properties:t,measurements:n})}function C(e,t,n){g?.trackException({exception:e,properties:t,measurements:n})}async function w(){g&&(v&&clearInterval(v),y(),await g.flush())}const T=()=>({"content-type":`application/json`,accept:`application/json`}),E=`0.39.2026030604`,D=`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-chat/${E}`,O=`\u0047\u0069\u0074\u0048\u0075\u0062\u0043\u006f\u0070\u0069\u006c\u006f\u0074Chat/${E}`,k=e=>{let t=a(`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(o(16)),t.digest(`hex`)},A=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`${f.MACHINE_ID_PATH}_${t}`},j=async e=>{let n=A(e);try{let e=await t.readFile(n,`utf8`);if(e.trim())return e.trim()}catch{}let r=k(e);return await t.writeFile(n,r),await t.chmod(n,384),r},M=async()=>{try{let e=await t.readFile(f.SESSION_ID_PATH,`utf8`);if(e.trim())return e.trim()}catch{}let e=s();return await t.writeFile(f.SESSION_ID_PATH,e),await t.chmod(f.SESSION_ID_PATH,384),e},N=async(e,t)=>{e.machineId||=await j(t),e.sessionId||=await M()},P=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`,F=(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=s(),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":D,"User-Agent":O,"\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":s(),"X-Request-Id":n};return t&&(r[`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-vision-request`]=`true`),r},I=`https://api.\u0067\u0069\u0074\u0068\u0075\u0062.com`,L=e=>({...T(),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":D,"user-agent":O,"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`}),R=`https://\u0067\u0069\u0074\u0068\u0075\u0062.com`,z=`\u0030\u0031\u0061\u0062\u0038\u0061\u0063\u0039\u0034\u0030\u0030\u0063\u0034\u0065\u0034\u0032\u0039\u0062\u0032\u0033`,B=[`user:email`].join(` `),V=e=>e>=1e5||e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString(),H=(e,t)=>e.padEnd(t),U=(e,t)=>{if(!h.models)return``;let n=h.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}%)`},W=e=>{let t=[];if(e.model){let n=H(e.model,18);t.push(n)}if(e.tokenUsage){let n=e.tokenUsage,r=(n.inputTokens||0)+(n.outputTokens||0),i=e.model?U(r,e.model):``,a=V(n.inputTokens||0).padStart(5),o=V(n.outputTokens||0).padStart(5),s=`↑${a} │ ↓${o}`,c=H(s,18),l=V(r),u=i?`${l}${i.padStart(15-l.length)}`:l.padEnd(15);t.push(`Tokens: ${c} | Context: ${u}`)}else if(e.model){let e=H(`N/A`,18),n=`N/A`.padEnd(15);t.push(`Tokens: ${e} | Context: ${n}`)}if(e.copilotDuration){let n=H(`${Math.round(e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);t.push(`API: ${n}`)}return t.length>0?` | ${t.join(` | `)}`:``},G={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=H(n.req.method,4),c=H(n.req.path,21),l=H(n.res.status.toString(),3),u=H(`${a}ms`,8),d=` --> ${s}${c}${l} ${u}`;o&&(d+=W(o)),e.info(d),o?.model&&o.tokenUsage&&b(o.model,o.tokenUsage.inputTokens??0,o.tokenUsage.outputTokens??0)},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=H(r.req.method,4),d=H(r.req.path,21),f=H(`429`,3),p=H(`${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=H(`${Math.round(h.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);m+=` | API: ${e}`}e.info(m),S(`rate_limit_upstream`,{model:h?.model??`unknown`,path:r.req.path,rateLimitType:c,retryAfter:l},{durationMs:o})},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(()=>G.cleanup(),60*1e3);var K=class extends Error{response;constructor(e,t){super(e),this.response=t}};async function q(t,n){if(n instanceof K&&n.response.status===429){let e=t.get(`requestId`),r=G.completionCallbacks.get(e);r&&(G.logRateLimit(r,n.response),G.completionCallbacks.delete(e));let i=await n.response.text(),a;try{a=JSON.parse(i)}catch{a={error:{message:i,type:`error`}}}return t.json(a,429)}if(e.error(`Error occurred:`,n),n instanceof K){let r=await n.response.text(),i;try{i=JSON.parse(r)}catch{i=r}return e.error(`HTTP error:`,i),C(n,{statusCode:String(n.response.status),path:t.req.path,errorType:`HTTPError`}),t.json({error:{message:r,type:`error`}},n.response.status)}let r=n instanceof Error?n:Error(String(n));return C(r,{path:t.req.path,errorType:r.name}),t.json({error:{message:r.message,type:`error`}},500)}async function J(){let e=new AbortController,t=h.timeoutMs??12e4,n=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${I}/user`,{headers:{authorization:`token ${h.\u0067\u0069\u0074\u0068\u0075\u0062Token}`,...T()},signal:e.signal});if(!t.ok)throw new K(`Failed to get \u0047\u0069\u0074\u0048\u0075\u0062 user`,t);return await t.json()}finally{clearTimeout(n)}}export{G as _c1,I as _g1,B as _g4,R as _g2,z as _g3,K as HTTPError,f as PATHS,P as _s1,F as _s2,p as ensurePaths,w as _t1,q as _c2,J as _s4,L as _s3,x as _t2,N as _s5,T as _c3,h as state,S as _t3,C as _t4};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_s4 as e}from"./get-user-CSS558OK.js";export{e as _s4};
|