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.12
to
0.10.13
+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 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 ue=s.join(o.homedir(),`.local`,`share`,`copilot-proxy-api`),p={APP_DIR:ue,GITHUB_TOKEN_PATH:s.join(ue,`github_token`)};async function m(){await a.mkdir(p.APP_DIR,{recursive:!0}),await de(p.GITHUB_TOKEN_PATH)}async function de(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,``),await a.chmod(e,384)}}const h={accountType:`individual`,manualApprove:!1,rateLimitWait:!1,showToken:!1,localApiKeys:[]},g=()=>({"content-type":`application/json`,accept:`application/json`}),fe=`0.43.0`,pe=`copilot-chat/${fe}`,me=`GitHubCopilotChat/${fe}`,he=`2025-04-01`,_=e=>e.accountType===`individual`?`https://api.githubcopilot.com`:`https://api.${e.accountType}.githubcopilot.com`,v=(e,t=!1)=>{let n={Authorization:`Bearer ${e.copilotToken}`,"content-type":g()[`content-type`],"copilot-integration-id":`vscode-chat`,"editor-version":`vscode/${e.vsCodeVersion}`,"editor-plugin-version":pe,"user-agent":me,"openai-intent":`conversation-panel`,"x-github-api-version":he,"x-request-id":c(),"x-vscode-user-agent-library-version":`electron-fetch`};return t&&(n[`copilot-vision-request`]=`true`),n},y=`https://api.github.com`,b=e=>({...g(),authorization:`token ${e.githubToken}`,"editor-version":`vscode/${e.vsCodeVersion}`,"editor-plugin-version":pe,"user-agent":me,"x-github-api-version":he,"x-vscode-user-agent-library-version":`electron-fetch`}),ge=`https://github.com`,_e=`Iv1.b507a08c87ecfe98`,ve=[`read:user`].join(` `),ye=async()=>{let e=await fetch(`${y}/copilot_internal/v2/token`,{headers:b(h)});if(!e.ok)throw new t(`Failed to get Copilot token`,e);return await e.json()};async function be(){let e=await fetch(`${ge}/login/device/code`,{method:`POST`,headers:g(),body:JSON.stringify({client_id:_e,scope:ve})});if(!e.ok)throw new t(`Failed to get device code`,e);return await e.json()}async function xe(){let e=await fetch(`${y}/user`,{headers:{authorization:`token ${h.githubToken}`,...g()}});if(!e.ok)throw new t(`Failed to get GitHub user`,e);return await e.json()}const Se=async()=>{let e=await fetch(`${_(h)}/models`,{headers:v(h)});if(!e.ok)throw new t(`Failed to get models`,e);return await e.json()},Ce=`1.114.0`;async function we(){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]:Ce}catch{return Ce}finally{clearTimeout(t)}}await we();const x=e=>new Promise(t=>{setTimeout(t,e)}),Te=e=>e==null;async function S(){h.models=await Se()}const Ee=async()=>{let e=await we();h.vsCodeVersion=e,i.info(`Using VSCode version: ${e}`)};async function De(e){let t=(e.interval+1)*1e3;for(i.debug(`Polling access token with interval of ${t}ms`);;){let n=await fetch(`${ge}/login/oauth/access_token`,{method:`POST`,headers:g(),body:JSON.stringify({client_id:_e,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`})});if(!n.ok){await x(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 x(t)}}const Oe=()=>a.readFile(p.GITHUB_TOKEN_PATH,`utf8`),ke=e=>a.writeFile(p.GITHUB_TOKEN_PATH,e),Ae=async()=>{let{token:e,refresh_in:t}=await ye();h.copilotToken=e,i.debug(`GitHub Copilot Token fetched successfully!`),h.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 ye();h.copilotToken=e,i.debug(`Copilot token refreshed`),h.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 C(e){try{let t=await Oe();if(t&&!e?.force){h.githubToken=t,h.showToken&&i.info(`GitHub token:`,t),await w();return}i.info(`Not logged in, getting new access token`);let n=await be();i.debug(`Device code response:`,n),i.info(`Please enter the code "${n.user_code}" in ${n.verification_uri}`);let r=await De(n);await ke(r),h.githubToken=r,h.showToken&&i.info(`GitHub token:`,r),await w()}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 w(){let e=await xe();i.info(`Logged in as ${e.login}`)}async function je(e){e.verbose&&(i.level=5,i.info(`Verbose logging enabled`)),h.showToken=e.showToken,await m(),await C({force:!0}),i.success(`GitHub token written to`,p.GITHUB_TOKEN_PATH)}const Me=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 je({verbose:e.verbose,showToken:e[`show-token`]})}}),T=async()=>{let e=await fetch(`${y}/copilot_internal/user`,{headers:b(h)});if(!e.ok)throw new t(`Failed to get Copilot usage`,e);return await e.json()},Ne=n({meta:{name:`check-usage`,description:`Show current GitHub Copilot usage/quota information`},async run(){await m(),await C();try{let e=await T(),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 Pe(){try{let e=new URL(`../package.json`,import.meta.url).pathname;return JSON.parse(await a.readFile(e)).version}catch{return`unknown`}}function Fe(){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 Ie(){try{return(await a.stat(p.GITHUB_TOKEN_PATH)).isFile()?(await a.readFile(p.GITHUB_TOKEN_PATH,`utf8`)).trim().length>0:!1}catch{return!1}}async function Le(){let[e,t]=await Promise.all([Pe(),Ie()]);return{version:e,runtime:Fe(),paths:{APP_DIR:p.APP_DIR,GITHUB_TOKEN_PATH:p.GITHUB_TOKEN_PATH},tokenExists:t}}function Re(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 ue=s.join(o.homedir(),`.local`,`share`,`copilot-proxy-api`),p={APP_DIR:ue,GITHUB_TOKEN_PATH:s.join(ue,`github_token`)};async function m(){await a.mkdir(p.APP_DIR,{recursive:!0}),await de(p.GITHUB_TOKEN_PATH)}async function de(e){try{await a.access(e,a.constants.W_OK)}catch{await a.writeFile(e,``),await a.chmod(e,384)}}const h={accountType:`individual`,manualApprove:!1,rateLimitWait:!1,showToken:!1,localApiKeys:[]},g=()=>({"content-type":`application/json`,accept:`application/json`}),fe=`0.43.0`,pe=`copilot-chat/${fe}`,me=`GitHubCopilotChat/${fe}`,he=`2025-04-01`,_=e=>e.accountType===`individual`?`https://api.githubcopilot.com`:`https://api.${e.accountType}.githubcopilot.com`,v=(e,t=!1)=>{let n={Authorization:`Bearer ${e.copilotToken}`,"content-type":g()[`content-type`],"copilot-integration-id":`vscode-chat`,"editor-version":`vscode/${e.vsCodeVersion}`,"editor-plugin-version":pe,"user-agent":me,"openai-intent":`conversation-panel`,"x-github-api-version":he,"x-request-id":c(),"x-vscode-user-agent-library-version":`electron-fetch`};return t&&(n[`copilot-vision-request`]=`true`),n},y=`https://api.github.com`,ge=e=>({...g(),authorization:`token ${e.githubToken}`,"editor-version":`vscode/${e.vsCodeVersion}`,"editor-plugin-version":pe,"user-agent":me,"x-github-api-version":he,"x-vscode-user-agent-library-version":`electron-fetch`}),_e=`https://github.com`,ve=`Iv1.b507a08c87ecfe98`,ye=[`read:user`].join(` `),b=async()=>{let e=await fetch(`${y}/copilot_internal/v2/token`,{headers:ge(h)});if(!e.ok)throw new t(`Failed to get Copilot token`,e);return await e.json()};async function be(){let e=await fetch(`${_e}/login/device/code`,{method:`POST`,headers:g(),body:JSON.stringify({client_id:ve,scope:ye})});if(!e.ok)throw new t(`Failed to get device code`,e);return await e.json()}async function xe(){let e=await fetch(`${y}/user`,{headers:{authorization:`token ${h.githubToken}`,...g()}});if(!e.ok)throw new t(`Failed to get GitHub user`,e);return await e.json()}const Se=async()=>{let e=await fetch(`${_(h)}/models`,{headers:v(h)});if(!e.ok)throw new t(`Failed to get models`,e);return await e.json()},Ce=`1.114.0`;async function x(){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]:Ce}catch{return Ce}finally{clearTimeout(t)}}await x();const S=e=>new Promise(t=>{setTimeout(t,e)}),we=e=>e==null;async function Te(){h.models=await Se()}const Ee=async()=>{let e=await x();h.vsCodeVersion=e,i.info(`Using VSCode version: ${e}`)};async function De(e){let t=(e.interval+1)*1e3;for(i.debug(`Polling access token with interval of ${t}ms`);;){let n=await fetch(`${_e}/login/oauth/access_token`,{method:`POST`,headers:g(),body:JSON.stringify({client_id:ve,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`})});if(!n.ok){await S(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 S(t)}}const Oe=()=>a.readFile(p.GITHUB_TOKEN_PATH,`utf8`),ke=e=>a.writeFile(p.GITHUB_TOKEN_PATH,e),Ae=async()=>{let{token:e,refresh_in:t}=await b();h.copilotToken=e,i.debug(`GitHub Copilot Token fetched successfully!`),h.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 b();h.copilotToken=e,i.debug(`Copilot token refreshed`),h.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 C(e){try{let t=await Oe();if(t&&!e?.force){h.githubToken=t,h.showToken&&i.info(`GitHub token:`,t),await w();return}i.info(`Not logged in, getting new access token`);let n=await be();i.debug(`Device code response:`,n),i.info(`Please enter the code "${n.user_code}" in ${n.verification_uri}`);let r=await De(n);await ke(r),h.githubToken=r,h.showToken&&i.info(`GitHub token:`,r),await w()}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 w(){let e=await xe();i.info(`Logged in as ${e.login}`)}async function je(e){e.verbose&&(i.level=5,i.info(`Verbose logging enabled`)),h.showToken=e.showToken,await m(),await C({force:!0}),i.success(`GitHub token written to`,p.GITHUB_TOKEN_PATH)}const Me=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 je({verbose:e.verbose,showToken:e[`show-token`]})}}),T=async()=>{let e=await fetch(`${y}/copilot_internal/user`,{headers:ge(h)});if(!e.ok)throw new t(`Failed to get Copilot usage`,e);return await e.json()},Ne=n({meta:{name:`check-usage`,description:`Show current GitHub Copilot usage/quota information`},async run(){await m(),await C();try{let e=await T(),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 Pe(){try{let e=new URL(`../package.json`,import.meta.url).pathname;return JSON.parse(await a.readFile(e)).version}catch{return`unknown`}}function Fe(){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 Ie(){try{return(await a.stat(p.GITHUB_TOKEN_PATH)).isFile()?(await a.readFile(p.GITHUB_TOKEN_PATH,`utf8`)).trim().length>0:!1}catch{return!1}}async function Le(){let[e,t]=await Promise.all([Pe(),Ie()]);return{version:e,runtime:Fe(),paths:{APP_DIR:p.APP_DIR,GITHUB_TOKEN_PATH:p.GITHUB_TOKEN_PATH},tokenExists:t}}function Re(e){i.info(`copilot-proxy-api debug

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

Token exists: ${e.tokenExists?`Yes`:`No`}`)}function ze(e){console.log(JSON.stringify(e,null,2))}async function Be(e){let t=await Le();e.json?ze(t):Re(t)}const Ve=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 Be({json:e.json})}});function He(e){return e?e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):[]}const Ue=async(e,t)=>{if(h.localApiKeys.length===0||e.req.method===`OPTIONS`){await t();return}let n=We(e.req.header(`authorization`)),r=e.req.header(`x-api-key`)?.trim();if(n&&h.localApiKeys.includes(n)||r&&h.localApiKeys.includes(r)){await t();return}return e.json({error:{message:`Missing or invalid API key`,type:`authentication_error`}},401)};function We(e){if(!e||!e.toLowerCase().startsWith(`bearer `))return;let t=e.slice(7).trim();return t.length>0?t:void 0}function Ge(){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 Ke(){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 qe(e,t=``){let n=Ke(),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 E=[];function Je(){return`req_${c().replaceAll(`-`,``)}`}function Ye(e){return e instanceof Error?e.message:`Unknown error`}function Xe(e){E.unshift(e),E.length>100&&(E.length=100)}function Ze(){return[...E]}const Qe=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`)??Je();e.header(`request-id`,i),e.header(`x-request-id`,i);let a;try{await t()}catch(e){throw a=Ye(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;Xe({id:t,method:e.req.method,path:e.req.path,status:o,ok:!a&&o<400,durationMs:Date.now()-n,startedAt:r,error:a})}},D=async()=>{if(!await i.prompt(`Accept incoming request?`,{type:`confirm`}))throw new t(`Request rejected`,Response.json({message:`Request rejected`},{status:403}))};async function O(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 x(o),e.lastRequestTimestamp=n,i.info(`Rate limit wait completed, proceeding with request`)}const k={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`)},A=new Map,$e=(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},et=(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},tt=(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+=$e(a,t,n)),i===`content`&&Array.isArray(a)&&(r+=et(a,t));return r},nt=(e,t,n)=>{if(e.length===0)return 0;let r=0;for(let i of e)r+=tt(i,t,n);return r+=3,r},rt=async e=>{if(A.has(e)){let t=A.get(e);if(t)return t}let t=e;if(!(t in k)){let t=await k.o200k_base();return A.set(e,t),t}let n=await k[t]();return A.set(e,n),n},it=e=>e.capabilities.tokenizer||`o200k_base`,at=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},ot=(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},st=(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+=ot(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},ct=(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+=st(i.parameters,t,n)),r},lt=(e,t,n)=>{let r=0;for(let i of e)r+=ct(i,t,n);return r+=n.funcEnd,r},ut=async(e,t)=>{let n=await rt(it(t)),r=e.messages,i=r.filter(e=>e.role!==`assistant`),a=r.filter(e=>e.role===`assistant`),o=at(t),s=nt(i,n,o);e.tools&&e.tools.length>0&&(s+=lt(e.tools,n,o));let c=nt(a,n,o);return{input:s,output:c}};async function j(e,t){let{attempts:n=3,retryDelayMs:r=250,...a}=t,o=typeof a.body==`string`?a.body.length:0,s=dt(e,a.method),c;for(let t=1;t<=n;t++){try{let r=await fetch(e,a);if(!pt(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 (${ft(e)}); retrying (${t}/${n})`)}await x(r*t)}throw c instanceof Error?c:Error(`Copilot request failed`)}function dt(e,t){let n=t?.toUpperCase()??`GET`;try{return`${n} ${new URL(e).pathname}`}catch{return`${n} ${e}`}}function ft(e){return e instanceof Error&&e.message?e.message:`unknown error`}function pt(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 mt(e,t){return M(e,t)??2e5}function M(e,t){return t?.max_prompt_tokens?t.max_prompt_tokens:ht(e)?936e3:t?.max_context_window_tokens}function ht(e){return/(?:^|[-_.])1m(?:$|[-_.])/i.test(e)}const N=async e=>{if(!h.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={...v(h,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 j(`${_(h)}/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=h.models?.data.find(t=>t.id===e.model)?.capabilities.limits,a=mt(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 gt(e){await O(h);let t=await e.req.json();i.debug(`Request payload:`,JSON.stringify(t).slice(-400));let n=h.models?.data.find(e=>e.id===t.model);try{if(n){let e=await ut(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)}h.manualApprove&&await D(),Te(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 N(t);return _t(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 _t=e=>Object.hasOwn(e,`choices`),P=new d;P.post(`/`,async t=>{try{return await gt(t)}catch(n){return await e(t,n)}});const F=new d;F.get(`/requests`,e=>e.json({object:`list`,data:Ze()}));const vt=async e=>{if(!h.copilotToken)throw Error(`Copilot token not found`);let n=await j(`${_(h)}/embeddings`,{method:`POST`,headers:v(h),body:JSON.stringify(e)});if(!n.ok)throw new t(`Failed to create embeddings`,n);return await n.json()},I=new d;I.post(`/`,async t=>{try{let e=await vt(await t.req.json());return t.json(e)}catch(n){return await e(t,n)}});function L(e){return e===null?null:{stop:`end_turn`,length:`max_tokens`,tool_calls:`tool_use`,content_filter:`refusal`}[e]}function R(e){return{model:wt(e.model),messages:Tt(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:jt(e.tools),tool_choice:Nt(e.tool_choice),thinking:Mt(e.thinking)}}async function yt(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 bt(t)):e.push(t);t.push({role:`user`,content:e})}return{...e,messages:t}}async function bt(e){if(e.source.type===`text`)return[{type:`text`,text:z(e)+e.source.data}];if(e.source.type===`url`)return[{type:`text`,text:z(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:z(e)+`[Extracted text from PDF (${n.pageCount} page${n.pageCount===1?``:`s`}${n.truncated?`, truncated`:``}):]\n\n`+n.text}]}function z(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 ze(e){console.log(JSON.stringify(e,null,2))}async function Be(e){let t=await Le();e.json?ze(t):Re(t)}const Ve=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 Be({json:e.json})}});function He(e){return e?e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):[]}const Ue=async(e,t)=>{if(h.localApiKeys.length===0||e.req.method===`OPTIONS`){await t();return}let n=We(e.req.header(`authorization`)),r=e.req.header(`x-api-key`)?.trim();if(n&&h.localApiKeys.includes(n)||r&&h.localApiKeys.includes(r)){await t();return}return e.json({error:{message:`Missing or invalid API key`,type:`authentication_error`}},401)};function We(e){if(!e||!e.toLowerCase().startsWith(`bearer `))return;let t=e.slice(7).trim();return t.length>0?t:void 0}function Ge(){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 Ke(){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 qe(e,t=``){let n=Ke(),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 E=[];function Je(){return`req_${c().replaceAll(`-`,``)}`}function Ye(e){return e instanceof Error?e.message:`Unknown error`}function Xe(e){E.unshift(e),E.length>100&&(E.length=100)}function Ze(){return[...E]}const Qe=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`)??Je();e.header(`request-id`,i),e.header(`x-request-id`,i);let a;try{await t()}catch(e){throw a=Ye(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;Xe({id:t,method:e.req.method,path:e.req.path,status:o,ok:!a&&o<400,durationMs:Date.now()-n,startedAt:r,error:a})}},D=async()=>{if(!await i.prompt(`Accept incoming request?`,{type:`confirm`}))throw new t(`Request rejected`,Response.json({message:`Request rejected`},{status:403}))};async function O(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 S(o),e.lastRequestTimestamp=n,i.info(`Rate limit wait completed, proceeding with request`)}const k={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`)},A=new Map,$e=(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},et=(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},tt=(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+=$e(a,t,n)),i===`content`&&Array.isArray(a)&&(r+=et(a,t));return r},nt=(e,t,n)=>{if(e.length===0)return 0;let r=0;for(let i of e)r+=tt(i,t,n);return r+=3,r},rt=async e=>{if(A.has(e)){let t=A.get(e);if(t)return t}let t=e;if(!(t in k)){let t=await k.o200k_base();return A.set(e,t),t}let n=await k[t]();return A.set(e,n),n},it=e=>e.capabilities.tokenizer||`o200k_base`,at=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},ot=(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},st=(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+=ot(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},ct=(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+=st(i.parameters,t,n)),r},lt=(e,t,n)=>{let r=0;for(let i of e)r+=ct(i,t,n);return r+=n.funcEnd,r},ut=async(e,t)=>{let n=await rt(it(t)),r=e.messages,i=r.filter(e=>e.role!==`assistant`),a=r.filter(e=>e.role===`assistant`),o=at(t),s=nt(i,n,o);e.tools&&e.tools.length>0&&(s+=lt(e.tools,n,o));let c=nt(a,n,o);return{input:s,output:c}};async function j(e,t){let{attempts:n=3,retryDelayMs:r=250,...a}=t,o=typeof a.body==`string`?a.body.length:0,s=dt(e,a.method),c;for(let t=1;t<=n;t++){try{let r=await fetch(e,a);if(!pt(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 (${ft(e)}); retrying (${t}/${n})`)}await S(r*t)}throw c instanceof Error?c:Error(`Copilot request failed`)}function dt(e,t){let n=t?.toUpperCase()??`GET`;try{return`${n} ${new URL(e).pathname}`}catch{return`${n} ${e}`}}function ft(e){return e instanceof Error&&e.message?e.message:`unknown error`}function pt(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 mt(e,t){return M(e,t)??2e5}function M(e,t){return t?.max_prompt_tokens?t.max_prompt_tokens:ht(e)?936e3:t?.max_context_window_tokens}function ht(e){return/(?:^|[-_.])1m(?:$|[-_.])/i.test(e)}const N=async e=>{if(!h.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={...v(h,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 j(`${_(h)}/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=h.models?.data.find(t=>t.id===e.model)?.capabilities.limits,a=mt(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 gt(e){await O(h);let t=await e.req.json();i.debug(`Request payload:`,JSON.stringify(t).slice(-400));let n=h.models?.data.find(e=>e.id===t.model);try{if(n){let e=await ut(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)}h.manualApprove&&await D(),we(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 N(t);return _t(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 _t=e=>Object.hasOwn(e,`choices`),P=new d;P.post(`/`,async t=>{try{return await gt(t)}catch(n){return await e(t,n)}});const F=new d;F.get(`/requests`,e=>e.json({object:`list`,data:Ze()}));const vt=async e=>{if(!h.copilotToken)throw Error(`Copilot token not found`);let n=await j(`${_(h)}/embeddings`,{method:`POST`,headers:v(h),body:JSON.stringify(e)});if(!n.ok)throw new t(`Failed to create embeddings`,n);return await n.json()},I=new d;I.post(`/`,async t=>{try{let e=await vt(await t.req.json());return t.json(e)}catch(n){return await e(t,n)}});function L(e){return e===null?null:{stop:`end_turn`,length:`max_tokens`,tool_calls:`tool_use`,content_filter:`refusal`}[e]}function R(e){return{model:wt(e.model),messages:Tt(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:jt(e.tools),tool_choice:Nt(e.tool_choice),thinking:Mt(e.thinking)}}async function yt(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 bt(t)):e.push(t);t.push({role:`user`,content:e})}return{...e,messages:t}}async function bt(e){if(e.source.type===`text`)return[{type:`text`,text:z(e)+e.source.data}];if(e.source.type===`url`)return[{type:`text`,text:z(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:z(e)+`[Extracted text from PDF (${n.pageCount} page${n.pageCount===1?``:`s`}${n.truncated?`, truncated`:``}):]\n\n`+n.text}]}function z(e){let t=[];return e.title&&t.push(`Document: ${e.title}`),e.context&&t.push(`Context: ${e.context}`),t.length>0?t.join(`
`)+`

@@ -23,12 +23,12 @@

[…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 qt(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+=G(e);if(e.tools)for(let t of e.tools)a+=JSON.stringify(t).length+20;let o=r.map(e=>G(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]}}const Jt=5e6,Yt=`[older response input omitted to stay under context limit]`,Xt=`[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 qt(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+=G(e);if(e.tools)for(let t of e.tools)a+=JSON.stringify(t).length+20;let o=r.map(e=>G(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]}}const K=5e6,Jt=`[older response input omitted to stay under context limit]`,Yt=`[older response input truncated to stay under context limit]
`,Zt=new Set([`call_id`,`id`,`model`,`name`,`previous_response_id`,`role`,`status`,`tool_call_id`,`type`]);async function K(e){if(!h.copilotToken)throw Error(`Copilot token not found`);let n=Qt(hn(e),$t(e.model)),r=JSON.stringify(n),a={...v(h,gn(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 j(`${_(h)}/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`),mn(o,n,r.length)){let n=Math.ceil(r.length/4),a=h.models?.data.find(t=>t.id===e.model)?.capabilities.limits,o=mt(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 Qt(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=q(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=en(e),s=0;for(let e of o)if(r=tn(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=nn(r,t);return r=rn(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=cn(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=fn(r,t),a=JSON.stringify(r).length,i.warn(`Responses context fit: truncated payload strings (${n.length} -> ${a} bytes)`),r)}function $t(e){let t=h.models?.data.find(t=>t.id===e)?.capabilities.limits,n=M(e,t);if(!n)return Jt;let r=Math.floor((n-8e3)*3.5);return Math.min(Jt,r)}function q(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:Xt+e.input.slice(-i)}}function en(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 tn(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 nn(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`||sn(n,a)<=2||(n[a]=J(t),i++,r=JSON.stringify({...e,input:n}).length)}return{bodyLength:r,count:i,payload:{...e,input:n}}}function J(e){return{role:e.role===`assistant`?`assistant`:`user`,content:Yt}}function rn(e){if(typeof e.input==`string`)return e;let t=new Set(e.input.filter(e=>an(e)&&e.call_id).map(e=>e.call_id)),n=0,r=e.input.map(e=>!on(e)||!e.call_id||t.has(e.call_id)?e:(n++,J(e)));return n===0?e:(i.warn(`Responses context fit: dropped ${n} orphaned tool call outputs`),{...e,input:r})}function an(e){return typeof e.type==`string`&&e.type.endsWith(`_call`)}function on(e){return typeof e.type==`string`&&e.type.endsWith(`_call_output`)}function sn(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 cn(e,t){if(typeof e.input==`string`)return q(e,t);let n=e,r=JSON.stringify(n).length;for(;r>t;){let e=ln(n);if(!e)return n;n=un(n,e,r-t);let i=JSON.stringify(n).length;if(i>=r)return n;r=i}return n}function ln(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=Y(r,[]);e&&(!t||e.length>t.length)&&(t={inputIndex:n,...e})}return t}function un(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]=X(i,t.path,a),{...e,input:r}}function Y(e,t){if(typeof e==`string`){let n=t.at(-1);return typeof n==`string`&&Zt.has(n)?null:{length:e.length,path:t}}if(Array.isArray(e))return e.reduce((e,n,r)=>{let i=Y(n,[...t,r]);return i&&(!e||i.length>e.length)?i:e},null);if(!pn(e))return null;let n=null;for(let[r,i]of Object.entries(e)){let e=Y(i,[...t,r]);e&&(!n||e.length>n.length)&&(n=e)}return n}function X(e,t,n){if(t.length===0)return typeof e==`string`?Xt+e.slice(-n):e;let[r,...i]=t;if(Array.isArray(e)&&typeof r==`number`){let t=[...e];return t[r]=X(t[r],i,n),t}return pn(e)&&typeof r==`string`?{...e,[r]:X(e[r],i,n)}:e}function dn(e,t){if(typeof e.input==`string`)return q(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:Yt}]}}function fn(e,t){let n=e,r=JSON.stringify(n).length;for(;r>t;){let e=Y(n,[]);if(!e)return n;n=X(n,e.path,r-t);let i=JSON.stringify(n).length;if(i>=r)return n;r=i}return n}function pn(e){return typeof e==`object`&&!!e}function mn(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 hn(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 gn(e){return typeof e.input==`string`?!1:e.input.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`input_image`))}function _n(e,t){return{model:t,input:e.messages.flatMap(e=>xn(e)),instructions:bn(e.system),max_output_tokens:e.max_tokens,temperature:e.temperature,top_p:e.top_p,stream:!1,tools:e.tools?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.input_schema})),tool_choice:En(e.tool_choice)}}function vn(e,t){let n=e.output.flatMap(e=>On(e)),r=n.some(e=>e.type===`tool_use`);return{id:e.id,type:`message`,role:`assistant`,content:n,model:t,stop_reason:r?`tool_use`:`end_turn`,stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}async function yn(e,t,n){let r=vn(t,n);await e.writeSSE({event:`message_start`,data:JSON.stringify({type:`message_start`,message:{...r,content:[],stop_reason:null,stop_sequence:null,usage:{...r.usage,output_tokens:0}}})});for(let[t,n]of r.content.entries())n.type===`text`?await An(e,t,n.text):n.type===`tool_use`&&await jn(e,t,n);await e.writeSSE({event:`message_delta`,data:JSON.stringify({type:`message_delta`,delta:{stop_reason:r.stop_reason,stop_sequence:null},usage:{output_tokens:r.usage.output_tokens}})}),await e.writeSSE({event:`message_stop`,data:JSON.stringify({type:`message_stop`})})}function bn(e){if(e)return typeof e==`string`?e:e.map(e=>e.text).join(`
`,Xt=new Set([`call_id`,`id`,`model`,`name`,`previous_response_id`,`role`,`status`,`tool_call_id`,`type`]);async function q(e){if(!h.copilotToken)throw Error(`Copilot token not found`);let n=Zt(hn(e),Qt(e.model)),r=JSON.stringify(n),a={...v(h,bn(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 j(`${_(h)}/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`),mn(o,n,r.length)){let n=Math.ceil(r.length/4),a=h.models?.data.find(t=>t.id===e.model)?.capabilities.limits,o=mt(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 Zt(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=J(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=$t(e),s=0;for(let e of o)if(r=en(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=tn(r,t);return r=rn(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=cn(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=fn(r,t),a=JSON.stringify(r).length,i.warn(`Responses context fit: truncated payload strings (${n.length} -> ${a} bytes)`),r)}function Qt(e){let t=h.models?.data.find(t=>t.id===e)?.capabilities.limits,n=M(e,t);if(!n)return K;let r=Math.floor((n-8e3)*3.5);return Math.min(K,r)}function J(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:Yt+e.input.slice(-i)}}function $t(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 en(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 tn(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`||sn(n,a)<=2||(n[a]=nn(t),i++,r=JSON.stringify({...e,input:n}).length)}return{bodyLength:r,count:i,payload:{...e,input:n}}}function nn(e){return{role:e.role===`assistant`?`assistant`:`user`,content:Jt}}function rn(e){if(typeof e.input==`string`)return e;let t=new Set(e.input.filter(e=>an(e)&&e.call_id).map(e=>e.call_id)),n=0,r=e.input.map(e=>!on(e)||!e.call_id||t.has(e.call_id)?e:(n++,nn(e)));return n===0?e:(i.warn(`Responses context fit: dropped ${n} orphaned tool call outputs`),{...e,input:r})}function an(e){return typeof e.type==`string`&&e.type.endsWith(`_call`)}function on(e){return typeof e.type==`string`&&e.type.endsWith(`_call_output`)}function sn(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 cn(e,t){if(typeof e.input==`string`)return J(e,t);let n=e,r=JSON.stringify(n).length;for(;r>t;){let e=ln(n);if(!e)return n;n=un(n,e,r-t);let i=JSON.stringify(n).length;if(i>=r)return n;r=i}return n}function ln(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=Y(r,[]);e&&(!t||e.length>t.length)&&(t={inputIndex:n,...e})}return t}function un(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]=X(i,t.path,a),{...e,input:r}}function Y(e,t){if(typeof e==`string`){let n=t.at(-1);return typeof n==`string`&&Xt.has(n)?null:{length:e.length,path:t}}if(Array.isArray(e))return e.reduce((e,n,r)=>{let i=Y(n,[...t,r]);return i&&(!e||i.length>e.length)?i:e},null);if(!pn(e))return null;let n=null;for(let[r,i]of Object.entries(e)){let e=Y(i,[...t,r]);e&&(!n||e.length>n.length)&&(n=e)}return n}function X(e,t,n){if(t.length===0)return typeof e==`string`?Yt+e.slice(-n):e;let[r,...i]=t;if(Array.isArray(e)&&typeof r==`number`){let t=[...e];return t[r]=X(t[r],i,n),t}return pn(e)&&typeof r==`string`?{...e,[r]:X(e[r],i,n)}:e}function dn(e,t){if(typeof e.input==`string`)return J(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:Jt}]}}function fn(e,t){let n=e,r=JSON.stringify(n).length;for(;r>t;){let e=Y(n,[]);if(!e)return n;n=X(n,e.path,r-t);let i=JSON.stringify(n).length;if(i>=r)return n;r=i}return n}function pn(e){return typeof e==`object`&&!!e}function mn(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 hn(e){let t=gn(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 gn(e){if(typeof e.input==`string`)return e;let t;for(let[n,r]of e.input.entries()){if(!Array.isArray(r.output))continue;let i=_n(r.output);i!==r.output&&(t??=[...e.input],t[n]={...r,output:i})}return t?{...e,input:t}:e}function _n(e){return typeof e==`string`||!e.some(e=>vn(e))?e:e.map(e=>vn(e)?{type:`output_text`,text:`[image output removed because its URL is not valid for Copilot Responses]`}:e)}function vn(e){return typeof e.image_url==`string`&&!yn(e.image_url)}function yn(e){try{return new URL(e),!0}catch{return!1}}function bn(e){return typeof e.input==`string`?!1:e.input.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`input_image`))}function xn(e,t){return{model:t,input:e.messages.flatMap(e=>Tn(e)),instructions:wn(e.system),max_output_tokens:e.max_tokens,temperature:e.temperature,top_p:e.top_p,stream:!1,tools:e.tools?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.input_schema})),tool_choice:An(e.tool_choice)}}function Sn(e,t){let n=e.output.flatMap(e=>Mn(e)),r=n.some(e=>e.type===`tool_use`);return{id:e.id,type:`message`,role:`assistant`,content:n,model:t,stop_reason:r?`tool_use`:`end_turn`,stop_sequence:null,usage:{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}}async function Cn(e,t,n){let r=Sn(t,n);await e.writeSSE({event:`message_start`,data:JSON.stringify({type:`message_start`,message:{...r,content:[],stop_reason:null,stop_sequence:null,usage:{...r.usage,output_tokens:0}}})});for(let[t,n]of r.content.entries())n.type===`text`?await Pn(e,t,n.text):n.type===`tool_use`&&await Fn(e,t,n);await e.writeSSE({event:`message_delta`,data:JSON.stringify({type:`message_delta`,delta:{stop_reason:r.stop_reason,stop_sequence:null},usage:{output_tokens:r.usage.output_tokens}})}),await e.writeSSE({event:`message_stop`,data:JSON.stringify({type:`message_stop`})})}function wn(e){if(e)return typeof e==`string`?e:e.map(e=>e.text).join(`
`)}function xn(e){return e.role===`user`?Sn(e.content):Cn(e.content)}function Sn(e){if(typeof e==`string`)return[{role:`user`,content:e}];let t=[],n=[];for(let r of e)r.type===`tool_result`?t.push({type:`function_call_output`,call_id:r.tool_use_id,output:Dn(r.content)}):n.push(r);let r=wn(n);return r&&t.push({role:`user`,content:r}),t}function Cn(e){if(typeof e==`string`)return[{role:`assistant`,content:e}];let t=[],n=e.filter(e=>e.type===`text`).map(e=>e.text).join(`
`)}function Tn(e){return e.role===`user`?En(e.content):Dn(e.content)}function En(e){if(typeof e==`string`)return[{role:`user`,content:e}];let t=[],n=[];for(let r of e)r.type===`tool_result`?t.push({type:`function_call_output`,call_id:r.tool_use_id,output:jn(r.content)}):n.push(r);let r=On(n);return r&&t.push({role:`user`,content:r}),t}function Dn(e){if(typeof e==`string`)return[{role:`assistant`,content:e}];let t=[],n=e.filter(e=>e.type===`text`).map(e=>e.text).join(`
`);n&&t.push({role:`assistant`,content:n});for(let n of e)n.type===`tool_use`&&t.push({type:`function_call`,call_id:n.id,name:n.name,arguments:JSON.stringify(n.input)});return t}function wn(e){if(!e.some(e=>e.type===`image`))return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
`);n&&t.push({role:`assistant`,content:n});for(let n of e)n.type===`tool_use`&&t.push({type:`function_call`,call_id:n.id,name:n.name,arguments:JSON.stringify(n.input)});return t}function On(e){if(!e.some(e=>e.type===`image`))return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
`)||null;let t=[];for(let n of e)n.type===`text`?t.push({type:`input_text`,text:n.text}):n.type===`image`&&t.push(Tn(n));return t.length>0?t:null}function Tn(e){return{type:`input_image`,image_url:`data:${e.source.media_type};base64,${e.source.data}`}}function En(e){if(e){if(e.type===`auto`||e.type===`none`)return e.type;if(e.type===`any`)return`required`;if(e.name)return{type:`function`,name:e.name}}}function Dn(e){return typeof e==`string`?e:JSON.stringify(e)}function On(e){return e.type===`function_call`&&e.name&&e.call_id?[{type:`tool_use`,id:e.call_id,name:e.name,input:kn(e.arguments)}]:e.type!==`message`||!e.content?[]:e.content.flatMap(e=>e.type!==`output_text`||!e.text?[]:[{type:`text`,text:e.text}])}function kn(e){if(!e)return{};try{let t=JSON.parse(e);if(t&&typeof t==`object`&&!Array.isArray(t))return t}catch{return{}}return{}}async function An(e,t,n){await e.writeSSE({event:`content_block_start`,data:JSON.stringify({type:`content_block_start`,index:t,content_block:{type:`text`,text:``}})}),await e.writeSSE({event:`content_block_delta`,data:JSON.stringify({type:`content_block_delta`,index:t,delta:{type:`text_delta`,text:n}})}),await e.writeSSE({event:`content_block_stop`,data:JSON.stringify({type:`content_block_stop`,index:t})})}async function jn(e,t,n){await e.writeSSE({event:`content_block_start`,data:JSON.stringify({type:`content_block_start`,index:t,content_block:{type:`tool_use`,id:n.id,name:n.name,input:{}}})}),await e.writeSSE({event:`content_block_delta`,data:JSON.stringify({type:`content_block_delta`,index:t,delta:{type:`input_json_delta`,partial_json:JSON.stringify(n.input)}})}),await e.writeSSE({event:`content_block_stop`,data:JSON.stringify({type:`content_block_stop`,index:t})})}function Mn(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function Nn(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&&(Mn(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:L(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 Pn(e){return{type:`error`,error:{type:`api_error`,message:e??`An unexpected error occurred during streaming.`}}}function Fn(){return`req_${crypto.randomUUID().replaceAll(`-`,``)}`}async function In(e){await O(h);let t=e.req.header(`x-client-request-id`)??Fn();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 yt(n),o=R(a),s=h.models?.data.find(e=>e.id===o.model);return zn(s)?await Rn(e,a,{clientModel:r,model:o.model,requestId:t}):await Ln(e,o,{clientModel:r,requestId:t})}async function Ln(e,t,n){i.level>=4&&i.debug(`[${n.requestId}] Translated OpenAI request payload:`,JSON.stringify(t));let r=h.models?.data.find(e=>e.id===t.model),a=r?Ht(t,r):t;a.messages.length!==t.messages.length&&i.info(`[${n.requestId}] Context management: ${t.messages.length} → ${a.messages.length} messages`),h.manualApprove&&await D();let o=await N(a);return Yn(o)?Bn(e,o,n):(i.debug(`[${n.requestId}] Streaming response from Copilot`),Hn(e,o,n))}async function Rn(e,t,n){h.manualApprove&&await D();let r=_n(t,n.model);if(t.stream)return f(e,async e=>{let t=Un(e);try{await yn(e,await(await K(r)).json(),n.clientModel)}catch(t){await e.writeSSE({event:`error`,data:JSON.stringify(Pn(t instanceof Error?t.message:void 0))})}finally{t()}});let i=await(await K(r)).json();return e.json(vn(i,n.clientModel))}function zn(e){return e?.supported_endpoints?e.supported_endpoints.includes(`/responses`)&&!e.supported_endpoints.includes(`/chat/completions`):!1}function Bn(e,t,n){i.level>=4&&i.debug(`[${n.requestId}] Non-streaming response from Copilot:`,JSON.stringify(t).slice(-400));try{let r=Pt(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(Vn(t,n.requestId),500)}}function Vn(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 Hn(e,t,n){return f(e,async e=>{let r={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}},i=Un(e);try{await Wn(e,{...n,response:t,streamState:r})}catch(t){await Kn(e,{error:t,requestId:n.requestId,streamState:r})}finally{i()}})}function Un(e){let t=setInterval(()=>{e.writeSSE({event:`ping`,data:JSON.stringify({type:`ping`})}).catch(()=>{})},15e3);return()=>clearInterval(t)}async function Wn(e,t){for await(let n of t.response){if(n.data===`[DONE]`)break;if(!n.data)continue;let r=Gn(n.data,t.requestId);if(r){t.streamState.messageStartSent||(r.model=t.clientModel);for(let n of Nn(r,t.streamState))await e.writeSSE({event:n.type,data:JSON.stringify(n)})}}}function Gn(e,t){try{return JSON.parse(e)}catch(e){return i.warn(`[${t}] Skipping unparseable Copilot chunk:`,e),null}}async function Kn(e,t){i.error(`[${t.requestId}] Streaming error:`,t.error);try{await qn(e,t.streamState),await Jn(e,t.streamState),await e.writeSSE({event:`error`,data:JSON.stringify(Pn(t.error instanceof Error?t.error.message:void 0))})}catch(e){i.error(`[${t.requestId}] Failed to emit stream cleanup events:`,e)}}async function qn(e,t){t.contentBlockOpen&&await e.writeSSE({event:`content_block_stop`,data:JSON.stringify({type:`content_block_stop`,index:t.contentBlockIndex})})}async function Jn(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 Yn=e=>Object.hasOwn(e,`choices`),Z=new d;Z.post(`/`,async t=>{try{return await In(t)}catch(n){return await e(t,n)}}),Z.post(`/count_tokens`,async t=>{try{return await Lt(t)}catch(n){return await e(t,n)}});const Q=new d;Q.get(`/`,async t=>{try{h.models||await S();let e=h.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)}});async function Xn(e){await O(h);let t=await e.req.json();return i.debug(`Responses API request:`,JSON.stringify(t).slice(-400)),h.manualApprove&&await D(),K(t)}const Zn=new d;Zn.post(`/`,async n=>{try{return await Xn(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 Qn=new d;Qn.get(`/`,e=>{try{return e.json({token:h.copilotToken})}catch(t){return i.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const $n=new d;$n.get(`/`,async e=>{try{let t=await T();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(Qe),$.get(`/`,e=>e.text(`Server running`)),$.use(Ue),$.route(`/chat/completions`,P),$.route(`/debug`,F),$.route(`/models`,Q),$.route(`/embeddings`,I),$.route(`/usage`,$n),$.route(`/token`,Qn),$.route(`/v1/chat/completions`,P),$.route(`/v1/models`,Q),$.route(`/v1/embeddings`,I),$.route(`/v1/responses`,Zn),$.route(`/v1/messages`,Z);async function er(e){e.proxyEnv&&Ge(),e.verbose&&(i.level=5,i.info(`Verbose logging enabled`)),h.accountType=e.accountType,e.accountType!==`individual`&&i.info(`Using ${e.accountType} plan GitHub account`),h.manualApprove=e.manual,h.rateLimitSeconds=e.rateLimit,h.rateLimitWait=e.rateLimitWait,h.showToken=e.showToken,h.localApiKeys=He(e.apiKey),h.localApiKeys.length>0&&i.info(`Local API-key auth enabled`),e.githubToken&&(h.githubToken=e.githubToken,i.info(`Using provided GitHub token`)),await m(),await Ee(),e.githubToken||await C(),await Ae(),await S(),i.info(`Available models: \n${h.models?.data.map(e=>`- ${e.id}`).join(`
`)}`);let t=`http://localhost:${e.port}`;if(e.claudeCode){ee(h.models,`Models should be loaded by now`);let e=await i.prompt(`Select a model to use with Claude Code`,{type:`select`,options:h.models.data.map(e=>e.id)}),n=await i.prompt(`Select a small model to use with Claude Code`,{type:`select`,options:h.models.data.map(e=>e.id)}),r=qe({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:Me,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 er({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":Ne,debug:Ve}}));export{};
`)||null;let t=[];for(let n of e)n.type===`text`?t.push({type:`input_text`,text:n.text}):n.type===`image`&&t.push(kn(n));return t.length>0?t:null}function kn(e){return{type:`input_image`,image_url:`data:${e.source.media_type};base64,${e.source.data}`}}function An(e){if(e){if(e.type===`auto`||e.type===`none`)return e.type;if(e.type===`any`)return`required`;if(e.name)return{type:`function`,name:e.name}}}function jn(e){return typeof e==`string`?e:JSON.stringify(e)}function Mn(e){return e.type===`function_call`&&e.name&&e.call_id?[{type:`tool_use`,id:e.call_id,name:e.name,input:Nn(e.arguments)}]:e.type!==`message`||!e.content?[]:e.content.flatMap(e=>e.type!==`output_text`||!e.text?[]:[{type:`text`,text:e.text}])}function Nn(e){if(!e)return{};try{let t=JSON.parse(e);if(t&&typeof t==`object`&&!Array.isArray(t))return t}catch{return{}}return{}}async function Pn(e,t,n){await e.writeSSE({event:`content_block_start`,data:JSON.stringify({type:`content_block_start`,index:t,content_block:{type:`text`,text:``}})}),await e.writeSSE({event:`content_block_delta`,data:JSON.stringify({type:`content_block_delta`,index:t,delta:{type:`text_delta`,text:n}})}),await e.writeSSE({event:`content_block_stop`,data:JSON.stringify({type:`content_block_stop`,index:t})})}async function Fn(e,t,n){await e.writeSSE({event:`content_block_start`,data:JSON.stringify({type:`content_block_start`,index:t,content_block:{type:`tool_use`,id:n.id,name:n.name,input:{}}})}),await e.writeSSE({event:`content_block_delta`,data:JSON.stringify({type:`content_block_delta`,index:t,delta:{type:`input_json_delta`,partial_json:JSON.stringify(n.input)}})}),await e.writeSSE({event:`content_block_stop`,data:JSON.stringify({type:`content_block_stop`,index:t})})}function In(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function Ln(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&&(In(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:L(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 Rn(e){return{type:`error`,error:{type:`api_error`,message:e??`An unexpected error occurred during streaming.`}}}function zn(){return`req_${crypto.randomUUID().replaceAll(`-`,``)}`}async function Bn(e){await O(h);let t=e.req.header(`x-client-request-id`)??zn();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 yt(n),o=R(a),s=h.models?.data.find(e=>e.id===o.model);return Un(s)?await Hn(e,a,{clientModel:r,model:o.model,requestId:t}):await Vn(e,o,{clientModel:r,requestId:t})}async function Vn(e,t,n){i.level>=4&&i.debug(`[${n.requestId}] Translated OpenAI request payload:`,JSON.stringify(t));let r=h.models?.data.find(e=>e.id===t.model),a=r?Ht(t,r):t;a.messages.length!==t.messages.length&&i.info(`[${n.requestId}] Context management: ${t.messages.length} → ${a.messages.length} messages`),h.manualApprove&&await D();let o=await N(a);return $n(o)?Wn(e,o,n):(i.debug(`[${n.requestId}] Streaming response from Copilot`),Kn(e,o,n))}async function Hn(e,t,n){h.manualApprove&&await D();let r=xn(t,n.model);if(t.stream)return f(e,async e=>{let t=qn(e);try{await Cn(e,await(await q(r)).json(),n.clientModel)}catch(t){await e.writeSSE({event:`error`,data:JSON.stringify(Rn(t instanceof Error?t.message:void 0))})}finally{t()}});let i=await(await q(r)).json();return e.json(Sn(i,n.clientModel))}function Un(e){return e?.supported_endpoints?e.supported_endpoints.includes(`/responses`)&&!e.supported_endpoints.includes(`/chat/completions`):!1}function Wn(e,t,n){i.level>=4&&i.debug(`[${n.requestId}] Non-streaming response from Copilot:`,JSON.stringify(t).slice(-400));try{let r=Pt(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(Gn(t,n.requestId),500)}}function Gn(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 Kn(e,t,n){return f(e,async e=>{let r={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}},i=qn(e);try{await Jn(e,{...n,response:t,streamState:r})}catch(t){await Xn(e,{error:t,requestId:n.requestId,streamState:r})}finally{i()}})}function qn(e){let t=setInterval(()=>{e.writeSSE({event:`ping`,data:JSON.stringify({type:`ping`})}).catch(()=>{})},15e3);return()=>clearInterval(t)}async function Jn(e,t){for await(let n of t.response){if(n.data===`[DONE]`)break;if(!n.data)continue;let r=Yn(n.data,t.requestId);if(r){t.streamState.messageStartSent||(r.model=t.clientModel);for(let n of Ln(r,t.streamState))await e.writeSSE({event:n.type,data:JSON.stringify(n)})}}}function Yn(e,t){try{return JSON.parse(e)}catch(e){return i.warn(`[${t}] Skipping unparseable Copilot chunk:`,e),null}}async function Xn(e,t){i.error(`[${t.requestId}] Streaming error:`,t.error);try{await Zn(e,t.streamState),await Qn(e,t.streamState),await e.writeSSE({event:`error`,data:JSON.stringify(Rn(t.error instanceof Error?t.error.message:void 0))})}catch(e){i.error(`[${t.requestId}] Failed to emit stream cleanup events:`,e)}}async function Zn(e,t){t.contentBlockOpen&&await e.writeSSE({event:`content_block_stop`,data:JSON.stringify({type:`content_block_stop`,index:t.contentBlockIndex})})}async function Qn(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 $n=e=>Object.hasOwn(e,`choices`),Z=new d;Z.post(`/`,async t=>{try{return await Bn(t)}catch(n){return await e(t,n)}}),Z.post(`/count_tokens`,async t=>{try{return await Lt(t)}catch(n){return await e(t,n)}});const Q=new d;Q.get(`/`,async t=>{try{h.models||await Te();let e=h.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)}});async function er(e){await O(h);let t=await e.req.json();return i.debug(`Responses API request:`,JSON.stringify(t).slice(-400)),h.manualApprove&&await D(),q(t)}const tr=new d;tr.post(`/`,async n=>{try{return await er(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 nr=new d;nr.get(`/`,e=>{try{return e.json({token:h.copilotToken})}catch(t){return i.error(`Error fetching token:`,t),e.json({error:`Failed to fetch token`,token:null},500)}});const rr=new d;rr.get(`/`,async e=>{try{let t=await T();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(Qe),$.get(`/`,e=>e.text(`Server running`)),$.use(Ue),$.route(`/chat/completions`,P),$.route(`/debug`,F),$.route(`/models`,Q),$.route(`/embeddings`,I),$.route(`/usage`,rr),$.route(`/token`,nr),$.route(`/v1/chat/completions`,P),$.route(`/v1/models`,Q),$.route(`/v1/embeddings`,I),$.route(`/v1/responses`,tr),$.route(`/v1/messages`,Z);async function ir(e){e.proxyEnv&&Ge(),e.verbose&&(i.level=5,i.info(`Verbose logging enabled`)),h.accountType=e.accountType,e.accountType!==`individual`&&i.info(`Using ${e.accountType} plan GitHub account`),h.manualApprove=e.manual,h.rateLimitSeconds=e.rateLimit,h.rateLimitWait=e.rateLimitWait,h.showToken=e.showToken,h.localApiKeys=He(e.apiKey),h.localApiKeys.length>0&&i.info(`Local API-key auth enabled`),e.githubToken&&(h.githubToken=e.githubToken,i.info(`Using provided GitHub token`)),await m(),await Ee(),e.githubToken||await C(),await Ae(),await Te(),i.info(`Available models: \n${h.models?.data.map(e=>`- ${e.id}`).join(`
`)}`);let t=`http://localhost:${e.port}`;if(e.claudeCode){ee(h.models,`Models should be loaded by now`);let e=await i.prompt(`Select a model to use with Claude Code`,{type:`select`,options:h.models.data.map(e=>e.id)}),n=await i.prompt(`Select a small model to use with Claude Code`,{type:`select`,options:h.models.data.map(e=>e.id)}),r=qe({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:Me,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 ir({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":Ne,debug:Ve}}));export{};
//# sourceMappingURL=main.mjs.map
{
"name": "copilot-proxy-api",
"version": "0.10.12",
"version": "0.10.13",
"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