copilot-api-node20 0.19.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.js +10 -10
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{_c1 as e,DEFAULT_TIMEOUT_MS as t,_g1 as n,_g4 as r,_g2 as i,_g3 as a,HTTPError as o,PATHS as s,SENSITIVE_HEADERS as c,SeverityNumber as l,approvalCounter as u,approvalWaitHistogram as d,cachedTokensCounter as f,chunksPerRequestHistogram as p,connectivityMonitor as m,_s1 as h,copilotDurationHistogram as g,_s2 as _,emitLog as v,ensurePaths as ee,errorsCounter as te,flattenAttributes as ne,_c2 as y,_s4 as re,_s3 as ie,h2ConnectionCounter as b,h2KeepaliveCounter as ae,initOtel as oe,_s5 as se,inputTokensCounter as ce,inputTokensPerRequestHistogram as le,modelMappingCounter as ue,modelValidationErrorCounter as de,outputTokensCounter as fe,outputTokensPerRequestHistogram as pe,rateLimitCounter as me,rateLimitWaitHistogram as he,requestDurationHistogram as ge,requestsCounter as _e,shutdownOtel as ve,_c3 as ye,state as x,streamChunksCounter as be,streamDurationHistogram as xe,tokenRefreshAttemptCounter as Se,tokenRefreshDurationHistogram as Ce,tokenRefreshFailureCounter as we,tracedFetch as S,tracedUndiciRequest as Te,tracer as C,translationDurationHistogram as Ee}from"./get-user-BukbT5yw.js";import{defineCommand as w,runMain as De}from"citty";import T from"consola";import E from"node:fs/promises";import Oe from"node:os";import{SpanKind as ke,SpanStatusCode as Ae,context as je,trace as Me}from"@opentelemetry/api";import{Client as Ne}from"undici";import Pe from"clipboardy";import D from"node:process";import{serve as Fe}from"srvx";import Ie from"tiny-invariant";import{execSync as Le}from"node:child_process";import{Hono as O}from"hono";import{cors as Re}from"hono/cors";import{streamSSE as ze}from"hono/streaming";import{events as Be}from"fetch-event-stream";import{Tokenizer as Ve,models as He}from"ai-tokenizer";import*as Ue from"ai-tokenizer/encoding/\u0063\u006c\u0061\u0075\u0064\u0065";const We=async()=>{let e=`${n}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/v2/token`,t=x.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),t);try{let{response:t,span:n}=await S({spanName:`\u0067\u0069\u0074\u0068\u0075\u0062 GET /\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/v2/token`,url:e,target:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_token`,headers:ie(x),signal:r.signal});if(!t.ok)throw n.end(),new o(`Failed to get Service token`,t);let i=await t.json();return n.end(),i}finally{clearTimeout(i)}};async function Ge(){let e=new AbortController,t=x.timeoutMs,n=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${i}/login/device/code`,{method:`POST`,headers:ye(),body:JSON.stringify({client_id:a,scope:r}),signal:e.signal});if(!t.ok)throw new o(`Failed to get device code`,t);return await t.json()}finally{clearTimeout(n)}}const Ke=async()=>{let e=`${h(x)}/models`,t=_(x),n=x.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),n);try{let{response:n,span:i}=await S({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 GET /models`,url:e,target:`models`,headers:t,signal:r.signal});if(!n.ok)throw i.end(),new o(`Failed to get models`,n);let a=await n.json();return i.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.models_count`,a.data.length),i.end(),a}finally{clearTimeout(i)}};function qe(){return`1.115.0-insider`}qe();const k=e=>new Promise(t=>{setTimeout(t,e)}),Je=e=>e==null;async function Ye(){let e=await Ke();x.models=e}const Xe=()=>{let e=qe();x.vsCodeVersion=e};async function Ze(e){let t=(e.interval+1)*1e3;for(T.debug(`Polling access token with interval of ${t}ms`);;){let n=new AbortController,r=x.timeoutMs,o=setTimeout(()=>{n.abort()},r);try{let r=await fetch(`${i}/login/oauth/access_token`,{method:`POST`,headers:ye(),body:JSON.stringify({client_id:a,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`}),signal:n.signal});if(!r.ok){await k(t),T.error(`Failed to poll access token:`,await r.text());continue}let o=await r.json();T.debug(`Polling access token response:`,o);let{access_token:s}=o;if(s)return s;await k(t)}catch(e){if(e instanceof Error&&e.name===`AbortError`){T.error(`Access token polling timed out`),await k(t);continue}throw e}finally{clearTimeout(o)}}}let Qe,A=!1,j,M;function $e(){T.debug(`Cleaning up token management`),Qe&&=(clearInterval(Qe),void 0),j&&=(m.off(`online`,j),void 0),M&&=(m.off(`offline`,M),void 0)}const et=()=>E.readFile(s.GITHUB_TOKEN_PATH,`utf8`),tt=e=>E.writeFile(s.GITHUB_TOKEN_PATH,e),nt=async()=>{let{token:e,refresh_in:t}=await We();x.copilotToken=e,T.debug(`Service token fetched successfully!`),x.showToken&&T.info(`Service token:`,e);let n=(t-60)*1e3,r=async(e=5,t=1e3,n=`scheduled`)=>{if(A){T.debug(`Refresh already in progress, skipping`);return}return A=!0,C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token.refresh`,async r=>{let i=performance.now();r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.reason`,n),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.max_retries`,e);try{for(let a=1;a<=e;a++)try{r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempt`,a),T.debug(`Refreshing Service token (${n}, attempt ${a}/${e})`);let{token:t}=await We();x.copilotToken=t,T.debug(`Service token refreshed successfully`),x.showToken&&T.info(`Refreshed Service token:`,t),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.success`,!0),Se.add(1,{reason:n,success:`true`}),Ce.record(performance.now()-i,{reason:n}),v(l.INFO,`INFO`,`Token refreshed successfully (${n})`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.reason":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempt":a});return}catch(o){let s=a===e;if(T.error(`Failed to refresh Service token (attempt ${a}/${e}):`,o),Se.add(1,{reason:n,success:`false`}),s){T.error(`All refresh attempts failed. May be unavailable until next scheduled refresh.`);let t=o instanceof Error?o:Error(String(o));r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.success`,!1),r.setStatus({code:Ae.ERROR,message:t.message}),r.recordException(t),we.add(1,{reason:n}),Ce.record(performance.now()-i,{reason:n}),v(l.ERROR,`ERROR`,`Token refresh failed after ${e} attempts (${n})`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.reason":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempts":e});return}let c=t*2**(a-1);T.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),A=!1}})};Qe=setInterval(()=>{r(5,1e3,`scheduled`).catch(e=>{T.error(`Unexpected error in scheduled token refresh:`,e)})},n),m.start(),j=()=>{T.debug(`Network connectivity restored, attempting immediate token refresh`),r(3,500,`network-restored`).catch(e=>{T.error(`Unexpected error in network-restored token refresh:`,e)})},M=()=>{T.debug(`Network connectivity lost`)},m.on(`online`,j),m.on(`offline`,M)};async function N(e){try{let t=await et();if(t&&!e?.force){x.githubToken=t,x.showToken&&T.info(`Auth token:`,t),await rt();return}T.info(`Authentication required`);let n=await Ge();T.debug(`Device code response:`,n),T.info(`Please enter the code "${n.user_code}" in ${n.verification_uri}`);let r=await Ze(n);await tt(r),x.githubToken=r,x.showToken&&T.info(`Auth token:`,r),await rt()}catch(e){throw e instanceof o?(T.error(`Failed to get Auth token:`,await e.response.json()),e):(T.error(`Failed to get Auth token:`,e),e)}}async function rt(){let e=await re();T.debug(`Authenticated as ${e.login}`)}async function it(e){e.verbose&&(T.level=5,T.info(`Verbose logging enabled`)),x.showToken=e.showToken,await ee(),await N({force:!0}),T.success(`Auth token written to`,s.GITHUB_TOKEN_PATH)}const at=w({meta:{name:`auth`,description:`Run authentication flow`},args:{verbose:{alias:`v`,type:`boolean`,default:!1,description:`Enable verbose logging`},"show-token":{type:`boolean`,default:!1,description:`Show token on auth`}},run({args:e}){return it({verbose:e.verbose,showToken:e[`show-token`]})}}),ot=async()=>{let e=`${n}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/user`,t=x.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),t);try{let{response:t,span:n}=await S({spanName:`\u0067\u0069\u0074\u0068\u0075\u0062 GET /\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/user`,url:e,target:`usage`,headers:ie(x),signal:r.signal});if(!t.ok)throw n.end(),new o(`Failed to get usage`,t);let i=await t.json();return n.end(),i}finally{clearTimeout(i)}},st=w({meta:{name:`check-usage`,description:`Show current usage/quota information`},async run(){await ee(),await N();try{let e=await ot(),t=e.quota_snapshots.premium_interactions,n=t.entitlement,r=n-t.remaining,i=n>0?r/n*100:0,a=t.percent_remaining;function o(e,t){if(!t)return`${e}: N/A`;let n=t.entitlement,r=n-t.remaining,i=n>0?r/n*100:0,a=t.percent_remaining;return`${e}: ${r}/${n} used (${i.toFixed(1)}% used, ${a.toFixed(1)}% remaining)`}let s=`Premium: ${r}/${n} used (${i.toFixed(1)}% used, ${a.toFixed(1)}% remaining)`,c=o(`Chat`,e.quota_snapshots.chat),l=o(`Completions`,e.quota_snapshots.completions);T.box(`Usage (plan: ${e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_plan})\nQuota resets: ${e.quota_reset_date}\n\nQuotas:\n ${s}\n ${c}\n ${l}`)}catch(e){T.error(`Failed to fetch usage:`,e),process.exit(1)}}});async function P(){try{let e=new URL(`../package.json`,import.meta.url).pathname,t=await E.readFile(e),n=JSON.parse(t.toString());return n.version}catch{return`unknown`}}function ct(){let e=typeof Bun<`u`;return{name:e?`bun`:`node`,version:e?Bun.version:process.version.slice(1),platform:Oe.platform(),arch:Oe.arch()}}async function lt(){try{let e=await E.stat(s.GITHUB_TOKEN_PATH);if(!e.isFile())return!1;let t=await E.readFile(s.GITHUB_TOKEN_PATH,`utf8`);return t.trim().length>0}catch{return!1}}async function ut(){let[e,t]=await Promise.all([P(),lt()]);return{version:e,runtime:ct(),paths:{APP_DIR:s.APP_DIR,GITHUB_TOKEN_PATH:s.GITHUB_TOKEN_PATH},tokenExists:t}}function dt(e){T.info(`service debug
2
+ import{_c1 as e,DEFAULT_TIMEOUT_MS as t,_g1 as n,_g4 as r,_g2 as i,_g3 as a,HTTPError as o,PATHS as s,SENSITIVE_HEADERS as c,SeverityNumber as l,approvalCounter as u,approvalWaitHistogram as d,cachedTokensCounter as f,chunksPerRequestHistogram as p,connectivityMonitor as m,_s1 as h,copilotDurationHistogram as ee,_s2 as g,emitLog as _,ensurePaths as te,errorsCounter as ne,flattenAttributes as re,_c2 as v,_s4 as ie,_s3 as ae,h2ConnectionCounter as y,h2KeepaliveCounter as oe,initOtel as se,_s5 as ce,inputTokensCounter as le,inputTokensPerRequestHistogram as ue,modelMappingCounter as de,modelValidationErrorCounter as fe,outputTokensCounter as pe,outputTokensPerRequestHistogram as me,rateLimitCounter as he,rateLimitWaitHistogram as ge,requestDurationHistogram as _e,requestsCounter as ve,shutdownOtel as ye,_c3 as be,state as b,streamChunksCounter as xe,streamDurationHistogram as Se,tokenRefreshAttemptCounter as Ce,tokenRefreshDurationHistogram as we,tokenRefreshFailureCounter as Te,tracedFetch as x,tracedUndiciRequest as Ee,tracer as S,translationDurationHistogram as De}from"./get-user-BukbT5yw.js";import{defineCommand as C,runMain as Oe}from"citty";import w from"consola";import T from"node:fs/promises";import ke from"node:os";import{SpanKind as Ae,SpanStatusCode as je,context as Me,trace as Ne}from"@opentelemetry/api";import{Client as Pe}from"undici";import Fe from"clipboardy";import E from"node:process";import{serve as Ie}from"srvx";import Le from"tiny-invariant";import{execSync as Re}from"node:child_process";import{Hono as D}from"hono";import{cors as ze}from"hono/cors";import{streamSSE as O}from"hono/streaming";import{events as Be}from"fetch-event-stream";import{Tokenizer as Ve,models as He}from"ai-tokenizer";import*as Ue from"ai-tokenizer/encoding/\u0063\u006c\u0061\u0075\u0064\u0065";const We=async()=>{let e=`${n}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/v2/token`,t=b.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),t);try{let{response:t,span:n}=await x({spanName:`\u0067\u0069\u0074\u0068\u0075\u0062 GET /\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/v2/token`,url:e,target:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_token`,headers:ae(b),signal:r.signal});if(!t.ok)throw n.end(),new o(`Failed to get Service token`,t);let i=await t.json();return n.end(),i}finally{clearTimeout(i)}};async function Ge(){let e=new AbortController,t=b.timeoutMs,n=setTimeout(()=>{e.abort()},t);try{let t=await fetch(`${i}/login/device/code`,{method:`POST`,headers:be(),body:JSON.stringify({client_id:a,scope:r}),signal:e.signal});if(!t.ok)throw new o(`Failed to get device code`,t);return await t.json()}finally{clearTimeout(n)}}const Ke=async()=>{let e=`${h(b)}/models`,t=g(b),n=b.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),n);try{let{response:n,span:i}=await x({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 GET /models`,url:e,target:`models`,headers:t,signal:r.signal});if(!n.ok)throw i.end(),new o(`Failed to get models`,n);let a=await n.json();return i.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.models_count`,a.data.length),i.end(),a}finally{clearTimeout(i)}};function qe(){return`1.115.0-insider`}qe();const k=e=>new Promise(t=>{setTimeout(t,e)}),Je=e=>e==null;async function Ye(){let e=await Ke();b.models=e}const Xe=()=>{let e=qe();b.vsCodeVersion=e};async function Ze(e){let t=(e.interval+1)*1e3;for(w.debug(`Polling access token with interval of ${t}ms`);;){let n=new AbortController,r=b.timeoutMs,o=setTimeout(()=>{n.abort()},r);try{let r=await fetch(`${i}/login/oauth/access_token`,{method:`POST`,headers:be(),body:JSON.stringify({client_id:a,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`}),signal:n.signal});if(!r.ok){await k(t),w.error(`Failed to poll access token:`,await r.text());continue}let o=await r.json();w.debug(`Polling access token response:`,o);let{access_token:s}=o;if(s)return s;await k(t)}catch(e){if(e instanceof Error&&e.name===`AbortError`){w.error(`Access token polling timed out`),await k(t);continue}throw e}finally{clearTimeout(o)}}}let A,j=!1,M,N;function Qe(){w.debug(`Cleaning up token management`),A&&=(clearInterval(A),void 0),M&&=(m.off(`online`,M),void 0),N&&=(m.off(`offline`,N),void 0)}const $e=()=>T.readFile(s.GITHUB_TOKEN_PATH,`utf8`),et=e=>T.writeFile(s.GITHUB_TOKEN_PATH,e),tt=async()=>{let{token:e,refresh_in:t}=await We();b.copilotToken=e,w.debug(`Service token fetched successfully!`),b.showToken&&w.info(`Service token:`,e);let n=(t-60)*1e3,r=async(e=5,t=1e3,n=`scheduled`)=>{if(j){w.debug(`Refresh already in progress, skipping`);return}return j=!0,S.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token.refresh`,async r=>{let i=performance.now();r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.reason`,n),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.max_retries`,e);try{for(let a=1;a<=e;a++)try{r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempt`,a),w.debug(`Refreshing Service token (${n}, attempt ${a}/${e})`);let{token:t}=await We();b.copilotToken=t,w.debug(`Service token refreshed successfully`),b.showToken&&w.info(`Refreshed Service token:`,t),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.success`,!0),Ce.add(1,{reason:n,success:`true`}),we.record(performance.now()-i,{reason:n}),_(l.INFO,`INFO`,`Token refreshed successfully (${n})`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.reason":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempt":a});return}catch(o){let s=a===e;if(w.error(`Failed to refresh Service token (attempt ${a}/${e}):`,o),Ce.add(1,{reason:n,success:`false`}),s){w.error(`All refresh attempts failed. May be unavailable until next scheduled refresh.`);let t=o instanceof Error?o:Error(String(o));r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.success`,!1),r.setStatus({code:je.ERROR,message:t.message}),r.recordException(t),Te.add(1,{reason:n}),we.record(performance.now()-i,{reason:n}),_(l.ERROR,`ERROR`,`Token refresh failed after ${e} attempts (${n})`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.reason":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.token_refresh.attempts":e});return}let c=t*2**(a-1);w.debug(`Retrying token refresh in ${c}ms...`),await new Promise(e=>setTimeout(e,c))}}finally{r.end(),j=!1}})};A=setInterval(()=>{r(5,1e3,`scheduled`).catch(e=>{w.error(`Unexpected error in scheduled token refresh:`,e)})},n),m.start(),M=()=>{w.debug(`Network connectivity restored, attempting immediate token refresh`),r(3,500,`network-restored`).catch(e=>{w.error(`Unexpected error in network-restored token refresh:`,e)})},N=()=>{w.debug(`Network connectivity lost`)},m.on(`online`,M),m.on(`offline`,N)};async function nt(e){try{let t=await $e();if(t&&!e?.force){b.githubToken=t,b.showToken&&w.info(`Auth token:`,t),await rt();return}w.info(`Authentication required`);let n=await Ge();w.debug(`Device code response:`,n),w.info(`Please enter the code "${n.user_code}" in ${n.verification_uri}`);let r=await Ze(n);await et(r),b.githubToken=r,b.showToken&&w.info(`Auth token:`,r),await rt()}catch(e){throw e instanceof o?(w.error(`Failed to get Auth token:`,await e.response.json()),e):(w.error(`Failed to get Auth token:`,e),e)}}async function rt(){let e=await ie();w.debug(`Authenticated as ${e.login}`)}async function it(e){e.verbose&&(w.level=5,w.info(`Verbose logging enabled`)),b.showToken=e.showToken,await te(),await nt({force:!0}),w.success(`Auth token written to`,s.GITHUB_TOKEN_PATH)}const at=C({meta:{name:`auth`,description:`Run authentication flow`},args:{verbose:{alias:`v`,type:`boolean`,default:!1,description:`Enable verbose logging`},"show-token":{type:`boolean`,default:!1,description:`Show token on auth`}},run({args:e}){return it({verbose:e.verbose,showToken:e[`show-token`]})}}),ot=async()=>{let e=`${n}/\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/user`,t=b.timeoutMs,r=new AbortController,i=setTimeout(()=>r.abort(),t);try{let{response:t,span:n}=await x({spanName:`\u0067\u0069\u0074\u0068\u0075\u0062 GET /\u0063\u006f\u0070\u0069\u006c\u006f\u0074_internal/user`,url:e,target:`usage`,headers:ae(b),signal:r.signal});if(!t.ok)throw n.end(),new o(`Failed to get usage`,t);let i=await t.json();return n.end(),i}finally{clearTimeout(i)}},st=C({meta:{name:`check-usage`,description:`Show current usage/quota information`},async run(){await te(),await nt();try{let e=await ot(),t=e.quota_snapshots.premium_interactions,n=t.entitlement,r=n-t.remaining,i=n>0?r/n*100:0,a=t.percent_remaining;function o(e,t){if(!t)return`${e}: N/A`;let n=t.entitlement,r=n-t.remaining,i=n>0?r/n*100:0,a=t.percent_remaining;return`${e}: ${r}/${n} used (${i.toFixed(1)}% used, ${a.toFixed(1)}% remaining)`}let s=`Premium: ${r}/${n} used (${i.toFixed(1)}% used, ${a.toFixed(1)}% remaining)`,c=o(`Chat`,e.quota_snapshots.chat),l=o(`Completions`,e.quota_snapshots.completions);w.box(`Usage (plan: ${e.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_plan})\nQuota resets: ${e.quota_reset_date}\n\nQuotas:\n ${s}\n ${c}\n ${l}`)}catch(e){w.error(`Failed to fetch usage:`,e),process.exit(1)}}});async function ct(){try{let e=new URL(`../package.json`,import.meta.url).pathname,t=await T.readFile(e),n=JSON.parse(t.toString());return n.version}catch{return`unknown`}}function lt(){let e=typeof Bun<`u`;return{name:e?`bun`:`node`,version:e?Bun.version:process.version.slice(1),platform:ke.platform(),arch:ke.arch()}}async function ut(){try{let e=await T.stat(s.GITHUB_TOKEN_PATH);if(!e.isFile())return!1;let t=await T.readFile(s.GITHUB_TOKEN_PATH,`utf8`);return t.trim().length>0}catch{return!1}}async function dt(){let[e,t]=await Promise.all([ct(),ut()]);return{version:e,runtime:lt(),paths:{APP_DIR:s.APP_DIR,GITHUB_TOKEN_PATH:s.GITHUB_TOKEN_PATH},tokenExists:t}}function ft(e){w.info(`service debug
3
3
 
4
4
  Version: ${e.version}
5
5
  Runtime: ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform} ${e.runtime.arch})
@@ -8,17 +8,17 @@ 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 ft(e){console.log(JSON.stringify(e,null,2))}async function pt(e){let t=await ut();e.json?ft(t):dt(t)}const mt=w({meta:{name:`debug`,description:`Print debug information about the application`},args:{json:{type:`boolean`,default:!1,description:`Output debug information as JSON`}},run({args:e}){return pt({json:e.json})}}),ht=`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api-node20`,gt=`https://registry.npmjs.org/${ht}/latest`,_t=e=>`\x1b[1m${e}\x1b[0m`,vt=e=>`\x1b[2m${e}\x1b[0m`,F=e=>`\x1b[33m${e}\x1b[0m`,yt=e=>`\x1b[32m${e}\x1b[0m`;function bt(e,t){let n=e.split(`.`).map(Number),r=t.split(`.`).map(Number),i=Math.max(n.length,r.length);for(let e=0;e<i;e++){let t=n[e]??0,i=r[e]??0;if(t<i)return!0;if(t>i)return!1}return!1}async function xt(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);try{let t=await fetch(gt,{signal:e.signal});if(!t.ok)return null;let n=await t.json();return n.version??null}catch{return null}finally{clearTimeout(t)}}function St(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,``).length}function Ct(e,t){let n=Math.max(0,t-St(e));return e+` `.repeat(n)}function wt(e,t){let n=`npx ${ht}@latest`,r=F(`│`),i=` ${_t(`Update available!`)} ${vt(e)} → ${yt(t)}`,a=` Run ${_t(n)} to update`,o=` `.repeat(54),s=F(`╭${`─`.repeat(54)}╮`),c=F(`╰${`─`.repeat(54)}╯`),l=[``,s,`${r}${o}${r}`,`${r}${Ct(i,54)}${r}`,`${r}${o}${r}`,`${r}${Ct(a,54)}${r}`,`${r}${o}${r}`,c,``];console.log(l.join(`
12
- `))}async function Tt(){try{if(process.env.COPILOT_API_SKIP_UPDATE_CHECK===`1`)return;let[e,t]=await Promise.all([P(),xt()]);if(e===`unknown`||!t||!bt(e,t))return;wt(e,t)}catch{}}const Et=45e3;let I,L,R,z;function B(e){return!e.closed&&!e.destroyed}function Dt(e){T.debug(`Creating HTTP/2 client for ${e}`);let t=new Ne(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4});return b.add(1,{event:`created`,origin:e}),v(l.INFO,`INFO`,`HTTP/2 client created for ${e}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.event":`created`,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.origin":e}),t.on(`connect`,()=>{T.debug(`HTTP/2 client connected to ${e}`)}),t.on(`error`,t=>{T.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on(`disconnect`,(n,r,i)=>{T.debug(`HTTP/2 client disconnected from ${e}:`,i.message),b.add(1,{event:`goaway`,origin:e}),v(l.WARN,`WARN`,`HTTP/2 client disconnected from ${e}: ${i.message}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.event":`goaway`,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.origin":e,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.error":i.message}),I===t&&(I=void 0,L=void 0,R=void 0)}),t}function Ot(e){if(x.connectivity.h2){if(I&&L===e&&B(I)){if(R&&Date.now()-R>=6e5){let t=I;return I=Dt(e),L=e,R=Date.now(),t.close().catch(e=>{T.debug(`Error closing rotated HTTP/2 client:`,e)}),b.add(1,{event:`rotated`,origin:e}),v(l.INFO,`INFO`,`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.event":`rotated`,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.origin":e}),I}return I}return I&&B(I)&&I.close().catch(e=>{T.debug(`Error closing old HTTP/2 client:`,e)}),I=Dt(e),L=e,R=Date.now(),I}}async function kt(){let e=I;if(!e||!B(e)){T.debug(`HTTP/2 keepalive: no active client, skipping`);return}try{let{statusCode:t,body:n}=await e.request({path:`/models`,method:`GET`,headers:_(x)});await n.dump(),ae.add(1,{result:`success`}),T.debug(`HTTP/2 keepalive: GET /models → ${t}`)}catch(t){ae.add(1,{result:`error`}),T.warn(`HTTP/2 keepalive failed:`,t instanceof Error?t.message:t),b.add(1,{event:`error`,origin:L??``}),B(e)&&e.close().catch(e=>{T.debug(`Error closing broken HTTP/2 client:`,e)}),I===e&&(I=void 0,L=void 0,R=void 0)}}function At(){z||(T.debug(`Starting HTTP/2 keepalive (every ${Et/1e3}s)`),z=setInterval(()=>{kt().catch(e=>{T.debug(`Unexpected error in HTTP/2 keepalive:`,e)})},Et),z.unref())}async function jt(){T.debug(`Stopping HTTP/2 client`),z&&=(clearInterval(z),void 0);let e=I;I=void 0,L=void 0,R=void 0,e&&B(e)&&(b.add(1,{event:`closed`}),await e.close())}function Mt(){let{platform:e,ppid:t,env:n}=D;if(e===`win32`){try{let e=`wmic process get ParentProcessId,Name | findstr "${t}"`,n=Le(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 Nt(e,t=``){let n=Mt(),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}const V=e=>`\x1b[1m${e}\x1b[0m`,H=e=>`\x1b[2m${e}\x1b[0m`,U=e=>`\x1b[36m${e}\x1b[0m`,Pt=e=>`\x1b[32m${e}\x1b[0m`,Ft=e=>`\x1b[33m${e}\x1b[0m`,It=e=>`\x1b[4m${e}\x1b[0m`,Lt=(e,t)=>`\x1b]8;;${e}\x1b\\${t}\x1b]8;;\x1b\\`,Rt=`?utm_source=\u0063\u006f\u0070\u0069\u006c\u006f\u0074-cli&utm_medium=terminal&utm_campaign=startup_banner`,W=H(` ─────────────────────────────────────────────────────────────`);function zt(e){return e===void 0?``:e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}const Bt=[{title:`The 5-Hour Quota, Boris's Tweet, and What the Source Code Actually Reveals`,teaser:`\u0043\u006c\u0061\u0075\u0064\u0065 Code's caching story — decoded from the source.`,url:`https://barazany.dev/blog/\u0063\u006c\u0061\u0075\u0064\u0065-code-token-caching`},{title:`\u0043\u006c\u0061\u0075\u0064\u0065 Code's Compaction Engine: What the Source Code Actually Reveals`,teaser:`What's actually running beneath every long session.`,url:`https://barazany.dev/blog/\u0063\u006c\u0061\u0075\u0064\u0065-codes-compaction-engine`},{title:`We Were About to Buy an Automation Platform. We Already Had One.`,teaser:`Governance spirals over n8n. The answer was already deployed.`,url:`https://barazany.dev/blog/we-already-had-the-automation-platform`}];function Vt(e){if(e.length===0)return[];let t=[``,W,` ${V(`BARAZANY.DEV`)} ${H(`— Recent Posts`)}`,W,``];for(let[n,r]of e.entries()){let e=`${r.url}${Rt}`,i=Lt(e,V(It(`[${n+1}]`)));t.push(` ${i} ${U(r.title)}`,` ${H(`→`)} ${H(r.teaser)}`,``)}return t.push(W,` ${Lt(`https://barazany.dev/blog${Rt}`,`barazany.dev/blog`)}`,W),t}function Ht(){let e=[],t=[],n=[],r=[];for(let i of x.models?.data??[]){let a=i.capabilities.limits?.max_context_window_tokens,o={id:i.id,ctx:a};i.id.startsWith(`text-embedding`)?r.push(o):i.vendor===`\u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`?e.push(o):i.vendor===`Google`?n.push(o):t.push(o)}return[[`\u0043\u006c\u0061\u0075\u0064\u0065`,e],[`\u004f\u0070\u0065\u006e\u0041\u0049`,t],[`Gemini`,n],[`Embedding`,r]]}function Ut(e){let t=[];x.connectivity.h2Keepalive?t.push(`HTTP/2 keepalive`):x.connectivity.h2&&t.push(`HTTP/2`),t.push(`timeout ${e.timeout/1e3}s`);let n=e.webSearch?`Tavily ${Pt(`✓`)}`:H(`off`),r=[``,` ${V(`COPILOT-API`)} ${H(`v${e.version}`)}`,W,` ${H(`Runtime`)} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${H(`User`)} ${e.user} ${H(`·`)} ${e.accountType}`];return x.vsCodeVersion&&r.push(` ${H(`Client`)} \u0056\u0053\u0043\u006f\u0064\u0065 ${x.\u0076\u0073\u0043\u006f\u0064\u0065Version}`),r.push(` ${H(`Network`)} ${t.join(H(` · `))}`,` ${H(`Search`)} ${n}`),e.clipboardCopied&&r.push(` ${H(`Clipboard`)} \u0043\u006c\u0061\u0075\u0064\u0065 Code command ${Pt(`✓`)}`),r.push(W),r}function Wt(e){if(!e.model&&!e.smallModel)return[];let t=[``,` ${V(`Active`)}`];if(e.model){let n=x.models?.data.find(t=>t.id===e.model),r=zt(n?.capabilities.limits?.max_context_window_tokens);t.push(` ${U(e.model.padEnd(32))} ${H(`ctx`)} ${V(r.padStart(5))} ${Ft(`← main`)}`)}if(e.smallModel){let n=x.models?.data.find(t=>t.id===e.smallModel),r=zt(n?.capabilities.limits?.max_context_window_tokens);t.push(` ${e.smallModel.padEnd(32)} ${H(`ctx`)} ${r.padStart(5)} ${Ft(`← small`)}`)}return t}function Gt(e){let t=[];for(let[n,r]of Ht()){if(r.length===0)continue;t.push(``,` ${V(n)}`);for(let n of r){let r=n.id===e.model||n.id===e.smallModel,i=r?U(`●`):H(`·`),a=r?U(n.id.padEnd(34)):n.id.padEnd(34),o=n.ctx?zt(n.ctx).padStart(5):``;t.push(` ${i} ${a} ${H(o)}`)}}return t}function Kt(e){let t=Math.floor(e/1e3),n=Math.floor(t/3600),r=Math.floor(t%3600/60);return n>0?`${n}h ${r}m`:r>0?`${r}m`:`${t}s`}function qt(e){let t=[...Ut(e),...Wt(e),...Gt(e),``,...Vt(Bt),``];console.log(t.join(`
13
- `))}function Jt(e,t){let n=Lt(`https://barazany.dev?utm_source=\u0063\u006f\u0070\u0069\u006c\u006f\u0074-cli&utm_medium=terminal&utm_campaign=goodbye_banner`,`barazany.dev`),r=[``,W,` ${V(`COPILOT-API`)} ${H(`v${e}`)} ${H(`·`)} ${Kt(t)} uptime`,W,``,` Check in from time to time on`,` ${U(n)}`,``,W,``];console.log(r.join(`
14
- `))}function Yt(){return`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}function Xt(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 Zt(e){let{c:t,start:n,span:r}=e,i=t.get(`requestData`),a=t.res.status,o=i?.model??`unknown`,s=i?.streaming??!1,l=Date.now()-n;if(r.setAttribute(`http.status_code`,a),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model`,o),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming`,s),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.duration_ms`,l),i?.copilotDuration&&r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_duration_ms`,i.copilotDuration),i?.tokenUsage){let e=i.tokenUsage;r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens`,e.inputTokens),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens`,e.outputTokens),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.total_tokens`,e.totalTokens),e.cachedTokens&&r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.cached_tokens`,e.cachedTokens),e.estimatedCost&&r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.estimated_cost`,e.estimatedCost)}t.res.headers.forEach((e,t)=>{let n=t.toLowerCase();c.has(n)||r.setAttribute(`http.response.header.${n}`,e)}),a>=400&&r.setStatus({code:Ae.ERROR,message:`HTTP ${a}`}),r.end()}function Qt(t){let{c:n,start:r,method:i,path:a,endpointType:o,requestId:s}=t,c=Date.now()-r,l=n.get(`requestData`),u=n.res.status,d=l?.model??`unknown`,p=l?.streaming??!1,m={method:i,path:a,status_code:String(u),model:d,streaming:String(p),endpoint_type:o};if(_e.add(1,m),ge.record(c,m),u>=400&&te.add(1,{method:i,path:a,status_code:String(u),error_type:u>=500?`server_error`:`client_error`}),l?.tokenUsage){let e=l.tokenUsage,t={model:d,endpoint_type:o};e.inputTokens&&(ce.add(e.inputTokens,t),le.record(e.inputTokens,t)),e.outputTokens&&(fe.add(e.outputTokens,t),pe.record(e.outputTokens,t)),e.cachedTokens&&f.add(e.cachedTokens,{model:d})}!p&&l?.tokenUsage&&e.executeCompletion(s)}function $t(e){Zt(e),Qt(e)}function en(){return async(t,n)=>{let r=Date.now(),i=Yt(),a=t.req.method,o=t.req.path,s=Xt(o);t.set(`requestId`,i),t.header(`x-request-id`,i);let l=C.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.handle_request`,{kind:ke.SERVER,attributes:{"http.method":a,"http.url":t.req.url,"http.route":o,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request_id":i,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.endpoint_type":s}});for(let[e,n]of Object.entries(t.req.header())){let t=e.toLowerCase();if(c.has(t))continue;l.setAttribute(`http.request.header.${t}`,n)}let u,d=new Promise(e=>{u=e});t.set(`streamComplete`,d),t.set(`resolveStreamComplete`,u);let f=Me.setSpan(je.active(),l);await je.with(f,async()=>{e.registerCompletion(i,t,r);try{await n()}catch(e){let t=e instanceof Error?e:Error(String(e));throw l.setStatus({code:Ae.ERROR,message:t.message}),l.recordException(t),e}});let p=t.get(`requestData`),m={c:t,start:r,method:a,path:o,endpointType:s,requestId:i,span:l};p?.streaming?d.then(()=>$t(m)).catch(e=>{T.debug(`Error finalizing streaming request:`,e),l.end()}):$t(m)}}const tn=async()=>C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.await`,async e=>{let t=performance.now();try{let n=await T.prompt(`Accept incoming request?`,{type:`confirm`}),r=performance.now()-t;if(e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.wait_duration_ms`,r),d.record(r),!n)throw e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`rejected`),u.add(1,{result:`rejected`}),new o(`Request rejected`,Response.json({message:`Request rejected`},{status:403}));e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.result`,`approved`),u.add(1,{result:`approved`})}finally{e.end()}}),nn={input:3e-6,output:15e-6};function G(e){let t=e.prompt_tokens||0,n=e.completion_tokens||0,r=e.total_tokens||t+n,i=t*nn.input+n*nn.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 rn(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 an=[{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`}],on={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 sn(e){return e.startsWith(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/`)?e.slice(10):e}function cn(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 ln(e){for(let t of an)if(t.pattern.test(e))return t.family;return null}function un(e,t,n=null){let r=on[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 dn(e,t){let n=sn(e),[r,i]=cn(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=ln(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 un(a,t,i)}var K=class extends Error{statusCode;constructor(e,t=400){super(e),this.name=`ModelValidationError`,this.statusCode=t}};function fn(e){if(!e||typeof e!=`string`)throw new K(`Model name is required and must be a string`);if(!x.models?.data)throw new K(`Models not available. Please try again later.`,503);let t=x.models.data.map(e=>e.id),n=dn(e,t);if(!n)throw de.add(1,{requested_model:e}),new K(`Invalid model: '${e}'. Available services: ${t.join(`, `)}`);return n}async function pn(e){if(e.rateLimitSeconds===void 0)return;let t=e.rateLimitSeconds;return C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.check`,async n=>{try{let r=Date.now();if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.configured_seconds`,t),!e.lastRequestTimestamp){e.lastRequestTimestamp=r,n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`allowed`);return}let i=(r-e.lastRequestTimestamp)/1e3;if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.elapsed_seconds`,i),i>t){e.lastRequestTimestamp=r,n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`allowed`);return}let a=Math.ceil(t-i);if(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.wait_seconds`,a),!e.rateLimitWait)throw n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`rejected`),me.add(1,{action:`rejected`,source:`local`}),T.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new o(`Rate limit exceeded`,Response.json({message:`Rate limit exceeded`},{status:429}));let s=a*1e3;n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.rate_limit.action`,`waited`),me.add(1,{action:`waited`,source:`local`}),he.record(s,{source:`local`}),T.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await k(s),e.lastRequestTimestamp=r,T.info(`Rate limit wait completed, proceeding with request`)}finally{n.end()}})}function mn(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 hn(e){if(typeof e==`string`)return mn(e);if(Array.isArray(e)){let t=e.map(e=>hn(e));return t}if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=hn(r);return t}return e}const gn=async e=>{if(!x.copilotToken)throw Error(`Service token not found`);let t=hn(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={..._(x,n),"X-Initiator":r?`agent`:`user`},a=h(x),s=`${a}/chat/completions`,c=Ot(a),l=x.timeoutMs,u=new AbortController,d=setTimeout(()=>u.abort(),l);try{let{statusCode:e,headers:a,body:d,span:f}=await Te({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /chat/completions`,url:s,target:`chat_completions`,headers:i,body:JSON.stringify(t),signal:u.signal,headersTimeout:l,bodyTimeout:l*3,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":t.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming":!!t.stream,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.timeout_ms":l,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.has_tools":!!t.tools?.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tool_count":t.tools?.length??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.message_count":t.messages.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.max_tokens":t.max_tokens??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.vision_enabled":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.initiator":r?`agent`:`user`},dispatcher:c}),p=new Response(d,{status:e,headers:a});if(!p.ok)throw f.end(),new o(`Failed to create chat completions`,p);if(t.stream)return{events:Be(p),span:f};let m=await p.json();return m.id&&f.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.response.id`,m.id),m.usage&&rn(f,m.usage),f.end(),m}finally{clearTimeout(d)}};function _n(e){return C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.validate`,t=>{try{t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.requested`,e.model);let n=fn(e.model);return t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,n),n===e.model?(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),e):(t.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),ue.add(1,{from_model:e.model,to_model:n}),T.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function vn(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 yn(t){await pn(x);let n=await t.req.json();T.debug(`Request payload:`,JSON.stringify(n).slice(-400));try{n=_n(n)}catch(e){if(e instanceof K)return t.json({error:{message:e.message,type:`invalid_request_error`,code:`invalid_model`}},e.statusCode);throw e}if(t.set(`requestData`,{model:n.model,streaming:!!n.stream}),x.manualApprove&&await tn(),Je(n.max_tokens)){let e=x.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},T.debug(`Set max_tokens to:`,JSON.stringify(n.max_tokens))}let r=performance.now(),i=await gn(n),a=performance.now()-r;if(g.record(a,{model:n.model,target:`chat_completions`,streaming:String(!!n.stream)}),bn(i)){let e=t.get(`requestData`)||{};return i.usage&&(e.tokenUsage=G(i.usage)),e.copilotDuration=a,t.set(`requestData`,e),T.debug(`Non-streaming response:`,JSON.stringify(i)),t.json(i)}let{events:o,span:s}=i;return ze(t,async r=>{let i={value:null},c=0,l=performance.now();try{try{for await(let e of o){let o=e;e.data&&e.data!==`[DONE]`&&(c++,be.add(1,{model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`}),o=vn(e,e=>{i.value=e;let n=t.get(`requestData`)||{};n.tokenUsage=G(e),n.copilotDuration=a,t.set(`requestData`,n)})),await r.writeSSE(o)}let e=performance.now()-l,s={model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`};if(xe.record(e,s),p.record(c,s),i.value){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=G(i.value),e.copilotDuration=a,t.set(`requestData`,e))}}finally{i.value&&rn(s,i.value),s.end()}let u=t.get(`requestId`);u&&e.executeCompletion(u)}finally{t.get(`resolveStreamComplete`)?.()}})}const bn=e=>Object.hasOwn(e,`choices`),xn=new O;xn.post(`/`,async e=>{try{return await yn(e)}catch(t){return await y(e,t)}});const Sn=async e=>{if(!x.copilotToken)throw Error(`Service token not found`);let t=`${h(x)}/embeddings`,n=_(x),r=x.timeoutMs,i=new AbortController,a=setTimeout(()=>i.abort(),r);try{let{response:r,span:a}=await S({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /embeddings`,url:t,target:`embeddings`,method:`POST`,headers:n,body:JSON.stringify(e),signal:i.signal,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":e.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_count":Array.isArray(e.input)?e.input.length:1}});if(!r.ok)throw a.end(),new o(`Failed to create embeddings`,r);let s=await r.json();return a.end(),s}finally{clearTimeout(a)}},q=new O;q.post(`/`,async e=>{try{let t=await e.req.json();try{fn(t.model)}catch(t){if(t instanceof K)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 Sn(t),i=performance.now()-n;g.record(i,{model:t.model,target:`embeddings`,streaming:`false`});let a=e.get(`requestData`)||{};return a.tokenUsage=G(r.usage),a.copilotDuration=i,e.set(`requestData`,a),e.json(r)}catch(t){return await y(e,t)}});const Cn=new Ve(Ue),wn=He[`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4`].tokens,J={...wn,baseOverhead:4,perTool:27};function Y(e){return Cn.encode(e).length}async function Tn(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=J.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 pt(e){console.log(JSON.stringify(e,null,2))}async function mt(e){let t=await dt();e.json?pt(t):ft(t)}const ht=C({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 mt({json:e.json})}}),gt=`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api-node20`,_t=`https://registry.npmjs.org/${gt}/latest`,vt=e=>`\x1b[1m${e}\x1b[0m`,yt=e=>`\x1b[2m${e}\x1b[0m`,bt=e=>`\x1b[33m${e}\x1b[0m`,xt=e=>`\x1b[32m${e}\x1b[0m`;function St(e,t){let n=e.split(`.`).map(Number),r=t.split(`.`).map(Number),i=Math.max(n.length,r.length);for(let e=0;e<i;e++){let t=n[e]??0,i=r[e]??0;if(t<i)return!0;if(t>i)return!1}return!1}async function Ct(){let e=new AbortController,t=setTimeout(()=>e.abort(),5e3);try{let t=await fetch(_t,{signal:e.signal});if(!t.ok)return null;let n=await t.json();return n.version??null}catch{return null}finally{clearTimeout(t)}}function wt(e){return e.replaceAll(/\x1b\[[0-9;]*m/g,``).length}function Tt(e,t){let n=Math.max(0,t-wt(e));return e+` `.repeat(n)}function Et(e,t){let n=`npx ${gt}@latest`,r=bt(`│`),i=` ${vt(`Update available!`)} ${yt(e)} → ${xt(t)}`,a=` Run ${vt(n)} to update`,o=` `.repeat(54),s=bt(`╭${`─`.repeat(54)}╮`),c=bt(`╰${`─`.repeat(54)}╯`),l=[``,s,`${r}${o}${r}`,`${r}${Tt(i,54)}${r}`,`${r}${o}${r}`,`${r}${Tt(a,54)}${r}`,`${r}${o}${r}`,c,``];console.log(l.join(`
12
+ `))}async function Dt(){try{if(process.env.COPILOT_API_SKIP_UPDATE_CHECK===`1`)return;let[e,t]=await Promise.all([ct(),Ct()]);if(e===`unknown`||!t||!St(e,t))return;Et(e,t)}catch{}}const Ot=45e3,P=new Map,F=new Map,I=new Set;let L,R,z;function B(e){return!e.closed&&!e.destroyed}function kt(){for(let e of[...F.keys(),...I])B(e)&&e.close().catch(e=>{w.debug(`Error closing HTTP/2 pool entry:`,e)});F.clear(),I.clear(),P.clear()}function At(e){w.debug(`Creating HTTP/2 client for ${e}`);let t=new Pe(e,{allowH2:!0,pipelining:0,keepAliveTimeout:6e4,initialWindowSize:4*1024*1024,connectionWindowSize:16*1024*1024});return P.set(t,Date.now()),y.add(1,{event:`created`,origin:e}),_(l.INFO,`INFO`,`HTTP/2 client created for ${e}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.event":`created`,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.origin":e}),t.on(`connect`,()=>{w.debug(`HTTP/2 client connected to ${e}`)}),t.on(`error`,t=>{w.debug(`HTTP/2 client error for ${e}:`,t.message)}),t.on(`disconnect`,(n,r,i)=>{w.debug(`HTTP/2 client disconnected from ${e}:`,i.message),y.add(1,{event:`goaway`,origin:e}),_(l.WARN,`WARN`,`HTTP/2 client disconnected from ${e}: ${i.message}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.event":`goaway`,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.origin":e,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.error":i.message}),F.delete(t),I.delete(t),P.delete(t),B(t)&&t.close().catch(e=>{w.debug(`Error closing GOAWAY'd HTTP/2 client:`,e)})}),t}function jt(e){if(!b.connectivity.h2)return;L&&L!==e&&kt(),L=e;let t=Date.now();for(let[n]of F){let r=P.get(n)??0;if(t-r>=6e5){F.delete(n),P.delete(n),B(n)&&n.close().catch(e=>{w.debug(`Error closing rotated HTTP/2 client:`,e)}),y.add(1,{event:`rotated`,origin:e}),_(l.INFO,`INFO`,`HTTP/2 client rotated for ${e} (max lifetime reached)`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.event":`rotated`,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.origin":e});continue}if(!B(n)){F.delete(n),P.delete(n);continue}return F.delete(n),I.add(n),n}let n=At(e);return I.add(n),n}function V(e){e&&I.delete(e)&&(B(e)?F.set(e,Date.now()):P.delete(e))}function Mt(){let e=Date.now(),t=b.connectivity.h2Keepalive,n=F.size;for(let[r,i]of F){if(e-i<6e4||t&&n<=1)continue;F.delete(r),P.delete(r),n--,B(r)&&r.close().catch(e=>{w.debug(`Error closing idle HTTP/2 client:`,e)}),y.add(1,{event:`idle_reaped`,origin:L??``}),_(l.INFO,`INFO`,`HTTP/2 idle connection reaped for ${L}`,{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.event":`idle_reaped`,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.h2.origin":L??``})}}function Nt(){z||(z=setInterval(()=>{Mt()},3e4),z.unref())}async function Pt(){if(F.size===0&&I.size===0){if(L){let e=At(L);F.set(e,Date.now())}return}let e=[...F.keys()];await Promise.allSettled(e.map(async e=>{if(!B(e)){F.delete(e),P.delete(e);return}try{let{statusCode:t,body:n}=await e.request({path:`/models`,method:`GET`,headers:g(b)});await n.dump(),oe.add(1,{result:`success`}),w.debug(`HTTP/2 keepalive: GET /models → ${t}`),F.set(e,Date.now())}catch(t){oe.add(1,{result:`error`}),w.warn(`HTTP/2 keepalive failed:`,t instanceof Error?t.message:t),y.add(1,{event:`error`,origin:L??``}),F.delete(e),P.delete(e),B(e)&&e.close().catch(e=>{w.debug(`Error closing broken HTTP/2 client:`,e)})}}))}function Ft(){R||(w.debug(`Starting HTTP/2 keepalive (every ${Ot/1e3}s)`),R=setInterval(()=>{Pt().catch(e=>{w.debug(`Unexpected error in HTTP/2 keepalive:`,e)})},Ot),R.unref(),Nt())}async function It(){w.debug(`Stopping HTTP/2 pool`),R&&=(clearInterval(R),void 0),z&&=(clearInterval(z),void 0);let e=[...F.keys(),...I];F.clear(),I.clear(),P.clear(),L=void 0;for(let t of e)B(t)&&(y.add(1,{event:`closed`}),await t.close())}function Lt(){let{platform:e,ppid:t,env:n}=E;if(e===`win32`){try{let e=`wmic process get ParentProcessId,Name | findstr "${t}"`,n=Re(e,{stdio:`pipe`}).toString();if(n.toLowerCase().includes(`powershell.exe`))return`powershell`}catch{return`cmd`}return`cmd`}else{let e=n.SHELL;if(e){if(e.endsWith(`zsh`))return`zsh`;if(e.endsWith(`fish`))return`fish`;if(e.endsWith(`bash`))return`bash`}return`sh`}}function Rt(e,t=``){let n=Lt(),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}const H=e=>`\x1b[1m${e}\x1b[0m`,U=e=>`\x1b[2m${e}\x1b[0m`,W=e=>`\x1b[36m${e}\x1b[0m`,zt=e=>`\x1b[32m${e}\x1b[0m`,Bt=e=>`\x1b[33m${e}\x1b[0m`,Vt=e=>`\x1b[4m${e}\x1b[0m`,Ht=(e,t)=>`\x1b]8;;${e}\x1b\\${t}\x1b]8;;\x1b\\`,Ut=`?utm_source=\u0063\u006f\u0070\u0069\u006c\u006f\u0074-cli&utm_medium=terminal&utm_campaign=startup_banner`,G=U(` ─────────────────────────────────────────────────────────────`);function Wt(e){return e===void 0?``:e>=1e6?`${(e/1e6).toFixed(0)}M`:`${(e/1e3).toFixed(0)}K`}const Gt=[{title:`The 5-Hour Quota, Boris's Tweet, and What the Source Code Actually Reveals`,teaser:`\u0043\u006c\u0061\u0075\u0064\u0065 Code's caching story — decoded from the source.`,url:`https://barazany.dev/blog/\u0063\u006c\u0061\u0075\u0064\u0065-code-token-caching`},{title:`\u0043\u006c\u0061\u0075\u0064\u0065 Code's Compaction Engine: What the Source Code Actually Reveals`,teaser:`What's actually running beneath every long session.`,url:`https://barazany.dev/blog/\u0063\u006c\u0061\u0075\u0064\u0065-codes-compaction-engine`},{title:`We Were About to Buy an Automation Platform. We Already Had One.`,teaser:`Governance spirals over n8n. The answer was already deployed.`,url:`https://barazany.dev/blog/we-already-had-the-automation-platform`}];function Kt(e){if(e.length===0)return[];let t=[``,G,` ${H(`BARAZANY.DEV`)} ${U(`— Recent Posts`)}`,G,``];for(let[n,r]of e.entries()){let e=`${r.url}${Ut}`,i=Ht(e,H(Vt(`[${n+1}]`)));t.push(` ${i} ${W(r.title)}`,` ${U(`→`)} ${U(r.teaser)}`,``)}return t.push(G,` ${Ht(`https://barazany.dev/blog${Ut}`,`barazany.dev/blog`)}`,G),t}function qt(){let e=[],t=[],n=[],r=[];for(let i of b.models?.data??[]){let a=i.capabilities.limits?.max_context_window_tokens,o={id:i.id,ctx:a};i.id.startsWith(`text-embedding`)?r.push(o):i.vendor===`\u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`?e.push(o):i.vendor===`Google`?n.push(o):t.push(o)}return[[`\u0043\u006c\u0061\u0075\u0064\u0065`,e],[`\u004f\u0070\u0065\u006e\u0041\u0049`,t],[`Gemini`,n],[`Embedding`,r]]}function Jt(e){let t=[];b.connectivity.h2Keepalive?t.push(`HTTP/2 keepalive`):b.connectivity.h2&&t.push(`HTTP/2`),t.push(`timeout ${e.timeout/1e3}s`);let n=e.webSearch?`Tavily ${zt(`✓`)}`:U(`off`),r=[``,` ${H(`COPILOT-API`)} ${U(`v${e.version}`)}`,G,` ${U(`Runtime`)} ${e.runtime.name} ${e.runtime.version} (${e.runtime.platform}-${e.runtime.arch})`,` ${U(`User`)} ${e.user} ${U(`·`)} ${e.accountType}`];return b.vsCodeVersion&&r.push(` ${U(`Client`)} \u0056\u0053\u0043\u006f\u0064\u0065 ${b.\u0076\u0073\u0043\u006f\u0064\u0065Version}`),r.push(` ${U(`Network`)} ${t.join(U(` · `))}`,` ${U(`Search`)} ${n}`),e.clipboardCopied&&r.push(` ${U(`Clipboard`)} \u0043\u006c\u0061\u0075\u0064\u0065 Code command ${zt(`✓`)}`),r.push(G),r}function Yt(e){if(!e.model&&!e.smallModel)return[];let t=[``,` ${H(`Active`)}`];if(e.model){let n=b.models?.data.find(t=>t.id===e.model),r=Wt(n?.capabilities.limits?.max_context_window_tokens);t.push(` ${W(e.model.padEnd(32))} ${U(`ctx`)} ${H(r.padStart(5))} ${Bt(`← main`)}`)}if(e.smallModel){let n=b.models?.data.find(t=>t.id===e.smallModel),r=Wt(n?.capabilities.limits?.max_context_window_tokens);t.push(` ${e.smallModel.padEnd(32)} ${U(`ctx`)} ${r.padStart(5)} ${Bt(`← small`)}`)}return t}function Xt(e){let t=[];for(let[n,r]of qt()){if(r.length===0)continue;t.push(``,` ${H(n)}`);for(let n of r){let r=n.id===e.model||n.id===e.smallModel,i=r?W(`●`):U(`·`),a=r?W(n.id.padEnd(34)):n.id.padEnd(34),o=n.ctx?Wt(n.ctx).padStart(5):``;t.push(` ${i} ${a} ${U(o)}`)}}return t}function Zt(e){let t=Math.floor(e/1e3),n=Math.floor(t/3600),r=Math.floor(t%3600/60);return n>0?`${n}h ${r}m`:r>0?`${r}m`:`${t}s`}function Qt(e){let t=[...Jt(e),...Yt(e),...Xt(e),``,...Kt(Gt),``];console.log(t.join(`
13
+ `))}function $t(e,t){let n=Ht(`https://barazany.dev?utm_source=\u0063\u006f\u0070\u0069\u006c\u006f\u0074-cli&utm_medium=terminal&utm_campaign=goodbye_banner`,`barazany.dev`),r=[``,G,` ${H(`COPILOT-API`)} ${U(`v${e}`)} ${U(`·`)} ${Zt(t)} uptime`,G,``,` Check in from time to time on`,` ${W(n)}`,``,G,``];console.log(r.join(`
14
+ `))}function en(){return`req_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}function tn(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 nn(e){let{c:t,start:n,span:r}=e,i=t.get(`requestData`),a=t.res.status,o=i?.model??`unknown`,s=i?.streaming??!1,l=Date.now()-n;if(r.setAttribute(`http.status_code`,a),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model`,o),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming`,s),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.duration_ms`,l),i?.copilotDuration&&r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.\u0063\u006f\u0070\u0069\u006c\u006f\u0074_duration_ms`,i.copilotDuration),i?.tokenUsage){let e=i.tokenUsage;r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.input_tokens`,e.inputTokens),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.output_tokens`,e.outputTokens),r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.total_tokens`,e.totalTokens),e.cachedTokens&&r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.cached_tokens`,e.cachedTokens),e.estimatedCost&&r.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.estimated_cost`,e.estimatedCost)}t.res.headers.forEach((e,t)=>{let n=t.toLowerCase();c.has(n)||r.setAttribute(`http.response.header.${n}`,e)}),a>=400&&r.setStatus({code:je.ERROR,message:`HTTP ${a}`}),r.end()}function rn(t){let{c:n,start:r,method:i,path:a,endpointType:o,requestId:s}=t,c=Date.now()-r,l=n.get(`requestData`),u=n.res.status,d=l?.model??`unknown`,p=l?.streaming??!1,m={method:i,path:a,status_code:String(u),model:d,streaming:String(p),endpoint_type:o};if(ve.add(1,m),_e.record(c,m),u>=400&&ne.add(1,{method:i,path:a,status_code:String(u),error_type:u>=500?`server_error`:`client_error`}),l?.tokenUsage){let e=l.tokenUsage,t={model:d,endpoint_type:o};e.inputTokens&&(le.add(e.inputTokens,t),ue.record(e.inputTokens,t)),e.outputTokens&&(pe.add(e.outputTokens,t),me.record(e.outputTokens,t)),e.cachedTokens&&f.add(e.cachedTokens,{model:d})}!p&&l?.tokenUsage&&e.executeCompletion(s)}function an(e){nn(e),rn(e)}function on(){return async(t,n)=>{let r=Date.now(),i=en(),a=t.req.method,o=t.req.path,s=tn(o);t.set(`requestId`,i),t.header(`x-request-id`,i);let l=S.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.handle_request`,{kind:Ae.SERVER,attributes:{"http.method":a,"http.url":t.req.url,"http.route":o,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.request_id":i,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.endpoint_type":s}});for(let[e,n]of Object.entries(t.req.header())){let t=e.toLowerCase();if(c.has(t))continue;l.setAttribute(`http.request.header.${t}`,n)}let u,d=new Promise(e=>{u=e});t.set(`streamComplete`,d),t.set(`resolveStreamComplete`,u);let f=Ne.setSpan(Me.active(),l);await Me.with(f,async()=>{e.registerCompletion(i,t,r);try{await n()}catch(e){let t=e instanceof Error?e:Error(String(e));throw l.setStatus({code:je.ERROR,message:t.message}),l.recordException(t),e}});let p=t.get(`requestData`),m={c:t,start:r,method:a,path:o,endpointType:s,requestId:i,span:l};p?.streaming?d.then(()=>an(m)).catch(e=>{w.debug(`Error finalizing streaming request:`,e),l.end()}):an(m)}}const sn=async()=>S.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.approval.await`,async e=>{let t=performance.now();try{let n=await w.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()}}),cn={input:3e-6,output:15e-6};function K(e){let t=e.prompt_tokens||0,n=e.completion_tokens||0,r=e.total_tokens||t+n,i=t*cn.input+n*cn.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 ln(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 un=[{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`}],dn={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 fn(e){return e.startsWith(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/`)?e.slice(10):e}function pn(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 mn(e){for(let t of un)if(t.pattern.test(e))return t.family;return null}function hn(e,t,n=null){let r=dn[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 gn(e,t){let n=fn(e),[r,i]=pn(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=mn(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 hn(a,t,i)}var q=class extends Error{statusCode;constructor(e,t=400){super(e),this.name=`ModelValidationError`,this.statusCode=t}};function _n(e){if(!e||typeof e!=`string`)throw new q(`Model name is required and must be a string`);if(!b.models?.data)throw new q(`Models not available. Please try again later.`,503);let t=b.models.data.map(e=>e.id),n=gn(e,t);if(!n)throw fe.add(1,{requested_model:e}),new q(`Invalid model: '${e}'. Available services: ${t.join(`, `)}`);return n}async function vn(e){if(e.rateLimitSeconds===void 0)return;let t=e.rateLimitSeconds;return S.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`),he.add(1,{action:`rejected`,source:`local`}),w.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`),he.add(1,{action:`waited`,source:`local`}),ge.record(s,{source:`local`}),w.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await k(s),e.lastRequestTimestamp=r,w.info(`Rate limit wait completed, proceeding with request`)}finally{n.end()}})}function yn(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 bn(e){if(typeof e==`string`)return yn(e);if(Array.isArray(e)){let t=e.map(e=>bn(e));return t}if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=bn(r);return t}return e}const xn=async e=>{if(!b.copilotToken)throw Error(`Service token not found`);let t=bn(e),n=t.messages.some(e=>typeof e.content!=`string`&&e.content?.some(e=>e.type===`image_url`)),r=t.messages.some(e=>[`assistant`,`tool`].includes(e.role)),i={...g(b,n),"X-Initiator":r?`agent`:`user`},a=h(b),s=`${a}/chat/completions`,c=jt(a),l=b.timeoutMs,u=new AbortController,d=setTimeout(()=>u.abort(),l);try{let{statusCode:e,headers:a,body:d,span:f}=await Ee({spanName:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074 POST /chat/completions`,url:s,target:`chat_completions`,headers:i,body:JSON.stringify(t),signal:u.signal,headersTimeout:l,bodyTimeout:l*3,extraAttributes:{"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model":t.model,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.streaming":!!t.stream,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.timeout_ms":l,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.has_tools":!!t.tools?.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.tool_count":t.tools?.length??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.message_count":t.messages.length,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.max_tokens":t.max_tokens??0,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.vision_enabled":n,"\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.initiator":r?`agent`:`user`},dispatcher:c}),p=new Response(d,{status:e,headers:a});if(!p.ok)throw f.end(),new o(`Failed to create chat completions`,p);if(t.stream)return{events:Be(p),span:f,release:()=>V(c)};let m=await p.json();return m.id&&f.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.response.id`,m.id),m.usage&&ln(f,m.usage),f.end(),V(c),m}catch(e){throw V(c),e}finally{clearTimeout(d)}};function Sn(e){return S.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=_n(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),de.add(1,{from_model:e.model,to_model:n}),w.debug(`Normalized model from '${e.model}' to '${n}'`),{...e,model:n})}finally{t.end()}})}function Cn(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 wn(t){await vn(b);let n=await t.req.json();w.debug(`Request payload:`,JSON.stringify(n).slice(-400));try{n=Sn(n)}catch(e){if(e instanceof q)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}),b.manualApprove&&await sn(),Je(n.max_tokens)){let e=b.models?.data.find(e=>e.id===n.model);n={...n,max_tokens:e?.capabilities.limits?.max_output_tokens},w.debug(`Set max_tokens to:`,JSON.stringify(n.max_tokens))}let r=performance.now(),i=await xn(n),a=performance.now()-r;if(ee.record(a,{model:n.model,target:`chat_completions`,streaming:String(!!n.stream)}),Tn(i)){let e=t.get(`requestData`)||{};return i.usage&&(e.tokenUsage=K(i.usage)),e.copilotDuration=a,t.set(`requestData`,e),w.debug(`Non-streaming response:`,JSON.stringify(i)),t.json(i)}let{events:o,span:s,release:c}=i;return O(t,async r=>{let i={value:null},l=0,u=performance.now();try{try{for await(let e of o){let o=e;e.data&&e.data!==`[DONE]`&&(l++,xe.add(1,{model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`}),o=Cn(e,e=>{i.value=e;let n=t.get(`requestData`)||{};n.tokenUsage=K(e),n.copilotDuration=a,t.set(`requestData`,n)})),await r.writeSSE(o)}let e=performance.now()-u,s={model:n.model,endpoint_type:`\u006f\u0070\u0065\u006e\u0061\u0069`};if(Se.record(e,s),p.record(l,s),i.value){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=K(i.value),e.copilotDuration=a,t.set(`requestData`,e))}}finally{i.value&&ln(s,i.value),s.end(),c()}let d=t.get(`requestId`);d&&e.executeCompletion(d)}finally{t.get(`resolveStreamComplete`)?.()}})}const Tn=e=>Object.hasOwn(e,`choices`),En=new D;En.post(`/`,async e=>{try{return await wn(e)}catch(t){return await v(e,t)}});const Dn=async e=>{if(!b.copilotToken)throw Error(`Service token not found`);let t=`${h(b)}/embeddings`,n=g(b),r=b.timeoutMs,i=new AbortController,a=setTimeout(()=>i.abort(),r);try{let{response:r,span:a}=await x({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)}},On=new D;On.post(`/`,async e=>{try{let t=await e.req.json();try{_n(t.model)}catch(t){if(t instanceof q)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 Dn(t),i=performance.now()-n;ee.record(i,{model:t.model,target:`embeddings`,streaming:`false`});let a=e.get(`requestData`)||{};return a.tokenUsage=K(r.usage),a.copilotDuration=i,e.set(`requestData`,a),e.json(r)}catch(t){return await v(e,t)}});const kn=new Ve(Ue),An=He[`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063/\u0063\u006c\u0061\u0075\u0064\u0065-sonnet-4`].tokens,J={...An,baseOverhead:4,perTool:27};function Y(e){return kn.encode(e).length}async function jn(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=J.baseOverhead;if(t.system){let e=typeof t.system==`string`?t.system:t.system.map(e=>e.text).join(`
15
15
 
16
- `);n+=J.perMessage+Y(e)*J.contentMultiplier}for(let e of t.messages)n+=J.perMessage,n+=Y(e.role),typeof e.content==`string`?n+=Y(e.content)*J.contentMultiplier:Array.isArray(e.content)&&(n+=En(e.content));return t.tools&&t.tools.length>0&&(n+=Dn(t.tools)),e.json({input_tokens:Math.round(n)})}function En(e){let t=0;for(let n of e)switch(n.type){case`text`:t+=Y(n.text)*J.contentMultiplier;break;case`tool_use`:{let e=n.name+JSON.stringify(n.input);t+=Y(e)*J.contentMultiplier;break}case`tool_result`:n.content&&(t+=Y(typeof n.content==`string`?n.content:JSON.stringify(n.content))*J.contentMultiplier);break;case`thinking`:t+=Y(n.thinking)*J.contentMultiplier;break;case`image`:t+=1600;break}return t}function Dn(e){let t=J.toolsExist;for(let[n,r]of e.entries())n>0&&(t+=J.perTool),t+=Y(r.name),r.description&&(t+=J.perDesc+Y(r.description)),t+=On(r.input_schema);return t}function On(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?J.perFirstProp:J.perAdditionalProp,t+=Y(n),i.description&&(t+=J.perPropDesc+Y(i.description)),i.enum&&Array.isArray(i.enum)){t+=J.perEnum;for(let e of i.enum)t+=Y(String(e))}if(i.type===`object`&&i.properties&&(t+=J.perNestedObject,t+=On(i)),i.type===`array`&&i.items){let e=i.items;e.type===`object`&&e.properties&&(t+=J.perArrayOfObjects,t+=On(e))}}return t}function kn(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 An(e){return{model:jn(e.model),messages:Mn(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:Ln(e.tools),tool_choice:Rn(e.tool_choice)}}function jn(e){return e}function Mn(e,t){let n=Pn(t),r=e.flatMap(e=>e.role===`user`?Fn(e):In(e));return[...n,...r]}function Nn(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 Pn(e){if(!e)return[];if(typeof e==`string`)return[{role:`system`,content:Nn(e)}];{let t=e.map(e=>e.text).join(`
16
+ `);n+=J.perMessage+Y(e)*J.contentMultiplier}for(let e of t.messages)n+=J.perMessage,n+=Y(e.role),typeof e.content==`string`?n+=Y(e.content)*J.contentMultiplier:Array.isArray(e.content)&&(n+=Mn(e.content));return t.tools&&t.tools.length>0&&(n+=Nn(t.tools)),e.json({input_tokens:Math.round(n)})}function Mn(e){let t=0;for(let n of e)switch(n.type){case`text`:t+=Y(n.text)*J.contentMultiplier;break;case`tool_use`:{let e=n.name+JSON.stringify(n.input);t+=Y(e)*J.contentMultiplier;break}case`tool_result`:n.content&&(t+=Y(typeof n.content==`string`?n.content:JSON.stringify(n.content))*J.contentMultiplier);break;case`thinking`:t+=Y(n.thinking)*J.contentMultiplier;break;case`image`:t+=1600;break}return t}function Nn(e){let t=J.toolsExist;for(let[n,r]of e.entries())n>0&&(t+=J.perTool),t+=Y(r.name),r.description&&(t+=J.perDesc+Y(r.description)),t+=Pn(r.input_schema);return t}function Pn(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?J.perFirstProp:J.perAdditionalProp,t+=Y(n),i.description&&(t+=J.perPropDesc+Y(i.description)),i.enum&&Array.isArray(i.enum)){t+=J.perEnum;for(let e of i.enum)t+=Y(String(e))}if(i.type===`object`&&i.properties&&(t+=J.perNestedObject,t+=Pn(i)),i.type===`array`&&i.items){let e=i.items;e.type===`object`&&e.properties&&(t+=J.perArrayOfObjects,t+=Pn(e))}}return t}function Fn(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 In(e){return{model:Ln(e.model),messages:Rn(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:Un(e.tools),tool_choice:Wn(e.tool_choice)}}function Ln(e){return e}function Rn(e,t){let n=Bn(t),r=e.flatMap(e=>e.role===`user`?Vn(e):Hn(e));return[...n,...r]}function zn(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 Bn(e){if(!e)return[];if(typeof e==`string`)return[{role:`system`,content:zn(e)}];{let t=e.map(e=>e.text).join(`
17
17
 
18
- `);return[{role:`system`,content:Nn(t)}]}}function Fn(e){let t=[];if(Array.isArray(e.content)){let n=e.content.filter(e=>e.type===`tool_result`),r=e.content.filter(e=>e.type!==`tool_result`);for(let e of n)t.push({role:`tool`,tool_call_id:e.tool_use_id,content:X(e.content)});r.length>0&&t.push({role:`user`,content:X(r)})}else t.push({role:`user`,content:X(e.content)});return t}function In(e){if(!Array.isArray(e.content))return[{role:`assistant`,content:X(e.content)}];let t=e.content.filter(e=>e.type===`tool_use`),n=e.content.filter(e=>e.type===`text`),r=e.content.filter(e=>e.type===`thinking`),i=[...n.map(e=>e.text),...r.map(e=>e.thinking)].join(`
18
+ `);return[{role:`system`,content:zn(t)}]}}function Vn(e){let t=[];if(Array.isArray(e.content)){let n=e.content.filter(e=>e.type===`tool_result`),r=e.content.filter(e=>e.type!==`tool_result`);for(let e of n)t.push({role:`tool`,tool_call_id:e.tool_use_id,content:X(e.content)});r.length>0&&t.push({role:`user`,content:X(r)})}else t.push({role:`user`,content:X(e.content)});return t}function Hn(e){if(!Array.isArray(e.content))return[{role:`assistant`,content:X(e.content)}];let t=e.content.filter(e=>e.type===`tool_use`),n=e.content.filter(e=>e.type===`text`),r=e.content.filter(e=>e.type===`thinking`),i=[...n.map(e=>e.text),...r.map(e=>e.thinking)].join(`
19
19
 
20
20
  `);return t.length>0?[{role:`assistant`,content:i||null,tool_calls:t.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:`assistant`,content:X(e.content)}]}function X(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return null;let t=e.some(e=>e.type===`image`);if(!t)return e.filter(e=>e.type===`text`||e.type===`thinking`).map(e=>e.type===`text`?e.text:e.thinking).join(`
21
21
 
22
- `);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 Ln(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Rn(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 zn(e){let t=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let i of e.choices){let e=Bn(i.message.content),a=Vn(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:kn(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}function Bn(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 Vn(e){return e?e.map(e=>({type:`tool_use`,id:e.id,name:e.function.name,input:JSON.parse(e.function.arguments)})):[]}function Hn(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function Un(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&&(Hn(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:kn(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 Wn(e,t,n){let r={query:t,max_results:n?.maxResults??5};n?.includeDomains?.length&&(r.include_domains=n.includeDomains),n?.excludeDomains?.length&&(r.exclude_domains=n.excludeDomains),T.debug(`Tavily search request:`,JSON.stringify(r));let i=await fetch(`https://api.tavily.com/search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e}`},body:JSON.stringify(r)});if(!i.ok){let e=await i.text();throw T.error(`Tavily API error (${i.status}):`,e),Error(`Tavily API error: ${i.status} ${e}`)}let a=await i.json();return T.debug(`Tavily returned ${a.results.length} results`),a.results}function Gn(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 Kn(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 qn(e){let t=e.tools,n=t?.[0],r=typeof n?.max_uses==`number`?n.max_uses:5;return{maxResults:r,allowedDomains:n?.allowed_domains,blockedDomains:n?.blocked_domains}}function Z(){let e=``;for(let t=0;t<24;t++)e+=`abcdefghijklmnopqrstuvwxyz0123456789`[Math.floor(Math.random()*36)];return e}function Jn(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${Z()}`,a=[{type:`text`,text:`I'll search for that.`},{type:`server_tool_use`,id:i,name:`web_search`,input:{query:t}},{type:`web_search_tool_result`,tool_use_id:i,content:n}];return{id:`msg_tavily_${Z()}`,type:`message`,role:`assistant`,model:r,content:a,stop_reason:`end_turn`,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}function Yn(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${Z()}`,a=`msg_tavily_${Z()}`,o=[];return o.push({type:`message_start`,message:{id:a,type:`message`,role:`assistant`,content:[],model:r,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:`content_block_start`,index:0,content_block:{type:`text`,text:``}},{type:`content_block_delta`,index:0,delta:{type:`text_delta`,text:`I'll search for that.`}},{type:`content_block_stop`,index:0},{type:`content_block_start`,index:1,content_block:{type:`server_tool_use`,id:i,name:`web_search`,input:{}}},{type:`content_block_delta`,index:1,delta:{type:`input_json_delta`,partial_json:JSON.stringify({query:t})}},{type:`content_block_stop`,index:1},{type:`content_block_start`,index:2,content_block:{type:`web_search_tool_result`,tool_use_id:i,content:n}},{type:`content_block_stop`,index:2},{type:`message_delta`,delta:{stop_reason:`end_turn`,stop_sequence:null},usage:{output_tokens:0}},{type:`message_stop`}),o}async function Xn(e,t){let n=Kn(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=qn(t);T.info(`Web search intercepted: "${n}"`);let i=[];try{let e=x.tavilyApiKey;if(!e)throw Error(`No Tavily API key configured`);let t=await Wn(e,n,{maxResults:Math.min(r.maxResults,10),includeDomains:r.allowedDomains,excludeDomains:r.blockedDomains});i=t.map(e=>({type:`web_search_result`,url:e.url,title:e.title,encrypted_content:Buffer.from(e.content).toString(`base64`),page_age:null}))}catch(e){T.error(`Tavily search failed:`,e)}let a={query:n,results:i,model:t.model};if(!t.stream)return e.json(Jn(a));let o=Yn(a);return ze(e,async e=>{for(let t of o)await e.writeSSE({event:t.type,data:JSON.stringify(t)})})}function Zn(e,t){return C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.validate`,n=>{try{n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.requested`,t.model);let e=fn(t.model);return n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.normalized`,e),e===t.model?(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!1),t):(n.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.was_mapped`,!0),ue.add(1,{from_model:t.model,to_model:e}),T.debug(`Model mapping: '${t.model}' → '${e}'`),{...t,model:e})}catch(t){if(t instanceof K)return e.json({type:`error`,error:{type:`invalid_request_error`,message:t.message}},t.statusCode),null;throw t}finally{n.end()}})}async function Qn(t){let n=await t.req.json();if(Gn(n))return Xn(t,n);await pn(x),T.debug(`\u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 request payload:`,JSON.stringify(n));let r=t.req.header(`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063-beta`)??``,i=/context-1m/i.test(r);if(i){let e=n.model;n={...n,model:`${n.model}-1m`},T.debug(`Detected context-1m beta flag, rewriting model: '${e}' → '${n.model}'`)}let a=Zn(t,n);if(!a)return;n=a;let o=performance.now(),s=C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translate.\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`,e=>{try{e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.direction`,`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.message_count`,n.messages.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_tools`,!!n.tools?.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_system`,!!n.system),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.context_1m_beta`,i);let t=n.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`image`)),r=n.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`thinking`));return e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_images`,t),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_thinking`,r),An(n)}finally{e.end()}});Ee.record(performance.now()-o,{direction:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`}),T.debug(`Translated \u004f\u0070\u0065\u006e\u0041\u0049 request payload:`,JSON.stringify(s)),t.set(`requestData`,{model:s.model,streaming:!!s.stream});let c=performance.now();x.manualApprove&&await tn();let l=await gn(s),u=performance.now()-c;if(g.record(u,{model:s.model,target:`chat_completions`,streaming:String(!!s.stream)}),$n(l)){let e=t.get(`requestData`)||{};l.usage&&(e.tokenUsage=G(l.usage)),e.copilotDuration=u,t.set(`requestData`,e),T.debug(`Non-streaming response:`,JSON.stringify(l).slice(-400));let n=performance.now(),r=C.startActiveSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translate.\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`,e=>{try{e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.direction`,`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`);let t=zn(l);return e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.content_blocks`,t.content.length),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.stop_reason`,t.stop_reason??`null`),e.setAttribute(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.translation.has_tool_use`,t.content.some(e=>e.type===`tool_use`)),t}finally{e.end()}});return Ee.record(performance.now()-n,{direction:`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),T.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 response:`,JSON.stringify(r)),t.json(r)}T.debug(`Streaming response from service`);let{events:d,span:f}=l;return ze(t,async n=>{let r=null,i=0,a=performance.now(),o={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}};try{try{for await(let e of d){if(T.debug(`Raw stream event:`,JSON.stringify(e)),e.data===`[DONE]`)break;if(!e.data)continue;let a=JSON.parse(e.data);if(i++,be.add(1,{model:s.model,endpoint_type:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),a.usage){r=a.usage;let e=t.get(`requestData`)||{};e.tokenUsage=G(r),e.copilotDuration=u,t.set(`requestData`,e)}let c=Un(a,o);for(let e of c)T.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 event:`,JSON.stringify(e)),await n.writeSSE({event:e.type,data:JSON.stringify(e)})}let e=performance.now()-a,c={model:s.model,endpoint_type:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`};if(xe.record(e,c),p.record(i,c),r){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=G(r),e.copilotDuration=u,t.set(`requestData`,e))}}finally{r&&rn(f,r),f.end()}let c=t.get(`requestId`);c&&e.executeCompletion(c)}finally{t.get(`resolveStreamComplete`)?.()}})}const $n=e=>Object.hasOwn(e,`choices`),er=new O;er.post(`/`,async e=>{try{return await Qn(e)}catch(t){return await y(e,t)}});const tr=new O;tr.get(`/`,async e=>{try{x.models||await Ye();let t=x.models?.data.map(e=>({id:e.id,object:`model`,type:`model`,created:0,created_at:new Date(0).toISOString(),owned_by:e.vendor,display_name:e.name,context_length:e.capabilities.limits?.max_context_window_tokens}));return e.json({object:`list`,data:t,has_more:!1})}catch(t){return await y(e,t)}});const nr=new O;nr.get(`/`,e=>{try{return e.json({token:x.copilotToken})}catch(t){return console.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const rr=new O;rr.get(`/`,async e=>{try{let t=await ot();return e.json(t)}catch(t){return console.error(`Error fetching usage:`,t),e.json({error:`Failed to fetch usage`},500)}});const Q=new O;Q.use(en()),Q.use(Re()),Q.get(`/`,e=>e.text(`Server running`)),Q.route(`/chat/completions`,xn),Q.route(`/models`,tr),Q.route(`/embeddings`,q),Q.route(`/usage`,rr),Q.route(`/token`,nr),Q.route(`/v1/chat/completions`,xn),Q.route(`/v1/models`,tr),Q.route(`/v1/embeddings`,q),Q.route(`/v1/messages`,er),Q.post(`/v1/messages/count_tokens`,Tn);const ir=[],$=Date.now();let ar=``;function or(){let e=async(e,t=0)=>{let n=C.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.shutdown`,{kind:ke.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 ir)try{await e()}catch(e){T.error(`Error during cleanup:`,e)}n.end(),Jt(ar,Date.now()-$),D.exit(t)};D.on(`SIGINT`,()=>e(`SIGINT`)),D.on(`SIGTERM`,()=>e(`SIGTERM`)),D.on(`uncaughtException`,t=>{T.error(`Uncaught exception:`,t),e(`uncaughtException`,1)}),D.on(`unhandledRejection`,(t,n)=>{T.error(`Unhandled promise rejection at:`,n,`reason:`,t),e(`unhandledRejection`,1)})}async function sr(e,t){if(!e.claudeCode)return!1;Ie(x.models,`Models should be loaded by now`);let n,r;if(e.model&&e.smallModel){let t=x.models.data.map(e=>e.id);t.includes(e.model)||(T.error(`Invalid model: ${e.model}`),T.info(`Available services: \n${t.join(`
23
- `)}`),D.exit(1)),t.includes(e.smallModel)||(T.error(`Invalid small model: ${e.smallModel}`),T.info(`Available services: \n${t.join(`
24
- `)}`),D.exit(1)),n=e.model,r=e.smallModel}else e.model||e.smallModel?(T.error(`Both --model and --small-model must be specified for model selection`),D.exit(1)):(n=await T.prompt(`Select a model to use`,{type:`select`,options:x.models.data.map(e=>e.id)}),r=await T.prompt(`Select a small model to use`,{type:`select`,options:x.models.data.map(e=>e.id)}));let i=Nt({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:`dummy`,ANTHROPIC_MODEL:n,ANTHROPIC_SMALL_FAST_MODEL:r},`\u0063\u006c\u0061\u0075\u0064\u0065`);try{return Pe.writeSync(i),!0}catch{return T.warn(`Failed to copy to clipboard. Here is the command:`),T.log(i),!1}}function cr(e){let{options:t,version:n,runtime:r,githubUser:i}=e,a=C.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.startup`,{kind:ke.INTERNAL,attributes:ne({config:{version:n,port:t.port,accountType:t.accountType,verbose:t.verbose,manualApprove:t.manual,rateLimitSeconds:t.rateLimit??0,rateLimitWait:t.rateLimitWait,timeoutMs:t.timeout,showToken:t.showToken,claudeCode:t.claudeCode,disableConnectivityMonitoring:t.disableConnectivityMonitoring,model:t.model,smallModel:t.smallModel,githubTokenSource:t.githubToken?`cli_arg`:`stored`},runtime:r,identity:{githubUser:i.login,machineId:x.machineId,sessionId:x.sessionId,vsCodeVersion:x.vsCodeVersion},connectivity:x.connectivity,modelsCount:x.models?.data.length??0,startupDurationMs:Date.now()-$},`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api`)});if(x.models?.data)for(let e of x.models.data)a.addEvent(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.available`,ne(e,`model`));a.end(),v(l.INFO,`INFO`,`Server started`,ne({version:n,port:t.port,accountType:t.accountType,githubUser:i.login,modelsCount:x.models?.data.length??0,startupDurationMs:Date.now()-$},`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api`))}function lr(){let e=D.env.COPILOT_H2_KEEPALIVE===`1`||D.env.COPILOT_H2_KEEPALIVE===`true`,t=e||D.env.COPILOT_H2===`1`||D.env.COPILOT_H2===`true`;x.connectivity.h2=t,x.connectivity.h2Keepalive=e}function ur(){x.connectivity.h2&&(Ot(h(x)),x.connectivity.h2Keepalive&&At())}async function dr(e){or(),ir.push(()=>{T.debug(`Cleaning up connectivity monitor`),m.stop()},()=>{T.debug(`Cleaning up token management`),$e()},async()=>{T.debug(`Cleaning up HTTP/2 client`),await jt()},async()=>{T.debug(`Shutting down OTel SDK`),await ve()}),e.verbose&&(T.level=5,T.info(`Verbose logging enabled`)),x.accountType=e.accountType,x.manualApprove=e.manual,x.rateLimitSeconds=e.rateLimit,x.rateLimitWait=e.rateLimitWait,x.showToken=e.showToken,x.timeoutMs=e.timeout,x.connectivity.enabled=!e.disableConnectivityMonitoring,e.tavilyApiKey&&(x.tavilyApiKey=e.tavilyApiKey),lr(),await ee(),Xe();let t=await P();ar=t;let n=ct();oe(t,$),e.githubToken?(x.githubToken=e.githubToken,T.info(`Using provided Auth token`)):await N();let r;try{let{_s4:e}=await import(`./get-user-DdXUcoAP.js`);r=await e(),await se(x,r.login)}catch(e){T.error(`Failed to get user info for machine ID generation:`,e),T.error(`Cannot proceed without user information`),D.exit(1)}await nt(),await Ye(),ur(),cr({options:e,version:t,runtime:n,githubUser:r});let i=`http://localhost:${e.port}`,a=await sr(e,i);qt({version:t,runtime:n,user:r.login,accountType:e.accountType,port:e.port,timeout:e.timeout,webSearch:!!e.tavilyApiKey,model:e.model,smallModel:e.smallModel,clipboardCopied:a}),Fe({fetch:Q.fetch,port:e.port})}const fr=w({meta:{name:`start`,description:`Start the API server`},args:{port:{alias:`p`,type:`string`,default:`4141`,description:`Port to listen on`},verbose:{alias:`v`,type:`boolean`,default:!1,description:`Enable verbose logging`},"account-type":{alias:`a`,type:`string`,default:`individual`,description:`Account type (individual, business, enterprise)`},manual:{type:`boolean`,default:!1,description:`Enable manual request approval`},"rate-limit":{alias:`r`,type:`string`,description:`Rate limit in seconds between requests`},wait:{alias:`w`,type:`boolean`,default:!1,description:`Wait instead of error when rate limit is hit. Has no effect if rate limit is not set`},"\u0067\u0069\u0074\u0068\u0075\u0062-token":{alias:`g`,type:`string`,description:"Provide auth token directly (must be generated using the `auth` subcommand)"},"\u0063\u006c\u0061\u0075\u0064\u0065-code":{alias:`c`,type:`boolean`,default:!1,description:`Generate a command to launch with API config`},model:{alias:`m`,type:`string`,description:`Model to use (requires --\u0063\u006c\u0061\u0075\u0064\u0065-code)`},"small-model":{alias:`s`,type:`string`,description:`Small/fast model to use (requires --\u0063\u006c\u0061\u0075\u0064\u0065-code)`},"show-token":{type:`boolean`,default:!1,description:`Show tokens on fetch and refresh`},timeout:{alias:`t`,type:`string`,description:`API timeout in milliseconds (default: 600000)`},"disable-connectivity-monitoring":{type:`boolean`,default:!1,description:`Disable automatic network monitoring for token refresh`},"tavily-api-key":{type:`string`,description:`Tavily API key for web search support (or set TAVILY_API_KEY env var)`}},run({args:e}){let n=e[`rate-limit`],r=n===void 0?void 0:Number.parseInt(n,10),i=e.timeout,a=i===void 0?t:Number.parseInt(i,10);return dr({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`]||D.env.TAVILY_API_KEY})}});await Tt();const pr=w({meta:{name:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,description:`API proxy server for tool integration.`},subCommands:{auth:at,start:fr,"check-usage":st,debug:mt}});await De(pr);export{};
22
+ `);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 Un(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Wn(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 Gn(e){let t=[],n=[],r=null;r=e.choices[0]?.finish_reason??r;for(let i of e.choices){let e=Kn(i.message.content),a=qn(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:Fn(r),stop_sequence:null,usage:{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}}function Kn(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 qn(e){return e?e.map(e=>({type:`tool_use`,id:e.id,name:e.function.name,input:JSON.parse(e.function.arguments)})):[]}function Jn(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function Yn(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&&(Jn(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:Fn(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 Xn(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),w.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 w.error(`Tavily API error (${i.status}):`,e),Error(`Tavily API error: ${i.status} ${e}`)}let a=await i.json();return w.debug(`Tavily returned ${a.results.length} results`),a.results}function Zn(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 Qn(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 $n(e){let t=e.tools,n=t?.[0],r=typeof n?.max_uses==`number`?n.max_uses:5;return{maxResults:r,allowedDomains:n?.allowed_domains,blockedDomains:n?.blocked_domains}}function Z(){let e=``;for(let t=0;t<24;t++)e+=`abcdefghijklmnopqrstuvwxyz0123456789`[Math.floor(Math.random()*36)];return e}function er(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${Z()}`,a=[{type:`text`,text:`I'll search for that.`},{type:`server_tool_use`,id:i,name:`web_search`,input:{query:t}},{type:`web_search_tool_result`,tool_use_id:i,content:n}];return{id:`msg_tavily_${Z()}`,type:`message`,role:`assistant`,model:r,content:a,stop_reason:`end_turn`,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}}function tr(e){let{query:t,results:n,model:r}=e,i=`srvtoolu_${Z()}`,a=`msg_tavily_${Z()}`,o=[];return o.push({type:`message_start`,message:{id:a,type:`message`,role:`assistant`,content:[],model:r,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}},{type:`content_block_start`,index:0,content_block:{type:`text`,text:``}},{type:`content_block_delta`,index:0,delta:{type:`text_delta`,text:`I'll search for that.`}},{type:`content_block_stop`,index:0},{type:`content_block_start`,index:1,content_block:{type:`server_tool_use`,id:i,name:`web_search`,input:{}}},{type:`content_block_delta`,index:1,delta:{type:`input_json_delta`,partial_json:JSON.stringify({query:t})}},{type:`content_block_stop`,index:1},{type:`content_block_start`,index:2,content_block:{type:`web_search_tool_result`,tool_use_id:i,content:n}},{type:`content_block_stop`,index:2},{type:`message_delta`,delta:{stop_reason:`end_turn`,stop_sequence:null},usage:{output_tokens:0}},{type:`message_stop`}),o}async function nr(e,t){let n=Qn(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=$n(t);w.info(`Web search intercepted: "${n}"`);let i=[];try{let e=b.tavilyApiKey;if(!e)throw Error(`No Tavily API key configured`);let t=await Xn(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){w.error(`Tavily search failed:`,e)}let a={query:n,results:i,model:t.model};if(!t.stream)return e.json(er(a));let o=tr(a);return O(e,async e=>{for(let t of o)await e.writeSSE({event:t.type,data:JSON.stringify(t)})})}function rr(e,t){return S.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=_n(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),de.add(1,{from_model:t.model,to_model:e}),w.debug(`Model mapping: '${t.model}' → '${e}'`),{...t,model:e})}catch(t){if(t instanceof q)return e.json({type:`error`,error:{type:`invalid_request_error`,message:t.message}},t.statusCode),null;throw t}finally{n.end()}})}async function ir(t){let n=await t.req.json();if(Zn(n))return nr(t,n);await vn(b),w.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`},w.debug(`Detected context-1m beta flag, rewriting model: '${e}' → '${n.model}'`)}let a=rr(t,n);if(!a)return;n=a;let o=performance.now(),s=S.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),In(n)}finally{e.end()}});De.record(performance.now()-o,{direction:`\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063_to_\u006f\u0070\u0065\u006e\u0061\u0069`}),w.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();b.manualApprove&&await sn();let l=await xn(s),u=performance.now()-c;if(ee.record(u,{model:s.model,target:`chat_completions`,streaming:String(!!s.stream)}),ar(l)){let e=t.get(`requestData`)||{};l.usage&&(e.tokenUsage=K(l.usage)),e.copilotDuration=u,t.set(`requestData`,e),w.debug(`Non-streaming response:`,JSON.stringify(l).slice(-400));let n=performance.now(),r=S.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=Gn(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 De.record(performance.now()-n,{direction:`\u006f\u0070\u0065\u006e\u0061\u0069_to_\u0061\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063`}),w.debug(`Translated \u0041\u006e\u0074\u0068\u0072\u006f\u0070\u0069\u0063 response:`,JSON.stringify(r)),t.json(r)}w.debug(`Streaming response from service`);let{events:d,span:f,release:m}=l;return O(t,async n=>{let r=null,i=0,a=performance.now(),o={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}};try{try{for await(let e of d){if(w.debug(`Raw stream event:`,JSON.stringify(e)),e.data===`[DONE]`)break;if(!e.data)continue;let a=JSON.parse(e.data);if(i++,xe.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=K(r),e.copilotDuration=u,t.set(`requestData`,e)}let c=Yn(a,o);for(let e of c)w.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(Se.record(e,c),p.record(i,c),r){let e=t.get(`requestData`)||{};e.tokenUsage||(e.tokenUsage=K(r),e.copilotDuration=u,t.set(`requestData`,e))}}finally{r&&ln(f,r),f.end(),m()}let c=t.get(`requestId`);c&&e.executeCompletion(c)}finally{t.get(`resolveStreamComplete`)?.()}})}const ar=e=>Object.hasOwn(e,`choices`),or=new D;or.post(`/`,async e=>{try{return await ir(e)}catch(t){return await v(e,t)}});const sr=new D;sr.get(`/`,async e=>{try{b.models||await Ye();let t=b.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 v(e,t)}});const cr=new D;cr.get(`/`,e=>{try{return e.json({token:b.copilotToken})}catch(t){return console.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const lr=new D;lr.get(`/`,async e=>{try{let t=await ot();return e.json(t)}catch(t){return console.error(`Error fetching usage:`,t),e.json({error:`Failed to fetch usage`},500)}});const Q=new D;Q.use(on()),Q.use(ze()),Q.get(`/`,e=>e.text(`Server running`)),Q.route(`/chat/completions`,En),Q.route(`/models`,sr),Q.route(`/embeddings`,On),Q.route(`/usage`,lr),Q.route(`/token`,cr),Q.route(`/v1/chat/completions`,En),Q.route(`/v1/models`,sr),Q.route(`/v1/embeddings`,On),Q.route(`/v1/messages`,or),Q.post(`/v1/messages/count_tokens`,jn);const ur=[],$=Date.now();let dr=``;function fr(){let e=async(e,t=0)=>{let n=S.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.shutdown`,{kind:Ae.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 ur)try{await e()}catch(e){w.error(`Error during cleanup:`,e)}n.end(),$t(dr,Date.now()-$),E.exit(t)};E.on(`SIGINT`,()=>e(`SIGINT`)),E.on(`SIGTERM`,()=>e(`SIGTERM`)),E.on(`uncaughtException`,t=>{w.error(`Uncaught exception:`,t),e(`uncaughtException`,1)}),E.on(`unhandledRejection`,(t,n)=>{w.error(`Unhandled promise rejection at:`,n,`reason:`,t),e(`unhandledRejection`,1)})}async function pr(e,t){if(!e.claudeCode)return!1;Le(b.models,`Models should be loaded by now`);let n,r;if(e.model&&e.smallModel){let t=b.models.data.map(e=>e.id);t.includes(e.model)||(w.error(`Invalid model: ${e.model}`),w.info(`Available services: \n${t.join(`
23
+ `)}`),E.exit(1)),t.includes(e.smallModel)||(w.error(`Invalid small model: ${e.smallModel}`),w.info(`Available services: \n${t.join(`
24
+ `)}`),E.exit(1)),n=e.model,r=e.smallModel}else e.model||e.smallModel?(w.error(`Both --model and --small-model must be specified for model selection`),E.exit(1)):(n=await w.prompt(`Select a model to use`,{type:`select`,options:b.models.data.map(e=>e.id)}),r=await w.prompt(`Select a small model to use`,{type:`select`,options:b.models.data.map(e=>e.id)}));let i=Rt({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:`dummy`,ANTHROPIC_MODEL:n,ANTHROPIC_SMALL_FAST_MODEL:r},`\u0063\u006c\u0061\u0075\u0064\u0065`);try{return Fe.writeSync(i),!0}catch{return w.warn(`Failed to copy to clipboard. Here is the command:`),w.log(i),!1}}function mr(e){let{options:t,version:n,runtime:r,githubUser:i}=e,a=S.startSpan(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.server.startup`,{kind:Ae.INTERNAL,attributes:re({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:b.machineId,sessionId:b.sessionId,vsCodeVersion:b.vsCodeVersion},connectivity:b.connectivity,modelsCount:b.models?.data.length??0,startupDurationMs:Date.now()-$},`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api`)});if(b.models?.data)for(let e of b.models.data)a.addEvent(`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api.model.available`,re(e,`model`));a.end(),_(l.INFO,`INFO`,`Server started`,re({version:n,port:t.port,accountType:t.accountType,githubUser:i.login,modelsCount:b.models?.data.length??0,startupDurationMs:Date.now()-$},`\u0063\u006f\u0070\u0069\u006c\u006f\u0074_api`))}function hr(){let e=E.env.COPILOT_H2_KEEPALIVE===`1`||E.env.COPILOT_H2_KEEPALIVE===`true`,t=e||E.env.COPILOT_H2===`1`||E.env.COPILOT_H2===`true`;b.connectivity.h2=t,b.connectivity.h2Keepalive=e}function gr(){b.connectivity.h2&&(V(jt(h(b))),b.connectivity.h2Keepalive&&Ft())}async function _r(e){fr(),ur.push(()=>{w.debug(`Cleaning up connectivity monitor`),m.stop()},()=>{w.debug(`Cleaning up token management`),Qe()},async()=>{w.debug(`Cleaning up HTTP/2 client`),await It()},async()=>{w.debug(`Shutting down OTel SDK`),await ye()}),e.verbose&&(w.level=5,w.info(`Verbose logging enabled`)),b.accountType=e.accountType,b.manualApprove=e.manual,b.rateLimitSeconds=e.rateLimit,b.rateLimitWait=e.rateLimitWait,b.showToken=e.showToken,b.timeoutMs=e.timeout,b.connectivity.enabled=!e.disableConnectivityMonitoring,e.tavilyApiKey&&(b.tavilyApiKey=e.tavilyApiKey),hr(),await te(),Xe();let t=await ct();dr=t;let n=lt();se(t,$),e.githubToken?(b.githubToken=e.githubToken,w.info(`Using provided Auth token`)):await nt();let r;try{let{_s4:e}=await import(`./get-user-DdXUcoAP.js`);r=await e(),await ce(b,r.login)}catch(e){w.error(`Failed to get user info for machine ID generation:`,e),w.error(`Cannot proceed without user information`),E.exit(1)}await tt(),await Ye(),gr(),mr({options:e,version:t,runtime:n,githubUser:r});let i=`http://localhost:${e.port}`,a=await pr(e,i);Qt({version:t,runtime:n,user:r.login,accountType:e.accountType,port:e.port,timeout:e.timeout,webSearch:!!e.tavilyApiKey,model:e.model,smallModel:e.smallModel,clipboardCopied:a}),Ie({fetch:Q.fetch,port:e.port})}const vr=C({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 _r({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`]||E.env.TAVILY_API_KEY})}});await Dt();const yr=C({meta:{name:`\u0063\u006f\u0070\u0069\u006c\u006f\u0074-api`,description:`API proxy server for tool integration.`},subCommands:{auth:at,start:vr,"check-usage":st,debug:ht}});await Oe(yr);export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "copilot-api-node20",
3
- "version": "0.19.0",
3
+ "version": "0.19.1",
4
4
  "description": "Turn GitHub Copilot into OpenAI/Anthropic API compatible server. Usable with Claude Code! (Node v20+ fork)",
5
5
  "keywords": [
6
6
  "proxy",