Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

copilot-proxy-api

Package Overview
Dependencies
Maintainers
1
Versions
26
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

copilot-proxy-api - npm Package Compare versions

Comparing version
0.10.10
to
0.10.11
+8
-8
dist/main.mjs
#!/usr/bin/env node
import{n as e,t}from"./error-wiGHep5P.mjs";import{defineCommand as n,runMain as r}from"citty";import i from"consola";import a from"node:fs/promises";import o from"node:os";import s from"node:path";import{randomUUID as c}from"node:crypto";import l from"clipboardy";import{serve as u}from"srvx";import d from"tiny-invariant";import{getProxyForUrl as ee}from"proxy-from-env";import{Agent as te,ProxyAgent as ne,setGlobalDispatcher as re}from"undici";import{execSync as ie}from"node:child_process";import ae from"node:process";import{Hono as f}from"hono";import{cors as oe}from"hono/cors";import{logger as se}from"hono/logger";import{streamSSE as p}from"hono/streaming";import{events as ce}from"fetch-event-stream";const le=s.join(o.homedir(),`.local`,`share`,`copilot-proxy-api`),m={APP_DIR:le,GITHUB_TOKEN_PATH:s.join(le,`github_token`)};async function h(){await a.mkdir(m.APP_DIR,{recursive:!0}),await ue(m.GITHUB_TOKEN_PATH)}async function ue(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,``),await a.chmod(e,384)}}const g={accountType:`individual`,manualApprove:!1,rateLimitWait:!1,showToken:!1,localApiKeys:[]},_=()=>({"content-type":`application/json`,accept:`application/json`}),v=`0.43.0`,de=`copilot-chat/${v}`,fe=`GitHubCopilotChat/${v}`,pe=`2025-04-01`,y=e=>e.accountType===`individual`?`https://api.githubcopilot.com`:`https://api.${e.accountType}.githubcopilot.com`,b=(e,t=!1)=>{let n={Authorization:`Bearer ${e.copilotToken}`,"content-type":_()[`content-type`],"copilot-integration-id":`vscode-chat`,"editor-version":`vscode/${e.vsCodeVersion}`,"editor-plugin-version":de,"user-agent":fe,"openai-intent":`conversation-panel`,"x-github-api-version":pe,"x-request-id":c(),"x-vscode-user-agent-library-version":`electron-fetch`};return t&&(n[`copilot-vision-request`]=`true`),n},x=`https://api.github.com`,me=e=>({..._(),authorization:`token ${e.githubToken}`,"editor-version":`vscode/${e.vsCodeVersion}`,"editor-plugin-version":de,"user-agent":fe,"x-github-api-version":pe,"x-vscode-user-agent-library-version":`electron-fetch`}),he=`https://github.com`,ge=`Iv1.b507a08c87ecfe98`,_e=[`read:user`].join(` `),S=async()=>{let e=await fetch(`${x}/copilot_internal/v2/token`,{headers:me(g)});if(!e.ok)throw new t(`Failed to get Copilot token`,e);return await e.json()};async function ve(){let e=await fetch(`${he}/login/device/code`,{method:`POST`,headers:_(),body:JSON.stringify({client_id:ge,scope:_e})});if(!e.ok)throw new t(`Failed to get device code`,e);return await e.json()}async function ye(){let e=await fetch(`${x}/user`,{headers:{authorization:`token ${g.githubToken}`,..._()}});if(!e.ok)throw new t(`Failed to get GitHub user`,e);return await e.json()}const be=async()=>{let e=await fetch(`${y(g)}/models`,{headers:b(g)});if(!e.ok)throw new t(`Failed to get models`,e);return await e.json()},xe=`1.114.0`;async function C(){let e=new AbortController,t=setTimeout(()=>{e.abort()},5e3);try{let t=(await(await fetch(`https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=visual-studio-code-bin`,{signal:e.signal})).text()).match(/pkgver=([0-9.]+)/);return t?t[1]:xe}catch{return xe}finally{clearTimeout(t)}}await C();const w=e=>new Promise(t=>{setTimeout(t,e)}),Se=e=>e==null;async function T(){g.models=await be()}const Ce=async()=>{let e=await C();g.vsCodeVersion=e,i.info(`Using VSCode version: ${e}`)};async function we(e){let t=(e.interval+1)*1e3;for(i.debug(`Polling access token with interval of ${t}ms`);;){let n=await fetch(`${he}/login/oauth/access_token`,{method:`POST`,headers:_(),body:JSON.stringify({client_id:ge,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`})});if(!n.ok){await w(t),i.error(`Failed to poll access token:`,await n.text());continue}let r=await n.json();i.debug(`Polling access token response:`,r);let{access_token:a}=r;if(a)return a;await w(t)}}const Te=()=>a.readFile(m.GITHUB_TOKEN_PATH,`utf8`),Ee=e=>a.writeFile(m.GITHUB_TOKEN_PATH,e),De=async()=>{let{token:e,refresh_in:t}=await S();g.copilotToken=e,i.debug(`GitHub Copilot Token fetched successfully!`),g.showToken&&i.info(`Copilot token:`,e);let n=(t-60)*1e3,r=async(e=5,t=1e3)=>{for(let n=1;n<=e;n++)try{let{token:e}=await S();g.copilotToken=e,i.debug(`Copilot token refreshed`),g.showToken&&i.info(`Refreshed Copilot token:`,e);return}catch(r){if(i.error(`Failed to refresh Copilot token (attempt ${n}/${e}):`,r),n<e){let e=t*2**(n-1);i.info(`Retrying in ${e/1e3} seconds...`),await new Promise(t=>setTimeout(t,e))}else i.error(`Max retries reached. Token refresh failed, but keeping server alive.`)}};setInterval(()=>{i.debug(`Refreshing Copilot token`),r()},n)};async function E(e){try{let t=await Te();if(t&&!e?.force){g.githubToken=t,g.showToken&&i.info(`GitHub token:`,t),await Oe();return}i.info(`Not logged in, getting new access token`);let n=await ve();i.debug(`Device code response:`,n),i.info(`Please enter the code "${n.user_code}" in ${n.verification_uri}`);let r=await we(n);await Ee(r),g.githubToken=r,g.showToken&&i.info(`GitHub token:`,r),await Oe()}catch(e){throw e instanceof t?(i.error(`Failed to get GitHub token:`,await e.response.json()),e):(i.error(`Failed to get GitHub token:`,e),e)}}async function Oe(){let e=await ye();i.info(`Logged in as ${e.login}`)}async function ke(e){e.verbose&&(i.level=5,i.info(`Verbose logging enabled`)),g.showToken=e.showToken,await h(),await E({force:!0}),i.success(`GitHub token written to`,m.GITHUB_TOKEN_PATH)}const Ae=n({meta:{name:`auth`,description:`Run GitHub auth flow without running the server`},args:{verbose:{alias:`v`,type:`boolean`,default:!1,description:`Enable verbose logging`},"show-token":{type:`boolean`,default:!1,description:`Show GitHub token on auth`}},run({args:e}){return ke({verbose:e.verbose,showToken:e[`show-token`]})}}),je=async()=>{let e=await fetch(`${x}/copilot_internal/user`,{headers:me(g)});if(!e.ok)throw new t(`Failed to get Copilot usage`,e);return await e.json()},Me=n({meta:{name:`check-usage`,description:`Show current GitHub Copilot usage/quota information`},async run(){await h(),await E();try{let e=await je(),t=e.quota_snapshots.premium_interactions,n=t.entitlement,r=n-t.remaining,a=n>0?r/n*100:0,o=t.percent_remaining;function s(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 c=`Premium: ${r}/${n} used (${a.toFixed(1)}% used, ${o.toFixed(1)}% remaining)`,l=s(`Chat`,e.quota_snapshots.chat),u=s(`Completions`,e.quota_snapshots.completions);i.box(`Copilot Usage (plan: ${e.copilot_plan})\nQuota resets: ${e.quota_reset_date}\n\nQuotas:\n ${c}\n ${l}\n ${u}`)}catch(e){i.error(`Failed to fetch Copilot usage:`,e),process.exit(1)}}});async function Ne(){try{let e=new URL(`../package.json`,import.meta.url).pathname;return JSON.parse(await a.readFile(e)).version}catch{return`unknown`}}function Pe(){let e=typeof Bun<`u`;return{name:e?`bun`:`node`,version:e?Bun.version:process.version.slice(1),platform:o.platform(),arch:o.arch()}}async function Fe(){try{return(await a.stat(m.GITHUB_TOKEN_PATH)).isFile()?(await a.readFile(m.GITHUB_TOKEN_PATH,`utf8`)).trim().length>0:!1}catch{return!1}}async function Ie(){let[e,t]=await Promise.all([Ne(),Fe()]);return{version:e,runtime:Pe(),paths:{APP_DIR:m.APP_DIR,GITHUB_TOKEN_PATH:m.GITHUB_TOKEN_PATH},tokenExists:t}}function Le(e){i.info(`copilot-proxy-api debug
import{n as e,t}from"./error-wiGHep5P.mjs";import{defineCommand as n,runMain as r}from"citty";import i from"consola";import a from"node:fs/promises";import o from"node:os";import s from"node:path";import{randomUUID as c}from"node:crypto";import l from"clipboardy";import{serve as u}from"srvx";import ee from"tiny-invariant";import{getProxyForUrl as te}from"proxy-from-env";import{Agent as ne,ProxyAgent as re,setGlobalDispatcher as ie}from"undici";import{execSync as ae}from"node:child_process";import oe from"node:process";import{Hono as d}from"hono";import{cors as se}from"hono/cors";import{logger as ce}from"hono/logger";import{streamSSE as f}from"hono/streaming";import{events as le}from"fetch-event-stream";const p=s.join(o.homedir(),`.local`,`share`,`copilot-proxy-api`),m={APP_DIR:p,GITHUB_TOKEN_PATH:s.join(p,`github_token`)};async function h(){await a.mkdir(m.APP_DIR,{recursive:!0}),await ue(m.GITHUB_TOKEN_PATH)}async function ue(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,``),await a.chmod(e,384)}}const g={accountType:`individual`,manualApprove:!1,rateLimitWait:!1,showToken:!1,localApiKeys:[]},_=()=>({"content-type":`application/json`,accept:`application/json`}),v=`0.43.0`,de=`copilot-chat/${v}`,fe=`GitHubCopilotChat/${v}`,pe=`2025-04-01`,y=e=>e.accountType===`individual`?`https://api.githubcopilot.com`:`https://api.${e.accountType}.githubcopilot.com`,b=(e,t=!1)=>{let n={Authorization:`Bearer ${e.copilotToken}`,"content-type":_()[`content-type`],"copilot-integration-id":`vscode-chat`,"editor-version":`vscode/${e.vsCodeVersion}`,"editor-plugin-version":de,"user-agent":fe,"openai-intent":`conversation-panel`,"x-github-api-version":pe,"x-request-id":c(),"x-vscode-user-agent-library-version":`electron-fetch`};return t&&(n[`copilot-vision-request`]=`true`),n},x=`https://api.github.com`,me=e=>({..._(),authorization:`token ${e.githubToken}`,"editor-version":`vscode/${e.vsCodeVersion}`,"editor-plugin-version":de,"user-agent":fe,"x-github-api-version":pe,"x-vscode-user-agent-library-version":`electron-fetch`}),he=`https://github.com`,ge=`Iv1.b507a08c87ecfe98`,_e=[`read:user`].join(` `),ve=async()=>{let e=await fetch(`${x}/copilot_internal/v2/token`,{headers:me(g)});if(!e.ok)throw new t(`Failed to get Copilot token`,e);return await e.json()};async function ye(){let e=await fetch(`${he}/login/device/code`,{method:`POST`,headers:_(),body:JSON.stringify({client_id:ge,scope:_e})});if(!e.ok)throw new t(`Failed to get device code`,e);return await e.json()}async function be(){let e=await fetch(`${x}/user`,{headers:{authorization:`token ${g.githubToken}`,..._()}});if(!e.ok)throw new t(`Failed to get GitHub user`,e);return await e.json()}const xe=async()=>{let e=await fetch(`${y(g)}/models`,{headers:b(g)});if(!e.ok)throw new t(`Failed to get models`,e);return await e.json()},S=`1.114.0`;async function C(){let e=new AbortController,t=setTimeout(()=>{e.abort()},5e3);try{let t=(await(await fetch(`https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=visual-studio-code-bin`,{signal:e.signal})).text()).match(/pkgver=([0-9.]+)/);return t?t[1]:S}catch{return S}finally{clearTimeout(t)}}await C();const w=e=>new Promise(t=>{setTimeout(t,e)}),Se=e=>e==null;async function T(){g.models=await xe()}const Ce=async()=>{let e=await C();g.vsCodeVersion=e,i.info(`Using VSCode version: ${e}`)};async function we(e){let t=(e.interval+1)*1e3;for(i.debug(`Polling access token with interval of ${t}ms`);;){let n=await fetch(`${he}/login/oauth/access_token`,{method:`POST`,headers:_(),body:JSON.stringify({client_id:ge,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`})});if(!n.ok){await w(t),i.error(`Failed to poll access token:`,await n.text());continue}let r=await n.json();i.debug(`Polling access token response:`,r);let{access_token:a}=r;if(a)return a;await w(t)}}const Te=()=>a.readFile(m.GITHUB_TOKEN_PATH,`utf8`),Ee=e=>a.writeFile(m.GITHUB_TOKEN_PATH,e),De=async()=>{let{token:e,refresh_in:t}=await ve();g.copilotToken=e,i.debug(`GitHub Copilot Token fetched successfully!`),g.showToken&&i.info(`Copilot token:`,e);let n=(t-60)*1e3,r=async(e=5,t=1e3)=>{for(let n=1;n<=e;n++)try{let{token:e}=await ve();g.copilotToken=e,i.debug(`Copilot token refreshed`),g.showToken&&i.info(`Refreshed Copilot token:`,e);return}catch(r){if(i.error(`Failed to refresh Copilot token (attempt ${n}/${e}):`,r),n<e){let e=t*2**(n-1);i.info(`Retrying in ${e/1e3} seconds...`),await new Promise(t=>setTimeout(t,e))}else i.error(`Max retries reached. Token refresh failed, but keeping server alive.`)}};setInterval(()=>{i.debug(`Refreshing Copilot token`),r()},n)};async function E(e){try{let t=await Te();if(t&&!e?.force){g.githubToken=t,g.showToken&&i.info(`GitHub token:`,t),await D();return}i.info(`Not logged in, getting new access token`);let n=await ye();i.debug(`Device code response:`,n),i.info(`Please enter the code "${n.user_code}" in ${n.verification_uri}`);let r=await we(n);await Ee(r),g.githubToken=r,g.showToken&&i.info(`GitHub token:`,r),await D()}catch(e){throw e instanceof t?(i.error(`Failed to get GitHub token:`,await e.response.json()),e):(i.error(`Failed to get GitHub token:`,e),e)}}async function D(){let e=await be();i.info(`Logged in as ${e.login}`)}async function Oe(e){e.verbose&&(i.level=5,i.info(`Verbose logging enabled`)),g.showToken=e.showToken,await h(),await E({force:!0}),i.success(`GitHub token written to`,m.GITHUB_TOKEN_PATH)}const ke=n({meta:{name:`auth`,description:`Run GitHub auth flow without running the server`},args:{verbose:{alias:`v`,type:`boolean`,default:!1,description:`Enable verbose logging`},"show-token":{type:`boolean`,default:!1,description:`Show GitHub token on auth`}},run({args:e}){return Oe({verbose:e.verbose,showToken:e[`show-token`]})}}),O=async()=>{let e=await fetch(`${x}/copilot_internal/user`,{headers:me(g)});if(!e.ok)throw new t(`Failed to get Copilot usage`,e);return await e.json()},Ae=n({meta:{name:`check-usage`,description:`Show current GitHub Copilot usage/quota information`},async run(){await h(),await E();try{let e=await O(),t=e.quota_snapshots.premium_interactions,n=t.entitlement,r=n-t.remaining,a=n>0?r/n*100:0,o=t.percent_remaining;function s(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 c=`Premium: ${r}/${n} used (${a.toFixed(1)}% used, ${o.toFixed(1)}% remaining)`,l=s(`Chat`,e.quota_snapshots.chat),u=s(`Completions`,e.quota_snapshots.completions);i.box(`Copilot Usage (plan: ${e.copilot_plan})\nQuota resets: ${e.quota_reset_date}\n\nQuotas:\n ${c}\n ${l}\n ${u}`)}catch(e){i.error(`Failed to fetch Copilot usage:`,e),process.exit(1)}}});async function je(){try{let e=new URL(`../package.json`,import.meta.url).pathname;return JSON.parse(await a.readFile(e)).version}catch{return`unknown`}}function Me(){let e=typeof Bun<`u`;return{name:e?`bun`:`node`,version:e?Bun.version:process.version.slice(1),platform:o.platform(),arch:o.arch()}}async function Ne(){try{return(await a.stat(m.GITHUB_TOKEN_PATH)).isFile()?(await a.readFile(m.GITHUB_TOKEN_PATH,`utf8`)).trim().length>0:!1}catch{return!1}}async function Pe(){let[e,t]=await Promise.all([je(),Ne()]);return{version:e,runtime:Me(),paths:{APP_DIR:m.APP_DIR,GITHUB_TOKEN_PATH:m.GITHUB_TOKEN_PATH},tokenExists:t}}function Fe(e){i.info(`copilot-proxy-api debug

@@ -11,17 +11,17 @@ Version: ${e.version}

Token exists: ${e.tokenExists?`Yes`:`No`}`)}function Re(e){console.log(JSON.stringify(e,null,2))}async function ze(e){let t=await Ie();e.json?Re(t):Le(t)}const Be=n({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 ze({json:e.json})}});function Ve(e){return e?e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):[]}const He=async(e,t)=>{if(g.localApiKeys.length===0||e.req.method===`OPTIONS`){await t();return}let n=Ue(e.req.header(`authorization`)),r=e.req.header(`x-api-key`)?.trim();if(n&&g.localApiKeys.includes(n)||r&&g.localApiKeys.includes(r)){await t();return}return e.json({error:{message:`Missing or invalid API key`,type:`authentication_error`}},401)};function Ue(e){if(!e||!e.toLowerCase().startsWith(`bearer `))return;let t=e.slice(7).trim();return t.length>0?t:void 0}function We(){if(!(typeof Bun<`u`))try{let e=new te,t=new Map;re({dispatch(n,r){try{let a=typeof n.origin==`string`?new URL(n.origin):n.origin,o=ee(a.toString()),s=o&&o.length>0?o:void 0;if(!s)return i.debug(`HTTP proxy bypass: ${a.hostname}`),e.dispatch(n,r);let c=t.get(s);c||(c=new ne(s),t.set(s,c));let l=s;try{let e=new URL(s);l=`${e.protocol}//${e.host}`}catch{}return i.debug(`HTTP proxy route: ${a.hostname} via ${l}`),c.dispatch(n,r)}catch{return e.dispatch(n,r)}},close(){return e.close()},destroy(){return e.destroy()}}),i.debug(`HTTP proxy configured from environment (per-URL)`)}catch(e){i.debug(`Proxy setup skipped:`,e)}}function Ge(){let{platform:e,ppid:t,env:n}=ae;if(e===`win32`){try{if(ie(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:`pipe`}).toString().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 Ke(e,t=``){let n=Ge(),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}}return i&&t?`${i}${n===`cmd`?` & `:` && `}${t}`:i||t}const D=[];function qe(){return`req_${c().replaceAll(`-`,``)}`}function Je(e){return e instanceof Error?e.message:`Unknown error`}function Ye(e){D.unshift(e),D.length>100&&(D.length=100)}function Xe(){return[...D]}const Ze=async(e,t)=>{let n=Date.now(),r=new Date(n).toISOString(),i=e.req.header(`x-client-request-id`)??e.req.header(`x-request-id`)??qe();e.header(`request-id`,i),e.header(`x-request-id`,i);let a;try{await t()}catch(e){throw a=Je(e),e}finally{let t=e.res.headers.get(`x-request-id`)??e.res.headers.get(`request-id`)??i,o=a?500:e.res.status;Ye({id:t,method:e.req.method,path:e.req.path,status:o,ok:!a&&o<400,durationMs:Date.now()-n,startedAt:r,error:a})}},O=async()=>{if(!await i.prompt(`Accept incoming request?`,{type:`confirm`}))throw new t(`Request rejected`,Response.json({message:`Request rejected`},{status:403}))};async function k(e){if(e.rateLimitSeconds===void 0)return;let n=Date.now();if(!e.lastRequestTimestamp){e.lastRequestTimestamp=n;return}let r=(n-e.lastRequestTimestamp)/1e3;if(r>e.rateLimitSeconds){e.lastRequestTimestamp=n;return}let a=Math.ceil(e.rateLimitSeconds-r);if(!e.rateLimitWait)throw i.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new t(`Rate limit exceeded`,Response.json({message:`Rate limit exceeded`},{status:429}));let o=a*1e3;i.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await w(o),e.lastRequestTimestamp=n,i.info(`Rate limit wait completed, proceeding with request`)}const A={o200k_base:()=>import(`gpt-tokenizer/encoding/o200k_base`),cl100k_base:()=>import(`gpt-tokenizer/encoding/cl100k_base`),p50k_base:()=>import(`gpt-tokenizer/encoding/p50k_base`),p50k_edit:()=>import(`gpt-tokenizer/encoding/p50k_edit`),r50k_base:()=>import(`gpt-tokenizer/encoding/r50k_base`)},j=new Map,Qe=(e,t,n)=>{let r=0;for(let i of e)r+=n.funcInit,r+=t.encode(JSON.stringify(i)).length;return r+=n.funcEnd,r},$e=(e,t)=>{let n=0;for(let r of e)r.type===`image_url`?n+=t.encode(r.image_url.url).length+85:r.text&&(n+=t.encode(r.text).length);return n},et=(e,t,n)=>{let r=3;for(let[i,a]of Object.entries(e))typeof a==`string`&&(r+=t.encode(a).length),i===`name`&&(r+=1),i===`tool_calls`&&(r+=Qe(a,t,n)),i===`content`&&Array.isArray(a)&&(r+=$e(a,t));return r},tt=(e,t,n)=>{if(e.length===0)return 0;let r=0;for(let i of e)r+=et(i,t,n);return r+=3,r},nt=async e=>{if(j.has(e)){let t=j.get(e);if(t)return t}let t=e;if(!(t in A)){let t=await A.o200k_base();return j.set(e,t),t}let n=await A[t]();return j.set(e,n),n},rt=e=>e.capabilities.tokenizer||`o200k_base`,it=e=>e.id===`gpt-3.5-turbo`||e.id===`gpt-4`?{funcInit:10,propInit:3,propKey:3,enumInit:-3,enumItem:3,funcEnd:12}:{funcInit:7,propInit:3,propKey:3,enumInit:-3,enumItem:3,funcEnd:12},at=(e,t,n)=>{let{encoder:r,constants:i}=n,a=i.propKey;if(typeof t!=`object`||!t)return a;let o=t,s=e,c=o.type||`string`,l=o.description||``;if(o.enum&&Array.isArray(o.enum)){a+=i.enumInit;for(let e of o.enum)a+=i.enumItem,a+=r.encode(String(e)).length}l.endsWith(`.`)&&(l=l.slice(0,-1));let u=`${s}:${c}:${l}`;a+=r.encode(u).length;let d=new Set([`type`,`description`,`enum`]);for(let e of Object.keys(o))if(!d.has(e)){let t=o[e],n=typeof t==`string`?t:JSON.stringify(t);a+=r.encode(`${e}:${n}`).length}return a},ot=(e,t,n)=>{if(!e||typeof e!=`object`)return 0;let r=e,i=0;for(let[e,a]of Object.entries(r))if(e===`properties`){let e=a;if(Object.keys(e).length>0){i+=n.propInit;for(let r of Object.keys(e))i+=at(r,e[r],{encoder:t,constants:n})}}else{let n=typeof a==`string`?a:JSON.stringify(a);i+=t.encode(`${e}:${n}`).length}return i},st=(e,t,n)=>{let r=n.funcInit,i=e.function,a=i.name,o=i.description||``;o.endsWith(`.`)&&(o=o.slice(0,-1));let s=a+`:`+o;return r+=t.encode(s).length,typeof i.parameters==`object`&&i.parameters!==null&&(r+=ot(i.parameters,t,n)),r},ct=(e,t,n)=>{let r=0;for(let i of e)r+=st(i,t,n);return r+=n.funcEnd,r},M=async(e,t)=>{let n=await nt(rt(t)),r=e.messages,i=r.filter(e=>e.role!==`assistant`),a=r.filter(e=>e.role===`assistant`),o=it(t),s=tt(i,n,o);e.tools&&e.tools.length>0&&(s+=ct(e.tools,n,o));let c=tt(a,n,o);return{input:s,output:c}};async function N(e,t){let{attempts:n=3,retryDelayMs:r=250,...a}=t,o=typeof a.body==`string`?a.body.length:0,s;for(let t=1;t<=n;t++){try{let r=await fetch(e,a);if(!lt(r,o)||t===n)return r;i.warn(`Copilot request returned ${r.status}; retrying (${t}/${n})`)}catch(e){if(s=e,t===n)throw e;i.warn(`Copilot request failed; retrying (${t}/${n})`)}await w(r*t)}throw s instanceof Error?s:Error(`Copilot request failed`)}function lt(e,t){return e.status>=500&&t>2e6?!1:e.status===408||e.status===409||e.status===425||e.status===429||e.status===500||e.status===502||e.status===503||e.status===504}const P=async e=>{if(!g.copilotToken)throw Error(`Copilot token not found`);let n=e.messages.some(e=>typeof e.content!=`string`&&e.content?.some(e=>e.type===`image_url`)),r=e.messages.some(e=>[`assistant`,`tool`].includes(e.role)),a={...b(g,n),"X-Initiator":r?`agent`:`user`},o=JSON.stringify(e);i.info(`Sending payload: ${o.length} bytes, ${e.messages.length} messages, model: ${e.model}`);let s=await N(`${y(g)}/chat/completions`,{method:`POST`,headers:a,body:o});if(!s.ok){let n=await s.text();if(i.error(`Failed to create chat completions - Status: ${s.status} ${s.statusText}`),i.error(`Response body: ${n}`),i.error(`Request payload size: ${o.length} bytes`),s.status===413||/request entity too large/i.test(n)||/exceeds the limit of \d+/i.test(n)||/context_length_exceeded/i.test(n)||/operation timed out/i.test(n)||/payload too large/i.test(n)||/maximum context length/i.test(n)||s.status>=500&&s.status<600&&o.length>2e6){let n=Math.ceil(o.length/4),r=g.models?.data.find(t=>t.id===e.model)?.capabilities.limits,a=r?.max_prompt_tokens??r?.max_context_window_tokens??2e5,s=e.max_tokens??0;throw i.warn(`Context overflow → returning 400 prompt-too-long (~${n} + ${s} > ${a}) to trigger Claude Code reactive compaction`),new t(`Prompt too long`,new Response(JSON.stringify({type:`error`,error:{type:`invalid_request_error`,message:`prompt is too long: input length and \`max_tokens\` exceed context limit: ${n} + ${s} > ${a} tokens`}}),{status:400,statusText:`Bad Request`,headers:{"content-type":`application/json`}}))}throw new t(`Failed to create chat completions`,new Response(n,{status:s.status,statusText:s.statusText,headers:s.headers}))}return e.stream?ce(s):await s.json()};async function ut(e){await k(g);let t=await e.req.json();i.debug(`Request payload:`,JSON.stringify(t).slice(-400));let n=g.models?.data.find(e=>e.id===t.model);try{if(n){let e=await M(t,n);i.info(`Current token count:`,e)}else i.warn(`No model selected, skipping token count calculation`)}catch(e){i.warn(`Failed to calculate token count:`,e)}g.manualApprove&&await O(),Se(t.max_tokens)&&(t={...t,max_tokens:n?.capabilities.limits.max_output_tokens},i.debug(`Set max_tokens to:`,JSON.stringify(t.max_tokens)));let r=await P(t);return dt(r)?(i.debug(`Non-streaming response:`,JSON.stringify(r)),e.json(r)):(i.debug(`Streaming response`),p(e,async e=>{try{for await(let t of r)i.debug(`Streaming chunk:`,JSON.stringify(t)),await e.writeSSE(t)}catch(t){i.error(`Streaming error:`,t),await e.writeSSE({data:JSON.stringify({error:{message:t instanceof Error?t.message:`Stream interrupted`,type:`server_error`}})})}}))}const dt=e=>Object.hasOwn(e,`choices`),F=new f;F.post(`/`,async t=>{try{return await ut(t)}catch(n){return await e(t,n)}});const I=new f;I.get(`/requests`,e=>e.json({object:`list`,data:Xe()}));const ft=async e=>{if(!g.copilotToken)throw Error(`Copilot token not found`);let n=await N(`${y(g)}/embeddings`,{method:`POST`,headers:b(g),body:JSON.stringify(e)});if(!n.ok)throw new t(`Failed to create embeddings`,n);return await n.json()},L=new f;L.post(`/`,async t=>{try{let e=await ft(await t.req.json());return t.json(e)}catch(n){return await e(t,n)}});function R(e){return e===null?null:{stop:`end_turn`,length:`max_tokens`,tool_calls:`tool_use`,content_filter:`refusal`}[e]}function z(e){return{model:vt(e.model),messages:yt(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:wt(e.tools),tool_choice:Et(e.tool_choice),thinking:Tt(e.thinking)}}async function pt(e){if(!e.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`document`)))return e;let t=[];for(let n of e.messages){if(n.role!==`user`||!Array.isArray(n.content)){t.push(n);continue}let e=[];for(let t of n.content)t.type===`document`?e.push(...await mt(t)):e.push(t);t.push({role:`user`,content:e})}return{...e,messages:t}}async function mt(e){if(e.source.type===`text`)return[{type:`text`,text:B(e)+e.source.data}];if(e.source.type===`url`)return[{type:`text`,text:B(e)+`[document at ${e.source.url} not inlined — proxy does not fetch external URLs]`}];let{extractPdfText:t}=await import(`./pdf-3rCh0vDg.mjs`),n=await t(e.source.data);return[{type:`text`,text:B(e)+`[Extracted text from PDF (${n.pageCount} page${n.pageCount===1?``:`s`}${n.truncated?`, truncated`:``}):]\n\n`+n.text}]}function B(e){let t=[];return e.title&&t.push(`Document: ${e.title}`),e.context&&t.push(`Context: ${e.context}`),t.length>0?t.join(`
Token exists: ${e.tokenExists?`Yes`:`No`}`)}function Ie(e){console.log(JSON.stringify(e,null,2))}async function Le(e){let t=await Pe();e.json?Ie(t):Fe(t)}const Re=n({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 Le({json:e.json})}});function ze(e){return e?e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):[]}const Be=async(e,t)=>{if(g.localApiKeys.length===0||e.req.method===`OPTIONS`){await t();return}let n=Ve(e.req.header(`authorization`)),r=e.req.header(`x-api-key`)?.trim();if(n&&g.localApiKeys.includes(n)||r&&g.localApiKeys.includes(r)){await t();return}return e.json({error:{message:`Missing or invalid API key`,type:`authentication_error`}},401)};function Ve(e){if(!e||!e.toLowerCase().startsWith(`bearer `))return;let t=e.slice(7).trim();return t.length>0?t:void 0}function He(){if(!(typeof Bun<`u`))try{let e=new ne,t=new Map;ie({dispatch(n,r){try{let a=typeof n.origin==`string`?new URL(n.origin):n.origin,o=te(a.toString()),s=o&&o.length>0?o:void 0;if(!s)return i.debug(`HTTP proxy bypass: ${a.hostname}`),e.dispatch(n,r);let c=t.get(s);c||(c=new re(s),t.set(s,c));let l=s;try{let e=new URL(s);l=`${e.protocol}//${e.host}`}catch{}return i.debug(`HTTP proxy route: ${a.hostname} via ${l}`),c.dispatch(n,r)}catch{return e.dispatch(n,r)}},close(){return e.close()},destroy(){return e.destroy()}}),i.debug(`HTTP proxy configured from environment (per-URL)`)}catch(e){i.debug(`Proxy setup skipped:`,e)}}function Ue(){let{platform:e,ppid:t,env:n}=oe;if(e===`win32`){try{if(ae(`wmic process get ParentProcessId,Name | findstr "${t}"`,{stdio:`pipe`}).toString().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 We(e,t=``){let n=Ue(),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}}return i&&t?`${i}${n===`cmd`?` & `:` && `}${t}`:i||t}const k=[];function Ge(){return`req_${c().replaceAll(`-`,``)}`}function Ke(e){return e instanceof Error?e.message:`Unknown error`}function qe(e){k.unshift(e),k.length>100&&(k.length=100)}function Je(){return[...k]}const Ye=async(e,t)=>{let n=Date.now(),r=new Date(n).toISOString(),i=e.req.header(`x-client-request-id`)??e.req.header(`x-request-id`)??Ge();e.header(`request-id`,i),e.header(`x-request-id`,i);let a;try{await t()}catch(e){throw a=Ke(e),e}finally{let t=e.res.headers.get(`x-request-id`)??e.res.headers.get(`request-id`)??i,o=a?500:e.res.status;qe({id:t,method:e.req.method,path:e.req.path,status:o,ok:!a&&o<400,durationMs:Date.now()-n,startedAt:r,error:a})}},A=async()=>{if(!await i.prompt(`Accept incoming request?`,{type:`confirm`}))throw new t(`Request rejected`,Response.json({message:`Request rejected`},{status:403}))};async function j(e){if(e.rateLimitSeconds===void 0)return;let n=Date.now();if(!e.lastRequestTimestamp){e.lastRequestTimestamp=n;return}let r=(n-e.lastRequestTimestamp)/1e3;if(r>e.rateLimitSeconds){e.lastRequestTimestamp=n;return}let a=Math.ceil(e.rateLimitSeconds-r);if(!e.rateLimitWait)throw i.warn(`Rate limit exceeded. Need to wait ${a} more seconds.`),new t(`Rate limit exceeded`,Response.json({message:`Rate limit exceeded`},{status:429}));let o=a*1e3;i.warn(`Rate limit reached. Waiting ${a} seconds before proceeding...`),await w(o),e.lastRequestTimestamp=n,i.info(`Rate limit wait completed, proceeding with request`)}const M={o200k_base:()=>import(`gpt-tokenizer/encoding/o200k_base`),cl100k_base:()=>import(`gpt-tokenizer/encoding/cl100k_base`),p50k_base:()=>import(`gpt-tokenizer/encoding/p50k_base`),p50k_edit:()=>import(`gpt-tokenizer/encoding/p50k_edit`),r50k_base:()=>import(`gpt-tokenizer/encoding/r50k_base`)},N=new Map,Xe=(e,t,n)=>{let r=0;for(let i of e)r+=n.funcInit,r+=t.encode(JSON.stringify(i)).length;return r+=n.funcEnd,r},Ze=(e,t)=>{let n=0;for(let r of e)r.type===`image_url`?n+=t.encode(r.image_url.url).length+85:r.text&&(n+=t.encode(r.text).length);return n},Qe=(e,t,n)=>{let r=3;for(let[i,a]of Object.entries(e))typeof a==`string`&&(r+=t.encode(a).length),i===`name`&&(r+=1),i===`tool_calls`&&(r+=Xe(a,t,n)),i===`content`&&Array.isArray(a)&&(r+=Ze(a,t));return r},P=(e,t,n)=>{if(e.length===0)return 0;let r=0;for(let i of e)r+=Qe(i,t,n);return r+=3,r},$e=async e=>{if(N.has(e)){let t=N.get(e);if(t)return t}let t=e;if(!(t in M)){let t=await M.o200k_base();return N.set(e,t),t}let n=await M[t]();return N.set(e,n),n},et=e=>e.capabilities.tokenizer||`o200k_base`,tt=e=>e.id===`gpt-3.5-turbo`||e.id===`gpt-4`?{funcInit:10,propInit:3,propKey:3,enumInit:-3,enumItem:3,funcEnd:12}:{funcInit:7,propInit:3,propKey:3,enumInit:-3,enumItem:3,funcEnd:12},nt=(e,t,n)=>{let{encoder:r,constants:i}=n,a=i.propKey;if(typeof t!=`object`||!t)return a;let o=t,s=e,c=o.type||`string`,l=o.description||``;if(o.enum&&Array.isArray(o.enum)){a+=i.enumInit;for(let e of o.enum)a+=i.enumItem,a+=r.encode(String(e)).length}l.endsWith(`.`)&&(l=l.slice(0,-1));let u=`${s}:${c}:${l}`;a+=r.encode(u).length;let ee=new Set([`type`,`description`,`enum`]);for(let e of Object.keys(o))if(!ee.has(e)){let t=o[e],n=typeof t==`string`?t:JSON.stringify(t);a+=r.encode(`${e}:${n}`).length}return a},rt=(e,t,n)=>{if(!e||typeof e!=`object`)return 0;let r=e,i=0;for(let[e,a]of Object.entries(r))if(e===`properties`){let e=a;if(Object.keys(e).length>0){i+=n.propInit;for(let r of Object.keys(e))i+=nt(r,e[r],{encoder:t,constants:n})}}else{let n=typeof a==`string`?a:JSON.stringify(a);i+=t.encode(`${e}:${n}`).length}return i},it=(e,t,n)=>{let r=n.funcInit,i=e.function,a=i.name,o=i.description||``;o.endsWith(`.`)&&(o=o.slice(0,-1));let s=a+`:`+o;return r+=t.encode(s).length,typeof i.parameters==`object`&&i.parameters!==null&&(r+=rt(i.parameters,t,n)),r},at=(e,t,n)=>{let r=0;for(let i of e)r+=it(i,t,n);return r+=n.funcEnd,r},F=async(e,t)=>{let n=await $e(et(t)),r=e.messages,i=r.filter(e=>e.role!==`assistant`),a=r.filter(e=>e.role===`assistant`),o=tt(t),s=P(i,n,o);e.tools&&e.tools.length>0&&(s+=at(e.tools,n,o));let c=P(a,n,o);return{input:s,output:c}};async function I(e,t){let{attempts:n=3,retryDelayMs:r=250,...a}=t,o=typeof a.body==`string`?a.body.length:0,s=ot(e,a.method),c;for(let t=1;t<=n;t++){try{let r=await fetch(e,a);if(!ct(r,o)||t===n)return r;i.warn(`Copilot ${s} returned ${r.status}; retrying (${t}/${n})`)}catch(e){if(c=e,t===n)throw e;i.warn(`Copilot ${s} failed (${st(e)}); retrying (${t}/${n})`)}await w(r*t)}throw c instanceof Error?c:Error(`Copilot request failed`)}function ot(e,t){let n=t?.toUpperCase()??`GET`;try{return`${n} ${new URL(e).pathname}`}catch{return`${n} ${e}`}}function st(e){return e instanceof Error&&e.message?e.message:`unknown error`}function ct(e,t){return e.status>=500&&t>2e6?!1:e.status===408||e.status===409||e.status===425||e.status===429||e.status===500||e.status===502||e.status===503||e.status===504}function L(e,t){return R(e,t)??2e5}function R(e,t){return t?.max_prompt_tokens?t.max_prompt_tokens:lt(e)?936e3:t?.max_context_window_tokens}function lt(e){return/(?:^|[-_.])1m(?:$|[-_.])/i.test(e)}const z=async e=>{if(!g.copilotToken)throw Error(`Copilot token not found`);let n=e.messages.some(e=>typeof e.content!=`string`&&e.content?.some(e=>e.type===`image_url`)),r=e.messages.some(e=>[`assistant`,`tool`].includes(e.role)),a={...b(g,n),"X-Initiator":r?`agent`:`user`},o=JSON.stringify(e);i.info(`Sending payload: ${o.length} bytes, ${e.messages.length} messages, model: ${e.model}`);let s=await I(`${y(g)}/chat/completions`,{method:`POST`,headers:a,body:o});if(!s.ok){let n=await s.text();if(i.error(`Failed to create chat completions - Status: ${s.status} ${s.statusText}`),i.error(`Response body: ${n}`),i.error(`Request payload size: ${o.length} bytes`),s.status===413||/request entity too large/i.test(n)||/exceeds the limit of \d+/i.test(n)||/context_length_exceeded/i.test(n)||/operation timed out/i.test(n)||/payload too large/i.test(n)||/maximum context length/i.test(n)||s.status>=500&&s.status<600&&o.length>2e6){let n=Math.ceil(o.length/4),r=g.models?.data.find(t=>t.id===e.model)?.capabilities.limits,a=L(e.model,r),s=e.max_tokens??0;throw i.warn(`Context overflow → returning 400 prompt-too-long (~${n} + ${s} > ${a}) to trigger Claude Code reactive compaction`),new t(`Prompt too long`,new Response(JSON.stringify({type:`error`,error:{type:`invalid_request_error`,message:`prompt is too long: input length and \`max_tokens\` exceed context limit: ${n} + ${s} > ${a} tokens`}}),{status:400,statusText:`Bad Request`,headers:{"content-type":`application/json`}}))}throw new t(`Failed to create chat completions`,new Response(n,{status:s.status,statusText:s.statusText,headers:s.headers}))}return e.stream?le(s):await s.json()};async function ut(e){await j(g);let t=await e.req.json();i.debug(`Request payload:`,JSON.stringify(t).slice(-400));let n=g.models?.data.find(e=>e.id===t.model);try{if(n){let e=await F(t,n);i.info(`Current token count:`,e)}else i.warn(`No model selected, skipping token count calculation`)}catch(e){i.warn(`Failed to calculate token count:`,e)}g.manualApprove&&await A(),Se(t.max_tokens)&&(t={...t,max_tokens:n?.capabilities.limits.max_output_tokens},i.debug(`Set max_tokens to:`,JSON.stringify(t.max_tokens)));let r=await z(t);return dt(r)?(i.debug(`Non-streaming response:`,JSON.stringify(r)),e.json(r)):(i.debug(`Streaming response`),f(e,async e=>{try{for await(let t of r)i.debug(`Streaming chunk:`,JSON.stringify(t)),await e.writeSSE(t)}catch(t){i.error(`Streaming error:`,t),await e.writeSSE({data:JSON.stringify({error:{message:t instanceof Error?t.message:`Stream interrupted`,type:`server_error`}})})}}))}const dt=e=>Object.hasOwn(e,`choices`),B=new d;B.post(`/`,async t=>{try{return await ut(t)}catch(n){return await e(t,n)}});const V=new d;V.get(`/requests`,e=>e.json({object:`list`,data:Je()}));const ft=async e=>{if(!g.copilotToken)throw Error(`Copilot token not found`);let n=await I(`${y(g)}/embeddings`,{method:`POST`,headers:b(g),body:JSON.stringify(e)});if(!n.ok)throw new t(`Failed to create embeddings`,n);return await n.json()},H=new d;H.post(`/`,async t=>{try{let e=await ft(await t.req.json());return t.json(e)}catch(n){return await e(t,n)}});function pt(e){return e===null?null:{stop:`end_turn`,length:`max_tokens`,tool_calls:`tool_use`,content_filter:`refusal`}[e]}function mt(e){return{model:St(e.model),messages:Ct(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:kt(e.tools),tool_choice:jt(e.tool_choice),thinking:At(e.thinking)}}async function ht(e){if(!e.messages.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`document`)))return e;let t=[];for(let n of e.messages){if(n.role!==`user`||!Array.isArray(n.content)){t.push(n);continue}let e=[];for(let t of n.content)t.type===`document`?e.push(...await gt(t)):e.push(t);t.push({role:`user`,content:e})}return{...e,messages:t}}async function gt(e){if(e.source.type===`text`)return[{type:`text`,text:U(e)+e.source.data}];if(e.source.type===`url`)return[{type:`text`,text:U(e)+`[document at ${e.source.url} not inlined — proxy does not fetch external URLs]`}];let{extractPdfText:t}=await import(`./pdf-3rCh0vDg.mjs`),n=await t(e.source.data);return[{type:`text`,text:U(e)+`[Extracted text from PDF (${n.pageCount} page${n.pageCount===1?``:`s`}${n.truncated?`, truncated`:``}):]\n\n`+n.text}]}function U(e){let t=[];return e.title&&t.push(`Document: ${e.title}`),e.context&&t.push(`Context: ${e.context}`),t.length>0?t.join(`
`)+`
`:``}const V={haiku:`claude-haiku-4.5`,sonnet:`claude-sonnet-4`,opus:`claude-opus-4.6-1m`},ht=[`opus`,`sonnet`,`haiku`];function gt(e){let t=e.toLowerCase();for(let e of ht)if(t.includes(e))return e;return null}function H(e){let t=/(\d+)\.(\d+)/.exec(e);return t?[Number(t[1]),Number(t[2])]:[0,0]}function _t(e){let t=g.models?.data.filter(t=>t.id.toLowerCase().includes(e))??[];if(t.length===0)return null;let n=t[0],r=H(n.id),i=n.id.includes(`-1m`);for(let e of t.slice(1)){let t=H(e.id),a=e.id.includes(`-1m`),o=t[0]>r[0]||t[0]===r[0]&&t[1]>r[1],s=t[0]===r[0]&&t[1]===r[1]&&a&&!i;(o||s)&&(n=e,r=t,i=a)}return n.id}function vt(e){if(g.models?.data.some(t=>t.id===e))return e;let t=gt(e);if(t){let e=_t(t);if(e)return e}return V[e]?V[e]:e}function yt(e,t){let n=xt(t),r=e.flatMap(e=>e.role===`user`?St(e):Ct(e));return[...n,...r]}const bt=[/x-anthropic-billing-header/gi,/anthropic-billing-header/gi,/x-anthropic-/gi];function U(e){let t=e;for(let e of bt)t=t.replaceAll(e,``);return t}function xt(e){return e?typeof e==`string`?[{role:`system`,content:U(e)}]:[{role:`system`,content:U(e.map(e=>e.text).join(`
`:``}const _t={haiku:`claude-haiku-4.5`,sonnet:`claude-sonnet-4`,opus:`claude-opus-4.6-1m`},vt=[`opus`,`sonnet`,`haiku`];function yt(e){let t=e.toLowerCase();for(let e of vt)if(t.includes(e))return e;return null}function bt(e){let t=/(\d+)\.(\d+)/.exec(e);return t?[Number(t[1]),Number(t[2])]:[0,0]}function xt(e){let t=g.models?.data.filter(t=>t.id.toLowerCase().includes(e))??[];if(t.length===0)return null;let n=t[0],r=bt(n.id),i=n.id.includes(`-1m`);for(let e of t.slice(1)){let t=bt(e.id),a=e.id.includes(`-1m`),o=t[0]>r[0]||t[0]===r[0]&&t[1]>r[1],s=t[0]===r[0]&&t[1]===r[1]&&a&&!i;(o||s)&&(n=e,r=t,i=a)}return n.id}function St(e){if(g.models?.data.some(t=>t.id===e))return e;let t=yt(e);if(t){let e=xt(t);if(e)return e}return _t[e]?_t[e]:e}function Ct(e,t){let n=Et(t),r=e.flatMap(e=>e.role===`user`?Dt(e):Ot(e));return[...n,...r]}const wt=[/x-anthropic-billing-header/gi,/anthropic-billing-header/gi,/x-anthropic-/gi];function Tt(e){let t=e;for(let e of wt)t=t.replaceAll(e,``);return t}function Et(e){return e?typeof e==`string`?[{role:`system`,content:Tt(e)}]:[{role:`system`,content:Tt(e.map(e=>e.text).join(`
`))}]:[]}function St(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:W(e.content)});r.length>0&&t.push({role:`user`,content:W(r)})}else t.push({role:`user`,content:W(e.content)});return t}function Ct(e){if(!Array.isArray(e.content))return[{role:`assistant`,content:W(e.content)}];let t=e.content.filter(e=>e.type===`tool_use`),n=e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
`))}]:[]}function Dt(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:W(e.content)});r.length>0&&t.push({role:`user`,content:W(r)})}else t.push({role:`user`,content:W(e.content)});return t}function Ot(e){if(!Array.isArray(e.content))return[{role:`assistant`,content:W(e.content)}];let t=e.content.filter(e=>e.type===`tool_use`),n=e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
`);return t.length>0?[{role:`assistant`,content:n||null,tool_calls:t.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input)}}))}]:[{role:`assistant`,content:W(e.content)}]}function W(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return null;if(!e.some(e=>e.type===`image`))return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
`);let t=[];for(let n of e)switch(n.type){case`text`:t.push({type:`text`,text:n.text});break;case`image`:t.push({type:`image_url`,image_url:{url:`data:${n.source.media_type};base64,${n.source.data}`}});break}return t}function wt(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Tt(e){if(e)return{type:`enabled`}}function Et(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 Dt(e,t){let n=[],r=[],i=null;i=e.choices[0]?.finish_reason??i;for(let t of e.choices){let e=Ot(t.message.content),a=kt(t.message.tool_calls);n.push(...e),r.push(...a),(t.finish_reason===`tool_calls`||i===`stop`)&&(i=t.finish_reason)}return{id:e.id,type:`message`,role:`assistant`,model:t??e.model,content:[...n,...r],stop_reason:R(i),stop_sequence:null,usage:{input_tokens:(e.usage?.prompt_tokens??0)-(e.usage?.prompt_tokens_details?.cached_tokens??0),output_tokens:e.usage?.completion_tokens??0,...e.usage?.prompt_tokens_details?.cached_tokens!==void 0&&{cache_read_input_tokens:e.usage.prompt_tokens_details.cached_tokens}}}}function Ot(e){return typeof e==`string`?[{type:`text`,text:e}]:Array.isArray(e)?e.filter(e=>e.type===`text`).map(e=>({type:`text`,text:e.text})):[]}function kt(e){return e?e.map(e=>{let t={};try{let n=JSON.parse(e.function.arguments);n&&typeof n==`object`&&!Array.isArray(n)&&(t=n)}catch{}return{type:`tool_use`,id:e.id,name:e.function.name,input:t}}):[]}async function At(e){try{let t=e.req.header(`anthropic-beta`),n=await e.req.json(),r=z(n),a=g.models?.data.find(e=>e.id===r.model);if(!a)return i.warn(`Model not found, returning default token count`),e.json({type:`error`,error:{type:`not_found_error`,message:`Model '${r.model}' not found`}},404);let o=await M(r,a);if(n.tools&&n.tools.length>0){let e=!1;t?.startsWith(`claude-code`)&&(e=n.tools.some(e=>e.name.startsWith(`mcp__`))),e||(n.model.startsWith(`claude`)?o.input+=346:n.model.startsWith(`grok`)&&(o.input+=480))}let s=o.input;return n.model.startsWith(`claude`)?s=Math.round(s*1.15):n.model.startsWith(`grok`)&&(s=Math.round(s*1.03)),i.info(`Token count:`,s),e.json({input_tokens:s})}catch(t){return i.error(`Error counting tokens:`,t),e.json({type:`error`,error:{type:`api_error`,message:t instanceof Error?t.message:`Failed to count tokens`}},500)}}const jt=5e6,Mt=1e5,Nt=`[image removed to save context]`;function Pt(e){let t=e.capabilities.limits.max_prompt_tokens;if(!t)return jt;let n=Math.floor((t-8e3)*3.5);return Math.min(jt,n)}function Ft(e,t){let n=K(e),r=Pt(t);if(n<=r)return e;i.info(`Context fit: payload ${G(n)} exceeds ${G(r)} ceiling — reducing`);let a=It(e),o=K(a);return o<=r?(i.info(`Context fit: ${G(n)} → ${G(o)} after tool pruning`),a):(a=Lt(a),o=K(a),o<=r?(i.info(`Context fit: ${G(n)} → ${G(o)} after stripping old images`),a):(a=Rt(a),o=K(a),o<=r?(i.warn(`Context fit: ${G(n)} → ${G(o)} after stripping ALL images`),a):(a=zt(a),o=K(a),o<=r?(i.warn(`Context fit: ${G(n)} → ${G(o)} after truncating oversized tool outputs`),a):(a=Bt(a,r),o=K(a),i.warn(`Context fit: ${G(n)} → ${G(o)} after dropping old messages`),a))))}function G(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(2)}MB`}function K(e){let t=200;for(let n of e.messages)t+=q(n);if(e.tools)for(let n of e.tools)t+=JSON.stringify(n).length+20;return t}function q(e){let t=40;if(typeof e.content==`string`)t+=e.content.length;else if(Array.isArray(e.content))for(let n of e.content)`text`in n&&typeof n.text==`string`?t+=n.text.length+20:`type`in n&&n.type===`image_url`&&(t+=n.image_url.url.length+40);if(e.tool_calls)for(let n of e.tool_calls)t+=n.function.name.length+n.function.arguments.length+80;return e.tool_call_id&&(t+=e.tool_call_id.length+20),t}function It(e){let t=e.messages,n=0,r=0,a=[];for(let e=t.length-1;e>=0;e--){let i=t[e];if(i.role!==`tool`)continue;let o=q(i);n<2e5?n+=o:(r+=o,a.push(e))}if(r<5e4)return e;let o=[...t];for(let e of a)o[e]={...o[e],content:`[content pruned — tool output was too old]`};return i.info(`Pruned ${a.length} old tool outputs (~${r} bytes reclaimed)`),{...e,messages:o}}function Lt(e){let t=e.messages,n=[...t],r=0,a=0,o=Math.max(0,t.length-4);for(let e=0;e<o;e++){let i=t[e];if(!Array.isArray(i.content))continue;let o=r,s=i.content.map(e=>`type`in e&&e.type===`image_url`?(r++,a+=e.image_url.url.length,{type:`text`,text:Nt}):e);r>o&&(n[e]={...i,content:s})}return r>0&&i.info(`Stripped ${r} base64 images (~${a} bytes reclaimed)`),{...e,messages:n}}function Rt(e){let t=0,n=0,r=e.messages.map(e=>{if(!Array.isArray(e.content))return e;let r=t,i=e.content.map(e=>`type`in e&&e.type===`image_url`?(t++,n+=e.image_url.url.length,{type:`text`,text:Nt}):e);return t>r?{...e,content:i}:e});return t>0&&i.warn(`Stripped ${t} ALL images (~${n} bytes reclaimed)`),{...e,messages:r}}function zt(e){let t=0,n=0,r=e.messages.map(e=>{if(e.role!==`tool`||typeof e.content!=`string`||e.content.length<=Mt)return e;let r=e.content.length,i=e.content.slice(0,Mt)+`
`);let t=[];for(let n of e)switch(n.type){case`text`:t.push({type:`text`,text:n.text});break;case`image`:t.push({type:`image_url`,image_url:{url:`data:${n.source.media_type};base64,${n.source.data}`}});break}return t}function kt(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function At(e){if(e)return{type:`enabled`}}function jt(e){if(e)switch(e.type){case`auto`:return`auto`;case`any`:return`required`;case`tool`:return e.name?{type:`function`,function:{name:e.name}}:void 0;case`none`:return`none`;default:return}}function Mt(e,t){let n=[],r=[],i=null;i=e.choices[0]?.finish_reason??i;for(let t of e.choices){let e=Nt(t.message.content),a=Pt(t.message.tool_calls);n.push(...e),r.push(...a),(t.finish_reason===`tool_calls`||i===`stop`)&&(i=t.finish_reason)}return{id:e.id,type:`message`,role:`assistant`,model:t??e.model,content:[...n,...r],stop_reason:pt(i),stop_sequence:null,usage:{input_tokens:(e.usage?.prompt_tokens??0)-(e.usage?.prompt_tokens_details?.cached_tokens??0),output_tokens:e.usage?.completion_tokens??0,...e.usage?.prompt_tokens_details?.cached_tokens!==void 0&&{cache_read_input_tokens:e.usage.prompt_tokens_details.cached_tokens}}}}function Nt(e){return typeof e==`string`?[{type:`text`,text:e}]:Array.isArray(e)?e.filter(e=>e.type===`text`).map(e=>({type:`text`,text:e.text})):[]}function Pt(e){return e?e.map(e=>{let t={};try{let n=JSON.parse(e.function.arguments);n&&typeof n==`object`&&!Array.isArray(n)&&(t=n)}catch{}return{type:`tool_use`,id:e.id,name:e.function.name,input:t}}):[]}async function Ft(e){try{let t=e.req.header(`anthropic-beta`),n=await e.req.json(),r=mt(n),a=g.models?.data.find(e=>e.id===r.model);if(!a)return i.warn(`Model not found, returning default token count`),e.json({type:`error`,error:{type:`not_found_error`,message:`Model '${r.model}' not found`}},404);let o=await F(r,a);if(n.tools&&n.tools.length>0){let e=!1;t?.startsWith(`claude-code`)&&(e=n.tools.some(e=>e.name.startsWith(`mcp__`))),e||(n.model.startsWith(`claude`)?o.input+=346:n.model.startsWith(`grok`)&&(o.input+=480))}let s=o.input;return n.model.startsWith(`claude`)?s=Math.round(s*1.15):n.model.startsWith(`grok`)&&(s=Math.round(s*1.03)),i.info(`Token count:`,s),e.json({input_tokens:s})}catch(t){return i.error(`Error counting tokens:`,t),e.json({type:`error`,error:{type:`api_error`,message:t instanceof Error?t.message:`Failed to count tokens`}},500)}}const It=5e6,Lt=1e5,Rt=`[image removed to save context]`;function zt(e){let t=R(e.id,e.capabilities.limits);if(!t)return It;let n=Math.floor((t-8e3)*3.5);return Math.min(It,n)}function Bt(e,t){let n=K(e),r=zt(t);if(n<=r)return e;i.info(`Context fit: payload ${G(n)} exceeds ${G(r)} ceiling — reducing`);let a=Vt(e),o=K(a);return o<=r?(i.info(`Context fit: ${G(n)} → ${G(o)} after tool pruning`),a):(a=Ht(a),o=K(a),o<=r?(i.info(`Context fit: ${G(n)} → ${G(o)} after stripping old images`),a):(a=Ut(a),o=K(a),o<=r?(i.warn(`Context fit: ${G(n)} → ${G(o)} after stripping ALL images`),a):(a=Wt(a),o=K(a),o<=r?(i.warn(`Context fit: ${G(n)} → ${G(o)} after truncating oversized tool outputs`),a):(a=Gt(a,r),o=K(a),i.warn(`Context fit: ${G(n)} → ${G(o)} after dropping old messages`),a))))}function G(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(2)}MB`}function K(e){let t=200;for(let n of e.messages)t+=q(n);if(e.tools)for(let n of e.tools)t+=JSON.stringify(n).length+20;return t}function q(e){let t=40;if(typeof e.content==`string`)t+=e.content.length;else if(Array.isArray(e.content))for(let n of e.content)`text`in n&&typeof n.text==`string`?t+=n.text.length+20:`type`in n&&n.type===`image_url`&&(t+=n.image_url.url.length+40);if(e.tool_calls)for(let n of e.tool_calls)t+=n.function.name.length+n.function.arguments.length+80;return e.tool_call_id&&(t+=e.tool_call_id.length+20),t}function Vt(e){let t=e.messages,n=0,r=0,a=[];for(let e=t.length-1;e>=0;e--){let i=t[e];if(i.role!==`tool`)continue;let o=q(i);n<2e5?n+=o:(r+=o,a.push(e))}if(r<5e4)return e;let o=[...t];for(let e of a)o[e]={...o[e],content:`[content pruned — tool output was too old]`};return i.info(`Pruned ${a.length} old tool outputs (~${r} bytes reclaimed)`),{...e,messages:o}}function Ht(e){let t=e.messages,n=[...t],r=0,a=0,o=Math.max(0,t.length-4);for(let e=0;e<o;e++){let i=t[e];if(!Array.isArray(i.content))continue;let o=r,s=i.content.map(e=>`type`in e&&e.type===`image_url`?(r++,a+=e.image_url.url.length,{type:`text`,text:Rt}):e);r>o&&(n[e]={...i,content:s})}return r>0&&i.info(`Stripped ${r} base64 images (~${a} bytes reclaimed)`),{...e,messages:n}}function Ut(e){let t=0,n=0,r=e.messages.map(e=>{if(!Array.isArray(e.content))return e;let r=t,i=e.content.map(e=>`type`in e&&e.type===`image_url`?(t++,n+=e.image_url.url.length,{type:`text`,text:Rt}):e);return t>r?{...e,content:i}:e});return t>0&&i.warn(`Stripped ${t} ALL images (~${n} bytes reclaimed)`),{...e,messages:r}}function Wt(e){let t=0,n=0,r=e.messages.map(e=>{if(e.role!==`tool`||typeof e.content!=`string`||e.content.length<=Lt)return e;let r=e.content.length,i=e.content.slice(0,Lt)+`
[…tool output truncated to fit context]`;return t++,n+=r-i.length,{...e,content:i}});return t>0&&i.warn(`Truncated ${t} oversized tool outputs (~${n} bytes reclaimed)`),{...e,messages:r}}function Bt(e,t){let n=e.messages.filter(e=>e.role===`system`||e.role===`developer`),r=e.messages.filter(e=>e.role!==`system`&&e.role!==`developer`),a=200;for(let e of n)a+=q(e);if(e.tools)for(let t of e.tools)a+=JSON.stringify(t).length+20;let o=r.map(e=>q(e)),s=a+o.reduce((e,t)=>e+t,0),c=0;for(;r.length>2&&s>t;){let e=o.shift()??0;r.shift(),s-=e,c++}let l=0;for(;r.length>2&&r[0].role===`tool`;){let e=o.shift()??0;r.shift(),s-=e,l++}return(c>0||l>0)&&i.warn(`Dropped ${c} oldest conversation messages + ${l} orphaned tool results (~${s} bytes remaining, limit ${t})`),s>t&&i.error(`Payload still over ${t}B after all reductions (${s}B). Forwarding anyway — Copilot will likely return 413 → 400 prompt-too-long for reactive compaction.`),{...e,messages:[...n,...r]}}async function Vt(e,n){if(!g.copilotToken)throw Error(`Copilot token not found`);let r=JSON.stringify(e),i=await N(`${y(g)}/v1/messages`,{method:`POST`,headers:{...b(g,Ht(e)),accept:e.stream?`text/event-stream`:`application/json`,"x-initiator":Ut(e),"x-request-id":n.requestId},body:r});if(!i.ok)throw new t(`Failed to create messages`,i);return e.stream?ce(i):await i.json()}function Ht(e){return e.messages.some(e=>Array.isArray(e.content)?e.content.some(e=>e.type===`image`):!1)}function Ut(e){let t=e.messages.at(-1);return t?.role===`user`?Array.isArray(t.content)?t.content.some(e=>e.type!==`tool_result`)?`user`:`agent`:`user`:`agent`}function Wt(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function Gt(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)-(e.usage?.prompt_tokens_details?.cached_tokens??0),output_tokens:0,...e.usage?.prompt_tokens_details?.cached_tokens!==void 0&&{cache_read_input_tokens:e.usage.prompt_tokens_details.cached_tokens}}}}),!0),i.content&&(Wt(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:R(r.finish_reason),stop_sequence:null},usage:{input_tokens:(e.usage?.prompt_tokens??0)-(e.usage?.prompt_tokens_details?.cached_tokens??0),output_tokens:e.usage?.completion_tokens??0,...e.usage?.prompt_tokens_details?.cached_tokens!==void 0&&{cache_read_input_tokens:e.usage.prompt_tokens_details.cached_tokens}}},{type:`message_stop`})),n}function Kt(e){return{type:`error`,error:{type:`api_error`,message:e??`An unexpected error occurred during streaming.`}}}function qt(){return`req_${crypto.randomUUID().replaceAll(`-`,``)}`}async function Jt(e){await k(g);let t=e.req.header(`x-client-request-id`)??qt();e.header(`request-id`,t),e.header(`x-request-id`,t);let n=await e.req.json();i.level>=4&&i.debug(`[${t}] Anthropic request payload:`,JSON.stringify(n).slice(0,2e3));let r=n.model,a=await pt(n);return(g.models?.data.find(e=>e.id===a.model))?.supported_endpoints?.includes(`/v1/messages`)?await on(e,a,t):await Yt(e,a,{clientModel:r,requestId:t})}async function Yt(e,t,n){let r=z(t);i.level>=4&&i.debug(`[${n.requestId}] Translated OpenAI request payload:`,JSON.stringify(r));let a=g.models?.data.find(e=>e.id===r.model),o=a?Ft(r,a):r;o.messages.length!==r.messages.length&&i.info(`[${n.requestId}] Context management: ${r.messages.length} → ${o.messages.length} messages`),g.manualApprove&&await O();let s=await P(o);return cn(s)?Xt(e,s,n):(i.debug(`[${n.requestId}] Streaming response from Copilot`),Qt(e,s,n))}function Xt(e,t,n){i.level>=4&&i.debug(`[${n.requestId}] Non-streaming response from Copilot:`,JSON.stringify(t).slice(-400));try{let r=Dt(t,n.clientModel);return i.level>=4&&i.debug(`[${n.requestId}] Translated Anthropic response:`,JSON.stringify(r)),e.json(r)}catch(t){return e.json(Zt(t,n.requestId),500)}}function Zt(e,t){return i.error(`[${t}] Failed to translate non-streaming response:`,e),{type:`error`,error:{type:`api_error`,message:e instanceof Error?`Translation failed: ${e.message}`:`Translation failed`}}}function Qt(e,t,n){return p(e,async e=>{let r={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}},i=$t(e);try{await en(e,{...n,response:t,streamState:r})}catch(t){await nn(e,{error:t,requestId:n.requestId,streamState:r})}finally{i()}})}function $t(e){let t=setInterval(()=>{e.writeSSE({event:`ping`,data:JSON.stringify({type:`ping`})}).catch(()=>{})},15e3);return()=>clearInterval(t)}async function en(e,t){for await(let n of t.response){if(n.data===`[DONE]`)break;if(!n.data)continue;let r=tn(n.data,t.requestId);if(r){t.streamState.messageStartSent||(r.model=t.clientModel);for(let n of Gt(r,t.streamState))await e.writeSSE({event:n.type,data:JSON.stringify(n)})}}}function tn(e,t){try{return JSON.parse(e)}catch(e){return i.warn(`[${t}] Skipping unparseable Copilot chunk:`,e),null}}async function nn(e,t){i.error(`[${t.requestId}] Streaming error:`,t.error);try{await rn(e,t.streamState),await an(e,t.streamState),await e.writeSSE({event:`error`,data:JSON.stringify(Kt(t.error instanceof Error?t.error.message:void 0))})}catch(e){i.error(`[${t.requestId}] Failed to emit stream cleanup events:`,e)}}async function rn(e,t){t.contentBlockOpen&&await e.writeSSE({event:`content_block_stop`,data:JSON.stringify({type:`content_block_stop`,index:t.contentBlockIndex})})}async function an(e,t){t.messageStartSent&&(await e.writeSSE({event:`message_delta`,data:JSON.stringify({type:`message_delta`,delta:{stop_reason:`end_turn`,stop_sequence:null},usage:{output_tokens:0}})}),await e.writeSSE({event:`message_stop`,data:JSON.stringify({type:`message_stop`})}))}async function on(e,t,n){g.manualApprove&&await O();let r=await Vt(t,{requestId:n});return sn(r)?p(e,async e=>{for await(let t of r){let n=t.data??``;!n||n===`[DONE]`||await e.writeSSE({event:t.event,data:n})}}):e.json(r)}const sn=e=>!!e&&typeof e[Symbol.asyncIterator]==`function`,cn=e=>Object.hasOwn(e,`choices`),J=new f;J.post(`/`,async t=>{try{return await Jt(t)}catch(n){return await e(t,n)}}),J.post(`/count_tokens`,async t=>{try{return await At(t)}catch(n){return await e(t,n)}});const Y=new f;Y.get(`/`,async t=>{try{g.models||await T();let e=g.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}));return t.json({object:`list`,data:e,has_more:!1})}catch(n){return await e(t,n)}});const ln=5e6,un=`[older response input omitted to stay under context limit]`,dn=`[older response input truncated to stay under context limit]
[…tool output truncated to fit context]`;return t++,n+=r-i.length,{...e,content:i}});return t>0&&i.warn(`Truncated ${t} oversized tool outputs (~${n} bytes reclaimed)`),{...e,messages:r}}function Gt(e,t){let n=e.messages.filter(e=>e.role===`system`||e.role===`developer`),r=e.messages.filter(e=>e.role!==`system`&&e.role!==`developer`),a=200;for(let e of n)a+=q(e);if(e.tools)for(let t of e.tools)a+=JSON.stringify(t).length+20;let o=r.map(e=>q(e)),s=a+o.reduce((e,t)=>e+t,0),c=0;for(;r.length>2&&s>t;){let e=o.shift()??0;r.shift(),s-=e,c++}let l=0;for(;r.length>2&&r[0].role===`tool`;){let e=o.shift()??0;r.shift(),s-=e,l++}return(c>0||l>0)&&i.warn(`Dropped ${c} oldest conversation messages + ${l} orphaned tool results (~${s} bytes remaining, limit ${t})`),s>t&&i.error(`Payload still over ${t}B after all reductions (${s}B). Forwarding anyway — Copilot will likely return 413 → 400 prompt-too-long for reactive compaction.`),{...e,messages:[...n,...r]}}function Kt(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function qt(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)-(e.usage?.prompt_tokens_details?.cached_tokens??0),output_tokens:0,...e.usage?.prompt_tokens_details?.cached_tokens!==void 0&&{cache_read_input_tokens:e.usage.prompt_tokens_details.cached_tokens}}}}),!0),i.content&&(Kt(t)&&(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),t.contentBlockIndex++,t.contentBlockOpen=!1),t.contentBlockOpen||=(n.push({type:`content_block_start`,index:t.contentBlockIndex,content_block:{type:`text`,text:``}}),!0),n.push({type:`content_block_delta`,index:t.contentBlockIndex,delta:{type:`text_delta`,text:i.content}})),i.tool_calls)for(let e of i.tool_calls){if(e.id&&e.function?.name){t.contentBlockOpen&&=(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),t.contentBlockIndex++,!1);let r=t.contentBlockIndex;t.toolCalls[e.index]={id:e.id,name:e.function.name,anthropicBlockIndex:r},n.push({type:`content_block_start`,index:r,content_block:{type:`tool_use`,id:e.id,name:e.function.name,input:{}}}),t.contentBlockOpen=!0}if(e.function?.arguments){let r=t.toolCalls[e.index];r&&n.push({type:`content_block_delta`,index:r.anthropicBlockIndex,delta:{type:`input_json_delta`,partial_json:e.function.arguments}})}}return r.finish_reason&&(t.contentBlockOpen&&=(n.push({type:`content_block_stop`,index:t.contentBlockIndex}),!1),n.push({type:`message_delta`,delta:{stop_reason:pt(r.finish_reason),stop_sequence:null},usage:{input_tokens:(e.usage?.prompt_tokens??0)-(e.usage?.prompt_tokens_details?.cached_tokens??0),output_tokens:e.usage?.completion_tokens??0,...e.usage?.prompt_tokens_details?.cached_tokens!==void 0&&{cache_read_input_tokens:e.usage.prompt_tokens_details.cached_tokens}}},{type:`message_stop`})),n}function Jt(e){return{type:`error`,error:{type:`api_error`,message:e??`An unexpected error occurred during streaming.`}}}function Yt(){return`req_${crypto.randomUUID().replaceAll(`-`,``)}`}async function Xt(e){await j(g);let t=e.req.header(`x-client-request-id`)??Yt();e.header(`request-id`,t),e.header(`x-request-id`,t);let n=await e.req.json();i.level>=4&&i.debug(`[${t}] Anthropic request payload:`,JSON.stringify(n).slice(0,2e3));let r=n.model;return await Zt(e,await ht(n),{clientModel:r,requestId:t})}async function Zt(e,t,n){let r=mt(t);i.level>=4&&i.debug(`[${n.requestId}] Translated OpenAI request payload:`,JSON.stringify(r));let a=g.models?.data.find(e=>e.id===r.model),o=a?Bt(r,a):r;o.messages.length!==r.messages.length&&i.info(`[${n.requestId}] Context management: ${r.messages.length} → ${o.messages.length} messages`),g.manualApprove&&await A();let s=await z(o);return cn(s)?Qt(e,s,n):(i.debug(`[${n.requestId}] Streaming response from Copilot`),en(e,s,n))}function Qt(e,t,n){i.level>=4&&i.debug(`[${n.requestId}] Non-streaming response from Copilot:`,JSON.stringify(t).slice(-400));try{let r=Mt(t,n.clientModel);return i.level>=4&&i.debug(`[${n.requestId}] Translated Anthropic response:`,JSON.stringify(r)),e.json(r)}catch(t){return e.json($t(t,n.requestId),500)}}function $t(e,t){return i.error(`[${t}] Failed to translate non-streaming response:`,e),{type:`error`,error:{type:`api_error`,message:e instanceof Error?`Translation failed: ${e.message}`:`Translation failed`}}}function en(e,t,n){return f(e,async e=>{let r={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}},i=tn(e);try{await nn(e,{...n,response:t,streamState:r})}catch(t){await an(e,{error:t,requestId:n.requestId,streamState:r})}finally{i()}})}function tn(e){let t=setInterval(()=>{e.writeSSE({event:`ping`,data:JSON.stringify({type:`ping`})}).catch(()=>{})},15e3);return()=>clearInterval(t)}async function nn(e,t){for await(let n of t.response){if(n.data===`[DONE]`)break;if(!n.data)continue;let r=rn(n.data,t.requestId);if(r){t.streamState.messageStartSent||(r.model=t.clientModel);for(let n of qt(r,t.streamState))await e.writeSSE({event:n.type,data:JSON.stringify(n)})}}}function rn(e,t){try{return JSON.parse(e)}catch(e){return i.warn(`[${t}] Skipping unparseable Copilot chunk:`,e),null}}async function an(e,t){i.error(`[${t.requestId}] Streaming error:`,t.error);try{await on(e,t.streamState),await sn(e,t.streamState),await e.writeSSE({event:`error`,data:JSON.stringify(Jt(t.error instanceof Error?t.error.message:void 0))})}catch(e){i.error(`[${t.requestId}] Failed to emit stream cleanup events:`,e)}}async function on(e,t){t.contentBlockOpen&&await e.writeSSE({event:`content_block_stop`,data:JSON.stringify({type:`content_block_stop`,index:t.contentBlockIndex})})}async function sn(e,t){t.messageStartSent&&(await e.writeSSE({event:`message_delta`,data:JSON.stringify({type:`message_delta`,delta:{stop_reason:`end_turn`,stop_sequence:null},usage:{output_tokens:0}})}),await e.writeSSE({event:`message_stop`,data:JSON.stringify({type:`message_stop`})}))}const cn=e=>Object.hasOwn(e,`choices`),J=new d;J.post(`/`,async t=>{try{return await Xt(t)}catch(n){return await e(t,n)}}),J.post(`/count_tokens`,async t=>{try{return await Ft(t)}catch(n){return await e(t,n)}});const Y=new d;Y.get(`/`,async t=>{try{g.models||await T();let e=g.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}));return t.json({object:`list`,data:e,has_more:!1})}catch(n){return await e(t,n)}});const ln=5e6,un=`[older response input omitted to stay under context limit]`,dn=`[older response input truncated to stay under context limit]
`,fn=new Set([`call_id`,`id`,`model`,`name`,`previous_response_id`,`role`,`status`,`tool_call_id`,`type`]);async function pn(e){if(!g.copilotToken)throw Error(`Copilot token not found`);let n=mn(kn(e),hn(e.model)),r=JSON.stringify(n),a={...b(g,An(n)),accept:n.stream?`text/event-stream`:`application/json`,"X-Initiator":`agent`};i.info(`Sending responses payload: ${r.length} bytes, model: ${e.model}`);let o=await N(`${y(g)}/responses`,{method:`POST`,headers:a,body:r});if(!o.ok){let n=await o.text();if(i.error(`Failed to create responses - Status: ${o.status} ${o.statusText}`),i.error(`Response body: ${n}`),i.error(`Request payload size: ${r.length} bytes`),On(o,n,r.length)){let n=Math.ceil(r.length/4),a=g.models?.data.find(t=>t.id===e.model)?.capabilities.limits,o=a?.max_prompt_tokens??a?.max_context_window_tokens??2e5,s=e.max_output_tokens??0;throw i.warn(`Responses context overflow -> returning 400 prompt-too-long (~${n} + ${s} > ${o})`),new t(`Prompt too long`,new Response(JSON.stringify({type:`error`,error:{type:`invalid_request_error`,message:`prompt is too long: input length and \`max_tokens\` exceed context limit: ${n} + ${s} > ${o} tokens`}}),{status:400,statusText:`Bad Request`,headers:{"content-type":`application/json`}}))}throw new t(`Failed to create responses`,new Response(n,{status:o.status,statusText:o.statusText,headers:o.headers}))}return o}function mn(e,t){let n=JSON.stringify(e);if(n.length<=t)return e;if(i.info(`Responses context fit: payload ${n.length} bytes exceeds ${t} byte ceiling - reducing`),typeof e.input==`string`){let r=X(e,t),a=JSON.stringify(r).length;return i.warn(`Responses context fit: truncated string input (${n.length} -> ${a} bytes)`),r}let r=e,a=n.length,o=gn(e),s=0;for(let e of o)if(r=_n(r,e),s++,a=JSON.stringify(r).length,a<=t)break;if(s>0&&i.warn(`Responses context fit: stripped ${s} images (${n.length} -> ${a} bytes)`),a<=t)return r;let c=vn(r,t);return r=bn(c.payload),a=JSON.stringify(r).length,c.count>0&&i.warn(`Responses context fit: dropped ${c.count} old input items (${n.length} -> ${a} bytes)`),a<=t||(r=Sn(r,t),a=JSON.stringify(r).length,i.warn(`Responses context fit: truncated input content (${n.length} -> ${a} bytes)`),a<=t)||(r=Tn(r,t),a=JSON.stringify(r).length,i.warn(`Responses context fit: minimized input history (${n.length} -> ${a} bytes)`),a<=t)?r:(r=En(r,t),a=JSON.stringify(r).length,i.warn(`Responses context fit: truncated payload strings (${n.length} -> ${a} bytes)`),r)}function hn(e){let t=g.models?.data.find(t=>t.id===e)?.capabilities.limits?.max_prompt_tokens;if(!t)return ln;let n=Math.floor((t-8e3)*3.5);return Math.min(ln,n)}function X(e,t){if(typeof e.input!=`string`)return e;let n=JSON.stringify({...e,input:``}).length,r=Math.max(62,t-n),i=Math.max(0,r-62);return{...e,input:dn+e.input.slice(-i)}}function gn(e){if(typeof e.input==`string`)return[];let t=[];for(let[n,r]of e.input.entries())if(Array.isArray(r.content))for(let[e,i]of r.content.entries())i.type===`input_image`&&t.push({contentIndex:e,inputIndex:n});return t}function _n(e,t){if(typeof e.input==`string`)return e;let n=[...e.input],r=n[t.inputIndex];if(!Array.isArray(r.content))return e;let i=[...r.content];return i[t.contentIndex]={type:`input_text`,text:`[image removed to stay under upstream payload limit]`},n[t.inputIndex]={...r,content:i},{...e,input:n}}function vn(e,t){if(typeof e.input==`string`)return{bodyLength:JSON.stringify(e).length,count:0,payload:e};let n=[...e.input],r=JSON.stringify({...e,input:n}).length,i=0;for(let a=0;a<n.length&&r>t;a++){let t=n[a];t.role===`system`||t.role===`developer`||xn(n,a)<=2||(n[a]=yn(t),i++,r=JSON.stringify({...e,input:n}).length)}return{bodyLength:r,count:i,payload:{...e,input:n}}}function yn(e){return{role:e.role===`assistant`?`assistant`:`user`,content:un}}function bn(e){if(typeof e.input==`string`)return e;let t=new Set(e.input.filter(e=>e.type===`function_call`&&e.call_id).map(e=>e.call_id)),n=0,r=e.input.map(e=>e.type!==`function_call_output`||!e.call_id||t.has(e.call_id)?e:(n++,yn(e)));return n===0?e:(i.warn(`Responses context fit: dropped ${n} orphaned function call outputs`),{...e,input:r})}function xn(e,t){let n=0;for(let r=t;r<e.length;r++)e[r].role!==`system`&&e[r].role!==`developer`&&n++;return n}function Sn(e,t){if(typeof e.input==`string`)return X(e,t);let n=e,r=JSON.stringify(n).length;for(;r>t;){let e=Cn(n);if(!e)return n;n=wn(n,e,r-t);let i=JSON.stringify(n).length;if(i>=r)return n;r=i}return n}function Cn(e){if(typeof e.input==`string`)return null;let t=null;for(let[n,r]of e.input.entries()){if(r.role===`system`||r.role===`developer`)continue;let e=Z(r,[]);e&&(!t||e.length>t.length)&&(t={inputIndex:n,...e})}return t}function wn(e,t,n){if(typeof e.input==`string`)return e;let r=[...e.input],i=r[t.inputIndex],a=Math.max(0,t.length-n-62-1e4);return r[t.inputIndex]=Q(i,t.path,a),{...e,input:r}}function Z(e,t){if(typeof e==`string`){let n=t.at(-1);return typeof n==`string`&&fn.has(n)?null:{length:e.length,path:t}}if(Array.isArray(e))return e.reduce((e,n,r)=>{let i=Z(n,[...t,r]);return i&&(!e||i.length>e.length)?i:e},null);if(!Dn(e))return null;let n=null;for(let[r,i]of Object.entries(e)){let e=Z(i,[...t,r]);e&&(!n||e.length>n.length)&&(n=e)}return n}function Q(e,t,n){if(t.length===0)return typeof e==`string`?dn+e.slice(-n):e;let[r,...i]=t;if(Array.isArray(e)&&typeof r==`number`){let t=[...e];return t[r]=Q(t[r],i,n),t}return Dn(e)&&typeof r==`string`?{...e,[r]:Q(e[r],i,n)}:e}function Tn(e,t){if(typeof e.input==`string`)return X(e,t);let n=e.input.filter(e=>e.role===`system`||e.role===`developer`),r=[...e.input].reverse().find(e=>e.role!==`system`&&e.role!==`developer`);return{...e,input:[...n,{role:r?.role===`assistant`?`assistant`:`user`,content:un}]}}function En(e,t){let n=e,r=JSON.stringify(n).length;for(;r>t;){let e=Z(n,[]);if(!e)return n;n=Q(n,e.path,r-t);let i=JSON.stringify(n).length;if(i>=r)return n;r=i}return n}function Dn(e){return typeof e==`object`&&!!e}function On(e,t,n){return e.status===413||/request entity too large/i.test(t)||/exceeds the limit of \d+/i.test(t)||/context_length_exceeded/i.test(t)||/operation timed out/i.test(t)||/payload too large/i.test(t)||/maximum context length/i.test(t)||e.status>=500&&e.status<600&&n>2e6}function kn(e){let t={...e};return delete t.service_tier,t.tools?.some(e=>e.type===`image_generation`)?{...t,tools:t.tools.filter(e=>e.type!==`image_generation`)}:t}function An(e){return typeof e.input==`string`?!1:e.input.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`input_image`))}async function jn(e){await k(g);let t=await e.req.json();return i.debug(`Responses API request:`,JSON.stringify(t).slice(-400)),g.manualApprove&&await O(),pn(t)}const Mn=new f;Mn.post(`/`,async n=>{try{return await jn(n)}catch(r){if(r instanceof t){let e=await r.response.text(),t;try{t=JSON.parse(e)}catch{t=e}return i.error(`Responses HTTP error body:`,t),new Response(e,{status:r.response.status,statusText:r.response.statusText,headers:{"content-type":r.response.headers.get(`content-type`)??`application/json`}})}return await e(n,r)}});const Nn=new f;Nn.get(`/`,e=>{try{return e.json({token:g.copilotToken})}catch(t){return i.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const Pn=new f;Pn.get(`/`,async e=>{try{let t=await je();return e.json(t)}catch(t){return i.error(`Error fetching Copilot usage:`,t),e.json({error:`Failed to fetch Copilot usage`},500)}});const $=new f;$.use(se()),$.use(oe()),$.use(Ze),$.get(`/`,e=>e.text(`Server running`)),$.use(He),$.route(`/chat/completions`,F),$.route(`/debug`,I),$.route(`/models`,Y),$.route(`/embeddings`,L),$.route(`/usage`,Pn),$.route(`/token`,Nn),$.route(`/v1/chat/completions`,F),$.route(`/v1/models`,Y),$.route(`/v1/embeddings`,L),$.route(`/v1/responses`,Mn),$.route(`/v1/messages`,J);async function Fn(e){e.proxyEnv&&We(),e.verbose&&(i.level=5,i.info(`Verbose logging enabled`)),g.accountType=e.accountType,e.accountType!==`individual`&&i.info(`Using ${e.accountType} plan GitHub account`),g.manualApprove=e.manual,g.rateLimitSeconds=e.rateLimit,g.rateLimitWait=e.rateLimitWait,g.showToken=e.showToken,g.localApiKeys=Ve(e.apiKey),g.localApiKeys.length>0&&i.info(`Local API-key auth enabled`),e.githubToken&&(g.githubToken=e.githubToken,i.info(`Using provided GitHub token`)),await h(),await Ce(),e.githubToken||await E(),await De(),await T(),i.info(`Available models: \n${g.models?.data.map(e=>`- ${e.id}`).join(`
`)}`);let t=`http://localhost:${e.port}`;if(e.claudeCode){d(g.models,`Models should be loaded by now`);let e=await i.prompt(`Select a model to use with Claude Code`,{type:`select`,options:g.models.data.map(e=>e.id)}),n=await i.prompt(`Select a small model to use with Claude Code`,{type:`select`,options:g.models.data.map(e=>e.id)}),r=Ke({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:`dummy`,ANTHROPIC_MODEL:e,ANTHROPIC_DEFAULT_SONNET_MODEL:e,ANTHROPIC_SMALL_FAST_MODEL:n,ANTHROPIC_DEFAULT_HAIKU_MODEL:n,DISABLE_NON_ESSENTIAL_MODEL_CALLS:`1`,CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:`1`},`claude`);try{l.writeSync(r),i.success(`Copied Claude Code command to clipboard!`)}catch{i.warn(`Failed to copy to clipboard. Here is the Claude Code command:`),i.log(r)}}i.box(`🌐 Usage Viewer: https://voidsteed.github.io/copilot-proxy-api?endpoint=${t}/usage`),u({fetch:$.fetch,port:e.port,bun:{idleTimeout:0}})}await r(n({meta:{name:`copilot-proxy-api`,description:`A wrapper around GitHub Copilot API to make it OpenAI compatible, making it usable for other tools.`},subCommands:{auth:Ae,start:n({meta:{name:`start`,description:`Start the Copilot 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 to use (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`},"github-token":{alias:`g`,type:`string`,description:"Provide GitHub token directly (must be generated using the `auth` subcommand)"},"claude-code":{alias:`c`,type:`boolean`,default:!1,description:`Generate a command to launch Claude Code with Copilot API config`},"show-token":{type:`boolean`,default:!1,description:`Show GitHub and Copilot tokens on fetch and refresh`},"proxy-env":{type:`boolean`,default:!1,description:`Initialize proxy from environment variables`},"api-key":{type:`string`,description:`Require one of these comma-separated local API keys for proxy routes`}},run({args:e}){let t=e[`rate-limit`],n=t===void 0?void 0:Number.parseInt(t,10);return Fn({port:Number.parseInt(e.port,10),verbose:e.verbose,accountType:e[`account-type`],manual:e.manual,rateLimit:n,rateLimitWait:e.wait,githubToken:e[`github-token`],claudeCode:e[`claude-code`],showToken:e[`show-token`],proxyEnv:e[`proxy-env`],apiKey:e[`api-key`]})}}),"check-usage":Me,debug:Be}}));export{};
`,fn=new Set([`call_id`,`id`,`model`,`name`,`previous_response_id`,`role`,`status`,`tool_call_id`,`type`]);async function pn(e){if(!g.copilotToken)throw Error(`Copilot token not found`);let n=mn(jn(e),hn(e.model)),r=JSON.stringify(n),a={...b(g,Mn(n)),accept:n.stream?`text/event-stream`:`application/json`,"X-Initiator":`agent`};i.info(`Sending responses payload: ${r.length} bytes, model: ${e.model}`);let o=await I(`${y(g)}/responses`,{method:`POST`,headers:a,body:r});if(!o.ok){let n=await o.text();if(i.error(`Failed to create responses - Status: ${o.status} ${o.statusText}`),i.error(`Response body: ${n}`),i.error(`Request payload size: ${r.length} bytes`),An(o,n,r.length)){let n=Math.ceil(r.length/4),a=g.models?.data.find(t=>t.id===e.model)?.capabilities.limits,o=L(e.model,a),s=e.max_output_tokens??0;throw i.warn(`Responses context overflow -> returning 400 prompt-too-long (~${n} + ${s} > ${o})`),new t(`Prompt too long`,new Response(JSON.stringify({type:`error`,error:{type:`invalid_request_error`,message:`prompt is too long: input length and \`max_tokens\` exceed context limit: ${n} + ${s} > ${o} tokens`}}),{status:400,statusText:`Bad Request`,headers:{"content-type":`application/json`}}))}throw new t(`Failed to create responses`,new Response(n,{status:o.status,statusText:o.statusText,headers:o.headers}))}return o}function mn(e,t){let n=JSON.stringify(e);if(n.length<=t)return e;if(i.info(`Responses context fit: payload ${n.length} bytes exceeds ${t} byte ceiling - reducing`),typeof e.input==`string`){let r=X(e,t),a=JSON.stringify(r).length;return i.warn(`Responses context fit: truncated string input (${n.length} -> ${a} bytes)`),r}let r=e,a=n.length,o=gn(e),s=0;for(let e of o)if(r=_n(r,e),s++,a=JSON.stringify(r).length,a<=t)break;if(s>0&&i.warn(`Responses context fit: stripped ${s} images (${n.length} -> ${a} bytes)`),a<=t)return r;let c=vn(r,t);return r=bn(c.payload),a=JSON.stringify(r).length,c.count>0&&i.warn(`Responses context fit: dropped ${c.count} old input items (${n.length} -> ${a} bytes)`),a<=t||(r=wn(r,t),a=JSON.stringify(r).length,i.warn(`Responses context fit: truncated input content (${n.length} -> ${a} bytes)`),a<=t)||(r=Dn(r,t),a=JSON.stringify(r).length,i.warn(`Responses context fit: minimized input history (${n.length} -> ${a} bytes)`),a<=t)?r:(r=On(r,t),a=JSON.stringify(r).length,i.warn(`Responses context fit: truncated payload strings (${n.length} -> ${a} bytes)`),r)}function hn(e){let t=g.models?.data.find(t=>t.id===e)?.capabilities.limits,n=R(e,t);if(!n)return ln;let r=Math.floor((n-8e3)*3.5);return Math.min(ln,r)}function X(e,t){if(typeof e.input!=`string`)return e;let n=JSON.stringify({...e,input:``}).length,r=Math.max(62,t-n),i=Math.max(0,r-62);return{...e,input:dn+e.input.slice(-i)}}function gn(e){if(typeof e.input==`string`)return[];let t=[];for(let[n,r]of e.input.entries())if(Array.isArray(r.content))for(let[e,i]of r.content.entries())i.type===`input_image`&&t.push({contentIndex:e,inputIndex:n});return t}function _n(e,t){if(typeof e.input==`string`)return e;let n=[...e.input],r=n[t.inputIndex];if(!Array.isArray(r.content))return e;let i=[...r.content];return i[t.contentIndex]={type:`input_text`,text:`[image removed to stay under upstream payload limit]`},n[t.inputIndex]={...r,content:i},{...e,input:n}}function vn(e,t){if(typeof e.input==`string`)return{bodyLength:JSON.stringify(e).length,count:0,payload:e};let n=[...e.input],r=JSON.stringify({...e,input:n}).length,i=0;for(let a=0;a<n.length&&r>t;a++){let t=n[a];t.role===`system`||t.role===`developer`||Cn(n,a)<=2||(n[a]=yn(t),i++,r=JSON.stringify({...e,input:n}).length)}return{bodyLength:r,count:i,payload:{...e,input:n}}}function yn(e){return{role:e.role===`assistant`?`assistant`:`user`,content:un}}function bn(e){if(typeof e.input==`string`)return e;let t=new Set(e.input.filter(e=>xn(e)&&e.call_id).map(e=>e.call_id)),n=0,r=e.input.map(e=>!Sn(e)||!e.call_id||t.has(e.call_id)?e:(n++,yn(e)));return n===0?e:(i.warn(`Responses context fit: dropped ${n} orphaned tool call outputs`),{...e,input:r})}function xn(e){return typeof e.type==`string`&&e.type.endsWith(`_call`)}function Sn(e){return typeof e.type==`string`&&e.type.endsWith(`_call_output`)}function Cn(e,t){let n=0;for(let r=t;r<e.length;r++)e[r].role!==`system`&&e[r].role!==`developer`&&n++;return n}function wn(e,t){if(typeof e.input==`string`)return X(e,t);let n=e,r=JSON.stringify(n).length;for(;r>t;){let e=Tn(n);if(!e)return n;n=En(n,e,r-t);let i=JSON.stringify(n).length;if(i>=r)return n;r=i}return n}function Tn(e){if(typeof e.input==`string`)return null;let t=null;for(let[n,r]of e.input.entries()){if(r.role===`system`||r.role===`developer`)continue;let e=Z(r,[]);e&&(!t||e.length>t.length)&&(t={inputIndex:n,...e})}return t}function En(e,t,n){if(typeof e.input==`string`)return e;let r=[...e.input],i=r[t.inputIndex],a=Math.max(0,t.length-n-62-1e4);return r[t.inputIndex]=Q(i,t.path,a),{...e,input:r}}function Z(e,t){if(typeof e==`string`){let n=t.at(-1);return typeof n==`string`&&fn.has(n)?null:{length:e.length,path:t}}if(Array.isArray(e))return e.reduce((e,n,r)=>{let i=Z(n,[...t,r]);return i&&(!e||i.length>e.length)?i:e},null);if(!kn(e))return null;let n=null;for(let[r,i]of Object.entries(e)){let e=Z(i,[...t,r]);e&&(!n||e.length>n.length)&&(n=e)}return n}function Q(e,t,n){if(t.length===0)return typeof e==`string`?dn+e.slice(-n):e;let[r,...i]=t;if(Array.isArray(e)&&typeof r==`number`){let t=[...e];return t[r]=Q(t[r],i,n),t}return kn(e)&&typeof r==`string`?{...e,[r]:Q(e[r],i,n)}:e}function Dn(e,t){if(typeof e.input==`string`)return X(e,t);let n=e.input.filter(e=>e.role===`system`||e.role===`developer`),r=[...e.input].reverse().find(e=>e.role!==`system`&&e.role!==`developer`);return{...e,input:[...n,{role:r?.role===`assistant`?`assistant`:`user`,content:un}]}}function On(e,t){let n=e,r=JSON.stringify(n).length;for(;r>t;){let e=Z(n,[]);if(!e)return n;n=Q(n,e.path,r-t);let i=JSON.stringify(n).length;if(i>=r)return n;r=i}return n}function kn(e){return typeof e==`object`&&!!e}function An(e,t,n){return e.status===413||/request entity too large/i.test(t)||/exceeds the limit of \d+/i.test(t)||/context_length_exceeded/i.test(t)||/operation timed out/i.test(t)||/payload too large/i.test(t)||/maximum context length/i.test(t)||e.status>=500&&e.status<600&&n>2e6}function jn(e){let t={...e};return delete t.service_tier,t.tools?.some(e=>e.type===`image_generation`)?{...t,tools:t.tools.filter(e=>e.type!==`image_generation`)}:t}function Mn(e){return typeof e.input==`string`?!1:e.input.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`input_image`))}async function Nn(e){await j(g);let t=await e.req.json();return i.debug(`Responses API request:`,JSON.stringify(t).slice(-400)),g.manualApprove&&await A(),pn(t)}const Pn=new d;Pn.post(`/`,async n=>{try{return await Nn(n)}catch(r){if(r instanceof t){let e=await r.response.text(),t;try{t=JSON.parse(e)}catch{t=e}return i.error(`Responses HTTP error body:`,t),new Response(e,{status:r.response.status,statusText:r.response.statusText,headers:{"content-type":r.response.headers.get(`content-type`)??`application/json`}})}return await e(n,r)}});const Fn=new d;Fn.get(`/`,e=>{try{return e.json({token:g.copilotToken})}catch(t){return i.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const In=new d;In.get(`/`,async e=>{try{let t=await O();return e.json(t)}catch(t){return i.error(`Error fetching Copilot usage:`,t),e.json({error:`Failed to fetch Copilot usage`},500)}});const $=new d;$.use(ce()),$.use(se()),$.use(Ye),$.get(`/`,e=>e.text(`Server running`)),$.use(Be),$.route(`/chat/completions`,B),$.route(`/debug`,V),$.route(`/models`,Y),$.route(`/embeddings`,H),$.route(`/usage`,In),$.route(`/token`,Fn),$.route(`/v1/chat/completions`,B),$.route(`/v1/models`,Y),$.route(`/v1/embeddings`,H),$.route(`/v1/responses`,Pn),$.route(`/v1/messages`,J);async function Ln(e){e.proxyEnv&&He(),e.verbose&&(i.level=5,i.info(`Verbose logging enabled`)),g.accountType=e.accountType,e.accountType!==`individual`&&i.info(`Using ${e.accountType} plan GitHub account`),g.manualApprove=e.manual,g.rateLimitSeconds=e.rateLimit,g.rateLimitWait=e.rateLimitWait,g.showToken=e.showToken,g.localApiKeys=ze(e.apiKey),g.localApiKeys.length>0&&i.info(`Local API-key auth enabled`),e.githubToken&&(g.githubToken=e.githubToken,i.info(`Using provided GitHub token`)),await h(),await Ce(),e.githubToken||await E(),await De(),await T(),i.info(`Available models: \n${g.models?.data.map(e=>`- ${e.id}`).join(`
`)}`);let t=`http://localhost:${e.port}`;if(e.claudeCode){ee(g.models,`Models should be loaded by now`);let e=await i.prompt(`Select a model to use with Claude Code`,{type:`select`,options:g.models.data.map(e=>e.id)}),n=await i.prompt(`Select a small model to use with Claude Code`,{type:`select`,options:g.models.data.map(e=>e.id)}),r=We({ANTHROPIC_BASE_URL:t,ANTHROPIC_AUTH_TOKEN:`dummy`,ANTHROPIC_MODEL:e,ANTHROPIC_DEFAULT_SONNET_MODEL:e,ANTHROPIC_SMALL_FAST_MODEL:n,ANTHROPIC_DEFAULT_HAIKU_MODEL:n,DISABLE_NON_ESSENTIAL_MODEL_CALLS:`1`,CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:`1`},`claude`);try{l.writeSync(r),i.success(`Copied Claude Code command to clipboard!`)}catch{i.warn(`Failed to copy to clipboard. Here is the Claude Code command:`),i.log(r)}}i.box(`🌐 Usage Viewer: https://voidsteed.github.io/copilot-proxy-api?endpoint=${t}/usage`),u({fetch:$.fetch,port:e.port,bun:{idleTimeout:0}})}await r(n({meta:{name:`copilot-proxy-api`,description:`A wrapper around GitHub Copilot API to make it OpenAI compatible, making it usable for other tools.`},subCommands:{auth:ke,start:n({meta:{name:`start`,description:`Start the Copilot 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 to use (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`},"github-token":{alias:`g`,type:`string`,description:"Provide GitHub token directly (must be generated using the `auth` subcommand)"},"claude-code":{alias:`c`,type:`boolean`,default:!1,description:`Generate a command to launch Claude Code with Copilot API config`},"show-token":{type:`boolean`,default:!1,description:`Show GitHub and Copilot tokens on fetch and refresh`},"proxy-env":{type:`boolean`,default:!1,description:`Initialize proxy from environment variables`},"api-key":{type:`string`,description:`Require one of these comma-separated local API keys for proxy routes`}},run({args:e}){let t=e[`rate-limit`],n=t===void 0?void 0:Number.parseInt(t,10);return Ln({port:Number.parseInt(e.port,10),verbose:e.verbose,accountType:e[`account-type`],manual:e.manual,rateLimit:n,rateLimitWait:e.wait,githubToken:e[`github-token`],claudeCode:e[`claude-code`],showToken:e[`show-token`],proxyEnv:e[`proxy-env`],apiKey:e[`api-key`]})}}),"check-usage":Ae,debug:Re}}));export{};
//# sourceMappingURL=main.mjs.map
{
"name": "copilot-proxy-api",
"version": "0.10.10",
"version": "0.10.11",
"description": "Turn GitHub Copilot into OpenAI/Anthropic API compatible server. Usable with Claude Code and Codex CLI!",

@@ -5,0 +5,0 @@ "keywords": [

Sorry, the diff of this file is too big to display