@github/copilot 0.0.350-18 → 0.0.350-19
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.
- package/index.js +1 -1
- package/package.json +2 -2
- package/sdk/index.d.ts +8 -0
- package/sdk/index.js +2 -2
- package/sdk/index.js.map +2 -2
package/index.js
CHANGED
|
@@ -2021,7 +2021,7 @@ ${a}`;await r.createOrUpdateMCPStartupToolCall({serverName:e,content:s}),this.lo
|
|
|
2021
2021
|
`)),s}}import{homedir as Ajt}from"node:os";import B5n,{resolve as O5n}from"node:path";c();function ufn(t){return t.length>0&&/^[0-9a-zA-Z_-]+$/.test(t)}function jzt(t){return!t||t.length===0?{valid:!1,error:"MCP server name cannot be empty"}:/^[0-9a-zA-Z_-]+$/.test(t)?{valid:!0}:{valid:!1,error:"MCP server name must only contain alphanumeric characters, underscores, and hyphens"}}var Pzt=nN(["none","markdown","hidden_characters"]),Kzt=zl({tools:Td(Yt()),type:Yt().optional(),isDefaultServer:go().optional(),filterMapping:aY(Yt(),Pzt).or(Pzt).optional()}),mfn=Kzt.extend({type:pr("local").optional(),command:Yt(),args:Td(Yt()),env:aY(Yt(),Yt()).optional()}),bfn=Kzt.extend({type:pr("http").or(pr("sse")),url:Yt(),headers:aY(Yt(),Yt()).optional()}),Bqe=zl({mcpServers:aY(Yt().min(1,"MCP server name cannot be empty").refine(ufn,{message:"MCP server name must only contain alphanumeric characters, underscores, and hyphens"}),mfn.or(bfn))}),mY=Hwe(Bqe.parse,"mcp");c();c();function qzt(t){let e=t.r/255,l=t.g/255,n=t.b/255,r=Math.max(e,l,n),a=Math.min(e,l,n),I=r-a,s=0,o=0,d=(r+a)/2;if(I!==0){switch(o=d>.5?I/(2-r-a):I/(r+a),r){case e:s=(l-n)/I+(l<n?6:0);break;case l:s=(n-e)/I+2;break;case n:s=(e-l)/I+4;break}s/=6}return{h:s*360,s:o,l:d}}function Gfn(t){if(t.length<12||t.length>18)return null;let e=t.match(/rgb:([0-9a-f]+)\/([0-9a-f]+)\/([0-9a-f]+)/i);if(!e)return null;let[,l,n,r]=e,a=d=>d.length>=2?parseInt(d.substring(0,2),16):d.length===1?parseInt(d+d,16):0,I=a(l),s=a(n),o=a(r);return{r:I,g:s,b:o}}var $zt=["#000000","#800000","#008000","#808000","#000080","#800080","#008080","#c0c0c0","#808080","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff","#000000","#00005f","#000087","#0000af","#0000d7","#0000ff","#005f00","#005f5f","#005f87","#005faf","#005fd7","#005fff","#008700","#00875f","#008787","#0087af","#0087d7","#0087ff","#00af00","#00af5f","#00af87","#00afaf","#00afd7","#00afff","#00d700","#00d75f","#00d787","#00d7af","#00d7d7","#00d7ff","#00ff00","#00ff5f","#00ff87","#00ffaf","#00ffd7","#00ffff","#5f0000","#5f005f","#5f0087","#5f00af","#5f00d7","#5f00ff","#5f5f00","#5f5f5f","#5f5f87","#5f5faf","#5f5fd7","#5f5fff","#5f8700","#5f875f","#5f8787","#5f87af","#5f87d7","#5f87ff","#5faf00","#5faf5f","#5faf87","#5fafaf","#5fafd7","#5fafff","#5fd700","#5fd75f","#5fd787","#5fd7af","#5fd7d7","#5fd7ff","#5fff00","#5fff5f","#5fff87","#5fffaf","#5fffd7","#5fffff","#870000","#87005f","#870087","#8700af","#8700d7","#8700ff","#875f00","#875f5f","#875f87","#875faf","#875fd7","#875fff","#878700","#87875f","#878787","#8787af","#8787d7","#8787ff","#87af00","#87af5f","#87af87","#87afaf","#87afd7","#87afff","#87d700","#87d75f","#87d787","#87d7af","#87d7d7","#87d7ff","#87ff00","#87ff5f","#87ff87","#87ffaf","#87ffd7","#87ffff","#af0000","#af005f","#af0087","#af00af","#af00d7","#af00ff","#af5f00","#af5f5f","#af5f87","#af5faf","#af5fd7","#af5fff","#af8700","#af875f","#af8787","#af87af","#af87d7","#af87ff","#afaf00","#afaf5f","#afaf87","#afafaf","#afafd7","#afafff","#afd700","#afd75f","#afd787","#afd7af","#afd7d7","#afd7ff","#afff00","#afff5f","#afff87","#afffaf","#afffd7","#afffff","#d70000","#d7005f","#d70087","#d700af","#d700d7","#d700ff","#d75f00","#d75f5f","#d75f87","#d75faf","#d75fd7","#d75fff","#d78700","#d7875f","#d78787","#d787af","#d787d7","#d787ff","#d7af00","#d7af5f","#d7af87","#d7afaf","#d7afd7","#d7afff","#d7d700","#d7d75f","#d7d787","#d7d7af","#d7d7d7","#d7d7ff","#d7ff00","#d7ff5f","#d7ff87","#d7ffaf","#d7ffd7","#d7ffff","#ff0000","#ff005f","#ff0087","#ff00af","#ff00d7","#ff00ff","#ff5f00","#ff5f5f","#ff5f87","#ff5faf","#ff5fd7","#ff5fff","#ff8700","#ff875f","#ff8787","#ff87af","#ff87d7","#ff87ff","#ffaf00","#ffaf5f","#ffaf87","#ffafaf","#ffafd7","#ffafff","#ffd700","#ffd75f","#ffd787","#ffd7af","#ffd7d7","#ffd7ff","#ffff00","#ffff5f","#ffff87","#ffffaf","#ffffd7","#ffffff","#080808","#121212","#1c1c1c","#262626","#303030","#3a3a3a","#444444","#4e4e4e","#585858","#626262","#6c6c6c","#767676","#808080","#8a8a8a","#949494","#9e9e9e","#a8a8a8","#b2b2b2","#bcbcbc","#c6c6c6","#d0d0d0","#dadada","#e4e4e4","#eeeeee"];function pfn(t){let e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return e?{r:parseInt(e[1],16),g:parseInt(e[2],16),b:parseInt(e[3],16)}:{r:0,g:0,b:0}}function hfn(t){return t<0||t>=$zt.length?{r:0,g:0,b:0}:pfn($zt[t])}function ePt(t){if(t.length<15||t.length>30)return null;let e=t;e.endsWith("\x07")?e=e.slice(0,-1):e.endsWith("\x1B\\")?e=e.slice(0,-2):e.endsWith("\x9C")&&(e=e.slice(0,-1));let l=e;return l.startsWith("11;")&&(l=l.substring(3)),l.startsWith("rgb:")?Gfn(l):null}async function Afn(t=100){return new Promise(e=>{if(!process.stdout.isTTY||!process.stdin.isTTY){e(null);return}let l="",n=null,r=()=>{process.stdin.removeListener("data",a),process.stdin.setRawMode(!1),n&&clearTimeout(n)},a=I=>{l+=I.toString();let s=l.match(/\x1b\]11;([^\x07\x1b\x9c]*?)(?:\x07|\x1b\\|\x9c)/);if(s){r();let d=`11;${s[1]}`;e(ePt(d));return}let o=l.match(/11;rgb:([0-9a-f/]+)(?:\x07|\x1b\\|\x9c)/i);if(o){r(),e(ePt(`11;rgb:${o[1]}`));return}};n=setTimeout(()=>{r(),e(null)},t);try{process.stdin.setRawMode(!0),process.stdin.on("data",a),process.stdout.write("\x1B]11;?\x1B\\")}catch{r(),e(null)}})}function gfn(){let t=process.env.COLORFGBG;if(!t||!t.includes(";"))return null;let e=t.split(";"),l=e[e.length-1],n=parseInt(l,10);return isNaN(n)?null:hfn(n)}async function tPt(){try{let t=await Afn();if(t)return qzt(t).l<.5;let e=gfn();return e?qzt(e).l<.5:!0}catch{return!0}}var lPt={FG:"whiteBright",ACCENT:"blue",SUCCESS:"green",DIFF_ADDED_HIGHLIGHT_FG:"black",DIFF_REMOVED_HIGHLIGHT_FG:"whiteBright",ERROR:"red",WARNING:"yellow",COPILOT:"magenta",COPILOT_BRIGHT:"magentaBright",MUTED:"white",SELECTED:"cyan",BORDER:"blackBright"},Zfn={FG:"black",ACCENT:"blue",SUCCESS:"green",DIFF_ADDED_HIGHLIGHT_FG:"black",DIFF_REMOVED_HIGHLIGHT_FG:"whiteBright",ERROR:"red",WARNING:"yellow",COPILOT:"magenta",COPILOT_BRIGHT:"magentaBright",MUTED:"blackBright",SELECTED:"cyan",BORDER:"blackBright"};function Oqe(t){return t==="auto"||t==="dark"||t==="light"}function Bwe(t){switch(t){case"dark":return lPt;case"light":return Zfn;default:return lPt}}var Owe=await tPt();async function Twe(){let e=(await Sr.load())?.theme||"";return Oqe(e)?e:"auto"}async function nPt(t){await Sr.writeKey("theme",t)}var rPt=t=>{let e=t?Sl.whiteBright:Sl.black,l=t?Sl.cyanBright:Sl.blueBright,n=t?Sl.magentaBright:Sl.magenta;return{text:e,paragraph:e,html:e,table:e,blockquote:e,heading:Sl.bold,firstHeading:Sl.whiteBright.bold,strong:Sl.bold,em:Sl.italic,del:Sl.strikethrough,hr:Sl.white,link:l,href:l,image:(r,a,I)=>n(I?`Image: ${I} \u2192 ${r}`:`Image: ${r}`),codespan:Sl.cyan,code:Sl.cyan,list:(r,a,I)=>{let s=r.replace(/^(\s*)\* /gm,"$1- ");return I&&(s=s.split(`
|
|
2022
2022
|
`).map(u=>u.startsWith(I)?u.slice(I.length):u).join(`
|
|
2023
2023
|
`)),s.trimEnd()},listitem:r=>e(r.trimEnd()),reflowText:!0,showSectionPrefix:!1,unescape:!0,emoji:!0,tab:2,tableOptions:{style:{compact:!1}}}},Nfn=rPt(!0),Wfn=rPt(!1);function aPt(t){return t==="light"?Wfn:Nfn}c();import{exec as J5n}from"node:child_process";import*as G7e from"node:os";import{promisify as x5n}from"node:util";c();c();async function LL(t,e,l){if(!t||t.length===0)return;let n=!1,r={};for(let a of t)try{let I=await a(e);I&&(n=!0,r={...r,...I})}catch(I){l.error(`Hook execution failed: ${I}`)}return n?r:void 0}c();c();import{unlink as zPt}from"fs/promises";import{join as W5n}from"path";c();c();import{execFile as yfn}from"node:child_process";import{normalize as Efn}from"node:path";import{promisify as Rfn}from"node:util";var tme=Rfn(yfn);async function bY(t=process.cwd()){try{let l=(await tme("git",["rev-parse","--show-toplevel"],{cwd:t,encoding:"utf8",timeout:5e3,maxBuffer:1048576})).stdout.trim();if(l)return{gitRoot:Efn(l),found:!0}}catch{}return{gitRoot:t,found:!1}}async function IPt(t){let{stdout:e}=await tme("git",["-C",t,"remote","-v"],{encoding:"utf8",timeout:5e3,maxBuffer:1048576}),l=e.trim().split(`
|
|
2024
|
-
`),n={};for(let r of l){let a=r.split(/\s+/);if(a.length>=3){let I=a[0],s=a[1],o=a[2].replace(/[()]/g,"");n[I]||(n[I]={Name:I,FetchURL:"",PushURL:""}),o==="fetch"?n[I].FetchURL=s:o==="push"&&(n[I].PushURL=s)}}return Object.values(n)}async function sPt(t){try{let{stdout:e}=await tme("git",["status","--porcelain"],{cwd:t,encoding:"utf8",timeout:5e3,maxBuffer:1048576});return e.trim().length>0}catch{return!1}}async function oPt(t){try{let{stdout:e}=await tme("git",["rev-parse","--abbrev-ref","HEAD"],{cwd:t,encoding:"utf8",timeout:5e3,maxBuffer:1048576}),l=e.trim();if(l==="HEAD"){let{stdout:n}=await tme("git",["rev-parse","--short","HEAD"],{cwd:t,encoding:"utf8",timeout:5e3,maxBuffer:1048576}),r=n.trim();return r?`detached@${r}`:null}return l||null}catch{return null}}c();var JPt=nt(LPt(),1);async function AXn(t={}){let e=await Fgt();return fgt((0,JPt.default)({},e,t))}async function sme(t={}){if(ID())throw new Error("Settings have already been initialized");return AXn(t)}c();import{promises as gXn}from"fs";import xPt from"path";var ZXn=3*1024*1024;function SPt(t){let e=xPt.extname(t).toLowerCase();return[".png",".jpg",".jpeg",".gif",".webp"].includes(e)}function NXn(t){switch(xPt.extname(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";default:return null}}async function WXn(t,e){e.debug(`Processing local image file: ${t}`);let l=await gXn.readFile(t),n=NXn(t);if(!n)throw new Error(`Unsupported image format: ${t}`);let r=new qse,a=await I0e(e,r,ZXn,Pse,n,l);if(!a)throw new Error(`Image too large or couldn't be processed: ${t}`);let I=a.toString("base64");return`data:${n};base64,${I}`}async function yXn(t,e,l){let n=mu();try{let r=await cBe({command:"view",path:t,view_range:void 0},{properties:{command:"view",resolvedPathAgainstCwd:"false",options:"{}",inputs:"[]"},metrics:{responseTokenLimit:void 0,resultLength:0,resultForLlmLength:0},restrictedProperties:{}},e,l);return{id:n,name:"view",arguments:{path:t},result:r.textResultForLlm||""}}catch(r){return{id:n,name:"view",arguments:{path:t},result:`Error reading ${t}: ${r}`}}}async function BPt(t,e,l){let n=[],r=t.filter(I=>!SPt(I.path));if(r.length===0)return n;let a=[];for(let I of r)try{let s=await yXn(I.path,e,l);a.push(s)}catch{}if(a.length>0){let I=a.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.arguments)}}));n.push({role:"assistant",content:"I need to read the content of those paths to answer this request.",tool_calls:I}),n.push(...a.map(s=>({role:"tool",tool_call_id:s.id,content:s.result})))}return n}async function OPt(t,e){let l=t.filter(r=>SPt(r.path));return(await Promise.all(l.map(async r=>{try{return{type:"image_url",image_url:{url:await WXn(r.path,e)}}}catch(a){e.error(`Failed to process image ${r.path}: ${a instanceof Error?a.message:String(a)}`);return}}))).filter(r=>r!==void 0)}var $qe=class{constructor(e,l){this.logger=e;this.session=l}messageQueue=[];async*preRequest(e){this.logger.debug("ImmediatePromptProcessor: Injecting immediate prompts");let n=(await this.session.getChatMessages()).length;for(;this.messageQueue.length>0;){let I=this.messageQueue.shift();this.session.emit("user.message",{content:I.prompt,attachments:I.attachments})}let a=(await this.session.getChatMessages()).slice(n);for(let I of a)e.messages.push(I),yield{kind:"message",message:I,turn:e.turn,source:"immediate-prompt"}}addMessage(e){this.messageQueue.push(e)}toJSON(){return"ImmediatePromptProcessor"}},Qf=class t{sessionId;startTime;modifiedTime;logger;events=[];_chatMessages=[];_selectedModel;eventProcessingQueue=Promise.resolve();eventHandlers={};wildcardEventHandlers=[];isProcessing=!1;messageQueue=[];immediatePromptProcessor;mcpHost;workingDir;abortController;modelProvider;allowedTools;disabledTools;requestPermission;mcpServers;hooks;hmacKey;copilotToken;constructor(e={},l={}){this.sessionId=l.sessionId||mu(),this.startTime=l.startTime||new Date,this.modifiedTime=l.modifiedTime||this.startTime,this.logger=e.logger||new xd,this.modelProvider=e.modelProvider,this.allowedTools=e.allowedTools,this.disabledTools=e.disabledTools,this.requestPermission=e.requestPermission,this.mcpServers=e.mcpServers,this.hooks=e.hooks,this.hmacKey=e.hmacKey,this.copilotToken=e.copilotToken,this.workingDir=e.workingDirectory||process.cwd(),this.immediatePromptProcessor=new $qe(this.logger,this),this.abortController=e.abortController||new AbortController,bY(this.workingDir).then(n=>{if(n.found)return VEe(n.gitRoot,!0,this.workingDir)}).catch(n=>{this.logger.debug(`Failed to initialize custom instructions cache: ${n}`)})}get messageCount(){let e=this.events.find(n=>n.type==="session.import_legacy"),l=0;return e&&(l=(e.data.legacySession?.chatMessages||[]).filter(a=>a.role==="user"||a.role==="assistant").length),this.logger.debug(`Imported message count: ${l}`),this.events.filter(n=>n.type==="user.message"||n.type==="assistant.message").length+l}get summary(){let e=this.events.find(a=>a.type==="session.import_legacy"||a.type==="user.message"),l;if(e?.type==="session.import_legacy"){let a=e.data.legacySession.chatMessages.find(I=>I.role==="user");a?.content&&(typeof a.content=="string"?l=a.content:l=a.content.find(I=>I.type==="text")?.text)}else e?.type==="user.message"&&(l=e.data.content);if(!l)return;let n=l.lastIndexOf("<reminder>");n!==-1&&(l=l.substring(0,n).trim());let r=l.replace(/\s+/g," ").trim();return r.length>75&&(r=r.substring(0,55).trim()+"..."),r=r.split("").filter(a=>{let I=a.charCodeAt(0);return I>=32&&I!==127}).join(""),r}static async fromEvents(e,l={}){if(e.length===0)throw new Error("Cannot create session from empty events array");let n=e[0];if(n.type!=="session.start")throw new Error("First event must be session.start");let r=new t(l,{sessionId:n.data.sessionId,startTime:new Date(n.data.startTime)});r._selectedModel=n.data.selectedModel,r.events.push(n);for(let a=1;a<e.length;a++){let I=e[a];r.events.push(I),await r.processEventForState(I)}return r}on(e,l){return e==="*"?(this.wildcardEventHandlers.push(l),()=>{let n=this.wildcardEventHandlers.indexOf(l);n!==-1&&this.wildcardEventHandlers.splice(n,1)}):(this.eventHandlers[e]||(this.eventHandlers[e]=[]),this.eventHandlers[e].push(l),()=>{let n=this.eventHandlers[e];if(n){let r=n.indexOf(l);r!==-1&&n.splice(r,1)}})}emit(e,l,n=!1){let r=mu(),a=new Date().toISOString(),I=this.getLastEventId(),s={type:e,data:l,id:r,timestamp:a,parentId:I,...n&&{ephemeral:n}};this.events.push(s),this.enqueueEventProcessing(()=>this.processEventForState(s)).catch(o=>{this.logger.error(`Error emitting event: ${o instanceof Error?o.message:String(o)}`)}).catch(o=>{this.logger.error(`Error emitting event ${o instanceof Error?o.message:String(o)}`)}),[...this.eventHandlers[s.type]||[],...this.wildcardEventHandlers].forEach(o=>{try{o(s)}catch(d){this.logger.error(`Error in event handler for event type ${s.type}: ${d instanceof Error?d.message:String(d)}`)}})}emitEphemeral(e,l){this.emit(e,l,!0)}getEvents(){return this.events}async getChatMessages(){return this.enqueueEventProcessing(()=>this._chatMessages)}async getChatContextMessages(){return(await this.getChatMessages()).filter(l=>l.role!=="system")}async getSystemContextMessages(){return(await this.getChatMessages()).filter(l=>l.role==="system")}async getSelectedModel(){return this.enqueueEventProcessing(()=>this._selectedModel)}async setSelectedModel(e){let l=await this.getSelectedModel();this.emit("session.model_change",{previousModel:l,newModel:e})}getLastEventId(){return this.events.length===0?null:this.events[this.events.length-1].id}enqueueEventProcessing(e){let l=this.eventProcessingQueue.then(()=>e());return this.eventProcessingQueue=l,l}async processEventForState(e){switch(e.type){case"session.start":e.data.selectedModel&&(this._selectedModel=e.data.selectedModel);break;case"session.model_change":this._selectedModel=e.data.newModel;break;case"user.message":{let l=[],n=[];if(e.data.attachments&&e.data.attachments.length>0){let r=await OPt(e.data.attachments,this.logger);l.push(...r);let a=await BPt(e.data.attachments,{requestRequired:!1},this.logger);n.push(...a)}l.length>0?this._chatMessages.push({role:"user",content:[{type:"text",text:e.data.content},...l]}):this._chatMessages.push({role:"user",content:e.data.content}),n.length>0&&this._chatMessages.push(...n);break}case"assistant.message":{if(e.ephemeral)break;let l={role:"assistant",content:e.data.content||null};e.data.toolRequests&&e.data.toolRequests.length>0&&(l.tool_calls=e.data.toolRequests.map(n=>({id:n.toolCallId,type:"function",function:{name:n.name,arguments:typeof n.arguments=="string"?n.arguments:JSON.stringify(n.arguments)}}))),this._chatMessages.push(l);break}case"tool.execution_complete":{e.data.isUserRequested||this._chatMessages.push({role:"tool",tool_call_id:e.data.toolCallId,content:e.data.success?e.data.result?.content||"":e.data.error?.message||"Tool execution failed"});break}case"system.message":this._chatMessages.push({role:e.data.role,content:e.data.content,...e.data.name&&{name:e.data.name}});break;case"session.import_legacy":this._chatMessages=[...e.data.legacySession.chatMessages],e.data.legacySession.selectedModel&&(this._selectedModel=e.data.legacySession.selectedModel);break;case"abort":case"session.resume":this._chatMessages=EXn(this._chatMessages,this.logger);break;case"session.idle":case"session.error":case"session.info":case"assistant.turn_start":case"assistant.turn_end":case"assistant.usage":case"tool.user_requested":case"tool.execution_start":case"tool.execution_partial_result":case"hook.start":case"hook.end":break;default:{let l=e;this.logger.error(`Unknown event type: ${l.type}`);break}}}async send(e,l={}){if((l.mode||"enqueue")==="immediate"&&this.isProcessing)this.immediatePromptProcessor.addMessage(e);else{if(this.messageQueue.push(e),this.isProcessing)return;for(this.isProcessing=!0,await this.initializeMcpHost();this.messageQueue.length>0;){let r=this.messageQueue.shift();await this.runAgenticLoop(r.prompt,r.attachments)}this.isProcessing=!1,this.emit("session.idle",{})}}async abort(){this.abortController.abort()}async initializeMcpHost(){if(!this.mcpHost&&this.mcpServers&&Object.keys(this.mcpServers).length>0)try{this.mcpHost=new bq(this.logger,{mcpServers:this.mcpServers},this.disabledTools),await this.mcpHost.startServers()}catch(e){this.logger.error(`Failed to initialize MCP host: ${e}`)}}async runAgenticLoop(e,l=[]){if(!this.modelProvider)throw new Error("Session must be created with modelProvider to use send/query methods");let n=new Map,r=new Map;try{let I=(await LL(this.hooks?.userPromptSubmitted,{timestamp:Date.now(),cwd:this.workingDir,prompt:e},this.logger))?.modifiedPrompt??e;this.emit("user.message",{content:W6({problemStatement:I,capabilities:{}}),attachments:l});let o=new _X().setProblemStatement(I).setAgentModel(this.buildAgentModelString()).setGithubRepoName("copilot-sdk-session").setGithubRepoCommit("copilot-sdk-commit").setGithubRepoReadWrite(!1).setCopilotIntegrationId("copilot-developer-cli").setCopilotHmacKey(this.hmacKey).setCopilotToken(this.copilotToken).build();Wx();let d=await sme(o),u=d.service?.agent?.model,b=QB(u),p=b.agent,h=p??"sweagent-capi",g=b.model?{model:b.model}:void 0,N=xde(d,this.logger,p,g),y={location:this.workingDir,timeout:3e4,requireReasoning:!0,toolPartialResultCallback:(Ie,se)=>{this.emitEphemeral("tool.execution_partial_result",{toolCallId:Ie,partialOutput:se})},permissions:this.requestPermission?{requestRequired:!0,request:this.requestPermission}:{requestRequired:!1},shellConfig:(process.platform==="win32"?pp.powerShell:pp.bash).withScriptSafetyAssessor(async function(Ie){return{result:"completed",commands:[{identifier:Ie,readOnly:!1}],possiblePaths:[],hasWriteFileRedirection:!1,canOfferSessionApproval:!1}})},Y=await _1e(y,this.logger),w=[];if(this.mcpHost)try{w=await this.mcpHost.getTools(d,this.logger,y.permissions)}catch(Ie){this.logger.error(`Failed to get MCP tools: ${Ie}`)}let H=[...Y,...w].filter(Ie=>this.allowedTools?this.allowedTools.includes(Ie.name):this.disabledTools?!this.disabledTools.includes(Ie.name):!0),L=await bY(this.workingDir),U={...(z1e()[h]?.[N.model]??D1e()).supports,reasoning:!0},O=await r0e(L.found?L.gitRoot:"",Q8(),this.workingDir,{},U,y,H,void 0),z=(await this.getChatMessages()).slice(0,-1),he={role:"user",content:W6({customAgentPrompt:void 0,problemStatement:I,capabilities:U})},Ge=[...z,he];await LL(this.hooks?.sessionStart,{timestamp:Date.now(),cwd:this.workingDir,source:"new",initialPrompt:e},this.logger);let q=new j4(he,this.logger),M=N.getCompletionWithTools(O,Ge,H,{failIfInitialInputsTooLong:!1,processors:{preRequest:[q,this.immediatePromptProcessor,new gO(this.logger)],onRequestError:[q]},executeToolsInParallel:!1,abortSignal:this.abortController.signal});for await(let Ie of M){if(this.abortController.signal.aborted){this.emit("abort",{reason:"user initiated"});break}switch(Ie.kind){case"message":{if(mL(Ie)){let se=k8(Ie)?await Promise.all(Ie.message.tool_calls.map(async Ee=>{let me=$k(Ee.function.arguments);n.set(Ee.id,Ee.function.name),r.set(Ee.id,me);let ve=await LL(this.hooks?.preToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:Ee.function.name,toolArgs:me},this.logger);return{toolCallId:Ee.id,name:Ee.function.name,arguments:ve?.modifiedArgs??me}})):[];this.emit("assistant.message",{messageId:mu(),content:typeof Ie.message.content=="string"?Ie.message.content:"",toolRequests:se});for(let Ee of se)this.emit("tool.execution_start",{toolCallId:Ee.toolCallId,toolName:Ee.name,arguments:Ee.arguments})}else(Ie.message.role==="system"||Ie.message.role==="developer")&&this.emit("system.message",{role:Ie.message.role,content:typeof Ie.message.content=="string"?Ie.message.content:JSON.stringify(Ie.message.content),name:"name"in Ie.message?Ie.message.name:void 0});break}case"model_call_failure":{let se=new Error(Ie.modelCall?.error||"Model call failed");await LL(this.hooks?.errorOccurred,{timestamp:Date.now(),cwd:this.workingDir,error:se,errorContext:"model_call",recoverable:!0},this.logger),this.emit("session.error",{errorType:"model_call",message:se.message,stack:se.stack});break}case"tool_execution":{let Ee=(await LL(this.hooks?.postToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:n.get(Ie.toolCallId)||"unknown",toolArgs:r.get(Ie.toolCallId)||{},toolResult:Ie.toolResult},this.logger))?.modifiedResult??Ie.toolResult,me=(Ee.resultType==="failure"?Ee.error:void 0)||Ee.sessionLog||Ee.textResultForLlm;this.emit("tool.execution_complete",{toolCallId:Ie.toolCallId,success:Ee.resultType==="success",result:Ee.resultType==="success"?{content:me}:void 0,error:Ee.resultType!=="success"?{message:me,code:Ee.resultType}:void 0});break}case"turn_started":{this.emit("assistant.turn_start",{turnId:`${Ie.turn}`});break}case"turn_ended":{this.emit("assistant.turn_end",{turnId:`${Ie.turn}`});break}case"response":case"images_removed":case"image_processing":case"history_truncated":case"turn_failed":case"turn_retry":case"model_call_success":this.logger.debug(`Ignoring event of kind: ${Ie.kind}`);break;default:xm(Ie,"Unhandled event type")}}}catch(a){await LL(this.hooks?.sessionEnd,{timestamp:Date.now(),cwd:this.workingDir,reason:"error",error:a instanceof Error?a:new Error(String(a))},this.logger),this.emit("session.error",{errorType:"query",message:a instanceof Error?a.message:String(a),stack:a instanceof Error?a.stack:void 0})}finally{await LL(this.hooks?.sessionEnd,{timestamp:Date.now(),cwd:this.workingDir,reason:"complete"},this.logger)}}buildAgentModelString(){if(!this.modelProvider)throw new Error("Session must be created with modelProvider");switch(this.modelProvider.type){case"openai":return`openai:${this.modelProvider.model}`;case"anthropic":return`anthropic:${this.modelProvider.model}`;case"copilot":return`capi:${this.modelProvider.model}`;default:throw new Error(`Unsupported provider: ${this.modelProvider.type}`)}}};function EXn(t,e){if(t.length===0)return t;let l=[],n=new Set,r=!1;for(let s=t.length-1;s>=0;s--){let o=t[s];if(o.role==="assistant"&&(r=!0),o.role==="assistant"&&"tool_calls"in o&&o.tool_calls&&o.tool_calls.length>0)for(let d of o.tool_calls)n.has(d.id)||l.push(d.id);else{if(r)break;o.role==="tool"&&o.tool_call_id&&n.add(o.tool_call_id)}}if(l.length===0)return t;let a="The execution of this tool, or a previous tool was interrupted.";e.info(`Completing ${l.length} orphaned tool calls.`);let I=l.map(s=>({role:"tool",tool_call_id:s,content:a}));return[...t,...I]}c();var qwe=class{sessions;logger;options;lastAccessedSessionId;constructor(e){this.options=e,this.sessions=new Map,this.logger=e.logger||new xd}async createSession(){let e=new Qf(this.options);return this.sessions.set(e.sessionId,e),this.lastAccessedSessionId=e.sessionId,e}async getSession(e){let l=this.sessions.get(e);return l&&(this.lastAccessedSessionId=e),l}async getLastSession(){if(this.lastAccessedSessionId){let n=this.sessions.get(this.lastAccessedSessionId);if(n)return n}let e=Array.from(this.sessions.values());if(e.length===0)return;e.sort((n,r)=>r.startTime.getTime()-n.startTime.getTime());let l=e[0];return this.lastAccessedSessionId=l.sessionId,l}async listSessions(){return Array.from(this.sessions.values()).map(e=>({sessionId:e.sessionId,startTime:e.startTime,modifiedTime:e.modifiedTime}))}async saveSession(e){}async deleteSession(e){this.sessions.delete(e.sessionId),this.lastAccessedSessionId===e.sessionId&&(this.lastAccessedSessionId=void 0)}};c();c();var RXn=zl({type:pr("copilot"),text:Yt(),isStreaming:go().optional()}),YXn=zl({type:pr("error"),text:Yt()}),VXn=zl({type:pr("info"),text:Yt()}),QQI=zl({displayText:Yt(),fullPath:Yt(),type:nN(["file","directory","unresolved","image"]),startIndex:Hb()}),wXn=zl({type:pr("user"),text:Yt()}),Yq=zl({command:Yt(),description:Yt(),timeout:Hb().optional(),sessionId:Yt().optional(),async:go().optional()}),e7e=zl({sessionId:Yt(),input:Yt(),delay:Hb().optional()}),t7e=zl({sessionId:Yt(),delay:Hb()}),l7e=zl({sessionId:Yt()}),TPt=Uh([Yq,e7e,t7e,l7e]),QXn=zl({command:pr("view"),path:Yt(),view_range:eVe([Hb(),Hb()]).optional()}),FXn=zl({command:pr("create"),path:Yt(),file_text:Yt()}),CXn=zl({command:pr("str_replace"),path:Yt(),new_str:Yt().optional(),old_str:Yt()}),vXn=zl({command:pr("insert"),path:Yt(),insert_line:Hb(),new_str:Yt()}),n7e=Mde("command",[QXn,FXn,CXn,vXn]),r7e=zl({path:Yt(),view_range:eVe([Hb(),Hb()]).optional()}),a7e=zl({path:Yt(),file_text:Yt()}),I7e=zl({path:Yt(),old_str:Yt(),new_str:Yt().optional()}),UPt=Uh([TPt,n7e,Ow()]),fXn=zl({type:pr("tool_call_requested"),callId:Yt(),name:Yt(),toolTitle:Yt().optional(),intentionSummary:Yt().nullable(),arguments:UPt,partialOutput:Yt().optional(),isHidden:go().optional(),isAlwaysExpanded:go().optional(),showNoContent:go().optional()}),HXn=zl({type:pr("tool_call_completed"),callId:Yt(),name:Yt(),toolTitle:Yt().optional(),intentionSummary:Yt().nullable(),result:Uh([zl({type:pr("success"),log:Yt(),markdown:go().optional()}),zl({type:pr("failure"),log:Yt(),markdown:go().optional()}),zl({type:pr("rejected"),markdown:go().optional()}),zl({type:pr("denied"),log:Yt(),markdown:go().optional()})]),arguments:UPt,isHidden:go().optional(),isAlwaysExpanded:go().optional(),showNoContent:go().optional()}),XXn=Uh([RXn,YXn,VXn,wXn,fXn,HXn]),MPt=XXn.and(zl({id:Yt(),timestamp:_de.date()}));function _Pt(t,e){switch(t.type){case"copilot":return e.onCopilot(t);case"error":return e.onError(t);case"info":return e.onInfo(t);case"tool_call_requested":return e.onToolCallRequested(t);case"tool_call_completed":return e.onToolCallCompleted(t);case"user":return e.onUser(t);default:{let l=t;throw new Error(`Unexpected message type: ${JSON.stringify(t)}`)}}}var iT=class t extends Error{prUrl;timeoutContext;constructor(e,l,n){super(e),this.name="JobStatusTimeoutError",this.timeoutContext=l,this.prUrl=n,Error.captureStackTrace&&Error.captureStackTrace(this,t)}};var ome=zl({type:pr("text"),text:Yt()}),kXn=zl({type:pr("refusal"),refusal:Yt()}),LXn=zl({type:pr("image_url"),image_url:zl({url:Yt(),detail:nN(["auto","low","high"]).optional()})}),JXn=zl({type:pr("input_audio"),input_audio:zl({data:Yt(),format:pr("wav").or(pr("mp3"))})}),xXn=zl({type:pr("file"),file:zl({file_date:Yt().optional(),file_id:Yt().optional(),filename:Yt().optional()})}),SXn=Uh([ome,LXn,JXn,xXn]),BXn=zl({name:Yt(),arguments:Yt()}),OXn=zl({name:Yt(),input:Yt()}),TXn=zl({id:Yt(),type:pr("function"),function:BXn}),UXn=zl({id:Yt(),type:pr("custom"),custom:OXn}),MXn=Uh([TXn,UXn]),_Xn=zl({name:Yt(),arguments:Yt()}),DXn=zl({id:Yt()}),zXn=zl({content:Uh([Yt(),Td(ome)]),role:pr("developer"),name:Yt().optional()}),PXn=zl({content:Uh([Yt(),Td(ome)]),role:pr("system"),name:Yt().optional()}),jXn=zl({content:Uh([Yt(),Td(SXn)]),role:pr("user"),name:Yt().optional()}),KXn=zl({content:Uh([Yt(),Td(Uh([ome,kXn]))]).nullable().optional(),role:pr("assistant"),name:Yt().optional(),refusal:Yt().nullable().optional(),audio:DXn.nullable().optional(),function_call:_Xn.nullable().optional(),tool_calls:Td(MXn).optional()}),qXn=zl({content:Uh([Yt(),Td(ome)]),role:pr("tool"),tool_call_id:Yt()}),$Xn=zl({content:Yt().nullable(),role:pr("function"),name:Yt()}),e5n=Uh([zXn,PXn,jXn,KXn,qXn,$Xn]),s7e=zl({sessionId:Yt(),startTime:_de.date(),chatMessages:Td(e5n),timeline:Td(MPt),selectedModel:nN(nT).optional()}),ime=Xwe(s7e.parse,"history-session");c();c();var $m=zl({id:Yt().uuid(),timestamp:Yt().datetime(),parentId:Yt().uuid().nullable(),ephemeral:go().optional()}),t5n=$m.extend({type:pr("session.start"),data:zl({sessionId:Yt(),version:Hb(),producer:Yt(),copilotVersion:Yt(),startTime:Yt().datetime(),selectedModel:Yt().optional()})}),l5n=$m.extend({type:pr("session.resume"),data:zl({resumeTime:Yt().datetime(),eventCount:Hb()})}),n5n=$m.extend({type:pr("session.error"),data:zl({errorType:Yt(),message:Yt(),stack:Yt().optional()})}),r5n=$m.extend({type:pr("session.info"),data:zl({infoType:Yt(),message:Yt()})}),a5n=$m.extend({type:pr("session.model_change"),data:zl({previousModel:Yt().optional(),newModel:Yt()})}),I5n=$m.extend({type:pr("session.import_legacy"),data:zl({legacySession:s7e,importTime:Yt().datetime(),sourceFile:Yt()})}),s5n=$m.extend({type:pr("session.idle"),ephemeral:pr(!0),data:zl({})}),o5n=zl({type:nN(["file","directory"]),path:Yt(),displayName:Yt()}),i5n=$m.extend({type:pr("user.message"),data:zl({content:Yt(),attachments:Td(o5n).optional()})}),c5n=$m.extend({type:pr("assistant.turn_start"),data:zl({turnId:Yt()})}),d5n=$m.extend({type:pr("assistant.message"),data:zl({messageId:Yt(),content:Yt(),toolRequests:Td(zl({toolCallId:Yt(),name:Yt(),arguments:Ow()})).optional()})}),u5n=$m.extend({type:pr("assistant.turn_end"),data:zl({turnId:Yt()})}),m5n=$m.extend({type:pr("assistant.usage"),ephemeral:pr(!0),data:zl({model:Yt().optional(),inputTokens:Hb().optional(),outputTokens:Hb().optional(),cost:Hb().optional(),duration:Hb().optional(),initiator:Yt().optional()})}),b5n=$m.extend({type:pr("abort"),data:zl({reason:Yt()})}),G5n=$m.extend({type:pr("tool.user_requested"),data:zl({toolCallId:Yt(),toolName:Yt(),arguments:Ow()})}),p5n=$m.extend({type:pr("tool.execution_start"),data:zl({toolCallId:Yt(),toolName:Yt(),arguments:Ow()})}),h5n=$m.extend({type:pr("tool.execution_partial_result"),ephemeral:pr(!0),data:zl({toolCallId:Yt(),partialOutput:Yt()})}),A5n=$m.extend({type:pr("tool.execution_complete"),data:zl({toolCallId:Yt(),success:go(),isUserRequested:go().optional(),result:zl({content:Yt()}).optional(),error:zl({message:Yt(),code:Yt().optional()}).optional()})}),g5n=$m.extend({type:pr("hook.start"),data:zl({hookInvocationId:Yt(),hookType:Yt(),input:Ow()})}),Z5n=$m.extend({type:pr("hook.end"),data:zl({hookInvocationId:Yt(),hookType:Yt(),output:Ow(),success:go(),error:zl({message:Yt(),stack:Yt().optional()}).optional()})}),N5n=$m.extend({type:pr("system.message"),data:zl({content:Yt(),role:nN(["system","developer"]),name:Yt().optional(),metadata:zl({promptVersion:Yt().optional(),variables:aY(Ow()).optional()}).optional()})}),DPt=Mde("type",[t5n,l5n,n5n,s5n,r5n,a5n,I5n,i5n,c5n,d5n,u5n,m5n,b5n,G5n,p5n,h5n,A5n,g5n,Z5n,N5n]);var cT=Czt(DPt.parse,"session");var $we=class{constructor(e,l,n,r=!1,a){this.session=e;this.logger=l;this.flushDebounceMs=n;this.shouldSaveSession=r;this.legacySourceFile=a;this.unsubscribe=this.session.on("*",I=>{I.ephemeral||(this.unflushedEvents.push(I),!this.shouldSaveSession&&I.type==="user.message"&&(this.shouldSaveSession=!0),I.type!=="session.resume"&&this.shouldSaveSession&&(this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=setTimeout(()=>{this.flush().catch(s=>{this.logger.error(`Error flushing session ${this.session.sessionId}: ${s instanceof Error?s.message:String(s)}`)})},this.flushDebounceMs)))})}flushTimer=null;unflushedEvents=[];migratedLegacy=!1;isFlushing=!1;needsFlushAfterCurrent=!1;unsubscribe;dispose(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.unsubscribe()}async flush(){if(!this.shouldSaveSession||this.unflushedEvents.length===0)return;if(this.isFlushing){this.needsFlushAfterCurrent=!0;return}this.isFlushing=!0,this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null);let e=this.unflushedEvents;this.unflushedEvents=[];try{if(await cT.append(e,this.session.sessionId),this.logger.debug(`Flushed ${e.length} events to session ${this.session.sessionId}`),this.legacySourceFile&&!this.migratedLegacy){this.logger.debug(`Migrated legacy session ${this.session.sessionId} from ${this.legacySourceFile}`);try{await zPt(this.legacySourceFile)}catch(l){this.logger.error(`Failed to delete legacy session file ${this.legacySourceFile}: ${l}`)}this.migratedLegacy=!0}}catch(l){this.logger.error(`Failed to flush events for ${this.session.sessionId}: ${l instanceof Error?l.message:String(l)}`),this.unflushedEvents.unshift(...e)}finally{this.isFlushing=!1,this.needsFlushAfterCurrent&&(this.needsFlushAfterCurrent=!1,await this.flush())}}},eQe=class extends qwe{sessionWriters={};copilotVersion;flushDebounceMs;constructor({version:e,flushDebounceMs:l,...n}){super({...n}),this.copilotVersion=e||"unknown",this.flushDebounceMs=l||100}async createSession(e){let l=e?.sessionId??mu(),n=new Date,r=new Qf(this.options,{sessionId:l,startTime:n});return this.sessionWriters[l]=new $we(r,this.logger,this.flushDebounceMs),r.emit("session.start",{sessionId:l,version:1,producer:"copilot-agent",copilotVersion:this.copilotVersion,startTime:n.toISOString(),selectedModel:e?.selectedModel}),r}async getSession(e,l=!0){let n,r;try{n=await this.loadSession(e)}catch{try{let a=await this.loadLegacySession(e);n=a.session,r=a.legacySourceFile}catch{return}}return this.sessionWriters[e]||(this.sessionWriters[e]=new $we(n,this.logger,this.flushDebounceMs,!0,r)),l&&n.emit("session.resume",{resumeTime:new Date().toISOString(),eventCount:n.getEvents().length}),n}async saveSession(e){await this.sessionWriters[e.sessionId]?.flush()}async loadSession(e){let l=await cT.load(e);return await Qf.fromEvents(l,this.options)}async loadLegacySession(e){let n=(await ime.directoryFiles()).filter(o=>{let d=o.match(/^session_(.+)_(\d+)\.json$/);return d&&d[1]===e});if(n.length===0)throw new Error(`Legacy session ${e} not found`);let r=n[0];n.length>1&&this.logger.info(`Multiple legacy sessions found for ${e}, using newest`);let a=await ime.load(r);if(!a)throw new Error(`Failed to load legacy session from ${r}`);let I=new Date(a.startTime),s=new Qf(this.options,{sessionId:a.sessionId,startTime:I});return s.emit("session.start",{sessionId:a.sessionId,version:1,producer:"copilot-agent",copilotVersion:this.copilotVersion,startTime:I.toISOString(),selectedModel:a.selectedModel}),s.emit("session.import_legacy",{legacySession:{sessionId:a.sessionId,startTime:I,chatMessages:a.chatMessages,timeline:a.timeline,selectedModel:a.selectedModel},importTime:new Date().toISOString(),sourceFile:r}),this.logger.info(`Loaded legacy session ${e} from ${r}`),{session:s,legacySourceFile:ime.path(r.replace(/\.json$/,""))}}async listSessions(){let e=await cT.directoryFilesWithMetadata(),l=await ime.directoryFilesWithMetadata(),n=await Promise.all(e.map(async I=>({sessionId:I.file.replace(".jsonl",""),startTime:I.ctime,modifiedTime:I.mtime}))),r=(await Promise.all(l.map(async I=>{let s=I.file.match(/^session_(.+)_(\d+)\.json$/);return s?{sessionId:s[1],startTime:I.ctime,modifiedTime:I.mtime}:null}))).filter(I=>I!==null);this.logger.debug(`Found ${n.length} JSONL sessions and ${r.length} legacy sessions`);let a=new Map;for(let I of r)a.set(I.sessionId,I);for(let I of n)a.set(I.sessionId,I);return Array.from(a.values()).sort((I,s)=>s.modifiedTime.getTime()-I.modifiedTime.getTime())}async getLastSession(){let e=await this.listSessions();if(e.length===0)return;e.sort((n,r)=>r.modifiedTime.getTime()-n.modifiedTime.getTime());let l=e[0].sessionId;return await this.getSession(l)}async deleteSession(e){this.sessionWriters[e.sessionId]?.dispose(),delete this.sessionWriters[e.sessionId];let l=cT.path(e.sessionId);this.logger.info(`Deleting session file ${l}`),await zPt(l)}getSessionsDirectory(){return W5n(cT.home(),cT.directory())}setLogger(e){this.logger=e}};c();c();c();c();function Ud(t){return t()}c();var cme;function E5n(t,e){return t.includes("\x1B[?")&&t.includes(e)}async function R5n(t){let e=process.stdin.isRaw;e||process.stdin.setRawMode(!0);try{return await t()}finally{e||process.stdin.setRawMode(!1)}}function PPt(t,e,l){return new Promise(n=>{let r="",a,I=()=>{a=void 0,process.stdin.removeListener("data",s),n(!1)},s=o=>{a!==void 0&&(r+=o.toString(),E5n(r,e)&&(process.stdin.removeListener("data",s),clearTimeout(a),a=void 0,n(!0)))};process.stdin.on("data",s),process.stdout.write("\x1B["+t),a=setTimeout(I,l)})}async function Y5n(){return!(!(process.stdin.isTTY&&process.stdout.isTTY)||!await PPt("?u","u",200)||!await PPt("c","c",1e3))}async function KPt(){cme===void 0&&(cme=await R5n(Y5n),cme===!0&&(V5n(),process.on("exit",jPt),process.on("SIGTERM",jPt)))}function V5n(){process.stdout.write("\x1B[>1u")}function jPt(){process.stdout.write("\x1B[<u"),cme=void 0}function tQe(){return cme===!0}c();c();c();c();function ume(t,e=!1){let l=t.length,n=0,r="",a=0,I=16,s=0,o=0,d=0,u=0,b=0;function p(H,L){let S=0,U=0;for(;S<H||!L;){let O=t.charCodeAt(n);if(O>=48&&O<=57)U=U*16+O-48;else if(O>=65&&O<=70)U=U*16+O-65+10;else if(O>=97&&O<=102)U=U*16+O-97+10;else break;n++,S++}return S<H&&(U=-1),U}function h(H){n=H,r="",a=0,I=16,b=0}function g(){let H=n;if(t.charCodeAt(n)===48)n++;else for(n++;n<t.length&&Vq(t.charCodeAt(n));)n++;if(n<t.length&&t.charCodeAt(n)===46)if(n++,n<t.length&&Vq(t.charCodeAt(n)))for(n++;n<t.length&&Vq(t.charCodeAt(n));)n++;else return b=3,t.substring(H,n);let L=n;if(n<t.length&&(t.charCodeAt(n)===69||t.charCodeAt(n)===101))if(n++,(n<t.length&&t.charCodeAt(n)===43||t.charCodeAt(n)===45)&&n++,n<t.length&&Vq(t.charCodeAt(n))){for(n++;n<t.length&&Vq(t.charCodeAt(n));)n++;L=n}else b=3;return t.substring(H,L)}function N(){let H="",L=n;for(;;){if(n>=l){H+=t.substring(L,n),b=2;break}let S=t.charCodeAt(n);if(S===34){H+=t.substring(L,n),n++;break}if(S===92){if(H+=t.substring(L,n),n++,n>=l){b=2;break}switch(t.charCodeAt(n++)){case 34:H+='"';break;case 92:H+="\\";break;case 47:H+="/";break;case 98:H+="\b";break;case 102:H+="\f";break;case 110:H+=`
|
|
2024
|
+
`),n={};for(let r of l){let a=r.split(/\s+/);if(a.length>=3){let I=a[0],s=a[1],o=a[2].replace(/[()]/g,"");n[I]||(n[I]={Name:I,FetchURL:"",PushURL:""}),o==="fetch"?n[I].FetchURL=s:o==="push"&&(n[I].PushURL=s)}}return Object.values(n)}async function sPt(t){try{let{stdout:e}=await tme("git",["status","--porcelain"],{cwd:t,encoding:"utf8",timeout:5e3,maxBuffer:1048576});return e.trim().length>0}catch{return!1}}async function oPt(t){try{let{stdout:e}=await tme("git",["rev-parse","--abbrev-ref","HEAD"],{cwd:t,encoding:"utf8",timeout:5e3,maxBuffer:1048576}),l=e.trim();if(l==="HEAD"){let{stdout:n}=await tme("git",["rev-parse","--short","HEAD"],{cwd:t,encoding:"utf8",timeout:5e3,maxBuffer:1048576}),r=n.trim();return r?`detached@${r}`:null}return l||null}catch{return null}}c();var JPt=nt(LPt(),1);async function AXn(t={}){let e=await Fgt();return fgt((0,JPt.default)({},e,t))}async function sme(t={}){if(ID())throw new Error("Settings have already been initialized");return AXn(t)}c();import{promises as gXn}from"fs";import xPt from"path";var ZXn=3*1024*1024;function SPt(t){let e=xPt.extname(t).toLowerCase();return[".png",".jpg",".jpeg",".gif",".webp"].includes(e)}function NXn(t){switch(xPt.extname(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";default:return null}}async function WXn(t,e){e.debug(`Processing local image file: ${t}`);let l=await gXn.readFile(t),n=NXn(t);if(!n)throw new Error(`Unsupported image format: ${t}`);let r=new qse,a=await I0e(e,r,ZXn,Pse,n,l);if(!a)throw new Error(`Image too large or couldn't be processed: ${t}`);let I=a.toString("base64");return`data:${n};base64,${I}`}async function yXn(t,e,l){let n=mu();try{let r=await cBe({command:"view",path:t,view_range:void 0},{properties:{command:"view",resolvedPathAgainstCwd:"false",options:"{}",inputs:"[]"},metrics:{responseTokenLimit:void 0,resultLength:0,resultForLlmLength:0},restrictedProperties:{}},e,l);return{id:n,name:"view",arguments:{path:t},result:r.textResultForLlm||""}}catch(r){return{id:n,name:"view",arguments:{path:t},result:`Error reading ${t}: ${r}`}}}async function BPt(t,e,l){let n=[],r=t.filter(I=>!SPt(I.path));if(r.length===0)return n;let a=[];for(let I of r)try{let s=await yXn(I.path,e,l);a.push(s)}catch{}if(a.length>0){let I=a.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.arguments)}}));n.push({role:"assistant",content:"I need to read the content of those paths to answer this request.",tool_calls:I}),n.push(...a.map(s=>({role:"tool",tool_call_id:s.id,content:s.result})))}return n}async function OPt(t,e){let l=t.filter(r=>SPt(r.path));return(await Promise.all(l.map(async r=>{try{return{type:"image_url",image_url:{url:await WXn(r.path,e)}}}catch(a){e.error(`Failed to process image ${r.path}: ${a instanceof Error?a.message:String(a)}`);return}}))).filter(r=>r!==void 0)}var $qe=class{constructor(e,l){this.logger=e;this.session=l}messageQueue=[];async*preRequest(e){this.logger.debug("ImmediatePromptProcessor: Injecting immediate prompts");let n=(await this.session.getChatMessages()).length;for(;this.messageQueue.length>0;){let I=this.messageQueue.shift();this.session.emit("user.message",{content:I.prompt,attachments:I.attachments})}let a=(await this.session.getChatMessages()).slice(n);for(let I of a)e.messages.push(I),yield{kind:"message",message:I,turn:e.turn,source:"immediate-prompt"}}addMessage(e){this.messageQueue.push(e)}toJSON(){return"ImmediatePromptProcessor"}},Qf=class t{sessionId;startTime;modifiedTime;logger;events=[];_chatMessages=[];_selectedModel;eventProcessingQueue=Promise.resolve();eventHandlers={};wildcardEventHandlers=[];isProcessing=!1;messageQueue=[];immediatePromptProcessor;mcpHost;workingDir;abortController;modelProvider;allowedTools;disabledTools;requestPermission;mcpServers;hooks;hmacKey;copilotToken;constructor(e={},l={}){this.sessionId=l.sessionId||mu(),this.startTime=l.startTime||new Date,this.modifiedTime=l.modifiedTime||this.startTime,this.logger=e.logger||new xd,this.modelProvider=e.modelProvider,this.allowedTools=e.allowedTools,this.disabledTools=e.disabledTools,this.requestPermission=e.requestPermission,this.mcpServers=e.mcpServers,this.hooks=e.hooks,this.hmacKey=e.hmacKey,this.copilotToken=e.copilotToken,this.workingDir=e.workingDirectory||process.cwd(),this.immediatePromptProcessor=new $qe(this.logger,this),this.abortController=e.abortController||new AbortController,bY(this.workingDir).then(n=>{if(n.found)return VEe(n.gitRoot,!0,this.workingDir)}).catch(n=>{this.logger.debug(`Failed to initialize custom instructions cache: ${n}`)})}get messageCount(){let e=this.events.find(n=>n.type==="session.import_legacy"),l=0;return e&&(l=(e.data.legacySession?.chatMessages||[]).filter(a=>a.role==="user"||a.role==="assistant").length),this.logger.debug(`Imported message count: ${l}`),this.events.filter(n=>n.type==="user.message"||n.type==="assistant.message").length+l}get summary(){let e=this.events.find(a=>a.type==="session.import_legacy"||a.type==="user.message"),l;if(e?.type==="session.import_legacy"){let a=e.data.legacySession.chatMessages.find(I=>I.role==="user");a?.content&&(typeof a.content=="string"?l=a.content:l=a.content.find(I=>I.type==="text")?.text)}else e?.type==="user.message"&&(l=e.data.content);if(!l)return;let n=l.lastIndexOf("<reminder>");n!==-1&&(l=l.substring(0,n).trim());let r=l.replace(/\s+/g," ").trim();return r.length>75&&(r=r.substring(0,55).trim()+"..."),r=r.split("").filter(a=>{let I=a.charCodeAt(0);return I>=32&&I!==127}).join(""),r}static async fromEvents(e,l={}){if(e.length===0)throw new Error("Cannot create session from empty events array");let n=e[0];if(n.type!=="session.start")throw new Error("First event must be session.start");let r=new t(l,{sessionId:n.data.sessionId,startTime:new Date(n.data.startTime)});r._selectedModel=n.data.selectedModel,r.events.push(n);for(let a=1;a<e.length;a++){let I=e[a];r.events.push(I),await r.processEventForState(I)}return r}on(e,l){return e==="*"?(this.wildcardEventHandlers.push(l),()=>{let n=this.wildcardEventHandlers.indexOf(l);n!==-1&&this.wildcardEventHandlers.splice(n,1)}):(this.eventHandlers[e]||(this.eventHandlers[e]=[]),this.eventHandlers[e].push(l),()=>{let n=this.eventHandlers[e];if(n){let r=n.indexOf(l);r!==-1&&n.splice(r,1)}})}emit(e,l,n=!1){let r=mu(),a=new Date().toISOString(),I=this.getLastEventId(),s={type:e,data:l,id:r,timestamp:a,parentId:I,...n&&{ephemeral:n}};this.events.push(s),this.enqueueEventProcessing(()=>this.processEventForState(s)).catch(o=>{this.logger.error(`Error emitting event: ${o instanceof Error?o.message:String(o)}`)}).catch(o=>{this.logger.error(`Error emitting event ${o instanceof Error?o.message:String(o)}`)}),[...this.eventHandlers[s.type]||[],...this.wildcardEventHandlers].forEach(o=>{try{o(s)}catch(d){this.logger.error(`Error in event handler for event type ${s.type}: ${d instanceof Error?d.message:String(d)}`)}})}emitEphemeral(e,l){this.emit(e,l,!0)}getEvents(){return this.events}async getChatMessages(){return this.enqueueEventProcessing(()=>this._chatMessages)}async getChatContextMessages(){return(await this.getChatMessages()).filter(l=>l.role!=="system")}async getSystemContextMessages(){return(await this.getChatMessages()).filter(l=>l.role==="system")}async getSelectedModel(){return this.enqueueEventProcessing(()=>this._selectedModel)}async setSelectedModel(e){let l=await this.getSelectedModel();this.emit("session.model_change",{previousModel:l,newModel:e})}getLastEventId(){return this.events.length===0?null:this.events[this.events.length-1].id}enqueueEventProcessing(e){let l=this.eventProcessingQueue.then(()=>e());return this.eventProcessingQueue=l,l}async processEventForState(e){switch(e.type){case"session.start":e.data.selectedModel&&(this._selectedModel=e.data.selectedModel);break;case"session.model_change":this._selectedModel=e.data.newModel;break;case"user.message":{let l=[],n=[];if(e.data.attachments&&e.data.attachments.length>0){let r=await OPt(e.data.attachments,this.logger);l.push(...r);let a=await BPt(e.data.attachments,{requestRequired:!1},this.logger);n.push(...a)}l.length>0?this._chatMessages.push({role:"user",content:[{type:"text",text:e.data.content},...l]}):this._chatMessages.push({role:"user",content:e.data.content}),n.length>0&&this._chatMessages.push(...n);break}case"assistant.message":{if(e.ephemeral)break;let l={role:"assistant",content:e.data.content||null};e.data.toolRequests&&e.data.toolRequests.length>0&&(l.tool_calls=e.data.toolRequests.map(n=>({id:n.toolCallId,type:"function",function:{name:n.name,arguments:typeof n.arguments=="string"?n.arguments:JSON.stringify(n.arguments)}}))),this._chatMessages.push(l);break}case"tool.execution_complete":{e.data.isUserRequested||this._chatMessages.push({role:"tool",tool_call_id:e.data.toolCallId,content:e.data.success?e.data.result?.content||"":e.data.error?.message||"Tool execution failed"});break}case"system.message":this._chatMessages.push({role:e.data.role,content:e.data.content,...e.data.name&&{name:e.data.name}});break;case"session.import_legacy":this._chatMessages=[...e.data.legacySession.chatMessages],e.data.legacySession.selectedModel&&(this._selectedModel=e.data.legacySession.selectedModel);break;case"abort":case"session.resume":this._chatMessages=EXn(this._chatMessages,this.logger);break;case"session.idle":case"session.error":case"session.info":case"assistant.turn_start":case"assistant.turn_end":case"assistant.usage":case"tool.user_requested":case"tool.execution_start":case"tool.execution_partial_result":case"hook.start":case"hook.end":break;default:{let l=e;this.logger.error(`Unknown event type: ${l.type}`);break}}}async send(e,l={}){if((l.mode||"enqueue")==="immediate"&&this.isProcessing)this.immediatePromptProcessor.addMessage(e);else{if(this.messageQueue.push(e),this.isProcessing)return;for(this.isProcessing=!0,await this.initializeMcpHost();this.messageQueue.length>0;){let r=this.messageQueue.shift();await this.runAgenticLoop(r.prompt,r.attachments)}this.isProcessing=!1,this.emit("session.idle",{})}}async abort(){this.abortController.abort()}async initializeMcpHost(){if(!this.mcpHost&&this.mcpServers&&Object.keys(this.mcpServers).length>0)try{this.mcpHost=new bq(this.logger,{mcpServers:this.mcpServers},this.disabledTools),await this.mcpHost.startServers()}catch(e){this.logger.error(`Failed to initialize MCP host: ${e}`)}}async runAgenticLoop(e,l=[]){if(!this.modelProvider)throw new Error("Session must be created with modelProvider to use send/query methods");let n=new Map,r=new Map;try{let I=(await LL(this.hooks?.userPromptSubmitted,{timestamp:Date.now(),cwd:this.workingDir,prompt:e},this.logger))?.modifiedPrompt??e;this.emit("user.message",{content:W6({problemStatement:I,capabilities:{}}),attachments:l});let o=new _X().setProblemStatement(I).setAgentModel(this.buildAgentModelString()).setGithubRepoName("copilot-sdk-session").setGithubRepoCommit("copilot-sdk-commit").setGithubRepoReadWrite(!1).setCopilotIntegrationId("copilot-developer-cli").setCopilotHmacKey(this.hmacKey).setCopilotToken(this.copilotToken).build();Wx();let d=await sme(o),u=d.service?.agent?.model,b=QB(u),p=b.agent,h=p??"sweagent-capi",g=b.model?{model:b.model}:void 0,N=xde(d,this.logger,p,g),y={location:this.workingDir,timeout:3e4,requireReasoning:!0,toolPartialResultCallback:(Ie,se)=>{this.emitEphemeral("tool.execution_partial_result",{toolCallId:Ie,partialOutput:se})},permissions:this.requestPermission?{requestRequired:!0,request:this.requestPermission}:{requestRequired:!1},shellConfig:(process.platform==="win32"?pp.powerShell:pp.bash).withScriptSafetyAssessor(async function(Ie){return{result:"completed",commands:[{identifier:Ie,readOnly:!1}],possiblePaths:[],hasWriteFileRedirection:!1,canOfferSessionApproval:!1}})},Y=await _1e(y,this.logger),w=[];if(this.mcpHost)try{w=await this.mcpHost.getTools(d,this.logger,y.permissions)}catch(Ie){this.logger.error(`Failed to get MCP tools: ${Ie}`)}let H=[...Y,...w].filter(Ie=>this.allowedTools?this.allowedTools.includes(Ie.name):this.disabledTools?!this.disabledTools.includes(Ie.name):!0),L=await bY(this.workingDir),U={...(z1e()[h]?.[N.model]??D1e()).supports,reasoning:!0},O=await r0e(L.found?L.gitRoot:"",Q8(),this.workingDir,{},U,y,H,void 0),z=(await this.getChatMessages()).slice(0,-1),he={role:"user",content:W6({customAgentPrompt:void 0,problemStatement:I,capabilities:U})},Ge=[...z,he];await LL(this.hooks?.sessionStart,{timestamp:Date.now(),cwd:this.workingDir,source:"new",initialPrompt:e},this.logger);let q=new j4(he,this.logger),M=N.getCompletionWithTools(O,Ge,H,{failIfInitialInputsTooLong:!1,processors:{preRequest:[q,this.immediatePromptProcessor,new gO(this.logger)],onRequestError:[q]},executeToolsInParallel:!1,abortSignal:this.abortController.signal});for await(let Ie of M){if(this.abortController.signal.aborted){this.emit("abort",{reason:"user initiated"});break}switch(Ie.kind){case"message":{if(mL(Ie)){let se=k8(Ie)?await Promise.all(Ie.message.tool_calls.map(async Ee=>{let me=$k(Ee.function.arguments);n.set(Ee.id,Ee.function.name),r.set(Ee.id,me);let ve=await LL(this.hooks?.preToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:Ee.function.name,toolArgs:me},this.logger);return{toolCallId:Ee.id,name:Ee.function.name,arguments:ve?.modifiedArgs??me}})):[];this.emit("assistant.message",{messageId:mu(),content:typeof Ie.message.content=="string"?Ie.message.content:"",toolRequests:se});for(let Ee of se)this.emit("tool.execution_start",{toolCallId:Ee.toolCallId,toolName:Ee.name,arguments:Ee.arguments})}else(Ie.message.role==="system"||Ie.message.role==="developer")&&this.emit("system.message",{role:Ie.message.role,content:typeof Ie.message.content=="string"?Ie.message.content:JSON.stringify(Ie.message.content),name:"name"in Ie.message?Ie.message.name:void 0});break}case"model_call_failure":{let se=new Error(Ie.modelCall?.error||"Model call failed");await LL(this.hooks?.errorOccurred,{timestamp:Date.now(),cwd:this.workingDir,error:se,errorContext:"model_call",recoverable:!0},this.logger),this.emit("session.error",{errorType:"model_call",message:se.message,stack:se.stack});break}case"tool_execution":{let Ee=(await LL(this.hooks?.postToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:n.get(Ie.toolCallId)||"unknown",toolArgs:r.get(Ie.toolCallId)||{},toolResult:Ie.toolResult},this.logger))?.modifiedResult??Ie.toolResult,me=(Ee.resultType==="failure"?Ee.error:void 0)||Ee.sessionLog||Ee.textResultForLlm;this.emit("tool.execution_complete",{toolCallId:Ie.toolCallId,success:Ee.resultType==="success",result:Ee.resultType==="success"?{content:me}:void 0,error:Ee.resultType!=="success"?{message:me,code:Ee.resultType}:void 0});break}case"turn_started":{this.emit("assistant.turn_start",{turnId:`${Ie.turn}`});break}case"turn_ended":{this.emit("assistant.turn_end",{turnId:`${Ie.turn}`});break}case"response":case"images_removed":case"image_processing":case"history_truncated":case"turn_failed":case"turn_retry":case"model_call_success":this.logger.debug(`Ignoring event of kind: ${Ie.kind}`);break;default:xm(Ie,"Unhandled event type")}}}catch(a){await LL(this.hooks?.sessionEnd,{timestamp:Date.now(),cwd:this.workingDir,reason:"error",error:a instanceof Error?a:new Error(String(a))},this.logger),this.emit("session.error",{errorType:"query",message:a instanceof Error?a.message:String(a),stack:a instanceof Error?a.stack:void 0})}finally{await LL(this.hooks?.sessionEnd,{timestamp:Date.now(),cwd:this.workingDir,reason:"complete"},this.logger)}}buildAgentModelString(){if(!this.modelProvider)throw new Error("Session must be created with modelProvider");switch(this.modelProvider.type){case"openai":return`openai:${this.modelProvider.model}`;case"anthropic":return`anthropic:${this.modelProvider.model}`;case"copilot":return`capi:${this.modelProvider.model}`;default:throw new Error(`Unsupported provider: ${this.modelProvider.type}`)}}};function EXn(t,e){if(t.length===0)return t;let l=[],n=new Set,r=!1;for(let s=t.length-1;s>=0;s--){let o=t[s];if(o.role==="assistant"&&(r=!0),o.role==="assistant"&&"tool_calls"in o&&o.tool_calls&&o.tool_calls.length>0)for(let d of o.tool_calls)n.has(d.id)||l.push(d.id);else{if(r)break;o.role==="tool"&&o.tool_call_id&&n.add(o.tool_call_id)}}if(l.length===0)return t;let a="The execution of this tool, or a previous tool was interrupted.";e.info(`Completing ${l.length} orphaned tool calls.`);let I=l.map(s=>({role:"tool",tool_call_id:s,content:a}));return[...t,...I]}c();var qwe=class{sessions;logger;options;lastAccessedSessionId;constructor(e){this.options=e,this.sessions=new Map,this.logger=e.logger||new xd}async createSession(){let e=new Qf(this.options);return this.sessions.set(e.sessionId,e),this.lastAccessedSessionId=e.sessionId,e}async getSession(e){let l=this.sessions.get(e);return l&&(this.lastAccessedSessionId=e),l}async getLastSession(){if(this.lastAccessedSessionId){let n=this.sessions.get(this.lastAccessedSessionId);if(n)return n}let e=Array.from(this.sessions.values());if(e.length===0)return;e.sort((n,r)=>r.startTime.getTime()-n.startTime.getTime());let l=e[0];return this.lastAccessedSessionId=l.sessionId,l}async listSessions(){return Array.from(this.sessions.values()).map(e=>({sessionId:e.sessionId,startTime:e.startTime,modifiedTime:e.modifiedTime}))}async saveSession(e){}async deleteSession(e){this.sessions.delete(e.sessionId),this.lastAccessedSessionId===e.sessionId&&(this.lastAccessedSessionId=void 0)}async closeSession(e){}};c();c();var RXn=zl({type:pr("copilot"),text:Yt(),isStreaming:go().optional()}),YXn=zl({type:pr("error"),text:Yt()}),VXn=zl({type:pr("info"),text:Yt()}),QQI=zl({displayText:Yt(),fullPath:Yt(),type:nN(["file","directory","unresolved","image"]),startIndex:Hb()}),wXn=zl({type:pr("user"),text:Yt()}),Yq=zl({command:Yt(),description:Yt(),timeout:Hb().optional(),sessionId:Yt().optional(),async:go().optional()}),e7e=zl({sessionId:Yt(),input:Yt(),delay:Hb().optional()}),t7e=zl({sessionId:Yt(),delay:Hb()}),l7e=zl({sessionId:Yt()}),TPt=Uh([Yq,e7e,t7e,l7e]),QXn=zl({command:pr("view"),path:Yt(),view_range:eVe([Hb(),Hb()]).optional()}),FXn=zl({command:pr("create"),path:Yt(),file_text:Yt()}),CXn=zl({command:pr("str_replace"),path:Yt(),new_str:Yt().optional(),old_str:Yt()}),vXn=zl({command:pr("insert"),path:Yt(),insert_line:Hb(),new_str:Yt()}),n7e=Mde("command",[QXn,FXn,CXn,vXn]),r7e=zl({path:Yt(),view_range:eVe([Hb(),Hb()]).optional()}),a7e=zl({path:Yt(),file_text:Yt()}),I7e=zl({path:Yt(),old_str:Yt(),new_str:Yt().optional()}),UPt=Uh([TPt,n7e,Ow()]),fXn=zl({type:pr("tool_call_requested"),callId:Yt(),name:Yt(),toolTitle:Yt().optional(),intentionSummary:Yt().nullable(),arguments:UPt,partialOutput:Yt().optional(),isHidden:go().optional(),isAlwaysExpanded:go().optional(),showNoContent:go().optional()}),HXn=zl({type:pr("tool_call_completed"),callId:Yt(),name:Yt(),toolTitle:Yt().optional(),intentionSummary:Yt().nullable(),result:Uh([zl({type:pr("success"),log:Yt(),markdown:go().optional()}),zl({type:pr("failure"),log:Yt(),markdown:go().optional()}),zl({type:pr("rejected"),markdown:go().optional()}),zl({type:pr("denied"),log:Yt(),markdown:go().optional()})]),arguments:UPt,isHidden:go().optional(),isAlwaysExpanded:go().optional(),showNoContent:go().optional()}),XXn=Uh([RXn,YXn,VXn,wXn,fXn,HXn]),MPt=XXn.and(zl({id:Yt(),timestamp:_de.date()}));function _Pt(t,e){switch(t.type){case"copilot":return e.onCopilot(t);case"error":return e.onError(t);case"info":return e.onInfo(t);case"tool_call_requested":return e.onToolCallRequested(t);case"tool_call_completed":return e.onToolCallCompleted(t);case"user":return e.onUser(t);default:{let l=t;throw new Error(`Unexpected message type: ${JSON.stringify(t)}`)}}}var iT=class t extends Error{prUrl;timeoutContext;constructor(e,l,n){super(e),this.name="JobStatusTimeoutError",this.timeoutContext=l,this.prUrl=n,Error.captureStackTrace&&Error.captureStackTrace(this,t)}};var ome=zl({type:pr("text"),text:Yt()}),kXn=zl({type:pr("refusal"),refusal:Yt()}),LXn=zl({type:pr("image_url"),image_url:zl({url:Yt(),detail:nN(["auto","low","high"]).optional()})}),JXn=zl({type:pr("input_audio"),input_audio:zl({data:Yt(),format:pr("wav").or(pr("mp3"))})}),xXn=zl({type:pr("file"),file:zl({file_date:Yt().optional(),file_id:Yt().optional(),filename:Yt().optional()})}),SXn=Uh([ome,LXn,JXn,xXn]),BXn=zl({name:Yt(),arguments:Yt()}),OXn=zl({name:Yt(),input:Yt()}),TXn=zl({id:Yt(),type:pr("function"),function:BXn}),UXn=zl({id:Yt(),type:pr("custom"),custom:OXn}),MXn=Uh([TXn,UXn]),_Xn=zl({name:Yt(),arguments:Yt()}),DXn=zl({id:Yt()}),zXn=zl({content:Uh([Yt(),Td(ome)]),role:pr("developer"),name:Yt().optional()}),PXn=zl({content:Uh([Yt(),Td(ome)]),role:pr("system"),name:Yt().optional()}),jXn=zl({content:Uh([Yt(),Td(SXn)]),role:pr("user"),name:Yt().optional()}),KXn=zl({content:Uh([Yt(),Td(Uh([ome,kXn]))]).nullable().optional(),role:pr("assistant"),name:Yt().optional(),refusal:Yt().nullable().optional(),audio:DXn.nullable().optional(),function_call:_Xn.nullable().optional(),tool_calls:Td(MXn).optional()}),qXn=zl({content:Uh([Yt(),Td(ome)]),role:pr("tool"),tool_call_id:Yt()}),$Xn=zl({content:Yt().nullable(),role:pr("function"),name:Yt()}),e5n=Uh([zXn,PXn,jXn,KXn,qXn,$Xn]),s7e=zl({sessionId:Yt(),startTime:_de.date(),chatMessages:Td(e5n),timeline:Td(MPt),selectedModel:nN(nT).optional()}),ime=Xwe(s7e.parse,"history-session");c();c();var $m=zl({id:Yt().uuid(),timestamp:Yt().datetime(),parentId:Yt().uuid().nullable(),ephemeral:go().optional()}),t5n=$m.extend({type:pr("session.start"),data:zl({sessionId:Yt(),version:Hb(),producer:Yt(),copilotVersion:Yt(),startTime:Yt().datetime(),selectedModel:Yt().optional()})}),l5n=$m.extend({type:pr("session.resume"),data:zl({resumeTime:Yt().datetime(),eventCount:Hb()})}),n5n=$m.extend({type:pr("session.error"),data:zl({errorType:Yt(),message:Yt(),stack:Yt().optional()})}),r5n=$m.extend({type:pr("session.info"),data:zl({infoType:Yt(),message:Yt()})}),a5n=$m.extend({type:pr("session.model_change"),data:zl({previousModel:Yt().optional(),newModel:Yt()})}),I5n=$m.extend({type:pr("session.import_legacy"),data:zl({legacySession:s7e,importTime:Yt().datetime(),sourceFile:Yt()})}),s5n=$m.extend({type:pr("session.idle"),ephemeral:pr(!0),data:zl({})}),o5n=zl({type:nN(["file","directory"]),path:Yt(),displayName:Yt()}),i5n=$m.extend({type:pr("user.message"),data:zl({content:Yt(),attachments:Td(o5n).optional()})}),c5n=$m.extend({type:pr("assistant.turn_start"),data:zl({turnId:Yt()})}),d5n=$m.extend({type:pr("assistant.message"),data:zl({messageId:Yt(),content:Yt(),toolRequests:Td(zl({toolCallId:Yt(),name:Yt(),arguments:Ow()})).optional()})}),u5n=$m.extend({type:pr("assistant.turn_end"),data:zl({turnId:Yt()})}),m5n=$m.extend({type:pr("assistant.usage"),ephemeral:pr(!0),data:zl({model:Yt().optional(),inputTokens:Hb().optional(),outputTokens:Hb().optional(),cost:Hb().optional(),duration:Hb().optional(),initiator:Yt().optional()})}),b5n=$m.extend({type:pr("abort"),data:zl({reason:Yt()})}),G5n=$m.extend({type:pr("tool.user_requested"),data:zl({toolCallId:Yt(),toolName:Yt(),arguments:Ow()})}),p5n=$m.extend({type:pr("tool.execution_start"),data:zl({toolCallId:Yt(),toolName:Yt(),arguments:Ow()})}),h5n=$m.extend({type:pr("tool.execution_partial_result"),ephemeral:pr(!0),data:zl({toolCallId:Yt(),partialOutput:Yt()})}),A5n=$m.extend({type:pr("tool.execution_complete"),data:zl({toolCallId:Yt(),success:go(),isUserRequested:go().optional(),result:zl({content:Yt()}).optional(),error:zl({message:Yt(),code:Yt().optional()}).optional()})}),g5n=$m.extend({type:pr("hook.start"),data:zl({hookInvocationId:Yt(),hookType:Yt(),input:Ow()})}),Z5n=$m.extend({type:pr("hook.end"),data:zl({hookInvocationId:Yt(),hookType:Yt(),output:Ow(),success:go(),error:zl({message:Yt(),stack:Yt().optional()}).optional()})}),N5n=$m.extend({type:pr("system.message"),data:zl({content:Yt(),role:nN(["system","developer"]),name:Yt().optional(),metadata:zl({promptVersion:Yt().optional(),variables:aY(Ow()).optional()}).optional()})}),DPt=Mde("type",[t5n,l5n,n5n,s5n,r5n,a5n,I5n,i5n,c5n,d5n,u5n,m5n,b5n,G5n,p5n,h5n,A5n,g5n,Z5n,N5n]);var cT=Czt(DPt.parse,"session");var $we=class{constructor(e,l,n,r=!1,a){this.session=e;this.logger=l;this.flushDebounceMs=n;this.shouldSaveSession=r;this.legacySourceFile=a;this.unsubscribe=this.session.on("*",I=>{I.ephemeral||(this.unflushedEvents.push(I),!this.shouldSaveSession&&I.type==="user.message"&&(this.shouldSaveSession=!0),I.type!=="session.resume"&&this.shouldSaveSession&&(this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=setTimeout(()=>{this.flush().catch(s=>{this.logger.error(`Error flushing session ${this.session.sessionId}: ${s instanceof Error?s.message:String(s)}`)})},this.flushDebounceMs)))})}flushTimer=null;unflushedEvents=[];migratedLegacy=!1;isFlushing=!1;needsFlushAfterCurrent=!1;unsubscribe;dispose(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.unsubscribe()}async flush(){if(!this.shouldSaveSession||this.unflushedEvents.length===0)return;if(this.isFlushing){this.needsFlushAfterCurrent=!0;return}this.isFlushing=!0,this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null);let e=this.unflushedEvents;this.unflushedEvents=[];try{if(await cT.append(e,this.session.sessionId),this.logger.debug(`Flushed ${e.length} events to session ${this.session.sessionId}`),this.legacySourceFile&&!this.migratedLegacy){this.logger.debug(`Migrated legacy session ${this.session.sessionId} from ${this.legacySourceFile}`);try{await zPt(this.legacySourceFile)}catch(l){this.logger.error(`Failed to delete legacy session file ${this.legacySourceFile}: ${l}`)}this.migratedLegacy=!0}}catch(l){this.logger.error(`Failed to flush events for ${this.session.sessionId}: ${l instanceof Error?l.message:String(l)}`),this.unflushedEvents.unshift(...e)}finally{this.isFlushing=!1,this.needsFlushAfterCurrent&&(this.needsFlushAfterCurrent=!1,await this.flush())}}},eQe=class extends qwe{sessionWriters={};copilotVersion;flushDebounceMs;constructor({version:e,flushDebounceMs:l,...n}){super({...n}),this.copilotVersion=e||"unknown",this.flushDebounceMs=l||100}async createSession(e){let l=e?.sessionId??mu(),n=new Date,r=new Qf(this.options,{sessionId:l,startTime:n});return this.sessionWriters[l]=new $we(r,this.logger,this.flushDebounceMs),r.emit("session.start",{sessionId:l,version:1,producer:"copilot-agent",copilotVersion:this.copilotVersion,startTime:n.toISOString(),selectedModel:e?.selectedModel}),r}async getSession(e,l=!0){let n,r;try{n=await this.loadSession(e)}catch{try{let a=await this.loadLegacySession(e);n=a.session,r=a.legacySourceFile}catch{return}}return this.sessionWriters[e]||(this.sessionWriters[e]=new $we(n,this.logger,this.flushDebounceMs,!0,r)),l&&n.emit("session.resume",{resumeTime:new Date().toISOString(),eventCount:n.getEvents().length}),n}async saveSession(e){await this.sessionWriters[e.sessionId]?.flush()}async loadSession(e){let l=await cT.load(e);return await Qf.fromEvents(l,this.options)}async loadLegacySession(e){let n=(await ime.directoryFiles()).filter(o=>{let d=o.match(/^session_(.+)_(\d+)\.json$/);return d&&d[1]===e});if(n.length===0)throw new Error(`Legacy session ${e} not found`);let r=n[0];n.length>1&&this.logger.info(`Multiple legacy sessions found for ${e}, using newest`);let a=await ime.load(r);if(!a)throw new Error(`Failed to load legacy session from ${r}`);let I=new Date(a.startTime),s=new Qf(this.options,{sessionId:a.sessionId,startTime:I});return s.emit("session.start",{sessionId:a.sessionId,version:1,producer:"copilot-agent",copilotVersion:this.copilotVersion,startTime:I.toISOString(),selectedModel:a.selectedModel}),s.emit("session.import_legacy",{legacySession:{sessionId:a.sessionId,startTime:I,chatMessages:a.chatMessages,timeline:a.timeline,selectedModel:a.selectedModel},importTime:new Date().toISOString(),sourceFile:r}),this.logger.info(`Loaded legacy session ${e} from ${r}`),{session:s,legacySourceFile:ime.path(r.replace(/\.json$/,""))}}async listSessions(){let e=await cT.directoryFilesWithMetadata(),l=await ime.directoryFilesWithMetadata(),n=await Promise.all(e.map(async I=>({sessionId:I.file.replace(".jsonl",""),startTime:I.ctime,modifiedTime:I.mtime}))),r=(await Promise.all(l.map(async I=>{let s=I.file.match(/^session_(.+)_(\d+)\.json$/);return s?{sessionId:s[1],startTime:I.ctime,modifiedTime:I.mtime}:null}))).filter(I=>I!==null);this.logger.debug(`Found ${n.length} JSONL sessions and ${r.length} legacy sessions`);let a=new Map;for(let I of r)a.set(I.sessionId,I);for(let I of n)a.set(I.sessionId,I);return Array.from(a.values()).sort((I,s)=>s.modifiedTime.getTime()-I.modifiedTime.getTime())}async getLastSession(){let e=await this.listSessions();if(e.length===0)return;e.sort((n,r)=>r.modifiedTime.getTime()-n.modifiedTime.getTime());let l=e[0].sessionId;return await this.getSession(l)}async deleteSession(e){await this.closeSession(e);let l=cT.path(e.sessionId);this.logger.info(`Deleting session file ${l}`),await zPt(l)}async closeSession(e){this.logger.info(`Closing session ${e.sessionId}`);let l=this.sessionWriters[e.sessionId];l&&(await l.flush(),l.dispose(),delete this.sessionWriters[e.sessionId])}getSessionsDirectory(){return W5n(cT.home(),cT.directory())}setLogger(e){this.logger=e}};c();c();c();c();function Ud(t){return t()}c();var cme;function E5n(t,e){return t.includes("\x1B[?")&&t.includes(e)}async function R5n(t){let e=process.stdin.isRaw;e||process.stdin.setRawMode(!0);try{return await t()}finally{e||process.stdin.setRawMode(!1)}}function PPt(t,e,l){return new Promise(n=>{let r="",a,I=()=>{a=void 0,process.stdin.removeListener("data",s),n(!1)},s=o=>{a!==void 0&&(r+=o.toString(),E5n(r,e)&&(process.stdin.removeListener("data",s),clearTimeout(a),a=void 0,n(!0)))};process.stdin.on("data",s),process.stdout.write("\x1B["+t),a=setTimeout(I,l)})}async function Y5n(){return!(!(process.stdin.isTTY&&process.stdout.isTTY)||!await PPt("?u","u",200)||!await PPt("c","c",1e3))}async function KPt(){cme===void 0&&(cme=await R5n(Y5n),cme===!0&&(V5n(),process.on("exit",jPt),process.on("SIGTERM",jPt)))}function V5n(){process.stdout.write("\x1B[>1u")}function jPt(){process.stdout.write("\x1B[<u"),cme=void 0}function tQe(){return cme===!0}c();c();c();c();function ume(t,e=!1){let l=t.length,n=0,r="",a=0,I=16,s=0,o=0,d=0,u=0,b=0;function p(H,L){let S=0,U=0;for(;S<H||!L;){let O=t.charCodeAt(n);if(O>=48&&O<=57)U=U*16+O-48;else if(O>=65&&O<=70)U=U*16+O-65+10;else if(O>=97&&O<=102)U=U*16+O-97+10;else break;n++,S++}return S<H&&(U=-1),U}function h(H){n=H,r="",a=0,I=16,b=0}function g(){let H=n;if(t.charCodeAt(n)===48)n++;else for(n++;n<t.length&&Vq(t.charCodeAt(n));)n++;if(n<t.length&&t.charCodeAt(n)===46)if(n++,n<t.length&&Vq(t.charCodeAt(n)))for(n++;n<t.length&&Vq(t.charCodeAt(n));)n++;else return b=3,t.substring(H,n);let L=n;if(n<t.length&&(t.charCodeAt(n)===69||t.charCodeAt(n)===101))if(n++,(n<t.length&&t.charCodeAt(n)===43||t.charCodeAt(n)===45)&&n++,n<t.length&&Vq(t.charCodeAt(n))){for(n++;n<t.length&&Vq(t.charCodeAt(n));)n++;L=n}else b=3;return t.substring(H,L)}function N(){let H="",L=n;for(;;){if(n>=l){H+=t.substring(L,n),b=2;break}let S=t.charCodeAt(n);if(S===34){H+=t.substring(L,n),n++;break}if(S===92){if(H+=t.substring(L,n),n++,n>=l){b=2;break}switch(t.charCodeAt(n++)){case 34:H+='"';break;case 92:H+="\\";break;case 47:H+="/";break;case 98:H+="\b";break;case 102:H+="\f";break;case 110:H+=`
|
|
2025
2025
|
`;break;case 114:H+="\r";break;case 116:H+=" ";break;case 117:let O=p(4,!0);O>=0?H+=String.fromCharCode(O):b=4;break;default:b=5}L=n;continue}if(S>=0&&S<=31)if(dme(S)){H+=t.substring(L,n),b=2;break}else b=6;n++}return H}function y(){if(r="",b=0,a=n,o=s,u=d,n>=l)return a=l,I=17;let H=t.charCodeAt(n);if(o7e(H)){do n++,r+=String.fromCharCode(H),H=t.charCodeAt(n);while(o7e(H));return I=15}if(dme(H))return n++,r+=String.fromCharCode(H),H===13&&t.charCodeAt(n)===10&&(n++,r+=`
|
|
2026
2026
|
`),s++,d=n,I=14;switch(H){case 123:return n++,I=1;case 125:return n++,I=2;case 91:return n++,I=3;case 93:return n++,I=4;case 58:return n++,I=6;case 44:return n++,I=5;case 34:return n++,r=N(),I=10;case 47:let L=n-1;if(t.charCodeAt(n+1)===47){for(n+=2;n<l&&!dme(t.charCodeAt(n));)n++;return r=t.substring(L,n),I=12}if(t.charCodeAt(n+1)===42){n+=2;let S=l-1,U=!1;for(;n<S;){let O=t.charCodeAt(n);if(O===42&&t.charCodeAt(n+1)===47){n+=2,U=!0;break}n++,dme(O)&&(O===13&&t.charCodeAt(n)===10&&n++,s++,d=n)}return U||(n++,b=1),r=t.substring(L,n),I=13}return r+=String.fromCharCode(H),n++,I=16;case 45:if(r+=String.fromCharCode(H),n++,n===l||!Vq(t.charCodeAt(n)))return I=16;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return r+=g(),I=11;default:for(;n<l&&Y(H);)n++,H=t.charCodeAt(n);if(a!==n){switch(r=t.substring(a,n),r){case"true":return I=8;case"false":return I=9;case"null":return I=7}return I=16}return r+=String.fromCharCode(H),n++,I=16}}function Y(H){if(o7e(H)||dme(H))return!1;switch(H){case 125:case 93:case 123:case 91:case 34:case 58:case 44:case 47:return!1}return!0}function w(){let H;do H=y();while(H>=12&&H<=15);return H}return{setPosition:h,getPosition:()=>n,scan:e?w:y,getToken:()=>I,getTokenValue:()=>r,getTokenOffset:()=>a,getTokenLength:()=>n-a,getTokenStartLine:()=>o,getTokenStartCharacter:()=>a-u,getTokenError:()=>b}}function o7e(t){return t===32||t===9}function dme(t){return t===10||t===13}function Vq(t){return t>=48&&t<=57}var qPt;(function(t){t[t.lineFeed=10]="lineFeed",t[t.carriageReturn=13]="carriageReturn",t[t.space=32]="space",t[t._0=48]="_0",t[t._1=49]="_1",t[t._2=50]="_2",t[t._3=51]="_3",t[t._4=52]="_4",t[t._5=53]="_5",t[t._6=54]="_6",t[t._7=55]="_7",t[t._8=56]="_8",t[t._9=57]="_9",t[t.a=97]="a",t[t.b=98]="b",t[t.c=99]="c",t[t.d=100]="d",t[t.e=101]="e",t[t.f=102]="f",t[t.g=103]="g",t[t.h=104]="h",t[t.i=105]="i",t[t.j=106]="j",t[t.k=107]="k",t[t.l=108]="l",t[t.m=109]="m",t[t.n=110]="n",t[t.o=111]="o",t[t.p=112]="p",t[t.q=113]="q",t[t.r=114]="r",t[t.s=115]="s",t[t.t=116]="t",t[t.u=117]="u",t[t.v=118]="v",t[t.w=119]="w",t[t.x=120]="x",t[t.y=121]="y",t[t.z=122]="z",t[t.A=65]="A",t[t.B=66]="B",t[t.C=67]="C",t[t.D=68]="D",t[t.E=69]="E",t[t.F=70]="F",t[t.G=71]="G",t[t.H=72]="H",t[t.I=73]="I",t[t.J=74]="J",t[t.K=75]="K",t[t.L=76]="L",t[t.M=77]="M",t[t.N=78]="N",t[t.O=79]="O",t[t.P=80]="P",t[t.Q=81]="Q",t[t.R=82]="R",t[t.S=83]="S",t[t.T=84]="T",t[t.U=85]="U",t[t.V=86]="V",t[t.W=87]="W",t[t.X=88]="X",t[t.Y=89]="Y",t[t.Z=90]="Z",t[t.asterisk=42]="asterisk",t[t.backslash=92]="backslash",t[t.closeBrace=125]="closeBrace",t[t.closeBracket=93]="closeBracket",t[t.colon=58]="colon",t[t.comma=44]="comma",t[t.dot=46]="dot",t[t.doubleQuote=34]="doubleQuote",t[t.minus=45]="minus",t[t.openBrace=123]="openBrace",t[t.openBracket=91]="openBracket",t[t.plus=43]="plus",t[t.slash=47]="slash",t[t.formFeed=12]="formFeed",t[t.tab=9]="tab"})(qPt||(qPt={}));c();var ay=new Array(20).fill(0).map((t,e)=>" ".repeat(e)),wq=200,i7e={" ":{"\n":new Array(wq).fill(0).map((t,e)=>`
|
|
2027
2027
|
`+" ".repeat(e)),"\r":new Array(wq).fill(0).map((t,e)=>"\r"+" ".repeat(e)),"\r\n":new Array(wq).fill(0).map((t,e)=>`\r
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@github/copilot",
|
|
3
3
|
"description": "GitHub Copilot CLI brings the power of Copilot coding agent directly to your terminal.",
|
|
4
|
-
"version": "0.0.350-
|
|
4
|
+
"version": "0.0.350-19",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"repository": {
|
|
@@ -37,6 +37,6 @@
|
|
|
37
37
|
"worker/**/*"
|
|
38
38
|
],
|
|
39
39
|
"buildMetadata": {
|
|
40
|
-
"gitCommit": "
|
|
40
|
+
"gitCommit": "3e42751"
|
|
41
41
|
}
|
|
42
42
|
}
|
package/sdk/index.d.ts
CHANGED
|
@@ -356,6 +356,10 @@ declare class CLISessionManager extends SessionManager {
|
|
|
356
356
|
* Delete a session from disk
|
|
357
357
|
*/
|
|
358
358
|
deleteSession(session: Session): Promise<void>;
|
|
359
|
+
/**
|
|
360
|
+
* Close session - flushes pending data and cleans up resources but keeps session in memory
|
|
361
|
+
*/
|
|
362
|
+
closeSession(session: Session): Promise<void>;
|
|
359
363
|
/**
|
|
360
364
|
* Get the sessions directory path (for debugging/logging)
|
|
361
365
|
*/
|
|
@@ -5595,6 +5599,10 @@ export declare class SessionManager {
|
|
|
5595
5599
|
* Delete session from memory
|
|
5596
5600
|
*/
|
|
5597
5601
|
deleteSession(session: Session): Promise<void>;
|
|
5602
|
+
/**
|
|
5603
|
+
* Close session - flushes any pending data but keeps session in memory
|
|
5604
|
+
*/
|
|
5605
|
+
closeSession(_session: Session): Promise<void>;
|
|
5598
5606
|
}
|
|
5599
5607
|
|
|
5600
5608
|
/**
|
package/sdk/index.js
CHANGED
|
@@ -1452,11 +1452,11 @@ Pay attention to the following when using it:
|
|
|
1452
1452
|
`}var tst=h_.platform==="win32"?["APPDATA","HOMEDRIVE","HOMEPATH","LOCALAPPDATA","PATH","PROCESSOR_ARCHITECTURE","SYSTEMDRIVE","SYSTEMROOT","TEMP","USERNAME","USERPROFILE","PROGRAMFILES"]:["HOME","LOGNAME","PATH","SHELL","TERM","USER"];function lst(){let t={};for(let e of tst){let I=h_.env[e];I!==void 0&&(I.startsWith("()")||(t[e]=I))}return t}var m_=class{constructor(e){this._abortController=new AbortController,this._readBuffer=new b_,this._stderrStream=null,this._serverParams=e,(e.stderr==="pipe"||e.stderr==="overlapped")&&(this._stderrStream=new Ist)}async start(){if(this._process)throw new Error("StdioClientTransport already started! If using Client class, note that connect() calls start() automatically.");return new Promise((e,I)=>{var l,n,c,r,s;this._process=(0,UeI.default)(this._serverParams.command,(l=this._serverParams.args)!==null&&l!==void 0?l:[],{env:{...lst(),...this._serverParams.env},stdio:["pipe","pipe",(n=this._serverParams.stderr)!==null&&n!==void 0?n:"inherit"],shell:!1,signal:this._abortController.signal,windowsHide:h_.platform==="win32"&&nst(),cwd:this._serverParams.cwd}),this._process.on("error",a=>{var G,i;if(a.name==="AbortError"){(G=this.onclose)===null||G===void 0||G.call(this);return}I(a),(i=this.onerror)===null||i===void 0||i.call(this,a)}),this._process.on("spawn",()=>{e()}),this._process.on("close",a=>{var G;this._process=void 0,(G=this.onclose)===null||G===void 0||G.call(this)}),(c=this._process.stdin)===null||c===void 0||c.on("error",a=>{var G;(G=this.onerror)===null||G===void 0||G.call(this,a)}),(r=this._process.stdout)===null||r===void 0||r.on("data",a=>{this._readBuffer.append(a),this.processReadBuffer()}),(s=this._process.stdout)===null||s===void 0||s.on("error",a=>{var G;(G=this.onerror)===null||G===void 0||G.call(this,a)}),this._stderrStream&&this._process.stderr&&this._process.stderr.pipe(this._stderrStream)})}get stderr(){var e,I;return this._stderrStream?this._stderrStream:(I=(e=this._process)===null||e===void 0?void 0:e.stderr)!==null&&I!==void 0?I:null}get pid(){var e,I;return(I=(e=this._process)===null||e===void 0?void 0:e.pid)!==null&&I!==void 0?I:null}processReadBuffer(){for(var e,I;;)try{let l=this._readBuffer.readMessage();if(l===null)break;(e=this.onmessage)===null||e===void 0||e.call(this,l)}catch(l){(I=this.onerror)===null||I===void 0||I.call(this,l)}}async close(){this._abortController.abort(),this._process=void 0,this._readBuffer.clear()}send(e){return new Promise(I=>{var l;if(!(!((l=this._process)===null||l===void 0)&&l.stdin))throw new Error("Not connected");let n=zeI(e);this._process.stdin.write(n)?I():this._process.stdin.once("drain",I)})}};function nst(){return"type"in h_}o();o();var p_=class extends TransformStream{constructor({onError:e,onRetry:I,onComment:l}={}){let n;super({start(c){n=s_({onEvent:r=>{c.enqueue(r)},onError(r){e==="terminate"?c.error(r):typeof e=="function"&&e(r)},onRetry:I,onComment:l})},transform(c){n.feed(c)}})}};var cst={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2},Bz=class extends Error{constructor(e,I){super(`Streamable HTTP error: ${I}`),this.code=e}},u_=class{constructor(e,I){var l;this._url=e,this._resourceMetadataUrl=void 0,this._requestInit=I?.requestInit,this._authProvider=I?.authProvider,this._fetch=I?.fetch,this._sessionId=I?.sessionId,this._reconnectionOptions=(l=I?.reconnectionOptions)!==null&&l!==void 0?l:cst}async _authThenStart(){var e;if(!this._authProvider)throw new FG("No auth provider");let I;try{I=await VV(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})}catch(l){throw(e=this.onerror)===null||e===void 0||e.call(this,l),l}if(I!=="AUTHORIZED")throw new FG;return await this._startOrAuthSse({resumptionToken:void 0})}async _commonHeaders(){var e;let I={};if(this._authProvider){let n=await this._authProvider.tokens();n&&(I.Authorization=`Bearer ${n.access_token}`)}this._sessionId&&(I["mcp-session-id"]=this._sessionId),this._protocolVersion&&(I["mcp-protocol-version"]=this._protocolVersion);let l=this._normalizeHeaders((e=this._requestInit)===null||e===void 0?void 0:e.headers);return new Headers({...I,...l})}async _startOrAuthSse(e){var I,l,n;let{resumptionToken:c}=e;try{let r=await this._commonHeaders();r.set("Accept","text/event-stream"),c&&r.set("last-event-id",c);let s=await((I=this._fetch)!==null&&I!==void 0?I:fetch)(this._url,{method:"GET",headers:r,signal:(l=this._abortController)===null||l===void 0?void 0:l.signal});if(!s.ok){if(s.status===401&&this._authProvider)return await this._authThenStart();if(s.status===405)return;throw new Bz(s.status,`Failed to open SSE stream: ${s.statusText}`)}this._handleSseStream(s.body,e,!0)}catch(r){throw(n=this.onerror)===null||n===void 0||n.call(this,r),r}}_getNextReconnectionDelay(e){let I=this._reconnectionOptions.initialReconnectionDelay,l=this._reconnectionOptions.reconnectionDelayGrowFactor,n=this._reconnectionOptions.maxReconnectionDelay;return Math.min(I*Math.pow(l,e),n)}_normalizeHeaders(e){return e?e instanceof Headers?Object.fromEntries(e.entries()):Array.isArray(e)?Object.fromEntries(e):{...e}:{}}_scheduleReconnection(e,I=0){var l;let n=this._reconnectionOptions.maxRetries;if(n>0&&I>=n){(l=this.onerror)===null||l===void 0||l.call(this,new Error(`Maximum reconnection attempts (${n}) exceeded.`));return}let c=this._getNextReconnectionDelay(I);setTimeout(()=>{this._startOrAuthSse(e).catch(r=>{var s;(s=this.onerror)===null||s===void 0||s.call(this,new Error(`Failed to reconnect SSE stream: ${r instanceof Error?r.message:String(r)}`)),this._scheduleReconnection(e,I+1)})},c)}_handleSseStream(e,I,l){if(!e)return;let{onresumptiontoken:n,replayMessageId:c}=I,r;(async()=>{var a,G,i,d;try{let b=e.pipeThrough(new TextDecoderStream).pipeThrough(new p_).getReader();for(;;){let{value:m,done:h}=await b.read();if(h)break;if(m.id&&(r=m.id,n?.(m.id)),!m.event||m.event==="message")try{let p=bV.parse(JSON.parse(m.data));c!==void 0&&jB(p)&&(p.id=c),(a=this.onmessage)===null||a===void 0||a.call(this,p)}catch(p){(G=this.onerror)===null||G===void 0||G.call(this,p)}}}catch(b){if((i=this.onerror)===null||i===void 0||i.call(this,new Error(`SSE stream disconnected: ${b}`)),l&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:r,onresumptiontoken:n,replayMessageId:c},0)}catch(m){(d=this.onerror)===null||d===void 0||d.call(this,new Error(`Failed to reconnect: ${m instanceof Error?m.message:String(m)}`))}}})()}async start(){if(this._abortController)throw new Error("StreamableHTTPClientTransport already started! If using Client class, note that connect() calls start() automatically.");this._abortController=new AbortController}async finishAuth(e){if(!this._authProvider)throw new FG("No auth provider");if(await VV(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new FG("Failed to authorize")}async close(){var e,I;(e=this._abortController)===null||e===void 0||e.abort(),(I=this.onclose)===null||I===void 0||I.call(this)}async send(e,I){var l,n,c,r;try{let{resumptionToken:s,onresumptiontoken:a}=I||{};if(s){this._startOrAuthSse({resumptionToken:s,replayMessageId:h7(e)?e.id:void 0}).catch(Z=>{var W;return(W=this.onerror)===null||W===void 0?void 0:W.call(this,Z)});return}let G=await this._commonHeaders();G.set("content-type","application/json"),G.set("accept","application/json, text/event-stream");let i={...this._requestInit,method:"POST",headers:G,body:JSON.stringify(e),signal:(l=this._abortController)===null||l===void 0?void 0:l.signal},d=await((n=this._fetch)!==null&&n!==void 0?n:fetch)(this._url,i),b=d.headers.get("mcp-session-id");if(b&&(this._sessionId=b),!d.ok){if(d.status===401&&this._authProvider){if(this._resourceMetadataUrl=xz(d),await VV(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new FG;return this.send(e)}let Z=await d.text().catch(()=>null);throw new Error(`Error POSTing to endpoint (HTTP ${d.status}): ${Z}`)}if(d.status===202){_8e(e)&&this._startOrAuthSse({resumptionToken:void 0}).catch(Z=>{var W;return(W=this.onerror)===null||W===void 0?void 0:W.call(this,Z)});return}let h=(Array.isArray(e)?e:[e]).filter(Z=>"method"in Z&&"id"in Z&&Z.id!==void 0).length>0,p=d.headers.get("content-type");if(h)if(p?.includes("text/event-stream"))this._handleSseStream(d.body,{onresumptiontoken:a},!1);else if(p?.includes("application/json")){let Z=await d.json(),W=Array.isArray(Z)?Z.map(Y=>bV.parse(Y)):[bV.parse(Z)];for(let Y of W)(c=this.onmessage)===null||c===void 0||c.call(this,Y)}else throw new Bz(-1,`Unexpected content type: ${p}`)}catch(s){throw(r=this.onerror)===null||r===void 0||r.call(this,s),s}}get sessionId(){return this._sessionId}async terminateSession(){var e,I,l;if(this._sessionId)try{let n=await this._commonHeaders(),c={...this._requestInit,method:"DELETE",headers:n,signal:(e=this._abortController)===null||e===void 0?void 0:e.signal},r=await((I=this._fetch)!==null&&I!==void 0?I:fetch)(this._url,c);if(!r.ok&&r.status!==405)throw new Bz(r.status,`Failed to terminate session: ${r.statusText}`);this._sessionId=void 0}catch(n){throw(l=this.onerror)===null||l===void 0||l.call(this,n),n}}setProtocolVersion(e){this._protocolVersion=e}get protocolVersion(){return this._protocolVersion}};o();var Z_=class{constructor(e){this.server=e}onmessage;onerror;onclose;serverTransport;closed=!1;async start(){if(this.closed)throw new Error("Transport is closed");this.serverTransport=new SNe(this),await this.server.connect(this.serverTransport)}async send(e){if(this.closed)throw new Error("Transport is closed");setImmediate(()=>{try{this.serverTransport?.onmessage?.(e)}catch(I){this.onerror?.(I instanceof Error?I:new Error(String(I)))}})}receive(e){this.closed||this.onmessage?.(e)}async close(){this.closed||(this.closed=!0,await this.serverTransport?.close(),this.onclose?.())}},SNe=class{constructor(e){this.clientTransport=e}onmessage;onerror;onclose;closed=!1;async start(){}async send(e){if(this.closed)throw new Error("Transport is closed");setImmediate(()=>{try{this.clientTransport.receive(e)}catch(I){this.onerror?.(I instanceof Error?I:new Error(String(I)))}})}async close(){this.closed||(this.closed=!0,this.onclose?.())}};var W_=class{createTransport(e){switch(e.type){case"stdio":{let I=new m_({command:e.command,args:e.args,env:e.env,stderr:e.stderr?"pipe":void 0,cwd:e.cwd});return I.stderr?.pipe(e.stderr),I}case"http":return new u_(new URL(e.url),{requestInit:{headers:e.headers||{}}});case"sse":return new i_(new URL(e.url),{requestInit:{headers:e.headers||{}}});case"memory":return new Z_(e.server);default:throw new Error(`Unsupported transport type: ${e.type}`)}}};o();var zz="blackbird-mcp-server",RV="github-mcp-server",ONe="playwright",Uz=[zz];function zv(t){return t.type===void 0||t.type.toLowerCase()==="local"||t.type.toLowerCase()==="stdio"}function SeI(t){return Sz(t)||Oz(t)}function Sz(t){return t.type?.toLowerCase()==="http"}function Oz(t){return t.type?.toLowerCase()==="sse"}function Mz(t){return t.type?.toLowerCase()==="memory"}var MNe=class extends rst{constructor(I,l){super({decodeStrings:!1});this.serverName=I;this.logger=l}_write(I,l,n){try{let c=I.toString();this.logger.log(`[mcp server ${this.serverName} stderr] ${c}`),n()}catch(c){n(c instanceof Error?c:new Error(String(c)))}}},N_=class{constructor(e,I=new c_,l=new W_,n="indirect"){this.logger=e;this.clientFactory=I;this.transportFactory=l;this.envValueMode=n}clients={};transports={};async startLocalMcpClient(e,I,l,n,c){this.logger.log(`Starting MCP client for ${e} with command: ${l} and args: ${n}`);let r=new MNe(e,this.logger),s={type:"stdio",command:l,args:n,env:{...I,PATH:process.env.PATH},stderr:r,cwd:c},a=this.transportFactory.createTransport(s);await this.setupAndConnectClient(e,a)}async startHttpMcpClient(e,I){this.logger.log(`Starting remote MCP client for ${e} with url: ${I.url}`);let l={type:"http",url:I.url,headers:I.headers},n=this.transportFactory.createTransport(l);await this.setupAndConnectClient(e,n)}async startSseMcpClient(e,I){this.logger.log(`Starting remote MCP client for ${e} with url: ${I.url}`);let l={type:"sse",url:I.url,headers:I.headers},n=this.transportFactory.createTransport(l);await this.setupAndConnectClient(e,n)}async startInMemoryMcpClient(e,I){this.logger.log(`Starting in-memory MCP client for ${e}`);let l={type:"memory",server:I},n=this.transportFactory.createTransport(l);await this.setupAndConnectClient(e,n)}async setupAndConnectClient(e,I){this.transports[e]=I,I.onclose=()=>{this.logger.log(`MCP transport for ${e} closed`),delete this.transports[e]},this.logger.log(`Creating MCP client for ${e}...`);let l=this.clientFactory.createClient({name:"github-copilot-developer",version:"1.0.0"},{capabilities:{experimental:void 0,roots:void 0,sampling:void 0}}),n=Date.now();this.logger.log(`Connecting MCP client for ${e}...`),await l.connect(I),l.onclose=()=>{this.logger.log(`MCP client for ${e} closed`),delete this.clients[e]},l.onerror=c=>{this.logger.error(`MCP client for ${e} errored ${c}`)},this.logger.log(`MCP client for ${e} connected, took ${Date.now()-n}ms`),this.clients[e]=l}async getTools(e,I){let l={};for(let[n,c]of Object.entries(this.clients)){let r=[];try{this.logger.log(`Fetching tools from client: ${n}`);let s=await c.listTools(),a=e?.mcpServers[n].tools,G=e?.mcpServers[n].filterMapping;for(let d of s.tools){if(d.name==="get_copilot_space")continue;if(!(a?.includes("*")||a?.includes(d.name))){this.logger.log(`Tool ${d.name} is not in the allowed list for client: ${n}`);continue}let m=$8(n,d.name),h=`${n}-${d.name}`,p;typeof G=="string"?p=Jpe(G):p=Jpe(G?.[d.name]??"hidden_characters"),l[`${n}/${d.name}`]={name:h,namespacedName:`${n}/${d.name}`,title:d.title??d.annotations?.title??d.name,description:d.description??h,input_schema:d.inputSchema,readOnly:d.annotations?.readOnlyHint,safeForTelemetry:{name:!!(e?.mcpServers[n].isDefaultServer||m),inputsNames:!!e?.mcpServers[n].isDefaultServer},filterMode:p},r.push(d.name),this.logger.log(`Tool ${d.name} added to tools list for client: ${n}`)}this.logger.log(`Successfully retrieved ${r.length} tools from client: ${n}`);let i=c.getServerVersion();await this.logServerSuccessWithTools(n,r,i,I)}catch(s){this.logger.error(`Failed to get tools from client: ${n} ${s}`)}}return this.logger.log(`All tools retrieved: ${JSON.stringify(l,null,2)}`),l}async logServerSuccessWithTools(e,I,l,n){if(!Uz.includes(e)&&n)try{let c=I.map(a=>`- ${a}`).join(`
|
|
1453
1453
|
`),s=`MCP server started successfully${l?` (version ${l.version})`:""} with ${I.length} ${I.length===1?"tool":"tools"} - for the full output, see the verbose logs
|
|
1454
1454
|
|
|
1455
|
-
${c}`;await n.createOrUpdateMCPStartupToolCall({serverName:e,content:s}),this.logger.log(`Updated session log for ${e} with ${I.length} tools`)}catch(c){this.logger.error(`Failed to update session log for ${e}: ${c}`)}}};o();o();var yV=class t{static resolveString(e,I){return!I||e.length>1e3?e:e.replace(/\$\{([A-Z0-9_]+)(?::-([^}]*))?\}|\$([A-Z0-9_]+)(?![A-Z0-9_])/g,(l,n,c,r)=>{let a=I[n||r];return a!==void 0?a:c!==void 0?c:l})}static resolveArray(e,I){return e?I?e.map(l=>t.resolveString(l,I)):e:[]}static resolveHeaders(e,I){if(!e)return{};if(!I)return e;let l={};for(let[n,c]of Object.entries(e)){let r=t.resolveArray([c],I);l[n]=r[0]}return l}static resolveLocalServerConfig(e,I){let l=t.resolveString(e.command,I),n=t.resolveArray(e.args,I),c;return e.cwd&&(c=t.resolveString(e.cwd,I)),{...e,command:l,args:n,cwd:c}}static resolveRemoteServerConfig(e,I=process.env){let l=t.resolveString(e.url,I),n=t.resolveHeaders(e.headers,I);return{...e,url:l,headers:n}}};var TNe={mcpServers:{}},Y_=class{constructor(e,I,l){this.logger=e;this.registry=I;this.remoteEnabled=l?.remoteEnabled??!1,this.mcp3pEnabled=l?.mcp3pEnabled??!1,this.blackbirdMetisIndexEnabled=l?.blackbirdMetisIndexEnabled??!1,this.sessionClient=l?.sessionClient,this.mcpEnvConfig=void 0,this.envValueMode=l?.envValueMode??this.registry.envValueMode}remoteEnabled;mcp3pEnabled;blackbirdMetisIndexEnabled;mcpEnvConfig;sessionClient;envValueMode;ReadMcpConfigFromEnv(e){this.mcpEnvConfig=process.env.GITHUB_COPILOT_MCP_JSON,this.mcp3pEnabled=process.env.GITHUB_COPILOT_3P_MCP_ENABLED==="true",this.remoteEnabled=process.env.GITHUB_COPILOT_REMOTE_MCP_ENABLED==="true",this.blackbirdMetisIndexEnabled=process.env.BLACKBIRD_METIS_INDEX_ENABLED==="true";let I=this.validateEnvConfig();return process.env.GITHUB_COPILOT_CLI_MODE==="true"?this.logger.log("CLI mode detected - skipping default MCP servers"):(this.logger.log("Adding default MCP servers to configuration"),this.configureBlackbirdMcp(I,e),this.configureGitHubMcp(I,e),this.configurePlaywrightMcp(I)),I}validateEnvConfig(){if(!this.mcp3pEnabled)return this.logger.log("User-provided MCPs are disabled"),TNe;if(this.logger.log("User-provided MCPs are enabled, checking for environment variable"),!this.mcpEnvConfig)return this.logger.log("No user-provided MCP servers found"),TNe;try{let e=JSON.parse(this.mcpEnvConfig);if(!e.mcpServers)throw new Error("User-provided config had incorrect format. Missing 'mcpServers' property.");for(let I in e.mcpServers)e.mcpServers[I].isDefaultServer=!1;return e}catch(e){return this.logger.error(`Warning: User-provided MCP servers were defined but invalid: ${e}`),TNe}}configureGitHubMcp(e,I){this.remoteEnabled?this.configureRemoteGitHubMcp(e,I):this.configureLocalGitHubMcp(e)}configureRemoteGitHubMcp(e,I){let l="repos,issues,users,pull_requests,code_security,secret_protection,actions,web_search";process.env.COPILOT_MCP_COPILOT_SPACES_ENABLED==="true"&&(this.logger.log("Enabling Copilot Spaces in GitHub MCP server configuration"),l=l+",copilot_spaces");let n={Authorization:"Bearer "+process.env.GITHUB_PERSONAL_ACCESS_TOKEN,"X-MCP-Toolsets":l,"X-MCP-Host":"github-coding-agent","X-Initiator":"agent"};I&&I.api?.copilot?.integrationId&&(n["Copilot-Integration-Id"]=I.api.copilot.integrationId),process.env.GITHUB_COPILOT_INTERACTION_ID&&(n["X-Interaction-Id"]=process.env.GITHUB_COPILOT_INTERACTION_ID);let c={type:"http",url:this.getCapiMcpUrl(),headers:n,tools:["*"],isDefaultServer:!0};this.setDefaultGitHubFilterMapping(c);let r=e.mcpServers[RV]??void 0;if(r&&SeI(r)){let s=structuredClone(r);this.logger.log("GitHub MCP server configuration already provided by user, skipping default remote configuration"),r.headers===void 0&&(r.headers={}),s.headers={...n,...r.headers},s.isDefaultServer=!0,this.setDefaultGitHubFilterMapping(s),e.mcpServers[RV]=s}else this.logger.log("Using default remote GitHub MCP server configuration"),e.mcpServers[RV]=c}configureLocalGitHubMcp(e){if(e.mcpServers[RV]){this.logger.log("Using user-provided GitHub MCP server configuration");let I=e.mcpServers[RV]??{};zv(I)&&!I.command&&(e.mcpServers[RV]={...I,command:"./copilot-developer-action-main/github-mcp-server/github-mcp-server",isDefaultServer:!0},this.logger.log("Added default command to user-provided GitHub MCP server configuration"))}else{this.logger.log("Using default local GitHub MCP server configuration");let I={command:"./copilot-developer-action-main/github-mcp-server/github-mcp-server",args:["stdio","--read-only"],env:{GITHUB_PERSONAL_ACCESS_TOKEN:"GITHUB_PERSONAL_ACCESS_TOKEN",GITHUB_HOST:"GITHUB_SERVER_URL"},tools:["*"],isDefaultServer:!0};e.mcpServers[RV]=I}}setDefaultGitHubFilterMapping(e){e.filterMapping??={get_issue:"markdown",get_issue_comments:"markdown",get_pull_request:"markdown",get_pull_request_comments:"markdown",get_pull_request_reviews:"markdown"}}configurePlaywrightMcp(e){if(!e.mcpServers[ONe]){if((process.env.COPILOT_FEATURE_FLAGS??"").split(",").map(l=>l.trim()).includes("copilot_swe_agent_playwright_use_firewall")){this.logger.log("Playwright MCP server is configured to use the firewall, skipping launch.");return}this.logger.log("Enabling Playwright MCP server");let I={command:"npx",args:[...lZe,"--allowed-origins","localhost;localhost:*;127.0.0.1;127.0.0.1:*"],tools:["*"],isDefaultServer:!0};e.mcpServers[ONe]=I}}configureBlackbirdMcp(e,I){this.remoteEnabled?this.configureRemoteBlackbirdMcp(e):this.blackbirdMetisIndexEnabled?this.configureLocalMetisBlackbirdMCP(e,I):this.configureLocalBlackbirdMcp(e)}configureLocalMetisBlackbirdMCP(e,I){this.logger.log("Using local Metis Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${I.blackbird?.mode}`);let l=process.env.AGENT_DIR||"/agent";this.logger.log(`Using agent directory: ${l}`);let n=[];I.blackbird?.mode==="tool"&&(n=["*"]),this.logger.log(`Using blackbird Metis server: ${I.blackbird?.mode}`);let c={command:`${l}/blackbird/mcp`,args:["serve","--index",`${l}/blackbird/metis`],env:{GITHUB_PERSONAL_ACCESS_TOKEN:"GITHUB_PERSONAL_ACCESS_TOKEN",COPILOT_API_HMAC_KEY:"CAPI_HMAC_KEY",MODEL_BASED_RETRIEVAL_TOKEN:"BLACKBIRD_AUTH_MODEL_BASED_RETRIEVAL_TOKEN",METIS_API_KEY:"BLACKBIRD_AUTH_METIS_API_KEY"},tools:n,isDefaultServer:!0};e.mcpServers[zz]=c}configureLocalBlackbirdMcp(e){this.logger.log("Using local Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${process.env.BLACKBIRD_MODE}`);let I=[];process.env.BLACKBIRD_MODE==="tool"&&(I=["*"]);let l={command:"./copilot-developer-action-main/blackbird-mcp-server/blackbird-mcp-server",args:["stdio"],env:{GITHUB_PERSONAL_ACCESS_TOKEN:"GITHUB_PERSONAL_ACCESS_TOKEN",CAPI_HOST:"COPILOT_API_URL"},tools:I,isDefaultServer:!0};e.mcpServers[zz]=l}configureRemoteBlackbirdMcp(e){this.logger.log("Using remote Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${process.env.BLACKBIRD_MODE}`);let I=[];process.env.BLACKBIRD_MODE==="tool"&&(I=["*"]);let l={Authorization:"Bearer "+process.env.GITHUB_PERSONAL_ACCESS_TOKEN,"X-MCP-Toolsets":"search_agent","X-MCP-Host":"github-coding-agent"};process.env.GITHUB_COPILOT_INTERACTION_ID&&(l["X-Interaction-Id"]=process.env.GITHUB_COPILOT_INTERACTION_ID);let n={type:"http",url:this.getCapiMcpUrl(),headers:l,tools:I,isDefaultServer:!0};e.mcpServers[zz]=n}getCapiMcpUrl(){return process.env.COPILOT_API_URL?new URL("/mcp/readonly",process.env.COPILOT_API_URL).toString():"https://api.githubcopilot.com/mcp/readonly"}isValidServerType(e){return zv(e)||Sz(e)||Oz(e)||Mz(e)}isValidLocalServerConfig(e){return e.command!==void 0&&e.command.trim()!==""&&Array.isArray(e.args)}isValidRemoteServerConfig(e){return e.url!==void 0&&e.url.trim()!==""}isValidInMemoryServerConfig(e){return e.serverInstance!==void 0&&typeof e.serverInstance=="object"}validateServerConfig(e,I){return this.remoteEnabled&&!this.isValidServerType(I)?(this.logger.error(`Unsupported server type "${I.type}" for server "${e}". Only "Local", "STDIO", "HTTP", "SSE", or "Memory" are supported.`),!1):!this.remoteEnabled&&!zv(I)&&!Mz(I)?(this.logger.error(`Unsupported server type "${I.type}" for server "${e}". Only "Local", "STDIO", or "Memory" are supported.`),!1):I.tools?zv(I)&&!this.isValidLocalServerConfig(I)?(this.logger.error(`Invalid local server configuration for "${e}". Please ensure 'command' and 'args' are provided.`),!1):(Sz(I)||Oz(I))&&!this.isValidRemoteServerConfig(I)?(this.logger.error(`Invalid remote server configuration for "${e}". Please ensure 'url' is provided.`),!1):Mz(I)&&!this.isValidInMemoryServerConfig(I)?(this.logger.error(`Invalid in-memory server configuration for "${e}". Please ensure 'serverInstance' is provided and is an instance of MCPServer.`),!1):!0:(this.logger.error(`No tools specified for server "${e}". Please provide a list of tools or "*" to include all tools.`),!1)}async processHttpServer(e,I){try{let l=yV.resolveHeaders(I.headers,process.env),n={...I,headers:l};await this.registry.startHttpMcpClient(e,n),this.logger.log(`Started MCP client for remote server ${e}`)}catch(l){throw this.logger.error(`Failed to start MCP client for remote server ${e}: ${l}`),l}}async processSseServer(e,I){try{let l=yV.resolveRemoteServerConfig(I,process.env);await this.registry.startSseMcpClient(e,l),this.logger.log(`Started MCP client for remote server ${e}`)}catch(l){throw this.logger.error(`Failed to start MCP client for remote server ${e}: ${l}`),l}}async processInMemoryServer(e,I){try{await this.registry.startInMemoryMcpClient(e,I.serverInstance),this.logger.log(`Started in-memory MCP client for ${e}`)}catch(l){throw this.logger.error(`Failed to start in-memory MCP client for ${e}: ${l}`),l}}async processLocalServer(e,I){let l={...I};if(I.command==="python")try{l=await this.convertPythonToPipx(l)}catch(r){this.logger.error(`Failed to handle Python module for ${e}: ${r}`)}let n=this.buildEnvironment(l),c=yV.resolveLocalServerConfig(l,n);this.logger.log(`Starting MCP client for ${e} with command: ${c.command} and args: ${c.args}`),c.cwd&&this.logger.log(`cwd: ${c.cwd}`);try{await this.registry.startLocalMcpClient(e,n,c.command,c.args,c.cwd),this.logger.log(`Started MCP client for ${e}`)}catch(r){throw this.logger.error(`Failed to start MCP client for ${e}: ${r}`),r}}convertPythonToPipx(e){if(!e||!e.args||e.args.length===0)return e;let I=e.args;if(I.length>1e3)throw new Error("Too many arguments provided to Python command");let l=I.indexOf("-m");if(l===-1||l===I.length-1)throw new Error("Python command with -m flag must specify a module");let n=I[l+1];this.logger.log(`Converting Python module: ${n} to pipx command`);let c=["run",n];for(let r=l+2;r<I.length;r++)c.push(I[r]);for(let r=0;r<l;r++)c.push(I[r]);return{...e,command:"pipx",args:c}}buildEnvironment(e){let I={};if(e.env)if(this.envValueMode==="direct")for(let[l,n]of Object.entries(e.env))I[l]=yV.resolveString(n,process.env);else for(let[l,n]of Object.entries(e.env)){let c=n.trim(),r=c;if(c.includes("$")&&(r=yV.resolveString(c,process.env)),r!==c){I[l]=r;continue}process.env[c]!==void 0&&(I[l]=process.env[c])}return I}async processServers(e){if(!e)throw new Error("No servers to process");let I=Object.entries(e.mcpServers).map(([l,n])=>this.processServer(l,n));await Promise.all(I)}async processServer(e,I){if(!this.validateServerConfig(e,I)){this.logger.error(`Skipping server "${e}" due to invalid configuration.`);return}Uz.includes(e)||await this.sessionClient?.createOrUpdateMCPStartupToolCall({serverName:e});try{zv(I)?await this.processLocalServer(e,I):Sz(I)&&this.remoteEnabled?await this.processHttpServer(e,I):Oz(I)&&this.remoteEnabled?await this.processSseServer(e,I):Mz(I)&&await this.processInMemoryServer(e,I)}catch(l){Uz.includes(e)||await this.logServerFailure(e,l)}}async logServerFailure(e,I){if(this.sessionClient)try{await this.sessionClient.createOrUpdateMCPStartupToolCall({serverName:e,content:`<error>MCP server failed to start: ${I.message} - for the full output, see the verbose logs</error>`})}catch(l){this.logger.error(`Failed to log failure for MCP Server '${e}': '${l}'`)}}};var V_=class{constructor(e,I,l,n="indirect"){this.logger=e;let c;if(typeof I=="string"){if(c=JSON.parse(I),typeof c!="object")throw new Error("Invalid MCP configuration: must be an object");if(c===null||!("mcpServers"in c)||typeof c.mcpServers!="object")throw new Error("Invalid MCP configuration: missing or invalid mcpServers property");this.config=c}else this.config=I;this.disabledServers=new Set(l||[]),this.registry=new N_(this.logger,void 0,void 0,n),this.processor=new Y_(this.logger,this.registry,{mcp3pEnabled:!0,remoteEnabled:!0})}registry;processor;config;startServersPromise=null;transport=null;disabledServers;async startServers(){return this.startServersPromise||(this.startServersPromise=this.processServersWithExtensions()),this.startServersPromise}async injectDefaultServers(e){}async processServersWithExtensions(){await this.injectDefaultServers(this.config);let e;if(this.disabledServers.size>0){let I={};for(let[l,n]of Object.entries(this.config.mcpServers))this.disabledServers.has(l)?this.logger.log(`Skipping disabled MCP server: ${l}`):I[l]=n;e={...this.config,mcpServers:I}}else e=this.config;return this.processor.processServers(e)}async stopServers(){for(let[e,I]of Object.entries(this.registry.transports))try{await I.close()}catch(l){this.logger.error(`Error closing transport for ${e}: ${l}`)}this.startServersPromise=null,this.transport=null}async getTools(e,I,l){await this.startServers(),this.transport=this.transport??new fB(e,I,!0);let n=[];for(let c of Object.keys(this.registry.clients)){let r=await this.transport.loadTools({mcpClient:this.registry.clients[c],clientName:c,tools:this.config.mcpServers[c]?.tools||["*"],filterMapping:this.config.mcpServers[c]?.filterMapping||"hidden_characters"},l);n.push(...r)}return n}getConfig(){return this.config}getClients(){return this.registry.clients}async startServer(e,I){await this.startServers(),this.config.mcpServers[e]=I,await this.processor.processServer(e,I),this.transport=null}async stopServer(e){let I=this.registry.transports[e];if(I)try{await I.close(),delete this.registry.transports[e]}catch(l){this.logger.error(`Error closing transport for ${e}: ${l}`)}this.registry.clients[e]&&delete this.registry.clients[e],this.transport=null}async restartServer(e,I){this.isServerRunning(e)&&await this.stopServer(e),delete this.config.mcpServers[e],await this.startServer(e,I)}isServerRunning(e){return e in this.registry.transports&&e in this.registry.clients}isServerDisabled(e){return this.disabledServers.has(e)}async disableServer(e){if(this.disabledServers.has(e)){this.logger.log(`Server ${e} is already disabled`);return}this.disabledServers.add(e),this.logger.log(`Disabled server ${e} for this session`),this.isServerRunning(e)&&await this.stopServer(e),this.transport=null}async enableServer(e){if(!this.disabledServers.has(e)){this.logger.log(`Server ${e} is not disabled`);return}this.disabledServers.delete(e),this.logger.log(`Enabled server ${e} for this session`);let I=this.getServerConfig(e);I?await this.startServer(e,I):await this.startBuiltInServer(e),this.transport=null}async startBuiltInServer(e){}getServerConfig(e){return this.config.mcpServers[e]}};o();var WII=fl(ZII(),1);async function $at(t={}){let e=await _Ye();return KYe((0,WII.default)({},e,t))}async function NII(t={}){if(dU())throw new Error("Settings have already been initialized");return $at(t)}o();import{promises as eot}from"fs";import YII from"path";var Iot=3*1024*1024;function VII(t){let e=YII.extname(t).toLowerCase();return[".png",".jpg",".jpeg",".gif",".webp"].includes(e)}function tot(t){switch(YII.extname(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";default:return null}}async function lot(t,e){e.debug(`Processing local image file: ${t}`);let I=await eot.readFile(t),l=tot(t);if(!l)throw new Error(`Unsupported image format: ${t}`);let n=new LB,c=await q8(e,n,Iot,vB,l,I);if(!c)throw new Error(`Image too large or couldn't be processed: ${t}`);let r=c.toString("base64");return`data:${l};base64,${r}`}async function not(t,e,I){let l=Wa();try{let n=await Hre({command:"view",path:t,view_range:void 0},{properties:{command:"view",resolvedPathAgainstCwd:"false",options:"{}",inputs:"[]"},metrics:{responseTokenLimit:void 0,resultLength:0,resultForLlmLength:0},restrictedProperties:{}},e,I);return{id:l,name:"view",arguments:{path:t},result:n.textResultForLlm||""}}catch(n){return{id:l,name:"view",arguments:{path:t},result:`Error reading ${t}: ${n}`}}}async function RII(t,e,I){let l=[],n=t.filter(r=>!VII(r.path));if(n.length===0)return l;let c=[];for(let r of n)try{let s=await not(r.path,e,I);c.push(s)}catch{}if(c.length>0){let r=c.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.arguments)}}));l.push({role:"assistant",content:"I need to read the content of those paths to answer this request.",tool_calls:r}),l.push(...c.map(s=>({role:"tool",tool_call_id:s.id,content:s.result})))}return l}async function yII(t,e){let I=t.filter(n=>VII(n.path));return(await Promise.all(I.map(async n=>{try{return{type:"image_url",image_url:{url:await lot(n.path,e)}}}catch(c){e.error(`Failed to process image ${n.path}: ${c instanceof Error?c.message:String(c)}`);return}}))).filter(n=>n!==void 0)}var lYe=class{constructor(e,I){this.logger=e;this.session=I}messageQueue=[];async*preRequest(e){this.logger.debug("ImmediatePromptProcessor: Injecting immediate prompts");let l=(await this.session.getChatMessages()).length;for(;this.messageQueue.length>0;){let r=this.messageQueue.shift();this.session.emit("user.message",{content:r.prompt,attachments:r.attachments})}let c=(await this.session.getChatMessages()).slice(l);for(let r of c)e.messages.push(r),yield{kind:"message",message:r,turn:e.turn,source:"immediate-prompt"}}addMessage(e){this.messageQueue.push(e)}toJSON(){return"ImmediatePromptProcessor"}},zp=class t{sessionId;startTime;modifiedTime;logger;events=[];_chatMessages=[];_selectedModel;eventProcessingQueue=Promise.resolve();eventHandlers={};wildcardEventHandlers=[];isProcessing=!1;messageQueue=[];immediatePromptProcessor;mcpHost;workingDir;abortController;modelProvider;allowedTools;disabledTools;requestPermission;mcpServers;hooks;hmacKey;copilotToken;constructor(e={},I={}){this.sessionId=I.sessionId||Wa(),this.startTime=I.startTime||new Date,this.modifiedTime=I.modifiedTime||this.startTime,this.logger=e.logger||new bW,this.modelProvider=e.modelProvider,this.allowedTools=e.allowedTools,this.disabledTools=e.disabledTools,this.requestPermission=e.requestPermission,this.mcpServers=e.mcpServers,this.hooks=e.hooks,this.hmacKey=e.hmacKey,this.copilotToken=e.copilotToken,this.workingDir=e.workingDirectory||process.cwd(),this.immediatePromptProcessor=new lYe(this.logger,this),this.abortController=e.abortController||new AbortController,pZe(this.workingDir).then(l=>{if(l.found)return GPe(l.gitRoot,!0,this.workingDir)}).catch(l=>{this.logger.debug(`Failed to initialize custom instructions cache: ${l}`)})}get messageCount(){let e=this.events.find(l=>l.type==="session.import_legacy"),I=0;return e&&(I=(e.data.legacySession?.chatMessages||[]).filter(c=>c.role==="user"||c.role==="assistant").length),this.logger.debug(`Imported message count: ${I}`),this.events.filter(l=>l.type==="user.message"||l.type==="assistant.message").length+I}get summary(){let e=this.events.find(c=>c.type==="session.import_legacy"||c.type==="user.message"),I;if(e?.type==="session.import_legacy"){let c=e.data.legacySession.chatMessages.find(r=>r.role==="user");c?.content&&(typeof c.content=="string"?I=c.content:I=c.content.find(r=>r.type==="text")?.text)}else e?.type==="user.message"&&(I=e.data.content);if(!I)return;let l=I.lastIndexOf("<reminder>");l!==-1&&(I=I.substring(0,l).trim());let n=I.replace(/\s+/g," ").trim();return n.length>75&&(n=n.substring(0,55).trim()+"..."),n=n.split("").filter(c=>{let r=c.charCodeAt(0);return r>=32&&r!==127}).join(""),n}static async fromEvents(e,I={}){if(e.length===0)throw new Error("Cannot create session from empty events array");let l=e[0];if(l.type!=="session.start")throw new Error("First event must be session.start");let n=new t(I,{sessionId:l.data.sessionId,startTime:new Date(l.data.startTime)});n._selectedModel=l.data.selectedModel,n.events.push(l);for(let c=1;c<e.length;c++){let r=e[c];n.events.push(r),await n.processEventForState(r)}return n}on(e,I){return e==="*"?(this.wildcardEventHandlers.push(I),()=>{let l=this.wildcardEventHandlers.indexOf(I);l!==-1&&this.wildcardEventHandlers.splice(l,1)}):(this.eventHandlers[e]||(this.eventHandlers[e]=[]),this.eventHandlers[e].push(I),()=>{let l=this.eventHandlers[e];if(l){let n=l.indexOf(I);n!==-1&&l.splice(n,1)}})}emit(e,I,l=!1){let n=Wa(),c=new Date().toISOString(),r=this.getLastEventId(),s={type:e,data:I,id:n,timestamp:c,parentId:r,...l&&{ephemeral:l}};this.events.push(s),this.enqueueEventProcessing(()=>this.processEventForState(s)).catch(a=>{this.logger.error(`Error emitting event: ${a instanceof Error?a.message:String(a)}`)}).catch(a=>{this.logger.error(`Error emitting event ${a instanceof Error?a.message:String(a)}`)}),[...this.eventHandlers[s.type]||[],...this.wildcardEventHandlers].forEach(a=>{try{a(s)}catch(G){this.logger.error(`Error in event handler for event type ${s.type}: ${G instanceof Error?G.message:String(G)}`)}})}emitEphemeral(e,I){this.emit(e,I,!0)}getEvents(){return this.events}async getChatMessages(){return this.enqueueEventProcessing(()=>this._chatMessages)}async getChatContextMessages(){return(await this.getChatMessages()).filter(I=>I.role!=="system")}async getSystemContextMessages(){return(await this.getChatMessages()).filter(I=>I.role==="system")}async getSelectedModel(){return this.enqueueEventProcessing(()=>this._selectedModel)}async setSelectedModel(e){let I=await this.getSelectedModel();this.emit("session.model_change",{previousModel:I,newModel:e})}getLastEventId(){return this.events.length===0?null:this.events[this.events.length-1].id}enqueueEventProcessing(e){let I=this.eventProcessingQueue.then(()=>e());return this.eventProcessingQueue=I,I}async processEventForState(e){switch(e.type){case"session.start":e.data.selectedModel&&(this._selectedModel=e.data.selectedModel);break;case"session.model_change":this._selectedModel=e.data.newModel;break;case"user.message":{let I=[],l=[];if(e.data.attachments&&e.data.attachments.length>0){let n=await yII(e.data.attachments,this.logger);I.push(...n);let c=await RII(e.data.attachments,{requestRequired:!1},this.logger);l.push(...c)}I.length>0?this._chatMessages.push({role:"user",content:[{type:"text",text:e.data.content},...I]}):this._chatMessages.push({role:"user",content:e.data.content}),l.length>0&&this._chatMessages.push(...l);break}case"assistant.message":{if(e.ephemeral)break;let I={role:"assistant",content:e.data.content||null};e.data.toolRequests&&e.data.toolRequests.length>0&&(I.tool_calls=e.data.toolRequests.map(l=>({id:l.toolCallId,type:"function",function:{name:l.name,arguments:typeof l.arguments=="string"?l.arguments:JSON.stringify(l.arguments)}}))),this._chatMessages.push(I);break}case"tool.execution_complete":{e.data.isUserRequested||this._chatMessages.push({role:"tool",tool_call_id:e.data.toolCallId,content:e.data.success?e.data.result?.content||"":e.data.error?.message||"Tool execution failed"});break}case"system.message":this._chatMessages.push({role:e.data.role,content:e.data.content,...e.data.name&&{name:e.data.name}});break;case"session.import_legacy":this._chatMessages=[...e.data.legacySession.chatMessages],e.data.legacySession.selectedModel&&(this._selectedModel=e.data.legacySession.selectedModel);break;case"abort":case"session.resume":this._chatMessages=cot(this._chatMessages,this.logger);break;case"session.idle":case"session.error":case"session.info":case"assistant.turn_start":case"assistant.turn_end":case"assistant.usage":case"tool.user_requested":case"tool.execution_start":case"tool.execution_partial_result":case"hook.start":case"hook.end":break;default:{let I=e;this.logger.error(`Unknown event type: ${I.type}`);break}}}async send(e,I={}){if((I.mode||"enqueue")==="immediate"&&this.isProcessing)this.immediatePromptProcessor.addMessage(e);else{if(this.messageQueue.push(e),this.isProcessing)return;for(this.isProcessing=!0,await this.initializeMcpHost();this.messageQueue.length>0;){let n=this.messageQueue.shift();await this.runAgenticLoop(n.prompt,n.attachments)}this.isProcessing=!1,this.emit("session.idle",{})}}async abort(){this.abortController.abort()}async initializeMcpHost(){if(!this.mcpHost&&this.mcpServers&&Object.keys(this.mcpServers).length>0)try{this.mcpHost=new V_(this.logger,{mcpServers:this.mcpServers},this.disabledTools),await this.mcpHost.startServers()}catch(e){this.logger.error(`Failed to initialize MCP host: ${e}`)}}async runAgenticLoop(e,I=[]){if(!this.modelProvider)throw new Error("Session must be created with modelProvider to use send/query methods");let l=new Map,n=new Map;try{let r=(await EW(this.hooks?.userPromptSubmitted,{timestamp:Date.now(),cwd:this.workingDir,prompt:e},this.logger))?.modifiedPrompt??e;this.emit("user.message",{content:IZe({problemStatement:r,capabilities:{}}),attachments:I});let a=new xF().setProblemStatement(r).setAgentModel(this.buildAgentModelString()).setGithubRepoName("copilot-sdk-session").setGithubRepoCommit("copilot-sdk-commit").setGithubRepoReadWrite(!1).setCopilotIntegrationId("copilot-developer-cli").setCopilotHmacKey(this.hmacKey).setCopilotToken(this.copilotToken).build();PYe();let G=await NII(a),i=G.service?.agent?.model,d=I7(i),b=d.agent,m=b??"sweagent-capi",h=d.model?{model:d.model}:void 0,p=vbe(G,this.logger,b,h),Z={location:this.workingDir,timeout:3e4,requireReasoning:!0,toolPartialResultCallback:(ue,Ae)=>{this.emitEphemeral("tool.execution_partial_result",{toolCallId:ue,partialOutput:Ae})},permissions:this.requestPermission?{requestRequired:!0,request:this.requestPermission}:{requestRequired:!1},shellConfig:(process.platform==="win32"?Gb.powerShell:Gb.bash).withScriptSafetyAssessor(async function(ue){return{result:"completed",commands:[{identifier:ue,readOnly:!1}],possiblePaths:[],hasWriteFileRedirection:!1,canOfferSessionApproval:!1}})},W=await w8e(Z,this.logger),Y=[];if(this.mcpHost)try{Y=await this.mcpHost.getTools(G,this.logger,Z.permissions)}catch(ue){this.logger.error(`Failed to get MCP tools: ${ue}`)}let F=[...W,...Y].filter(ue=>this.allowedTools?this.allowedTools.includes(ue.name):this.disabledTools?!this.disabledTools.includes(ue.name):!0),g=await pZe(this.workingDir),k={...(E8e()[m]?.[p.model]??X8e()).supports,reasoning:!0},C=await h8e(g.found?g.gitRoot:"",fze(),this.workingDir,{},k,Z,F,void 0),f=(await this.getChatMessages()).slice(0,-1),te={role:"user",content:IZe({customAgentPrompt:void 0,problemStatement:r,capabilities:k})},de=[...f,te];await EW(this.hooks?.sessionStart,{timestamp:Date.now(),cwd:this.workingDir,source:"new",initialPrompt:e},this.logger);let we=new ov(te,this.logger),Qe=p.getCompletionWithTools(C,de,F,{failIfInitialInputsTooLong:!1,processors:{preRequest:[we,this.immediatePromptProcessor,new kB(this.logger)],onRequestError:[we]},executeToolsInParallel:!1,abortSignal:this.abortController.signal});for await(let ue of Qe){if(this.abortController.signal.aborted){this.emit("abort",{reason:"user initiated"});break}switch(ue.kind){case"message":{if(t7(ue)){let Ae=R8e(ue)?await Promise.all(ue.message.tool_calls.map(async he=>{let ZI=mX(he.function.arguments);l.set(he.id,he.function.name),n.set(he.id,ZI);let Ce=await EW(this.hooks?.preToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:he.function.name,toolArgs:ZI},this.logger);return{toolCallId:he.id,name:he.function.name,arguments:Ce?.modifiedArgs??ZI}})):[];this.emit("assistant.message",{messageId:Wa(),content:typeof ue.message.content=="string"?ue.message.content:"",toolRequests:Ae});for(let he of Ae)this.emit("tool.execution_start",{toolCallId:he.toolCallId,toolName:he.name,arguments:he.arguments})}else(ue.message.role==="system"||ue.message.role==="developer")&&this.emit("system.message",{role:ue.message.role,content:typeof ue.message.content=="string"?ue.message.content:JSON.stringify(ue.message.content),name:"name"in ue.message?ue.message.name:void 0});break}case"model_call_failure":{let Ae=new Error(ue.modelCall?.error||"Model call failed");await EW(this.hooks?.errorOccurred,{timestamp:Date.now(),cwd:this.workingDir,error:Ae,errorContext:"model_call",recoverable:!0},this.logger),this.emit("session.error",{errorType:"model_call",message:Ae.message,stack:Ae.stack});break}case"tool_execution":{let he=(await EW(this.hooks?.postToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:l.get(ue.toolCallId)||"unknown",toolArgs:n.get(ue.toolCallId)||{},toolResult:ue.toolResult},this.logger))?.modifiedResult??ue.toolResult,ZI=(he.resultType==="failure"?he.error:void 0)||he.sessionLog||he.textResultForLlm;this.emit("tool.execution_complete",{toolCallId:ue.toolCallId,success:he.resultType==="success",result:he.resultType==="success"?{content:ZI}:void 0,error:he.resultType!=="success"?{message:ZI,code:he.resultType}:void 0});break}case"turn_started":{this.emit("assistant.turn_start",{turnId:`${ue.turn}`});break}case"turn_ended":{this.emit("assistant.turn_end",{turnId:`${ue.turn}`});break}case"response":case"images_removed":case"image_processing":case"history_truncated":case"turn_failed":case"turn_retry":case"model_call_success":this.logger.debug(`Ignoring event of kind: ${ue.kind}`);break;default:Tp(ue,"Unhandled event type")}}}catch(c){await EW(this.hooks?.sessionEnd,{timestamp:Date.now(),cwd:this.workingDir,reason:"error",error:c instanceof Error?c:new Error(String(c))},this.logger),this.emit("session.error",{errorType:"query",message:c instanceof Error?c.message:String(c),stack:c instanceof Error?c.stack:void 0})}finally{await EW(this.hooks?.sessionEnd,{timestamp:Date.now(),cwd:this.workingDir,reason:"complete"},this.logger)}}buildAgentModelString(){if(!this.modelProvider)throw new Error("Session must be created with modelProvider");switch(this.modelProvider.type){case"openai":return`openai:${this.modelProvider.model}`;case"anthropic":return`anthropic:${this.modelProvider.model}`;case"copilot":return`capi:${this.modelProvider.model}`;default:throw new Error(`Unsupported provider: ${this.modelProvider.type}`)}}};function cot(t,e){if(t.length===0)return t;let I=[],l=new Set,n=!1;for(let s=t.length-1;s>=0;s--){let a=t[s];if(a.role==="assistant"&&(n=!0),a.role==="assistant"&&"tool_calls"in a&&a.tool_calls&&a.tool_calls.length>0)for(let G of a.tool_calls)l.has(G.id)||I.push(G.id);else{if(n)break;a.role==="tool"&&a.tool_call_id&&l.add(a.tool_call_id)}}if(I.length===0)return t;let c="The execution of this tool, or a previous tool was interrupted.";e.info(`Completing ${I.length} orphaned tool calls.`);let r=I.map(s=>({role:"tool",tool_call_id:s,content:c}));return[...t,...r]}o();var E_=class{sessions;logger;options;lastAccessedSessionId;constructor(e){this.options=e,this.sessions=new Map,this.logger=e.logger||new bW}async createSession(){let e=new zp(this.options);return this.sessions.set(e.sessionId,e),this.lastAccessedSessionId=e.sessionId,e}async getSession(e){let I=this.sessions.get(e);return I&&(this.lastAccessedSessionId=e),I}async getLastSession(){if(this.lastAccessedSessionId){let l=this.sessions.get(this.lastAccessedSessionId);if(l)return l}let e=Array.from(this.sessions.values());if(e.length===0)return;e.sort((l,n)=>n.startTime.getTime()-l.startTime.getTime());let I=e[0];return this.lastAccessedSessionId=I.sessionId,I}async listSessions(){return Array.from(this.sessions.values()).map(e=>({sessionId:e.sessionId,startTime:e.startTime,modifiedTime:e.modifiedTime}))}async saveSession(e){}async deleteSession(e){this.sessions.delete(e.sessionId),this.lastAccessedSessionId===e.sessionId&&(this.lastAccessedSessionId=void 0)}};o();o();o();var utI=fl(ntI(),1);o();import{existsSync as P_}from"fs";import{appendFile as _Gt,mkdir as $Gt,readdir as q_,readFile as otI,stat as __,writeFile as eit}from"fs/promises";import{homedir as GtI}from"os";import{dirname as Iit,join as AG}from"path";o();o();var jGt=new Error("timeout while waiting for mutex to become available"),EYn=new Error("mutex already locked"),DGt=new Error("request for lock canceled"),KGt=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(r){r(c)})}return new(I||(I=Promise))(function(c,r){function s(i){try{G(l.next(i))}catch(d){r(d)}}function a(i){try{G(l.throw(i))}catch(d){r(d)}}function G(i){i.done?c(i.value):n(i.value).then(s,a)}G((l=l.apply(t,e||[])).next())})},ZYe=class{constructor(e,I=DGt){this._value=e,this._cancelError=I,this._queue=[],this._weightedWaiters=[]}acquire(e=1,I=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return new Promise((l,n)=>{let c={resolve:l,reject:n,weight:e,priority:I},r=rtI(this._queue,s=>I<=s.priority);r===-1&&e<=this._value?this._dispatchItem(c):this._queue.splice(r+1,0,c)})}runExclusive(e){return KGt(this,arguments,void 0,function*(I,l=1,n=0){let[c,r]=yield this.acquire(l,n);try{return yield I(c)}finally{r()}})}waitForUnlock(e=1,I=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,I)?Promise.resolve():new Promise(l=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),PGt(this._weightedWaiters[e-1],{resolve:l,priority:I})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(e){this._value=e,this._dispatchQueue()}release(e=1){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);this._value+=e,this._dispatchQueue()}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatchQueue(){for(this._drainUnlockWaiters();this._queue.length>0&&this._queue[0].weight<=this._value;)this._dispatchItem(this._queue.shift()),this._drainUnlockWaiters()}_dispatchItem(e){let I=this._value;this._value-=e.weight,e.resolve([I,this._newReleaser(e.weight)])}_newReleaser(e){let I=!1;return()=>{I||(I=!0,this.release(e))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let e=this._value;e>0;e--){let I=this._weightedWaiters[e-1];I&&(I.forEach(l=>l.resolve()),this._weightedWaiters[e-1]=[])}else{let e=this._queue[0].priority;for(let I=this._value;I>0;I--){let l=this._weightedWaiters[I-1];if(!l)continue;let n=l.findIndex(c=>c.priority<=e);(n===-1?l:l.splice(0,n)).forEach(c=>c.resolve())}}}_couldLockImmediately(e,I){return(this._queue.length===0||this._queue[0].priority<I)&&e<=this._value}};function PGt(t,e){let I=rtI(t,l=>e.priority<=l.priority);t.splice(I+1,0,e)}function rtI(t,e){for(let I=t.length-1;I>=0;I--)if(e(t[I]))return I;return-1}var qGt=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(r){r(c)})}return new(I||(I=Promise))(function(c,r){function s(i){try{G(l.next(i))}catch(d){r(d)}}function a(i){try{G(l.throw(i))}catch(d){r(d)}}function G(i){i.done?c(i.value):n(i.value).then(s,a)}G((l=l.apply(t,e||[])).next())})},D_=class{constructor(e){this._semaphore=new ZYe(1,e)}acquire(){return qGt(this,arguments,void 0,function*(e=0){let[,I]=yield this._semaphore.acquire(1,e);return I})}runExclusive(e,I=0){return this._semaphore.runExclusive(()=>e(),1,I)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(e=0){return this._semaphore.waitForUnlock(1,e)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}},ctI=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(r){r(c)})}return new(I||(I=Promise))(function(c,r){function s(i){try{G(l.next(i))}catch(d){r(d)}}function a(i){try{G(l.throw(i))}catch(d){r(d)}}function G(i){i.done?c(i.value):n(i.value).then(s,a)}G((l=l.apply(t,e||[])).next())})};function stI(t,e,I=jGt){return{acquire:(l,n)=>{let c;if(j_(t)?c=l:(c=void 0,n=l),c!==void 0&&c<=0)throw new Error(`invalid weight ${c}: must be positive`);return new Promise((r,s)=>ctI(this,void 0,void 0,function*(){let a=!1,G=setTimeout(()=>{a=!0,s(I)},e);try{let i=yield j_(t)?t.acquire(c,n):t.acquire(n);a?(Array.isArray(i)?i[1]:i)():(clearTimeout(G),r(i))}catch(i){a||(clearTimeout(G),s(i))}}))},runExclusive(l,n,c){return ctI(this,void 0,void 0,function*(){let r=()=>{};try{let s=yield this.acquire(n,c);return Array.isArray(s)?(r=s[1],yield l(s[0])):(r=s,yield l())}finally{r()}})},release(l){t.release(l)},cancel(){return t.cancel()},waitForUnlock:(l,n)=>{let c;if(j_(t)?c=l:(c=void 0,n=l),c!==void 0&&c<=0)throw new Error(`invalid weight ${c}: must be positive`);return new Promise((r,s)=>{let a=setTimeout(()=>s(I),e);(j_(t)?t.waitForUnlock(c,n):t.waitForUnlock(n)).then(()=>{clearTimeout(a),r()})})},isLocked:()=>t.isLocked(),getValue:()=>t.getValue(),setValue:l=>t.setValue(l)}}function j_(t){return t.getValue!==void 0}var K_=class{mutexes=new Map;async runExclusive(e,I,l=5e3){let n=this.mutexes.get(e);n||(n=new D_,n.refCount=0,this.mutexes.set(e,n));let c=n;try{return c.refCount++,await stI(n,l).runExclusive(I)}finally{--c.refCount===0&&this.mutexes.delete(e)}}};var WYe=(I=>(I.DEFAULT="config",I.MCP="mcp",I))(WYe||{});function atI(t){return Object.values(WYe).includes(t)}var $_=".copilot",e$=new K_;async function itI(t){let e=Iit(t);try{await $Gt(e,{recursive:!0,mode:448})}catch{}}async function tit(t,e){if(P_(t))try{let I={},l=await e$.runExclusive(t,()=>otI(t,"utf8"));return l.trim().startsWith("{")?I=JSON.parse(l):l.split(`
|
|
1455
|
+
${c}`;await n.createOrUpdateMCPStartupToolCall({serverName:e,content:s}),this.logger.log(`Updated session log for ${e} with ${I.length} tools`)}catch(c){this.logger.error(`Failed to update session log for ${e}: ${c}`)}}};o();o();var yV=class t{static resolveString(e,I){return!I||e.length>1e3?e:e.replace(/\$\{([A-Z0-9_]+)(?::-([^}]*))?\}|\$([A-Z0-9_]+)(?![A-Z0-9_])/g,(l,n,c,r)=>{let a=I[n||r];return a!==void 0?a:c!==void 0?c:l})}static resolveArray(e,I){return e?I?e.map(l=>t.resolveString(l,I)):e:[]}static resolveHeaders(e,I){if(!e)return{};if(!I)return e;let l={};for(let[n,c]of Object.entries(e)){let r=t.resolveArray([c],I);l[n]=r[0]}return l}static resolveLocalServerConfig(e,I){let l=t.resolveString(e.command,I),n=t.resolveArray(e.args,I),c;return e.cwd&&(c=t.resolveString(e.cwd,I)),{...e,command:l,args:n,cwd:c}}static resolveRemoteServerConfig(e,I=process.env){let l=t.resolveString(e.url,I),n=t.resolveHeaders(e.headers,I);return{...e,url:l,headers:n}}};var TNe={mcpServers:{}},Y_=class{constructor(e,I,l){this.logger=e;this.registry=I;this.remoteEnabled=l?.remoteEnabled??!1,this.mcp3pEnabled=l?.mcp3pEnabled??!1,this.blackbirdMetisIndexEnabled=l?.blackbirdMetisIndexEnabled??!1,this.sessionClient=l?.sessionClient,this.mcpEnvConfig=void 0,this.envValueMode=l?.envValueMode??this.registry.envValueMode}remoteEnabled;mcp3pEnabled;blackbirdMetisIndexEnabled;mcpEnvConfig;sessionClient;envValueMode;ReadMcpConfigFromEnv(e){this.mcpEnvConfig=process.env.GITHUB_COPILOT_MCP_JSON,this.mcp3pEnabled=process.env.GITHUB_COPILOT_3P_MCP_ENABLED==="true",this.remoteEnabled=process.env.GITHUB_COPILOT_REMOTE_MCP_ENABLED==="true",this.blackbirdMetisIndexEnabled=process.env.BLACKBIRD_METIS_INDEX_ENABLED==="true";let I=this.validateEnvConfig();return process.env.GITHUB_COPILOT_CLI_MODE==="true"?this.logger.log("CLI mode detected - skipping default MCP servers"):(this.logger.log("Adding default MCP servers to configuration"),this.configureBlackbirdMcp(I,e),this.configureGitHubMcp(I,e),this.configurePlaywrightMcp(I)),I}validateEnvConfig(){if(!this.mcp3pEnabled)return this.logger.log("User-provided MCPs are disabled"),TNe;if(this.logger.log("User-provided MCPs are enabled, checking for environment variable"),!this.mcpEnvConfig)return this.logger.log("No user-provided MCP servers found"),TNe;try{let e=JSON.parse(this.mcpEnvConfig);if(!e.mcpServers)throw new Error("User-provided config had incorrect format. Missing 'mcpServers' property.");for(let I in e.mcpServers)e.mcpServers[I].isDefaultServer=!1;return e}catch(e){return this.logger.error(`Warning: User-provided MCP servers were defined but invalid: ${e}`),TNe}}configureGitHubMcp(e,I){this.remoteEnabled?this.configureRemoteGitHubMcp(e,I):this.configureLocalGitHubMcp(e)}configureRemoteGitHubMcp(e,I){let l="repos,issues,users,pull_requests,code_security,secret_protection,actions,web_search";process.env.COPILOT_MCP_COPILOT_SPACES_ENABLED==="true"&&(this.logger.log("Enabling Copilot Spaces in GitHub MCP server configuration"),l=l+",copilot_spaces");let n={Authorization:"Bearer "+process.env.GITHUB_PERSONAL_ACCESS_TOKEN,"X-MCP-Toolsets":l,"X-MCP-Host":"github-coding-agent","X-Initiator":"agent"};I&&I.api?.copilot?.integrationId&&(n["Copilot-Integration-Id"]=I.api.copilot.integrationId),process.env.GITHUB_COPILOT_INTERACTION_ID&&(n["X-Interaction-Id"]=process.env.GITHUB_COPILOT_INTERACTION_ID);let c={type:"http",url:this.getCapiMcpUrl(),headers:n,tools:["*"],isDefaultServer:!0};this.setDefaultGitHubFilterMapping(c);let r=e.mcpServers[RV]??void 0;if(r&&SeI(r)){let s=structuredClone(r);this.logger.log("GitHub MCP server configuration already provided by user, skipping default remote configuration"),r.headers===void 0&&(r.headers={}),s.headers={...n,...r.headers},s.isDefaultServer=!0,this.setDefaultGitHubFilterMapping(s),e.mcpServers[RV]=s}else this.logger.log("Using default remote GitHub MCP server configuration"),e.mcpServers[RV]=c}configureLocalGitHubMcp(e){if(e.mcpServers[RV]){this.logger.log("Using user-provided GitHub MCP server configuration");let I=e.mcpServers[RV]??{};zv(I)&&!I.command&&(e.mcpServers[RV]={...I,command:"./copilot-developer-action-main/github-mcp-server/github-mcp-server",isDefaultServer:!0},this.logger.log("Added default command to user-provided GitHub MCP server configuration"))}else{this.logger.log("Using default local GitHub MCP server configuration");let I={command:"./copilot-developer-action-main/github-mcp-server/github-mcp-server",args:["stdio","--read-only"],env:{GITHUB_PERSONAL_ACCESS_TOKEN:"GITHUB_PERSONAL_ACCESS_TOKEN",GITHUB_HOST:"GITHUB_SERVER_URL"},tools:["*"],isDefaultServer:!0};e.mcpServers[RV]=I}}setDefaultGitHubFilterMapping(e){e.filterMapping??={get_issue:"markdown",get_issue_comments:"markdown",get_pull_request:"markdown",get_pull_request_comments:"markdown",get_pull_request_reviews:"markdown"}}configurePlaywrightMcp(e){if(!e.mcpServers[ONe]){if((process.env.COPILOT_FEATURE_FLAGS??"").split(",").map(l=>l.trim()).includes("copilot_swe_agent_playwright_use_firewall")){this.logger.log("Playwright MCP server is configured to use the firewall, skipping launch.");return}this.logger.log("Enabling Playwright MCP server");let I={command:"npx",args:[...lZe,"--allowed-origins","localhost;localhost:*;127.0.0.1;127.0.0.1:*"],tools:["*"],isDefaultServer:!0};e.mcpServers[ONe]=I}}configureBlackbirdMcp(e,I){this.remoteEnabled?this.configureRemoteBlackbirdMcp(e):this.blackbirdMetisIndexEnabled?this.configureLocalMetisBlackbirdMCP(e,I):this.configureLocalBlackbirdMcp(e)}configureLocalMetisBlackbirdMCP(e,I){this.logger.log("Using local Metis Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${I.blackbird?.mode}`);let l=process.env.AGENT_DIR||"/agent";this.logger.log(`Using agent directory: ${l}`);let n=[];I.blackbird?.mode==="tool"&&(n=["*"]),this.logger.log(`Using blackbird Metis server: ${I.blackbird?.mode}`);let c={command:`${l}/blackbird/mcp`,args:["serve","--index",`${l}/blackbird/metis`],env:{GITHUB_PERSONAL_ACCESS_TOKEN:"GITHUB_PERSONAL_ACCESS_TOKEN",COPILOT_API_HMAC_KEY:"CAPI_HMAC_KEY",MODEL_BASED_RETRIEVAL_TOKEN:"BLACKBIRD_AUTH_MODEL_BASED_RETRIEVAL_TOKEN",METIS_API_KEY:"BLACKBIRD_AUTH_METIS_API_KEY"},tools:n,isDefaultServer:!0};e.mcpServers[zz]=c}configureLocalBlackbirdMcp(e){this.logger.log("Using local Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${process.env.BLACKBIRD_MODE}`);let I=[];process.env.BLACKBIRD_MODE==="tool"&&(I=["*"]);let l={command:"./copilot-developer-action-main/blackbird-mcp-server/blackbird-mcp-server",args:["stdio"],env:{GITHUB_PERSONAL_ACCESS_TOKEN:"GITHUB_PERSONAL_ACCESS_TOKEN",CAPI_HOST:"COPILOT_API_URL"},tools:I,isDefaultServer:!0};e.mcpServers[zz]=l}configureRemoteBlackbirdMcp(e){this.logger.log("Using remote Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${process.env.BLACKBIRD_MODE}`);let I=[];process.env.BLACKBIRD_MODE==="tool"&&(I=["*"]);let l={Authorization:"Bearer "+process.env.GITHUB_PERSONAL_ACCESS_TOKEN,"X-MCP-Toolsets":"search_agent","X-MCP-Host":"github-coding-agent"};process.env.GITHUB_COPILOT_INTERACTION_ID&&(l["X-Interaction-Id"]=process.env.GITHUB_COPILOT_INTERACTION_ID);let n={type:"http",url:this.getCapiMcpUrl(),headers:l,tools:I,isDefaultServer:!0};e.mcpServers[zz]=n}getCapiMcpUrl(){return process.env.COPILOT_API_URL?new URL("/mcp/readonly",process.env.COPILOT_API_URL).toString():"https://api.githubcopilot.com/mcp/readonly"}isValidServerType(e){return zv(e)||Sz(e)||Oz(e)||Mz(e)}isValidLocalServerConfig(e){return e.command!==void 0&&e.command.trim()!==""&&Array.isArray(e.args)}isValidRemoteServerConfig(e){return e.url!==void 0&&e.url.trim()!==""}isValidInMemoryServerConfig(e){return e.serverInstance!==void 0&&typeof e.serverInstance=="object"}validateServerConfig(e,I){return this.remoteEnabled&&!this.isValidServerType(I)?(this.logger.error(`Unsupported server type "${I.type}" for server "${e}". Only "Local", "STDIO", "HTTP", "SSE", or "Memory" are supported.`),!1):!this.remoteEnabled&&!zv(I)&&!Mz(I)?(this.logger.error(`Unsupported server type "${I.type}" for server "${e}". Only "Local", "STDIO", or "Memory" are supported.`),!1):I.tools?zv(I)&&!this.isValidLocalServerConfig(I)?(this.logger.error(`Invalid local server configuration for "${e}". Please ensure 'command' and 'args' are provided.`),!1):(Sz(I)||Oz(I))&&!this.isValidRemoteServerConfig(I)?(this.logger.error(`Invalid remote server configuration for "${e}". Please ensure 'url' is provided.`),!1):Mz(I)&&!this.isValidInMemoryServerConfig(I)?(this.logger.error(`Invalid in-memory server configuration for "${e}". Please ensure 'serverInstance' is provided and is an instance of MCPServer.`),!1):!0:(this.logger.error(`No tools specified for server "${e}". Please provide a list of tools or "*" to include all tools.`),!1)}async processHttpServer(e,I){try{let l=yV.resolveHeaders(I.headers,process.env),n={...I,headers:l};await this.registry.startHttpMcpClient(e,n),this.logger.log(`Started MCP client for remote server ${e}`)}catch(l){throw this.logger.error(`Failed to start MCP client for remote server ${e}: ${l}`),l}}async processSseServer(e,I){try{let l=yV.resolveRemoteServerConfig(I,process.env);await this.registry.startSseMcpClient(e,l),this.logger.log(`Started MCP client for remote server ${e}`)}catch(l){throw this.logger.error(`Failed to start MCP client for remote server ${e}: ${l}`),l}}async processInMemoryServer(e,I){try{await this.registry.startInMemoryMcpClient(e,I.serverInstance),this.logger.log(`Started in-memory MCP client for ${e}`)}catch(l){throw this.logger.error(`Failed to start in-memory MCP client for ${e}: ${l}`),l}}async processLocalServer(e,I){let l={...I};if(I.command==="python")try{l=await this.convertPythonToPipx(l)}catch(r){this.logger.error(`Failed to handle Python module for ${e}: ${r}`)}let n=this.buildEnvironment(l),c=yV.resolveLocalServerConfig(l,n);this.logger.log(`Starting MCP client for ${e} with command: ${c.command} and args: ${c.args}`),c.cwd&&this.logger.log(`cwd: ${c.cwd}`);try{await this.registry.startLocalMcpClient(e,n,c.command,c.args,c.cwd),this.logger.log(`Started MCP client for ${e}`)}catch(r){throw this.logger.error(`Failed to start MCP client for ${e}: ${r}`),r}}convertPythonToPipx(e){if(!e||!e.args||e.args.length===0)return e;let I=e.args;if(I.length>1e3)throw new Error("Too many arguments provided to Python command");let l=I.indexOf("-m");if(l===-1||l===I.length-1)throw new Error("Python command with -m flag must specify a module");let n=I[l+1];this.logger.log(`Converting Python module: ${n} to pipx command`);let c=["run",n];for(let r=l+2;r<I.length;r++)c.push(I[r]);for(let r=0;r<l;r++)c.push(I[r]);return{...e,command:"pipx",args:c}}buildEnvironment(e){let I={};if(e.env)if(this.envValueMode==="direct")for(let[l,n]of Object.entries(e.env))I[l]=yV.resolveString(n,process.env);else for(let[l,n]of Object.entries(e.env)){let c=n.trim(),r=c;if(c.includes("$")&&(r=yV.resolveString(c,process.env)),r!==c){I[l]=r;continue}process.env[c]!==void 0&&(I[l]=process.env[c])}return I}async processServers(e){if(!e)throw new Error("No servers to process");let I=Object.entries(e.mcpServers).map(([l,n])=>this.processServer(l,n));await Promise.all(I)}async processServer(e,I){if(!this.validateServerConfig(e,I)){this.logger.error(`Skipping server "${e}" due to invalid configuration.`);return}Uz.includes(e)||await this.sessionClient?.createOrUpdateMCPStartupToolCall({serverName:e});try{zv(I)?await this.processLocalServer(e,I):Sz(I)&&this.remoteEnabled?await this.processHttpServer(e,I):Oz(I)&&this.remoteEnabled?await this.processSseServer(e,I):Mz(I)&&await this.processInMemoryServer(e,I)}catch(l){Uz.includes(e)||await this.logServerFailure(e,l)}}async logServerFailure(e,I){if(this.sessionClient)try{await this.sessionClient.createOrUpdateMCPStartupToolCall({serverName:e,content:`<error>MCP server failed to start: ${I.message} - for the full output, see the verbose logs</error>`})}catch(l){this.logger.error(`Failed to log failure for MCP Server '${e}': '${l}'`)}}};var V_=class{constructor(e,I,l,n="indirect"){this.logger=e;let c;if(typeof I=="string"){if(c=JSON.parse(I),typeof c!="object")throw new Error("Invalid MCP configuration: must be an object");if(c===null||!("mcpServers"in c)||typeof c.mcpServers!="object")throw new Error("Invalid MCP configuration: missing or invalid mcpServers property");this.config=c}else this.config=I;this.disabledServers=new Set(l||[]),this.registry=new N_(this.logger,void 0,void 0,n),this.processor=new Y_(this.logger,this.registry,{mcp3pEnabled:!0,remoteEnabled:!0})}registry;processor;config;startServersPromise=null;transport=null;disabledServers;async startServers(){return this.startServersPromise||(this.startServersPromise=this.processServersWithExtensions()),this.startServersPromise}async injectDefaultServers(e){}async processServersWithExtensions(){await this.injectDefaultServers(this.config);let e;if(this.disabledServers.size>0){let I={};for(let[l,n]of Object.entries(this.config.mcpServers))this.disabledServers.has(l)?this.logger.log(`Skipping disabled MCP server: ${l}`):I[l]=n;e={...this.config,mcpServers:I}}else e=this.config;return this.processor.processServers(e)}async stopServers(){for(let[e,I]of Object.entries(this.registry.transports))try{await I.close()}catch(l){this.logger.error(`Error closing transport for ${e}: ${l}`)}this.startServersPromise=null,this.transport=null}async getTools(e,I,l){await this.startServers(),this.transport=this.transport??new fB(e,I,!0);let n=[];for(let c of Object.keys(this.registry.clients)){let r=await this.transport.loadTools({mcpClient:this.registry.clients[c],clientName:c,tools:this.config.mcpServers[c]?.tools||["*"],filterMapping:this.config.mcpServers[c]?.filterMapping||"hidden_characters"},l);n.push(...r)}return n}getConfig(){return this.config}getClients(){return this.registry.clients}async startServer(e,I){await this.startServers(),this.config.mcpServers[e]=I,await this.processor.processServer(e,I),this.transport=null}async stopServer(e){let I=this.registry.transports[e];if(I)try{await I.close(),delete this.registry.transports[e]}catch(l){this.logger.error(`Error closing transport for ${e}: ${l}`)}this.registry.clients[e]&&delete this.registry.clients[e],this.transport=null}async restartServer(e,I){this.isServerRunning(e)&&await this.stopServer(e),delete this.config.mcpServers[e],await this.startServer(e,I)}isServerRunning(e){return e in this.registry.transports&&e in this.registry.clients}isServerDisabled(e){return this.disabledServers.has(e)}async disableServer(e){if(this.disabledServers.has(e)){this.logger.log(`Server ${e} is already disabled`);return}this.disabledServers.add(e),this.logger.log(`Disabled server ${e} for this session`),this.isServerRunning(e)&&await this.stopServer(e),this.transport=null}async enableServer(e){if(!this.disabledServers.has(e)){this.logger.log(`Server ${e} is not disabled`);return}this.disabledServers.delete(e),this.logger.log(`Enabled server ${e} for this session`);let I=this.getServerConfig(e);I?await this.startServer(e,I):await this.startBuiltInServer(e),this.transport=null}async startBuiltInServer(e){}getServerConfig(e){return this.config.mcpServers[e]}};o();var WII=fl(ZII(),1);async function $at(t={}){let e=await _Ye();return KYe((0,WII.default)({},e,t))}async function NII(t={}){if(dU())throw new Error("Settings have already been initialized");return $at(t)}o();import{promises as eot}from"fs";import YII from"path";var Iot=3*1024*1024;function VII(t){let e=YII.extname(t).toLowerCase();return[".png",".jpg",".jpeg",".gif",".webp"].includes(e)}function tot(t){switch(YII.extname(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";default:return null}}async function lot(t,e){e.debug(`Processing local image file: ${t}`);let I=await eot.readFile(t),l=tot(t);if(!l)throw new Error(`Unsupported image format: ${t}`);let n=new LB,c=await q8(e,n,Iot,vB,l,I);if(!c)throw new Error(`Image too large or couldn't be processed: ${t}`);let r=c.toString("base64");return`data:${l};base64,${r}`}async function not(t,e,I){let l=Wa();try{let n=await Hre({command:"view",path:t,view_range:void 0},{properties:{command:"view",resolvedPathAgainstCwd:"false",options:"{}",inputs:"[]"},metrics:{responseTokenLimit:void 0,resultLength:0,resultForLlmLength:0},restrictedProperties:{}},e,I);return{id:l,name:"view",arguments:{path:t},result:n.textResultForLlm||""}}catch(n){return{id:l,name:"view",arguments:{path:t},result:`Error reading ${t}: ${n}`}}}async function RII(t,e,I){let l=[],n=t.filter(r=>!VII(r.path));if(n.length===0)return l;let c=[];for(let r of n)try{let s=await not(r.path,e,I);c.push(s)}catch{}if(c.length>0){let r=c.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.arguments)}}));l.push({role:"assistant",content:"I need to read the content of those paths to answer this request.",tool_calls:r}),l.push(...c.map(s=>({role:"tool",tool_call_id:s.id,content:s.result})))}return l}async function yII(t,e){let I=t.filter(n=>VII(n.path));return(await Promise.all(I.map(async n=>{try{return{type:"image_url",image_url:{url:await lot(n.path,e)}}}catch(c){e.error(`Failed to process image ${n.path}: ${c instanceof Error?c.message:String(c)}`);return}}))).filter(n=>n!==void 0)}var lYe=class{constructor(e,I){this.logger=e;this.session=I}messageQueue=[];async*preRequest(e){this.logger.debug("ImmediatePromptProcessor: Injecting immediate prompts");let l=(await this.session.getChatMessages()).length;for(;this.messageQueue.length>0;){let r=this.messageQueue.shift();this.session.emit("user.message",{content:r.prompt,attachments:r.attachments})}let c=(await this.session.getChatMessages()).slice(l);for(let r of c)e.messages.push(r),yield{kind:"message",message:r,turn:e.turn,source:"immediate-prompt"}}addMessage(e){this.messageQueue.push(e)}toJSON(){return"ImmediatePromptProcessor"}},zp=class t{sessionId;startTime;modifiedTime;logger;events=[];_chatMessages=[];_selectedModel;eventProcessingQueue=Promise.resolve();eventHandlers={};wildcardEventHandlers=[];isProcessing=!1;messageQueue=[];immediatePromptProcessor;mcpHost;workingDir;abortController;modelProvider;allowedTools;disabledTools;requestPermission;mcpServers;hooks;hmacKey;copilotToken;constructor(e={},I={}){this.sessionId=I.sessionId||Wa(),this.startTime=I.startTime||new Date,this.modifiedTime=I.modifiedTime||this.startTime,this.logger=e.logger||new bW,this.modelProvider=e.modelProvider,this.allowedTools=e.allowedTools,this.disabledTools=e.disabledTools,this.requestPermission=e.requestPermission,this.mcpServers=e.mcpServers,this.hooks=e.hooks,this.hmacKey=e.hmacKey,this.copilotToken=e.copilotToken,this.workingDir=e.workingDirectory||process.cwd(),this.immediatePromptProcessor=new lYe(this.logger,this),this.abortController=e.abortController||new AbortController,pZe(this.workingDir).then(l=>{if(l.found)return GPe(l.gitRoot,!0,this.workingDir)}).catch(l=>{this.logger.debug(`Failed to initialize custom instructions cache: ${l}`)})}get messageCount(){let e=this.events.find(l=>l.type==="session.import_legacy"),I=0;return e&&(I=(e.data.legacySession?.chatMessages||[]).filter(c=>c.role==="user"||c.role==="assistant").length),this.logger.debug(`Imported message count: ${I}`),this.events.filter(l=>l.type==="user.message"||l.type==="assistant.message").length+I}get summary(){let e=this.events.find(c=>c.type==="session.import_legacy"||c.type==="user.message"),I;if(e?.type==="session.import_legacy"){let c=e.data.legacySession.chatMessages.find(r=>r.role==="user");c?.content&&(typeof c.content=="string"?I=c.content:I=c.content.find(r=>r.type==="text")?.text)}else e?.type==="user.message"&&(I=e.data.content);if(!I)return;let l=I.lastIndexOf("<reminder>");l!==-1&&(I=I.substring(0,l).trim());let n=I.replace(/\s+/g," ").trim();return n.length>75&&(n=n.substring(0,55).trim()+"..."),n=n.split("").filter(c=>{let r=c.charCodeAt(0);return r>=32&&r!==127}).join(""),n}static async fromEvents(e,I={}){if(e.length===0)throw new Error("Cannot create session from empty events array");let l=e[0];if(l.type!=="session.start")throw new Error("First event must be session.start");let n=new t(I,{sessionId:l.data.sessionId,startTime:new Date(l.data.startTime)});n._selectedModel=l.data.selectedModel,n.events.push(l);for(let c=1;c<e.length;c++){let r=e[c];n.events.push(r),await n.processEventForState(r)}return n}on(e,I){return e==="*"?(this.wildcardEventHandlers.push(I),()=>{let l=this.wildcardEventHandlers.indexOf(I);l!==-1&&this.wildcardEventHandlers.splice(l,1)}):(this.eventHandlers[e]||(this.eventHandlers[e]=[]),this.eventHandlers[e].push(I),()=>{let l=this.eventHandlers[e];if(l){let n=l.indexOf(I);n!==-1&&l.splice(n,1)}})}emit(e,I,l=!1){let n=Wa(),c=new Date().toISOString(),r=this.getLastEventId(),s={type:e,data:I,id:n,timestamp:c,parentId:r,...l&&{ephemeral:l}};this.events.push(s),this.enqueueEventProcessing(()=>this.processEventForState(s)).catch(a=>{this.logger.error(`Error emitting event: ${a instanceof Error?a.message:String(a)}`)}).catch(a=>{this.logger.error(`Error emitting event ${a instanceof Error?a.message:String(a)}`)}),[...this.eventHandlers[s.type]||[],...this.wildcardEventHandlers].forEach(a=>{try{a(s)}catch(G){this.logger.error(`Error in event handler for event type ${s.type}: ${G instanceof Error?G.message:String(G)}`)}})}emitEphemeral(e,I){this.emit(e,I,!0)}getEvents(){return this.events}async getChatMessages(){return this.enqueueEventProcessing(()=>this._chatMessages)}async getChatContextMessages(){return(await this.getChatMessages()).filter(I=>I.role!=="system")}async getSystemContextMessages(){return(await this.getChatMessages()).filter(I=>I.role==="system")}async getSelectedModel(){return this.enqueueEventProcessing(()=>this._selectedModel)}async setSelectedModel(e){let I=await this.getSelectedModel();this.emit("session.model_change",{previousModel:I,newModel:e})}getLastEventId(){return this.events.length===0?null:this.events[this.events.length-1].id}enqueueEventProcessing(e){let I=this.eventProcessingQueue.then(()=>e());return this.eventProcessingQueue=I,I}async processEventForState(e){switch(e.type){case"session.start":e.data.selectedModel&&(this._selectedModel=e.data.selectedModel);break;case"session.model_change":this._selectedModel=e.data.newModel;break;case"user.message":{let I=[],l=[];if(e.data.attachments&&e.data.attachments.length>0){let n=await yII(e.data.attachments,this.logger);I.push(...n);let c=await RII(e.data.attachments,{requestRequired:!1},this.logger);l.push(...c)}I.length>0?this._chatMessages.push({role:"user",content:[{type:"text",text:e.data.content},...I]}):this._chatMessages.push({role:"user",content:e.data.content}),l.length>0&&this._chatMessages.push(...l);break}case"assistant.message":{if(e.ephemeral)break;let I={role:"assistant",content:e.data.content||null};e.data.toolRequests&&e.data.toolRequests.length>0&&(I.tool_calls=e.data.toolRequests.map(l=>({id:l.toolCallId,type:"function",function:{name:l.name,arguments:typeof l.arguments=="string"?l.arguments:JSON.stringify(l.arguments)}}))),this._chatMessages.push(I);break}case"tool.execution_complete":{e.data.isUserRequested||this._chatMessages.push({role:"tool",tool_call_id:e.data.toolCallId,content:e.data.success?e.data.result?.content||"":e.data.error?.message||"Tool execution failed"});break}case"system.message":this._chatMessages.push({role:e.data.role,content:e.data.content,...e.data.name&&{name:e.data.name}});break;case"session.import_legacy":this._chatMessages=[...e.data.legacySession.chatMessages],e.data.legacySession.selectedModel&&(this._selectedModel=e.data.legacySession.selectedModel);break;case"abort":case"session.resume":this._chatMessages=cot(this._chatMessages,this.logger);break;case"session.idle":case"session.error":case"session.info":case"assistant.turn_start":case"assistant.turn_end":case"assistant.usage":case"tool.user_requested":case"tool.execution_start":case"tool.execution_partial_result":case"hook.start":case"hook.end":break;default:{let I=e;this.logger.error(`Unknown event type: ${I.type}`);break}}}async send(e,I={}){if((I.mode||"enqueue")==="immediate"&&this.isProcessing)this.immediatePromptProcessor.addMessage(e);else{if(this.messageQueue.push(e),this.isProcessing)return;for(this.isProcessing=!0,await this.initializeMcpHost();this.messageQueue.length>0;){let n=this.messageQueue.shift();await this.runAgenticLoop(n.prompt,n.attachments)}this.isProcessing=!1,this.emit("session.idle",{})}}async abort(){this.abortController.abort()}async initializeMcpHost(){if(!this.mcpHost&&this.mcpServers&&Object.keys(this.mcpServers).length>0)try{this.mcpHost=new V_(this.logger,{mcpServers:this.mcpServers},this.disabledTools),await this.mcpHost.startServers()}catch(e){this.logger.error(`Failed to initialize MCP host: ${e}`)}}async runAgenticLoop(e,I=[]){if(!this.modelProvider)throw new Error("Session must be created with modelProvider to use send/query methods");let l=new Map,n=new Map;try{let r=(await EW(this.hooks?.userPromptSubmitted,{timestamp:Date.now(),cwd:this.workingDir,prompt:e},this.logger))?.modifiedPrompt??e;this.emit("user.message",{content:IZe({problemStatement:r,capabilities:{}}),attachments:I});let a=new xF().setProblemStatement(r).setAgentModel(this.buildAgentModelString()).setGithubRepoName("copilot-sdk-session").setGithubRepoCommit("copilot-sdk-commit").setGithubRepoReadWrite(!1).setCopilotIntegrationId("copilot-developer-cli").setCopilotHmacKey(this.hmacKey).setCopilotToken(this.copilotToken).build();PYe();let G=await NII(a),i=G.service?.agent?.model,d=I7(i),b=d.agent,m=b??"sweagent-capi",h=d.model?{model:d.model}:void 0,p=vbe(G,this.logger,b,h),Z={location:this.workingDir,timeout:3e4,requireReasoning:!0,toolPartialResultCallback:(ue,Ae)=>{this.emitEphemeral("tool.execution_partial_result",{toolCallId:ue,partialOutput:Ae})},permissions:this.requestPermission?{requestRequired:!0,request:this.requestPermission}:{requestRequired:!1},shellConfig:(process.platform==="win32"?Gb.powerShell:Gb.bash).withScriptSafetyAssessor(async function(ue){return{result:"completed",commands:[{identifier:ue,readOnly:!1}],possiblePaths:[],hasWriteFileRedirection:!1,canOfferSessionApproval:!1}})},W=await w8e(Z,this.logger),Y=[];if(this.mcpHost)try{Y=await this.mcpHost.getTools(G,this.logger,Z.permissions)}catch(ue){this.logger.error(`Failed to get MCP tools: ${ue}`)}let F=[...W,...Y].filter(ue=>this.allowedTools?this.allowedTools.includes(ue.name):this.disabledTools?!this.disabledTools.includes(ue.name):!0),g=await pZe(this.workingDir),k={...(E8e()[m]?.[p.model]??X8e()).supports,reasoning:!0},C=await h8e(g.found?g.gitRoot:"",fze(),this.workingDir,{},k,Z,F,void 0),f=(await this.getChatMessages()).slice(0,-1),te={role:"user",content:IZe({customAgentPrompt:void 0,problemStatement:r,capabilities:k})},de=[...f,te];await EW(this.hooks?.sessionStart,{timestamp:Date.now(),cwd:this.workingDir,source:"new",initialPrompt:e},this.logger);let we=new ov(te,this.logger),Qe=p.getCompletionWithTools(C,de,F,{failIfInitialInputsTooLong:!1,processors:{preRequest:[we,this.immediatePromptProcessor,new kB(this.logger)],onRequestError:[we]},executeToolsInParallel:!1,abortSignal:this.abortController.signal});for await(let ue of Qe){if(this.abortController.signal.aborted){this.emit("abort",{reason:"user initiated"});break}switch(ue.kind){case"message":{if(t7(ue)){let Ae=R8e(ue)?await Promise.all(ue.message.tool_calls.map(async he=>{let ZI=mX(he.function.arguments);l.set(he.id,he.function.name),n.set(he.id,ZI);let Ce=await EW(this.hooks?.preToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:he.function.name,toolArgs:ZI},this.logger);return{toolCallId:he.id,name:he.function.name,arguments:Ce?.modifiedArgs??ZI}})):[];this.emit("assistant.message",{messageId:Wa(),content:typeof ue.message.content=="string"?ue.message.content:"",toolRequests:Ae});for(let he of Ae)this.emit("tool.execution_start",{toolCallId:he.toolCallId,toolName:he.name,arguments:he.arguments})}else(ue.message.role==="system"||ue.message.role==="developer")&&this.emit("system.message",{role:ue.message.role,content:typeof ue.message.content=="string"?ue.message.content:JSON.stringify(ue.message.content),name:"name"in ue.message?ue.message.name:void 0});break}case"model_call_failure":{let Ae=new Error(ue.modelCall?.error||"Model call failed");await EW(this.hooks?.errorOccurred,{timestamp:Date.now(),cwd:this.workingDir,error:Ae,errorContext:"model_call",recoverable:!0},this.logger),this.emit("session.error",{errorType:"model_call",message:Ae.message,stack:Ae.stack});break}case"tool_execution":{let he=(await EW(this.hooks?.postToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:l.get(ue.toolCallId)||"unknown",toolArgs:n.get(ue.toolCallId)||{},toolResult:ue.toolResult},this.logger))?.modifiedResult??ue.toolResult,ZI=(he.resultType==="failure"?he.error:void 0)||he.sessionLog||he.textResultForLlm;this.emit("tool.execution_complete",{toolCallId:ue.toolCallId,success:he.resultType==="success",result:he.resultType==="success"?{content:ZI}:void 0,error:he.resultType!=="success"?{message:ZI,code:he.resultType}:void 0});break}case"turn_started":{this.emit("assistant.turn_start",{turnId:`${ue.turn}`});break}case"turn_ended":{this.emit("assistant.turn_end",{turnId:`${ue.turn}`});break}case"response":case"images_removed":case"image_processing":case"history_truncated":case"turn_failed":case"turn_retry":case"model_call_success":this.logger.debug(`Ignoring event of kind: ${ue.kind}`);break;default:Tp(ue,"Unhandled event type")}}}catch(c){await EW(this.hooks?.sessionEnd,{timestamp:Date.now(),cwd:this.workingDir,reason:"error",error:c instanceof Error?c:new Error(String(c))},this.logger),this.emit("session.error",{errorType:"query",message:c instanceof Error?c.message:String(c),stack:c instanceof Error?c.stack:void 0})}finally{await EW(this.hooks?.sessionEnd,{timestamp:Date.now(),cwd:this.workingDir,reason:"complete"},this.logger)}}buildAgentModelString(){if(!this.modelProvider)throw new Error("Session must be created with modelProvider");switch(this.modelProvider.type){case"openai":return`openai:${this.modelProvider.model}`;case"anthropic":return`anthropic:${this.modelProvider.model}`;case"copilot":return`capi:${this.modelProvider.model}`;default:throw new Error(`Unsupported provider: ${this.modelProvider.type}`)}}};function cot(t,e){if(t.length===0)return t;let I=[],l=new Set,n=!1;for(let s=t.length-1;s>=0;s--){let a=t[s];if(a.role==="assistant"&&(n=!0),a.role==="assistant"&&"tool_calls"in a&&a.tool_calls&&a.tool_calls.length>0)for(let G of a.tool_calls)l.has(G.id)||I.push(G.id);else{if(n)break;a.role==="tool"&&a.tool_call_id&&l.add(a.tool_call_id)}}if(I.length===0)return t;let c="The execution of this tool, or a previous tool was interrupted.";e.info(`Completing ${I.length} orphaned tool calls.`);let r=I.map(s=>({role:"tool",tool_call_id:s,content:c}));return[...t,...r]}o();var E_=class{sessions;logger;options;lastAccessedSessionId;constructor(e){this.options=e,this.sessions=new Map,this.logger=e.logger||new bW}async createSession(){let e=new zp(this.options);return this.sessions.set(e.sessionId,e),this.lastAccessedSessionId=e.sessionId,e}async getSession(e){let I=this.sessions.get(e);return I&&(this.lastAccessedSessionId=e),I}async getLastSession(){if(this.lastAccessedSessionId){let l=this.sessions.get(this.lastAccessedSessionId);if(l)return l}let e=Array.from(this.sessions.values());if(e.length===0)return;e.sort((l,n)=>n.startTime.getTime()-l.startTime.getTime());let I=e[0];return this.lastAccessedSessionId=I.sessionId,I}async listSessions(){return Array.from(this.sessions.values()).map(e=>({sessionId:e.sessionId,startTime:e.startTime,modifiedTime:e.modifiedTime}))}async saveSession(e){}async deleteSession(e){this.sessions.delete(e.sessionId),this.lastAccessedSessionId===e.sessionId&&(this.lastAccessedSessionId=void 0)}async closeSession(e){}};o();o();o();var utI=fl(ntI(),1);o();import{existsSync as P_}from"fs";import{appendFile as _Gt,mkdir as $Gt,readdir as q_,readFile as otI,stat as __,writeFile as eit}from"fs/promises";import{homedir as GtI}from"os";import{dirname as Iit,join as AG}from"path";o();o();var jGt=new Error("timeout while waiting for mutex to become available"),EYn=new Error("mutex already locked"),DGt=new Error("request for lock canceled"),KGt=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(r){r(c)})}return new(I||(I=Promise))(function(c,r){function s(i){try{G(l.next(i))}catch(d){r(d)}}function a(i){try{G(l.throw(i))}catch(d){r(d)}}function G(i){i.done?c(i.value):n(i.value).then(s,a)}G((l=l.apply(t,e||[])).next())})},ZYe=class{constructor(e,I=DGt){this._value=e,this._cancelError=I,this._queue=[],this._weightedWaiters=[]}acquire(e=1,I=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return new Promise((l,n)=>{let c={resolve:l,reject:n,weight:e,priority:I},r=rtI(this._queue,s=>I<=s.priority);r===-1&&e<=this._value?this._dispatchItem(c):this._queue.splice(r+1,0,c)})}runExclusive(e){return KGt(this,arguments,void 0,function*(I,l=1,n=0){let[c,r]=yield this.acquire(l,n);try{return yield I(c)}finally{r()}})}waitForUnlock(e=1,I=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,I)?Promise.resolve():new Promise(l=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),PGt(this._weightedWaiters[e-1],{resolve:l,priority:I})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(e){this._value=e,this._dispatchQueue()}release(e=1){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);this._value+=e,this._dispatchQueue()}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatchQueue(){for(this._drainUnlockWaiters();this._queue.length>0&&this._queue[0].weight<=this._value;)this._dispatchItem(this._queue.shift()),this._drainUnlockWaiters()}_dispatchItem(e){let I=this._value;this._value-=e.weight,e.resolve([I,this._newReleaser(e.weight)])}_newReleaser(e){let I=!1;return()=>{I||(I=!0,this.release(e))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let e=this._value;e>0;e--){let I=this._weightedWaiters[e-1];I&&(I.forEach(l=>l.resolve()),this._weightedWaiters[e-1]=[])}else{let e=this._queue[0].priority;for(let I=this._value;I>0;I--){let l=this._weightedWaiters[I-1];if(!l)continue;let n=l.findIndex(c=>c.priority<=e);(n===-1?l:l.splice(0,n)).forEach(c=>c.resolve())}}}_couldLockImmediately(e,I){return(this._queue.length===0||this._queue[0].priority<I)&&e<=this._value}};function PGt(t,e){let I=rtI(t,l=>e.priority<=l.priority);t.splice(I+1,0,e)}function rtI(t,e){for(let I=t.length-1;I>=0;I--)if(e(t[I]))return I;return-1}var qGt=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(r){r(c)})}return new(I||(I=Promise))(function(c,r){function s(i){try{G(l.next(i))}catch(d){r(d)}}function a(i){try{G(l.throw(i))}catch(d){r(d)}}function G(i){i.done?c(i.value):n(i.value).then(s,a)}G((l=l.apply(t,e||[])).next())})},D_=class{constructor(e){this._semaphore=new ZYe(1,e)}acquire(){return qGt(this,arguments,void 0,function*(e=0){let[,I]=yield this._semaphore.acquire(1,e);return I})}runExclusive(e,I=0){return this._semaphore.runExclusive(()=>e(),1,I)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(e=0){return this._semaphore.waitForUnlock(1,e)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}},ctI=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(r){r(c)})}return new(I||(I=Promise))(function(c,r){function s(i){try{G(l.next(i))}catch(d){r(d)}}function a(i){try{G(l.throw(i))}catch(d){r(d)}}function G(i){i.done?c(i.value):n(i.value).then(s,a)}G((l=l.apply(t,e||[])).next())})};function stI(t,e,I=jGt){return{acquire:(l,n)=>{let c;if(j_(t)?c=l:(c=void 0,n=l),c!==void 0&&c<=0)throw new Error(`invalid weight ${c}: must be positive`);return new Promise((r,s)=>ctI(this,void 0,void 0,function*(){let a=!1,G=setTimeout(()=>{a=!0,s(I)},e);try{let i=yield j_(t)?t.acquire(c,n):t.acquire(n);a?(Array.isArray(i)?i[1]:i)():(clearTimeout(G),r(i))}catch(i){a||(clearTimeout(G),s(i))}}))},runExclusive(l,n,c){return ctI(this,void 0,void 0,function*(){let r=()=>{};try{let s=yield this.acquire(n,c);return Array.isArray(s)?(r=s[1],yield l(s[0])):(r=s,yield l())}finally{r()}})},release(l){t.release(l)},cancel(){return t.cancel()},waitForUnlock:(l,n)=>{let c;if(j_(t)?c=l:(c=void 0,n=l),c!==void 0&&c<=0)throw new Error(`invalid weight ${c}: must be positive`);return new Promise((r,s)=>{let a=setTimeout(()=>s(I),e);(j_(t)?t.waitForUnlock(c,n):t.waitForUnlock(n)).then(()=>{clearTimeout(a),r()})})},isLocked:()=>t.isLocked(),getValue:()=>t.getValue(),setValue:l=>t.setValue(l)}}function j_(t){return t.getValue!==void 0}var K_=class{mutexes=new Map;async runExclusive(e,I,l=5e3){let n=this.mutexes.get(e);n||(n=new D_,n.refCount=0,this.mutexes.set(e,n));let c=n;try{return c.refCount++,await stI(n,l).runExclusive(I)}finally{--c.refCount===0&&this.mutexes.delete(e)}}};var WYe=(I=>(I.DEFAULT="config",I.MCP="mcp",I))(WYe||{});function atI(t){return Object.values(WYe).includes(t)}var $_=".copilot",e$=new K_;async function itI(t){let e=Iit(t);try{await $Gt(e,{recursive:!0,mode:448})}catch{}}async function tit(t,e){if(P_(t))try{let I={},l=await e$.runExclusive(t,()=>otI(t,"utf8"));return l.trim().startsWith("{")?I=JSON.parse(l):l.split(`
|
|
1456
1456
|
`).forEach(n=>{let[c,r]=n.split("=").map(s=>s.trim());c&&r&&(I[c]=r)}),e(I)}catch(I){throw new Error(`Failed to read configuration from ${t}: ${I}`)}}async function lit(t,e){try{await itI(t);let I=JSON.stringify(e,null,2);await e$.runExclusive(t,()=>eit(t,I,{mode:384}))}catch(I){throw new Error(`Failed to write configuration to ${t}: ${I}`)}}var dtI=(t,e,{shouldCache:I})=>{let l=new Map,n=()=>{let b=atI(e)?process.env.XDG_CONFIG_HOME:process.env.XDG_STATE_HOME;return b?AG(b,$_):AG(GtI(),$_)},c=()=>{let b=atI(e)?"-config":"-state";return`${e}${e=="config"?"":b}`},r=b=>{let m=".json",h=c()+(b?"":m),p=AG(n(),h,b?`${b}${m}`:"");return!P_(p)&&P_(p.replace(/\.json$/,""))&&(p=p.replace(/\.json$/,"")),p},s=async()=>{let b=AG(n(),c());try{let h=(await q_(b,{withFileTypes:!0})).filter(Z=>Z.isFile()&&Z.name.endsWith(".json")).map(Z=>Z.name),p=await Promise.all(h.map(async Z=>{let W=AG(b,Z);try{let Y=await __(W);return{file:Z,mtime:Y.mtime}}catch{return{file:Z,mtime:new Date}}}));return p.sort((Z,W)=>W.mtime.getTime()-Z.mtime.getTime()),p.map(Z=>Z.file)}catch{}return[]},a=async()=>{let b=AG(n(),c());try{let h=(await q_(b,{withFileTypes:!0})).filter(Z=>Z.isFile()&&Z.name.endsWith(".json")).map(Z=>Z.name),p=await Promise.all(h.map(async Z=>{let W=AG(b,Z);try{let Y=await __(W);return{file:Z,mtime:Y.mtime,ctime:Y.ctime}}catch{return{file:Z,mtime:new Date,ctime:new Date}}}));return p.sort((Z,W)=>W.mtime.getTime()-Z.mtime.getTime()),p}catch{}return[]},G=async(b="")=>{if(I&&l.has(b))return l.get(b);let m=await tit(r(b),t);return I&&m&&l.set(b,m),m},i=async(b,m="")=>{I&&l.set(m,b),await lit(r(m),b)};return{load:G,write:i,writeKey:async(b,m,h)=>{let p=await G(h);if(m===void 0){p&&(delete p[b],await i(p,h));return}let Z={[b]:m},W;p?W={...p,...Z}:W=Z,await i(W,h)},path:r,directoryFiles:s,directoryFilesWithMetadata:a}},btI=(t,e)=>dtI(t,e,{shouldCache:!0}),mtI=(t,e)=>dtI(t,e,{shouldCache:!1}),htI=(t,e)=>{let I=()=>{let G=process.env.XDG_STATE_HOME;return G?AG(G,$_):AG(GtI(),$_)},l=()=>`${e}-state`,n=G=>{let i=".jsonl",d=l()+(G?"":i);return AG(I(),d,G?`${G}${i}`:"")};return{load:async G=>{let i=n(G);if(!P_(i))return[];try{let b=(await e$.runExclusive(i,()=>otI(i,"utf8"))).trim().split(`
|
|
1457
1457
|
`).filter(h=>h.trim()),m=[];for(let h=0;h<b.length;h++)try{let p=JSON.parse(b[h]),Z=t(p);m.push(Z)}catch(p){throw new Error(`Invalid event at line ${h+1} in ${i}: ${p}`)}return m}catch(d){throw new Error(`Failed to read JSONL from ${i}: ${d}`)}},append:async(G,i)=>{let d=n(i),b=Array.isArray(G)?G:[G];try{await itI(d);let m=b.map(h=>JSON.stringify(h)).join(`
|
|
1458
1458
|
`)+`
|
|
1459
|
-
`;await e$.runExclusive(d,()=>_Gt(d,m,{mode:384}))}catch(m){throw new Error(`Failed to append to JSONL file ${d}: ${m}`)}},path:n,directoryFiles:async()=>{let G=AG(I(),l());try{let d=(await q_(G,{withFileTypes:!0})).filter(m=>m.isFile()&&m.name.endsWith(".jsonl")).map(m=>m.name),b=await Promise.all(d.map(async m=>{let h=AG(G,m);try{let p=await __(h);return{file:m,mtime:p.mtime}}catch{return{file:m,mtime:new Date}}}));return b.sort((m,h)=>h.mtime.getTime()-m.mtime.getTime()),b.map(m=>m.file)}catch{return[]}},directoryFilesWithMetadata:async()=>{let G=AG(I(),l());try{let d=(await q_(G,{withFileTypes:!0})).filter(m=>m.isFile()&&m.name.endsWith(".jsonl")).map(m=>m.name),b=await Promise.all(d.map(async m=>{let h=AG(G,m);try{let p=await __(h);return{file:m,mtime:p.mtime,ctime:p.ctime}}catch{return{file:m,mtime:new Date,ctime:new Date}}}));return b.sort((m,h)=>h.mtime.getTime()-m.mtime.getTime()),b}catch{return[]}},home:I,directory:l}};var ptI=ke({host:se(),login:se()}),nit=ke({banner:xd(["always","once","never"]).optional(),beep:ql().optional(),last_logged_in_user:ptI.optional(),logged_in_users:cs(ptI).optional(),model:se().optional(),render_markdown:ql().optional(),screen_reader:ql().optional(),theme:se().optional(),trusted_folders:cs(se()).optional(),store_token_plaintext:ql().optional(),stream:ql().optional(),parallel_tool_execution:ql().optional(),feature_flags:ke({enabled:cs(se()).optional()}).optional(),asked_setup_terminals:cs(se()).optional(),capi_hmac_key:se().optional(),copilot_hmac_key:se().optional(),copilot_integration_id:se().optional(),copilot_tokens:Zv(se(),se()).optional(),copilot_url:se().optional(),staff:ql().optional(),log_level:xd(["none","error","warning","info","debug","all","default"]).optional()}),cit=Zv(se(),NZe()),rit=cit.transform(t=>(0,utI.default)(t,(e,I)=>{let l=I.toLowerCase();return l==="github_copilot_integration_id"?"copilot_integration_id":l})),sit=rit.pipe(nit),ait=btI(sit.parse,"config");var ZtI=["claude-sonnet-4.5","claude-sonnet-4","claude-haiku-4.5","gpt-5"];o();var oit=ke({type:YI("copilot"),text:se(),isStreaming:ql().optional()}),Git=ke({type:YI("error"),text:se()}),iit=ke({type:YI("info"),text:se()}),_Yn=ke({displayText:se(),fullPath:se(),type:xd(["file","directory","unresolved","image"]),startIndex:gr()}),dit=ke({type:YI("user"),text:se()}),bit=ke({command:se(),description:se(),timeout:gr().optional(),sessionId:se().optional(),async:ql().optional()}),mit=ke({sessionId:se(),input:se(),delay:gr().optional()}),hit=ke({sessionId:se(),delay:gr()}),pit=ke({sessionId:se()}),uit=ha([bit,mit,hit,pit]),Zit=ke({command:YI("view"),path:se(),view_range:i7([gr(),gr()]).optional()}),Wit=ke({command:YI("create"),path:se(),file_text:se()}),Nit=ke({command:YI("str_replace"),path:se(),new_str:se().optional(),old_str:se()}),Yit=ke({command:YI("insert"),path:se(),insert_line:gr(),new_str:se()}),Vit=OB("command",[Zit,Wit,Nit,Yit]),$Yn=ke({path:se(),view_range:i7([gr(),gr()]).optional()}),e2n=ke({path:se(),file_text:se()}),I2n=ke({path:se(),old_str:se(),new_str:se().optional()}),WtI=ha([uit,Vit,Jp()]),Rit=ke({type:YI("tool_call_requested"),callId:se(),name:se(),toolTitle:se().optional(),intentionSummary:se().nullable(),arguments:WtI,partialOutput:se().optional(),isHidden:ql().optional(),isAlwaysExpanded:ql().optional(),showNoContent:ql().optional()}),yit=ke({type:YI("tool_call_completed"),callId:se(),name:se(),toolTitle:se().optional(),intentionSummary:se().nullable(),result:ha([ke({type:YI("success"),log:se(),markdown:ql().optional()}),ke({type:YI("failure"),log:se(),markdown:ql().optional()}),ke({type:YI("rejected"),markdown:ql().optional()}),ke({type:YI("denied"),log:se(),markdown:ql().optional()})]),arguments:WtI,isHidden:ql().optional(),isAlwaysExpanded:ql().optional(),showNoContent:ql().optional()}),git=ha([oit,Git,iit,dit,Rit,yit]),NtI=git.and(ke({id:se(),timestamp:MB.date()}));var eU=ke({type:YI("text"),text:se()}),Ait=ke({type:YI("refusal"),refusal:se()}),Qit=ke({type:YI("image_url"),image_url:ke({url:se(),detail:xd(["auto","low","high"]).optional()})}),wit=ke({type:YI("input_audio"),input_audio:ke({data:se(),format:YI("wav").or(YI("mp3"))})}),Xit=ke({type:YI("file"),file:ke({file_date:se().optional(),file_id:se().optional(),filename:se().optional()})}),Eit=ha([eU,Qit,wit,Xit]),Hit=ke({name:se(),arguments:se()}),vit=ke({name:se(),input:se()}),Cit=ke({id:se(),type:YI("function"),function:Hit}),Jit=ke({id:se(),type:YI("custom"),custom:vit}),Lit=ha([Cit,Jit]),fit=ke({name:se(),arguments:se()}),kit=ke({id:se()}),xit=ke({content:ha([se(),cs(eU)]),role:YI("developer"),name:se().optional()}),Bit=ke({content:ha([se(),cs(eU)]),role:YI("system"),name:se().optional()}),zit=ke({content:ha([se(),cs(Eit)]),role:YI("user"),name:se().optional()}),Uit=ke({content:ha([se(),cs(ha([eU,Ait]))]).nullable().optional(),role:YI("assistant"),name:se().optional(),refusal:se().nullable().optional(),audio:kit.nullable().optional(),function_call:fit.nullable().optional(),tool_calls:cs(Lit).optional()}),Sit=ke({content:ha([se(),cs(eU)]),role:YI("tool"),tool_call_id:se()}),Oit=ke({content:se().nullable(),role:YI("function"),name:se()}),Mit=ha([xit,Bit,zit,Uit,Sit,Oit]),NYe=ke({sessionId:se(),startTime:MB.date(),chatMessages:cs(Mit),timeline:cs(NtI),selectedModel:xd(ZtI).optional()}),IU=mtI(NYe.parse,"history-session");o();o();var nr=ke({id:se().uuid(),timestamp:se().datetime(),parentId:se().uuid().nullable(),ephemeral:ql().optional()}),Tit=nr.extend({type:YI("session.start"),data:ke({sessionId:se(),version:gr(),producer:se(),copilotVersion:se(),startTime:se().datetime(),selectedModel:se().optional()})}),jit=nr.extend({type:YI("session.resume"),data:ke({resumeTime:se().datetime(),eventCount:gr()})}),Dit=nr.extend({type:YI("session.error"),data:ke({errorType:se(),message:se(),stack:se().optional()})}),Kit=nr.extend({type:YI("session.info"),data:ke({infoType:se(),message:se()})}),Pit=nr.extend({type:YI("session.model_change"),data:ke({previousModel:se().optional(),newModel:se()})}),qit=nr.extend({type:YI("session.import_legacy"),data:ke({legacySession:NYe,importTime:se().datetime(),sourceFile:se()})}),_it=nr.extend({type:YI("session.idle"),ephemeral:YI(!0),data:ke({})}),$it=ke({type:xd(["file","directory"]),path:se(),displayName:se()}),edt=nr.extend({type:YI("user.message"),data:ke({content:se(),attachments:cs($it).optional()})}),Idt=nr.extend({type:YI("assistant.turn_start"),data:ke({turnId:se()})}),tdt=nr.extend({type:YI("assistant.message"),data:ke({messageId:se(),content:se(),toolRequests:cs(ke({toolCallId:se(),name:se(),arguments:Jp()})).optional()})}),ldt=nr.extend({type:YI("assistant.turn_end"),data:ke({turnId:se()})}),ndt=nr.extend({type:YI("assistant.usage"),ephemeral:YI(!0),data:ke({model:se().optional(),inputTokens:gr().optional(),outputTokens:gr().optional(),cost:gr().optional(),duration:gr().optional(),initiator:se().optional()})}),cdt=nr.extend({type:YI("abort"),data:ke({reason:se()})}),rdt=nr.extend({type:YI("tool.user_requested"),data:ke({toolCallId:se(),toolName:se(),arguments:Jp()})}),sdt=nr.extend({type:YI("tool.execution_start"),data:ke({toolCallId:se(),toolName:se(),arguments:Jp()})}),adt=nr.extend({type:YI("tool.execution_partial_result"),ephemeral:YI(!0),data:ke({toolCallId:se(),partialOutput:se()})}),odt=nr.extend({type:YI("tool.execution_complete"),data:ke({toolCallId:se(),success:ql(),isUserRequested:ql().optional(),result:ke({content:se()}).optional(),error:ke({message:se(),code:se().optional()}).optional()})}),Gdt=nr.extend({type:YI("hook.start"),data:ke({hookInvocationId:se(),hookType:se(),input:Jp()})}),idt=nr.extend({type:YI("hook.end"),data:ke({hookInvocationId:se(),hookType:se(),output:Jp(),success:ql(),error:ke({message:se(),stack:se().optional()}).optional()})}),ddt=nr.extend({type:YI("system.message"),data:ke({content:se(),role:xd(["system","developer"]),name:se().optional(),metadata:ke({promptVersion:se().optional(),variables:Zv(Jp()).optional()}).optional()})}),YtI=OB("type",[Tit,jit,Dit,_it,Kit,Pit,qit,edt,Idt,tdt,ldt,ndt,cdt,rdt,sdt,adt,odt,Gdt,idt,ddt]);var EF=htI(YtI.parse,"session");var I$=class{constructor(e,I,l,n=!1,c){this.session=e;this.logger=I;this.flushDebounceMs=l;this.shouldSaveSession=n;this.legacySourceFile=c;this.unsubscribe=this.session.on("*",r=>{r.ephemeral||(this.unflushedEvents.push(r),!this.shouldSaveSession&&r.type==="user.message"&&(this.shouldSaveSession=!0),r.type!=="session.resume"&&this.shouldSaveSession&&(this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=setTimeout(()=>{this.flush().catch(s=>{this.logger.error(`Error flushing session ${this.session.sessionId}: ${s instanceof Error?s.message:String(s)}`)})},this.flushDebounceMs)))})}flushTimer=null;unflushedEvents=[];migratedLegacy=!1;isFlushing=!1;needsFlushAfterCurrent=!1;unsubscribe;dispose(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.unsubscribe()}async flush(){if(!this.shouldSaveSession||this.unflushedEvents.length===0)return;if(this.isFlushing){this.needsFlushAfterCurrent=!0;return}this.isFlushing=!0,this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null);let e=this.unflushedEvents;this.unflushedEvents=[];try{if(await EF.append(e,this.session.sessionId),this.logger.debug(`Flushed ${e.length} events to session ${this.session.sessionId}`),this.legacySourceFile&&!this.migratedLegacy){this.logger.debug(`Migrated legacy session ${this.session.sessionId} from ${this.legacySourceFile}`);try{await VtI(this.legacySourceFile)}catch(I){this.logger.error(`Failed to delete legacy session file ${this.legacySourceFile}: ${I}`)}this.migratedLegacy=!0}}catch(I){this.logger.error(`Failed to flush events for ${this.session.sessionId}: ${I instanceof Error?I.message:String(I)}`),this.unflushedEvents.unshift(...e)}finally{this.isFlushing=!1,this.needsFlushAfterCurrent&&(this.needsFlushAfterCurrent=!1,await this.flush())}}},YYe=class extends E_{sessionWriters={};copilotVersion;flushDebounceMs;constructor({version:e,flushDebounceMs:I,...l}){super({...l}),this.copilotVersion=e||"unknown",this.flushDebounceMs=I||100}async createSession(e){let I=e?.sessionId??Wa(),l=new Date,n=new zp(this.options,{sessionId:I,startTime:l});return this.sessionWriters[I]=new I$(n,this.logger,this.flushDebounceMs),n.emit("session.start",{sessionId:I,version:1,producer:"copilot-agent",copilotVersion:this.copilotVersion,startTime:l.toISOString(),selectedModel:e?.selectedModel}),n}async getSession(e,I=!0){let l,n;try{l=await this.loadSession(e)}catch{try{let c=await this.loadLegacySession(e);l=c.session,n=c.legacySourceFile}catch{return}}return this.sessionWriters[e]||(this.sessionWriters[e]=new I$(l,this.logger,this.flushDebounceMs,!0,n)),I&&l.emit("session.resume",{resumeTime:new Date().toISOString(),eventCount:l.getEvents().length}),l}async saveSession(e){await this.sessionWriters[e.sessionId]?.flush()}async loadSession(e){let I=await EF.load(e);return await zp.fromEvents(I,this.options)}async loadLegacySession(e){let l=(await IU.directoryFiles()).filter(a=>{let G=a.match(/^session_(.+)_(\d+)\.json$/);return G&&G[1]===e});if(l.length===0)throw new Error(`Legacy session ${e} not found`);let n=l[0];l.length>1&&this.logger.info(`Multiple legacy sessions found for ${e}, using newest`);let c=await IU.load(n);if(!c)throw new Error(`Failed to load legacy session from ${n}`);let r=new Date(c.startTime),s=new zp(this.options,{sessionId:c.sessionId,startTime:r});return s.emit("session.start",{sessionId:c.sessionId,version:1,producer:"copilot-agent",copilotVersion:this.copilotVersion,startTime:r.toISOString(),selectedModel:c.selectedModel}),s.emit("session.import_legacy",{legacySession:{sessionId:c.sessionId,startTime:r,chatMessages:c.chatMessages,timeline:c.timeline,selectedModel:c.selectedModel},importTime:new Date().toISOString(),sourceFile:n}),this.logger.info(`Loaded legacy session ${e} from ${n}`),{session:s,legacySourceFile:IU.path(n.replace(/\.json$/,""))}}async listSessions(){let e=await EF.directoryFilesWithMetadata(),I=await IU.directoryFilesWithMetadata(),l=await Promise.all(e.map(async r=>({sessionId:r.file.replace(".jsonl",""),startTime:r.ctime,modifiedTime:r.mtime}))),n=(await Promise.all(I.map(async r=>{let s=r.file.match(/^session_(.+)_(\d+)\.json$/);return s?{sessionId:s[1],startTime:r.ctime,modifiedTime:r.mtime}:null}))).filter(r=>r!==null);this.logger.debug(`Found ${l.length} JSONL sessions and ${n.length} legacy sessions`);let c=new Map;for(let r of n)c.set(r.sessionId,r);for(let r of l)c.set(r.sessionId,r);return Array.from(c.values()).sort((r,s)=>s.modifiedTime.getTime()-r.modifiedTime.getTime())}async getLastSession(){let e=await this.listSessions();if(e.length===0)return;e.sort((l,n)=>n.modifiedTime.getTime()-l.modifiedTime.getTime());let I=e[0].sessionId;return await this.getSession(I)}async deleteSession(e){this.sessionWriters[e.sessionId]?.dispose(),delete this.sessionWriters[e.sessionId];let I=EF.path(e.sessionId);this.logger.info(`Deleting session file ${I}`),await VtI(I)}getSessionsDirectory(){return bdt(EF.home(),EF.directory())}setLogger(e){this.logger=e}};o();o();var VYe=class{loggers;constructor(e){this.loggers=e}isDebug(){return this.loggers.some(e=>e.isDebug())}debug(e){this.loggers.forEach(I=>I.debug(e))}log(e){this.loggers.forEach(I=>I.log(e))}info(e){this.loggers.forEach(I=>I.info(e))}notice(e){this.loggers.forEach(I=>I.notice(e))}warning(e){this.loggers.forEach(I=>I.warning(e))}error(e){this.loggers.forEach(I=>I.error(e))}startGroup(e,I){this.loggers.forEach(l=>l.startGroup(e,I))}endGroup(e){this.loggers.forEach(I=>I.endGroup(e))}};o();import{appendFile as mdt,access as hdt,mkdir as pdt}from"fs/promises";import{constants as udt}from"fs";import{dirname as Zdt}from"path";var RYe=class extends Mp{constructor(I,l,n){super(l,n);this.filePath=I;this.writeQueue=Wdt(Zdt(this.filePath)).catch(()=>{})}writeQueue=Promise.resolve();log(I){this.write("LOG",I)}debug(I){super.shouldLog(8)&&this.write("DEBUG",this.filterSecrets(I).toString())}info(I){super.shouldLog(4)&&this.write("INFO",this.filterSecrets(I).toString())}notice(I){super.shouldLog(2)&&this.write("NOTICE",this.filterSecrets(I).toString())}warning(I){super.shouldLog(2)&&this.write("WARNING",this.filterSecrets(I).toString())}error(I){super.shouldLog(1)&&this.write("ERROR",this.filterSecrets(I).toString())}startGroup(I,l){super.shouldLog(l||4)&&this.write("START-GROUP",I)}endGroup(I){super.shouldLog(I||4)&&this.write("END-GROUP","")}write(I,l){let c=`${new Date().toISOString()} [${I}] ${l}
|
|
1459
|
+
`;await e$.runExclusive(d,()=>_Gt(d,m,{mode:384}))}catch(m){throw new Error(`Failed to append to JSONL file ${d}: ${m}`)}},path:n,directoryFiles:async()=>{let G=AG(I(),l());try{let d=(await q_(G,{withFileTypes:!0})).filter(m=>m.isFile()&&m.name.endsWith(".jsonl")).map(m=>m.name),b=await Promise.all(d.map(async m=>{let h=AG(G,m);try{let p=await __(h);return{file:m,mtime:p.mtime}}catch{return{file:m,mtime:new Date}}}));return b.sort((m,h)=>h.mtime.getTime()-m.mtime.getTime()),b.map(m=>m.file)}catch{return[]}},directoryFilesWithMetadata:async()=>{let G=AG(I(),l());try{let d=(await q_(G,{withFileTypes:!0})).filter(m=>m.isFile()&&m.name.endsWith(".jsonl")).map(m=>m.name),b=await Promise.all(d.map(async m=>{let h=AG(G,m);try{let p=await __(h);return{file:m,mtime:p.mtime,ctime:p.ctime}}catch{return{file:m,mtime:new Date,ctime:new Date}}}));return b.sort((m,h)=>h.mtime.getTime()-m.mtime.getTime()),b}catch{return[]}},home:I,directory:l}};var ptI=ke({host:se(),login:se()}),nit=ke({banner:xd(["always","once","never"]).optional(),beep:ql().optional(),last_logged_in_user:ptI.optional(),logged_in_users:cs(ptI).optional(),model:se().optional(),render_markdown:ql().optional(),screen_reader:ql().optional(),theme:se().optional(),trusted_folders:cs(se()).optional(),store_token_plaintext:ql().optional(),stream:ql().optional(),parallel_tool_execution:ql().optional(),feature_flags:ke({enabled:cs(se()).optional()}).optional(),asked_setup_terminals:cs(se()).optional(),capi_hmac_key:se().optional(),copilot_hmac_key:se().optional(),copilot_integration_id:se().optional(),copilot_tokens:Zv(se(),se()).optional(),copilot_url:se().optional(),staff:ql().optional(),log_level:xd(["none","error","warning","info","debug","all","default"]).optional()}),cit=Zv(se(),NZe()),rit=cit.transform(t=>(0,utI.default)(t,(e,I)=>{let l=I.toLowerCase();return l==="github_copilot_integration_id"?"copilot_integration_id":l})),sit=rit.pipe(nit),ait=btI(sit.parse,"config");var ZtI=["claude-sonnet-4.5","claude-sonnet-4","claude-haiku-4.5","gpt-5"];o();var oit=ke({type:YI("copilot"),text:se(),isStreaming:ql().optional()}),Git=ke({type:YI("error"),text:se()}),iit=ke({type:YI("info"),text:se()}),_Yn=ke({displayText:se(),fullPath:se(),type:xd(["file","directory","unresolved","image"]),startIndex:gr()}),dit=ke({type:YI("user"),text:se()}),bit=ke({command:se(),description:se(),timeout:gr().optional(),sessionId:se().optional(),async:ql().optional()}),mit=ke({sessionId:se(),input:se(),delay:gr().optional()}),hit=ke({sessionId:se(),delay:gr()}),pit=ke({sessionId:se()}),uit=ha([bit,mit,hit,pit]),Zit=ke({command:YI("view"),path:se(),view_range:i7([gr(),gr()]).optional()}),Wit=ke({command:YI("create"),path:se(),file_text:se()}),Nit=ke({command:YI("str_replace"),path:se(),new_str:se().optional(),old_str:se()}),Yit=ke({command:YI("insert"),path:se(),insert_line:gr(),new_str:se()}),Vit=OB("command",[Zit,Wit,Nit,Yit]),$Yn=ke({path:se(),view_range:i7([gr(),gr()]).optional()}),e2n=ke({path:se(),file_text:se()}),I2n=ke({path:se(),old_str:se(),new_str:se().optional()}),WtI=ha([uit,Vit,Jp()]),Rit=ke({type:YI("tool_call_requested"),callId:se(),name:se(),toolTitle:se().optional(),intentionSummary:se().nullable(),arguments:WtI,partialOutput:se().optional(),isHidden:ql().optional(),isAlwaysExpanded:ql().optional(),showNoContent:ql().optional()}),yit=ke({type:YI("tool_call_completed"),callId:se(),name:se(),toolTitle:se().optional(),intentionSummary:se().nullable(),result:ha([ke({type:YI("success"),log:se(),markdown:ql().optional()}),ke({type:YI("failure"),log:se(),markdown:ql().optional()}),ke({type:YI("rejected"),markdown:ql().optional()}),ke({type:YI("denied"),log:se(),markdown:ql().optional()})]),arguments:WtI,isHidden:ql().optional(),isAlwaysExpanded:ql().optional(),showNoContent:ql().optional()}),git=ha([oit,Git,iit,dit,Rit,yit]),NtI=git.and(ke({id:se(),timestamp:MB.date()}));var eU=ke({type:YI("text"),text:se()}),Ait=ke({type:YI("refusal"),refusal:se()}),Qit=ke({type:YI("image_url"),image_url:ke({url:se(),detail:xd(["auto","low","high"]).optional()})}),wit=ke({type:YI("input_audio"),input_audio:ke({data:se(),format:YI("wav").or(YI("mp3"))})}),Xit=ke({type:YI("file"),file:ke({file_date:se().optional(),file_id:se().optional(),filename:se().optional()})}),Eit=ha([eU,Qit,wit,Xit]),Hit=ke({name:se(),arguments:se()}),vit=ke({name:se(),input:se()}),Cit=ke({id:se(),type:YI("function"),function:Hit}),Jit=ke({id:se(),type:YI("custom"),custom:vit}),Lit=ha([Cit,Jit]),fit=ke({name:se(),arguments:se()}),kit=ke({id:se()}),xit=ke({content:ha([se(),cs(eU)]),role:YI("developer"),name:se().optional()}),Bit=ke({content:ha([se(),cs(eU)]),role:YI("system"),name:se().optional()}),zit=ke({content:ha([se(),cs(Eit)]),role:YI("user"),name:se().optional()}),Uit=ke({content:ha([se(),cs(ha([eU,Ait]))]).nullable().optional(),role:YI("assistant"),name:se().optional(),refusal:se().nullable().optional(),audio:kit.nullable().optional(),function_call:fit.nullable().optional(),tool_calls:cs(Lit).optional()}),Sit=ke({content:ha([se(),cs(eU)]),role:YI("tool"),tool_call_id:se()}),Oit=ke({content:se().nullable(),role:YI("function"),name:se()}),Mit=ha([xit,Bit,zit,Uit,Sit,Oit]),NYe=ke({sessionId:se(),startTime:MB.date(),chatMessages:cs(Mit),timeline:cs(NtI),selectedModel:xd(ZtI).optional()}),IU=mtI(NYe.parse,"history-session");o();o();var nr=ke({id:se().uuid(),timestamp:se().datetime(),parentId:se().uuid().nullable(),ephemeral:ql().optional()}),Tit=nr.extend({type:YI("session.start"),data:ke({sessionId:se(),version:gr(),producer:se(),copilotVersion:se(),startTime:se().datetime(),selectedModel:se().optional()})}),jit=nr.extend({type:YI("session.resume"),data:ke({resumeTime:se().datetime(),eventCount:gr()})}),Dit=nr.extend({type:YI("session.error"),data:ke({errorType:se(),message:se(),stack:se().optional()})}),Kit=nr.extend({type:YI("session.info"),data:ke({infoType:se(),message:se()})}),Pit=nr.extend({type:YI("session.model_change"),data:ke({previousModel:se().optional(),newModel:se()})}),qit=nr.extend({type:YI("session.import_legacy"),data:ke({legacySession:NYe,importTime:se().datetime(),sourceFile:se()})}),_it=nr.extend({type:YI("session.idle"),ephemeral:YI(!0),data:ke({})}),$it=ke({type:xd(["file","directory"]),path:se(),displayName:se()}),edt=nr.extend({type:YI("user.message"),data:ke({content:se(),attachments:cs($it).optional()})}),Idt=nr.extend({type:YI("assistant.turn_start"),data:ke({turnId:se()})}),tdt=nr.extend({type:YI("assistant.message"),data:ke({messageId:se(),content:se(),toolRequests:cs(ke({toolCallId:se(),name:se(),arguments:Jp()})).optional()})}),ldt=nr.extend({type:YI("assistant.turn_end"),data:ke({turnId:se()})}),ndt=nr.extend({type:YI("assistant.usage"),ephemeral:YI(!0),data:ke({model:se().optional(),inputTokens:gr().optional(),outputTokens:gr().optional(),cost:gr().optional(),duration:gr().optional(),initiator:se().optional()})}),cdt=nr.extend({type:YI("abort"),data:ke({reason:se()})}),rdt=nr.extend({type:YI("tool.user_requested"),data:ke({toolCallId:se(),toolName:se(),arguments:Jp()})}),sdt=nr.extend({type:YI("tool.execution_start"),data:ke({toolCallId:se(),toolName:se(),arguments:Jp()})}),adt=nr.extend({type:YI("tool.execution_partial_result"),ephemeral:YI(!0),data:ke({toolCallId:se(),partialOutput:se()})}),odt=nr.extend({type:YI("tool.execution_complete"),data:ke({toolCallId:se(),success:ql(),isUserRequested:ql().optional(),result:ke({content:se()}).optional(),error:ke({message:se(),code:se().optional()}).optional()})}),Gdt=nr.extend({type:YI("hook.start"),data:ke({hookInvocationId:se(),hookType:se(),input:Jp()})}),idt=nr.extend({type:YI("hook.end"),data:ke({hookInvocationId:se(),hookType:se(),output:Jp(),success:ql(),error:ke({message:se(),stack:se().optional()}).optional()})}),ddt=nr.extend({type:YI("system.message"),data:ke({content:se(),role:xd(["system","developer"]),name:se().optional(),metadata:ke({promptVersion:se().optional(),variables:Zv(Jp()).optional()}).optional()})}),YtI=OB("type",[Tit,jit,Dit,_it,Kit,Pit,qit,edt,Idt,tdt,ldt,ndt,cdt,rdt,sdt,adt,odt,Gdt,idt,ddt]);var EF=htI(YtI.parse,"session");var I$=class{constructor(e,I,l,n=!1,c){this.session=e;this.logger=I;this.flushDebounceMs=l;this.shouldSaveSession=n;this.legacySourceFile=c;this.unsubscribe=this.session.on("*",r=>{r.ephemeral||(this.unflushedEvents.push(r),!this.shouldSaveSession&&r.type==="user.message"&&(this.shouldSaveSession=!0),r.type!=="session.resume"&&this.shouldSaveSession&&(this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=setTimeout(()=>{this.flush().catch(s=>{this.logger.error(`Error flushing session ${this.session.sessionId}: ${s instanceof Error?s.message:String(s)}`)})},this.flushDebounceMs)))})}flushTimer=null;unflushedEvents=[];migratedLegacy=!1;isFlushing=!1;needsFlushAfterCurrent=!1;unsubscribe;dispose(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.unsubscribe()}async flush(){if(!this.shouldSaveSession||this.unflushedEvents.length===0)return;if(this.isFlushing){this.needsFlushAfterCurrent=!0;return}this.isFlushing=!0,this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null);let e=this.unflushedEvents;this.unflushedEvents=[];try{if(await EF.append(e,this.session.sessionId),this.logger.debug(`Flushed ${e.length} events to session ${this.session.sessionId}`),this.legacySourceFile&&!this.migratedLegacy){this.logger.debug(`Migrated legacy session ${this.session.sessionId} from ${this.legacySourceFile}`);try{await VtI(this.legacySourceFile)}catch(I){this.logger.error(`Failed to delete legacy session file ${this.legacySourceFile}: ${I}`)}this.migratedLegacy=!0}}catch(I){this.logger.error(`Failed to flush events for ${this.session.sessionId}: ${I instanceof Error?I.message:String(I)}`),this.unflushedEvents.unshift(...e)}finally{this.isFlushing=!1,this.needsFlushAfterCurrent&&(this.needsFlushAfterCurrent=!1,await this.flush())}}},YYe=class extends E_{sessionWriters={};copilotVersion;flushDebounceMs;constructor({version:e,flushDebounceMs:I,...l}){super({...l}),this.copilotVersion=e||"unknown",this.flushDebounceMs=I||100}async createSession(e){let I=e?.sessionId??Wa(),l=new Date,n=new zp(this.options,{sessionId:I,startTime:l});return this.sessionWriters[I]=new I$(n,this.logger,this.flushDebounceMs),n.emit("session.start",{sessionId:I,version:1,producer:"copilot-agent",copilotVersion:this.copilotVersion,startTime:l.toISOString(),selectedModel:e?.selectedModel}),n}async getSession(e,I=!0){let l,n;try{l=await this.loadSession(e)}catch{try{let c=await this.loadLegacySession(e);l=c.session,n=c.legacySourceFile}catch{return}}return this.sessionWriters[e]||(this.sessionWriters[e]=new I$(l,this.logger,this.flushDebounceMs,!0,n)),I&&l.emit("session.resume",{resumeTime:new Date().toISOString(),eventCount:l.getEvents().length}),l}async saveSession(e){await this.sessionWriters[e.sessionId]?.flush()}async loadSession(e){let I=await EF.load(e);return await zp.fromEvents(I,this.options)}async loadLegacySession(e){let l=(await IU.directoryFiles()).filter(a=>{let G=a.match(/^session_(.+)_(\d+)\.json$/);return G&&G[1]===e});if(l.length===0)throw new Error(`Legacy session ${e} not found`);let n=l[0];l.length>1&&this.logger.info(`Multiple legacy sessions found for ${e}, using newest`);let c=await IU.load(n);if(!c)throw new Error(`Failed to load legacy session from ${n}`);let r=new Date(c.startTime),s=new zp(this.options,{sessionId:c.sessionId,startTime:r});return s.emit("session.start",{sessionId:c.sessionId,version:1,producer:"copilot-agent",copilotVersion:this.copilotVersion,startTime:r.toISOString(),selectedModel:c.selectedModel}),s.emit("session.import_legacy",{legacySession:{sessionId:c.sessionId,startTime:r,chatMessages:c.chatMessages,timeline:c.timeline,selectedModel:c.selectedModel},importTime:new Date().toISOString(),sourceFile:n}),this.logger.info(`Loaded legacy session ${e} from ${n}`),{session:s,legacySourceFile:IU.path(n.replace(/\.json$/,""))}}async listSessions(){let e=await EF.directoryFilesWithMetadata(),I=await IU.directoryFilesWithMetadata(),l=await Promise.all(e.map(async r=>({sessionId:r.file.replace(".jsonl",""),startTime:r.ctime,modifiedTime:r.mtime}))),n=(await Promise.all(I.map(async r=>{let s=r.file.match(/^session_(.+)_(\d+)\.json$/);return s?{sessionId:s[1],startTime:r.ctime,modifiedTime:r.mtime}:null}))).filter(r=>r!==null);this.logger.debug(`Found ${l.length} JSONL sessions and ${n.length} legacy sessions`);let c=new Map;for(let r of n)c.set(r.sessionId,r);for(let r of l)c.set(r.sessionId,r);return Array.from(c.values()).sort((r,s)=>s.modifiedTime.getTime()-r.modifiedTime.getTime())}async getLastSession(){let e=await this.listSessions();if(e.length===0)return;e.sort((l,n)=>n.modifiedTime.getTime()-l.modifiedTime.getTime());let I=e[0].sessionId;return await this.getSession(I)}async deleteSession(e){await this.closeSession(e);let I=EF.path(e.sessionId);this.logger.info(`Deleting session file ${I}`),await VtI(I)}async closeSession(e){this.logger.info(`Closing session ${e.sessionId}`);let I=this.sessionWriters[e.sessionId];I&&(await I.flush(),I.dispose(),delete this.sessionWriters[e.sessionId])}getSessionsDirectory(){return bdt(EF.home(),EF.directory())}setLogger(e){this.logger=e}};o();o();var VYe=class{loggers;constructor(e){this.loggers=e}isDebug(){return this.loggers.some(e=>e.isDebug())}debug(e){this.loggers.forEach(I=>I.debug(e))}log(e){this.loggers.forEach(I=>I.log(e))}info(e){this.loggers.forEach(I=>I.info(e))}notice(e){this.loggers.forEach(I=>I.notice(e))}warning(e){this.loggers.forEach(I=>I.warning(e))}error(e){this.loggers.forEach(I=>I.error(e))}startGroup(e,I){this.loggers.forEach(l=>l.startGroup(e,I))}endGroup(e){this.loggers.forEach(I=>I.endGroup(e))}};o();import{appendFile as mdt,access as hdt,mkdir as pdt}from"fs/promises";import{constants as udt}from"fs";import{dirname as Zdt}from"path";var RYe=class extends Mp{constructor(I,l,n){super(l,n);this.filePath=I;this.writeQueue=Wdt(Zdt(this.filePath)).catch(()=>{})}writeQueue=Promise.resolve();log(I){this.write("LOG",I)}debug(I){super.shouldLog(8)&&this.write("DEBUG",this.filterSecrets(I).toString())}info(I){super.shouldLog(4)&&this.write("INFO",this.filterSecrets(I).toString())}notice(I){super.shouldLog(2)&&this.write("NOTICE",this.filterSecrets(I).toString())}warning(I){super.shouldLog(2)&&this.write("WARNING",this.filterSecrets(I).toString())}error(I){super.shouldLog(1)&&this.write("ERROR",this.filterSecrets(I).toString())}startGroup(I,l){super.shouldLog(l||4)&&this.write("START-GROUP",I)}endGroup(I){super.shouldLog(I||4)&&this.write("END-GROUP","")}write(I,l){let c=`${new Date().toISOString()} [${I}] ${l}
|
|
1460
1460
|
`;this.writeQueue=this.writeQueue.then(()=>this.performWrite(c)).catch(()=>{})}async performWrite(I){await mdt(this.filePath,I)}};async function Wdt(t){try{await hdt(t,udt.F_OK)}catch{await pdt(t,{recursive:!0})}}o();async function*T2n(t){let{prompt:e,...I}=t,l=new zp(I),n=[],c=!1,r=l.on("*",s=>{n.push(s),s.type==="session.idle"&&(c=!0)});for(l.send({prompt:e});!c||n.length>0;){let s=n.shift();s?yield s:await new Promise(a=>setTimeout(a,10))}r()}export{Mp as BaseLogger,VYe as CompoundLogger,tR as ConsoleLogger,RYe as FileLogger,bW as NoopLogger,zp as Session,YtI as SessionEventSchema,E_ as SessionManager,cot as completeOrphanedToolCalls,EW as executeHooks,RtI as internal,$v as isDebugEnvironment,T2n as query};
|
|
1461
1461
|
/*! Bundled license information:
|
|
1462
1462
|
|