copilot-api-node20 0.12.1 → 0.14.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{_s4 as e}from"./get-user-DX7ymfsj.js";export{e as _s4};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e from"consola";import t from"node:fs/promises";import n from"node:os";import r from"node:path";import{SpanKind as i,SpanStatusCode as a,metrics as o,trace as s}from"@opentelemetry/api";import{SeverityNumber as c,logs as l}from"@opentelemetry/api-logs";import{OTLPLogExporter as u}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as d}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as f}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as p}from"@opentelemetry/resources";import{BatchLogRecordProcessor as m}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as h}from"@opentelemetry/sdk-metrics";import{NodeSDK as ee}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_NAME as te,ATTR_SERVICE_VERSION as ne}from"@opentelemetry/semantic-conventions";import{request as re}from"undici";import{createHash as ie,randomBytes as g,randomUUID as _}from"node:crypto";const v=r.join(n.homedir(),`.local`,`share`,`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),ae=r.join(v,`\u0067\u0069\u0074\u0068\u0075\u0062_token`),oe=r.join(v,`machine_id`),se=r.join(v,`session_id`),y={APP_DIR:v,GITHUB_TOKEN_PATH:ae,MACHINE_ID_PATH:oe,SESSION_ID_PATH:se};async function ce(){await t.mkdir(y.APP_DIR,{recursive:!0}),await b(y.GITHUB_TOKEN_PATH),await b(y.SESSION_ID_PATH)}async function b(e){try{await t.access(e,t.constants.W_OK)}catch{await t.writeFile(e,``),await t.chmod(e,384)}}const x=6e5,S={accountType:`individual`,manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:x,connectivity:{enabled:!0,probeEndpoints:[`https://api.\u0067\u0069\u0074\u0068\u0075\u0062.com`,`https://www.google.com`,`https://1.1.1.1`],fastProbeInterval:5e3,slowProbeInterval:6e4,timeoutMs:5e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0}},C=e=>e>=1e5||e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString(),w=(e,t)=>e.padEnd(t),le=(e,t)=>{if(!S.models)return``;let n=S.models.data.find(e=>e.id===t);if(!n)return``;let r=n.capabilities.limits?.max_context_window_tokens;if(!r)return``;let i=(e/r*100).toFixed(1);return` (${i}%)`},ue=e=>{let t=[];if(e.model){let n=w(e.model,18);t.push(n)}if(e.tokenUsage){let n=e.tokenUsage,r=(n.inputTokens||0)+(n.outputTokens||0),i=e.model?le(r,e.model):``,a=C(n.inputTokens||0).padStart(5),o=C(n.outputTokens||0).padStart(5),s=`↑${a} │ ↓${o}`,c=w(s,18),l=C(r),u=i?`${l}${i.padStart(15-l.length)}`:l.padEnd(15);t.push(`Tokens: ${c} | Context: ${u}`)}else if(e.model){let e=w(`N/A`,18),n=`N/A`.padEnd(15);t.push(`Tokens: ${e} | Context: ${n}`)}if(e.copilotDuration){let n=w(`${Math.round(e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);t.push(`API: ${n}`)}return t.length>0?` | ${t.join(` | `)}`:``},T={completionCallbacks:new Map,registerCompletion(e,t,n){this.completionCallbacks.set(e,{context:t,startTime:n,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(t){let{context:n,startTime:r}=t,i=Date.now(),a=i-r,o=n.get(`requestData`),s=w(n.req.method,4),l=w(n.req.path,21),u=w(n.res.status.toString(),3),d=w(`${a}ms`,8),f=` --> ${s}${l}${u} ${d}`;o&&(f+=ue(o)),e.info(f),V(c.INFO,`INFO`,`Request completed`,{"http.method":n.req.method,"http.path":n.req.path,"http.status_code":n.res.status,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.duration_ms":a,...o?.model&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":o.model},...o?.copilotDuration&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_duration_ms":Math.round(o.copilotDuration)},...o?.tokenUsage?.inputTokens&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens":o.tokenUsage.inputTokens},...o?.tokenUsage?.outputTokens&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens":o.tokenUsage.outputTokens}})},logRateLimit(t,n){let{context:r,startTime:i}=t,a=Date.now(),o=a-i,s=n.headers.get(`x-ratelimit-exceeded`)||``,c=s.split(`:`)[1]||`unknown`,l=n.headers.get(`retry-after`)||n.headers.get(`x-ratelimit-user-retry-after`)||`?`,u=w(r.req.method,4),d=w(r.req.path,21),f=w(`429`,3),p=w(`${o}ms`,8),m=`⚠ --> ${u}${d}${f} ${p}`;m+=` | Rate limited (${l}s retry) | ${c}`;let h=r.get(`requestData`);if(h?.copilotDuration){let e=w(`${Math.round(h.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);m+=` | API: ${e}`}e.info(m)},cleanup(){let e=1e3,t=Date.now()-300*1e3;for(let[e,n]of this.completionCallbacks)n.startTime<t&&this.completionCallbacks.delete(e);if(this.completionCallbacks.size>e){let t=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),n=t.slice(0,t.length-e);for(let[e]of n)this.completionCallbacks.delete(e)}}};setInterval(()=>T.cleanup(),60*1e3);let E,D=Date.now();const O=`https://api.honeycomb.io`,k={"x-honeycomb-team":`hcaik_01km2y7yf1rrn70xvxce5kx9dyz936dwm21b9bgvnwf3pxq0cmqkcwha8n`};function de(e,t){t&&(D=t);let n=p({[te]:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,[ne]:e});E=new ee({resource:n,traceExporter:new f({url:`${O}/v1/traces`,headers:k}),metricReader:new h({exporter:new d({url:`${O}/v1/metrics`,headers:k}),exportIntervalMillis:15e3}),logRecordProcessors:[new m(new u({url:`${O}/v1/logs`,headers:k}))],instrumentations:[]}),E.start()}async function fe(){E&&await E.shutdown()}const A=s.getTracer(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),j=o.getMeter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),pe=l.getLogger(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),me=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.requests.total`,{unit:`{request}`,description:`Total requests received`}),he=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.requests.errors`,{unit:`{error}`,description:`Total error responses`}),ge=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.input`,{unit:`{token}`,description:`Total input tokens consumed`}),M=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.output`,{unit:`{token}`,description:`Total output tokens generated`}),N=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.cached`,{unit:`{token}`,description:`Total cached prompt tokens`}),P=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.triggers`,{unit:`{trigger}`,description:`Rate limit trigger count`}),F=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model_validation.errors`,{unit:`{error}`,description:`Model validation failures`}),I=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model_mapping.mappings`,{unit:`{mapping}`,description:`Model name normalizations`}),L=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempts`,{unit:`{attempt}`,description:`Token refresh attempts`}),_e=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.failures`,{unit:`{failure}`,description:`Token refresh final failures`}),ve=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.checks`,{unit:`{check}`,description:`Connectivity probe results`}),R=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.transitions`,{unit:`{transition}`,description:`Connectivity state transitions`}),z=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.upstream.requests`,{unit:`{request}`,description:`Upstream API calls`}),ye=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.chunks`,{unit:`{chunk}`,description:`Total SSE chunks sent`}),be=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.decisions`,{unit:`{decision}`,description:`Manual approval decisions`}),xe=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request.duration`,{unit:`ms`,description:`Total request duration`}),Se=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074.duration`,{unit:`ms`,description:`Upstream \u0043\u006f\u0070\u0069\u006c\u006f\u0074 API call duration`}),Ce=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.duration`,{unit:`ms`,description:`Duration of SSE streaming phase`}),we=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_duration`,{unit:`ms`,description:`Duration of rate limit waits`}),Te=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.duration`,{unit:`ms`,description:`Translation layer processing time`}),Ee=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.duration`,{unit:`ms`,description:`Token refresh duration`}),B=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.probe_duration`,{unit:`ms`,description:`Individual connectivity probe duration`}),De=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.per_request.input`,{unit:`{token}`,description:`Input tokens per request distribution`}),Oe=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.per_request.output`,{unit:`{token}`,description:`Output tokens per request distribution`}),ke=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.chunks_per_request`,{unit:`{chunk}`,description:`Chunks per streaming request`}),Ae=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration`,{unit:`ms`,description:`Time waiting for manual approval`});j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.status`,{unit:`{status}`,description:`1 = online, 0 = offline`}).addCallback(e=>{e.observe(K.getConnectivityStats().isOnline?1:0)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures`,{unit:`{failure}`,description:`Current consecutive connectivity failure count`}).addCallback(e=>{e.observe(K.getConnectivityStats().consecutiveFailures)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.models.available`,{unit:`{model}`,description:`Number of available models`}).addCallback(e=>{e.observe(S.models?.data.length??0)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.completion_logger.pending`,{unit:`{callback}`,description:`Number of pending completion callbacks`}).addCallback(e=>{e.observe(T.completionCallbacks.size)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.uptime`,{unit:`s`,description:`Server uptime in seconds`}).addCallback(e=>{e.observe((Date.now()-D)/1e3)});function V(e,t,n,r){let i=s.getActiveSpan(),a=i?.spanContext();pe.emit({severityNumber:e,severityText:t,body:n,attributes:{...r,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function H(e,t=``){let n={};if(e==null)return n;if(typeof e!=`object`)return(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)&&t&&(n[t]=e),n;if(Array.isArray(e))return t&&(n[t]=JSON.stringify(e)),n;for(let[r,i]of Object.entries(e)){let e=t?`${t}.${r}`:r;if(i===void 0||typeof i==`function`)continue;i===null?n[e]=`null`:typeof i==`object`&&!Array.isArray(i)?Object.assign(n,H(i,e)):Array.isArray(i)?n[e]=JSON.stringify(i):(typeof i==`string`||typeof i==`number`||typeof i==`boolean`)&&(n[e]=i)}return n}const U=new Set([`authorization`,`cookie`,`set-cookie`,`x-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 je(e,t){t.headers.forEach((t,n)=>{let r=n.toLowerCase();U.has(r)||e.setAttribute(`http.response.header.${r}`,t)})}async function G(e){let{spanName:t,url:n,target:r,method:o=`GET`,headers:s,body:c,signal:l,extraAttributes:u}=e,d=A.startSpan(t,{kind:i.CLIENT,attributes:{"http.method":o,"url.full":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.target":r,...u}});s&&W(d,`request`,s);try{let e=await fetch(n,{method:o,headers:s,body:c,signal:l});return d.setAttribute(`http.response.status_code`,e.status),je(d,e),z.add(1,{target:r,status_code:String(e.status)}),e.ok||d.setStatus({code:a.ERROR,message:`HTTP ${e.status}`}),{response:e,span:d}}catch(e){let t=e instanceof Error?e:Error(String(e));throw d.setStatus({code:a.ERROR,message:t.message}),d.recordException(t),d.end(),e}}async function Me(e){let{spanName:t,url:n,target:r,method:o=`POST`,headers:s,body:c,signal:l,headersTimeout:u,bodyTimeout:d,extraAttributes:f}=e,p=A.startSpan(t,{kind:i.CLIENT,attributes:{"http.method":o,"url.full":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.target":r,...f}});W(p,`request`,s);try{let{statusCode:e,headers:t,body:i}=await re(n,{method:o,headers:s,body:c,signal:l,headersTimeout:u,bodyTimeout:d});p.setAttribute(`http.response.status_code`,e);for(let[e,n]of Object.entries(t)){let t=e.toLowerCase();n!==void 0&&!U.has(t)&&p.setAttribute(`http.response.header.${t}`,Array.isArray(n)?n.join(`, `):n)}return z.add(1,{target:r,status_code:String(e)}),e>=400&&p.setStatus({code:a.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:i,span:p}}catch(e){let t=e instanceof Error?e:Error(String(e));throw p.setStatus({code:a.ERROR,message:t.message}),p.recordException(t),p.end(),e}}var Ne=class extends EventTarget{isOnline=!0;lastChecked=new Date().toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){if(!S.connectivity.enabled){e.debug(`Connectivity monitoring disabled`);return}e.info(`Starting connectivity monitor`,{probeEndpoints:S.connectivity.probeEndpoints,fastInterval:S.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){e.debug(`Stopping connectivity monitor`),this.checkInterval&&=(clearTimeout(this.checkInterval),void 0),this.abortController&&=(this.abortController.abort(),void 0)}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let t=this.isOnline?S.connectivity.slowProbeInterval:S.connectivity.fastProbeInterval,n=Math.random()*S.connectivity.jitterMaxMs,r=t+n;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(t=>{e.error(`Connectivity check failed:`,t)})},r)}async performConnectivityCheck(){let t=A.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.probe`);this.abortController=new AbortController;let n=setTimeout(()=>this.abortController?.abort(),S.connectivity.timeoutMs);try{let n=!1;for(let t of S.connectivity.probeEndpoints)try{let e=performance.now(),r=await fetch(t,{method:`HEAD`,signal:this.abortController.signal,headers:{"User-Agent":`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api-connectivity-monitor/1.0`,...S.connectivity.dnsCache&&{"Cache-Control":`max-age=300`}}}),i=performance.now()-e;if(r.ok){n=!0,this.lastSuccessfulEndpoint=t,B.record(i,{endpoint:t,result:`success`});break}B.record(i,{endpoint:t,result:`failed`})}catch(n){this.endpointFailureStats[t]=(this.endpointFailureStats[t]||0)+1,e.debug(`Probe failed for ${t}:`,n)}this.updateConnectivityState(n),t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.result`,n?`online`:`offline`),t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures`,this.consecutiveFailures),this.lastSuccessfulEndpoint&&t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.successful_endpoint`,this.lastSuccessfulEndpoint),ve.add(1,{result:n?`online`:`offline`})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(n),t.end(),this.scheduleNextCheck()}}updateConnectivityState(t){let n=this.isOnline;if(this.isOnline=t,this.lastChecked=new Date().toISOString(),t){let t=this.consecutiveFailures;this.consecutiveFailures>0&&e.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,n||(this.dispatchEvent(new CustomEvent(`online`)),R.add(1,{from:`offline`,to:`online`}),V(c.INFO,`INFO`,`Connectivity restored`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures_before_recovery":t}))}else this.consecutiveFailures++,n&&(e.warn(`Connectivity lost`),this.dispatchEvent(new CustomEvent(`offline`)),R.add(1,{from:`online`,to:`offline`}),V(c.WARN,`WARN`,`Connectivity lost`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(t){this.lastErrorType=t.name,this.lastErrorMessage=t.message,e.error(`Connectivity check failed:`,t),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?S.connectivity.slowProbeInterval:S.connectivity.fastProbeInterval,t=new Date(Date.now()+e+Math.random()*S.connectivity.jitterMaxMs).toISOString();return{currentInterval:e,nextCheckEstimate:t,lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:S.connectivity.jitterMaxMs>0,connectionPooling:S.connectivity.connectionPooling,dnsCache:S.connectivity.dnsCache}}};const K=new Ne,q=()=>({"content-type":`application/json`,accept:`application/json`}),J=`0.39.2026030604`,Y=`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-chat/${J}`,X=`\u0047\u0069\u0074\u0048\u0075\u0062\u0043\u006f\u0070\u0069\u006c\u006f\u0074Chat/${J}`,Pe=e=>{let t=ie(`sha256`);return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||`anonymous`),t.update(n.hostname()),t.update(e),t.update(Date.now().toString()),t.update(g(16)),t.digest(`hex`)},Fe=e=>{let t=e.replaceAll(/[^\w.-]/g,`_`).trim();if(t.length===0||t===`.`||t===`..`||/^[_.]+$/.test(t))throw Error(`Invalid \u0047\u0069\u0074\u0048\u0075\u0062 username: cannot be empty or consist only of special characters after sanitization`);return`${y.MACHINE_ID_PATH}_${t}`},Ie=async e=>{let n=Fe(e);try{let e=await t.readFile(n,`utf8`);if(e.trim())return e.trim()}catch{}let r=Pe(e);return await t.writeFile(n,r),await t.chmod(n,384),r},Le=async()=>{try{let e=await t.readFile(y.SESSION_ID_PATH,`utf8`);if(e.trim())return e.trim()}catch{}let e=_();return await t.writeFile(y.SESSION_ID_PATH,e),await t.chmod(y.SESSION_ID_PATH,384),e},Re=async(e,t)=>{e.machineId||=await Ie(t),e.sessionId||=await Le()},ze=e=>e.accountType===`individual`?`https://api.\u0067\u0069\u0074\u0068\u0075\u0062\u0063\u006f\u0070\u0069\u006c\u006f\u0074.com`:`https://api.${e.accountType}.\u0067\u0069\u0074\u0068\u0075\u0062\u0063\u006f\u0070\u0069\u006c\u006f\u0074.com`,Z=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error(`\u0056\u0053\u0043\u006f\u0064\u0065 identifiers not initialized. Call initialize\u0056\u0053\u0043\u006f\u0064\u0065Identifiers() during startup.`);let n=_(),r={Authorization:`Bearer ${e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Token}`,"Content-Type":`application/json`,accept:`*/*`,"accept-encoding":`br, gzip, deflate`,"accept-language":`*`,"sec-fetch-mode":`cors`,"\u0043\u006f\u0070\u0069\u006c\u006f\u0074-Integration-Id":`\u0076\u0073\u0063\u006f\u0064\u0065-chat`,"Editor-Version":`\u0076\u0073\u0063\u006f\u0064\u0065/${e.\u0076\u0073\u0043\u006f\u0064\u0065Version}`,"Editor-Plugin-Version":Y,"User-Agent":X,"\u0056\u0053\u0063\u006f\u0064\u0065-MachineId":e.machineId,"\u0056\u0053\u0063\u006f\u0064\u0065-SessionId":e.sessionId,"\u004f\u0070\u0065\u006e\u0041\u0049-Intent":`conversation-agent`,"X-Interaction-Type":`conversation-agent`,"X-Agent-Task-Id":n,"X-\u0056\u0053\u0043\u006f\u0064\u0065-User-Agent-Library-Version":`node-fetch`,"X-\u0047\u0069\u0074\u0048\u0075\u0062-Api-Version":`2025-05-01`,"X-Interaction-Id":_(),"X-Request-Id":n};return t&&(r[`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-vision-request`]=`true`),r},Q=`https://api.\u0067\u0069\u0074\u0068\u0075\u0062.com`,Be=e=>({...q(),authorization:`token ${e.\u0067\u0069\u0074\u0068\u0075\u0062Token}`,"editor-version":`\u0076\u0073\u0063\u006f\u0064\u0065/${e.\u0076\u0073\u0043\u006f\u0064\u0065Version}`,"editor-plugin-version":Y,"user-agent":X,"x-\u0067\u0069\u0074\u0068\u0075\u0062-api-version":`2025-04-01`,"x-\u0076\u0073\u0063\u006f\u0064\u0065-user-agent-library-version":`node-fetch`}),Ve=`https://\u0067\u0069\u0074\u0068\u0075\u0062.com`,He=`\u0030\u0031\u0061\u0062\u0038\u0061\u0063\u0039\u0034\u0030\u0030\u0063\u0034\u0065\u0034\u0032\u0039\u0062\u0032\u0033`,Ue=[`user:email`].join(` `);var $=class extends Error{response;constructor(e,t){super(e),this.response=t}};async function We(t,n){let r=s.getActiveSpan();if(n instanceof $&&n.response.status===429){let e=t.get(`requestId`),i=T.completionCallbacks.get(e);i&&(T.logRateLimit(i,n.response),T.completionCallbacks.delete(e)),P.add(1,{action:`rejected`,source:`upstream`});let o=await n.response.text(),s;try{s=JSON.parse(o)}catch{s={error:{message:o,type:`error`}}}return r?.setStatus({code:a.ERROR,message:`Rate limited by upstream`}),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,`rate_limit_upstream`),V(c.WARN,`WARN`,`Upstream rate limit hit`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":429,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":`rate_limit_upstream`}),t.json(s,429)}if(e.error(`Error occurred:`,n),n instanceof $){let i=await n.response.text(),o;try{o=JSON.parse(i)}catch{o=i}return e.error(`HTTP error:`,o),r?.setStatus({code:a.ERROR,message:n.message}),r?.recordException(n),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,`HTTPError`),V(c.ERROR,`ERROR`,`HTTP error: ${n.message}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":n.response.status,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":`HTTPError`}),t.json({error:{message:i,type:`error`}},n.response.status)}let i=n instanceof Error?n:Error(String(n));return r?.setStatus({code:a.ERROR,message:i.message}),r?.recordException(i),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,i.name),V(c.ERROR,`ERROR`,`Unhandled error: ${i.message}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":500,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":i.name}),t.json({error:{message:i.message,type:`error`}},500)}async function Ge(){let e=`${Q}/user`,t=S.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),t);try{let{response:t,span:r}=await G({spanName:`\u0067\u0069\u0074\u0068\u0075\u0062 GET /user`,url:e,target:`\u0067\u0069\u0074\u0068\u0075\u0062_user`,headers:{authorization:`token ${S.\u0067\u0069\u0074\u0068\u0075\u0062Token}`,...q()},signal:n.signal});if(!t.ok)throw r.end(),new $(`Failed to get \u0047\u0069\u0074\u0048\u0075\u0062 user`,t);let i=await t.json();return r.end(),i}finally{clearTimeout(r)}}export{T as _c1,x as DEFAULT_TIMEOUT_MS,Q as _g1,Ue as _g4,Ve as _g2,He as _g3,$ as HTTPError,y as PATHS,U as SENSITIVE_HEADERS,c as SeverityNumber,be as approvalCounter,Ae as approvalWaitHistogram,N as cachedTokensCounter,ke as chunksPerRequestHistogram,K as connectivityMonitor,ze as _s1,Se as copilotDurationHistogram,Z as _s2,V as emitLog,ce as ensurePaths,he as errorsCounter,H as flattenAttributes,We as _c2,Ge as _s4,Be as _s3,de as initOtel,Re as _s5,ge as inputTokensCounter,De as inputTokensPerRequestHistogram,I as modelMappingCounter,F as modelValidationErrorCounter,M as outputTokensCounter,Oe as outputTokensPerRequestHistogram,P as rateLimitCounter,we as rateLimitWaitHistogram,xe as requestDurationHistogram,me as requestsCounter,fe as shutdownOtel,q as _c3,S as state,ye as streamChunksCounter,Ce as streamDurationHistogram,L as tokenRefreshAttemptCounter,Ee as tokenRefreshDurationHistogram,_e as tokenRefreshFailureCounter,G as tracedFetch,Me as tracedUndiciRequest,A as tracer,Te as translationDurationHistogram};
|
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,DEFAULT_TIMEOUT_MS as t,_g1 as n,_g4 as r,_g2 as i,_g3 as a,HTTPError as o,PATHS as s,SENSITIVE_HEADERS as c,SeverityNumber as l,approvalCounter as u,approvalWaitHistogram as d,cachedTokensCounter as f,chunksPerRequestHistogram as p,connectivityMonitor as m,_s1 as h,copilotDurationHistogram as g,_s2 as _,emitLog as v,ensurePaths as y,errorsCounter as ee,flattenAttributes as b,_c2 as x,_s4 as te,_s3 as ne,initOtel as re,_s5 as ie,inputTokensCounter as ae,inputTokensPerRequestHistogram as oe,modelMappingCounter as se,modelValidationErrorCounter as ce,outputTokensCounter as le,outputTokensPerRequestHistogram as ue,rateLimitCounter as de,rateLimitWaitHistogram as fe,requestDurationHistogram as pe,requestsCounter as me,shutdownOtel as he,_c3 as ge,state as S,streamChunksCounter as _e,streamDurationHistogram as C,tokenRefreshAttemptCounter as ve,tokenRefreshDurationHistogram as ye,tokenRefreshFailureCounter as be,tracedFetch as w,tracedUndiciRequest as xe,tracer as T,translationDurationHistogram as Se}from"./get-user-DX7ymfsj.js";import{defineCommand as E,runMain as Ce}from"citty";import D from"consola";import O from"node:fs/promises";import we from"node:os";import{SpanKind as k,SpanStatusCode as A,context as Te,trace as Ee}from"@opentelemetry/api";import De from"clipboardy";import j from"node:process";import{serve as Oe}from"srvx";import ke from"tiny-invariant";import{execSync as Ae}from"node:child_process";import{Hono as M}from"hono";import{cors as je}from"hono/cors";import{streamSSE as N}from"hono/streaming";import{events as Me}from"fetch-event-stream";const Ne=async()=>{let e=`${n}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/v2/token`,t=S.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),t);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:ne(S),signal:r.signal});if(!t.ok)throw n.end(),new o(`Failed to get Service token`,t);let i=await t.json();return n.end(),i}finally{clearTimeout(i)}};async function Pe(){let e=new AbortController,t=S.timeoutMs,n=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${i}/login/device/code`,{method:`POST`,headers:ge(),body:JSON.stringify({client_id:a,scope:r}),signal:e.signal});if(!t.ok)throw new o(`Failed to get device code`,t);return await t.json()}finally{clearTimeout(n)}}const Fe=async()=>{let e=`${h(S)}/models`,t=_(S),n=S.timeoutMs,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 o(`Failed to get models`,n);let a=await n.json();return i.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.models_count`,a.data.length),i.end(),a}finally{clearTimeout(i)}};function Ie(){return`1.111.0-insider`}Ie();const P=e=>new Promise(t=>{setTimeout(t,e)}),Le=e=>e==null;async function Re(){let e=await Fe();S.models=e}const ze=()=>{let e=Ie();S.vsCodeVersion=e,D.info(`Using client version: ${e}`)};async function Be(e){let t=(e.interval+1)*1e3;for(D.debug(`Polling access token with interval of ${t}ms`);;){let n=new AbortController,r=S.timeoutMs,o=setTimeout(()=>{n.abort()},r);try{let r=await fetch(`${i}/login/oauth/access_token`,{method:`POST`,headers:ge(),body:JSON.stringify({client_id:a,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`}),signal:n.signal});if(!r.ok){await P(t),D.error(`Failed to poll access token:`,await r.text());continue}let o=await r.json();D.debug(`Polling access token response:`,o);let{access_token:s}=o;if(s)return s;await P(t)}catch(e){if(e instanceof Error&&e.name===`AbortError`){D.error(`Access token polling timed out`),await P(t);continue}throw e}finally{clearTimeout(o)}}}let F,I=!1,L,R;function Ve(){D.debug(`Cleaning up token management`),F&&=(clearInterval(F),void 0),L&&=(m.off(`online`,L),void 0),R&&=(m.off(`offline`,R),void 0)}const He=()=>O.readFile(s.GITHUB_TOKEN_PATH,`utf8`),Ue=e=>O.writeFile(s.GITHUB_TOKEN_PATH,e),We=async()=>{let{token:e,refresh_in:t}=await Ne();S.copilotToken=e,D.debug(`Service token fetched successfully!`),S.showToken&&D.info(`Service token:`,e);let n=(t-60)*1e3,r=async(e=5,t=1e3,n=`scheduled`)=>{if(I){D.debug(`Refresh already in progress, skipping`);return}return I=!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),D.debug(`Refreshing Service token (${n}, attempt ${a}/${e})`);let{token:t}=await Ne();S.copilotToken=t,D.debug(`Service token refreshed successfully`),S.showToken&&D.info(`Refreshed Service token:`,t),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.success`,!0),ve.add(1,{reason:n,success:`true`}),ye.record(performance.now()-i,{reason:n}),v(l.INFO,`INFO`,`Token refreshed successfully (${n})`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.reason":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempt":a});return}catch(o){let s=a===e;if(D.error(`Failed to refresh Service token (attempt ${a}/${e}):`,o),ve.add(1,{reason:n,success:`false`}),s){D.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:A.ERROR,message:t.message}),r.recordException(t),be.add(1,{reason:n}),ye.record(performance.now()-i,{reason:n}),v(l.ERROR,`ERROR`,`Token refresh failed after ${e} attempts (${n})`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.reason":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempts":e});return}let c=t*2**(a-1);D.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),I=!1}})};F=setInterval(()=>{r(5,1e3,`scheduled`).catch(e=>{D.error(`Unexpected error in scheduled token refresh:`,e)})},n),m.start(),L=()=>{D.debug(`Network connectivity restored, attempting immediate token refresh`),r(3,500,`network-restored`).catch(e=>{D.error(`Unexpected error in network-restored token refresh:`,e)})},R=()=>{D.debug(`Network connectivity lost`)},m.on(`online`,L),m.on(`offline`,R)};async function z(e){try{let t=await He();if(t&&!e?.force){S.githubToken=t,S.showToken&&D.info(`Auth token:`,t),await B();return}D.info(`Authentication required`);let n=await Pe();D.debug(`Device code response:`,n),D.info(`Please enter the code "${n.user_code}" in ${n.verification_uri}`);let r=await Be(n);await Ue(r),S.githubToken=r,S.showToken&&D.info(`Auth token:`,r),await B()}catch(e){throw e instanceof o?(D.error(`Failed to get Auth token:`,await e.response.json()),e):(D.error(`Failed to get Auth token:`,e),e)}}async function B(){let e=await te();D.info(`Authenticated as ${e.login}`)}async function Ge(e){e.verbose&&(D.level=5,D.info(`Verbose logging enabled`)),S.showToken=e.showToken,await y(),await z({force:!0}),D.success(`Auth token written to`,s.GITHUB_TOKEN_PATH)}const Ke=E({meta:{name:`auth`,description:`Run authentication flow`},args:{verbose:{alias:`v`,type:`boolean`,default:!1,description:`Enable verbose logging`},"show-token":{type:`boolean`,default:!1,description:`Show token on auth`}},run({args:e}){return Ge({verbose:e.verbose,showToken:e[`show-token`]})}}),V=async()=>{let e=`${n}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/user`,t=S.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),t);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:ne(S),signal:r.signal});if(!t.ok)throw n.end(),new o(`Failed to get usage`,t);let i=await t.json();return n.end(),i}finally{clearTimeout(i)}},qe=E({meta:{name:`check-usage`,description:`Show current usage/quota information`},async run(){await y(),await z();try{let e=await V(),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);D.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){D.error(`Failed to fetch usage:`,e),process.exit(1)}}});async function Je(){try{let e=new URL(`../package.json`,import.meta.url).pathname,t=await O.readFile(e),n=JSON.parse(t.toString());return n.version}catch{return`unknown`}}function Ye(){let e=typeof Bun<`u`;return{name:e?`bun`:`node`,version:e?Bun.version:process.version.slice(1),platform:we.platform(),arch:we.arch()}}async function Xe(){try{let e=await O.stat(s.GITHUB_TOKEN_PATH);if(!e.isFile())return!1;let t=await O.readFile(s.GITHUB_TOKEN_PATH,`utf8`);return t.trim().length>0}catch{return!1}}async function Ze(){let[e,t]=await Promise.all([Je(),Xe()]);return{version:e,runtime:Ye(),paths:{APP_DIR:s.APP_DIR,GITHUB_TOKEN_PATH:s.GITHUB_TOKEN_PATH},tokenExists:t}}function Qe(e){D.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,13 @@ 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 $e(e){console.log(JSON.stringify(e,null,2))}async function et(e){let t=await Ze();e.json?$e(t):Qe(t)}const tt=E({meta:{name:`debug`,description:`Print debug information about the application`},args:{json:{type:`boolean`,default:!1,description:`Output debug information as JSON`}},run({args:e}){return et({json:e.json})}});function nt(){let{platform:e,ppid:t,env:n}=j;if(e===`win32`){try{let e=`wmic process get ParentProcessId,Name | findstr "${t}"`,n=Ae(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 rt(e,t=``){let n=nt(),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 it(){return`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}function at(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 ot(){return async(t,n)=>{let r=Date.now(),i=it(),a=t.req.method,o=t.req.path,s=at(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:k.SERVER,attributes:{"http.method":a,"http.url":t.req.url,"http.route":o,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request_id":i,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.endpoint_type":s}});for(let[e,n]of Object.entries(t.req.header())){let t=e.toLowerCase();if(c.has(t))continue;l.setAttribute(`http.request.header.${t}`,n)}let u=Ee.setSpan(Te.active(),l);await Te.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:A.ERROR,message:t.message}),l.recordException(t),e}});let d=Date.now()-r,p=t.get(`requestData`),m=t.res.status,h=p?.model??`unknown`,g=p?.streaming??!1;if(l.setAttribute(`http.status_code`,m),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model`,h),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming`,g),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.duration_ms`,d),p?.copilotDuration&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_duration_ms`,p.copilotDuration),p?.tokenUsage){let e=p.tokenUsage;l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens`,e.inputTokens),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens`,e.outputTokens),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.total_tokens`,e.totalTokens),e.cachedTokens&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.cached_tokens`,e.cachedTokens),e.estimatedCost&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.estimated_cost`,e.estimatedCost)}t.res.headers.forEach((e,t)=>{let n=t.toLowerCase();c.has(n)||l.setAttribute(`http.response.header.${n}`,e)}),m>=400&&l.setStatus({code:A.ERROR,message:`HTTP ${m}`}),l.end();let _={method:a,path:o,status_code:String(m),model:h,streaming:String(g),endpoint_type:s};if(me.add(1,_),pe.record(d,_),m>=400&&ee.add(1,{method:a,path:o,status_code:String(m),error_type:m>=500?`server_error`:`client_error`}),p?.tokenUsage){let e=p.tokenUsage,t={model:h,endpoint_type:s};e.inputTokens&&(ae.add(e.inputTokens,t),oe.record(e.inputTokens,t)),e.outputTokens&&(le.add(e.outputTokens,t),ue.record(e.outputTokens,t)),e.cachedTokens&&f.add(e.cachedTokens,{model:h})}p?.tokenUsage&&e.executeCompletion(i)}}const st=async()=>T.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.await`,async e=>{let t=performance.now();try{let n=await D.prompt(`Accept incoming request?`,{type:`confirm`}),r=performance.now()-t;if(e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration_ms`,r),d.record(r),!n)throw e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`rejected`),u.add(1,{result:`rejected`}),new o(`Request rejected`,Response.json({message:`Request rejected`},{status:403}));e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`approved`),u.add(1,{result:`approved`})}finally{e.end()}}),ct={input:3e-6,output:15e-6};function H(e){let t=e.prompt_tokens||0,n=e.completion_tokens||0,r=e.total_tokens||t+n,i=t*ct.input+n*ct.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 lt=[{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`}],ut={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 dt(e){return e.startsWith(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/`)?e.slice(10):e}function ft(e){let t=e.lastIndexOf(`[`),n=e.lastIndexOf(`]`);return t!==-1&&n===e.length-1&&n>t?[e.slice(0,t),e.slice(t+1,n)]:[e,null]}function pt(e){for(let t of lt)if(t.pattern.test(e))return t.family;return null}function mt(e,t,n=null){let r=ut[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 ht(e,t){let n=dt(e),[r,i]=ft(n);if(t.includes(n))return n;if(i){let e=`${r}-${i}`,n=e.replaceAll(/(\d)-(\d)\b/g,`$1.$2`);if(t.includes(n))return n}let a=pt(r);if(!a)return null;let o=r.replace(/-\d{8}(?::.*)?$/,``),s=i?`-${i}`:``;for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,``),n=`${o}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,`$1.$2`),r=t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,`$1.$2`);if(r===n)return e}return mt(a,t,i)}var U=class extends Error{statusCode;constructor(e,t=400){super(e),this.name=`ModelValidationError`,this.statusCode=t}};function W(e){if(!e||typeof e!=`string`)throw new U(`Model name is required and must be a string`);if(!S.models?.data)throw new U(`Models not available. Please try again later.`,503);let t=S.models.data.map(e=>e.id),n=ht(e,t);if(!n)throw ce.add(1,{requested_model:e}),new U(`Invalid model: '${e}'. Available services: ${t.join(`, `)}`);return n}async function gt(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 a=Math.ceil(t-i);if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_seconds`,a),!e.rateLimitWait)throw n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`rejected`),de.add(1,{action:`rejected`,source:`local`}),D.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new o(`Rate limit exceeded`,Response.json({message:`Rate limit exceeded`},{status:429}));let s=a*1e3;n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`waited`),de.add(1,{action:`waited`,source:`local`}),fe.record(s,{source:`local`}),D.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await P(s),e.lastRequestTimestamp=r,D.info(`Rate limit wait completed, proceeding with request`)}finally{n.end()}})}function _t(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 G(e){if(typeof e==`string`)return _t(e);if(Array.isArray(e)){let t=e.map(e=>G(e));return t}if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=G(r);return t}return e}const vt=async e=>{if(!S.copilotToken)throw Error(`Service token not found`);let t=G(e),n=t.messages.some(e=>typeof e.content!=`string`&&e.content?.some(e=>e.type===`image_url`)),r=t.messages.some(e=>[`assistant`,`tool`].includes(e.role)),i={..._(S,n),"X-Initiator":r?`agent`:`user`},a=`${h(S)}/chat/completions`,s=S.timeoutMs,c=new AbortController,l=setTimeout(()=>c.abort(),s);try{let{statusCode:e,headers:l,body:u,span:d}=await xe({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /chat/completions`,url:a,target:`chat_completions`,headers:i,body:JSON.stringify(t),signal:c.signal,headersTimeout:s,bodyTimeout:s*3,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":t.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming":!!t.stream,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.timeout_ms":s,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.has_tools":!!t.tools?.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tool_count":t.tools?.length??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.message_count":t.messages.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.max_tokens":t.max_tokens??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.vision_enabled":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.initiator":r?`agent`:`user`}}),f=new Response(u,{status:e,headers:l});if(!f.ok)throw d.end(),new o(`Failed to create chat completions`,f);if(t.stream)return d.end(),Me(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 yt(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=W(e.model);return t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,n),n===e.model?(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),e):(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),se.add(1,{from_model:e.model,to_model:n}),D.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}async function bt(t){await gt(S);let n=await t.req.json();D.debug(`Request payload:`,JSON.stringify(n).slice(-400));try{n=yt(n)}catch(e){if(e instanceof U)return t.json({error:{message:e.message,type:`invalid_request_error`,code:`invalid_model`}},e.statusCode);throw e}if(t.set(`requestData`,{model:n.model,streaming:!!n.stream}),S.manualApprove&&await st(),Le(n.max_tokens)){let e=S.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},D.debug(`Set max_tokens to:`,JSON.stringify(n.max_tokens))}let r=performance.now(),i=await vt(n),a=performance.now()-r;if(g.record(a,{model:n.model,target:`chat_completions`,streaming:String(!!n.stream)}),xt(i)){let e=t.get(`requestData`)||{};return i.usage&&(e.tokenUsage=H(i.usage)),e.copilotDuration=a,t.set(`requestData`,e),D.debug(`Non-streaming response:`,JSON.stringify(i)),t.json(i)}return N(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=H(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(C.record(l,u),p.record(s,u),o){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=H(o),e.copilotDuration=a,t.set(`requestData`,e))}let d=t.get(`requestId`);d&&e.executeCompletion(d)})}const xt=e=>Object.hasOwn(e,`choices`),K=new M;K.post(`/`,async e=>{try{return await bt(e)}catch(t){return await x(e,t)}});const St=async e=>{if(!S.copilotToken)throw Error(`Service token not found`);let t=`${h(S)}/embeddings`,n=_(S),r=S.timeoutMs,i=new AbortController,a=setTimeout(()=>i.abort(),r);try{let{response:r,span:a}=await 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 a.end(),new o(`Failed to create embeddings`,r);let s=await r.json();return a.end(),s}finally{clearTimeout(a)}},q=new M;q.post(`/`,async e=>{try{let t=await e.req.json();try{W(t.model)}catch(t){if(t instanceof U)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 St(t),i=performance.now()-n;g.record(i,{model:t.model,target:`embeddings`,streaming:`false`});let a=e.get(`requestData`)||{};return a.tokenUsage=H(r.usage),a.copilotDuration=i,e.set(`requestData`,a),e.json(r)}catch(t){return await x(e,t)}});function Ct(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 wt(e){return{model:Tt(e.model),messages:Et(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:At(e.tools),tool_choice:jt(e.tool_choice)}}function Tt(e){return e}function Et(e,t){let n=Dt(t),r=e.flatMap(e=>e.role===`user`?Ot(e):kt(e));return[...n,...r]}function J(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 Dt(e){if(!e)return[];if(typeof e==`string`)return[{role:`system`,content:J(e)}];{let t=e.map(e=>e.text).join(`
|
|
12
12
|
|
|
13
|
-
`);return[{role:`system`,content:
|
|
13
|
+
`);return[{role:`system`,content:J(t)}]}}function Ot(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:Y(e.content)});r.length>0&&t.push({role:`user`,content:Y(r)})}else t.push({role:`user`,content:Y(e.content)});return t}function kt(e){if(!Array.isArray(e.content))return[{role:`assistant`,content:Y(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:Y(e.content)}]}function Y(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 At(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function jt(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 Mt(e){let t=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let i of e.choices){let e=Nt(i.message.content),a=Pt(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:Ct(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}function Nt(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 Pt(e){return e?e.map(e=>({type:`tool_use`,id:e.id,name:e.function.name,input:JSON.parse(e.function.arguments)})):[]}function Ft(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function It(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&&(Ft(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:Ct(r.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:`message_stop`})),n}async function Lt(e,t,n){let r={query:t,max_results:n?.maxResults??5};n?.includeDomains?.length&&(r.include_domains=n.includeDomains),n?.excludeDomains?.length&&(r.exclude_domains=n.excludeDomains),D.debug(`Tavily search request:`,JSON.stringify(r));let i=await fetch(`https://api.tavily.com/search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e}`},body:JSON.stringify(r)});if(!i.ok){let e=await i.text();throw D.error(`Tavily API error (${i.status}):`,e),Error(`Tavily API error: ${i.status} ${e}`)}let a=await i.json();return D.debug(`Tavily returned ${a.results.length} results`),a.results}function Rt(e){let t=e.tools;if(!t||t.length!==1)return!1;let n=t[0].type;return typeof n==`string`&&n.startsWith(`web_search`)}function zt(e){let t=e.messages[0];if(!t||t.role!==`user`)return null;let n;if(typeof t.content==`string`)n=t.content;else if(Array.isArray(t.content)){let e=t.content.find(e=>e.type===`text`);if(!e)return null;n=e.text}else return null;return n.startsWith(`Perform a web search for the query: `)?n.slice(36).trim():n.trim()||null}function Bt(e){let t=e.tools,n=t?.[0],r=typeof n?.max_uses==`number`?n.max_uses:5;return{maxResults:r,allowedDomains:n?.allowed_domains,blockedDomains:n?.blocked_domains}}function X(){let e=``;for(let t=0;t<24;t++)e+=`abcdefghijklmnopqrstuvwxyz0123456789`[Math.floor(Math.random()*36)];return e}function Vt(e){let{query:t,results:n,model:r,isError:i,errorContent:a}=e,o=`srvtoolu_${X()}`,s=[{type:`text`,text:`I'll search for that.`},{type:`server_tool_use`,id:o,name:`web_search`,input:{query:t}},{type:`web_search_tool_result`,tool_use_id:o,content:i&&a?a:n}];return{id:`msg_tavily_${X()}`,type:`message`,role:`assistant`,model:r,content:s,stop_reason:`end_turn`,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}function Ht(e){let{query:t,results:n,model:r,isError:i,errorContent:a}=e,o=`srvtoolu_${X()}`,s=`msg_tavily_${X()}`,c=[];return c.push({type:`message_start`,message:{id:s,type:`message`,role:`assistant`,content:[],model:r,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:`content_block_start`,index:0,content_block:{type:`text`,text:``}},{type:`content_block_delta`,index:0,delta:{type:`text_delta`,text:`I'll search for that.`}},{type:`content_block_stop`,index:0},{type:`content_block_start`,index:1,content_block:{type:`server_tool_use`,id:o,name:`web_search`,input:{}}},{type:`content_block_delta`,index:1,delta:{type:`input_json_delta`,partial_json:JSON.stringify({query:t})}},{type:`content_block_stop`,index:1},{type:`content_block_start`,index:2,content_block:{type:`web_search_tool_result`,tool_use_id:o,content:i&&a?a:n}},{type:`content_block_stop`,index:2},{type:`message_delta`,delta:{stop_reason:`end_turn`,stop_sequence:null},usage:{output_tokens:0}},{type:`message_stop`}),c}async function Ut(e,t){let n=zt(t);if(!n)return e.json({type:`error`,error:{type:`invalid_request_error`,message:`Could not extract search query from web search request`}},400);let r=Bt(t);D.info(`Web search intercepted: "${n}"`);let i=[],a=!1,o;try{let e=S.tavilyApiKey;if(!e)throw Error(`No Tavily API key configured`);let t=await Lt(e,n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains});i=t.map(e=>({type:`web_search_result`,url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString(`base64`),page_age:null}))}catch(e){D.error(`Tavily search failed:`,e),a=!0,o=[{type:`web_search_tool_result_error`,error_code:`unavailable`}]}let s={query:n,results:i,model:t.model,isError:a,errorContent:o};if(!t.stream)return e.json(Vt(s));let c=Ht(s);return N(e,async e=>{for(let t of c)await e.writeSSE({event:t.type,data:JSON.stringify(t)})})}function Wt(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=W(t.model);return n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,e),e===t.model?(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),t):(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),se.add(1,{from_model:t.model,to_model:e}),D.debug(`Model mapping: '${t.model}' → '${e}'`),{...t,model:e})}catch(t){if(t instanceof U)return e.json({type:`error`,error:{type:`invalid_request_error`,message:t.message}},t.statusCode),null;throw t}finally{n.end()}})}async function Gt(t){let n=await t.req.json();if(Rt(n))return Ut(t,n);await gt(S),D.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`},D.debug(`Detected context-1m beta flag, rewriting model: '${e}' → '${n.model}'`)}let a=Wt(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),wt(n)}finally{e.end()}});Se.record(performance.now()-o,{direction:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`}),D.debug(`Translated \u004f\u0070\u0065\u006e\u0041\u0049 request payload:`,JSON.stringify(s)),t.set(`requestData`,{model:s.model,streaming:!!s.stream});let c=performance.now();S.manualApprove&&await st();let l=await vt(s),u=performance.now()-c;if(g.record(u,{model:s.model,target:`chat_completions`,streaming:String(!!s.stream)}),Kt(l)){let e=t.get(`requestData`)||{};l.usage&&(e.tokenUsage=H(l.usage)),e.copilotDuration=u,t.set(`requestData`,e),D.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=Mt(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 Se.record(performance.now()-n,{direction:`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),D.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 response:`,JSON.stringify(r)),t.json(r)}return D.debug(`Streaming response from service`),N(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(D.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=H(r),e.copilotDuration=u,t.set(`requestData`,e)}let c=It(a,o);for(let e of c)D.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(C.record(c,d),p.record(i,d),r){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=H(r),e.copilotDuration=u,t.set(`requestData`,e))}let f=t.get(`requestId`);f&&e.executeCompletion(f)})}const Kt=e=>Object.hasOwn(e,`choices`),qt=new M;qt.post(`/`,async e=>{try{return await Gt(e)}catch(t){return await x(e,t)}});const Z=new M;Z.get(`/`,async e=>{try{S.models||await Re();let t=S.models?.data.map(e=>({id:e.id,object:`model`,type:`model`,created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:`list`,data:t,has_more:!1})}catch(t){return await x(e,t)}});const Jt=new M;Jt.get(`/`,e=>{try{return e.json({token:S.copilotToken})}catch(t){return console.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const Yt=new M;Yt.get(`/`,async e=>{try{let t=await V();return e.json(t)}catch(t){return console.error(`Error fetching usage:`,t),e.json({error:`Failed to fetch usage`},500)}});const Q=new M;Q.use(ot()),Q.use(je()),Q.get(`/`,e=>e.text(`Server running`)),Q.route(`/chat/completions`,K),Q.route(`/models`,Z),Q.route(`/embeddings`,q),Q.route(`/usage`,Yt),Q.route(`/token`,Jt),Q.route(`/v1/chat/completions`,K),Q.route(`/v1/models`,Z),Q.route(`/v1/embeddings`,q),Q.route(`/v1/messages`,qt),Q.post(`/v1/messages/count_tokens`,e=>e.json({input_tokens:1}));const Xt=[],$=Date.now();function Zt(){let e=async(e,t=0)=>{D.info(`Gracefully shutting down...`);let n=T.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.shutdown`,{kind:k.INTERNAL,attributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.shutdown.reason":e,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.shutdown.exit_code":t,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.uptime_seconds":(Date.now()-$)/1e3}});for(let e of Xt)try{await e()}catch(e){D.error(`Error during cleanup:`,e)}n.end(),D.info(`Shutdown complete`),j.exit(t)};j.on(`SIGINT`,()=>e(`SIGINT`)),j.on(`SIGTERM`,()=>e(`SIGTERM`)),j.on(`uncaughtException`,t=>{D.error(`Uncaught exception:`,t),e(`uncaughtException`,1)}),j.on(`unhandledRejection`,(t,n)=>{D.error(`Unhandled promise rejection at:`,n,`reason:`,t),e(`unhandledRejection`,1)})}function Qt(){return`npx \u0063\u006f\u0070\u0069\u006c\u006f\u0074-api start`}function $t(e){let t=[Qt()];return t.push(`-p ${e.port}`),e.verbose&&t.push(`-v`),e.accountType!==`individual`&&t.push(`-a ${e.accountType}`),e.manual&&t.push(`--manual`),e.rateLimit&&t.push(`-r ${e.rateLimit}`),e.rateLimitWait&&t.push(`-w`),e.githubToken&&t.push(`-g ${e.\u0067\u0069\u0074\u0068\u0075\u0062Token}`),e.claudeCode&&t.push(`-c`),e.model&&t.push(`-m ${e.model}`),e.smallModel&&t.push(`-s ${e.smallModel}`),e.timeout&&t.push(`-t ${String(e.timeout)}`),e.showToken&&t.push(`--show-token`),e.disableConnectivityMonitoring&&t.push(`--disable-connectivity-monitoring`),t.join(` `)}async function en(e,t){if(!e.claudeCode)return;ke(S.models,`Models should be loaded by now`);let n,r;if(e.model&&e.smallModel){let t=S.models.data.map(e=>e.id);t.includes(e.model)||(D.error(`Invalid model: ${e.model}`),D.info(`Available services: \n${t.join(`
|
|
18
|
+
`)}`),j.exit(1)),t.includes(e.smallModel)||(D.error(`Invalid small model: ${e.smallModel}`),D.info(`Available services: \n${t.join(`
|
|
19
|
+
`)}`),j.exit(1)),n=e.model,r=e.smallModel,D.info(`Using service: ${n}`),D.info(`Using small model: ${r}`)}else e.model||e.smallModel?(D.error(`Both --model and --small-model must be specified for model selection`),j.exit(1)):(n=await D.prompt(`Select a model to use`,{type:`select`,options:S.models.data.map(e=>e.id)}),r=await D.prompt(`Select a small model to use`,{type:`select`,options:S.models.data.map(e=>e.id)}));let i=rt({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:`dummy`,ANTHROPIC_MODEL:n,ANTHROPIC_SMALL_FAST_MODEL:r},`\u0063\u006c\u0061\u0075\u0064\u0065`);try{De.writeSync(i),D.success(`Copied command to clipboard!`)}catch{D.warn(`Failed to copy to clipboard. Here is the command:`),D.log(i)}}function tn(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:k.INTERNAL,attributes:b({config:{version:n,port:t.port,accountType:t.accountType,verbose:t.verbose,manualApprove:t.manual,rateLimitSeconds:t.rateLimit??0,rateLimitWait:t.rateLimitWait,timeoutMs:t.timeout,showToken:t.showToken,claudeCode:t.claudeCode,disableConnectivityMonitoring:t.disableConnectivityMonitoring,model:t.model,smallModel:t.smallModel,githubTokenSource:t.githubToken?`cli_arg`:`stored`},runtime:r,identity:{githubUser:i.login,machineId:S.machineId,sessionId:S.sessionId,vsCodeVersion:S.vsCodeVersion},connectivity:S.connectivity,modelsCount:S.models?.data.length??0,startupDurationMs:Date.now()-$},`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api`)});if(S.models?.data)for(let e of S.models.data)a.addEvent(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.available`,b(e,`model`));a.end(),v(l.INFO,`INFO`,`Server started`,b({version:n,port:t.port,accountType:t.accountType,githubUser:i.login,modelsCount:S.models?.data.length??0,startupDurationMs:Date.now()-$},`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api`))}async function nn(e){Zt(),Xt.push(()=>{D.debug(`Cleaning up connectivity monitor`),m.stop()},()=>{D.debug(`Cleaning up token management`),Ve()},async()=>{D.debug(`Shutting down OTel SDK`),await he()}),e.verbose&&(D.level=5,D.info(`Verbose logging enabled`)),S.accountType=e.accountType,e.accountType!==`individual`&&D.info(`Using ${e.accountType} plan account`),S.manualApprove=e.manual,S.rateLimitSeconds=e.rateLimit,S.rateLimitWait=e.rateLimitWait,S.showToken=e.showToken,S.timeoutMs=e.timeout,S.connectivity.enabled=!e.disableConnectivityMonitoring,e.tavilyApiKey&&(S.tavilyApiKey=e.tavilyApiKey,D.info(`Web search enabled via Tavily API`)),await y(),ze();let t=await Je(),n=Ye();re(t,$),e.githubToken?(S.githubToken=e.githubToken,D.info(`Using provided Auth token`)):await z();let r;try{let{_s4:e}=await import(`./get-user-C8Q0uEyI.js`);r=await e(),await ie(S,r.login)}catch(e){D.error(`Failed to get user info for machine ID generation:`,e),D.error(`Cannot proceed without user information`),j.exit(1)}await We(),await Re(),tn({options:e,version:t,runtime:n,githubUser:r}),D.info(`Available services:`);for(let e of S.models?.data??[]){let t=e.capabilities.limits?.max_context_window_tokens,n=t?` (${t.toLocaleString()} tokens)`:``;D.info(`- ${e.id}${n}`)}let i=`http://localhost:${e.port}`;if(await en(e,i),e.tavilyApiKey)D.box(`🔍 Web Search: Enabled ✓`);else{let t=$t(e);D.box([`🔍 Web Search: Enable web search by adding a Tavily API key.`,` Get your API key at: https://www.tavily.com`,``,` ${t} --tavily-api-key <your-key>`].join(`
|
|
20
|
+
`))}Oe({fetch:Q.fetch,port:e.port})}const rn=E({meta:{name:`start`,description:`Start the API server`},args:{port:{alias:`p`,type:`string`,default:`4141`,description:`Port to listen on`},verbose:{alias:`v`,type:`boolean`,default:!1,description:`Enable verbose logging`},"account-type":{alias:`a`,type:`string`,default:`individual`,description:`Account type (individual, business, enterprise)`},manual:{type:`boolean`,default:!1,description:`Enable manual request approval`},"rate-limit":{alias:`r`,type:`string`,description:`Rate limit in seconds between requests`},wait:{alias:`w`,type:`boolean`,default:!1,description:`Wait instead of error when rate limit is hit. Has no effect if rate limit is not set`},"\u0067\u0069\u0074\u0068\u0075\u0062-token":{alias:`g`,type:`string`,description:"Provide auth token directly (must be generated using the `auth` subcommand)"},"\u0063\u006c\u0061\u0075\u0064\u0065-code":{alias:`c`,type:`boolean`,default:!1,description:`Generate a command to launch with API config`},model:{alias:`m`,type:`string`,description:`Model to use (requires --\u0063\u006c\u0061\u0075\u0064\u0065-code)`},"small-model":{alias:`s`,type:`string`,description:`Small/fast model to use (requires --\u0063\u006c\u0061\u0075\u0064\u0065-code)`},"show-token":{type:`boolean`,default:!1,description:`Show tokens on fetch and refresh`},timeout:{alias:`t`,type:`string`,description:`API timeout in milliseconds (default: 600000)`},"disable-connectivity-monitoring":{type:`boolean`,default:!1,description:`Disable automatic network monitoring for token refresh`},"tavily-api-key":{type:`string`,description:`Tavily API key for web search support (or set TAVILY_API_KEY env var)`}},run({args:e}){let n=e[`rate-limit`],r=n===void 0?void 0:Number.parseInt(n,10),i=e.timeout,a=i===void 0?t:Number.parseInt(i,10);return nn({port:Number.parseInt(e.port,10),verbose:e.verbose,accountType:e[`account-type`],manual:e.manual,rateLimit:r,rateLimitWait:e.wait,githubToken:e[`\u0067\u0069\u0074\u0068\u0075\u0062-token`],claudeCode:e[`\u0063\u006c\u0061\u0075\u0064\u0065-code`],model:e.model,smallModel:e[`small-model`],showToken:e[`show-token`],timeout:a,disableConnectivityMonitoring:e[`disable-connectivity-monitoring`],tavilyApiKey:e[`tavily-api-key`]||j.env.TAVILY_API_KEY})}}),an=E({meta:{name:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,description:`API proxy server for tool integration.`},subCommands:{auth:Ke,start:rn,"check-usage":qe,debug:tt}});await Ce(an);export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "copilot-api-node20",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.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",
|
|
@@ -54,7 +54,17 @@
|
|
|
54
54
|
"typescript-eslint": "^8.56.0"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"
|
|
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",
|
|
58
68
|
"citty": "^0.1.6",
|
|
59
69
|
"clipboardy": "^4.0.0",
|
|
60
70
|
"consola": "^3.4.2",
|
|
@@ -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};
|