@rajbos/ai-engineering-fluency 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +1 -1
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -56,7 +56,7 @@ Expecting one of '${s.join("', '")}'`);let o=`${e}Help`;return this.on(o,n=>{let
56
56
  `):"",m="",h=0,g=0,C=null,w=[],v=[],y=new Set;for(let T of n){let S=T.message;!C&&S?.model&&(C=S.model);let P=T.requestId,A=!P||!y.has(P);P&&y.add(P);let U=S?.usage;U&&A&&(h+=(U.input_tokens||0)+(U.cache_creation_input_tokens||0)+(U.cache_read_input_tokens||0),g+=U.output_tokens||0);let O=Array.isArray(S?.content)?S.content:[];for(let $ of O)if($.type==="text")m+=$.text||"";else if($.type==="tool_use"){let q=$.name||"unknown";this.isMcpToolFn(q)?v.push({server:this.extractMcpServerNameFn(q),tool:q}):w.push({toolName:q,arguments:$.input?JSON.stringify($.input):void 0})}}let b=C||"claude-sonnet-4-6",_=h>0||g>0?{promptTokens:h,completionTokens:g}:void 0;t.push({turnNumber:t.length+1,timestamp:o.timestamp?new Date(o.timestamp).toISOString():null,mode:"agent",userMessage:p,assistantResponse:m,model:b,toolCalls:w,contextReferences:be(),mcpTools:v,inputTokensEstimate:h||this.estimateTokensFn(p,b),outputTokensEstimate:g||this.estimateTokensFn(m,b),thinkingTokensEstimate:0,actualUsage:_})},u=c=>{let p=c.message?.content;if(typeof p=="string")return!!p.trim();if(!Array.isArray(p))return!1;let m=p.some(g=>g.type==="text"),h=p.some(g=>g.type==="tool_result");return m&&!h};for(let c of s)c.type==="user"&&!c.isSidechain&&c.message?.role==="user"&&u(c)?(a(),o=c,n.length=0):c.type==="assistant"&&c.message?.stop_reason&&c.message?.role==="assistant"&&n.push(c);return a(),{turns:t}}async analyzeUsage(e,t){let s=we(),o=await Yo(e),n=[];for(let c of o)if(c.type==="user"&&c.message?.role==="user"&&!c.isSidechain){s.modeUsage.ask++;let p=vi(c.message?.content);if(p){let m=`__slash__${p}`;s.toolCalls.byTool[m]=(s.toolCalls.byTool[m]||0)+1}}else if(c.type==="assistant"){let p=Kt(c.message?.model||"unknown");n.push(p);let m=Array.isArray(c.message?.content)?c.message.content:[];for(let h of m)if(h?.type==="tool_use"){s.toolCalls.total++;let g=String(h.name||"tool");s.toolCalls.byTool[g]=(s.toolCalls.byTool[g]||0)+1}}let a=[...new Set(n)];s.modelSwitching.uniqueModels=a,s.modelSwitching.modelCount=a.length,s.modelSwitching.totalRequests=n.length;let u=0;for(let c=1;c<n.length;c++)n[c]!==n[c-1]&&u++;return s.modelSwitching.switchCount=u,Ae(t.modelPricing,a,n,s),s}};var Oa=F(require("path"));var Ls=class{constructor(e,t){this.visualStudio=e;this.estimateTokens=t}visualStudio;estimateTokens;id="visualstudio";displayName="Visual Studio";handles(e){return this.visualStudio.isVSSessionFile(e)}getBackingPath(e){return e}async stat(e){return this.visualStudio.statSessionFile(e)}async getTokens(e){let t=this.visualStudio.getTokenEstimates(e,this.estimateTokens);return{...t,actualTokens:t.tokens}}async countInteractions(e){let t=this.visualStudio.decodeSessionFile(e);return Promise.resolve(this.visualStudio.countInteractions(t))}async getModelUsage(e){return Promise.resolve(this.visualStudio.getModelUsage(e,this.estimateTokens))}async getMeta(e){let t=this.visualStudio.decodeSessionFile(e),s=this.visualStudio.getSessionTitle(t),o=this.visualStudio.getSessionTimestamps(t),n=[];return o.timeCreated&&n.push(new Date(o.timeCreated).getTime()),o.timeUpdated&&n.push(new Date(o.timeUpdated).getTime()),n.sort((a,u)=>a-u),{title:s,firstInteraction:n.length>0?new Date(n[0]).toISOString():null,lastInteraction:n.length>0?new Date(n[n.length-1]).toISOString():null}}getEditorRoot(e){return Oa.dirname(e)}skipBackendSync=!0;async discover(e){let t=this.getCandidatePaths(),s=[];try{let o=this.visualStudio.discoverSessions();o.length>0&&(e(`\u{1F4C4} Found ${o.length} session file(s) in Visual Studio Copilot`),s.push(...o))}catch(o){e(`Could not read Visual Studio session files: ${o}`)}return{sessionFiles:s,candidatePaths:t}}getCandidatePaths(){return[{path:this.visualStudio.getLogDir(),source:"Visual Studio (log dir)"}]}getRawFileContent(e){let s=this.visualStudio.decodeSessionFile(e).map((o,n)=>n===0?o:o?.[1]??o);return JSON.stringify(s,null,2)}async buildTurns(e){let t=[],s=this.visualStudio.decodeSessionFile(e),o=0;for(let n=1;n<s.length;n+=2){let a=s[n],u=s[n+1];if(!a)continue;let c=a[1],p=u?.[1];o++;let m=this.visualStudio.extractTextFromContent(c?.Content||[]),h=u?this.visualStudio.extractTextFromContent(p?.Content||[]):"",g=this.visualStudio.getModelId(p??c,!p),C=this.visualStudio.extractContextText(c?.Context),w=this.estimateTokens(m+C,g??"gpt-4"),v=u?this.estimateTokens(h,g??"gpt-4"):0,y=[];for(let b of p?.Content||[]){let _=Array.isArray(b)?b[1]:null;_?.Function&&y.push({toolName:String(_.Function.Description||"tool"),result:typeof _.Function.Result=="string"?_.Function.Result:void 0})}t.push({turnNumber:o,timestamp:c?.Timestamp?new Date(c.Timestamp).toISOString():null,mode:"ask",userMessage:m,assistantResponse:h,model:g,toolCalls:y,contextReferences:be(),mcpTools:[],inputTokensEstimate:w,outputTokensEstimate:v,thinkingTokensEstimate:0})}return{turns:t}}async analyzeUsage(e,t){let s=we(),o=this.visualStudio.decodeSessionFile(e),n=[];for(let c=1;c<o.length;c++){let p=c%2===1,m=o[c]?.[1];if(p)s.modeUsage.ask++;else{let h=this.visualStudio.getModelId(m,!1);h&&n.push(h);for(let g of m?.Content??[]){let C=Array.isArray(g)?g[1]:null;if(C?.Function){s.toolCalls.total++;let w=String(C.Function.Name||C.Function.Description||"tool");if(nt(w)){s.mcpTools.total++;let v=it(w,t.toolNameMap);s.mcpTools.byServer[v]=(s.mcpTools.byServer[v]||0)+1;let y=Yt(w);s.mcpTools.byTool[y]=(s.mcpTools.byTool[y]||0)+1,s.toolCalls.total--}else s.toolCalls.byTool[w]=(s.toolCalls.byTool[w]||0)+1}}}}let a=[...new Set(n)];s.modelSwitching.uniqueModels=a,s.modelSwitching.modelCount=a.length,s.modelSwitching.totalRequests=n.length;let u=0;for(let c=1;c<n.length;c++)n[c]!==n[c-1]&&u++;return s.modelSwitching.switchCount=u,Ae(t.modelPricing,a,n,s),s}};var Fa=F(require("fs"));var $s=class{constructor(e){this.mistralVibe=e}mistralVibe;id="mistralvibe";displayName="Mistral Vibe";handles(e){return this.mistralVibe.isVibeSessionFile(e)}getBackingPath(e){return e}async stat(e){return Fa.promises.stat(e)}async getTokens(e){let t=this.mistralVibe.getTokensFromSession(e);return{...t,actualTokens:t.tokens}}async countInteractions(e){return Promise.resolve(this.mistralVibe.countInteractions(e))}async getModelUsage(e){return Promise.resolve(this.mistralVibe.getModelUsage(e))}async getMeta(e){let t=this.mistralVibe.getSessionMeta(e);return{title:t.title,firstInteraction:t.firstInteraction,lastInteraction:t.lastInteraction}}getEditorRoot(e){return this.mistralVibe.getSessionLogDir()}async discover(e){let t=this.getCandidatePaths(),s=[];try{let o=this.mistralVibe.discoverSessions();o.length>0&&(e(`\u{1F4C4} Found ${o.length} session file(s) in Mistral Vibe (~/.vibe/logs/session)`),s.push(...o))}catch(o){e(`Could not read Mistral Vibe session files: ${o}`)}return{sessionFiles:s,candidatePaths:t}}getCandidatePaths(){return[{path:this.mistralVibe.getSessionLogDir(),source:"Mistral Vibe"}]}async buildTurns(e){let t=[],s=this.mistralVibe.readSessionMessages(e),o=this.mistralVibe.getSessionMeta(e),n=this.mistralVibe.getTokensFromSession(e),a=o.model||"devstral",u=[];for(let c=0;c<s.length;c++)s[c].role==="user"&&s[c].injected!==!0&&u.push(c);for(let c=0;c<u.length;c++){let p=u[c],m=c+1<u.length?u[c+1]:s.length,h=s[p],g=typeof h.content=="string"?h.content:"",C="",w=[];for(let v=p+1;v<m;v++){let y=s[v];if(y.role==="assistant"){if(typeof y.content=="string"&&(C+=y.content),Array.isArray(y.tool_calls))for(let b of y.tool_calls)w.push({toolName:b.function?.name||b.name||"unknown",arguments:b.function?.arguments?JSON.stringify(b.function.arguments):void 0})}else if(y.role==="tool"){let b=w[w.length-1];b&&(b.result=typeof y.content=="string"?y.content:void 0)}}t.push({turnNumber:c+1,timestamp:o.firstInteraction,mode:"cli",userMessage:g,assistantResponse:C,model:a,toolCalls:w,contextReferences:be(),mcpTools:[],inputTokensEstimate:0,outputTokensEstimate:0,thinkingTokensEstimate:0})}return{turns:t,actualTokens:n.tokens}}async analyzeUsage(e,t){let s=we(),o=this.mistralVibe.readSessionMessages(e),a=this.mistralVibe.getSessionMeta(e).model||"devstral",u=[];for(let p of o)if(p.role==="user"&&p.injected!==!0)s.modeUsage.cli++;else if(p.role==="assistant"&&(u.push(a),Array.isArray(p.tool_calls)))for(let m of p.tool_calls){s.toolCalls.total++;let h=String(m.function?.name||m.name||"tool");s.toolCalls.byTool[h]=(s.toolCalls.byTool[h]||0)+1}let c=[...new Set(u)];return s.modelSwitching.uniqueModels=c,s.modelSwitching.modelCount=c.length,s.modelSwitching.totalRequests=u.length,s.modelSwitching.switchCount=0,Ae(t.modelPricing,c,u,s),s}};var Na=F(require("fs"));var qs=class{constructor(e){this.geminiCli=e}geminiCli;id="geminicli";displayName="Gemini CLI";handles(e){return this.geminiCli.isGeminiCliSessionFile(e)}getBackingPath(e){return e}async stat(e){return Na.promises.stat(e)}async getTokens(e){let t=this.geminiCli.getTokensFromGeminiCliSession(e);return{...t,actualTokens:t.tokens}}async countInteractions(e){return Promise.resolve(this.geminiCli.countGeminiCliInteractions(e))}async getModelUsage(e){return Promise.resolve(this.geminiCli.getGeminiCliModelUsage(e))}async getMeta(e){return Promise.resolve(this.geminiCli.getGeminiCliSessionMeta(e))}getEditorRoot(e){return this.geminiCli.getGeminiDataDir()}async discover(e){let t=this.getCandidatePaths(),s=[];try{let o=this.geminiCli.getGeminiCliSessionFiles();o.length>0&&(e(`\u{1F4C4} Found ${o.length} session file(s) in Gemini CLI (~/.gemini/tmp/*/chats)`),s.push(...o))}catch(o){e(`Could not read Gemini CLI session files: ${o}`)}return{sessionFiles:s,candidatePaths:t}}getCandidatePaths(){return[{path:this.geminiCli.getGeminiTmpDir(),source:"Gemini CLI (sessions)"},{path:this.geminiCli.getGeminiProjectsPath(),source:"Gemini CLI (projects.json)"},{path:this.geminiCli.getGeminiLogsPath(),source:"Gemini CLI (logs.json)"}]}async buildTurns(e){return Promise.resolve(this.geminiCli.buildGeminiCliTurns(e))}async getDailyFractions(e){return Promise.resolve(this.geminiCli.getGeminiCliDailyFractions(e))}async analyzeUsage(e,t){let s=we(),o=this.geminiCli.readGeminiCliSession(e),n=[];s.modeUsage.cli+=o.userRecords.length;for(let c of o.assistantRecords){let p=Wo(c.model||"unknown");n.push(p);for(let m of Array.isArray(c.toolCalls)?c.toolCalls:[]){let h=typeof m?.name=="string"&&m.name.trim().length>0?m.name.trim():typeof m?.displayName=="string"&&m.displayName.trim().length>0?m.displayName.trim():"";h&&(s.toolCalls.total++,s.toolCalls.byTool[h]=(s.toolCalls.byTool[h]||0)+1)}}let a=[...new Set(n)];s.modelSwitching.uniqueModels=a,s.modelSwitching.modelCount=a.length,s.modelSwitching.totalRequests=n.length;let u=0;for(let c=1;c<n.length;c++)n[c]!==n[c-1]&&u++;return s.modelSwitching.switchCount=u,Ae(t.modelPricing,a,n,s),s}};var We=F(require("fs")),Y=F(require("path")),Hs=F(require("os"));var zs=["Code","Code - Insiders","Code - Exploration","VSCodium","Cursor"],La=new Set(["Public","Default","Default User","All Users"]);function Ti(){return Hs.platform()==="linux"&&(typeof process.env.WSL_DISTRO_NAME=="string"||typeof process.env.WSL_INTEROP=="string")}function ja(){let i=Hs.platform(),e=Hs.homedir(),t=[];if(i==="win32"){let s=process.env.APPDATA||Y.join(e,"AppData","Roaming");for(let o of zs)t.push(Y.join(s,o,"User"))}else if(i==="darwin")for(let s of zs)t.push(Y.join(e,"Library","Application Support",s,"User"));else{let s=process.env.XDG_CONFIG_HOME||Y.join(e,".config");for(let o of zs)t.push(Y.join(s,o,"User"))}return t.push(Y.join(e,".vscode-server","data","User"),Y.join(e,".vscode-server-insiders","data","User"),Y.join(e,".vscode-remote","data","User"),Y.join("/tmp",".vscode-server","data","User"),Y.join("/workspace",".vscode-server","data","User")),t}async function Ju(){if(!Ti())return[];let i=[],e=[],t=process.env.USERPROFILE;if(t){let o=t.match(/^\/mnt\/[a-z]\/Users\/([^/]+)/);o&&e.push(o[1])}let s="/mnt/c/Users";try{let o=await We.promises.readdir(s,{withFileTypes:!0});for(let n of o){if(!n.isDirectory())continue;let a=n.name;La.has(a)||a.startsWith(".")||e.includes(a)||e.push(a)}}catch{return[]}for(let o of e){let n=Y.join(s,o,"AppData","Roaming");for(let a of zs)i.push(Y.join(n,a,"User"))}return i}function Ku(){if(!Ti())return[];let i=[],e="/mnt/c/Users";try{let t=We.readdirSync(e,{withFileTypes:!0});for(let s of t)if(!(!s.isDirectory()||s.name.startsWith(".")||La.has(s.name)))for(let o of zs)i.push(Y.join(e,s.name,"AppData","Roaming",o,"User"))}catch{}return i}var Yu=["embeddings","index","cache","preferences","settings","config","workspacesessions","globalsessions","api.json"];function Qu(i){let e=i.toLowerCase();return Yu.some(t=>e.includes(t))}async function Bs(i){try{return await We.promises.access(i),!0}catch{return!1}}async function Ga(i,e,t,s){if(i.length===0)return;let o=0,n=Array.from({length:Math.min(t,i.length)},async()=>{for(;o<i.length;){let a=o++;try{await e(i[a],a)}catch(u){s?.(i[a],a,u)}}});await Promise.all(n)}async function $a(i,e,t){let s;try{s=await We.promises.readdir(i,{withFileTypes:!0})}catch(o){t(`Could not scan directory ${i}: ${o}`);return}for(let o of s){let n=Y.join(i,o.name);if(o.isDirectory()){await $a(n,e,t);continue}if(!(!o.name.endsWith(".json")&&!o.name.endsWith(".jsonl"))&&!Qu(o.name))try{(await We.promises.stat(n)).size>0&&e.push(n)}catch{}}}var Ws=class{id="copilotchat";displayName="GitHub Copilot Chat";handles(e){return!1}getBackingPath(e){return e}async stat(e){return We.promises.stat(e)}async getTokens(e){try{let t=await We.promises.readFile(e,"utf8");return us(t)?{tokens:0,thinkingTokens:0,actualTokens:0}:e.endsWith(".jsonl")||yt(t)?Bo(t):{tokens:0,thinkingTokens:0,actualTokens:0}}catch{return{tokens:0,thinkingTokens:0,actualTokens:0}}}async countInteractions(e){return 0}async getModelUsage(e){return{}}async getMeta(e){return{title:void 0,firstInteraction:null,lastInteraction:null}}getEditorRoot(e){let t=e.replace(/\\/g,"/"),s=t.lastIndexOf("/User/");return s>=0?t.substring(0,s+5):Y.dirname(e)}getCandidatePaths(){let e=[];for(let t of ja())e.push({path:t,source:"VS Code"});for(let t of Ku())e.push({path:t,source:"VS Code (Windows via WSL)"});return e}async discover(e){let t=this.getCandidatePaths(),s=[],o=ja();if(Ti()){e("\u{1FA9F} WSL environment detected \u2014 probing Windows-side VS Code paths");let u=await Ju();u.length>0?(e(`\u{1FA9F} Adding ${u.length} Windows-side candidate paths from WSL`),o.push(...u)):e("\u{1FA9F} No Windows-side paths found (Windows drive may not be mounted)")}e(`\u{1F4C2} Considering ${o.length} candidate VS Code paths`);let n=await Promise.all(o.map(u=>Bs(u).catch(()=>!1))),a=o.filter((u,c)=>n[c]);return e(`\u2705 Found ${a.length} of ${o.length} VS Code paths exist on disk`),await Ga(a,async u=>{let c=Y.basename(Y.dirname(u)),p=Y.join(u,"workspaceStorage");try{if(await Bs(p)){let h=await We.promises.readdir(p);await Ga(h,async g=>{let C=[Y.join(p,g,"chatSessions"),Y.join(p,g,"GitHub.copilot-chat","chatSessions"),Y.join(p,g,"github.copilot-chat","chatSessions"),Y.join(p,g,"GitHub.copilot","chatSessions"),Y.join(p,g,"github.copilot","chatSessions"),Y.join(p,g,"GitHub.copilot-chat","debug-logs"),Y.join(p,g,"github.copilot-chat","debug-logs"),Y.join(p,g,"GitHub.copilot","debug-logs"),Y.join(p,g,"github.copilot","debug-logs")];for(let w of C)try{if(!await Bs(w))continue;let v=(await We.promises.readdir(w)).filter(y=>y.endsWith(".json")||y.endsWith(".jsonl")).map(y=>Y.join(w,y));v.length>0&&(e(`\u{1F4C4} Found ${v.length} session files in ${c}/workspaceStorage/${g}`),s.push(...v))}catch{}},6)}}catch(h){e(`Could not check workspace storage path ${p}: ${h}`)}let m=Y.join(u,"globalStorage","emptyWindowChatSessions");try{if(await Bs(m)){let h=(await We.promises.readdir(m)).filter(g=>g.endsWith(".json")||g.endsWith(".jsonl")).map(g=>Y.join(m,g));h.length>0&&(e(`\u{1F4C4} Found ${h.length} session files in ${c}/globalStorage/emptyWindowChatSessions`),s.push(...h))}}catch(h){e(`Could not check global storage path ${m}: ${h}`)}for(let h of["GitHub.copilot-chat","github.copilot-chat","GitHub.copilot","github.copilot"]){let g=Y.join(u,"globalStorage",h);try{await Bs(g)&&(e(`\u{1F4C4} Scanning ${c}/globalStorage/${h}`),await $a(g,s,e))}catch(C){e(`Could not check Copilot Chat global storage path ${g}: ${C}`)}}},4,(u,c,p)=>{e(`Failed to scan VS Code user path ${u}: ${p instanceof Error?p.message:String(p)}`)}),{sessionFiles:s,candidatePaths:t}}};var Vs=F(require("fs")),Qo=F(require("path")),qa=F(require("os"));function Pi(){return Qo.join(qa.homedir(),".copilot","session-state")}async function Xu(i){try{return await Vs.promises.access(i),!0}catch{return!1}}var Js=class{id="copilotcli";displayName="GitHub Copilot CLI";handles(e){return!1}getBackingPath(e){return e}async stat(e){return Vs.promises.stat(e)}async getTokens(e){return{tokens:0,thinkingTokens:0,actualTokens:0}}async countInteractions(e){return 0}async getModelUsage(e){return{}}async getMeta(e){return{title:void 0,firstInteraction:null,lastInteraction:null}}getEditorRoot(e){return Pi()}getCandidatePaths(){return[{path:Pi(),source:"Copilot CLI"}]}async discover(e){let t=this.getCandidatePaths(),s=[],o=Pi();try{if(!await Xu(o))return{sessionFiles:s,candidatePaths:t};let n;try{n=await Vs.promises.readdir(o,{withFileTypes:!0})}catch(p){return e(`Could not read Copilot CLI session path in ${o}: ${p}`),{sessionFiles:s,candidatePaths:t}}let a=n.filter(p=>!p.isDirectory()&&(p.name.endsWith(".json")||p.name.endsWith(".jsonl"))).map(p=>Qo.join(o,p.name));a.length>0&&(e(`\u{1F4C4} Found ${a.length} session files in Copilot CLI directory`),s.push(...a));let u=n.filter(p=>p.isDirectory()),c=(await Promise.all(u.map(async p=>{let m=Qo.join(o,p.name,"events.jsonl");try{return(await Vs.promises.stat(m)).size>0?m:null}catch{return null}}))).filter(p=>p!==null);c.length>0&&(e(`\u{1F4C4} Found ${c.length} session files in Copilot CLI subdirectories`),s.push(...c))}catch(n){e(`Could not check Copilot CLI session path ${o}: ${n}`)}return{sessionFiles:s,candidatePaths:t}}};function Ie(i){return typeof i=="object"&&i!==null}function Zu(i){return typeof i!="string"?!1:!["__proto__","prototype","constructor","hasOwnProperty"].includes(i)&&!i.startsWith("__")}function Ks(i){return/^\d+$/.test(i)}function Mi(i,e){if(typeof i!="string")return e;let t=i.trim();return t?t.startsWith("copilot/")?t.substring(8):t:e}function ed(i,e){if(!Ie(e))return i;let t=e.kind,s=e.k,o=e.v;if(t===0)return o;if(!Array.isArray(s)||s.length===0)return i;let n=s.map(String);for(let m of n)if(!Zu(m))return i;let a=Ie(i)?i:Object.create(null),u=a,c=(m,h,g)=>{let C=Ks(g),w=m[h];return Ie(w)||(w=C?[]:Object.create(null),m[h]=w),w};for(let m=0;m<n.length-1;m++){let h=n[m],g=n[m+1];if(Array.isArray(u)&&Ks(h)){let C=Number(h),w=u[C];Ie(w)||(w=Ks(g)?[]:Object.create(null),u[C]=w),u=w;continue}if(!Ie(u))return a;u=c(u,h,g)}let p=n[n.length-1];if(t===1)return Array.isArray(u)&&Ks(p)?(u[Number(p)]=o,a):(Ie(u)&&Object.defineProperty(u,p,{value:o,writable:!0,enumerable:!0,configurable:!0}),a);if(t===2){let m;if(Array.isArray(u)&&Ks(p)){let h=Number(p);Array.isArray(u[h])||(u[h]=[]),m=u[h]}else Ie(u)&&(Array.isArray(u[p])||Object.defineProperty(u,p,{value:[],writable:!0,enumerable:!0,configurable:!0}),m=u[p]);return Array.isArray(m)&&(Array.isArray(o)?m.push(...o):m.push(o)),a}return a}function td(i){if(!Array.isArray(i))return{responseText:"",thinkingText:""};let e="",t="";for(let s of i){if(!Ie(s))continue;if(s.kind==="thinking"){let a=s.value;typeof a=="string"&&a&&(t+=a);continue}let o=Ie(s.content)?s.content.value:void 0,n=s.value;if(typeof o=="string"&&o){e+=o;continue}typeof n=="string"&&n&&(e+=n)}return{responseText:e,thinkingText:t}}function Ba(i,e,t,s){let o={},n=0,a=0,u=0,c=0,p=0,m,h="unknown",g=y=>typeof y=="string"&&y?y:h,C=(y,b)=>{let _=g(y);o[_]||(o[_]={inputTokens:0,outputTokens:0});let T=t(b,_);o[_].inputTokens+=T,a+=T},w=(y,b)=>{let _=g(y);o[_]||(o[_]={inputTokens:0,outputTokens:0});let T=t(b,_);o[_].outputTokens+=T,u+=T};if(i.endsWith(".jsonl")){let y=e.split(/\r?\n/).filter(_=>_.trim()),b=!1;if(y.length>0)try{let _=JSON.parse(y[0]);_&&typeof _.kind=="number"&&(b=!0)}catch{}if(b){let _=Object.create(null);for(let S of y)try{let P=JSON.parse(S);_=ed(_,P)}catch{}let T=Ie(_)&&Array.isArray(_.requests)?_.requests:[];if(T.length>0){n=T.filter(S=>Ie(S)&&Ie(S.message)&&typeof S.message.text=="string"&&S.message.text.trim()).length;for(let S of T){if(!Ie(S))continue;let P=S.modelId??S.selectedModel?.identifier??S.model,A=Mi(P,h),U;if(typeof P=="string"&&P.trim())U=A;else{let _e=s?s(S):void 0;U=Mi(_e,"")||A}let O=S.message;Ie(O)&&typeof O.text=="string"&&C(U,O.text);let{responseText:$,thinkingText:q}=td(S.response);$&&w(U,$),q&&(c+=t(q,U));let ve=S.response;if(Array.isArray(ve))for(let _e of ve){let J=Et(_e);if(J){let He=J.modelName||U;J.prompt&&C(He,J.prompt),J.result&&w(He,J.result)}}}}return{tokens:a+u+c,interactions:n,modelUsage:o,thinkingTokens:c,actualTokens:0}}try{m=JSON.parse(e.trim())}catch{return{tokens:0,interactions:0,modelUsage:{},thinkingTokens:0,actualTokens:0}}}if(!m)try{m=JSON.parse(e)}catch{return{tokens:0,interactions:0,modelUsage:{},thinkingTokens:0,actualTokens:0}}let v=Array.isArray(m.requests)?m.requests:Array.isArray(m.history)?m.history:[];n=v.length;for(let y of v){let b=s?s(y):y?.model||h,_=Mi(b,h);if(o[_]||(o[_]={inputTokens:0,outputTokens:0}),y?.message?.parts){for(let S of y.message.parts)if(typeof S?.text=="string"&&S.text){let P=t(S.text,_);o[_].inputTokens+=P,a+=P}}else if(typeof y?.message?.text=="string"){let S=t(y.message.text,_);o[_].inputTokens+=S,a+=S}let T=Array.isArray(y?.response)?y.response:Array.isArray(y?.responses)?y.responses:[];for(let S of T){if(S?.kind==="thinking"&&typeof S?.value=="string"&&S.value){c+=t(S.value,_);continue}let P=Et(S);if(P){let A=P.modelName||_;P.prompt&&C(A,P.prompt),P.result&&w(A,P.result);continue}if(typeof S?.value=="string"&&S.value){let A=t(S.value,_);o[_].outputTokens+=A,u+=A}if(S?.message?.parts){for(let A of S.message.parts)if(typeof A?.text=="string"&&A.text){let U=t(A.text,_);o[_].outputTokens+=U,u+=U}}}if(y?.result?.usage){let S=y.result.usage,P=typeof S.promptTokens=="number"?S.promptTokens:0,A=typeof S.completionTokens=="number"?S.completionTokens:0;p+=P+A}else typeof y?.result?.promptTokens=="number"&&typeof y?.result?.outputTokens=="number"?p+=y.result.promptTokens+y.result.outputTokens:y?.result?.metadata&&typeof y?.result?.metadata?.promptTokens=="number"&&typeof y?.result?.metadata?.outputTokens=="number"&&(p+=y.result.metadata.promptTokens+y.result.metadata.outputTokens)}return{tokens:a+u+c,interactions:n,modelUsage:o,thinkingTokens:c,actualTokens:p}}function za(i,e,t){let s=t.toISOString().slice(0,10),o={};function n(c){if(c==null)return;let p=new Date(c);if(!isNaN(p.getTime())){let m=p.toISOString().slice(0,10);o[m]=(o[m]||0)+1}}if(e){let c={},p=i.trim().split(`
57
57
  `);for(let m of p)if(m.trim())try{let h=JSON.parse(m);if(h.type==="user.message"){let v=h.timestamp??h.ts??h.data?.timestamp;n(v);continue}let g=h.kind,C=h.k,w=h.v;if(g===0&&w?.requests&&Array.isArray(w.requests))for(let v of w.requests){let y=v.timestamp??v.ts;n(y)}else if(g===2&&Array.isArray(C)&&C[0]==="requests"){if(Array.isArray(w))for(let v of w){let y=v.timestamp??v.ts;n(y)}else if(w&&typeof w=="object"){let v=w.timestamp??w.ts;v!==void 0&&n(v),typeof C[1]=="number"&&(c[C[1]]=v)}}else if(g===1&&Array.isArray(C)&&C.length===3&&C[0]==="requests"&&(C[2]==="timestamp"||C[2]==="ts")&&typeof C[1]=="number"){let v=C[1];c[v]===void 0&&n(w),c[v]=w}}catch{}}else try{let c=JSON.parse(i);if(c.requests&&Array.isArray(c.requests))for(let p of c.requests){let m=p.timestamp??p.ts??p.result?.timestamp;n(m)}}catch{}let a=Object.values(o).reduce((c,p)=>c+p,0);if(a===0)return{[s]:1};let u={};for(let[c,p]of Object.entries(o))u[c]=p/a;return u}var Ut=F(require("fs")),Ai=F(require("path")),Ha=F(require("os")),Va=3,Wa=2e3,Ja=Ai.join(Ha.homedir(),".copilot-token-tracker"),xi=Ai.join(Ja,"cli-cache.json"),Qe=new Map,hs=!0,Ka=!1;function Di(){hs=!1,Qe.clear()}function Ei(){if(hs)try{if(!Ut.existsSync(xi))return;let i=Ut.readFileSync(xi,"utf-8"),e=JSON.parse(i);if(e.version!==Va){Qe.clear();return}Qe=new Map(Object.entries(e.entries))}catch{Qe.clear()}}function Ii(){if(!(!hs||!Ka))try{if(Qe.size>Wa){let e=[...Qe.entries()].sort((t,s)=>s[1].mtime-t[1].mtime);Qe=new Map(e.slice(0,Wa))}Ut.mkdirSync(Ja,{recursive:!0});let i={version:Va,entries:Object.fromEntries(Qe)};Ut.writeFileSync(xi,JSON.stringify(i),"utf-8")}catch{}}function Ya(i,e,t){if(!hs)return null;let s=Qe.get(i);return!s||s.mtime!==e||s.size!==t?null:{...s.data,lastModified:new Date(s.data.lastModified)}}function Ui(i,e,t,s){hs&&(Ka=!0,Qe.set(i,{mtime:e,size:t,data:{...s,lastModified:s.lastModified.toISOString()}}))}function Ri(){return{entries:Qe.size,enabled:hs}}var Qa={$schema:"http://json-schema.org/draft-07/schema#",description:"Character-to-token ratio estimators for different AI models. Used to estimate token counts from text length.",estimators:{"gpt-4":.25,"gpt-4.1":.25,"gpt-4.1-mini":.25,"gpt-4o":.25,"gpt-4o-mini":.25,"gpt-4-turbo":.25,"gpt-3.5-turbo":.25,"gpt-5":.25,"gpt-5-codex":.25,"gpt-5-mini":.25,"gpt-5.1":.25,"gpt-5.1-codex":.25,"gpt-5.1-codex-max":.25,"gpt-5.1-codex-mini":.25,"gpt-5.2":.25,"gpt-5.2-codex":.25,"gpt-5.2-pro":.25,"gpt-5.3-codex":.25,"gpt-5.4":.25,"gpt-5.4-mini":.25,"gpt-4.1-nano":.25,"gemini-2.0-flash":.25,"gemini-2.0-flash-lite":.25,"gemini-2.5-flash":.25,"gemini-2.5-flash-lite":.25,"claude-sonnet-3.5":.24,"claude-sonnet-3.7":.24,"claude-sonnet-4":.24,"claude-sonnet-4.5":.24,"claude-sonnet-4.6":.24,"claude-haiku":.24,"claude-haiku-4.5":.24,"claude-opus-4.1":.24,"claude-opus-4.5":.24,"claude-opus-4.6":.24,"claude-opus-4.6-(fast-mode)-(preview)":.24,"claude-opus-4.6-fast":.24,"gemini-2.5-pro":.25,"gemini-3-flash":.25,"gemini-3-pro":.25,"gemini-3-pro-preview":.25,"gemini-3.1-pro":.25,"gemini-3.1-flash-lite":.25,"grok-code-fast-1":.25,"raptor-mini":.25,goldeneye:.25,"o1-preview":.25,"o1-mini":.25,"o3-mini":.25,"o4-mini":.25,"gpt-5.5":.25,"mistral-large-latest":.25,"mistral-large-2512":.25,"mistral-large-2411":.25,"magistral-medium-latest":.25,"mistral-medium-latest":.25,"mistral-medium-3-5":.25,"mistral-medium-2505":.25,"mistral-small-latest":.25,"mistral-small-2503":.25,"mistral-small-2603":.25,"codestral-latest":.25,"codestral-2501":.25,"open-mistral-nemo":.25,"ministral-3b-2410":.25,"ministral-8b-2410":.25,"magistral-small-latest":.25,"devstral-medium-2507":.25,"pixtral-large-2411":.25}};var Xa={$schema:"http://json-schema.org/draft-07/schema#",description:"Model pricing data - costs per million tokens. Each model has direct provider/API pricing at the top level (used as a reference); models billed through GitHub Copilot AI Credits also include a `copilotPricing` block reflecting GitHub's published per-token rates (1 AI credit = $0.01).",metadata:{lastUpdated:"2026-05-12",sources:[{name:"OpenAI API Pricing",url:"https://developers.openai.com/api/docs/pricing",retrievedDate:"2026-04-24"},{name:"Mistral AI API Pricing",url:"https://pricepertoken.com/pricing-page/provider/mistral-ai",retrievedDate:"2026-05-06",note:"Cross-referenced with https://openrouter.ai/mistralai and https://ai-pricing.info/mistral"},{name:"Anthropic Claude Pricing",url:"https://www.anthropic.com/pricing",note:"Standard rates; also see https://platform.claude.com/docs/en/about-claude/pricing",retrievedDate:"2026-03-30"},{name:"Google AI Gemini API Pricing",url:"https://ai.google.dev/gemini-api/docs/pricing",retrievedDate:"2026-03-30"},{name:"xAI Grok API Pricing",url:"https://x.ai/api",retrievedDate:"2026-03-30"},{name:"GitHub Copilot Supported Models",url:"https://docs.github.com/en/copilot/reference/ai-models/supported-models",retrievedDate:"2026-03-30",note:"Source for tier/multiplier data"},{name:"GitHub Copilot Premium Requests",url:"https://docs.github.com/en/copilot/managing-copilot/monitoring-usage-and-entitlements/about-premium-requests",retrievedDate:"2026-03-30",note:"Source for premium request multiplier values"},{name:"OpenRouter Model Pricing",url:"https://openrouter.ai",retrievedDate:"2026-03-30",note:"Cross-provider pricing aggregator used for verification"},{name:"GitHub Copilot Models and Pricing",url:"https://docs.github.com/en/copilot/reference/copilot-billing/models-and-pricing",retrievedDate:"2026-04-27",note:"Source for the `copilotPricing` per-model block (GitHub AI Credit per-token rates)"}],disclaimer:"GitHub Copilot uses these models but pricing may differ from direct API usage. These are reference prices for cost estimation purposes only."},pricing:{"gpt-5":{inputCostPerMillion:1.25,outputCostPerMillion:10,category:"GPT-5 models",tier:"premium",multiplier:1,displayNames:["GPT-5"]},"gpt-5-codex":{inputCostPerMillion:1.25,outputCostPerMillion:10,category:"GPT-5 models",tier:"premium",multiplier:1,displayNames:["GPT-5 Codex (Preview)"]},"gpt-5-mini":{inputCostPerMillion:.25,outputCostPerMillion:2,category:"GPT-5 models",tier:"standard",multiplier:0,displayNames:["GPT-5 Mini"],copilotPricing:{inputCostPerMillion:.25,cachedInputCostPerMillion:.025,outputCostPerMillion:2,releaseStatus:"GA",category:"Lightweight"}},"gpt-5.1":{inputCostPerMillion:1.25,outputCostPerMillion:10,category:"GPT-5 models",tier:"premium",multiplier:1,displayNames:["GPT-5.1"]},"gpt-5.1-codex":{inputCostPerMillion:1.25,outputCostPerMillion:10,category:"GPT-5 models",tier:"premium",multiplier:1,displayNames:["GPT-5.1 Codex"]},"gpt-5.1-codex-max":{inputCostPerMillion:1.75,outputCostPerMillion:14,category:"GPT-5 models",tier:"premium",multiplier:1,displayNames:["GPT-5.1 Codex Max"]},"gpt-5.1-codex-mini":{inputCostPerMillion:.25,outputCostPerMillion:2,category:"GPT-5 models",tier:"premium",multiplier:.33,displayNames:["GPT-5.1 Codex Mini (Preview)"]},"gpt-5.2":{inputCostPerMillion:1.75,outputCostPerMillion:14,category:"GPT-5 models",tier:"premium",multiplier:1,displayNames:["GPT-5.2"],copilotPricing:{inputCostPerMillion:1.75,cachedInputCostPerMillion:.175,outputCostPerMillion:14,releaseStatus:"Closing down 2026-06-01",category:"Versatile"}},"gpt-5.2-codex":{inputCostPerMillion:1.75,outputCostPerMillion:14,category:"GPT-5 models",tier:"premium",multiplier:1,displayNames:["GPT-5.2 Codex"],copilotPricing:{inputCostPerMillion:1.75,cachedInputCostPerMillion:.175,outputCostPerMillion:14,releaseStatus:"Closing down 2026-06-01",category:"Powerful"}},"gpt-5.2-pro":{inputCostPerMillion:21,outputCostPerMillion:168,category:"GPT-5 models",tier:"premium",multiplier:1,displayNames:["GPT-5.2 Pro"]},"gpt-5.3-codex":{inputCostPerMillion:1.75,outputCostPerMillion:14,category:"GPT-5 models",tier:"premium",multiplier:1,displayNames:["GPT-5.3 Codex"],copilotPricing:{inputCostPerMillion:1.75,cachedInputCostPerMillion:.175,outputCostPerMillion:14,releaseStatus:"GA",category:"Powerful"}},"gpt-5.4":{inputCostPerMillion:2.5,cachedInputCostPerMillion:.25,outputCostPerMillion:15,category:"GPT-5 models",tier:"premium",multiplier:1,displayNames:["GPT-5.4"],copilotPricing:{inputCostPerMillion:2.5,cachedInputCostPerMillion:.25,outputCostPerMillion:15,releaseStatus:"GA",category:"Versatile"}},"gpt-5.4-mini":{inputCostPerMillion:.75,cachedInputCostPerMillion:.075,outputCostPerMillion:4.5,category:"GPT-5 models",tier:"premium",multiplier:.33,displayNames:["GPT-5.4 mini"],copilotPricing:{inputCostPerMillion:.75,cachedInputCostPerMillion:.075,outputCostPerMillion:4.5,releaseStatus:"GA",category:"Lightweight"}},"gpt-5.4-nano":{inputCostPerMillion:.2,cachedInputCostPerMillion:.02,outputCostPerMillion:1.25,category:"GPT-5 models",tier:"premium",multiplier:.25,displayNames:["GPT-5.4 nano"],copilotPricing:{inputCostPerMillion:.2,cachedInputCostPerMillion:.02,outputCostPerMillion:1.25,releaseStatus:"GA",category:"Lightweight"}},"gpt-4":{inputCostPerMillion:3,outputCostPerMillion:12,category:"GPT-4 models",tier:"unknown",multiplier:1,displayNames:["GPT-4"]},"gpt-4.1":{inputCostPerMillion:2,cachedInputCostPerMillion:.5,outputCostPerMillion:8,category:"GPT-4 models",tier:"standard",multiplier:0,displayNames:["GPT-4.1"],copilotPricing:{inputCostPerMillion:2,cachedInputCostPerMillion:.5,outputCostPerMillion:8,releaseStatus:"Closing down 2026-06-01",category:"Versatile"}},"gpt-4.1-mini":{inputCostPerMillion:.4,cachedInputCostPerMillion:.1,outputCostPerMillion:1.6,category:"GPT-4 models",tier:"standard",multiplier:0,displayNames:["GPT-4.1 Mini"]},"gpt-4.1-nano":{inputCostPerMillion:.1,cachedInputCostPerMillion:.025,outputCostPerMillion:.4,category:"GPT-4 models",tier:"standard",multiplier:0,displayNames:["GPT-4.1 Nano"]},"gpt-4o":{inputCostPerMillion:2.5,outputCostPerMillion:10,cachedInputCostPerMillion:1.25,category:"GPT-4 models",tier:"standard",multiplier:0,displayNames:["GPT-4o"]},"gpt-4o-mini":{inputCostPerMillion:.15,outputCostPerMillion:.6,cachedInputCostPerMillion:.075,category:"GPT-4 models",tier:"standard",multiplier:0,displayNames:["GPT-4o-mini","GPT-4o Mini"]},"gpt-4-turbo":{inputCostPerMillion:10,outputCostPerMillion:30,category:"GPT-4 models",tier:"standard",multiplier:0,displayNames:["GPT-4 Turbo"]},"claude-sonnet-3.5":{inputCostPerMillion:3,outputCostPerMillion:15,cachedInputCostPerMillion:.3,cacheCreationCostPerMillion:3.75,category:"Claude models (Anthropic)",tier:"unknown",multiplier:1,displayNames:["Claude Sonnet 3.5"]},"claude-sonnet-3.7":{inputCostPerMillion:3,outputCostPerMillion:15,cachedInputCostPerMillion:.3,cacheCreationCostPerMillion:3.75,category:"Claude models (Anthropic)",tier:"unknown",multiplier:1,displayNames:["Claude Sonnet 3.7"]},"claude-sonnet-4":{inputCostPerMillion:3,outputCostPerMillion:15,cachedInputCostPerMillion:.3,cacheCreationCostPerMillion:3.75,category:"Claude models (Anthropic)",tier:"premium",multiplier:1,displayNames:["Claude Sonnet 4"],copilotPricing:{inputCostPerMillion:3,cachedInputCostPerMillion:.3,cacheCreationCostPerMillion:3.75,outputCostPerMillion:15,releaseStatus:"GA",category:"Versatile"}},"claude-sonnet-4.5":{inputCostPerMillion:3,outputCostPerMillion:15,cachedInputCostPerMillion:.3,cacheCreationCostPerMillion:3.75,category:"Claude models (Anthropic)",tier:"premium",multiplier:1,displayNames:["Claude Sonnet 4.5"],copilotPricing:{inputCostPerMillion:3,cachedInputCostPerMillion:.3,cacheCreationCostPerMillion:3.75,outputCostPerMillion:15,releaseStatus:"GA",category:"Versatile"}},"claude-sonnet-4.6":{inputCostPerMillion:3,outputCostPerMillion:15,cachedInputCostPerMillion:.3,cacheCreationCostPerMillion:3.75,category:"Claude models (Anthropic)",tier:"premium",multiplier:1,displayNames:["Claude Sonnet 4.6"],copilotPricing:{inputCostPerMillion:3,cachedInputCostPerMillion:.3,cacheCreationCostPerMillion:3.75,outputCostPerMillion:15,releaseStatus:"GA",category:"Versatile"}},"claude-haiku":{inputCostPerMillion:.25,outputCostPerMillion:1.25,cachedInputCostPerMillion:.025,cacheCreationCostPerMillion:.3125,category:"Claude models (Anthropic)",tier:"standard",multiplier:0,displayNames:["Claude Haiku"]},"claude-haiku-4.5":{inputCostPerMillion:1,outputCostPerMillion:5,cachedInputCostPerMillion:.1,cacheCreationCostPerMillion:1.25,category:"Claude models (Anthropic)",tier:"premium",multiplier:.33,displayNames:["Claude Haiku 4.5"],copilotPricing:{inputCostPerMillion:1,cachedInputCostPerMillion:.1,cacheCreationCostPerMillion:1.25,outputCostPerMillion:5,releaseStatus:"GA",category:"Versatile"}},"claude-opus-4.1":{inputCostPerMillion:15,outputCostPerMillion:75,cachedInputCostPerMillion:1.5,cacheCreationCostPerMillion:18.75,category:"Claude models (Anthropic)",tier:"premium",multiplier:10,displayNames:["Claude Opus 4.1"]},"claude-opus-4.5":{inputCostPerMillion:5,outputCostPerMillion:25,cachedInputCostPerMillion:.5,cacheCreationCostPerMillion:6.25,category:"Claude models (Anthropic)",tier:"premium",multiplier:3,displayNames:["Claude Opus 4.5"],copilotPricing:{inputCostPerMillion:5,cachedInputCostPerMillion:.5,cacheCreationCostPerMillion:6.25,outputCostPerMillion:25,releaseStatus:"GA",category:"Powerful"}},"claude-opus-4.6":{inputCostPerMillion:5,outputCostPerMillion:25,cachedInputCostPerMillion:.5,cacheCreationCostPerMillion:6.25,category:"Claude models (Anthropic)",tier:"premium",multiplier:3,displayNames:["Claude Opus 4.6"],copilotPricing:{inputCostPerMillion:5,cachedInputCostPerMillion:.5,cacheCreationCostPerMillion:6.25,outputCostPerMillion:25,releaseStatus:"GA",category:"Powerful"}},"claude-opus-4.7":{inputCostPerMillion:5,outputCostPerMillion:25,cachedInputCostPerMillion:.5,cacheCreationCostPerMillion:6.25,category:"Claude models (Anthropic)",tier:"premium",multiplier:15,displayNames:["Claude Opus 4.7"],copilotPricing:{inputCostPerMillion:5,cachedInputCostPerMillion:.5,cacheCreationCostPerMillion:6.25,outputCostPerMillion:25,releaseStatus:"GA",category:"Powerful"}},"claude-opus-4.6-(fast-mode)-(preview)":{inputCostPerMillion:5,outputCostPerMillion:25,cachedInputCostPerMillion:.5,cacheCreationCostPerMillion:6.25,category:"Claude models (Anthropic)",tier:"premium",multiplier:30,displayNames:["Claude Opus 4.6 (Fast Mode Preview)"],copilotPricing:{inputCostPerMillion:30,cachedInputCostPerMillion:3,cacheCreationCostPerMillion:37.5,outputCostPerMillion:150,releaseStatus:"Public preview",category:"Powerful"}},"claude-opus-4.6-fast":{inputCostPerMillion:5,outputCostPerMillion:25,cachedInputCostPerMillion:.5,cacheCreationCostPerMillion:6.25,category:"Claude models (Anthropic)",tier:"premium",multiplier:30,displayNames:["Claude Opus 4.6 (Fast)"],copilotPricing:{inputCostPerMillion:30,cachedInputCostPerMillion:3,cacheCreationCostPerMillion:37.5,outputCostPerMillion:150,releaseStatus:"Public preview",category:"Powerful"}},"o3-mini":{inputCostPerMillion:1.1,outputCostPerMillion:4.4,category:"OpenAI reasoning models",tier:"premium",multiplier:1,displayNames:["o3-mini"]},"o4-mini":{inputCostPerMillion:1.1,outputCostPerMillion:4.4,category:"OpenAI reasoning models",tier:"premium",multiplier:1,displayNames:["o4-mini"]},"o1-preview":{inputCostPerMillion:15,outputCostPerMillion:60,category:"OpenAI reasoning models",tier:"premium",multiplier:1,displayNames:["o1-preview"]},"o1-mini":{inputCostPerMillion:3,outputCostPerMillion:12,category:"OpenAI reasoning models",tier:"premium",multiplier:1,displayNames:["o1-mini"]},"gpt-3.5-turbo":{inputCostPerMillion:.5,outputCostPerMillion:1.5,category:"Legacy models",tier:"standard",multiplier:0,displayNames:["GPT-3.5-Turbo","GPT-3.5 Turbo"]},"gemini-2.5-pro":{inputCostPerMillion:1.25,outputCostPerMillion:10,category:"Google Gemini models",tier:"premium",multiplier:1,displayNames:["Gemini 2.5 Pro"],copilotPricing:{inputCostPerMillion:1.25,cachedInputCostPerMillion:.125,outputCostPerMillion:10,releaseStatus:"GA",category:"Powerful"}},"gemini-2.5-flash":{inputCostPerMillion:.3,outputCostPerMillion:2.5,category:"Google Gemini models",tier:"unknown",multiplier:1,displayNames:["Gemini 2.5 Flash"]},"gemini-2.5-flash-lite":{inputCostPerMillion:.1,outputCostPerMillion:.4,category:"Google Gemini models",tier:"unknown",multiplier:1,displayNames:["Gemini 2.5 Flash Lite"]},"gemini-2.0-flash":{inputCostPerMillion:.1,outputCostPerMillion:.4,category:"Google Gemini models",tier:"standard",multiplier:0,displayNames:["Gemini 2.0 Flash"]},"gemini-2.0-flash-lite":{inputCostPerMillion:.075,outputCostPerMillion:.3,category:"Google Gemini models",tier:"standard",multiplier:0,displayNames:["Gemini 2.0 Flash Lite"]},"gemini-3-flash":{inputCostPerMillion:.5,outputCostPerMillion:3,category:"Google Gemini models",tier:"premium",multiplier:.33,displayNames:["Gemini 3 Flash"],copilotPricing:{inputCostPerMillion:.5,cachedInputCostPerMillion:.05,outputCostPerMillion:3,releaseStatus:"Public preview",category:"Lightweight"}},"gemini-3-pro":{inputCostPerMillion:2,outputCostPerMillion:12,category:"Google Gemini models",tier:"premium",multiplier:1,displayNames:["Gemini 3 Pro"]},"gemini-3-pro-preview":{inputCostPerMillion:2,outputCostPerMillion:12,category:"Google Gemini models",tier:"premium",multiplier:1,displayNames:["Gemini 3 Pro (Preview)"]},"gemini-3.1-pro":{inputCostPerMillion:2,outputCostPerMillion:12,category:"Google Gemini models",tier:"premium",multiplier:1,displayNames:["Gemini 3.1 Pro","Gemini 3.1 Pro (Preview)"],copilotPricing:{inputCostPerMillion:2,cachedInputCostPerMillion:.2,outputCostPerMillion:12,releaseStatus:"Public preview",category:"Powerful"}},"gemini-3.1-flash-lite":{inputCostPerMillion:.25,outputCostPerMillion:1.5,category:"Google Gemini models",tier:"unknown",multiplier:.33,displayNames:["Gemini 3.1 Flash Lite"]},"grok-code-fast-1":{inputCostPerMillion:.2,outputCostPerMillion:1.5,category:"xAI Grok models",tier:"premium",multiplier:.25,displayNames:["Grok Code Fast 1"],copilotPricing:{inputCostPerMillion:.2,cachedInputCostPerMillion:.02,outputCostPerMillion:1.5,releaseStatus:"GA",category:"Lightweight"}},"raptor-mini":{inputCostPerMillion:.25,outputCostPerMillion:2,category:"GitHub Copilot fine-tuned models",tier:"standard",multiplier:0,displayNames:["Raptor Mini"],copilotPricing:{inputCostPerMillion:.25,cachedInputCostPerMillion:.025,outputCostPerMillion:2,releaseStatus:"Public preview",category:"Versatile"}},goldeneye:{inputCostPerMillion:0,outputCostPerMillion:0,category:"GitHub Copilot fine-tuned models",tier:"standard",multiplier:0,copilotPricing:{inputCostPerMillion:1.25,cachedInputCostPerMillion:.125,outputCostPerMillion:10,releaseStatus:"Public preview",category:"Powerful"}},"gpt-5.5":{inputCostPerMillion:0,outputCostPerMillion:0,category:"GPT-5 models",tier:"premium",multiplier:7.5,displayNames:["GPT-5.5"]},"mistral-large-latest":{inputCostPerMillion:.5,outputCostPerMillion:1.5,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Mistral Large 3"]},"mistral-large-2512":{inputCostPerMillion:.5,outputCostPerMillion:1.5,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Mistral Large 3 (2512)"]},"mistral-large-2411":{inputCostPerMillion:2,outputCostPerMillion:6,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Mistral Large 2.1"]},"magistral-medium-latest":{inputCostPerMillion:2,outputCostPerMillion:5,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Magistral Medium"]},"mistral-medium-latest":{inputCostPerMillion:1.5,outputCostPerMillion:7.5,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Mistral Medium 3.5"]},"mistral-medium-3-5":{inputCostPerMillion:1.5,outputCostPerMillion:7.5,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Mistral Medium 3.5"]},"mistral-medium-2505":{inputCostPerMillion:.4,outputCostPerMillion:2,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Mistral Medium 3.1"]},"mistral-small-latest":{inputCostPerMillion:.1,outputCostPerMillion:.3,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Mistral Small 3.1"]},"mistral-small-2503":{inputCostPerMillion:.075,outputCostPerMillion:.2,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Mistral Small 3.2"]},"mistral-small-2603":{inputCostPerMillion:.15,outputCostPerMillion:.6,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Mistral Small 4"]},"codestral-latest":{inputCostPerMillion:.3,outputCostPerMillion:.9,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Codestral"]},"codestral-2501":{inputCostPerMillion:.3,outputCostPerMillion:.9,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Codestral (2501)"]},"open-mistral-nemo":{inputCostPerMillion:.02,outputCostPerMillion:.03,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Mistral Nemo"]},"ministral-3b-2410":{inputCostPerMillion:.04,outputCostPerMillion:.04,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Ministral 3B"]},"ministral-8b-2410":{inputCostPerMillion:.1,outputCostPerMillion:.1,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Ministral 8B"]},"magistral-small-latest":{inputCostPerMillion:.5,outputCostPerMillion:1.5,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Magistral Small"]},"devstral-medium-2507":{inputCostPerMillion:.4,outputCostPerMillion:2,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Devstral Medium"]},"pixtral-large-2411":{inputCostPerMillion:2,outputCostPerMillion:6,category:"Mistral models",tier:"unknown",multiplier:1,displayNames:["Pixtral Large"]}}};var Za={unknown:"Unknown",run_in_terminal:"Run In Terminal",run_shell_command:"Run Shell Command",send_to_terminal:"Send To Terminal",run_build:"Run Build",run_command_in_terminal:"Run Command In Terminal","mcp.io.github.git.assign_copilot_to_issue":"GitHub MCP (Local): Assign Copilot to Issue","mcp.io.github.git.create_or_update_file":"GitHub MCP (Local): Create/Update File",mcp_io_github_git_create_or_update_file:"GitHub MCP (Local): Create/Update File",mcp_io_github_git_assign_copilot_to_issue:"GitHub MCP (Local): Assign Copilot to Issue",mcp_io_github_git_pull_request_read:"GitHub MCP (Local): Pull Request Read",mcp_io_github_git_issue_read:"GitHub MCP (Local): Issue Read",mcp_io_github_git_issue_write:"GitHub MCP (Local): Issue Write",mcp_io_github_git_list_issues:"GitHub MCP (Local): List Issues",mcp_io_github_git_create_pull_request:"GitHub MCP (Local): Create Pull Request",mcp_io_github_git_get_file_contents:"GitHub MCP (Local): Get File Contents",mcp_io_github_git_search_code:"GitHub MCP (Local): Search Code",mcp_io_github_git_search_pull_requests:"GitHub MCP (Local): Search Pull Requests",mcp_io_github_git_get_release_by_tag:"GitHub MCP (Local): Get Release By Tag",mcp_io_github_git_search_issues:"GitHub MCP (Local): Search Issues",mcp_io_github_git_add_issue_comment:"GitHub MCP (Local): Add Issue Comment",mcp_io_github_git_list_pull_requests:"GitHub MCP (Local): List Pull Requests",mcp_io_github_git_get_commit:"GitHub MCP (Local): Get Commit",mcp_io_github_git_list_commits:"GitHub MCP (Local): List Commits",mcp_io_github_git_list_code_scanning_alerts:"GitHub MCP (Local): List Code Scanning Alerts",mcp_io_github_git_get_repository_tree:"GitHub MCP (Local): Get Repository Tree",mcp_io_github_git_get_job_logs:"GitHub MCP (Local): Get Job Logs",mcp_io_github_git_list_tags:"GitHub MCP (Local): List Tags",mcp_io_github_git_search_repositories:"GitHub MCP (Local): Search Repositories",mcp_io_github_git_create_repository:"GitHub MCP (Local): Create Repository",mcp_io_github_git_search_users:"GitHub MCP (Local): Search Users",mcp_github_github_assign_copilot_to_issue:"GitHub MCP (Remote): Assign Copilot to Issue",mcp_github_github_issue_read:"GitHub MCP (Remote): Issue Read",mcp_github_github_issue_write:"GitHub MCP (Remote): Issue Write",mcp_github_github_list_issues:"GitHub MCP (Remote): List Issues",mcp_github_get_file_contents:"GitHub MCP (Remote): Get File Contents",mcp_github_get_latest_release:"GitHub MCP (Remote): Get Latest Release",mcp_github_get_release_by_tag:"GitHub MCP (Remote): Get Release By Tag",mcp_github_list_releases:"GitHub MCP (Remote): List Releases",mcp_github_list_tags:"GitHub MCP (Remote): List Tags",mcp_github_search_code:"GitHub MCP (Remote): Search Code",mcp_github_search_issues:"GitHub MCP (Remote): Search Issues",mcp_github_issue_write:"GitHub MCP (Remote): Issue Write",mcp_github_list_issues:"GitHub MCP (Remote): List Issues",mcp_github_create_pull_request:"GitHub MCP (Remote): Create Pull Request",mcp_github_pull_request_read:"GitHub MCP (Remote): Pull Request Read",mcp_github_list_branches:"MCP GitHub List Branches",mcp_github_update_pull_request:"MCP GitHub Update Pull Request","github-mcp-server-get_file_contents":"GitHub MCP: Get File Contents","github-mcp-server-get_job_logs":"GitHub MCP: Get Job Logs","github-mcp-server-list_commits":"GitHub MCP: List Commits","github-mcp-server-search_code":"GitHub MCP: Search Code","github-mcp-server-actions_list":"GitHub MCP: Actions List","github-mcp-server-list_issues":"GitHub MCP: List Issues","github-mcp-server-search_repositories":"GitHub MCP: Search Repositories","github-mcp-server-list_branches":"GitHub MCP: List Branches","github-mcp-server-issue_read":"GitHub MCP: Issue Read","github-mcp-server-issue_write":"GitHub MCP: Issue Write","github-mcp-server-pull_request_read":"GitHub MCP: Pull Request Read","github-mcp-server-search_issues":"GitHub MCP: Search Issues","github-mcp-server-search_users":"GitHub MCP: Search Users","github-mcp-server-sub_issue_write":"GitHub MCP: Sub Issue Write","github-mcp-server-list_pull_requests":"GitHub MCP Server List Pull Requests","github-actions_get":"GitHub Actions: Get","github-actions_list":"GitHub Actions: List","github-create_pull_request":"GitHub: Create Pull Request","github-get_commit":"GitHub: Get Commit","github-get_file_contents":"GitHub: Get File Contents","github-get_job_logs":"GitHub: Get Job Logs","github-get_latest_release":"GitHub: Get Latest Release","github-get_me":"GitHub: Get Me","github-get_release_by_tag":"GitHub: Get Release By Tag","github-get_repository_tree":"GitHub: Get Repository Tree","github-get_teams":"GitHub: Get Teams","github-github_support_docs_search":"GitHub: GitHub Support Docs Search","github-issue_read":"GitHub: Issue Read","github-list_code_scanning_alerts":"GitHub: List Code Scanning Alerts","github-list_dependabot_alerts":"GitHub: List Dependabot Alerts","github-list_tags":"GitHub: List Tags","github-pull_request_read":"GitHub: Pull Request Read","github-pull_request_review_write":"GitHub: Pull Request Review Write","github-search_code":"GitHub: Search Code","github-search_pull_requests":"GitHub: Search Pull Requests","github-search_repositories":"GitHub: Search Repositories","github-update_pull_request":"GitHub: Update Pull Request","mcp_github-code-s_get_code_scanning_alert":"GitHub MCP (Code Scanning): Get Alert","mcp_github-code-s_list_code_scanning_alerts":"GitHub MCP (Code Scanning): List Alerts",mcp_com_microsoft_get_bestpractices:"GitHub MCP: Get Best Practices",mcp_microsoft_doc_microsoft_code_sample_search:"Microsoft Docs MCP: Code Sample Search",mcp_microsoft_doc_microsoft_docs_search:"Microsoft Docs MCP: Docs Search",mcp_microsoftdocs_microsoft_code_sample_search:"Microsoft Docs MCP: Code Sample Search",mcp_microsoftdocs_microsoft_docs_fetch:"Microsoft Docs MCP: Docs Fetch",mcp_microsoftdocs_microsoft_docs_search:"Microsoft Docs MCP: Docs Search",Microsoft_Learn_microsoft_docs_search:"Microsoft Learn: Docs Search","microsoft-learn-microsoft_docs_search":"Microsoft Learn: Docs Search",mcp_gitkraken_git_add_or_commit:"GitKraken MCP: Git Add or Commit",mcp_gitkraken_git_status:"GitKraken MCP: Git Status",mcp_gitkraken_git_branch:"GitKraken MCP: Git Branch",mcp_gitkraken_git_checkout:"GitKraken MCP: Git Checkout",mcp_gitkraken_git_log_or_diff:"GitKraken MCP: Git Log or Diff",mcp_gitkraken_gitkraken_workspace_list:"GitKraken MCP: List Workspaces",mcp_gitkraken_git_push:"GitKraken MCP: Git Push",mcp_gitkraken_gitlens_commit_composer:"GitKraken MCP: GitLens Commit Composer",mcp_git_git_log:"Git MCP: Git Log",mcp_git_git_show:"Git MCP: Git Show",mcp_git_git_diff_staged:"Git MCP: Git Diff Staged",mcp_pencil_batch_design:"Pencil MCP: Batch Design",mcp_pencil_get_editor_state:"Pencil MCP: Get Editor State",mcp_pencil_get_guidelines:"Pencil MCP: Get Guidelines",mcp_pencil_get_screenshot:"Pencil MCP: Get Screenshot",mcp_pencil_snapshot_layout:"Pencil MCP: Snapshot Layout",mcp_figma_get_design_context:"Figma MCP: Get Design Context",mcp_figma_get_screenshot:"Figma MCP: Get Screenshot",mcp_figma_get_variable_defs:"Figma MCP: Get Variable Defs",mcp_azure_aks:"Azure MCP: AKS",mcp_azure_mcp_azureterraformbestpractices:"Azure MCP: Azure Terraform Best Practices",mcp_azure_mcp_documentation:"Azure MCP: Documentation",mcp_azure_mcp_get_bestpractices:"Azure MCP: Get Best Practices",mcp_azure_mcp_group_list:"Azure MCP: Group List",mcp_azure_mcp_storage:"Azure MCP: Storage",mcp_azure_mcp_subscription_list:"Azure MCP: Subscription List",mcp_azure_mcp_pricing:"Azure MCP: Pricing",mcp_azure_mcp_get_azure_bestpractices:"Azure MCP: Get Azure Best Practices","azure-mcp-azureterraformbestpractices":"Azure MCP: Azure Terraform Best Practices","azure-mcp-documentation":"Azure MCP: Documentation","azure-mcp-extension_cli_generate":"Azure MCP: Extension CLI Generate","azure-mcp-get_azure_bestpractices":"Azure MCP: Get Azure Best Practices","azure-mcp-group_list":"Azure MCP: Group List","azure-mcp-subscription_list":"Azure MCP: Subscription List",mcp_bicep_format_bicep_file:"Bicep MCP: Format Bicep File",mcp_bicep_get_az_resource_type_schema:"Bicep MCP: Get Az Resource Type Schema",mcp_bicep_get_bicep_best_practices:"Bicep MCP: Get Bicep Best Practices",mcp_bicep_get_bicep_file_diagnostics:"Bicep MCP: Get Bicep File Diagnostics",mcp_bicep_list_az_resource_types_for_provider:"Bicep MCP: List Az Resource Types For Provider","azure_bicep-get_azure_verified_module":"Azure Bicep: Get Azure Verified Module","azure_development-recommend_custom_modes":"Azure Development: Recommend Custom Modes","azure_resources-query_azure_resource_graph":"Azure Resources: Query Azure Resource Graph",azureResources_getAzureActivityLog:"Azure Resources: Get Azure Activity Log","azure_auth-get_auth_context":"Azure Auth: Get Auth Context","azure_auth-set_auth_context":"Azure Auth: Set Auth Context","ms-azuretools.azure-agent":"Azure Agent",manage_todo_list:"Manage TODO List",copilot_readFile:"Read File",copilot_viewImage:"Copilot View Image",opilot_findFiles:"Find Files",copilot_writeFile:"Write File",copilot_applyPatch:"Apply Patch",copilot_findTextInFiles:"Find Text In Files",copilot_findFiles:"Find Files",copilot_replaceString:"Replace String",copilot_createFile:"Create File",copilot_listDirectory:"List Directory",copilot_fetchWebPage:"Fetch Web Page",copilot_getErrors:"Get Errors",copilot_multiReplaceString:"Multi Replace String",copilot_searchCodebase:"Search Codebase",get_terminal_output:"Get Terminal Output",run_task:"Run Task: Investigate",await_terminal:"Await Terminal command","github.copilot.editsAgent":"GitHub Copilot Edits Agent",todoList:"TODO List",terminal:"Terminal",terminal_last_command:"Terminal Last Command",github_pull_request:"GitHub Pull Request",github_repo:"GitHub Repository",editFiles:"Edit Files",listFiles:"List Files",list_issues:"List Issues",search_subagent:"Search Subagent",execution_subagent:"Execution Subagent",apply_patch:"Apply Patch",ask_questions:"Ask Questions",AskUserQuestion:"Ask User Question",ask_user_question:"Ask User Question",copilot_askQuestions:"Ask Questions",copilot_createAndRunTask:"Create And Run Task",copilot_createDirectory:"Create Directory",copilot_createNewJupyterNotebook:"Create New Jupyter Notebook",copilot_createNewWorkspace:"Create New Workspace",copilot_editFiles:"Edit Files",copilot_editNotebook:"Edit Notebook",copilot_findTestFiles:"Find Test Files",copilot_getChangedFiles:"Get Changed Files",copilot_getDocInfo:"Get Doc Info",copilot_getNotebookSummary:"Get Notebook Summary",copilot_getProjectSetupInfo:"Get Project Setup Info",copilot_getSearchResults:"Get Search Results",copilot_getVSCodeAPI:"Get VSCode API",copilot_githubRepo:"GitHub Repository",copilot_githubTextSearch:"GitHub Text Search",copilot_resolveMemoryFileUri:"Resolve Memory File URI",copilot_insertEdit:"Insert Edit",copilot_installExtension:"Install Extension",copilot_memory:"Memory",copilot_openIntegratedBrowser:"Open Integrated Browser",copilot_openSimpleBrowser:"Open Simple Browser",copilot_readNotebookCellOutput:"Read Notebook Cell Output",copilot_readProjectStructure:"Read Project Structure",copilot_runNotebookCell:"Run Notebook Cell",copilot_runInTerminal:"Run In Terminal",copilot_runTests1:"Run Tests",copilot_runVscodeCommand:"Run VSCode Command",copilot_searchWorkspaceSymbols:"Search Workspace Symbols",copilot_switchAgent:"Switch Agent",copilot_testFailure:"Test Failure",copilot_toolReplay:"Tool Replay",create_and_run_task:"Create And Run Task",create_directory:"Create Directory",create_file:"Create File",remove_file:"Remove File",create_new_jupyter_notebook:"Create New Jupyter Notebook",create_new_workspace:"Create New Workspace",create_virtual_environment:"Create Virtual Environment",edit_files:"Edit Files",edit_file:"Edit File",edit_notebook_file:"Edit Notebook File",fetch_webpage:"Fetch Webpage",file_search:"File Search",get_changed_files:"Get Changed Files",get_doc_info:"Get Doc Info",get_errors:"Get Errors",get_project_setup_info:"Get Project Setup Info",get_files_in_project:"Get Files In Project",get_projects_in_solution:"Get Projects In Solution",configure_python_environment:"Configure Python Environment",get_python_executable_details:"Get Python Executable Details",get_search_view_results:"Get Search View Results",get_task_output:"Get Task Output",get_output_window_logs:"Get Output Window Logs",job_output:"Job Output",get_vscode_api:"Get VSCode API",grep_search:"Grep Search",insert_edit_into_file:"Insert Edit Into File",install_extension:"Install Extension",install_python_packages:"Install Python Packages",list_dir:"List Dir",list_directory:"List Directory",ls:"Ls",memory:"Memory",multi_replace_string_in_file:"Multi Replace String In File",open_integrated_browser:"Open Integrated Browser",open_simple_browser:"Open Simple Browser",read_file:"Read File",view_image:"View Image",read_notebook_cell_output:"Read Notebook Cell Output",read_project_structure:"Read Project Structure",replace_string_in_file:"Replace String In File","setup.agent":"Setup Agent",selectEnvironment:"Select Environment",run_notebook_cell:"Run Notebook Cell",run_vscode_command:"Run VSCode Command",runSubagent:"Run Subagent",renderMermaidDiagram:"Render Mermaid Diagram",runTests:"Run Tests",search_workspace_symbols:"Search Workspace Symbols",semantic_search:"Semantic Search",switch_agent:"Switch Agent",terminal_selection:"Terminal Selection",test_failure:"Test Failure",test_search:"Test Search",tool_replay:"Tool Replay",tool_search:"Tool Search",vscode_askQuestions:"VSCode Ask Questions",vscode_get_confirmation:"VSCode Get Confirmation",vscode_get_confirmation_with_options:"VSCode Get Confirmation With Options",vscode_get_terminal_confirmation:"VSCode Get Terminal Confirmation",vscode_get_modified_files_confirmation:"VSCode Get Modified Files Confirmation",vscode_listCodeUsages:"VSCode List Code Usages",vscode_renameSymbol:"VSCode Rename Symbol","mcp_io_github_ups_get-library-docs":"Context7 MCP: Get Library Docs","mcp_io_github_ups_query-docs":"Context7 MCP: Query Docs","mcp_io_github_ups_resolve-library-id":"Context7 MCP: Resolve Library ID","mcp_context7_get-library-docs":"Context7 MCP: Get Library Docs","mcp_context7_query-docs":"Context7 MCP: Query Docs","mcp_context7_resolve-library-id":"Context7 MCP: Resolve Library ID",mcp_microsoft_pla_browser_evaluate:"Playwright MCP: Browser Evaluate",mcp_microsoft_pla_browser_install:"Playwright MCP: Browser Install",mcp_microsoft_pla_browser_navigate:"Playwright MCP: Browser Navigate",mcp_microsoft_pla_browser_run_code:"Playwright MCP: Browser Run Code",mcp_microsoft_pla_browser_click:"Playwright MCP: Browser Click",mcp_microsoft_pla_browser_fill_form:"Playwright MCP: Browser Fill Form",mcp_microsoft_pla_browser_press_key:"Playwright MCP: Browser Press Key",mcp_microsoft_pla_browser_resize:"Playwright MCP: Browser Resize",mcp_microsoft_pla_browser_snapshot:"Playwright MCP: Browser Snapshot",mcp_microsoft_pla_browser_tabs:"Playwright MCP: Browser Tabs",mcp_microsoft_pla_browser_take_screenshot:"Playwright MCP: Browser Take Screenshot",mcp_microsoft_pla_browser_type:"Playwright MCP: Browser Type",mcp_microsoft_pla_browser_console_messages:"MCP Microsoft Playwright Browser Console Messages",mcp_microsoft_pla_browser_wait_for:"Mcp Microsoft Pla Browser Wait For",mcp_playwright_browser_click:"Playwright MCP: Browser Click",mcp_playwright_browser_navigate:"Playwright MCP: Browser Navigate",mcp_playwright_browser_snapshot:"Playwright MCP: Browser Snapshot",mcp_playwright_browser_take_screenshot:"Playwright MCP: Browser Take Screenshot","microsoft-playwright-mcp-browser_evaluate":"Playwright MCP: Browser Evaluate","microsoft-playwright-mcp-browser_navigate":"Playwright MCP: Browser Navigate","microsoft-playwright-mcp-browser_snapshot":"Playwright MCP: Browser Snapshot",mcp_pylance_mcp_s_pylanceDocString:"Pylance MCP: Pylance Doc String",mcp_pylance_mcp_s_pylanceRunCodeSnippet:"Pylance MCP: Run Code Snippet",mcp_pylance_mcp_s_pylanceWorkspaceRoots:"Pylance MCP: Workspace Roots",mcp_pylance_mcp_s_pylanceFileSyntaxErrors:"Pylance MCP: File Syntax Errors",mcp_pylance_mcp_s_pylanceSyntaxErrors:"Pylance MCP: Syntax Errors","mcp_chrome-devtoo_click":"Chrome DevTools MCP: Click","mcp_chrome-devtoo_evaluate_script":"Chrome DevTools MCP: Evaluate Script","mcp_chrome-devtoo_fill":"Chrome DevTools MCP: Fill","mcp_chrome-devtoo_get_network_request":"Chrome DevTools MCP: Get Network Request","mcp_chrome-devtoo_list_console_messages":"Chrome DevTools MCP: List Console Messages","mcp_chrome-devtoo_list_pages":"Chrome DevTools MCP: List Pages","mcp_chrome-devtoo_navigate_page":"Chrome DevTools MCP: Navigate Page","mcp_chrome-devtoo_new_page":"Chrome DevTools MCP: New Page","mcp_chrome-devtoo_select_page":"Chrome DevTools MCP: Select Page","mcp_chrome-devtoo_take_screenshot":"Chrome DevTools MCP: Take Screenshot","mcp_chrome-devtoo_fill_form":"Chrome DevTools MCP: Fill Form","mcp_chrome-devtoo_hover":"Chrome DevTools MCP: Hover","mcp_chrome-devtoo_list_network_requests":"Chrome DevTools MCP: List Network Requests","mcp_chrome-devtoo_press_key":"Chrome DevTools MCP: Press Key","mcp_chrome-devtoo_take_snapshot":"Chrome DevTools MCP: Take Snapshot","mcp_chrome-devtoo_wait_for":"Chrome DevTools MCP: Wait For","mcp_chrome-devtoo_close_page":"Chrome DevTools MCP: Close Page","mcp_chrome-devtoo_lighthouse_audit":"Chrome DevTools MCP: Lighthouse Audit","mcp_chrome-devtoo_performance_analyze_insight":"Chrome DevTools MCP: Performance Analyze Insight","mcp_chrome-devtoo_performance_start_trace":"Chrome DevTools MCP: Performance Start Trace","mcp_chrome-devtoo_resize_page":"Chrome DevTools MCP: Resize Page","mcp_chrome-devtoo_type_text":"Chrome DevTools MCP: Type Text",mcp_chrome_devtoo_click:"Chrome DevTools MCP: Click",mcp_chrome_devtoo_evaluate_script:"Chrome DevTools MCP: Evaluate Script",mcp_chrome_devtoo_fill:"Chrome DevTools MCP: Fill",mcp_chrome_devtoo_get_console_message:"Chrome DevTools MCP: Get Console Message",mcp_chrome_devtoo_get_network_request:"Chrome DevTools MCP: Get Network Request",mcp_chrome_devtoo_list_console_messages:"Chrome DevTools MCP: List Console Messages",mcp_chrome_devtoo_list_network_requests:"Chrome DevTools MCP: List Network Requests",mcp_chrome_devtoo_list_pages:"Chrome DevTools MCP: List Pages",mcp_chrome_devtoo_navigate_page:"Chrome DevTools MCP: Navigate Page",mcp_chrome_devtoo_new_page:"Chrome DevTools MCP: New Page",mcp_chrome_devtoo_take_snapshot:"Chrome DevTools MCP: Take Snapshot",mcp_chrome_devtoo_wait_for:"Chrome DevTools MCP: Wait For",mcp_io_github_chr_click:"Chrome DevTools MCP: Click",mcp_io_github_chr_emulate:"Chrome DevTools MCP: Emulate",mcp_io_github_chr_evaluate_script:"Chrome DevTools MCP: Evaluate Script",mcp_io_github_chr_list_network_requests:"Chrome DevTools MCP: List Network Requests",mcp_io_github_chr_list_pages:"Chrome DevTools MCP: List Pages",mcp_io_github_chr_navigate_page:"Chrome DevTools MCP: Navigate Page",mcp_io_github_chr_new_page:"Chrome DevTools MCP: New Page",mcp_io_github_chr_resize_page:"Chrome DevTools MCP: Resize Page",mcp_io_github_chr_select_page:"Chrome DevTools MCP: Select Page",mcp_io_github_chr_take_snapshot:"Chrome DevTools MCP: Take Snapshot",mcp_oraios_serena_activate_project:"Serena: Activate Project",mcp_oraios_serena_check_onboarding_performed:"Serena: Check Onboarding Performed",mcp_oraios_serena_create_text_file:"Serena: Create Text File",mcp_oraios_serena_delete_lines:"Serena: Delete Lines",mcp_oraios_serena_delete_memory:"Serena: Delete Memory",mcp_oraios_serena_edit_memory:"Serena: Edit Memory",mcp_oraios_serena_execute_shell_command:"Serena: Execute Shell Command",mcp_oraios_serena_find_file:"Serena: Find File",mcp_oraios_serena_find_referencing_symbols:"Serena: Find Referencing Symbols",mcp_oraios_serena_find_symbol:"Serena: Find Symbol",mcp_oraios_serena_get_current_config:"Serena: Get Current Config",mcp_oraios_serena_get_symbols_overview:"Serena: Get Symbols Overview",mcp_oraios_serena_initial_instructions:"Serena: Initial Instructions",mcp_oraios_serena_insert_after_symbol:"Serena: Insert After Symbol",mcp_oraios_serena_insert_at_line:"Serena: Insert At Line",mcp_oraios_serena_insert_before_symbol:"Serena: Insert Before Symbol",mcp_oraios_serena_jet_brains_find_referencing_symbols:"Serena: JetBrains Find Referencing Symbols",mcp_oraios_serena_jet_brains_find_symbol:"Serena: JetBrains Find Symbol",mcp_oraios_serena_jet_brains_get_symbols_overview:"Serena: JetBrains Get Symbols Overview",mcp_oraios_serena_jet_brains_type_hierarchy:"Serena: JetBrains Type Hierarchy",mcp_oraios_serena_list_dir:"Serena: List Dir",mcp_oraios_serena_list_memories:"Serena: List Memories",mcp_oraios_serena_onboarding:"Serena: Onboarding",mcp_oraios_serena_open_dashboard:"Serena: Open Dashboard",mcp_oraios_serena_prepare_for_new_conversation:"Serena: Prepare For New Conversation",mcp_oraios_serena_read_file:"Serena: Read File",mcp_oraios_serena_read_memory:"Serena: Read Memory",mcp_oraios_serena_remove_project:"Serena: Remove Project",mcp_oraios_serena_rename_symbol:"Serena: Rename Symbol",mcp_oraios_serena_replace_content:"Serena: Replace Content",mcp_oraios_serena_replace_lines:"Serena: Replace Lines",mcp_oraios_serena_replace_symbol_body:"Serena: Replace Symbol Body",mcp_oraios_serena_restart_language_server:"Serena: Restart Language Server",mcp_oraios_serena_search_for_pattern:"Serena: Search For Pattern",mcp_oraios_serena_summarize_changes:"Serena: Summarize Changes",mcp_oraios_serena_switch_modes:"Serena: Switch Modes",mcp_oraios_serena_think_about_collected_information:"Serena: Think About Collected Information",mcp_oraios_serena_think_about_task_adherence:"Serena: Think About Task Adherence",mcp_oraios_serena_think_about_whether_you_are_done:"Serena: Think About Whether You Are Done",mcp_oraios_serena_write_memory:"Serena: Write Memory","mcp_visuals-mcp_display_image":"Visuals MCP: Display Image","mcp_laravel-boost_tinker":"Laravel Boost MCP: Tinker",bash:"Bash",Bash:"Bash",code_search:"Code Search",detect_memories:"Detect Memories",dismiss_deployment_notifications:"Dismiss Deployment Notifications",get_currentfile:"Get Current File",get_file:"Get File",get_symbols_by_name:"Get Symbols By Name","claude-code":"Claude Code","copilot-cloud-agent":"Copilot Cloud Agent",agent:"Agent",copilotcli:"Copilot CLI","github.copilot.default":"GitHub Copilot Default","github.copilot.workspace":"GitHub Copilot Workspace","github.copilot.vscode":"GitHub Copilot VSCode","github.copilot-dynamic.platform":"GitHub Copilot Dynamic: Platform",glob:"Glob",file_glob_search:"File Glob Search",grep:"Grep",kill_terminal:"Kill Terminal",read:"Read",view:"View",vscode_editFile_internal:"VSCode Edit File (Internal)",vscode_fetchWebPage_internal:"VSCode Fetch Web Page (Internal)",vscode_searchExtensions_internal:"VSCode Search Extensions (Internal)","vscode-websearchforcopilot_webSearch":"VSCode WebSearch for Copilot: Web Search",Build_CMakeTools:"CMake Tools: Build",ListBuildTargets_CMakeTools:"CMake Tools: List Build Targets",ListTests_CMakeTools:"CMake Tools: List Tests",RunCtest_CMakeTools:"CMake Tools: Run CTest","nuget_get-nuget-solver":"NuGet: Get NuGet Solver",webfetch:"Web Fetch",web_fetch:"Web Fetch",write:"Write",edit:"Edit",search_replace:"Search Replace",write_file:"Write File",multiedit:"Multi Edit",question:"Question",skill:"Skill",read_skill:"Read Skill",task:"Task",todowrite:"Todo Write",TodoWrite:"Todo Write",todos:"Todos",todo:"Todo",websearch:"Web Search",WebSearch:"Web Search",click_element:"Click Element",navigate_page:"Navigate Page",open_browser_page:"Open Browser Page",read_page:"Read Page",run_playwright_code:"Run Playwright Code",screenshot_page:"Screenshot Page",type_in_page:"Type in Page",task_complete:"Task Complete","pdf-utilities.pdf":"PDF Utilities: PDF","container-tools_get-config":"Container Tools: Get Config","github-pull-request_activePullRequest":"GitHub Pull Request: Active Pull Request","github-pull-request_currentActivePullRequest":"GitHub Pull Request: Current Active Pull Request","github-pull-request_issue_fetch":"GitHub Pull Request: Issue Fetch","github-pull-request_pullRequestStatusChecks":"GitHub Pull Request: Pull Request Status Checks","mcp_powerbi-model_connection_operations":"Power BI MCP: Connection Operations",MiniMax_web_search:"MiniMax: Web Search",dingDocuments_get_document_content:"Ding Documents: Get Document Content",dingDocuments_list_nodes:"Ding Documents: List Nodes",dingDocuments_search_documents:"Ding Documents: Search Documents",fetch_fetch:"Fetch: Fetch",mcp__Claude_in_Chrome__computer:"Claude in Chrome MCP: Computer",mcp__Claude_in_Chrome__navigate:"Claude in Chrome MCP: Navigate",mcp__Claude_in_Chrome__browser_batch:"Claude in Chrome MCP: Browser Batch",mcp__Claude_in_Chrome__get_page_text:"Claude in Chrome MCP: Get Page Text",mcp__Claude_in_Chrome__tabs_context_mcp:"Claude in Chrome MCP: Tabs Context",mcp__Claude_in_Chrome__tabs_create_mcp:"Claude in Chrome MCP: Tabs Create",mcp__Claude_in_Chrome__javascript_tool:"Claude in Chrome MCP: Javascript Tool",mcp__Claude_in_Chrome__read_console_messages:"Claude in Chrome MCP: Read Console Messages",mcp__Claude_in_Chrome__read_network_requests:"Claude in Chrome MCP: Read Network Requests",mcp__cowork__allow_cowork_file_delete:"Cowork MCP: Allow Cowork File Delete",mcp__cowork__present_files:"Cowork MCP: Present Files",mcp__cowork__request_cowork_directory:"Cowork MCP: Request Cowork Directory","mcp__cowork-onboarding__show_onboarding_role_picker":"Cowork Onboarding MCP: Show Onboarding Role Picker",mcp__plugins__search_plugins:"Plugins MCP: Search Plugins",mcp__plugins__suggest_plugin_install:"Plugins MCP: Suggest Plugin Install",mcp__workspace__bash:"Workspace MCP: Bash",mcp__workspace__web_fetch:"Workspace MCP: Web Fetch","mcp__mcp-registry__search_mcp_registry":"MCP Registry: Search MCP Registry",Agent:"Agent",Edit:"Edit",Glob:"Glob",Grep:"Grep",NotebookEdit:"Notebook Edit",Read:"Read",Skill:"Skill",TaskCreate:"Task Create",TaskUpdate:"Task Update",ToolSearch:"Tool Search",Write:"Write","mcp__claude_ai_Context7__resolve-library-id":"Context7 MCP (Claude): Resolve Library ID",mcp__claude_ai_Excalidraw__create_view:"Excalidraw MCP (Claude): Create View",mcp__claude_ai_Excalidraw__read_me:"Excalidraw MCP (Claude): Read Me","mcp__claude_ai_Notion__notion-create-pages":"Notion MCP (Claude): Create Pages","mcp__claude_ai_Notion__notion-fetch":"Notion MCP (Claude): Fetch","mcp__claude_ai_Notion__notion-search":"Notion MCP (Claude): Search","mcp__claude_ai_Notion__notion-update-page":"Notion MCP (Claude): Update Page","mcp__context7__query-docs":"Context7 MCP: Query Docs","mcp__context7__resolve-library-id":"Context7 MCP: Resolve Library ID","mcp__databricks-sql-allscopes__authenticate":"Databricks SQL MCP: Authenticate","mcp__databricks-sql-allscopes__complete_authentication":"Databricks SQL MCP: Complete Authentication","mcp__databricks-sql__authenticate":"Databricks SQL MCP: Authenticate",mcp__playwright__browser_evaluate:"Playwright MCP: Browser Evaluate",mcp__playwright__browser_navigate:"Playwright MCP: Browser Navigate","mcp__plugin_context7_context7__query-docs":"Context7 MCP: Query Docs","mcp__plugin_context7_context7__resolve-library-id":"Context7 MCP: Resolve Library ID","mcp__shopify-dev-mcp__learn_shopify_api":"Shopify Dev MCP: Learn Shopify API","mcp__shopify-dev-mcp__search_docs_chunks":"Shopify Dev MCP: Search Docs Chunks","mcp__shopify-dev-mcp__validate_graphql_codeblocks":"Shopify Dev MCP: Validate GraphQL Codeblocks",invalid:"Invalid",rename_session:"Rename Session",update_topic:"Update Topic",rename_branch:"Rename Branch",report_intent:"Report Intent",create_pull_request:"Create Pull Request",update_pull_request:"Update Pull Request",powershell:"PowerShell",ask_user:"Ask User",sql:"SQL",show_file:"Show File",exit_plan_mode:"Exit Plan Mode",get_changes_overview:"Get Changes Overview",annotate_diff_line:"Annotate Diff",add_pr_review_comment:"Add PR Review Comment",remove_pr_review_comment:"Remove PR Review Comment",reply_to_comment:"Reply to Comment",open_pr_session:"Open PR Session",open_issue_session:"Open Issue Session",create_session:"Create Session",list_sessions_and_chats:"List Sessions & Chats",list_projects:"List Projects",get_session:"Get Session",navigate_to:"Navigate To",delete_item:"Delete Item",send_session_message:"Send Session Message",send_chat_message:"Send Chat Message",read_agent:"Read Agent",write_agent:"Write Agent",list_agents:"List Agents",discover_widgets:"Discover Widgets",render_widget:"Render Widget",clear_widget:"Clear Widget",extensions_manage:"Extensions Manage",extensions_reload:"Extensions Reload",create:"Create",fetch_copilot_cli_documentation:"Fetch Copilot CLI Documentation",generate_findings:"Generate Findings",generate_topics:"Generate Topics",list_bash:"List Bash",read_bash:"Read Bash",write_bash:"Write Bash",stop_bash:"Stop Bash",list_powershell:"List PowerShell",read_powershell:"Read PowerShell",render_widget_inbox:"Render Widget Inbox",rg:"Ripgrep",stop_powershell:"Stop PowerShell",store_memory:"Store Memory",web_search:"Web Search",write_powershell:"Write PowerShell",slidev_chooseEntry:"Slidev: Choose Entry",slidev_getPreviewPort:"Slidev: Get Preview Port",clarify_requirements:"Clarify Requirements",get_tests:"Get Tests","ide-get_diagnostics":"IDE: Get Diagnostics","ide-get_selection":"IDE: Get Selection",plan:"Plan",signal_plan_ready:"Signal Plan Ready",update_plan_progress:"Update Plan Progress",EnterPlanMode:"Enter Plan Mode",ExitPlanMode:"Exit Plan Mode",mcp_reload:"MCP: Reload",mcp_validate:"MCP: Validate",stop_agent:"Stop Agent","workiq-accept_eula":"WorkIQ: Accept EULA","workiq-ask_work_iq":"WorkIQ: Ask Work IQ","mcp_ado-remote-mc_core_list_projects":"Azure DevOps MCP: Core List Projects","mcp_ado-remote-mc_repo_branch":"Azure DevOps MCP: Repo Branch","mcp_ado-remote-mc_repo_pull_request":"Azure DevOps MCP: Repo Pull Request","mcp_ado-remote-mc_repo_pull_request_thread":"Azure DevOps MCP: Repo Pull Request Thread","mcp_ado-remote-mc_repo_pull_request_write":"Azure DevOps MCP: Repo Pull Request Write","mcp_ado-remote-mc_repo_repository":"Azure DevOps MCP: Repo Repository","mcp_ado-remote-mc_search_workitem":"Azure DevOps MCP: Search Work Item","mcp_ado-remote-mc_wit_get_work_item":"Azure DevOps MCP: Get Work Item","mcp_ado-remote-mc_wit_work_item":"Azure DevOps MCP: Work Item","mcp_ado-remote-mc_wit_work_item_comment_write":"Azure DevOps MCP: Work Item Comment Write","mcp_ado-remote-mc_wit_work_item_link_write":"Azure DevOps MCP: Work Item Link Write","mcp_ado-remote-mc_wit_work_item_write":"Azure DevOps MCP: Work Item Write",mssql_list_servers:"MSSQL: List Servers",add_loaded_assembly:"Add Loaded Assembly",analyze_symbol:"Analyze Symbol",search_decompiled_symbols:"Search Decompiled Symbols",get_classification_rubric:"Get Classification Rubric",get_weather:"Get Weather",mcp_azure_mcp_search:"Azure MCP: Search",mcp_gitnexus_context:"GitNexus MCP: Context",mcp_gitnexus_cypher:"GitNexus MCP: Cypher",mcp_gitnexus_detect_changes:"GitNexus MCP: Detect Changes",mcp_gitnexus_impact:"GitNexus MCP: Impact",mcp_gitnexus_list_repos:"GitNexus MCP: List Repos",mcp_gitnexus_query:"GitNexus MCP: Query",slidev_getSlideContent:"Slidev: Get Slide Content",mcp__GitLab__get_mcp_server_version:"GitLab MCP: Get MCP Server Version",mcp__plugin_figma_figma__get_design_context:"Figma MCP: Get Design Context",mcp__plugin_figma_figma__get_metadata:"Figma MCP: Get Metadata",mcp__plugin_figma_figma__get_screenshot:"Figma MCP: Get Screenshot",mcp_io_github_tav_tavily_extract:"MCP Io GitHub Tavily Extract",mcp_io_github_tav_tavily_search:"MCP Io GitHub Tavily Search",browser_wait_for:"Browser Wait For",copilot_sessionStoreSql:"Copilot Session Store Sql",explore_subagent:"Explore Subagent","github.copilot.terminalPanel":"Github Copilot Terminal Panel",handle_dialog:"Handle Dialog",run_subagent:"Run Subagent",testFailure:"Test Failure","mcp_angular-cli_get_best_practices":"Angular MCP: Get Best Practices","mcp_angular-cli_list_projects":"Angular MCP: Get Project List"};var sl=.2,ol=21e3,nl=.3,tn=Qa.estimators,Zt=Xa.pricing,id=Za,rd=i=>{},il=i=>{},ad=(i,e)=>console.error(D.red(i),e||"");function ld(){let i=ls.file(__dirname);return new ko(i)}function cd(){let i=ls.file(__dirname);return new So(i)}function ud(){return new vo}function dd(){return new No}function pd(){return new Go}function md(){return new $o}function hd(){return new qo}function fd(){return new Ho}var gd=ld(),yd=cd(),_d=ud(),bd=dd(),Cd=pd(),kd=md(),wd=hd(),Sd=fd(),sn=[new Os(gd),new Fs(yd),new Ls(bd,(i,e)=>K(i,e??"gpt-4",tn)),new Ns(_d),new Gs(kd,nt,it,(i,e)=>K(i,e??"gpt-4",tn)),new js(Cd),new $s(wd),new qs(Sd),new Ws,new Js,new Rs];function rl(){return new yo({log:rd,warn:il,error:ad,ecosystems:sn})}async function Ce(){return rl().getCopilotSessionFiles()}async function on(i){let e=new Set,t=Fe.join(tl.homedir(),".claude","projects");for(let o of i){if(o.startsWith(t+Fe.sep)||o.startsWith(t+"/")){try{let p=(await rt.promises.readFile(o,"utf-8")).split(`
58
58
  `).slice(0,30);for(let m of p)if(m.trim())try{let h=JSON.parse(m);if(h.cwd&&typeof h.cwd=="string"){e.add(h.cwd);break}}catch{}}catch{}continue}let n=Fe.dirname(o);if(Fe.basename(n)!=="chatSessions")continue;let a=Fe.dirname(n),u=Fe.join(a,"workspace.json");try{if(!rt.existsSync(u))continue;let p=JSON.parse(await rt.promises.readFile(u,"utf-8")).folder;if(!p||!p.startsWith("file://"))continue;let m=decodeURIComponent(p.replace(/^file:\/\//,""));/^\/[A-Za-z]:/.test(m)&&(m=m.slice(1)),e.add(m)}catch{}}if(e.size===0)return;let s=0;for(let o of e)try{let n=rt.existsSync(Fe.join(o,".github","copilot-instructions.md")),a=rt.existsSync(Fe.join(o,"agents.md")),u=rt.existsSync(Fe.join(o,"CLAUDE.md"));!n&&!a&&!u&&s++}catch{s++}return{customizationTypes:[],workspaces:[],totalWorkspaces:e.size,workspacesWithIssues:s}}function nn(){return rl().getDiagnosticCandidatePaths()}function vd(i,e){return K(i,e||"gpt-4",tn)}function Td(i){return It(i,Zt)}async function al(i){let e=sn.find(t=>t.handles(i));return e?e.stat(i):rt.promises.stat(i)}function el(i){let e=i.toLowerCase().replace(/\\/g,"/");return e.includes("/cursor/")?"cursor":e.includes("/code - insiders/")?"vscode-insiders":e.includes("/code - exploration/")?"vscode-exploration":e.includes("/vscodium/")?"vscodium":e.includes("/.copilot/")?"copilot-cli":e.includes("/.crush/crush.db#")?"crush":e.includes("/opencode/")?"opencode":e.includes("/local-agent-mode-sessions/")?"claude-desktop-cowork":e.includes("/.claude/projects/")?"claude-code":e.includes("/.vibe/logs/session/")?"mistral-vibe":e.includes("/.gemini/tmp/")&&e.includes("/chats/session-")&&e.endsWith(".jsonl")?"gemini-cli":e.includes(".vscode-server")?"vscode-remote":e.includes("/.vs/")&&e.includes("/copilot-chat/")?"Visual Studio":"vscode"}async function ll(i,e,t=20){if(i.length===0)return[];let s=new Array(i.length),o=0,n=Array.from({length:Math.min(t,i.length)},async()=>{for(;o<i.length;){let a=o++;try{s[a]=await e(i[a],a)}catch{s[a]=void 0}}});return await Promise.all(n),s}function wt(i){return i.actualTokens>0?i.actualTokens:i.tokens}async function fs(i){try{let e=await al(i),t=Ya(i,e.mtimeMs,e.size);if(t)return t;let s=sn.find(C=>C.handles(i));if(s){let[C,w,v]=await Promise.all([s.getTokens(i),s.countInteractions(i),s.getModelUsage(i)]),y=e.mtime.toISOString().slice(0,10),b={file:i,tokens:C.actualTokens>0?C.actualTokens:C.tokens,thinkingTokens:C.thinkingTokens,actualTokens:C.actualTokens,interactions:w,modelUsage:v,lastModified:e.mtime,editorSource:el(i),dailyFractions:await s.getDailyFractions?.(i)??{[y]:1}};return Ui(i,e.mtimeMs,e.size,b),b}let o=await rt.promises.readFile(i,"utf-8");if(!o.trim())return null;let n=i.endsWith(".jsonl")||yt(o),a=0,u=0,c=0,p=0,m={};if(n){let C=Bo(o);a=C.actualTokens>0?C.actualTokens:C.tokens,u=C.thinkingTokens,c=C.actualTokens,m=C.modelUsage;let w=o.trim().split(`
59
- `);for(let v of w)try{let y=JSON.parse(v);(y.type==="user.message"||y.kind===2&&y.k?.[0]==="requests")&&p++}catch{}}else{let C=Ba(i,o,vd,Td);a=C.tokens,u=C.thinkingTokens,c=C.actualTokens,p=C.interactions,m=C.modelUsage}let h=za(o,n,e.mtime),g={file:i,tokens:a,thinkingTokens:u,actualTokens:c,interactions:p,modelUsage:m,lastModified:e.mtime,editorSource:el(i),dailyFractions:h};return Ui(i,e.mtimeMs,e.size,g),g}catch{return null}}async function Rt(i,e){let t=new Date,s=t.toISOString().slice(0,10),o=t.getUTCFullYear(),n=t.getUTCMonth(),a=`${o}-${String(n+1).padStart(2,"0")}-01`,p=`${n===0?o-1:o}-${String(n===0?12:n).padStart(2,"0")}-01`,h=new Date(Date.UTC(o,n,t.getUTCDate()-30)).toISOString().slice(0,10),g={today:Xo(),month:Xo(),lastMonth:Xo(),last30Days:Xo()},C=0,w=await ll(i,async v=>{let y=await fs(v);return e&&e(++C,i.length),y});for(let v of w){if(!v||v.tokens===0||!Object.keys(v.dailyFractions).some(P=>P>=p))continue;let b=0,_=0,T=0,S=0;for(let[P,A]of Object.entries(v.dailyFractions))P===s&&(b+=A),P>=a&&(_+=A),P>=p&&P<a&&(T+=A),P>=h&&(S+=A);b>0&&Zo(g.today,v,b),_>0&&Zo(g.month,v,_),T>0&&Zo(g.lastMonth,v,T),S>0&&Zo(g.last30Days,v,S)}for(let v of Object.values(g))v.sessions>0&&(v.avgTokensPerSession=Math.round(v.tokens/v.sessions)),v.co2=v.tokens/1e3*sl,v.treesEquivalent=v.co2/ol,v.waterUsage=v.tokens/1e3*nl,v.estimatedCost=zo(v.modelUsage,Zt),v.estimatedCostCopilot=zo(v.modelUsage,Zt,"copilot");return{...g,lastUpdated:t}}function Xo(){return{tokens:0,thinkingTokens:0,estimatedTokens:0,actualTokens:0,sessions:0,avgInteractionsPerSession:0,avgTokensPerSession:0,modelUsage:{},editorUsage:{},co2:0,treesEquivalent:0,waterUsage:0,estimatedCost:0}}function Zo(i,e,t){let s=Math.round(wt(e)*t),o=Math.round(e.thinkingTokens*t),n=Math.round(e.actualTokens*t);i.tokens+=s,i.thinkingTokens+=o,i.estimatedTokens+=Math.round(e.tokens*t),i.actualTokens+=n,i.sessions++;for(let[c,p]of Object.entries(e.modelUsage))i.modelUsage[c]||(i.modelUsage[c]={inputTokens:0,outputTokens:0}),i.modelUsage[c].inputTokens+=Math.round(p.inputTokens*t),i.modelUsage[c].outputTokens+=Math.round(p.outputTokens*t);let a=Math.round(e.interactions*t),u=i.avgInteractionsPerSession*(i.sessions-1)+a;i.avgInteractionsPerSession=i.sessions>0?u/i.sessions:0,i.editorUsage[e.editorSource]||(i.editorUsage[e.editorSource]={tokens:0,sessions:0}),i.editorUsage[e.editorSource].tokens+=s,i.editorUsage[e.editorSource].sessions++}async function gs(i){let e={warn:il,tokenEstimators:tn,modelPricing:Zt,toolNameMap:id,ecosystems:sn},t=new Date,s=new Date(t.getFullYear(),t.getMonth(),t.getDate()),o=new Date(t.getFullYear(),t.getMonth(),t.getDate()-30),n=new Date(t.getFullYear(),t.getMonth(),1),a=Oi(),u=Oi(),c=Oi();for(let p of i)try{let h=(await al(p)).mtime;if(h<o)continue;let g=await Ea(e,p);h>=o&&(Ko(u,g),u.sessions++),h>=n&&(Ko(c,g),c.sessions++),h>=s&&(Ko(a,g),a.sessions++)}catch{}return{today:a,last30Days:u,month:c,lastUpdated:t}}function Oi(){return{sessions:0,toolCalls:{total:0,byTool:{}},modeUsage:{ask:0,edit:0,agent:0,plan:0,customAgent:0,cli:0},contextReferences:be(),mcpTools:{total:0,byServer:{},byTool:{}},modelSwitching:{modelsPerSession:[],totalSessions:0,averageModelsPerSession:0,maxModelsPerSession:0,minModelsPerSession:0,switchingFrequency:0,standardModels:[],premiumModels:[],unknownModels:[],mixedTierSessions:0,standardRequests:0,premiumRequests:0,unknownRequests:0,totalRequests:0},repositories:[],repositoriesWithCustomization:[],editScope:{singleFileEdits:0,multiFileEdits:0,totalEditedFiles:0,avgFilesPerSession:0},applyUsage:{totalApplies:0,totalCodeBlocks:0,applyRate:0},sessionDuration:{totalDurationMs:0,avgDurationMs:0,avgFirstProgressMs:0,avgTotalElapsedMs:0,avgWaitTimeMs:0},conversationPatterns:{multiTurnSessions:0,singleTurnSessions:0,avgTurnsPerSession:0,maxTurnsInSession:0},agentTypes:{editsAgent:0,defaultAgent:0,workspaceAgent:0,other:0}}}async function rn(i){let e=new Date,t=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()-30)),s=t.toISOString().slice(0,10),o=e.toISOString().slice(0,10),n=new Map,a=new Date(t);for(;a.toISOString().slice(0,10)<=o;){let h=a.toISOString().slice(0,10);n.set(h,{tokens:0,sessions:0,modelUsage:{},editorUsage:{}}),a.setUTCDate(a.getUTCDate()+1)}let u=new Map,c=await ll(i,async h=>fs(h));for(let h of c){if(!h||h.tokens===0||h.interactions===0)continue;let g=wt(h);for(let[C,w]of Object.entries(h.dailyFractions)){let v=Math.round(g*w),y=n.get(C);if(y){y.tokens+=v,y.sessions++;for(let[S,P]of Object.entries(h.modelUsage))y.modelUsage[S]||(y.modelUsage[S]={inputTokens:0,outputTokens:0}),y.modelUsage[S].inputTokens+=Math.round(P.inputTokens*w),y.modelUsage[S].outputTokens+=Math.round(P.outputTokens*w);let T=h.editorSource;y.editorUsage[T]||(y.editorUsage[T]={tokens:0,sessions:0}),y.editorUsage[T].tokens+=v,y.editorUsage[T].sessions++}u.has(C)||u.set(C,{tokens:0,sessions:0,modelUsage:{},editorUsage:{}});let b=u.get(C);b.tokens+=v,b.sessions++;for(let[T,S]of Object.entries(h.modelUsage))b.modelUsage[T]||(b.modelUsage[T]={inputTokens:0,outputTokens:0}),b.modelUsage[T].inputTokens+=Math.round(S.inputTokens*w),b.modelUsage[T].outputTokens+=Math.round(S.outputTokens*w);let _=h.editorSource;b.editorUsage[_]||(b.editorUsage[_]={tokens:0,sessions:0}),b.editorUsage[_].tokens+=v,b.editorUsage[_].sessions++}}let p=Array.from(n.keys()).sort(),m=p.map(h=>n.get(h));return{labels:p,days:m,allDaysMap:u}}var en=[{bg:"rgba(54, 162, 235, 0.6)",border:"rgba(54, 162, 235, 1)"},{bg:"rgba(255, 99, 132, 0.6)",border:"rgba(255, 99, 132, 1)"},{bg:"rgba(75, 192, 192, 0.6)",border:"rgba(75, 192, 192, 1)"},{bg:"rgba(153, 102, 255, 0.6)",border:"rgba(153, 102, 255, 1)"},{bg:"rgba(255, 159, 64, 0.6)",border:"rgba(255, 159, 64, 1)"},{bg:"rgba(255, 205, 86, 0.6)",border:"rgba(255, 205, 86, 1)"},{bg:"rgba(201, 203, 207, 0.6)",border:"rgba(201, 203, 207, 1)"},{bg:"rgba(100, 181, 246, 0.6)",border:"rgba(100, 181, 246, 1)"}];function an(i,e,t){let s=P=>`${P.getFullYear()}-${String(P.getMonth()+1).padStart(2,"0")}-${String(P.getDate()).padStart(2,"0")}`,o=P=>{let A=P.map(Q=>Q.entry),U=P.map(Q=>Q.label),O=A.map(Q=>Q.tokens),$=A.map(Q=>Q.sessions),q=new Set;A.forEach(Q=>Object.keys(Q.modelUsage).forEach(Z=>q.add(Z)));let ve=Array.from(q).map((Q,Z)=>{let me=en[Z%en.length];return{label:Q,data:A.map(at=>{let Xe=at.modelUsage[Q];return Xe?Xe.inputTokens+Xe.outputTokens:0}),backgroundColor:me.bg,borderColor:me.border,borderWidth:1}}),_e=new Set;A.forEach(Q=>Object.keys(Q.editorUsage).forEach(Z=>_e.add(Z)));let J=Array.from(_e).map((Q,Z)=>{let me=en[Z%en.length];return{label:Q,data:A.map(at=>at.editorUsage[Q]?.tokens||0),backgroundColor:me.bg,borderColor:me.border,borderWidth:1}}),He=O.reduce((Q,Z)=>Q+Z,0),Ne=$.reduce((Q,Z)=>Q+Z,0),Te=P.length,Ve=A.map(Q=>zo(Q.modelUsage,Zt)),Re=Ve.reduce((Q,Z)=>Q+Z,0),fe=Te>0?Re/Te:0;return{labels:U,tokensData:O,sessionsData:$,modelDatasets:ve,editorDatasets:J,repositoryDatasets:[],periodCount:Te,totalTokens:He,totalSessions:Ne,avgPerPeriod:Te>0?Math.round(He/Te):0,costData:Ve,totalCost:Re,avgCostPerPeriod:fe}},n=(P,A)=>{P.tokens+=A.tokens,P.sessions+=A.sessions;for(let[U,O]of Object.entries(A.modelUsage))P.modelUsage[U]||(P.modelUsage[U]={inputTokens:0,outputTokens:0}),P.modelUsage[U].inputTokens+=O.inputTokens,P.modelUsage[U].outputTokens+=O.outputTokens;for(let[U,O]of Object.entries(A.editorUsage))P.editorUsage[U]||(P.editorUsage[U]={tokens:0,sessions:0}),P.editorUsage[U].tokens+=O.tokens,P.editorUsage[U].sessions+=O.sessions},a=()=>({tokens:0,sessions:0,modelUsage:{},editorUsage:{}}),u=new Date,c=i.map((P,A)=>({label:P,entry:e[A]})),p=o(c),m=P=>{let A=new Date(P);A.setHours(0,0,0,0);let U=A.getDay();return A.setDate(A.getDate()-(U===0?6:U-1)),A},h=P=>{let A=new Date(P);return A.setDate(P.getDate()+6),P.getMonth()===A.getMonth()?`${P.toLocaleDateString("en-US",{month:"short"})} ${P.getDate()}\u2013${A.getDate()}`:`${P.toLocaleDateString("en-US",{month:"short",day:"numeric"})}\u2013${A.toLocaleDateString("en-US",{month:"short",day:"numeric"})}`},g=m(u),C=new Map;for(let P=5;P>=0;P--){let A=new Date(g);A.setDate(g.getDate()-P*7);let U=s(A);C.set(U,{label:h(A),entry:a()})}let w=t||new Map(i.map((P,A)=>[P,e[A]]));for(let[P,A]of w.entries()){let U=m(new Date(P+"T00:00:00")),O=C.get(s(U));O&&n(O.entry,A)}let v=Array.from(C.values()),y=o(v),b=new Map;for(let P=11;P>=0;P--){let A=new Date(u.getFullYear(),u.getMonth()-P,1),U=`${A.getFullYear()}-${String(A.getMonth()+1).padStart(2,"0")}`,O=A.toLocaleDateString("en-US",{month:"short",year:"numeric"});b.set(U,{label:O,entry:a()})}for(let[P,A]of w.entries()){let U=P.slice(0,7),O=b.get(U);O&&n(O.entry,A)}let _=Array.from(b.values()),T=o(_),S={};return e.forEach(P=>{Object.entries(P.editorUsage).forEach(([A,U])=>{S[A]=(S[A]||0)+U.tokens})}),{labels:p.labels,tokensData:p.tokensData,sessionsData:p.sessionsData,modelDatasets:p.modelDatasets,editorDatasets:p.editorDatasets,editorTotalsMap:S,repositoryDatasets:[],repositoryTotalsMap:{},dailyCount:p.periodCount,totalTokens:p.totalTokens,avgTokensPerDay:p.periodCount>0?Math.round(p.totalTokens/p.periodCount):0,totalSessions:p.totalSessions,lastUpdated:new Date().toISOString(),backendConfigured:!1,periodsReady:!0,periods:{day:p,week:y,month:T}}}function se(i){return i.toLocaleString("en-US")}function he(i){return i>=1e6?`${(i/1e6).toFixed(1)}M`:i>=1e3?`${(i/1e3).toFixed(1)}K`:i.toString()}var Ot={CO2_PER_1K_TOKENS:sl,CO2_ABSORPTION_PER_TREE_PER_YEAR:ol,WATER_USAGE_PER_1K_TOKENS:nl,CO2_PER_KM_DRIVING:120,CO2_PER_PHONE_CHARGE:8.22,WATER_PER_COFFEE_CUP:140,CO2_PER_LED_HOUR:20};var cl=new ye("stats").description("Show overview of discovered session files, sessions, chat turns, and tokens").option("-v, --verbose","Show detailed per-folder breakdown").option("--json","Output raw JSON (for machine consumption)").action(async i=>{if(i.json||console.log(D.bold.cyan(`
59
+ `);for(let v of w)try{let y=JSON.parse(v);(y.type==="user.message"||y.kind===2&&y.k?.[0]==="requests")&&p++}catch{}}else{let C=Ba(i,o,vd,Td);a=C.tokens,u=C.thinkingTokens,c=C.actualTokens,p=C.interactions,m=C.modelUsage}let h=za(o,n,e.mtime),g={file:i,tokens:a,thinkingTokens:u,actualTokens:c,interactions:p,modelUsage:m,lastModified:e.mtime,editorSource:el(i),dailyFractions:h};return Ui(i,e.mtimeMs,e.size,g),g}catch{return null}}async function Rt(i,e){let t=new Date,s=t.toISOString().slice(0,10),o=t.getUTCFullYear(),n=t.getUTCMonth(),a=`${o}-${String(n+1).padStart(2,"0")}-01`,p=`${n===0?o-1:o}-${String(n===0?12:n).padStart(2,"0")}-01`,h=new Date(Date.UTC(o,n,t.getUTCDate()-30)).toISOString().slice(0,10),g={today:Xo(),month:Xo(),lastMonth:Xo(),last30Days:Xo()},C=0,w=await ll(i,async v=>{let y=await fs(v);return e&&e(++C,i.length),y});for(let v of w){if(!v||v.tokens===0||!Object.keys(v.dailyFractions).some(P=>P>=p))continue;let b=0,_=0,T=0,S=0;for(let[P,A]of Object.entries(v.dailyFractions))P===s&&(b+=A),P>=a&&(_+=A),P>=p&&P<a&&(T+=A),P>=h&&(S+=A);b>0&&Zo(g.today,v,b),_>0&&Zo(g.month,v,_),T>0&&Zo(g.lastMonth,v,T),S>0&&Zo(g.last30Days,v,S)}for(let v of Object.values(g))v.sessions>0&&(v.avgTokensPerSession=Math.round(v.tokens/v.sessions)),v.co2=v.tokens/1e3*sl,v.treesEquivalent=v.co2/ol,v.waterUsage=v.tokens/1e3*nl,v.estimatedCost=zo(v.modelUsage,Zt),v.estimatedCostCopilot=zo(v.modelUsage,Zt,"copilot");return{...g,lastUpdated:t}}function Xo(){return{tokens:0,thinkingTokens:0,estimatedTokens:0,actualTokens:0,sessions:0,avgInteractionsPerSession:0,avgTokensPerSession:0,modelUsage:{},editorUsage:{},co2:0,treesEquivalent:0,waterUsage:0,estimatedCost:0}}function Zo(i,e,t){let s=Math.round(wt(e)*t),o=Math.round(e.thinkingTokens*t),n=Math.round(e.actualTokens*t);i.tokens+=s,i.thinkingTokens+=o,i.estimatedTokens+=Math.round(e.tokens*t),i.actualTokens+=n,i.sessions++;for(let[c,p]of Object.entries(e.modelUsage))i.modelUsage[c]||(i.modelUsage[c]={inputTokens:0,outputTokens:0}),i.modelUsage[c].inputTokens+=Math.round(p.inputTokens*t),i.modelUsage[c].outputTokens+=Math.round(p.outputTokens*t);let a=Math.round(e.interactions*t),u=i.avgInteractionsPerSession*(i.sessions-1)+a;i.avgInteractionsPerSession=i.sessions>0?u/i.sessions:0,i.editorUsage[e.editorSource]||(i.editorUsage[e.editorSource]={tokens:0,sessions:0}),i.editorUsage[e.editorSource].tokens+=s,i.editorUsage[e.editorSource].sessions++}async function gs(i){let e={warn:il,tokenEstimators:tn,modelPricing:Zt,toolNameMap:id,ecosystems:sn},t=new Date,s=new Date(t.getFullYear(),t.getMonth(),t.getDate()),o=new Date(t.getFullYear(),t.getMonth(),t.getDate()-30),n=new Date(t.getFullYear(),t.getMonth(),1),a=Oi(),u=Oi(),c=Oi();for(let p of i)try{let h=(await al(p)).mtime;if(h<o)continue;let g=await Ea(e,p);h>=o&&(Ko(u,g),u.sessions++),h>=n&&(Ko(c,g),c.sessions++),h>=s&&(Ko(a,g),a.sessions++)}catch{}return{today:a,last30Days:u,month:c,lastUpdated:t}}function Oi(){return{sessions:0,toolCalls:{total:0,byTool:{}},modeUsage:{ask:0,edit:0,agent:0,plan:0,customAgent:0,cli:0},contextReferences:be(),mcpTools:{total:0,byServer:{},byTool:{}},modelSwitching:{modelsPerSession:[],totalSessions:0,averageModelsPerSession:0,maxModelsPerSession:0,minModelsPerSession:0,switchingFrequency:0,standardModels:[],premiumModels:[],unknownModels:[],mixedTierSessions:0,standardRequests:0,premiumRequests:0,unknownRequests:0,totalRequests:0},repositories:[],repositoriesWithCustomization:[],editScope:{singleFileEdits:0,multiFileEdits:0,totalEditedFiles:0,avgFilesPerSession:0},applyUsage:{totalApplies:0,totalCodeBlocks:0,applyRate:0},sessionDuration:{totalDurationMs:0,avgDurationMs:0,avgFirstProgressMs:0,avgTotalElapsedMs:0,avgWaitTimeMs:0},conversationPatterns:{multiTurnSessions:0,singleTurnSessions:0,avgTurnsPerSession:0,maxTurnsInSession:0},agentTypes:{editsAgent:0,defaultAgent:0,workspaceAgent:0,other:0}}}async function rn(i){let e=new Date,t=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()-30)),s=t.toISOString().slice(0,10),o=e.toISOString().slice(0,10),n=new Map,a=new Date(t);for(;a.toISOString().slice(0,10)<=o;){let h=a.toISOString().slice(0,10);n.set(h,{tokens:0,sessions:0,modelUsage:{},editorUsage:{}}),a.setUTCDate(a.getUTCDate()+1)}let u=new Map,c=await ll(i,async h=>fs(h));for(let h of c){if(!h||h.tokens===0||h.interactions===0)continue;let g=wt(h);for(let[C,w]of Object.entries(h.dailyFractions)){let v=Math.round(g*w),y=n.get(C);if(y){y.tokens+=v,y.sessions++;for(let[S,P]of Object.entries(h.modelUsage))y.modelUsage[S]||(y.modelUsage[S]={inputTokens:0,outputTokens:0}),y.modelUsage[S].inputTokens+=Math.round(P.inputTokens*w),y.modelUsage[S].outputTokens+=Math.round(P.outputTokens*w);let T=h.editorSource;y.editorUsage[T]||(y.editorUsage[T]={tokens:0,sessions:0}),y.editorUsage[T].tokens+=v,y.editorUsage[T].sessions++}u.has(C)||u.set(C,{tokens:0,sessions:0,modelUsage:{},editorUsage:{}});let b=u.get(C);b.tokens+=v,b.sessions++;for(let[T,S]of Object.entries(h.modelUsage))b.modelUsage[T]||(b.modelUsage[T]={inputTokens:0,outputTokens:0}),b.modelUsage[T].inputTokens+=Math.round(S.inputTokens*w),b.modelUsage[T].outputTokens+=Math.round(S.outputTokens*w);let _=h.editorSource;b.editorUsage[_]||(b.editorUsage[_]={tokens:0,sessions:0}),b.editorUsage[_].tokens+=v,b.editorUsage[_].sessions++}}let p=Array.from(n.keys()).sort(),m=p.map(h=>n.get(h));return{labels:p,days:m,allDaysMap:u}}var en=[{bg:"rgba(54, 162, 235, 0.6)",border:"rgba(54, 162, 235, 1)"},{bg:"rgba(255, 99, 132, 0.6)",border:"rgba(255, 99, 132, 1)"},{bg:"rgba(75, 192, 192, 0.6)",border:"rgba(75, 192, 192, 1)"},{bg:"rgba(153, 102, 255, 0.6)",border:"rgba(153, 102, 255, 1)"},{bg:"rgba(255, 159, 64, 0.6)",border:"rgba(255, 159, 64, 1)"},{bg:"rgba(255, 205, 86, 0.6)",border:"rgba(255, 205, 86, 1)"},{bg:"rgba(201, 203, 207, 0.6)",border:"rgba(201, 203, 207, 1)"},{bg:"rgba(100, 181, 246, 0.6)",border:"rgba(100, 181, 246, 1)"}];function an(i,e,t){let s=P=>`${P.getFullYear()}-${String(P.getMonth()+1).padStart(2,"0")}-${String(P.getDate()).padStart(2,"0")}`,o=P=>{let A=P.map(Q=>Q.entry),U=P.map(Q=>Q.label),O=A.map(Q=>Q.tokens),$=A.map(Q=>Q.sessions),q=new Set;A.forEach(Q=>Object.keys(Q.modelUsage).forEach(Z=>q.add(Z)));let ve=Array.from(q).map((Q,Z)=>{let me=en[Z%en.length];return{label:Q,data:A.map(at=>{let Xe=at.modelUsage[Q];return Xe?Xe.inputTokens+Xe.outputTokens:0}),backgroundColor:me.bg,borderColor:me.border,borderWidth:1}}),_e=new Set;A.forEach(Q=>Object.keys(Q.editorUsage).forEach(Z=>_e.add(Z)));let J=Array.from(_e).map((Q,Z)=>{let me=en[Z%en.length];return{label:Q,data:A.map(at=>at.editorUsage[Q]?.tokens||0),backgroundColor:me.bg,borderColor:me.border,borderWidth:1}}),He=O.reduce((Q,Z)=>Q+Z,0),Ne=$.reduce((Q,Z)=>Q+Z,0),Te=P.length,Ve=A.map(Q=>zo(Q.modelUsage,Zt)),Re=Ve.reduce((Q,Z)=>Q+Z,0),fe=Te>0?Re/Te:0;return{labels:U,tokensData:O,sessionsData:$,modelDatasets:ve,editorDatasets:J,repositoryDatasets:[],periodCount:Te,totalTokens:He,totalSessions:Ne,avgPerPeriod:Te>0?Math.round(He/Te):0,costData:Ve,totalCost:Re,avgCostPerPeriod:fe}},n=(P,A)=>{P.tokens+=A.tokens,P.sessions+=A.sessions;for(let[U,O]of Object.entries(A.modelUsage))P.modelUsage[U]||(P.modelUsage[U]={inputTokens:0,outputTokens:0}),P.modelUsage[U].inputTokens+=O.inputTokens,P.modelUsage[U].outputTokens+=O.outputTokens;for(let[U,O]of Object.entries(A.editorUsage))P.editorUsage[U]||(P.editorUsage[U]={tokens:0,sessions:0}),P.editorUsage[U].tokens+=O.tokens,P.editorUsage[U].sessions+=O.sessions},a=()=>({tokens:0,sessions:0,modelUsage:{},editorUsage:{}}),u=new Date,c=i.map((P,A)=>({label:P,entry:e[A]})),p=o(c),m=P=>{let A=new Date(P);A.setHours(0,0,0,0);let U=A.getDay();return A.setDate(A.getDate()-(U===0?6:U-1)),A},h=P=>{let A=new Date(P);return A.setDate(P.getDate()+6),P.getMonth()===A.getMonth()?`${P.toLocaleDateString("en-US",{month:"short"})} ${P.getDate()}\u2013${A.getDate()}`:`${P.toLocaleDateString("en-US",{month:"short",day:"numeric"})}\u2013${A.toLocaleDateString("en-US",{month:"short",day:"numeric"})}`},g=m(u),C=new Map;for(let P=5;P>=0;P--){let A=new Date(g);A.setDate(g.getDate()-P*7);let U=s(A);C.set(U,{label:h(A),entry:a()})}let w=t||new Map(i.map((P,A)=>[P,e[A]]));for(let[P,A]of w.entries()){let U=m(new Date(P+"T00:00:00")),O=C.get(s(U));O&&n(O.entry,A)}let v=Array.from(C.values()),y=o(v),b=new Map;for(let P=11;P>=0;P--){let A=new Date(u.getFullYear(),u.getMonth()-P,1),U=`${A.getFullYear()}-${String(A.getMonth()+1).padStart(2,"0")}`,O=A.toLocaleDateString("en-US",{month:"short",year:"numeric"});b.set(U,{label:O,entry:a()})}for(let[P,A]of w.entries()){let U=P.slice(0,7),O=b.get(U);O&&n(O.entry,A)}let _=Array.from(b.values()),T=o(_),S={};return e.forEach(P=>{Object.entries(P.editorUsage).forEach(([A,U])=>{S[A]=(S[A]||0)+U.tokens})}),{labels:p.labels,tokensData:p.tokensData,sessionsData:p.sessionsData,modelDatasets:p.modelDatasets,editorDatasets:p.editorDatasets,editorTotalsMap:S,repositoryDatasets:[],repositoryTotalsMap:{},dailyCount:p.periodCount,totalTokens:p.totalTokens,avgTokensPerDay:p.periodCount>0?Math.round(p.totalTokens/p.periodCount):0,totalSessions:p.totalSessions,lastUpdated:new Date().toISOString(),backendConfigured:!1,periodsReady:!0,periods:{day:p,week:y,month:T}}}function se(i){return i.toLocaleString("en-US")}function he(i){return i>=1e9?`${(i/1e9).toFixed(1)}B`:i>=1e6?`${(i/1e6).toFixed(1)}M`:i>=1e3?`${(i/1e3).toFixed(1)}K`:i.toString()}var Ot={CO2_PER_1K_TOKENS:sl,CO2_ABSORPTION_PER_TREE_PER_YEAR:ol,WATER_USAGE_PER_1K_TOKENS:nl,CO2_PER_KM_DRIVING:120,CO2_PER_PHONE_CHARGE:8.22,WATER_PER_COFFEE_CUP:140,CO2_PER_LED_HOUR:20};var cl=new ye("stats").description("Show overview of discovered session files, sessions, chat turns, and tokens").option("-v, --verbose","Show detailed per-folder breakdown").option("--json","Output raw JSON (for machine consumption)").action(async i=>{if(i.json||console.log(D.bold.cyan(`
60
60
  \u{1F50D} Copilot Token Tracker - Session Statistics
61
61
  `)),i.verbose&&!i.json){let h=nn();console.log(D.dim("Search paths:"));for(let g of h){let C=g.exists?D.green("\u2705"):D.dim("\u274C");console.log(` ${C} ${D.dim(g.source)}: ${g.path}`)}console.log()}i.json||process.stdout.write(D.dim("Scanning for session files..."));let e=await Ce();if(i.json||process.stdout.write("\r"+" ".repeat(50)+"\r"),e.length===0){i.json?process.stdout.write("{}"):(console.log(D.yellow("\u26A0\uFE0F No session files found.")),console.log(D.dim("Have you used GitHub Copilot Chat in VS Code yet?")));return}i.json||console.log(D.green(`\u{1F4C2} Found ${D.bold(se(e.length))} session file(s)
62
62
  `));let t=0,s=0,o=0,n=0,a=0,u={},c={};for(let h=0;h<e.length;h++){let g=await fs(e[h]);if(!g||g.tokens===0){a++;continue}if(n++,t+=wt(g),s+=g.thinkingTokens,o+=g.interactions,u[g.editorSource]||(u[g.editorSource]={files:0,tokens:0,interactions:0}),u[g.editorSource].files++,u[g.editorSource].tokens+=wt(g),u[g.editorSource].interactions+=g.interactions,i.verbose){let C=Md(e[h]);c[C]||(c[C]={files:0,tokens:0}),c[C].files++,c[C].tokens+=wt(g)}!i.json&&((h+1)%50===0||h===e.length-1)&&process.stdout.write(`\r${D.dim(`Processing: ${h+1}/${e.length}`)}`)}if(i.json||process.stdout.write("\r"+" ".repeat(50)+"\r"),i.json){let h={totalFiles:e.length,processedFiles:n,emptyFiles:a,totalTokens:t,totalThinkingTokens:s,totalInteractions:o,byEditor:u,lastUpdated:new Date().toISOString()};process.stdout.write(JSON.stringify(h));return}console.log(D.bold("\u{1F4CA} Summary")),console.log(D.dim("\u2500".repeat(50))),console.log(` Session files (with data): ${D.bold(se(n))}`),a>0&&console.log(` Empty/skipped files: ${D.dim(se(a))}`),console.log(` Total chat turns: ${D.bold(se(o))}`),console.log(` Total tokens: ${D.bold.yellow(he(t))}`),s>0&&console.log(` Thinking tokens (included): ${D.dim(he(s))}`);let p=Ri();p.enabled&&p.entries>0&&console.log(D.dim(` Cache: ${se(p.entries)} entries loaded`)),console.log();let m=Object.entries(u).sort((h,g)=>g[1].tokens-h[1].tokens);if(m.length>0){console.log(D.bold("\u{1F5A5}\uFE0F By Editor")),console.log(D.dim("\u2500".repeat(50)));for(let[h,g]of m){let C=Pd(h);console.log(` ${C.padEnd(25)} ${se(g.files).padStart(5)} files ${he(g.tokens).padStart(8)} tokens ${se(g.interactions).padStart(6)} turns`)}console.log()}if(i.verbose&&Object.keys(c).length>0){let h=Object.entries(c).sort((g,C)=>C[1].tokens-g[1].tokens);console.log(D.bold("\u{1F4C1} By Folder")),console.log(D.dim("\u2500".repeat(70)));for(let[g,C]of h.slice(0,20))console.log(` ${g.substring(0,50).padEnd(50)} ${se(C.files).padStart(5)} files ${he(C.tokens).padStart(8)} tokens`);h.length>20&&console.log(D.dim(` ... and ${h.length-20} more folders`)),console.log()}});function Pd(i){return{vscode:"VS Code","vscode-insiders":"VS Code Insiders","vscode-exploration":"VS Code Exploration","vscode-remote":"VS Code Remote",vscodium:"VSCodium",cursor:"Cursor","copilot-cli":"Copilot CLI",opencode:"OpenCode","claude-code":"Claude Code","claude-desktop-cowork":"Claude Desktop (Cowork)","mistral-vibe":"Mistral Vibe","gemini-cli":"Gemini CLI"}[i]||i}function Md(i){let e=i.split(/[/\\]/),t=e.indexOf("chatSessions");return t>=2?e.slice(t-1,t+1).join("/"):e.slice(-3,-1).join("/")}var ul=new ye("usage").description("Show token usage for today, current month, last month, and last 30 days").option("-m, --models","Show per-model token breakdown").option("-c, --cost","Show estimated cost breakdown").option("--json","Output raw JSON (for machine consumption)").action(async i=>{let e=await xd(i);if(!e)return;let t=await Ad(e,i);if(i.json){let o={today:t.today,month:t.month,lastMonth:t.lastMonth,last30Days:t.last30Days,lastUpdated:t.lastUpdated.toISOString(),backendConfigured:!1};process.stdout.write(JSON.stringify(o));return}console.log(D.bold.cyan(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rajbos/ai-engineering-fluency",
3
- "version": "0.1.4",
3
+ "version": "0.2.0",
4
4
  "description": "AI Engineering Fluency - CLI tool to analyze GitHub Copilot token usage from local session files",
5
5
  "license": "MIT",
6
6
  "author": "RobBos",