copilot-api-node20 0.15.1 → 0.16.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.
- package/dist/get-user-DX7ymfsj.js +1 -1
- package/dist/main.js +7 -7
- package/package.json +1 -1
|
@@ -1 +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};
|
|
1
|
+
import e from"consola";import t from"node:fs/promises";import n from"node:os";import r from"node:path";import{SpanKind as i,SpanStatusCode as a,metrics as o,trace as s}from"@opentelemetry/api";import{SeverityNumber as c,logs as l}from"@opentelemetry/api-logs";import{OTLPLogExporter as u}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as d}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as f}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as p}from"@opentelemetry/resources";import{BatchLogRecordProcessor as m}from"@opentelemetry/sdk-logs";import{PeriodicExportingMetricReader as h}from"@opentelemetry/sdk-metrics";import{NodeSDK as ee}from"@opentelemetry/sdk-node";import{ATTR_SERVICE_NAME as te,ATTR_SERVICE_VERSION as ne}from"@opentelemetry/semantic-conventions";import{request as re}from"undici";import{createHash as ie,randomBytes as g,randomUUID as _}from"node:crypto";const v=r.join(n.homedir(),`.local`,`share`,`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),ae=r.join(v,`\u0067\u0069\u0074\u0068\u0075\u0062_token`),oe=r.join(v,`machine_id`),se=r.join(v,`session_id`),y={APP_DIR:v,GITHUB_TOKEN_PATH:ae,MACHINE_ID_PATH:oe,SESSION_ID_PATH:se};async function ce(){await t.mkdir(y.APP_DIR,{recursive:!0}),await b(y.GITHUB_TOKEN_PATH),await b(y.SESSION_ID_PATH)}async function b(e){try{await t.access(e,t.constants.W_OK)}catch{await t.writeFile(e,``),await t.chmod(e,384)}}const x=6e5,S={accountType:`individual`,manualApprove:!1,rateLimitWait:!1,showToken:!1,timeoutMs:x,connectivity:{enabled:!0,probeEndpoints:[`https://api.\u0067\u0069\u0074\u0068\u0075\u0062.com`,`https://www.google.com`,`https://1.1.1.1`],fastProbeInterval:5e3,slowProbeInterval:6e4,timeoutMs:5e3,jitterMaxMs:1e3,connectionPooling:!0,dnsCache:!0}},C=e=>e>=1e5||e>=1e4?`${Math.round(e/1e3)}K`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toString(),w=(e,t)=>e.padEnd(t),le=(e,t)=>{if(!S.models)return``;let n=S.models.data.find(e=>e.id===t);if(!n)return``;let r=n.capabilities.limits?.max_context_window_tokens;if(!r)return``;let i=(e/r*100).toFixed(1);return` (${i}%)`},ue=e=>{let t=[];if(e.model){let n=w(e.model,18);t.push(n)}if(e.tokenUsage){let n=e.tokenUsage,r=(n.inputTokens||0)+(n.outputTokens||0),i=e.model?le(r,e.model):``,a=C(n.inputTokens||0).padStart(5),o=C(n.outputTokens||0).padStart(5),s=`↑${a} │ ↓${o}`,c=w(s,18),l=C(r),u=i?`${l}${i.padStart(15-l.length)}`:l.padEnd(15);t.push(`Tokens: ${c} | Context: ${u}`)}else if(e.model){let e=w(`N/A`,18),n=`N/A`.padEnd(15);t.push(`Tokens: ${e} | Context: ${n}`)}if(e.copilotDuration){let n=w(`${Math.round(e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);t.push(`API: ${n}`)}return t.length>0?` | ${t.join(` | `)}`:``},T={completionCallbacks:new Map,registerCompletion(e,t,n){this.completionCallbacks.set(e,{context:t,startTime:n,requestId:e})},executeCompletion(e){let t=this.completionCallbacks.get(e);t&&(this.logCompletion(t),this.completionCallbacks.delete(e))},logCompletion(t){let{context:n,startTime:r}=t,i=Date.now(),a=i-r,o=n.get(`requestData`),s=w(n.req.method,4),l=w(n.req.path,21),u=w(n.res.status.toString(),3),d=w(`${a}ms`,8),f=` --> ${s}${l}${u} ${d}`;o&&(f+=ue(o)),e.info(f),V(c.INFO,`INFO`,`Request completed`,{"http.method":n.req.method,"http.path":n.req.path,"http.status_code":n.res.status,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.duration_ms":a,...o?.model&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":o.model},...o?.copilotDuration&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_duration_ms":Math.round(o.copilotDuration)},...o?.tokenUsage?.inputTokens&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens":o.tokenUsage.inputTokens},...o?.tokenUsage?.outputTokens&&{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens":o.tokenUsage.outputTokens}})},logRateLimit(t,n){let{context:r,startTime:i}=t,a=Date.now(),o=a-i,s=n.headers.get(`x-ratelimit-exceeded`)||``,c=s.split(`:`)[1]||`unknown`,l=n.headers.get(`retry-after`)||n.headers.get(`x-ratelimit-user-retry-after`)||`?`,u=w(r.req.method,4),d=w(r.req.path,21),f=w(`429`,3),p=w(`${o}ms`,8),m=`⚠ --> ${u}${d}${f} ${p}`;m+=` | Rate limited (${l}s retry) | ${c}`;let h=r.get(`requestData`);if(h?.copilotDuration){let e=w(`${Math.round(h.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Duration)}ms`,8);m+=` | API: ${e}`}e.info(m)},cleanup(){let e=1e3,t=Date.now()-300*1e3;for(let[e,n]of this.completionCallbacks)n.startTime<t&&this.completionCallbacks.delete(e);if(this.completionCallbacks.size>e){let t=Array.from(this.completionCallbacks.entries()).sort(([,e],[,t])=>e.startTime-t.startTime),n=t.slice(0,t.length-e);for(let[e]of n)this.completionCallbacks.delete(e)}}};setInterval(()=>T.cleanup(),60*1e3);let E,D=Date.now();const O=`https://api.\u0068\u006f\u006e\u0065\u0079\u0063\u006f\u006d\u0062.io`,k={"x-\u0068\u006f\u006e\u0065\u0079\u0063\u006f\u006d\u0062-team":`\u0068\u0063\u0061\u0069\u006b\u005f\u0030\u0031\u006b\u006d\u0032\u0079\u0037\u0079\u0066\u0031\u0072\u0072\u006e\u0037\u0030\u0078\u0076\u0078\u0063\u0065\u0035\u006b\u0078\u0039\u0064\u0079\u007a\u0039\u0033\u0036\u0064\u0077\u006d\u0032\u0031\u0062\u0039\u0062\u0067\u0076\u006e\u0077\u0066\u0033\u0070\u0078\u0071\u0030\u0063\u006d\u0071\u006b\u0063\u0077\u0068\u0061\u0038\u006e`};function de(e,t){t&&(D=t);let n=p({[te]:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,[ne]:e});E=new ee({resource:n,traceExporter:new f({url:`${O}/v1/traces`,headers:k}),metricReader:new h({exporter:new d({url:`${O}/v1/metrics`,headers:k}),exportIntervalMillis:15e3}),logRecordProcessors:[new m(new u({url:`${O}/v1/logs`,headers:k}))],instrumentations:[]}),E.start()}async function fe(){E&&await E.shutdown()}const A=s.getTracer(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),j=o.getMeter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),pe=l.getLogger(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`),me=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.requests.total`,{unit:`{request}`,description:`Total requests received`}),he=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.requests.errors`,{unit:`{error}`,description:`Total error responses`}),ge=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.input`,{unit:`{token}`,description:`Total input tokens consumed`}),M=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.output`,{unit:`{token}`,description:`Total output tokens generated`}),N=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.cached`,{unit:`{token}`,description:`Total cached prompt tokens`}),P=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.triggers`,{unit:`{trigger}`,description:`Rate limit trigger count`}),F=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model_validation.errors`,{unit:`{error}`,description:`Model validation failures`}),I=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model_mapping.mappings`,{unit:`{mapping}`,description:`Model name normalizations`}),L=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempts`,{unit:`{attempt}`,description:`Token refresh attempts`}),_e=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.failures`,{unit:`{failure}`,description:`Token refresh final failures`}),ve=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.checks`,{unit:`{check}`,description:`Connectivity probe results`}),R=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.transitions`,{unit:`{transition}`,description:`Connectivity state transitions`}),z=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.upstream.requests`,{unit:`{request}`,description:`Upstream API calls`}),ye=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.chunks`,{unit:`{chunk}`,description:`Total SSE chunks sent`}),be=j.createCounter(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.decisions`,{unit:`{decision}`,description:`Manual approval decisions`}),xe=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request.duration`,{unit:`ms`,description:`Total request duration`}),Se=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074.duration`,{unit:`ms`,description:`Upstream \u0043\u006f\u0070\u0069\u006c\u006f\u0074 API call duration`}),Ce=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.duration`,{unit:`ms`,description:`Duration of SSE streaming phase`}),we=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_duration`,{unit:`ms`,description:`Duration of rate limit waits`}),Te=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.duration`,{unit:`ms`,description:`Translation layer processing time`}),Ee=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.duration`,{unit:`ms`,description:`Token refresh duration`}),B=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.probe_duration`,{unit:`ms`,description:`Individual connectivity probe duration`}),De=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.per_request.input`,{unit:`{token}`,description:`Input tokens per request distribution`}),Oe=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tokens.per_request.output`,{unit:`{token}`,description:`Output tokens per request distribution`}),ke=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.stream.chunks_per_request`,{unit:`{chunk}`,description:`Chunks per streaming request`}),Ae=j.createHistogram(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration`,{unit:`ms`,description:`Time waiting for manual approval`});j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.status`,{unit:`{status}`,description:`1 = online, 0 = offline`}).addCallback(e=>{e.observe(K.getConnectivityStats().isOnline?1:0)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures`,{unit:`{failure}`,description:`Current consecutive connectivity failure count`}).addCallback(e=>{e.observe(K.getConnectivityStats().consecutiveFailures)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.models.available`,{unit:`{model}`,description:`Number of available models`}).addCallback(e=>{e.observe(S.models?.data.length??0)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.completion_logger.pending`,{unit:`{callback}`,description:`Number of pending completion callbacks`}).addCallback(e=>{e.observe(T.completionCallbacks.size)}),j.createObservableGauge(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.uptime`,{unit:`s`,description:`Server uptime in seconds`}).addCallback(e=>{e.observe((Date.now()-D)/1e3)});function V(e,t,n,r){let i=s.getActiveSpan(),a=i?.spanContext();pe.emit({severityNumber:e,severityText:t,body:n,attributes:{...r,...a&&{"trace.id":a.traceId,"span.id":a.spanId}}})}function H(e,t=``){let n={};if(e==null)return n;if(typeof e!=`object`)return(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)&&t&&(n[t]=e),n;if(Array.isArray(e))return t&&(n[t]=JSON.stringify(e)),n;for(let[r,i]of Object.entries(e)){let e=t?`${t}.${r}`:r;if(i===void 0||typeof i==`function`)continue;i===null?n[e]=`null`:typeof i==`object`&&!Array.isArray(i)?Object.assign(n,H(i,e)):Array.isArray(i)?n[e]=JSON.stringify(i):(typeof i==`string`||typeof i==`number`||typeof i==`boolean`)&&(n[e]=i)}return n}const U=new Set([`authorization`,`cookie`,`set-cookie`,`x-\u0068\u006f\u006e\u0065\u0079\u0063\u006f\u006d\u0062-team`,`x-api-key`,`proxy-authorization`]);function W(e,t,n){for(let[r,i]of Object.entries(n)){let n=r.toLowerCase();if(U.has(n))continue;e.setAttribute(`http.${t}.header.${n}`,i)}}function je(e,t){t.headers.forEach((t,n)=>{let r=n.toLowerCase();U.has(r)||e.setAttribute(`http.response.header.${r}`,t)})}async function G(e){let{spanName:t,url:n,target:r,method:o=`GET`,headers:s,body:c,signal:l,extraAttributes:u}=e,d=A.startSpan(t,{kind:i.CLIENT,attributes:{"http.method":o,"url.full":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.target":r,...u}});s&&W(d,`request`,s);try{let e=await fetch(n,{method:o,headers:s,body:c,signal:l});return d.setAttribute(`http.response.status_code`,e.status),je(d,e),z.add(1,{target:r,status_code:String(e.status)}),e.ok||d.setStatus({code:a.ERROR,message:`HTTP ${e.status}`}),{response:e,span:d}}catch(e){let t=e instanceof Error?e:Error(String(e));throw d.setStatus({code:a.ERROR,message:t.message}),d.recordException(t),d.end(),e}}async function Me(e){let{spanName:t,url:n,target:r,method:o=`POST`,headers:s,body:c,signal:l,headersTimeout:u,bodyTimeout:d,extraAttributes:f}=e,p=A.startSpan(t,{kind:i.CLIENT,attributes:{"http.method":o,"url.full":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.target":r,...f}});W(p,`request`,s);try{let{statusCode:e,headers:t,body:i}=await re(n,{method:o,headers:s,body:c,signal:l,headersTimeout:u,bodyTimeout:d});p.setAttribute(`http.response.status_code`,e);for(let[e,n]of Object.entries(t)){let t=e.toLowerCase();n!==void 0&&!U.has(t)&&p.setAttribute(`http.response.header.${t}`,Array.isArray(n)?n.join(`, `):n)}return z.add(1,{target:r,status_code:String(e)}),e>=400&&p.setStatus({code:a.ERROR,message:`HTTP ${e}`}),{statusCode:e,headers:t,body:i,span:p}}catch(e){let t=e instanceof Error?e:Error(String(e));throw p.setStatus({code:a.ERROR,message:t.message}),p.recordException(t),p.end(),e}}var Ne=class extends EventTarget{isOnline=!0;lastChecked=new Date().toISOString();consecutiveFailures=0;lastErrorType;lastErrorMessage;lastSuccessfulEndpoint;endpointFailureStats={};checkInterval;abortController;on(e,t){return this.addEventListener(e,t),this}off(e,t){return this.removeEventListener(e,t),this}start(){if(!S.connectivity.enabled){e.debug(`Connectivity monitoring disabled`);return}e.info(`Starting connectivity monitor`,{probeEndpoints:S.connectivity.probeEndpoints,fastInterval:S.connectivity.fastProbeInterval}),this.scheduleNextCheck()}stop(){e.debug(`Stopping connectivity monitor`),this.checkInterval&&=(clearTimeout(this.checkInterval),void 0),this.abortController&&=(this.abortController.abort(),void 0)}scheduleNextCheck(){this.checkInterval&&clearTimeout(this.checkInterval);let t=this.isOnline?S.connectivity.slowProbeInterval:S.connectivity.fastProbeInterval,n=Math.random()*S.connectivity.jitterMaxMs,r=t+n;this.checkInterval=setTimeout(()=>{this.performConnectivityCheck().catch(t=>{e.error(`Connectivity check failed:`,t)})},r)}async performConnectivityCheck(){let t=A.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.probe`);this.abortController=new AbortController;let n=setTimeout(()=>this.abortController?.abort(),S.connectivity.timeoutMs);try{let n=!1;for(let t of S.connectivity.probeEndpoints)try{let e=performance.now(),r=await fetch(t,{method:`HEAD`,signal:this.abortController.signal,headers:{"User-Agent":`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api-connectivity-monitor/1.0`,...S.connectivity.dnsCache&&{"Cache-Control":`max-age=300`}}}),i=performance.now()-e;if(r.ok){n=!0,this.lastSuccessfulEndpoint=t,B.record(i,{endpoint:t,result:`success`});break}B.record(i,{endpoint:t,result:`failed`})}catch(n){this.endpointFailureStats[t]=(this.endpointFailureStats[t]||0)+1,e.debug(`Probe failed for ${t}:`,n)}this.updateConnectivityState(n),t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.result`,n?`online`:`offline`),t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures`,this.consecutiveFailures),this.lastSuccessfulEndpoint&&t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.successful_endpoint`,this.lastSuccessfulEndpoint),ve.add(1,{result:n?`online`:`offline`})}catch(e){this.handleConnectivityError(e)}finally{clearTimeout(n),t.end(),this.scheduleNextCheck()}}updateConnectivityState(t){let n=this.isOnline;if(this.isOnline=t,this.lastChecked=new Date().toISOString(),t){let t=this.consecutiveFailures;this.consecutiveFailures>0&&e.info(`Connectivity restored after ${this.consecutiveFailures} failures`),this.consecutiveFailures=0,this.lastErrorType=void 0,this.lastErrorMessage=void 0,n||(this.dispatchEvent(new CustomEvent(`online`)),R.add(1,{from:`offline`,to:`online`}),V(c.INFO,`INFO`,`Connectivity restored`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures_before_recovery":t}))}else this.consecutiveFailures++,n&&(e.warn(`Connectivity lost`),this.dispatchEvent(new CustomEvent(`offline`)),R.add(1,{from:`online`,to:`offline`}),V(c.WARN,`WARN`,`Connectivity lost`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.connectivity.consecutive_failures":this.consecutiveFailures}))}handleConnectivityError(t){this.lastErrorType=t.name,this.lastErrorMessage=t.message,e.error(`Connectivity check failed:`,t),this.updateConnectivityState(!1)}getConnectivityStats(){return{isOnline:this.isOnline,lastChecked:this.lastChecked,consecutiveFailures:this.consecutiveFailures,lastErrorType:this.lastErrorType,lastErrorMessage:this.lastErrorMessage}}getPerformanceStats(){let e=this.isOnline?S.connectivity.slowProbeInterval:S.connectivity.fastProbeInterval,t=new Date(Date.now()+e+Math.random()*S.connectivity.jitterMaxMs).toISOString();return{currentInterval:e,nextCheckEstimate:t,lastSuccessfulEndpoint:this.lastSuccessfulEndpoint,endpointFailureStats:{...this.endpointFailureStats},jitterEnabled:S.connectivity.jitterMaxMs>0,connectionPooling:S.connectivity.connectionPooling,dnsCache:S.connectivity.dnsCache}}};const K=new Ne,q=()=>({"content-type":`application/json`,accept:`application/json`}),J=`0.39.2026030604`,Y=`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-chat/${J}`,X=`\u0047\u0069\u0074\u0048\u0075\u0062\u0043\u006f\u0070\u0069\u006c\u006f\u0074Chat/${J}`,Pe=e=>{let t=ie(`sha256`);return t.update(process.platform),t.update(process.arch),t.update(process.env.USER||process.env.USERNAME||`anonymous`),t.update(n.hostname()),t.update(e),t.update(Date.now().toString()),t.update(g(16)),t.digest(`hex`)},Fe=e=>{let t=e.replaceAll(/[^\w.-]/g,`_`).trim();if(t.length===0||t===`.`||t===`..`||/^[_.]+$/.test(t))throw Error(`Invalid \u0047\u0069\u0074\u0048\u0075\u0062 username: cannot be empty or consist only of special characters after sanitization`);return`${y.MACHINE_ID_PATH}_${t}`},Ie=async e=>{let n=Fe(e);try{let e=await t.readFile(n,`utf8`);if(e.trim())return e.trim()}catch{}let r=Pe(e);return await t.writeFile(n,r),await t.chmod(n,384),r},Le=async()=>{try{let e=await t.readFile(y.SESSION_ID_PATH,`utf8`);if(e.trim())return e.trim()}catch{}let e=_();return await t.writeFile(y.SESSION_ID_PATH,e),await t.chmod(y.SESSION_ID_PATH,384),e},Re=async(e,t)=>{e.machineId||=await Ie(t),e.sessionId||=await Le()},ze=e=>e.accountType===`individual`?`https://api.\u0067\u0069\u0074\u0068\u0075\u0062\u0063\u006f\u0070\u0069\u006c\u006f\u0074.com`:`https://api.${e.accountType}.\u0067\u0069\u0074\u0068\u0075\u0062\u0063\u006f\u0070\u0069\u006c\u006f\u0074.com`,Z=(e,t=!1)=>{if(!e.machineId||!e.sessionId)throw Error(`\u0056\u0053\u0043\u006f\u0064\u0065 identifiers not initialized. Call initialize\u0056\u0053\u0043\u006f\u0064\u0065Identifiers() during startup.`);let n=_(),r={Authorization:`Bearer ${e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074Token}`,"Content-Type":`application/json`,accept:`*/*`,"accept-encoding":`br, gzip, deflate`,"accept-language":`*`,"sec-fetch-mode":`cors`,"\u0043\u006f\u0070\u0069\u006c\u006f\u0074-Integration-Id":`\u0076\u0073\u0063\u006f\u0064\u0065-chat`,"Editor-Version":`\u0076\u0073\u0063\u006f\u0064\u0065/${e.\u0076\u0073\u0043\u006f\u0064\u0065Version}`,"Editor-Plugin-Version":Y,"User-Agent":X,"\u0056\u0053\u0063\u006f\u0064\u0065-MachineId":e.machineId,"\u0056\u0053\u0063\u006f\u0064\u0065-SessionId":e.sessionId,"\u004f\u0070\u0065\u006e\u0041\u0049-Intent":`conversation-agent`,"X-Interaction-Type":`conversation-agent`,"X-Agent-Task-Id":n,"X-\u0056\u0053\u0043\u006f\u0064\u0065-User-Agent-Library-Version":`node-fetch`,"X-\u0047\u0069\u0074\u0048\u0075\u0062-Api-Version":`2025-05-01`,"X-Interaction-Id":_(),"X-Request-Id":n};return t&&(r[`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-vision-request`]=`true`),r},Q=`https://api.\u0067\u0069\u0074\u0068\u0075\u0062.com`,Be=e=>({...q(),authorization:`token ${e.\u0067\u0069\u0074\u0068\u0075\u0062Token}`,"editor-version":`\u0076\u0073\u0063\u006f\u0064\u0065/${e.\u0076\u0073\u0043\u006f\u0064\u0065Version}`,"editor-plugin-version":Y,"user-agent":X,"x-\u0067\u0069\u0074\u0068\u0075\u0062-api-version":`2025-04-01`,"x-\u0076\u0073\u0063\u006f\u0064\u0065-user-agent-library-version":`node-fetch`}),Ve=`https://\u0067\u0069\u0074\u0068\u0075\u0062.com`,He=`\u0030\u0031\u0061\u0062\u0038\u0061\u0063\u0039\u0034\u0030\u0030\u0063\u0034\u0065\u0034\u0032\u0039\u0062\u0032\u0033`,Ue=[`user:email`].join(` `);var $=class extends Error{response;constructor(e,t){super(e),this.response=t}};async function We(t,n){let r=s.getActiveSpan();if(n instanceof $&&n.response.status===429){let e=t.get(`requestId`),i=T.completionCallbacks.get(e);i&&(T.logRateLimit(i,n.response),T.completionCallbacks.delete(e)),P.add(1,{action:`rejected`,source:`upstream`});let o=await n.response.text(),s;try{s=JSON.parse(o)}catch{s={error:{message:o,type:`error`}}}return r?.setStatus({code:a.ERROR,message:`Rate limited by upstream`}),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,`rate_limit_upstream`),V(c.WARN,`WARN`,`Upstream rate limit hit`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":429,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":`rate_limit_upstream`}),t.json(s,429)}if(e.error(`Error occurred:`,n),n instanceof $){let i=await n.response.text(),o;try{o=JSON.parse(i)}catch{o=i}return e.error(`HTTP error:`,o),r?.setStatus({code:a.ERROR,message:n.message}),r?.recordException(n),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,`HTTPError`),V(c.ERROR,`ERROR`,`HTTP error: ${n.message}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":n.response.status,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":`HTTPError`}),t.json({error:{message:i,type:`error`}},n.response.status)}let i=n instanceof Error?n:Error(String(n));return r?.setStatus({code:a.ERROR,message:i.message}),r?.recordException(i),r?.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type`,i.name),V(c.ERROR,`ERROR`,`Unhandled error: ${i.message}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.status_code":500,"http.path":t.req.path,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.error_type":i.name}),t.json({error:{message:i.message,type:`error`}},500)}async function Ge(){let e=`${Q}/user`,t=S.timeoutMs,n=new AbortController,r=setTimeout(()=>n.abort(),t);try{let{response:t,span:r}=await G({spanName:`\u0067\u0069\u0074\u0068\u0075\u0062 GET /user`,url:e,target:`\u0067\u0069\u0074\u0068\u0075\u0062_user`,headers:{authorization:`token ${S.\u0067\u0069\u0074\u0068\u0075\u0062Token}`,...q()},signal:n.signal});if(!t.ok)throw r.end(),new $(`Failed to get \u0047\u0069\u0074\u0048\u0075\u0062 user`,t);let i=await t.json();return r.end(),i}finally{clearTimeout(r)}}export{T as _c1,x as DEFAULT_TIMEOUT_MS,Q as _g1,Ue as _g4,Ve as _g2,He as _g3,$ as HTTPError,y as PATHS,U as SENSITIVE_HEADERS,c as SeverityNumber,be as approvalCounter,Ae as approvalWaitHistogram,N as cachedTokensCounter,ke as chunksPerRequestHistogram,K as connectivityMonitor,ze as _s1,Se as copilotDurationHistogram,Z as _s2,V as emitLog,ce as ensurePaths,he as errorsCounter,H as flattenAttributes,We as _c2,Ge as _s4,Be as _s3,de as initOtel,Re as _s5,ge as inputTokensCounter,De as inputTokensPerRequestHistogram,I as modelMappingCounter,F as modelValidationErrorCounter,M as outputTokensCounter,Oe as outputTokensPerRequestHistogram,P as rateLimitCounter,we as rateLimitWaitHistogram,xe as requestDurationHistogram,me as requestsCounter,fe as shutdownOtel,q as _c3,S as state,ye as streamChunksCounter,Ce as streamDurationHistogram,L as tokenRefreshAttemptCounter,Ee as tokenRefreshDurationHistogram,_e as tokenRefreshFailureCounter,G as tracedFetch,Me as tracedUndiciRequest,A as tracer,Te as translationDurationHistogram};
|
package/dist/main.js
CHANGED
|
@@ -8,15 +8,15 @@ Paths:
|
|
|
8
8
|
- APP_DIR: ${e.paths.APP_DIR}
|
|
9
9
|
- \u0047\u0049\u0054\u0048\u0055\u0042_TOKEN_PATH: ${e.paths.\u0047\u0049\u0054\u0048\u0055\u0042_TOKEN_PATH}
|
|
10
10
|
|
|
11
|
-
Token exists: ${e.tokenExists?`Yes`:`No`}`)}function at(e){console.log(JSON.stringify(e,null,2))}async function ot(e){let t=await rt();e.json?at(t):it(t)}const st=T({meta:{name:`debug`,description:`Print debug information about the application`},args:{json:{type:`boolean`,default:!1,description:`Output debug information as JSON`}},run({args:e}){return ot({json:e.json})}});function ct(){let{platform:e,ppid:t,env:n}=A;if(e===`win32`){try{let e=`wmic process get ParentProcessId,Name | findstr "${t}"`,n=je(e,{stdio:`pipe`}).toString();if(n.toLowerCase().includes(`powershell.exe`))return`powershell`}catch{return`cmd`}return`cmd`}else{let e=n.SHELL;if(e){if(e.endsWith(`zsh`))return`zsh`;if(e.endsWith(`fish`))return`fish`;if(e.endsWith(`bash`))return`bash`}return`sh`}}function lt(e,t=``){let n=ct(),r=Object.entries(e).filter(([,e])=>e!==void 0),i;switch(n){case`powershell`:i=r.map(([e,t])=>`$env:${e} = ${t}`).join(`; `);break;case`cmd`:i=r.map(([e,t])=>`set ${e}=${t}`).join(` & `);break;case`fish`:i=r.map(([e,t])=>`set -gx ${e} ${t}`).join(`; `);break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(` `);i=r.length>0?`export ${e}`:``;break}}if(i&&t){let e=n===`cmd`?` & `:` && `;return`${i}${e}${t}`}return i||t}function ut(){return`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}function dt(e){return e.includes(`/messages`)?`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`:e.includes(`/chat/completions`)?`\u006f\u0070\u0065\u006e\u0061\u0069`:e.includes(`/embeddings`)?`embeddings`:e.includes(`/models`)?`models`:e.includes(`/usage`)?`usage`:e.includes(`/token`)?`token`:`unknown`}function ft(){return async(t,n)=>{let r=Date.now(),i=ut(),a=t.req.method,o=t.req.path,s=dt(o);t.set(`requestId`,i),t.header(`x-request-id`,i);let l=w.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.handle_request`,{kind:O.SERVER,attributes:{"http.method":a,"http.url":t.req.url,"http.route":o,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request_id":i,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.endpoint_type":s}});for(let[e,n]of Object.entries(t.req.header())){let t=e.toLowerCase();if(c.has(t))continue;l.setAttribute(`http.request.header.${t}`,n)}let u=De.setSpan(Ee.active(),l);await Ee.with(u,async()=>{e.registerCompletion(i,t,r);try{await n()}catch(e){let t=e instanceof Error?e:Error(String(e));throw l.setStatus({code:k.ERROR,message:t.message}),l.recordException(t),e}});let d=Date.now()-r,p=t.get(`requestData`),m=t.res.status,h=p?.model??`unknown`,g=p?.streaming??!1;if(l.setAttribute(`http.status_code`,m),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model`,h),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming`,g),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.duration_ms`,d),p?.copilotDuration&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_duration_ms`,p.copilotDuration),p?.tokenUsage){let e=p.tokenUsage;l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens`,e.inputTokens),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens`,e.outputTokens),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.total_tokens`,e.totalTokens),e.cachedTokens&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.cached_tokens`,e.cachedTokens),e.estimatedCost&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.estimated_cost`,e.estimatedCost)}t.res.headers.forEach((e,t)=>{let n=t.toLowerCase();c.has(n)||l.setAttribute(`http.response.header.${n}`,e)}),m>=400&&l.setStatus({code:k.ERROR,message:`HTTP ${m}`}),l.end();let _={method:a,path:o,status_code:String(m),model:h,streaming:String(g),endpoint_type:s};if(me.add(1,_),pe.record(d,_),m>=400&&ee.add(1,{method:a,path:o,status_code:String(m),error_type:m>=500?`server_error`:`client_error`}),p?.tokenUsage){let e=p.tokenUsage,t={model:h,endpoint_type:s};e.inputTokens&&(ae.add(e.inputTokens,t),oe.record(e.inputTokens,t)),e.outputTokens&&(le.add(e.outputTokens,t),ue.record(e.outputTokens,t)),e.cachedTokens&&f.add(e.cachedTokens,{model:h})}p?.tokenUsage&&e.executeCompletion(i)}}const pt=async()=>w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.await`,async e=>{let t=performance.now();try{let n=await E.prompt(`Accept incoming request?`,{type:`confirm`}),r=performance.now()-t;if(e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration_ms`,r),d.record(r),!n)throw e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`rejected`),u.add(1,{result:`rejected`}),new o(`Request rejected`,Response.json({message:`Request rejected`},{status:403}));e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`approved`),u.add(1,{result:`approved`})}finally{e.end()}}),mt={input:3e-6,output:15e-6};function z(e){let t=e.prompt_tokens||0,n=e.completion_tokens||0,r=e.total_tokens||t+n,i=t*mt.input+n*mt.output;return{inputTokens:t,outputTokens:n,totalTokens:r,estimatedCost:i,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}const ht=[{pattern:/haiku/i,family:`haiku`},{pattern:/sonnet[.-]?4[.-]6/i,family:`sonnet-4.6`},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:`sonnet-4.5`},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:`sonnet-4`},{pattern:/opus[.-]?4[.-]6/i,family:`opus-4.6`},{pattern:/opus[.-]?4[.-]5/i,family:`opus-4.5`},{pattern:/opus/i,family:`opus`}],gt={haiku:`\u0063\u006c\u0061\u0075\u0064\u0065-haiku-4.5`,"sonnet-4.6":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4.6`,"sonnet-4.5":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4.5`,"sonnet-4":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4`,"opus-4.6":`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.6`,"opus-4.5":`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.5`,opus:`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.5`};function _t(e){return e.startsWith(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/`)?e.slice(10):e}function vt(e){let t=e.lastIndexOf(`[`),n=e.lastIndexOf(`]`);return t!==-1&&n===e.length-1&&n>t?[e.slice(0,t),e.slice(t+1,n)]:[e,null]}function yt(e){for(let t of ht)if(t.pattern.test(e))return t.family;return null}function bt(e,t,n=null){let r=gt[e];if(!r)return null;if(n){let e=`${r}-${n}`;if(t.includes(e))return e}if(t.includes(r))return r;if(e===`sonnet-4.5`){let e=[`\u0063\u006c\u0061\u0075\u0064\u0065-3.5-sonnet`];for(let r of e){let e=n?`${r}-${n}`:r;if(t.includes(e))return e}}return null}function xt(e,t){let n=_t(e),[r,i]=vt(n);if(t.includes(n))return n;if(i){let e=`${r}-${i}`,n=e.replaceAll(/(\d)-(\d)\b/g,`$1.$2`);if(t.includes(n))return n}let a=yt(r);if(!a)return null;let o=r.replace(/-\d{8}(?::.*)?$/,``),s=i?`-${i}`:``;for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,``),n=`${o}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,`$1.$2`),r=t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,`$1.$2`);if(r===n)return e}return bt(a,t,i)}var B=class extends Error{statusCode;constructor(e,t=400){super(e),this.name=`ModelValidationError`,this.statusCode=t}};function V(e){if(!e||typeof e!=`string`)throw new B(`Model name is required and must be a string`);if(!S.models?.data)throw new B(`Models not available. Please try again later.`,503);let t=S.models.data.map(e=>e.id),n=xt(e,t);if(!n)throw ce.add(1,{requested_model:e}),new B(`Invalid model: '${e}'. Available services: ${t.join(`, `)}`);return n}async function St(e){if(e.rateLimitSeconds===void 0)return;let t=e.rateLimitSeconds;return w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.check`,async n=>{try{let r=Date.now();if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.configured_seconds`,t),!e.lastRequestTimestamp){e.lastRequestTimestamp=r,n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`allowed`);return}let i=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.elapsed_seconds`,i),i>t){e.lastRequestTimestamp=r,n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`allowed`);return}let a=Math.ceil(t-i);if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_seconds`,a),!e.rateLimitWait)throw n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`rejected`),de.add(1,{action:`rejected`,source:`local`}),E.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new o(`Rate limit exceeded`,Response.json({message:`Rate limit exceeded`},{status:429}));let s=a*1e3;n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`waited`),de.add(1,{action:`waited`,source:`local`}),fe.record(s,{source:`local`}),E.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await N(s),e.lastRequestTimestamp=r,E.info(`Rate limit wait completed, proceeding with request`)}finally{n.end()}})}function Ct(e){let t=e,n=String.fromCodePoint(27),r=t.split(n);if(r.length>1){t=r[0];for(let e=1;e<r.length;e++){let i=r[e],a=i.match(/^\[[0-9;]*[a-z]/i);t+=a?i.slice(a[0].length):n+i}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,``).replaceAll(/[\u2060-\u2064]/g,``).replaceAll(/[\u206A-\u206F]/g,``).replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,``).replaceAll(/[\uFFF0-\uFFFF]/g,``).replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,``)}function H(e){if(typeof e==`string`)return Ct(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 wt=async e=>{if(!S.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={..._(S,n),"X-Initiator":r?`agent`:`user`},a=`${h(S)}/chat/completions`,s=S.timeoutMs,c=new AbortController,l=setTimeout(()=>c.abort(),s);try{let{statusCode:e,headers:l,body:u,span:d}=await Se({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /chat/completions`,url:a,target:`chat_completions`,headers:i,body:JSON.stringify(t),signal:c.signal,headersTimeout:s,bodyTimeout:s*3,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":t.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming":!!t.stream,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.timeout_ms":s,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.has_tools":!!t.tools?.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tool_count":t.tools?.length??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.message_count":t.messages.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.max_tokens":t.max_tokens??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.vision_enabled":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.initiator":r?`agent`:`user`}}),f=new Response(u,{status:e,headers:l});if(!f.ok)throw d.end(),new o(`Failed to create chat completions`,f);if(t.stream)return d.end(),Ne(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 Tt(e){return w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.validate`,t=>{try{t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.requested`,e.model);let n=V(e.model);return t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,n),n===e.model?(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),e):(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),se.add(1,{from_model:e.model,to_model:n}),E.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}async function Et(t){await St(S);let n=await t.req.json();E.debug(`Request payload:`,JSON.stringify(n).slice(-400));try{n=Tt(n)}catch(e){if(e instanceof B)return t.json({error:{message:e.message,type:`invalid_request_error`,code:`invalid_model`}},e.statusCode);throw e}if(t.set(`requestData`,{model:n.model,streaming:!!n.stream}),S.manualApprove&&await pt(),Ve(n.max_tokens)){let e=S.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},E.debug(`Set max_tokens to:`,JSON.stringify(n.max_tokens))}let r=performance.now(),i=await wt(n),a=performance.now()-r;if(g.record(a,{model:n.model,target:`chat_completions`,streaming:String(!!n.stream)}),Dt(i)){let e=t.get(`requestData`)||{};return i.usage&&(e.tokenUsage=z(i.usage)),e.copilotDuration=a,t.set(`requestData`,e),E.debug(`Non-streaming response:`,JSON.stringify(i)),t.json(i)}return M(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=z(o),e.copilotDuration=a,t.set(`requestData`,e)}if(n.usage?.prompt_tokens_details?.cached_tokens!==void 0){let t={...n,usage:{...n.usage,prompt_tokens_details:void 0}};i={...e,data:JSON.stringify(t)}}}catch{}}await r.writeSSE(i)}let l=performance.now()-c,u={model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`};if(ve.record(l,u),p.record(s,u),o){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=z(o),e.copilotDuration=a,t.set(`requestData`,e))}let d=t.get(`requestId`);d&&e.executeCompletion(d)})}const Dt=e=>Object.hasOwn(e,`choices`),U=new j;U.post(`/`,async e=>{try{return await Et(e)}catch(t){return await x(e,t)}});const Ot=async e=>{if(!S.copilotToken)throw Error(`Service token not found`);let t=`${h(S)}/embeddings`,n=_(S),r=S.timeoutMs,i=new AbortController,a=setTimeout(()=>i.abort(),r);try{let{response:r,span:a}=await C({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /embeddings`,url:t,target:`embeddings`,method:`POST`,headers:n,body:JSON.stringify(e),signal:i.signal,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":e.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_count":Array.isArray(e.input)?e.input.length:1}});if(!r.ok)throw a.end(),new o(`Failed to create embeddings`,r);let s=await r.json();return a.end(),s}finally{clearTimeout(a)}},W=new j;W.post(`/`,async e=>{try{let t=await e.req.json();try{V(t.model)}catch(t){if(t instanceof B)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 Ot(t),i=performance.now()-n;g.record(i,{model:t.model,target:`embeddings`,streaming:`false`});let a=e.get(`requestData`)||{};return a.tokenUsage=z(r.usage),a.copilotDuration=i,e.set(`requestData`,a),e.json(r)}catch(t){return await x(e,t)}});const kt=new Pe(Ie),At=Fe[`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4`].tokens,G={...At,baseOverhead:4,perTool:27};function K(e){return kt.encode(e).length}async function jt(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:`invalid_request_error`,message:`Invalid JSON`}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:`invalid_request_error`,message:`messages is required`}},400);let n=G.baseOverhead;if(t.system){let e=typeof t.system==`string`?t.system:t.system.map(e=>e.text).join(`
|
|
11
|
+
Token exists: ${e.tokenExists?`Yes`:`No`}`)}function at(e){console.log(JSON.stringify(e,null,2))}async function ot(e){let t=await rt();e.json?at(t):it(t)}const st=T({meta:{name:`debug`,description:`Print debug information about the application`},args:{json:{type:`boolean`,default:!1,description:`Output debug information as JSON`}},run({args:e}){return ot({json:e.json})}});function ct(){let{platform:e,ppid:t,env:n}=A;if(e===`win32`){try{let e=`wmic process get ParentProcessId,Name | findstr "${t}"`,n=je(e,{stdio:`pipe`}).toString();if(n.toLowerCase().includes(`powershell.exe`))return`powershell`}catch{return`cmd`}return`cmd`}else{let e=n.SHELL;if(e){if(e.endsWith(`zsh`))return`zsh`;if(e.endsWith(`fish`))return`fish`;if(e.endsWith(`bash`))return`bash`}return`sh`}}function lt(e,t=``){let n=ct(),r=Object.entries(e).filter(([,e])=>e!==void 0),i;switch(n){case`powershell`:i=r.map(([e,t])=>`$env:${e} = ${t}`).join(`; `);break;case`cmd`:i=r.map(([e,t])=>`set ${e}=${t}`).join(` & `);break;case`fish`:i=r.map(([e,t])=>`set -gx ${e} ${t}`).join(`; `);break;default:{let e=r.map(([e,t])=>`${e}=${t}`).join(` `);i=r.length>0?`export ${e}`:``;break}}if(i&&t){let e=n===`cmd`?` & `:` && `;return`${i}${e}${t}`}return i||t}function ut(){return`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}function dt(e){return e.includes(`/messages`)?`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`:e.includes(`/chat/completions`)?`\u006f\u0070\u0065\u006e\u0061\u0069`:e.includes(`/embeddings`)?`embeddings`:e.includes(`/models`)?`models`:e.includes(`/usage`)?`usage`:e.includes(`/token`)?`token`:`unknown`}function ft(){return async(t,n)=>{let r=Date.now(),i=ut(),a=t.req.method,o=t.req.path,s=dt(o);t.set(`requestId`,i),t.header(`x-request-id`,i);let l=w.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.handle_request`,{kind:O.SERVER,attributes:{"http.method":a,"http.url":t.req.url,"http.route":o,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request_id":i,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.endpoint_type":s}});for(let[e,n]of Object.entries(t.req.header())){let t=e.toLowerCase();if(c.has(t))continue;l.setAttribute(`http.request.header.${t}`,n)}let u=De.setSpan(Ee.active(),l);await Ee.with(u,async()=>{e.registerCompletion(i,t,r);try{await n()}catch(e){let t=e instanceof Error?e:Error(String(e));throw l.setStatus({code:k.ERROR,message:t.message}),l.recordException(t),e}});let d=Date.now()-r,p=t.get(`requestData`),m=t.res.status,h=p?.model??`unknown`,g=p?.streaming??!1;if(l.setAttribute(`http.status_code`,m),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model`,h),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming`,g),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.duration_ms`,d),p?.copilotDuration&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_duration_ms`,p.copilotDuration),p?.tokenUsage){let e=p.tokenUsage;l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens`,e.inputTokens),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens`,e.outputTokens),l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.total_tokens`,e.totalTokens),e.cachedTokens&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.cached_tokens`,e.cachedTokens),e.estimatedCost&&l.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.estimated_cost`,e.estimatedCost)}t.res.headers.forEach((e,t)=>{let n=t.toLowerCase();c.has(n)||l.setAttribute(`http.response.header.${n}`,e)}),m>=400&&l.setStatus({code:k.ERROR,message:`HTTP ${m}`}),l.end();let _={method:a,path:o,status_code:String(m),model:h,streaming:String(g),endpoint_type:s};if(me.add(1,_),pe.record(d,_),m>=400&&ee.add(1,{method:a,path:o,status_code:String(m),error_type:m>=500?`server_error`:`client_error`}),p?.tokenUsage){let e=p.tokenUsage,t={model:h,endpoint_type:s};e.inputTokens&&(ae.add(e.inputTokens,t),oe.record(e.inputTokens,t)),e.outputTokens&&(le.add(e.outputTokens,t),ue.record(e.outputTokens,t)),e.cachedTokens&&f.add(e.cachedTokens,{model:h})}p?.tokenUsage&&e.executeCompletion(i)}}const pt=async()=>w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.await`,async e=>{let t=performance.now();try{let n=await E.prompt(`Accept incoming request?`,{type:`confirm`}),r=performance.now()-t;if(e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration_ms`,r),d.record(r),!n)throw e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`rejected`),u.add(1,{result:`rejected`}),new o(`Request rejected`,Response.json({message:`Request rejected`},{status:403}));e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`approved`),u.add(1,{result:`approved`})}finally{e.end()}}),mt={input:3e-6,output:15e-6};function z(e){let t=e.prompt_tokens||0,n=e.completion_tokens||0,r=e.total_tokens||t+n,i=t*mt.input+n*mt.output;return{inputTokens:t,outputTokens:n,totalTokens:r,estimatedCost:i,cachedTokens:e.prompt_tokens_details?.cached_tokens,acceptedPredictionTokens:e.completion_tokens_details?.accepted_prediction_tokens,rejectedPredictionTokens:e.completion_tokens_details?.rejected_prediction_tokens}}function B(e,t){t.prompt_tokens!==void 0&&e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens`,t.prompt_tokens),t.completion_tokens!==void 0&&e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens`,t.completion_tokens),t.total_tokens!==void 0&&e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.total_tokens`,t.total_tokens)}const ht=[{pattern:/haiku/i,family:`haiku`},{pattern:/sonnet[.-]?4[.-]6/i,family:`sonnet-4.6`},{pattern:/(sonnet-4[.-]5|[.-]?3[.-]5[.-]?sonnet|[.-]?3[.-]7[.-]?sonnet)/i,family:`sonnet-4.5`},{pattern:/sonnet-4(?![.-]5|[.-]6|[.-]1)/i,family:`sonnet-4`},{pattern:/opus[.-]?4[.-]6/i,family:`opus-4.6`},{pattern:/opus[.-]?4[.-]5/i,family:`opus-4.5`},{pattern:/opus/i,family:`opus`}],gt={haiku:`\u0063\u006c\u0061\u0075\u0064\u0065-haiku-4.5`,"sonnet-4.6":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4.6`,"sonnet-4.5":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4.5`,"sonnet-4":`\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4`,"opus-4.6":`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.6`,"opus-4.5":`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.5`,opus:`\u0063\u006c\u0061\u0075\u0064\u0065-opus-4.5`};function _t(e){return e.startsWith(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/`)?e.slice(10):e}function vt(e){let t=e.lastIndexOf(`[`),n=e.lastIndexOf(`]`);return t!==-1&&n===e.length-1&&n>t?[e.slice(0,t),e.slice(t+1,n)]:[e,null]}function yt(e){for(let t of ht)if(t.pattern.test(e))return t.family;return null}function bt(e,t,n=null){let r=gt[e];if(!r)return null;if(n){let e=`${r}-${n}`;if(t.includes(e))return e}if(t.includes(r))return r;if(e===`sonnet-4.5`){let e=[`\u0063\u006c\u0061\u0075\u0064\u0065-3.5-sonnet`];for(let r of e){let e=n?`${r}-${n}`:r;if(t.includes(e))return e}}return null}function xt(e,t){let n=_t(e),[r,i]=vt(n);if(t.includes(n))return n;if(i){let e=`${r}-${i}`,n=e.replaceAll(/(\d)-(\d)\b/g,`$1.$2`);if(t.includes(n))return n}let a=yt(r);if(!a)return null;let o=r.replace(/-\d{8}(?::.*)?$/,``),s=i?`-${i}`:``;for(let e of t){let t=e.replace(/-\d{8}(?::.*)?$/,``),n=`${o}${s}`.toLowerCase().replaceAll(/(\d)-(\d)\b/g,`$1.$2`),r=t.toLowerCase().replaceAll(/(\d)-(\d)\b/g,`$1.$2`);if(r===n)return e}return bt(a,t,i)}var V=class extends Error{statusCode;constructor(e,t=400){super(e),this.name=`ModelValidationError`,this.statusCode=t}};function H(e){if(!e||typeof e!=`string`)throw new V(`Model name is required and must be a string`);if(!S.models?.data)throw new V(`Models not available. Please try again later.`,503);let t=S.models.data.map(e=>e.id),n=xt(e,t);if(!n)throw ce.add(1,{requested_model:e}),new V(`Invalid model: '${e}'. Available services: ${t.join(`, `)}`);return n}async function St(e){if(e.rateLimitSeconds===void 0)return;let t=e.rateLimitSeconds;return w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.check`,async n=>{try{let r=Date.now();if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.configured_seconds`,t),!e.lastRequestTimestamp){e.lastRequestTimestamp=r,n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`allowed`);return}let i=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.elapsed_seconds`,i),i>t){e.lastRequestTimestamp=r,n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`allowed`);return}let a=Math.ceil(t-i);if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_seconds`,a),!e.rateLimitWait)throw n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`rejected`),de.add(1,{action:`rejected`,source:`local`}),E.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new o(`Rate limit exceeded`,Response.json({message:`Rate limit exceeded`},{status:429}));let s=a*1e3;n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`waited`),de.add(1,{action:`waited`,source:`local`}),fe.record(s,{source:`local`}),E.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await N(s),e.lastRequestTimestamp=r,E.info(`Rate limit wait completed, proceeding with request`)}finally{n.end()}})}function Ct(e){let t=e,n=String.fromCodePoint(27),r=t.split(n);if(r.length>1){t=r[0];for(let e=1;e<r.length;e++){let i=r[e],a=i.match(/^\[[0-9;]*[a-z]/i);t+=a?i.slice(a[0].length):n+i}}return t.replaceAll(/[\u200B-\u200D\uFEFF]/g,``).replaceAll(/[\u2060-\u2064]/g,``).replaceAll(/[\u206A-\u206F]/g,``).replaceAll(/[\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g,``).replaceAll(/[\uFFF0-\uFFFF]/g,``).replaceAll(/[\x00-\x08\v\f\x0E-\x1F]/g,``)}function U(e){if(typeof e==`string`)return Ct(e);if(Array.isArray(e)){let t=e.map(e=>U(e));return t}if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=U(r);return t}return e}const wt=async e=>{if(!S.copilotToken)throw Error(`Service token not found`);let t=U(e),n=t.messages.some(e=>typeof e.content!=`string`&&e.content?.some(e=>e.type===`image_url`)),r=t.messages.some(e=>[`assistant`,`tool`].includes(e.role)),i={..._(S,n),"X-Initiator":r?`agent`:`user`},a=`${h(S)}/chat/completions`,s=S.timeoutMs,c=new AbortController,l=setTimeout(()=>c.abort(),s);try{let{statusCode:e,headers:l,body:u,span:d}=await Se({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /chat/completions`,url:a,target:`chat_completions`,headers:i,body:JSON.stringify(t),signal:c.signal,headersTimeout:s,bodyTimeout:s*3,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":t.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming":!!t.stream,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.timeout_ms":s,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.has_tools":!!t.tools?.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tool_count":t.tools?.length??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.message_count":t.messages.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.max_tokens":t.max_tokens??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.vision_enabled":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.initiator":r?`agent`:`user`}}),f=new Response(u,{status:e,headers:l});if(!f.ok)throw d.end(),new o(`Failed to create chat completions`,f);if(t.stream)return{events:Ne(f),span:d};let p=await f.json();return p.id&&d.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.response.id`,p.id),p.usage&&B(d,p.usage),d.end(),p}finally{clearTimeout(l)}};function Tt(e){return w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.validate`,t=>{try{t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.requested`,e.model);let n=H(e.model);return t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,n),n===e.model?(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),e):(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),se.add(1,{from_model:e.model,to_model:n}),E.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function Et(e,t){if(!e.data)return e;try{let n=JSON.parse(e.data);if(n.usage&&t(n.usage),n.usage?.prompt_tokens_details?.cached_tokens!==void 0)return{...e,data:JSON.stringify({...n,usage:{...n.usage,prompt_tokens_details:void 0}})}}catch{}return e}async function Dt(t){await St(S);let n=await t.req.json();E.debug(`Request payload:`,JSON.stringify(n).slice(-400));try{n=Tt(n)}catch(e){if(e instanceof V)return t.json({error:{message:e.message,type:`invalid_request_error`,code:`invalid_model`}},e.statusCode);throw e}if(t.set(`requestData`,{model:n.model,streaming:!!n.stream}),S.manualApprove&&await pt(),Ve(n.max_tokens)){let e=S.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},E.debug(`Set max_tokens to:`,JSON.stringify(n.max_tokens))}let r=performance.now(),i=await wt(n),a=performance.now()-r;if(g.record(a,{model:n.model,target:`chat_completions`,streaming:String(!!n.stream)}),Ot(i)){let e=t.get(`requestData`)||{};return i.usage&&(e.tokenUsage=z(i.usage)),e.copilotDuration=a,t.set(`requestData`,e),E.debug(`Non-streaming response:`,JSON.stringify(i)),t.json(i)}let{events:o,span:s}=i;return M(t,async r=>{let i={value:null},c=0,l=performance.now();try{for await(let e of o){let o=e;e.data&&e.data!==`[DONE]`&&(c++,_e.add(1,{model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`}),o=Et(e,e=>{i.value=e;let n=t.get(`requestData`)||{};n.tokenUsage=z(e),n.copilotDuration=a,t.set(`requestData`,n)})),await r.writeSSE(o)}let e=performance.now()-l,s={model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`};if(ve.record(e,s),p.record(c,s),i.value){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=z(i.value),e.copilotDuration=a,t.set(`requestData`,e))}}finally{i.value&&B(s,i.value),s.end()}let u=t.get(`requestId`);u&&e.executeCompletion(u)})}const Ot=e=>Object.hasOwn(e,`choices`),W=new j;W.post(`/`,async e=>{try{return await Dt(e)}catch(t){return await x(e,t)}});const kt=async e=>{if(!S.copilotToken)throw Error(`Service token not found`);let t=`${h(S)}/embeddings`,n=_(S),r=S.timeoutMs,i=new AbortController,a=setTimeout(()=>i.abort(),r);try{let{response:r,span:a}=await C({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /embeddings`,url:t,target:`embeddings`,method:`POST`,headers:n,body:JSON.stringify(e),signal:i.signal,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":e.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_count":Array.isArray(e.input)?e.input.length:1}});if(!r.ok)throw a.end(),new o(`Failed to create embeddings`,r);let s=await r.json();return a.end(),s}finally{clearTimeout(a)}},G=new j;G.post(`/`,async e=>{try{let t=await e.req.json();try{H(t.model)}catch(t){if(t instanceof V)return e.json({error:{message:t.message,type:`invalid_request_error`,code:`invalid_model`}},t.statusCode);throw t}e.set(`requestData`,{model:t.model});let n=performance.now(),r=await kt(t),i=performance.now()-n;g.record(i,{model:t.model,target:`embeddings`,streaming:`false`});let a=e.get(`requestData`)||{};return a.tokenUsage=z(r.usage),a.copilotDuration=i,e.set(`requestData`,a),e.json(r)}catch(t){return await x(e,t)}});const At=new Pe(Ie),jt=Fe[`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4`].tokens,K={...jt,baseOverhead:4,perTool:27};function q(e){return At.encode(e).length}async function Mt(e){let t;try{t=await e.req.json()}catch{return e.json({error:{type:`invalid_request_error`,message:`Invalid JSON`}},400)}if(!Array.isArray(t.messages))return e.json({error:{type:`invalid_request_error`,message:`messages is required`}},400);let n=K.baseOverhead;if(t.system){let e=typeof t.system==`string`?t.system:t.system.map(e=>e.text).join(`
|
|
12
12
|
|
|
13
|
-
`);n+=
|
|
13
|
+
`);n+=K.perMessage+q(e)*K.contentMultiplier}for(let e of t.messages)n+=K.perMessage,n+=q(e.role),typeof e.content==`string`?n+=q(e.content)*K.contentMultiplier:Array.isArray(e.content)&&(n+=Nt(e.content));return t.tools&&t.tools.length>0&&(n+=Pt(t.tools)),e.json({input_tokens:Math.round(n)})}function Nt(e){let t=0;for(let n of e)switch(n.type){case`text`:t+=q(n.text)*K.contentMultiplier;break;case`tool_use`:{let e=n.name+JSON.stringify(n.input);t+=q(e)*K.contentMultiplier;break}case`tool_result`:n.content&&(t+=q(typeof n.content==`string`?n.content:JSON.stringify(n.content))*K.contentMultiplier);break;case`thinking`:t+=q(n.thinking)*K.contentMultiplier;break;case`image`:t+=1600;break}return t}function Pt(e){let t=K.toolsExist;for(let[n,r]of e.entries())n>0&&(t+=K.perTool),t+=q(r.name),r.description&&(t+=K.perDesc+q(r.description)),t+=J(r.input_schema);return t}function J(e){let t=0,n=e.properties;if(!n)return t;let r=Object.entries(n);for(let[e,[n,i]]of r.entries()){if(t+=e===0?K.perFirstProp:K.perAdditionalProp,t+=q(n),i.description&&(t+=K.perPropDesc+q(i.description)),i.enum&&Array.isArray(i.enum)){t+=K.perEnum;for(let e of i.enum)t+=q(String(e))}if(i.type===`object`&&i.properties&&(t+=K.perNestedObject,t+=J(i)),i.type===`array`&&i.items){let e=i.items;e.type===`object`&&e.properties&&(t+=K.perArrayOfObjects,t+=J(e))}}return t}function Ft(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 It(e){return{model:Lt(e.model),messages:Rt(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:Ut(e.tools),tool_choice:Wt(e.tool_choice)}}function Lt(e){return e}function Rt(e,t){let n=Bt(t),r=e.flatMap(e=>e.role===`user`?Vt(e):Ht(e));return[...n,...r]}function zt(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 Bt(e){if(!e)return[];if(typeof e==`string`)return[{role:`system`,content:zt(e)}];{let t=e.map(e=>e.text).join(`
|
|
14
14
|
|
|
15
|
-
`);return[{role:`system`,content:
|
|
15
|
+
`);return[{role:`system`,content:zt(t)}]}}function Vt(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 Ht(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(`
|
|
16
16
|
|
|
17
|
-
`);return t.length>0?[{role:`assistant`,content:i||null,tool_calls:t.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:`assistant`,content:
|
|
17
|
+
`);return t.length>0?[{role:`assistant`,content:i||null,tool_calls:t.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:`assistant`,content: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(`
|
|
18
18
|
|
|
19
|
-
`);let n=[];for(let t of e)switch(t.type){case`text`:n.push({type:`text`,text:t.text});break;case`thinking`:n.push({type:`text`,text:t.thinking});break;case`image`:n.push({type:`image_url`,image_url:{url:`data:${t.source.media_type};base64,${t.source.data}`}});break}return n}function Ht(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Ut(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 Wt(e){let t=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let i of e.choices){let e=Gt(i.message.content),a=Kt(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:Pt(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}function Gt(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 Kt(e){return e?e.map(e=>({type:`tool_use`,id:e.id,name:e.function.name,input:JSON.parse(e.function.arguments)})):[]}function qt(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function Jt(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&&(qt(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:Pt(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 Yt(e,t,n){let r={query:t,max_results:n?.maxResults??5};n?.includeDomains?.length&&(r.include_domains=n.includeDomains),n?.excludeDomains?.length&&(r.exclude_domains=n.excludeDomains),E.debug(`Tavily search request:`,JSON.stringify(r));let i=await fetch(`https://api.tavily.com/search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e}`},body:JSON.stringify(r)});if(!i.ok){let e=await i.text();throw E.error(`Tavily API error (${i.status}):`,e),Error(`Tavily API error: ${i.status} ${e}`)}let a=await i.json();return E.debug(`Tavily returned ${a.results.length} results`),a.results}function Xt(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 Qt(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 Y(){let e=``;for(let t=0;t<24;t++)e+=`abcdefghijklmnopqrstuvwxyz0123456789`[Math.floor(Math.random()*36)];return e}function $t(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${Y()}`,a=[{type:`text`,text:`I'll search for that.`},{type:`server_tool_use`,id:i,name:`web_search`,input:{query:t}},{type:`web_search_tool_result`,tool_use_id:i,content:n}];return{id:`msg_tavily_${Y()}`,type:`message`,role:`assistant`,model:r,content:a,stop_reason:`end_turn`,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}function en(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${Y()}`,a=`msg_tavily_${Y()}`,o=[];return o.push({type:`message_start`,message:{id:a,type:`message`,role:`assistant`,content:[],model:r,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:`content_block_start`,index:0,content_block:{type:`text`,text:``}},{type:`content_block_delta`,index:0,delta:{type:`text_delta`,text:`I'll search for that.`}},{type:`content_block_stop`,index:0},{type:`content_block_start`,index:1,content_block:{type:`server_tool_use`,id:i,name:`web_search`,input:{}}},{type:`content_block_delta`,index:1,delta:{type:`input_json_delta`,partial_json:JSON.stringify({query:t})}},{type:`content_block_stop`,index:1},{type:`content_block_start`,index:2,content_block:{type:`web_search_tool_result`,tool_use_id:i,content:n}},{type:`content_block_stop`,index:2},{type:`message_delta`,delta:{stop_reason:`end_turn`,stop_sequence:null},usage:{output_tokens:0}},{type:`message_stop`}),o}async function tn(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=Qt(t);E.info(`Web search intercepted: "${n}"`);let i=[];try{let e=S.tavilyApiKey;if(!e)throw Error(`No Tavily API key configured`);let t=await Yt(e,n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains});i=t.map(e=>({type:`web_search_result`,url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString(`base64`),page_age:null}))}catch(e){E.error(`Tavily search failed:`,e)}let a={query:n,results:i,model:t.model};if(!t.stream)return e.json($t(a));let o=en(a);return M(e,async e=>{for(let t of o)await e.writeSSE({event:t.type,data:JSON.stringify(t)})})}function nn(e,t){return w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.validate`,n=>{try{n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.requested`,t.model);let e=V(t.model);return n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,e),e===t.model?(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),t):(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),se.add(1,{from_model:t.model,to_model:e}),E.debug(`Model mapping: '${t.model}' → '${e}'`),{...t,model:e})}catch(t){if(t instanceof B)return e.json({type:`error`,error:{type:`invalid_request_error`,message:t.message}},t.statusCode),null;throw t}finally{n.end()}})}async function rn(t){let n=await t.req.json();if(Xt(n))return tn(t,n);await St(S),E.debug(`\u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 request payload:`,JSON.stringify(n));let r=t.req.header(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063-beta`)??``,i=/context-1m/i.test(r);if(i){let e=n.model;n={...n,model:`${n.model}-1m`},E.debug(`Detected context-1m beta flag, rewriting model: '${e}' → '${n.model}'`)}let a=nn(t,n);if(!a)return;n=a;let o=performance.now(),s=w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translate.\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`,e=>{try{e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.direction`,`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.message_count`,n.messages.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_tools`,!!n.tools?.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_system`,!!n.system),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.context_1m_beta`,i);let t=n.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`image`)),r=n.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`thinking`));return e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_images`,t),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_thinking`,r),Ft(n)}finally{e.end()}});Ce.record(performance.now()-o,{direction:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`}),E.debug(`Translated \u004f\u0070\u0065\u006e\u0041\u0049 request payload:`,JSON.stringify(s)),t.set(`requestData`,{model:s.model,streaming:!!s.stream});let c=performance.now();S.manualApprove&&await pt();let l=await wt(s),u=performance.now()-c;if(g.record(u,{model:s.model,target:`chat_completions`,streaming:String(!!s.stream)}),an(l)){let e=t.get(`requestData`)||{};l.usage&&(e.tokenUsage=z(l.usage)),e.copilotDuration=u,t.set(`requestData`,e),E.debug(`Non-streaming response:`,JSON.stringify(l).slice(-400));let n=performance.now(),r=w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translate.\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`,e=>{try{e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.direction`,`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`);let t=Wt(l);return e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.content_blocks`,t.content.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.stop_reason`,t.stop_reason??`null`),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_tool_use`,t.content.some(e=>e.type===`tool_use`)),t}finally{e.end()}});return Ce.record(performance.now()-n,{direction:`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),E.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 response:`,JSON.stringify(r)),t.json(r)}return E.debug(`Streaming response from service`),M(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(E.debug(`Raw stream event:`,JSON.stringify(e)),e.data===`[DONE]`)break;if(!e.data)continue;let a=JSON.parse(e.data);if(i++,_e.add(1,{model:s.model,endpoint_type:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),a.usage){r=a.usage;let e=t.get(`requestData`)||{};e.tokenUsage=z(r),e.copilotDuration=u,t.set(`requestData`,e)}let c=Jt(a,o);for(let e of c)E.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 event:`,JSON.stringify(e)),await n.writeSSE({event:e.type,data:JSON.stringify(e)})}let c=performance.now()-a,d={model:s.model,endpoint_type:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`};if(ve.record(c,d),p.record(i,d),r){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=z(r),e.copilotDuration=u,t.set(`requestData`,e))}let f=t.get(`requestId`);f&&e.executeCompletion(f)})}const an=e=>Object.hasOwn(e,`choices`),X=new j;X.post(`/`,async e=>{try{return await rn(e)}catch(t){return await x(e,t)}});const Z=new j;Z.get(`/`,async e=>{try{S.models||await He();let t=S.models?.data.map(e=>({id:e.id,object:`model`,type:`model`,created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:`list`,data:t,has_more:!1})}catch(t){return await x(e,t)}});const on=new j;on.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 sn=new j;sn.get(`/`,async e=>{try{let t=await Qe();return e.json(t)}catch(t){return console.error(`Error fetching usage:`,t),e.json({error:`Failed to fetch usage`},500)}});const Q=new j;Q.use(ft()),Q.use(Me()),Q.get(`/`,e=>e.text(`Server running`)),Q.route(`/chat/completions`,U),Q.route(`/models`,Z),Q.route(`/embeddings`,W),Q.route(`/usage`,sn),Q.route(`/token`,on),Q.route(`/v1/chat/completions`,U),Q.route(`/v1/models`,Z),Q.route(`/v1/embeddings`,W),Q.route(`/v1/messages`,X),Q.post(`/v1/messages/count_tokens`,jt);const cn=[],$=Date.now();function ln(){let e=async(e,t=0)=>{E.info(`Gracefully shutting down...`);let n=w.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.shutdown`,{kind:O.INTERNAL,attributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.shutdown.reason":e,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.shutdown.exit_code":t,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.uptime_seconds":(Date.now()-$)/1e3}});for(let e of cn)try{await e()}catch(e){E.error(`Error during cleanup:`,e)}n.end(),E.info(`Shutdown complete`),A.exit(t)};A.on(`SIGINT`,()=>e(`SIGINT`)),A.on(`SIGTERM`,()=>e(`SIGTERM`)),A.on(`uncaughtException`,t=>{E.error(`Uncaught exception:`,t),e(`uncaughtException`,1)}),A.on(`unhandledRejection`,(t,n)=>{E.error(`Unhandled promise rejection at:`,n,`reason:`,t),e(`unhandledRejection`,1)})}function un(){return`npx \u0063\u006f\u0070\u0069\u006c\u006f\u0074-api start`}function dn(e){let t=[un()];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 fn(e,t){if(!e.claudeCode)return;Ae(S.models,`Models should be loaded by now`);let n,r;if(e.model&&e.smallModel){let t=S.models.data.map(e=>e.id);t.includes(e.model)||(E.error(`Invalid model: ${e.model}`),E.info(`Available services: \n${t.join(`
|
|
19
|
+
`);let n=[];for(let t of e)switch(t.type){case`text`:n.push({type:`text`,text:t.text});break;case`thinking`:n.push({type:`text`,text:t.thinking});break;case`image`:n.push({type:`image_url`,image_url:{url:`data:${t.source.media_type};base64,${t.source.data}`}});break}return n}function Ut(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Wt(e){if(e)switch(e.type){case`auto`:return`auto`;case`any`:return`required`;case`tool`:return e.name?{type:`function`,function:{name:e.name}}:void 0;case`none`:return`none`;default:return}}function Gt(e){let t=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let i of e.choices){let e=Kt(i.message.content),a=qt(i.message.tool_calls);t.push(...e),n.push(...a),(i.finish_reason===`tool_calls`||r===`stop`)&&(r=i.finish_reason)}return{id:e.id,type:`message`,role:`assistant`,model:e.model,content:[...t,...n],stop_reason:Ft(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}function Kt(e){return typeof e==`string`?[{type:`text`,text:e}]:Array.isArray(e)?e.filter(e=>e.type===`text`).map(e=>({type:`text`,text:e.text})):[]}function qt(e){return e?e.map(e=>({type:`tool_use`,id:e.id,name:e.function.name,input:JSON.parse(e.function.arguments)})):[]}function Jt(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function Yt(e,t){let n=[];if(e.choices.length===0)return n;let r=e.choices[0],{delta:i}=r;if(t.messageStartSent||=(n.push({type:`message_start`,message:{id:e.id,type:`message`,role:`assistant`,content:[],model:e.model,stop_reason:null,stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:0}}}),!0),i.content&&(Jt(t)&&(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1),t.contentBlockOpen||=(n.push({type:`content_block_start`,index:t.contentBlockIndex,content_block:{type:`text`,text:``}}),!0),n.push({type:`content_block_delta`,index:t.contentBlockIndex,delta:{type:`text_delta`,text:i.content}})),i.tool_calls)for(let e of i.tool_calls){if(e.id&&e.function?.name){t.contentBlockOpen&&=(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),t.contentBlockIndex++,!1);let r=t.contentBlockIndex;t.toolCalls[e.index]={id:e.id,name:e.function.name,anthropicBlockIndex:r},n.push({type:`content_block_start`,index:r,content_block:{type:`tool_use`,id:e.id,name:e.function.name,input:{}}}),t.contentBlockOpen=!0}if(e.function?.arguments){let r=t.toolCalls[e.index];r&&n.push({type:`content_block_delta`,index:r.anthropicBlockIndex,delta:{type:`input_json_delta`,partial_json:e.function.arguments}})}}return r.finish_reason&&(t.contentBlockOpen&&=(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),!1),n.push({type:`message_delta`,delta:{stop_reason:Ft(r.finish_reason),stop_sequence:null},usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}},{type:`message_stop`})),n}async function Xt(e,t,n){let r={query:t,max_results:n?.maxResults??5};n?.includeDomains?.length&&(r.include_domains=n.includeDomains),n?.excludeDomains?.length&&(r.exclude_domains=n.excludeDomains),E.debug(`Tavily search request:`,JSON.stringify(r));let i=await fetch(`https://api.tavily.com/search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e}`},body:JSON.stringify(r)});if(!i.ok){let e=await i.text();throw E.error(`Tavily API error (${i.status}):`,e),Error(`Tavily API error: ${i.status} ${e}`)}let a=await i.json();return E.debug(`Tavily returned ${a.results.length} results`),a.results}function Zt(e){let t=e.tools;if(!t||t.length!==1)return!1;let n=t[0].type;return typeof n==`string`&&n.startsWith(`web_search`)}function Qt(e){let t=e.messages[0];if(!t||t.role!==`user`)return null;let n;if(typeof t.content==`string`)n=t.content;else if(Array.isArray(t.content)){let e=t.content.find(e=>e.type===`text`);if(!e)return null;n=e.text}else return null;return n.startsWith(`Perform a web search for the query: `)?n.slice(36).trim():n.trim()||null}function $t(e){let t=e.tools,n=t?.[0],r=typeof n?.max_uses==`number`?n.max_uses:5;return{maxResults:r,allowedDomains:n?.allowed_domains,blockedDomains:n?.blocked_domains}}function X(){let e=``;for(let t=0;t<24;t++)e+=`abcdefghijklmnopqrstuvwxyz0123456789`[Math.floor(Math.random()*36)];return e}function en(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${X()}`,a=[{type:`text`,text:`I'll search for that.`},{type:`server_tool_use`,id:i,name:`web_search`,input:{query:t}},{type:`web_search_tool_result`,tool_use_id:i,content:n}];return{id:`msg_tavily_${X()}`,type:`message`,role:`assistant`,model:r,content:a,stop_reason:`end_turn`,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}function tn(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${X()}`,a=`msg_tavily_${X()}`,o=[];return o.push({type:`message_start`,message:{id:a,type:`message`,role:`assistant`,content:[],model:r,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:`content_block_start`,index:0,content_block:{type:`text`,text:``}},{type:`content_block_delta`,index:0,delta:{type:`text_delta`,text:`I'll search for that.`}},{type:`content_block_stop`,index:0},{type:`content_block_start`,index:1,content_block:{type:`server_tool_use`,id:i,name:`web_search`,input:{}}},{type:`content_block_delta`,index:1,delta:{type:`input_json_delta`,partial_json:JSON.stringify({query:t})}},{type:`content_block_stop`,index:1},{type:`content_block_start`,index:2,content_block:{type:`web_search_tool_result`,tool_use_id:i,content:n}},{type:`content_block_stop`,index:2},{type:`message_delta`,delta:{stop_reason:`end_turn`,stop_sequence:null},usage:{output_tokens:0}},{type:`message_stop`}),o}async function nn(e,t){let n=Qt(t);if(!n)return e.json({type:`error`,error:{type:`invalid_request_error`,message:`Could not extract search query from web search request`}},400);let r=$t(t);E.info(`Web search intercepted: "${n}"`);let i=[];try{let e=S.tavilyApiKey;if(!e)throw Error(`No Tavily API key configured`);let t=await Xt(e,n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains});i=t.map(e=>({type:`web_search_result`,url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString(`base64`),page_age:null}))}catch(e){E.error(`Tavily search failed:`,e)}let a={query:n,results:i,model:t.model};if(!t.stream)return e.json(en(a));let o=tn(a);return M(e,async e=>{for(let t of o)await e.writeSSE({event:t.type,data:JSON.stringify(t)})})}function rn(e,t){return w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.validate`,n=>{try{n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.requested`,t.model);let e=H(t.model);return n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,e),e===t.model?(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),t):(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),se.add(1,{from_model:t.model,to_model:e}),E.debug(`Model mapping: '${t.model}' → '${e}'`),{...t,model:e})}catch(t){if(t instanceof V)return e.json({type:`error`,error:{type:`invalid_request_error`,message:t.message}},t.statusCode),null;throw t}finally{n.end()}})}async function an(t){let n=await t.req.json();if(Zt(n))return nn(t,n);await St(S),E.debug(`\u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 request payload:`,JSON.stringify(n));let r=t.req.header(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063-beta`)??``,i=/context-1m/i.test(r);if(i){let e=n.model;n={...n,model:`${n.model}-1m`},E.debug(`Detected context-1m beta flag, rewriting model: '${e}' → '${n.model}'`)}let a=rn(t,n);if(!a)return;n=a;let o=performance.now(),s=w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translate.\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`,e=>{try{e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.direction`,`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.message_count`,n.messages.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_tools`,!!n.tools?.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_system`,!!n.system),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.context_1m_beta`,i);let t=n.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`image`)),r=n.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`thinking`));return e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_images`,t),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_thinking`,r),It(n)}finally{e.end()}});Ce.record(performance.now()-o,{direction:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`}),E.debug(`Translated \u004f\u0070\u0065\u006e\u0041\u0049 request payload:`,JSON.stringify(s)),t.set(`requestData`,{model:s.model,streaming:!!s.stream});let c=performance.now();S.manualApprove&&await pt();let l=await wt(s),u=performance.now()-c;if(g.record(u,{model:s.model,target:`chat_completions`,streaming:String(!!s.stream)}),on(l)){let e=t.get(`requestData`)||{};l.usage&&(e.tokenUsage=z(l.usage)),e.copilotDuration=u,t.set(`requestData`,e),E.debug(`Non-streaming response:`,JSON.stringify(l).slice(-400));let n=performance.now(),r=w.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translate.\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`,e=>{try{e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.direction`,`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`);let t=Gt(l);return e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.content_blocks`,t.content.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.stop_reason`,t.stop_reason??`null`),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_tool_use`,t.content.some(e=>e.type===`tool_use`)),t}finally{e.end()}});return Ce.record(performance.now()-n,{direction:`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),E.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 response:`,JSON.stringify(r)),t.json(r)}E.debug(`Streaming response from service`);let{events:d,span:f}=l;return M(t,async n=>{let r=null,i=0,a=performance.now(),o={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}};try{for await(let e of d){if(E.debug(`Raw stream event:`,JSON.stringify(e)),e.data===`[DONE]`)break;if(!e.data)continue;let a=JSON.parse(e.data);if(i++,_e.add(1,{model:s.model,endpoint_type:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),a.usage){r=a.usage;let e=t.get(`requestData`)||{};e.tokenUsage=z(r),e.copilotDuration=u,t.set(`requestData`,e)}let c=Yt(a,o);for(let e of c)E.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 event:`,JSON.stringify(e)),await n.writeSSE({event:e.type,data:JSON.stringify(e)})}let e=performance.now()-a,c={model:s.model,endpoint_type:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`};if(ve.record(e,c),p.record(i,c),r){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=z(r),e.copilotDuration=u,t.set(`requestData`,e))}}finally{r&&B(f,r),f.end()}let c=t.get(`requestId`);c&&e.executeCompletion(c)})}const on=e=>Object.hasOwn(e,`choices`),sn=new j;sn.post(`/`,async e=>{try{return await an(e)}catch(t){return await x(e,t)}});const Z=new j;Z.get(`/`,async e=>{try{S.models||await He();let t=S.models?.data.map(e=>({id:e.id,object:`model`,type:`model`,created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:`list`,data:t,has_more:!1})}catch(t){return await x(e,t)}});const cn=new j;cn.get(`/`,e=>{try{return e.json({token:S.copilotToken})}catch(t){return console.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const ln=new j;ln.get(`/`,async e=>{try{let t=await Qe();return e.json(t)}catch(t){return console.error(`Error fetching usage:`,t),e.json({error:`Failed to fetch usage`},500)}});const Q=new j;Q.use(ft()),Q.use(Me()),Q.get(`/`,e=>e.text(`Server running`)),Q.route(`/chat/completions`,W),Q.route(`/models`,Z),Q.route(`/embeddings`,G),Q.route(`/usage`,ln),Q.route(`/token`,cn),Q.route(`/v1/chat/completions`,W),Q.route(`/v1/models`,Z),Q.route(`/v1/embeddings`,G),Q.route(`/v1/messages`,sn),Q.post(`/v1/messages/count_tokens`,Mt);const un=[],$=Date.now();function dn(){let e=async(e,t=0)=>{E.info(`Gracefully shutting down...`);let n=w.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.shutdown`,{kind:O.INTERNAL,attributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.shutdown.reason":e,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.shutdown.exit_code":t,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.uptime_seconds":(Date.now()-$)/1e3}});for(let e of un)try{await e()}catch(e){E.error(`Error during cleanup:`,e)}n.end(),E.info(`Shutdown complete`),A.exit(t)};A.on(`SIGINT`,()=>e(`SIGINT`)),A.on(`SIGTERM`,()=>e(`SIGTERM`)),A.on(`uncaughtException`,t=>{E.error(`Uncaught exception:`,t),e(`uncaughtException`,1)}),A.on(`unhandledRejection`,(t,n)=>{E.error(`Unhandled promise rejection at:`,n,`reason:`,t),e(`unhandledRejection`,1)})}function fn(){return`npx \u0063\u006f\u0070\u0069\u006c\u006f\u0074-api start`}function pn(e){let t=[fn()];return t.push(`-p ${e.port}`),e.verbose&&t.push(`-v`),e.accountType!==`individual`&&t.push(`-a ${e.accountType}`),e.manual&&t.push(`--manual`),e.rateLimit&&t.push(`-r ${e.rateLimit}`),e.rateLimitWait&&t.push(`-w`),e.githubToken&&t.push(`-g ${e.\u0067\u0069\u0074\u0068\u0075\u0062Token}`),e.claudeCode&&t.push(`-c`),e.model&&t.push(`-m ${e.model}`),e.smallModel&&t.push(`-s ${e.smallModel}`),e.timeout&&t.push(`-t ${String(e.timeout)}`),e.showToken&&t.push(`--show-token`),e.disableConnectivityMonitoring&&t.push(`--disable-connectivity-monitoring`),t.join(` `)}async function mn(e,t){if(!e.claudeCode)return;Ae(S.models,`Models should be loaded by now`);let n,r;if(e.model&&e.smallModel){let t=S.models.data.map(e=>e.id);t.includes(e.model)||(E.error(`Invalid model: ${e.model}`),E.info(`Available services: \n${t.join(`
|
|
20
20
|
`)}`),A.exit(1)),t.includes(e.smallModel)||(E.error(`Invalid small model: ${e.smallModel}`),E.info(`Available services: \n${t.join(`
|
|
21
|
-
`)}`),A.exit(1)),n=e.model,r=e.smallModel,E.info(`Using service: ${n}`),E.info(`Using small model: ${r}`)}else e.model||e.smallModel?(E.error(`Both --model and --small-model must be specified for model selection`),A.exit(1)):(n=await E.prompt(`Select a model to use`,{type:`select`,options:S.models.data.map(e=>e.id)}),r=await E.prompt(`Select a small model to use`,{type:`select`,options:S.models.data.map(e=>e.id)}));let i=lt({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:`dummy`,ANTHROPIC_MODEL:n,ANTHROPIC_SMALL_FAST_MODEL:r},`\u0063\u006c\u0061\u0075\u0064\u0065`);try{Oe.writeSync(i),E.success(`Copied command to clipboard!`)}catch{E.warn(`Failed to copy to clipboard. Here is the command:`),E.log(i)}}function
|
|
22
|
-
`))}ke({fetch:Q.fetch,port:e.port})}const
|
|
21
|
+
`)}`),A.exit(1)),n=e.model,r=e.smallModel,E.info(`Using service: ${n}`),E.info(`Using small model: ${r}`)}else e.model||e.smallModel?(E.error(`Both --model and --small-model must be specified for model selection`),A.exit(1)):(n=await E.prompt(`Select a model to use`,{type:`select`,options:S.models.data.map(e=>e.id)}),r=await E.prompt(`Select a small model to use`,{type:`select`,options:S.models.data.map(e=>e.id)}));let i=lt({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:`dummy`,ANTHROPIC_MODEL:n,ANTHROPIC_SMALL_FAST_MODEL:r},`\u0063\u006c\u0061\u0075\u0064\u0065`);try{Oe.writeSync(i),E.success(`Copied command to clipboard!`)}catch{E.warn(`Failed to copy to clipboard. Here is the command:`),E.log(i)}}function hn(e){let{options:t,version:n,runtime:r,githubUser:i}=e,a=w.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.startup`,{kind:O.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 gn(e){dn(),un.push(()=>{E.debug(`Cleaning up connectivity monitor`),m.stop()},()=>{E.debug(`Cleaning up token management`),Ge()},async()=>{E.debug(`Shutting down OTel SDK`),await he()}),e.verbose&&(E.level=5,E.info(`Verbose logging enabled`)),S.accountType=e.accountType,e.accountType!==`individual`&&E.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,E.info(`Web search enabled via Tavily API`)),await y(),Ue();let t=await et(),n=tt();re(t,$),e.githubToken?(S.githubToken=e.githubToken,E.info(`Using provided Auth token`)):await R();let r;try{let{_s4:e}=await import(`./get-user-C8Q0uEyI.js`);r=await e(),await ie(S,r.login)}catch(e){E.error(`Failed to get user info for machine ID generation:`,e),E.error(`Cannot proceed without user information`),A.exit(1)}await Je(),await He(),hn({options:e,version:t,runtime:n,githubUser:r}),E.info(`Available services:`);for(let e of S.models?.data??[]){let t=e.capabilities.limits?.max_context_window_tokens,n=t?` (${t.toLocaleString()} tokens)`:``;E.info(`- ${e.id}${n}`)}let i=`http://localhost:${e.port}`;if(await mn(e,i),e.tavilyApiKey)E.box(`🔍 Web Search: Enabled ✓`);else{let t=pn(e);E.box([`🔍 Web Search: Enable web search by adding a Tavily API key.`,` Get your API key at: https://www.tavily.com`,``,` ${t} --tavily-api-key <your-key>`].join(`
|
|
22
|
+
`))}ke({fetch:Q.fetch,port:e.port})}const _n=T({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 gn({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`]||A.env.TAVILY_API_KEY})}}),vn=T({meta:{name:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,description:`API proxy server for tool integration.`},subCommands:{auth:Ze,start:_n,"check-usage":$e,debug:st}});await we(vn);export{};
|