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.16
to
0.10.19
+12
-12
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(` `),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()},Se=`1.114.0`;async function S(){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]:Se}catch{return Se}finally{clearTimeout(t)}}await S();const C=e=>new Promise(t=>{setTimeout(t,e)}),Ce=e=>e==null;async function we(){g.models=await xe()}const Te=async()=>{let e=await S();g.vsCodeVersion=e,i.info(`Using VSCode version: ${e}`)};async function Ee(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 C(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 C(t)}}const De=()=>a.readFile(m.GITHUB_TOKEN_PATH,`utf8`),Oe=e=>a.writeFile(m.GITHUB_TOKEN_PATH,e),ke=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 w(e){try{let t=await De();if(t&&!e?.force){g.githubToken=t,g.showToken&&i.info(`GitHub token:`,t),await T();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 Ee(n);await Oe(r),g.githubToken=r,g.showToken&&i.info(`GitHub token:`,r),await T()}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 T(){let e=await be();i.info(`Logged in as ${e.login}`)}async function Ae(e){e.verbose&&(i.level=5,i.info(`Verbose logging enabled`)),g.showToken=e.showToken,await h(),await w({force:!0}),i.success(`GitHub token written to`,m.GITHUB_TOKEN_PATH)}const je=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 Ae({verbose:e.verbose,showToken:e[`show-token`]})}}),E=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 w();try{let e=await E(),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 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

@@ -11,23 +11,23 @@ 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 C(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},lt=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 M(e,t){let{attempts:n=3,retryDelayMs:r=250,...a}=t,o=typeof a.body==`string`?a.body.length:0,s=ut(e,a.method),c;for(let t=1;t<=n;t++){try{let r=await fetch(e,a);if(!ft(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 (${dt(e)}); retrying (${t}/${n})`)}await C(r*t)}throw c instanceof Error?c:Error(`Copilot request failed`)}function ut(e,t){let n=t?.toUpperCase()??`GET`;try{return`${n} ${new URL(e).pathname}`}catch{return`${n} ${e}`}}function dt(e){return e instanceof Error&&e.message?e.message:`unknown error`}function ft(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 pt(e,t){return N(e,t)??2e5}function N(e,t){return t?.max_prompt_tokens?t.max_prompt_tokens:mt(e)?936e3:t?.max_context_window_tokens}function mt(e){return/(?:^|[-_.])1m(?:$|[-_.])/i.test(e)}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 M(`${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=pt(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?ce(s):await s.json()};async function ht(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 lt(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(),Ce(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 gt(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 gt=e=>Object.hasOwn(e,`choices`),F=new f;F.post(`/`,async t=>{try{return await ht(t)}catch(n){return await e(t,n)}});const I=new f;I.get(`/requests`,e=>e.json({object:`list`,data:Xe()}));const _t=async e=>{if(!g.copilotToken)throw Error(`Copilot token not found`);let n=await M(`${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 _t(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:Ct(e.model),messages:wt(e.messages,e.system),max_tokens:e.max_tokens,stop:e.stop_sequences,stream:e.stream,temperature:e.temperature,top_p:e.top_p,user:e.metadata?.user_id,tools:At(e.tools),tool_choice:Mt(e.tool_choice),thinking:jt(e.thinking)}}async function vt(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 yt(t)):e.push(t);t.push({role:`user`,content:e})}return{...e,messages:t}}async function yt(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 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){let t=yt(Et(e.messages,e.system));return{model:Tt(e.model),messages:t,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:Mt(e.tools),tool_choice:Pt(e.tool_choice),thinking:Nt(e.thinking)}}function yt(e){let t=e.length;for(;t>0&&e[t-1].role===`assistant`;)t--;return t===e.length?e:(i.warn(`Stripped ${e.length-t} trailing assistant prefill message(s) unsupported by Copilot chat completions`),e.slice(0,t))}async function bt(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 xt(t)):e.push(t);t.push({role:`user`,content:e})}return{...e,messages:t}}async function xt(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(`
`)+`
`:``}const V={haiku:`claude-haiku-4.5`,sonnet:`claude-sonnet-4`,opus:`claude-opus-4.6-1m`},bt=[`opus`,`sonnet`,`haiku`];function H(e){let t=e.toLowerCase();for(let e of bt)if(t.includes(e))return e;return null}function xt(e){let t=/(\d+)\.(\d+)/.exec(e);return t?[Number(t[1]),Number(t[2])]:[0,0]}function St(e){let t=g.models?.data.filter(t=>t.id.toLowerCase().includes(e))??[];if(t.length===0)return null;let n=t[0],r=xt(n.id),i=n.id.includes(`-1m`);for(let e of t.slice(1)){let t=xt(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 Ct(e){let t=H(e);if(t){let e=process.env[`COPILOT_OVERRIDE_${t.toUpperCase()}`];if(e)return e}if(g.models?.data.some(t=>t.id===e))return e;let n=H(e);if(n){let e=St(n);if(e)return e}return V[e]?V[e]:e}function wt(e,t){let n=Dt(t),r=e.flatMap(e=>e.role===`user`?Ot(e):kt(e));return[...n,...r]}const Tt=[/x-anthropic-billing-header/gi,/anthropic-billing-header/gi,/x-anthropic-/gi];function Et(e){let t=e;for(let e of Tt)t=t.replaceAll(e,``);return t}function Dt(e){return e?typeof e==`string`?[{role:`system`,content:Et(e)}]:[{role:`system`,content:Et(e.map(e=>e.text).join(`
`:``}const B={haiku:`claude-haiku-4.5`,sonnet:`claude-sonnet-4`,opus:`claude-opus-4.6-1m`},St=[`opus`,`sonnet`,`haiku`];function Ct(e){let t=e.toLowerCase();for(let e of St)if(t.includes(e))return e;return null}function V(e){let t=/(\d+)\.(\d+)/.exec(e);return t?[Number(t[1]),Number(t[2])]:[0,0]}function wt(e){let t=h.models?.data.filter(t=>t.id.toLowerCase().includes(e))??[];if(t.length===0)return null;let n=t[0],r=V(n.id),i=n.id.includes(`-1m`);for(let e of t.slice(1)){let t=V(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 Tt(e){if(h.models?.data.some(t=>t.id===e))return e;let t=Ct(e);if(t){let e=wt(t);if(e)return e}return B[e]?B[e]:e}function Et(e,t){let n=kt(t),r=e.flatMap(e=>e.role===`user`?At(e):jt(e));return[...n,...r]}const Dt=[/x-anthropic-billing-header/gi,/anthropic-billing-header/gi,/x-anthropic-/gi];function Ot(e){let t=e;for(let e of Dt)t=t.replaceAll(e,``);return t}function kt(e){return e?typeof e==`string`?[{role:`system`,content:Ot(e)}]:[{role:`system`,content:Ot(e.map(e=>e.text).join(`
`))}]:[]}function Ot(e){let t=[];if(Array.isArray(e.content)){let n=e.content.filter(e=>e.type===`tool_result`),r=e.content.filter(e=>e.type!==`tool_result`);for(let e of n)t.push({role:`tool`,tool_call_id:e.tool_use_id,content:U(e.content)});r.length>0&&t.push({role:`user`,content:U(r)})}else t.push({role:`user`,content:U(e.content)});return t}function kt(e){if(!Array.isArray(e.content))return[{role:`assistant`,content:U(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 At(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:H(e.content)});r.length>0&&t.push({role:`user`,content:H(r)})}else t.push({role:`user`,content:H(e.content)});return t}function jt(e){if(!Array.isArray(e.content))return[{role:`assistant`,content:H(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:U(e.content)}]}function U(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(`
`);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:H(e.content)}]}function H(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 At(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function jt(e){if(e)return{type:`enabled`}}function Mt(e){if(e)switch(e.type){case`auto`:return`auto`;case`any`:return`required`;case`tool`:return e.name?{type:`function`,function:{name:e.name}}:void 0;case`none`:return`none`;default:return}}function Nt(e,t){let n=[],r=[],i=null;i=e.choices[0]?.finish_reason??i;for(let t of e.choices){let e=Pt(t.message.content),a=Ft(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 Pt(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 Ft(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 It(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 lt(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 Lt=5e6,Rt=1e5,zt=`[image removed to save context]`;function Bt(e){let t=N(e.id,e.capabilities.limits);if(!t)return Lt;let n=Math.floor((t-8e3)*3.5);return Math.min(Lt,n)}function Vt(e,t){let n=G(e),r=Bt(t);if(n<=r)return e;i.info(`Context fit: payload ${W(n)} exceeds ${W(r)} ceiling — reducing`);let a=Ht(e),o=G(a);return o<=r?(i.info(`Context fit: ${W(n)} → ${W(o)} after tool pruning`),a):(a=Ut(a),o=G(a),o<=r?(i.info(`Context fit: ${W(n)} → ${W(o)} after stripping old images`),a):(a=Wt(a),o=G(a),o<=r?(i.warn(`Context fit: ${W(n)} → ${W(o)} after stripping ALL images`),a):(a=Gt(a),o=G(a),o<=r?(i.warn(`Context fit: ${W(n)} → ${W(o)} after truncating oversized tool outputs`),a):(a=Kt(a,r),o=G(a),i.warn(`Context fit: ${W(n)} → ${W(o)} after dropping old messages`),a))))}function W(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(2)}MB`}function G(e){let t=200;for(let n of e.messages)t+=K(n);if(e.tools)for(let n of e.tools)t+=JSON.stringify(n).length+20;return t}function K(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 Ht(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=K(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 Ut(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:zt}):e);r>o&&(n[e]={...i,content:s})}return r>0&&i.info(`Stripped ${r} base64 images (~${a} bytes reclaimed)`),{...e,messages:n}}function Wt(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:zt}):e);return t>r?{...e,content:i}:e});return t>0&&i.warn(`Stripped ${t} ALL images (~${n} bytes reclaimed)`),{...e,messages:r}}function Gt(e){let t=0,n=0,r=e.messages.map(e=>{if(e.role!==`tool`||typeof e.content!=`string`||e.content.length<=Rt)return e;let r=e.content.length,i=e.content.slice(0,Rt)+`
`);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 Mt(e){if(e)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}function Nt(e){if(e)return{type:`enabled`}}function Pt(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 Ft(e,t){let n=[],r=[],i=null;i=e.choices[0]?.finish_reason??i;for(let t of e.choices){let e=It(t.message.content),a=Lt(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:L(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 It(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 Lt(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 Rt(e){try{let t=e.req.header(`anthropic-beta`),n=await e.req.json(),r=R(n),a=h.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 ut(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 zt=5e6,Bt=1e5,Vt=`[image removed to save context]`;function Ht(e){let t=M(e.id,e.capabilities.limits);if(!t)return zt;let n=Math.floor((t-8e3)*3.5);return Math.min(zt,n)}function Ut(e,t){let n=W(e),r=Ht(t);if(n<=r)return e;i.info(`Context fit: payload ${U(n)} exceeds ${U(r)} ceiling — reducing`);let a=Wt(e),o=W(a);return o<=r?(i.info(`Context fit: ${U(n)} → ${U(o)} after tool pruning`),a):(a=Gt(a),o=W(a),o<=r?(i.info(`Context fit: ${U(n)} → ${U(o)} after stripping old images`),a):(a=Kt(a),o=W(a),o<=r?(i.warn(`Context fit: ${U(n)} → ${U(o)} after stripping ALL images`),a):(a=qt(a),o=W(a),o<=r?(i.warn(`Context fit: ${U(n)} → ${U(o)} after truncating oversized tool outputs`),a):(a=Jt(a,r),o=W(a),i.warn(`Context fit: ${U(n)} → ${U(o)} after dropping old messages`),a))))}function U(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(2)}MB`}function W(e){let t=200;for(let n of e.messages)t+=G(n);if(e.tools)for(let n of e.tools)t+=JSON.stringify(n).length+20;return t}function G(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 Wt(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=G(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 Gt(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:Vt}):e);r>o&&(n[e]={...i,content:s})}return r>0&&i.info(`Stripped ${r} base64 images (~${a} bytes reclaimed)`),{...e,messages:n}}function Kt(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:Vt}):e);return t>r?{...e,content:i}:e});return t>0&&i.warn(`Stripped ${t} ALL images (~${n} bytes reclaimed)`),{...e,messages:r}}function qt(e){let t=0,n=0,r=e.messages.map(e=>{if(e.role!==`tool`||typeof e.content!=`string`||e.content.length<=Bt)return e;let r=e.content.length,i=e.content.slice(0,Bt)+`
[…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 Kt(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+=K(e);if(e.tools)for(let t of e.tools)a+=JSON.stringify(t).length+20;let o=r.map(e=>K(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 qt=5e6,Jt=`[older response input omitted to stay under context limit]`,Yt=`[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 Jt(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 Yt=5e6,Xt=`[older response input omitted to stay under context limit]`,Zt=`[older response input truncated to stay under context limit]
`,Xt=new Set([`call_id`,`id`,`model`,`name`,`previous_response_id`,`role`,`status`,`tool_call_id`,`type`]);async function q(e){if(!g.copilotToken)throw Error(`Copilot token not found`);let n=Zt(hn(e),Qt(e.model)),r=JSON.stringify(n),a={...b(g,xn(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 M(`${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`),mn(o,n,r.length)){let n=Math.ceil(r.length/4),a=g.models?.data.find(t=>t.id===e.model)?.capabilities.limits,o=pt(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=g.models?.data.find(t=>t.id===e)?.capabilities.limits,n=N(e,t);if(!n)return qt;let r=Math.floor((n-8e3)*3.5);return Math.min(qt,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){if(typeof e==`string`)return e;let t=e.map(e=>vn(e));return t.some((t,n)=>t!==e[n])?t:e}function vn(e){return yn(e)?{type:`input_text`,text:`[image output removed because its URL is not valid for Copilot Responses]`}:typeof e.image_url==`string`&&e.type!==`input_image`?{type:`input_image`,image_url:e.image_url,detail:e.detail}:e.type===`output_text`?{type:`input_text`,text:e.text??``}:e}function yn(e){return!(`image_url`in e)||e.image_url===null||e.image_url===void 0?!1:typeof e.image_url!=`string`||!bn(e.image_url)}function bn(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function xn(e){return typeof e.input==`string`?!1:e.input.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`input_image`))}function Sn(e,t){return{model:t,input:e.messages.flatMap(e=>En(e)),instructions:Tn(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:jn(e.tool_choice)}}function Cn(e,t){let n=e.output.flatMap(e=>Nn(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 wn(e,t,n){let r=Cn(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 Fn(e,t,n.text):n.type===`tool_use`&&await In(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 Tn(e){if(e)return typeof e==`string`?e:e.map(e=>e.text).join(`
`,Qt=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=$t(gn(e),en(e.model)),r=JSON.stringify(n),a={...v(h,Sn(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`),hn(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 $t(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=tn(e),s=0;for(let e of o)if(r=nn(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=rn(r,t);return r=an(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=ln(r,t),a=JSON.stringify(r).length,i.warn(`Responses context fit: truncated input content (${n.length} -> ${a} bytes)`),a<=t)||(r=fn(r,t),a=JSON.stringify(r).length,i.warn(`Responses context fit: minimized input history (${n.length} -> ${a} bytes)`),a<=t)?r:(r=pn(r,t),a=JSON.stringify(r).length,i.warn(`Responses context fit: truncated payload strings (${n.length} -> ${a} bytes)`),r)}function en(e){let t=h.models?.data.find(t=>t.id===e)?.capabilities.limits,n=M(e,t);if(!n)return Yt;let r=Math.floor((n-8e3)*3.5);return Math.min(Yt,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:Zt+e.input.slice(-i)}}function tn(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 nn(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 rn(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]=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:Xt}}function an(e){if(typeof e.input==`string`)return e;let t=new Set(e.input.filter(e=>on(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++,J(e)));return n===0?e:(i.warn(`Responses context fit: dropped ${n} orphaned tool call outputs`),{...e,input:r})}function on(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 ln(e,t){if(typeof e.input==`string`)return q(e,t);let n=e,r=JSON.stringify(n).length;for(;r>t;){let e=un(n);if(!e)return n;n=dn(n,e,r-t);let i=JSON.stringify(n).length;if(i>=r)return n;r=i}return n}function un(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 dn(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`&&Qt.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(!mn(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`?Zt+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 mn(e)&&typeof r==`string`?{...e,[r]:X(e[r],i,n)}:e}function fn(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:Xt}]}}function pn(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 mn(e){return typeof e==`object`&&!!e}function hn(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 gn(e){let t=_n(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 _n(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=vn(r.output);i!==r.output&&(t??=[...e.input],t[n]={...r,output:i})}return t?{...e,input:t}:e}function vn(e){if(typeof e==`string`)return e;let t=e.map(e=>yn(e));return t.some((t,n)=>t!==e[n])?t:e}function yn(e){return bn(e)?{type:`input_text`,text:`[image output removed because its URL is not valid for Copilot Responses]`}:typeof e.image_url==`string`&&e.type!==`input_image`?{type:`input_image`,image_url:e.image_url,detail:e.detail}:e.type===`output_text`?{type:`input_text`,text:e.text??``}:e}function bn(e){return!(`image_url`in e)||e.image_url===null||e.image_url===void 0?!1:typeof e.image_url!=`string`||!xn(e.image_url)}function xn(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function Sn(e){return typeof e.input==`string`?!1:e.input.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type===`input_image`))}function Cn(e,t){return{model:t,input:e.messages.flatMap(e=>Dn(e)),instructions:En(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:Mn(e.tool_choice)}}function wn(e,t){let n=e.output.flatMap(e=>Pn(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 Tn(e,t,n){let r=wn(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 In(e,t,n.text):n.type===`tool_use`&&await Ln(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 En(e){if(e)return typeof e==`string`?e:e.map(e=>e.text).join(`
`)}function En(e){return e.role===`user`?Dn(e.content):On(e.content)}function Dn(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:Mn(r.content)}):n.push(r);let r=kn(n);return r&&t.push({role:`user`,content:r}),t}function On(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 Dn(e){return e.role===`user`?On(e.content):kn(e.content)}function On(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:Nn(r.content)}):n.push(r);let r=An(n);return r&&t.push({role:`user`,content:r}),t}function kn(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 kn(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 An(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(An(n));return t.length>0?t:null}function An(e){return{type:`input_image`,image_url:`data:${e.source.media_type};base64,${e.source.data}`}}function jn(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 Mn(e){return typeof e==`string`?e:JSON.stringify(e)}function Nn(e){return e.type===`function_call`&&e.name&&e.call_id?[{type:`tool_use`,id:e.call_id,name:e.name,input:Pn(e.arguments)}]:e.type!==`message`||!e.content?[]:e.content.flatMap(e=>e.type!==`output_text`||!e.text?[]:[{type:`text`,text:e.text}])}function Pn(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 Fn(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 In(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 Ln(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function Rn(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&&(Ln(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 zn(e){return{type:`error`,error:{type:`api_error`,message:e??`An unexpected error occurred during streaming.`}}}function Bn(){return`req_${crypto.randomUUID().replaceAll(`-`,``)}`}async function Vn(e){await k(g);let t=e.req.header(`x-client-request-id`)??Bn();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 vt(n),o=z(a),s=g.models?.data.find(e=>e.id===o.model);return Wn(s)?await Un(e,a,{clientModel:r,model:o.model,requestId:t}):await Hn(e,o,{clientModel:r,requestId:t})}async function Hn(e,t,n){i.level>=4&&i.debug(`[${n.requestId}] Translated OpenAI request payload:`,JSON.stringify(t));let r=g.models?.data.find(e=>e.id===t.model),a=r?Vt(t,r):t;a.messages.length!==t.messages.length&&i.info(`[${n.requestId}] Context management: ${t.messages.length} → ${a.messages.length} messages`),g.manualApprove&&await O();let o=await P(a);return er(o)?Gn(e,o,n):(i.debug(`[${n.requestId}] Streaming response from Copilot`),qn(e,o,n))}async function Un(e,t,n){g.manualApprove&&await O();let r=Sn(t,n.model);if(t.stream)return p(e,async e=>{let t=Jn(e);try{await wn(e,await(await q(r)).json(),n.clientModel)}catch(t){await e.writeSSE({event:`error`,data:JSON.stringify(zn(t instanceof Error?t.message:void 0))})}finally{t()}});let i=await(await q(r)).json();return e.json(Cn(i,n.clientModel))}function Wn(e){return e?.supported_endpoints?e.supported_endpoints.includes(`/responses`)&&!e.supported_endpoints.includes(`/chat/completions`):!1}function Gn(e,t,n){i.level>=4&&i.debug(`[${n.requestId}] Non-streaming response from Copilot:`,JSON.stringify(t).slice(-400));try{let r=Nt(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(Kn(t,n.requestId),500)}}function Kn(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 qn(e,t,n){return p(e,async e=>{let r={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}},i=Jn(e);try{await Yn(e,{...n,response:t,streamState:r})}catch(t){await Zn(e,{error:t,requestId:n.requestId,streamState:r})}finally{i()}})}function Jn(e){let t=setInterval(()=>{e.writeSSE({event:`ping`,data:JSON.stringify({type:`ping`})}).catch(()=>{})},15e3);return()=>clearInterval(t)}async function Yn(e,t){for await(let n of t.response){if(n.data===`[DONE]`)break;if(!n.data)continue;let r=Xn(n.data,t.requestId);if(r){t.streamState.messageStartSent||(r.model=t.clientModel);for(let n of Rn(r,t.streamState))await e.writeSSE({event:n.type,data:JSON.stringify(n)})}}}function Xn(e,t){try{return JSON.parse(e)}catch(e){return i.warn(`[${t}] Skipping unparseable Copilot chunk:`,e),null}}async function Zn(e,t){i.error(`[${t.requestId}] Streaming error:`,t.error);try{await Qn(e,t.streamState),await $n(e,t.streamState),await e.writeSSE({event:`error`,data:JSON.stringify(zn(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 $n(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 er=e=>Object.hasOwn(e,`choices`),Z=new f;Z.post(`/`,async t=>{try{return await Vn(t)}catch(n){return await e(t,n)}}),Z.post(`/count_tokens`,async t=>{try{return await It(t)}catch(n){return await e(t,n)}});const Q=new f;Q.get(`/`,async t=>{try{g.models||await we();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)}});async function tr(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(),q(t)}const nr=new f;nr.post(`/`,async n=>{try{return await tr(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 rr=new f;rr.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 ir=new f;ir.get(`/`,async e=>{try{let t=await E();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`,Q),$.route(`/embeddings`,L),$.route(`/usage`,ir),$.route(`/token`,rr),$.route(`/v1/chat/completions`,F),$.route(`/v1/models`,Q),$.route(`/v1/embeddings`,L),$.route(`/v1/responses`,nr),$.route(`/v1/messages`,Z);async function ar(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 Te(),e.githubToken||await w(),await ke(),await we(),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:je,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 ar({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{};
`)||null;let t=[];for(let n of e)n.type===`text`?t.push({type:`input_text`,text:n.text}):n.type===`image`&&t.push(jn(n));return t.length>0?t:null}function jn(e){return{type:`input_image`,image_url:`data:${e.source.media_type};base64,${e.source.data}`}}function Mn(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 Nn(e){return typeof e==`string`?e:JSON.stringify(e)}function Pn(e){return e.type===`function_call`&&e.name&&e.call_id?[{type:`tool_use`,id:e.call_id,name:e.name,input:Fn(e.arguments)}]:e.type!==`message`||!e.content?[]:e.content.flatMap(e=>e.type!==`output_text`||!e.text?[]:[{type:`text`,text:e.text}])}function Fn(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 In(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 Ln(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 Rn(e){return e.contentBlockOpen?Object.values(e.toolCalls).some(t=>t.anthropicBlockIndex===e.contentBlockIndex):!1}function zn(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&&(Rn(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 Bn(e){return{type:`error`,error:{type:`api_error`,message:e??`An unexpected error occurred during streaming.`}}}function Vn(){return`req_${crypto.randomUUID().replaceAll(`-`,``)}`}async function Hn(e){await O(h);let t=e.req.header(`x-client-request-id`)??Vn();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 bt(n),o=R(a),s=h.models?.data.find(e=>e.id===o.model);return Gn(s)?await Wn(e,a,{clientModel:r,model:o.model,requestId:t}):await Un(e,o,{clientModel:r,requestId:t})}async function Un(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?Ut(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 tr(o)?Kn(e,o,n):(i.debug(`[${n.requestId}] Streaming response from Copilot`),Jn(e,o,n))}async function Wn(e,t,n){h.manualApprove&&await D();let r=Cn(t,n.model);if(t.stream)return f(e,async e=>{let t=Yn(e);try{await Tn(e,await(await K(r)).json(),n.clientModel)}catch(t){await e.writeSSE({event:`error`,data:JSON.stringify(Bn(t instanceof Error?t.message:void 0))})}finally{t()}});let i=await(await K(r)).json();return e.json(wn(i,n.clientModel))}function Gn(e){return e?.supported_endpoints?e.supported_endpoints.includes(`/responses`)&&!e.supported_endpoints.includes(`/chat/completions`):!1}function Kn(e,t,n){i.level>=4&&i.debug(`[${n.requestId}] Non-streaming response from Copilot:`,JSON.stringify(t).slice(-400));try{let r=Ft(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(qn(t,n.requestId),500)}}function qn(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 Jn(e,t,n){return f(e,async e=>{let r={messageStartSent:!1,contentBlockIndex:0,contentBlockOpen:!1,toolCalls:{}},i=Yn(e);try{await Xn(e,{...n,response:t,streamState:r})}catch(t){await Qn(e,{error:t,requestId:n.requestId,streamState:r})}finally{i()}})}function Yn(e){let t=setInterval(()=>{e.writeSSE({event:`ping`,data:JSON.stringify({type:`ping`})}).catch(()=>{})},15e3);return()=>clearInterval(t)}async function Xn(e,t){for await(let n of t.response){if(n.data===`[DONE]`)break;if(!n.data)continue;let r=Zn(n.data,t.requestId);if(r){t.streamState.messageStartSent||(r.model=t.clientModel);for(let n of zn(r,t.streamState))await e.writeSSE({event:n.type,data:JSON.stringify(n)})}}}function Zn(e,t){try{return JSON.parse(e)}catch(e){return i.warn(`[${t}] Skipping unparseable Copilot chunk:`,e),null}}async function Qn(e,t){i.error(`[${t.requestId}] Streaming error:`,t.error);try{await $n(e,t.streamState),await er(e,t.streamState),await e.writeSSE({event:`error`,data:JSON.stringify(Bn(t.error instanceof Error?t.error.message:void 0))})}catch(e){i.error(`[${t.requestId}] Failed to emit stream cleanup events:`,e)}}async function $n(e,t){t.contentBlockOpen&&await e.writeSSE({event:`content_block_stop`,data:JSON.stringify({type:`content_block_stop`,index:t.contentBlockIndex})})}async function er(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 tr=e=>Object.hasOwn(e,`choices`),Z=new d;Z.post(`/`,async t=>{try{return await Hn(t)}catch(n){return await e(t,n)}}),Z.post(`/count_tokens`,async t=>{try{return await Rt(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 nr(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 rr=new d;rr.post(`/`,async n=>{try{return await nr(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 ir=new d;ir.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 ar=new d;ar.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`,ar),$.route(`/token`,ir),$.route(`/v1/chat/completions`,P),$.route(`/v1/models`,Q),$.route(`/v1/embeddings`,I),$.route(`/v1/responses`,rr),$.route(`/v1/messages`,Z);async function or(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 or({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.16",
"version": "0.10.19",
"description": "Turn GitHub Copilot into OpenAI/Anthropic API compatible server. Usable with Claude Code and Codex CLI!",

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

@@ -1,2 +0,2 @@

# Copilot API Proxy
# Copilot API Proxy for Claude Code and Codex

@@ -355,37 +355,4 @@ > [!WARNING]

> **Note:** The recommended model is `claude-opus-4.6-1m` which supports 1M context window. If your tool doesn't support specifying `claude-opus-4.6-1m`, you can use `claude-opus-4.6` instead - the proxy will automatically map it to the correct model.
### Server-side Claude model overrides
Claude Code's model picker only knows Anthropic model names. If you want to force a Claude family to a specific Copilot model id, set one of these environment variables when you start the proxy:
| Environment variable | Applies to incoming model names containing | Example target |
| ------------------------- | ------------------------------------------ | ------------------------------ |
| `COPILOT_OVERRIDE_OPUS` | `opus` | `claude-opus-4.7-xhigh` |
| `COPILOT_OVERRIDE_SONNET` | `sonnet` | `claude-sonnet-4.6` |
| `COPILOT_OVERRIDE_HAIKU` | `haiku` | `claude-sonnet-4.6` |
macOS/Linux, one command:
```sh
COPILOT_OVERRIDE_OPUS=claude-opus-4.7-xhigh COPILOT_OVERRIDE_HAIKU=claude-sonnet-4.6 bun run start
```
macOS/Linux, current shell session:
```sh
export COPILOT_OVERRIDE_OPUS=claude-opus-4.7-xhigh
export COPILOT_OVERRIDE_HAIKU=claude-sonnet-4.6
bun run start
```
PowerShell:
```powershell
$env:COPILOT_OVERRIDE_OPUS = "claude-opus-4.7-xhigh"
$env:COPILOT_OVERRIDE_HAIKU = "claude-sonnet-4.6"
bun run start
```
Unset values disable the override and restore normal model mapping. The override is read by the proxy process at request time, so restart the proxy if you changed how it is launched.
You can find more options here: [Claude Code settings](https://docs.anthropic.com/en/docs/claude-code/settings#environment-variables)

@@ -392,0 +359,0 @@

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