@github/copilot 0.0.354-23 → 0.0.354-24

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/sdk/index.js CHANGED
@@ -1368,7 +1368,7 @@ ${t}
1368
1368
 
1369
1369
  <reminder>
1370
1370
  The user may have mentioned images, if so these will have been attached to this message, in the order they were mentioned
1371
- </reminder>`),l.trim()},F7={completeAsSoonAsPossible:"You will soon run out of iterations. Begin making your final code changes. Complete any code changes that are still pending instead of performing validations.",commitNow:"You are imminently out of iterations. Call **report_progress** detailing your current progress. After doing so, provide a final answer as soon as possible.",finalAnswerNeeded:"You have reached the maximum number of iterations. Consider your work completed. I no longer need more changes. Please provide a final answer."},Cqe=t=>`<reminder>You haven't committed any changes yet. Any code changes not meant to be temporary must be made in ${iZe(t)}. Commit changes by using the **report_progress** tool.</reminder>`;var XZe="/tmp/playwright-logs",Y8I="0.0.40",EZe=[`@playwright/mcp@${Y8I}`,"--viewport-size","1280, 720","--output-dir",XZe],QBl=[...EZe,"--isolated"];var DZe=class t extends Error{constructor(e){super(e),this.name="ImageSizeError",Object.setPrototypeOf(this,t.prototype)}},k7;async function W7e(){if(k7)return k7;try{return k7=(await Promise.resolve().then(()=>vl(u7e(),1))).default,k7}catch{}}var Zz=2e3;async function N$I(t,e,I,l){let n={"Content-Type":"application/octet-stream",Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",Authorization:"Bearer "+e},c=`${BVe(l)}/${t}`;I.info(`Downloading image from ${c}`);try{let r=await fetch(c,{method:"GET",headers:n});if(I.info(`Response status: ${r.status} ${r.statusText}`),I.debug(`Download Response URL: ${r.url}`),!r.ok){I.info(`Failed to download image, status: ${r.status}, statusText: ${r.statusText}`);try{let d=await r.text();I.info(`Error response body: ${d}`)}catch(d){I.info(`Could not read error response body: ${d}`)}return{size:0}}let a=(await r.json()).url;if(!a)return I.error(`No asset URL found in response for image GUID: ${t}`),{size:0};let o=await fetch(a,{method:"GET"});if(!o.ok)return I.error(`Failed to download image: ${o.status} ${o.statusText}`),{size:0};let G=await o.arrayBuffer(),i=G.byteLength;return I.info(`Downloaded content size: ${ah(i)}`),{size:i,buffer:Buffer.from(G),mimeType:o.headers.get("content-type")||void 0}}catch(r){return I.error("Network error downloading image"),r instanceof Error&&(I.info(`Error message: ${r.message}`),I.info(`Error stack: ${r.stack}`)),{size:0}}}function KZe(t,e,I,l){let n=/<img\b[^>]*\bsrc="([^"]+)"[^>]*>/g,c=/!\[.*?\]\((.*?)\)/g,r=[];return r.push(...Z7e(t,e,n,I,l)),r.push(...Z7e(t,e,c,I,l)),r}function Z7e(t,e,I,l,n){let c=t.matchAll(I),r=[],s=/\/([a-f0-9-]+)$/;for(let a of c){let o=y$I(a[1],e),G=g$I(a[1],e,n);if(o||G){let i=a[1].match(s),d={url:a[1],guid:"",kind:G?"legacy_attachment":"attachment"};i&&i.length>1&&(d.guid=i[1]),r.push(d)}else if(l){let i={url:a[1],guid:"",kind:"committed_attachment"};r.push(i)}}return r}function Y$I(t){return!t.startsWith("http://")&&!t.startsWith("https://")&&qZe(t)}function qZe(t){return/\.(png|jpe?g|gif|svg|webp|bmp|tiff?|ico|heic|avif)$/i.test(t)}function V$I(t){try{let e=/Here are relevant code snippets from the repository that might help with this task:\s*(\[[\s\S]*?\])(?=\n|$)/,I=t.match(e);if(!I?.[1]||I[1].length<=1)return null;let l=I[1].trim();return JSON.parse(l)}catch{return null}}function R$I(t,e,I){if(!t?.url||!t?.ref||!t?.path)throw new Error("Invalid repository insight: missing required fields");if(!e||e.trim()==="")throw new Error("Invalid image path: path cannot be empty");let l=t.url.split("/").slice(3,5).join("/"),n=t.ref.split("/")[2],c;if(e.startsWith("/"))c=e.slice(1);else{let s=t.path,a=Wz.dirname(s);c=Wz.resolve("/",a,e).slice(1)}return`${I}/${l}/blob/${n}/${c}`}function y$I(t,e){return e?!!t.startsWith(`${e}/user-attachments/assets`):!1}function g$I(t,e,I){return e&&new RegExp(`^${e}/[\\w.-]+/[\\w.-]+/assets/\\d+/[^.]+$`).test(t)?(I.debug(`Legacy GitHub asset URL detected: ${t}`),!0):!1}async function _Ze(t){let{width:e,height:I}=Q6e(t);if(e===void 0||I===void 0)throw new Error("Unable to determine image dimensions.");return{width:e,height:I}}async function x7(t,e,I,l,n,c){t.debug(`Checking if image is valid size and dimensions. Max size: ${I}, Max dimension: ${l}`);let{exceedsSizeLimit:r,exceedsDimensionLimit:s}=await Nz(I,l,c);if(!s&&!r)return t.debug("Image is within size and dimension limits."),c;if(s){t.debug(`Image x or y dimension exceeds the maximum limit of ${l}, attempting to resize`);let[a,o]=await Q$I(t,c,l,I,n);if(!a){t.debug("Failed to resize image to fit within the maximum dimensions limits, skipping"),e.imagesRemovedDueToDimensions++,e.imagesFailedToResize++,o==="unsupported_mime_type"?e.resizeErrorsUnsupportedMimeType++:e.resizeErrorsUnknown++;return}let{exceedsDimensionLimit:G}=await Nz(I,l,a);if(G){e.imagesRemovedDueToDimensions++,t.debug("Image dimensions exceed the maximum dimensions limits, skipping");return}return e.imagesResized++,t.debug("Image resized successfully."),a}if(r){t.debug(`Image size ${ah(c.length)} is larger than the maximum size of ${ah(I)}, attempting to reduce image quality`);let a=await w$I(t,c,l,I,n);if(!a){t.debug("Failed to reduce image quality to fit within the maximum size, skipping"),e.imagesFailedToReduceQuality++,e.imagesRemovedDueToSize++;return}return e.imagesWithLoweredQuality++,t.debug("Image quality successfully reduced."),a}}async function Nz(t,e,I){let l=await _Ze(I),n=I.length;return!l.width||!l.height?{exceedsSizeLimit:n>t,exceedsDimensionLimit:!1}:{exceedsSizeLimit:await A$I(t,I),exceedsDimensionLimit:await F$I(e,I)}}async function F$I(t,e){let I=await _Ze(e);return!I.width||!I.height?!1:I.width>t||I.height>t}async function A$I(t,e){return e.length>t}async function Q$I(t,e,I,l,n){try{if(!N7e(t,n))return[void 0,"unsupported_mime_type"];let c=await _Ze(e);if(!c.width||!c.height)return t.error("Failed to determine size of uploaded image"),[void 0,"determine_dimensions_failed"];let r=async(u,Z)=>{let N=await W7e();if(!N)return;let g=N(e).resize(u,Z,{fit:"inside",withoutEnlargement:!0});return PZe(t,await g.toBuffer(),void 0,n)},s=Math.min(I,c.width),a=Math.min(I,c.height),o=await r(s,a);if(o&&o.length<=l)return[o,void 0];let G=Math.max(s,a),i=1,d=G-1,b,m=0,h=10;for(;i<=d&&m<h;){let u=Math.floor((i+d)/2),Z=await r(u,u);if(!Z)break;let{exceedsSizeLimit:N,exceedsDimensionLimit:g}=await Nz(l,I,Z);!N&&!g?(b=Z,i=u+1):d=u-1,m++}return[b,void 0]}catch(c){return t.error(`Failed to resize image for upload: ${c instanceof Error?c.message:String(c)}`),[void 0,"unknown"]}}async function w$I(t,e,I,l,n){try{let c=n==="image/png"?80:100,r=n==="image/png"?Math.floor(c*.4):20,s=await PZe(t,e,r,n);if(!s||s.length>l)return;let a=r,o=c,G,i=0,d=10,b=a,m=o-1;for(;b<=m&&i<d;){let h=Math.floor((b+m)/2),u=await PZe(t,e,h,n);if(!u)return G;let{exceedsSizeLimit:Z,exceedsDimensionLimit:N}=await Nz(l,I,u);!Z&&!N?(G=u,b=h+1):m=h-1,i++}return G}catch(c){t.error(`Failed to reduce image quality: ${c instanceof Error?c.message:String(c)}`);return}}async function PZe(t,e,I,l){let n=await W7e();if(!n)return;let c=n(e);switch(l){case"image/png":return I?c.png({quality:I}).toBuffer():c.png().toBuffer();case"image/jpeg":return I?c.jpeg({quality:I}).toBuffer():c.jpeg().toBuffer();default:t.debug(`Unsupported image format: ${l}`);return}}var Yz=class{imagesRemovedDueToSize=0;imagesRemovedDueToDimensions=0;imagesResized=0;imagesWithLoweredQuality=0;imagesFailedToResize=0;imagesFailedToReduceQuality=0;base64ImagesSize=[];resizedBase64ImagesSize=[];extractedImagesSize=[];imagesResolvedFromGitHubMCPSize=[];resizeErrorsUnsupportedMimeType=0;resizeErrorsUnknown=0};function X$I(t,e,I,l){if(e<=0)return[];let n=[];for(let c of t){if(c.role!=="user"||n.length>=e)continue;let r=typeof c.content=="string"?c.content:JSON.stringify(c.content),s=V$I(r);if(s)for(let a in s){if(n.length>=e)break;let o=s[a].contents,G=KZe(o,I,!0,l);for(let i of G){if(n.length>=e)break;let d=i.url,b="",m=!1;if(i.kind==="attachment"||i.kind==="legacy_attachment"?n.push(i):Y$I(d)?(m=!0,b=R$I(s[a],d,I),n.push({url:b,guid:i.guid,kind:"committed_attachment"})):qZe(d)&&d.startsWith(I)&&(m=!0,n.push({...i,kind:"committed_attachment"})),m){let h=n[n.length-1],u=new RegExp(`^${I}/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$`),Z=h.url.match(u);if(l.info(`Blob match for ${h.url}: ${JSON.stringify(Z)}`),Z&&Z.length===5){let[,N,g,y,A]=Z;h.owner=N,h.repo=g,h.branch=y,h.path=A,l.info(`Repository metadata extracted: owner=${N}, repo=${g}, branch=${y}, path=${A}`)}else l.info(`Failed to extract repository metadata from URL: ${h.url}`)}}}}return n}function E$I(t,e){let I=e.flatMap(n=>J0(n)?n.content.flatMap(c=>c.type==="image_url"?c.image_url.url:[]):[]),l=new Set(I);return t.filter(n=>!l.has(n.url))}var B7=class{async resolveRepositoryImages(e,I,l,n,c,r){if(I<=0)return[];let s=X$I(e,I,l,n);this.logger.debug(`Found ${s.length} repository image URLs to process`);let a=E$I(s,e),o=await this.processImageReferences(a,c,r);return this.logger.debug(`Processed ${o.addedImages.length} repository image URLs`),o.addedImages}async*preRequest(e){let I=e.modelInfo;if(!I.capabilities?.limits){this.logger.debug("Model limits not defined, skipping image processing");return}if(!I.capabilities?.supports?.vision||!this.settings.featureFlags?.copilot_swe_agent_vision){this.logger.debug("Vision not supported or enabled, skipping image processing");return}if(!this.gitHubServerUrl){this.logger.debug("GitHub server URL is not set, skipping image processing");return}for(let i of this.messagesToInsertOnNextPreRequest)e.messages.push(i),yield{kind:"message",turn:e.turn,callId:e.callId,message:i};this.messagesToInsertOnNextPreRequest.splice(0);let l=[],n=I.capabilities.limits.vision?.max_prompt_images??1,c=I.capabilities.limits.vision?.max_prompt_image_size??3145728,r=0,s=[],a=new Yz,o=new Map;for(let i of e.messages)if(i.role=="user")if(typeof i.content=="string"){let d=KZe(i.content,this.gitHubServerUrl,!1,this.logger).filter(m=>!this.processedImageUrls.has(m.url)),b=await this.processImageReferences(d,c,a);s.push(...b.addedImages)}else{let d=[];for(let[b,m]of i.content.entries()){if(m.type==="text"){let h=KZe(m.text,this.gitHubServerUrl,!1,this.logger).filter(Z=>!this.processedImageUrls.has(Z.url)),u=await this.processImageReferences(h,c,a);s.push(...u.addedImages)}else if(m.type==="image_url"){if(m.image_url.url.startsWith("data:")){let[h,u]=await this.extractAndUploadImageData(m,c,a);if(h===""){this.logger.debug("Skipping image upload for empty image data");continue}if(s.push(h),b>=1&&d.length>0){let Z=d.at(-1);Z&&Z.type==="text"&&Z.text&&Z.text.includes("screenshot")&&o.set(h,vqe(h))}d.pop();continue}r++}d.push(m)}i.content=d}for(this.logger.debug(`Found ${s.length} image urls in the messages`),this.logger.debug(`Allowed number of images: ${n}`);r<n&&s.length>0;){let i=s.shift();if(!i){this.logger.debug("Skipping empty image url");continue}if(this.processedImageUrls.has(i)){this.logger.debug(`Skipping already processed image url: ${i}`);continue}this.processedImageUrls.add(i);let d=`Here is the image url: ${i}`;o.has(i)&&(d=o.get(i)||d),this.logger.debug(`Adding image url: ${i}`),l.push({role:"user",content:[{type:"text",text:d},{type:"image_url",image_url:{url:i}}]}),r++}if(this.settings.featureFlags?.copilot_swe_agent_resolve_repo_images&&(this.logger.debug("Resolving repository images..."),r<n)){let i=await this.resolveRepositoryImages(e.messages,n-r,this.settings.github?.serverUrl||"",this.logger,c,a);this.logger.debug(`Resolved ${i.length} repository image URLs`);for(let d of i){if(r>=n)break;if(this.processedImageUrls.has(d)){this.logger.debug(`Skipping already processed repository image url: ${d}`);continue}l.push({role:"user",content:[{type:"text",text:"Here is the image url:"},{type:"image_url",image_url:{url:d}}]}),this.processedImageUrls.add(d),r++}}let G={imagesExtractedCount:a.extractedImagesSize.length,base64ImagesCount:a.base64ImagesSize.length,imagesRemovedDueToSize:a.imagesRemovedDueToSize,imagesRemovedDueToDimensions:a.imagesRemovedDueToDimensions,imagesResized:a.imagesResized,imagesResolvedFromGitHubMCPCount:a.imagesResolvedFromGitHubMCPSize.length};for(let i=0;i<a.base64ImagesSize.length;i++)G[`base64ImageSize_${i}`]=a.base64ImagesSize[i];for(let i=0;i<a.resizedBase64ImagesSize.length;i++)G[`resizedBase64ImageSize_${i}`]=a.resizedBase64ImagesSize[i];for(let i=0;i<a.extractedImagesSize.length;i++)G[`extractedImageSize_${i}`]=a.extractedImagesSize[i];for(let i=0;i<a.imagesResolvedFromGitHubMCPSize.length;i++)G[`imagesResolvedFromGitHubMCPSize_${i}`]=a.imagesResolvedFromGitHubMCPSize[i];l.length>0&&this.logger.debug(`Using ${l.length} image messages`);for(let i of l)yield{kind:"message",turn:e.turn,callId:e.callId,message:i},e.messages.push(i);G.allImagesSendToLlm=e.messages.filter(J0).length,yield{kind:"image_processing",turn:e.turn,imageProcessingMetrics:G},e.messages.some(i=>J0(i))&&(e.additionalRequestHeaders["Copilot-Vision-Request"]="true")}async extractAndUploadImageData(e,I,l){let n=BC(this.settings);if(!n)return this.logger.debug("No user token available, skipping image upload"),[""];this.logger.debug("Found base64 image data, uploading...");let c=e.image_url.url.match(/^data:(.*?);base64,(.*)$/);if(!c||c.length<3)return this.logger.debug("Invalid base64 image data format, skipping"),[""];let r=c[1];if(!N7e(this.logger,r))return[""];let s=c[2];if(s.length===0)return this.logger.debug("Empty base64 image data, skipping"),[""];let a=Buffer.from(s,"base64");if(l.base64ImagesSize.push(a.length),a=await x7(this.logger,l,I,Zz,r,a),l.resizedBase64ImagesSize.push(a?.length??-1),!a)return["",new DZe(`Image size exceeds maximum size of ${ah(I)}`)];s=a.toString("base64");try{let o=await this.uploadBase64ImageData(s,r,n);return o?(this.logger.debug(`Uploaded image url: ${o}`),e.image_url.url=o,[o]):(this.logger.debug("Failed to upload image, skipping"),[""])}catch(o){let G=o instanceof Error?o.message:String(o);return this.logger.debug(`Error during image upload: ${G}`),[""]}}async uploadBase64ImageData(e,I,l){try{let n=xVe(this.settings),c=I.split("/").at(1),r=`image-${Date.now()}.${c}`;if(!e||e.trim()==="")return this.logger.error("Empty image data provided for upload"),null;let s=Buffer.from(e,"base64");if(s.length===0)return this.logger.error("Converted image data has zero length"),null;let a=this.settings.github?.repo?.id;if(!a)return this.logger.error("GitHub repository ID is not configured, cannot upload image"),null;let o=`${n}?name=${encodeURIComponent(r)}&content_type=${encodeURIComponent(I)}&repository_id=${a}`;this.logger.debug(`Uploading image data (${ah(s.length)}) to ${n} with name ${encodeURIComponent(r)} and content type ${encodeURIComponent(I)}`);let G={"Content-Type":"application/octet-stream",Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",Authorization:"Bearer "+l},i=await fetch(o,{method:"POST",headers:G,body:s}).catch(b=>{throw b instanceof Error?(this.logger.error(`Failed to upload image: ${b.message}`),b.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):b.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(b.message.includes("request entity too large")||b.message.includes("payload too large"))&&this.logger.error("Request payload too large. Try reducing the image size.")):typeof b=="object"&&b!==null&&"code"in b&&"message"in b?(this.logger.error(`Failed to upload image: ${b.message}`),b.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):b.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(b.message.includes("request entity too large")||b.message.includes("payload too large"))&&this.logger.error("Request payload too large. Try reducing the image size.")):this.logger.error(`Failed to upload image: ${String(b)}`),this.logger.debug(`Complete error details: ${JSON.stringify({code:b?.code,message:b?.message,stack:b?.stack,name:b?.name,cause:b?.cause},null,2)}`),b});if(!i.ok){let b=await i.text().catch(()=>"Unable to read error response");return this.logger.error(`Failed to upload image: ${i.status} ${i.statusText} - ${b}`),null}let d=await i.json();return this.logger.debug(`Upload result: ${JSON.stringify(d,null,2)}`),d.url||null}catch(n){return this.logger.error(`Error handling image upload: ${n instanceof Error?n.message:String(n)}`),n instanceof Error&&n.stack&&this.logger.debug(`Stack trace: ${n.stack}`),null}}async getRepositoryImageViaTools(e){if(this.logger.debug(`Attempting to retrieve repository image: ${e.owner}/${e.repo}/${e.path}@${e.branch}`),this.githubGetFileContentsTool){this.logger.debug(`GitHub MCP tool found, calling with image reference: ${JSON.stringify(e)}`);try{let I=await this.githubGetFileContentsTool.callback({owner:e.owner,repo:e.repo,path:e.path,branch:e.branch},{toolCallId:crypto.randomUUID(),settings:this.settings});if(this.logger.debug(`GitHub tool call completed. Result type: ${typeof I}`),this.logger.debug(`GitHub tool call result structure: ${typeof I=="object"&&I!==null?Object.keys(I).join(", "):typeof I}`),typeof I=="object"&&I!==null&&"binaryResultForLlm"in I&&Array.isArray(I.binaryResultForLlm)){this.logger.debug(`Tool result has binaryResultForLlm array with ${I.binaryResultForLlm.length} items`);try{for(let l of I.binaryResultForLlm)if(l.data&&l.mimeType){let n=Buffer.from(l.data,"base64"),c=l.mimeType;return{buffer:n,mimeType:c}}}catch(l){this.logger.error(`Failed to parse GitHub tool response: ${l}`),this.logger.debug(`binaryResultForLlm length: ${I.binaryResultForLlm?.length||0}`)}}else typeof I=="string"?this.logger.debug(`GitHub tool returned string result: ${I}`):this.logger.debug(`GitHub tool call failed or returned unexpected format. Result structure: ${typeof I=="object"&&I!==null?Object.keys(I).join(", "):typeof I}`)}catch(I){this.logger.error(`Error calling GitHub MCP tool: ${I}`)}}else this.logger.debug("GitHub MCP tool 'github-mcp-server-get_file_contents' not available");return this.logger.debug("Failed to retrieve repository image, returning null"),null}async getImgRefsSmallerThanMaxSize(e,I,l){let n=[],c=await Promise.all(e);for(let{imgRef:r,attachment:s}of c)if(this.logger.debug(`Processing attachment for ${r.url}, has buffer: ${!!s.buffer}, buffer size: ${s.buffer?.length||0}`),s.buffer)if(I.extractedImagesSize.push(s.buffer.length),Ql(this.settings,"copilot_swe_agent_resize_image_references")){if(!await x7(this.logger,I,l,Zz,s.mimeType,s.buffer)){this.logger.info("Unable to resize image to be within limits, skipping");continue}n.push(r.url)}else{let a=await Nz(l,Zz,s.buffer);if(this.logger.debug(`Image size check for ${r.url}: size=${s.buffer.length}, maxSize=${l}, exceedsSize=${a.exceedsSizeLimit}, exceedsDimensions=${a.exceedsDimensionLimit}`),a.exceedsSizeLimit?(I.imagesRemovedDueToSize++,this.logger.debug(`Image ${r.url} removed due to size (${s.buffer.length} > ${l})`)):a.exceedsDimensionLimit&&(I.imagesRemovedDueToDimensions++,this.logger.debug(`Image ${r.url} removed due to dimensions`)),a.exceedsSizeLimit||a.exceedsDimensionLimit){this.processedImageUrls.add(r.url),this.logger.info(`Image has been removed from the request due to size constraints. Please resize images to be smaller than ${ah(l)}.`);continue}n.push(r.url),this.logger.debug(`Image ${r.url} passed size checks and added to results`)}else this.processedImageUrls.add(r.url),this.logger.debug(`Skipping image ${r.url} - could not fetch image data`);return n}async processImageReferences(e,I,l){let n=this.settings.github?.serverUrl||"";this.logger.debug(`Processing ${e.length} image references`),this.logger.debug(`GitHub server URL: ${n}`),this.logger.debug(`Image references: ${e.map(s=>s.url).join(", ")}`);let c=e.filter(s=>!this.processedImageUrls.has(s.url)).map(async s=>{if(this.logger.debug(`Processing image reference: ${JSON.stringify(s,null,2)}`),s.kind==="committed_attachment"){this.logger.debug(`Detected repository image - Owner: ${s.owner}, Repo: ${s.repo}, Branch: ${s.branch}, Path: ${s.path}`);let a=await this.getRepositoryImageViaTools(s);return a?.buffer?(this.logger.debug(`Successfully fetched repository image buffer, size: ${a.buffer.length} bytes`),l.imagesResolvedFromGitHubMCPSize.push(a.buffer.length)):this.logger.debug("Failed to fetch repository image buffer"),{imgRef:s,attachment:{size:a?.buffer?.length||0,mimeType:a?.mimeType||"",buffer:a?.buffer||null}}}else return this.logger.debug(`Non-repository image, using getAttachmentFromGuid for: ${s.url}`),{imgRef:s,attachment:await N$I(s.guid,BC(this.settings),this.logger,this.settings)}}),r=await this.getImgRefsSmallerThanMaxSize(c,l,I);return this.logger.debug(`Processed image references, found ${r.length} attachments smaller than max size of ${ah(I)}`),{addedImages:r}}logger;settings;gitHubServerUrl;processedImageUrls;messagesToInsertOnNextPreRequest;githubGetFileContentsTool;constructor(e,I,l){this.logger=e,this.settings=I,this.gitHubServerUrl=I.github?.serverUrl,this.githubGetFileContentsTool=l,this.processedImageUrls=new Set,this.messagesToInsertOnNextPreRequest=[]}toJSON(){return"CAPIImageProcessor"}async onRequestError(e){}async preErrorThrow(e){this.processedImageUrls.size>0&&(e.isVisionFlow=!0)}async postToolExecution(e){let I=e.modelInfo,l=e.toolCall.function.name,n=e.toolResult;if(I?.capabilities?.supports?.vision){let c=Array.from(H$I(n,l));if(c.length===0){let r=await J$I(e.toolCall,this.logger);r&&c.push(r)}this.insertImageUrlMessages(c)}}insertImageUrlMessages(e){this.logger.info(`Inserted ${e.length} image URLs from tools into chat history.`);for(let I of e)this.messagesToInsertOnNextPreRequest.push({role:"user",content:[{type:"text",text:I.isScreenshot?"Here is a screenshot:":"Here is an image:"},{type:"image_url",image_url:{url:I.url}}]})}};function*H$I(t,e){for(let I of t.binaryResultForLlm??[])I.type==="image"&&(yield{url:`data:${I.mimeType};base64,${I.data}`,isScreenshot:e.toLowerCase().includes("screenshot")})}var v$I="playwright-browser_take_screenshot";function C$I(t){return typeof t=="object"&&t!==null&&typeof t.filename=="string"}async function J$I(t,e){if(t.function.name!==v$I)return;e.debug("Adding images using Playwright params fallback strategy");let I=JSON.parse(t.function.arguments);if(C$I(I)){let l=Wz.isAbsolute(I.filename)?I.filename:Wz.join(XZe,I.filename);e.debug(`Image from Playwright params: ${I.filename}. Updated to ${l}.`);let n=await f$I(l,e);if(n){let c=n.buffer.toString("base64");return{url:`data:${n.mimeType};base64,${c}`,isScreenshot:!0}}}}function L$I(t){switch(Wz.extname(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";default:return null}}function N7e(t,e){return e!=="image/png"&&e!=="image/jpeg"?(t.debug(`Unsupported content type: ${e}, only image / png and image / jpeg are supported`),!1):!0}async function f$I(t,e){try{if(!qZe(t))return e.debug(`Image ${t} does not have a valid image extension, skipping read`),null;let I=L$I(t);return I?{buffer:await W$I.readFile(t),mimeType:I}:(e.debug(`Image ${t} is not a mime type supported for file -> data URI flow`),null)}catch(I){return e.error(`Failed to read image from disk: ${I instanceof Error?I.message:String(I)}`),null}}var fv=class t{static DEFAULT_TOKEN_LIMIT=128e3;static DEFAULT_TOKEN_LIMIT_BUFFER=0;static MAX_TOKEN_LIMIT_BUFFER=.5;latestUserPromptMessage;logger;modelToTokenLimit;constructor(e,I){this.latestUserPromptMessage=e,this.logger=I,this.modelToTokenLimit=new Map}toJSON(){return"BasicTruncator"}async*preRequest(e){this.initializeStateForModelOnFirstRequest(e);let I=this.modelToTokenLimit.get(e.modelInfo.name),l=I?.tokenLimit??t.DEFAULT_TOKEN_LIMIT;e.getCompletionWithToolsOptions?.failIfInitialInputsTooLong&&this.throwIfOverTokenLimitOnFirstTurn(e,l);let n=I?.tokenLimitBuffer??t.DEFAULT_TOKEN_LIMIT_BUFFER,c=l*(1-n),r=this.latestUserPromptMessage?nUe(this.latestUserPromptMessage,e.messages):-1,s=[()=>B$I(e.messages,e.toolDefinitions,e.modelInfo.name,c),r===-1?void 0:()=>z$I(e.messages,e.toolDefinitions,e.modelInfo.name,c,r)].filter(G=>G!==void 0),a=0,o;for(;(!o||o.postTruncationTokensInMessages>c)&&a<s.length;){let G=s[a]();o=x$I(o,G),a++}return o=o??U$I(e.messages,e.toolDefinitions,e.modelInfo.name,c),o.tokensRemovedDuringTruncation>0&&this.logger.debug(`BasicTruncator truncated: ${JSON.stringify(o)}`),yield{kind:"history_truncated",turn:e.turn,performedBy:"BasicTruncator",truncateResult:o},o}async preErrorThrow(){}async onRequestError(e){let I=this.modelToTokenLimit.get(e.modelInfo.name);if(I===void 0){this.logger.warning("Unable to determine if error relates to token limits due to missing information.");return}let{tokenLimit:l,tokenLimitBuffer:n}=I,c=k$I(e.error,l);if(c!==void 0){if(c<l)this.modelToTokenLimit.set(e.modelInfo.name,{tokenLimit:c,tokenLimitBuffer:t.DEFAULT_TOKEN_LIMIT_BUFFER}),this.logger.debug(`Adjusted model token limit to ${c}`);else{let r=Math.min(n+t.MAX_TOKEN_LIMIT_BUFFER/e.maxRetries,t.MAX_TOKEN_LIMIT_BUFFER);this.modelToTokenLimit.set(e.modelInfo.name,{tokenLimit:l,tokenLimitBuffer:r}),this.logger.debug(`Adjusted model token limit to ${l}, token limit retry buffer to ${r}`)}return{retryAfter:1}}}getTokenLimitForModel(e){let I=this.modelToTokenLimit.get(e),l=I?I.tokenLimit*(1-I.tokenLimitBuffer):void 0;return{tokenLimit:I?.tokenLimit,tokenLimitBuffer:I?.tokenLimitBuffer,effectiveTokenLimit:l}}initializeStateForModelOnFirstRequest(e){e.turn===0&&e.retry===0&&this.modelToTokenLimit.set(e.modelInfo.name,{tokenLimit:e.modelInfo.capabilities?.limits?.max_prompt_tokens||e.modelInfo.capabilities?.limits?.max_context_window_tokens||t.DEFAULT_TOKEN_LIMIT,tokenLimitBuffer:t.DEFAULT_TOKEN_LIMIT_BUFFER})}throwIfOverTokenLimitOnFirstTurn(e,I){if(e.turn===0){let l=GVe(e.messages,e.modelInfo.name),n=iVe(e.toolDefinitions,e.modelInfo.name);if(l+n>I){if(e.getCompletionWithToolsOptions?.failIfInitialInputsTooLong)throw new Error(`Initial inputs exceed the model token limit of ${I} tokens.`);this.logger.warning(`Initial inputs exceed the model token limit of ${I} tokens. The model may not be able to process the inputs correctly.`)}}}};function k$I(t,e){if(t&&typeof t=="object"){let I="message"in t&&typeof t.message=="string"?t.message.match(/prompt token count of (\d+) exceeds the limit of (\d+)/):null;if(I){let r=parseInt(I[2],10);return isNaN(r)?e:r}if("code"in t&&t.code==="model_max_prompt_tokens_exceeded")return e;let n=[JSON.stringify(t)];t instanceof Error&&(n.push(t.message),t.cause instanceof Error?n.push(t.cause.message):t.cause&&n.push(JSON.stringify(t.cause)));let c="Input length and `max_tokens` exceed context limit";if(n.some(r=>r.includes(c)))return e}}function x$I(t,e){return t?{preTruncationMessagesLength:t.preTruncationMessagesLength,preTruncationTokensInMessages:t.preTruncationTokensInMessages,tokensRemovedDuringTruncation:t.tokensRemovedDuringTruncation+e.tokensRemovedDuringTruncation,messagesRemovedDuringTruncation:t.messagesRemovedDuringTruncation+e.messagesRemovedDuringTruncation,tokenLimit:t.tokenLimit,postTruncationMessagesLength:e.postTruncationMessagesLength,postTruncationTokensInMessages:e.postTruncationTokensInMessages}:e}var Y7e=.95;function B$I(t,e,I,l,n){let c=t.length;if(c===0)return{tokenLimit:l,preTruncationTokensInMessages:0,preTruncationMessagesLength:c,postTruncationTokensInMessages:0,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let r=t.map(b=>pA(b,I)),s=Gb(JSON.stringify(e),I),a=l*Y7e,o=r.reduce((b,m)=>b+m,0)+s;if(o<=a)return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let G=new Set,i=0,d=Math.min(n??t.length,t.length);for(let b=0;b<d;b++){let m=t[b];if(m.role!=="system"&&m.role!=="tool"&&m.role!=="user"){if(m.role==="assistant"){let h=m.tool_calls||[],u=h.filter(SG).filter(y=>y.function.name===MJ),Z=h.filter(SG).filter(y=>y.function.name!==MJ),N=u.length===0,g=new Set(Z.map(y=>y.id));if(Z.length>0&&(m.tool_calls=u,r[b]=pA(m,I)),N&&(G.add(b),i+=r[b]),g.size>0)for(let y=b+1;y<t.length;y++){let A=t[y];if(A.role==="tool"&&g.has(A.tool_call_id)&&(G.add(y),i+=r[y],g.delete(A.tool_call_id),g.size===0))break}}if(o-i<a)break}}for(let b=t.length-1;b>=0;b--)G.has(b)&&t.splice(b,1);return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o-i,postTruncationMessagesLength:t.length,tokensRemovedDuringTruncation:i,messagesRemovedDuringTruncation:c-t.length}}function z$I(t,e,I,l,n){let c=t.length;if(c===0)return{tokenLimit:l,preTruncationTokensInMessages:0,preTruncationMessagesLength:c,postTruncationTokensInMessages:0,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let r=t.map(b=>pA(b,I)),s=Gb(JSON.stringify(e),I),a=l*Y7e,o=r.reduce((b,m)=>b+m,0)+s;if(o<=a)return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let G=new Set,i=0,d=Math.min(n??t.length,t.length);for(let b=0;b<d;b++){let m=t[b];if(m.role!=="system"&&m.role!=="tool"){if(m.role==="user")G.add(b),i+=r[b];else if(m.role==="assistant"){let h=m.tool_calls||[],u=new Set(h.map(Z=>Z.id));if(G.add(b),i+=r[b],u.size>0)for(let Z=b+1;Z<t.length;Z++){let N=t[Z];if(N.role==="tool"&&u.has(N.tool_call_id)&&(G.add(Z),i+=r[Z],u.delete(N.tool_call_id),u.size===0))break}}if(o-i<a)break}}for(let b=t.length-1;b>=0;b--)G.has(b)&&t.splice(b,1);return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o-i,postTruncationMessagesLength:t.length,tokensRemovedDuringTruncation:i,messagesRemovedDuringTruncation:c-t.length}}function U$I(t,e,I,l){let n=t.length;if(n===0)return{tokenLimit:l,preTruncationTokensInMessages:0,preTruncationMessagesLength:n,postTruncationTokensInMessages:0,postTruncationMessagesLength:n,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let c=t.map(a=>pA(a,I)),r=Gb(JSON.stringify(e),I),s=c.reduce((a,o)=>a+o,0)+r;return{tokenLimit:l,preTruncationTokensInMessages:s,preTruncationMessagesLength:n,postTruncationTokensInMessages:s,postTruncationMessagesLength:n,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0}}var Vm=class extends mu{constructor(){super()}debug(e){}log(e){}info(e){}notice(e){}warning(e){}error(e){}startGroup(e,I){}endGroup(e){}};var V7e={fetch:{tools:[{toolName:"fetch"}]},time:{tools:[{toolName:"get_current_time"},{toolName:"convert_time"}]},sequentialthinking:{tools:[{toolName:"sequentialthinking"}]},"github-mcp-server":{tools:[{toolName:"get_code_scanning_alert"},{toolName:"get_commit"},{toolName:"get_file_contents"},{toolName:"get_issue"},{toolName:"get_issue_comments"},{toolName:"get_me"},{toolName:"get_copilot_space"},{toolName:"get_pull_request"},{toolName:"get_pull_request_comments"},{toolName:"get_pull_request_files"},{toolName:"get_pull_request_reviews"},{toolName:"get_pull_request_status"},{toolName:"get_secret_scanning_alert"},{toolName:"get_tag"},{toolName:"list_branches"},{toolName:"list_code_scanning_alerts"},{toolName:"list_commits"},{toolName:"list_issues"},{toolName:"list_pull_requests"},{toolName:"list_secret_scanning_alerts"},{toolName:"list_tags"},{toolName:"search_code"},{toolName:"search_issues"},{toolName:"search_repositories"},{toolName:"search_users"},{toolName:"get_job_logs"},{toolName:"get_workflow_run"},{toolName:"get_workflow_run_logs"},{toolName:"list_workflow_jobs"},{toolName:"list_workflow_runs"},{toolName:"list_workflow_run_artifacts"},{toolName:"list_workflows"},{toolName:"summarize_job_log_failures"}]},playwright:{tools:[{toolName:"browser_close"},{toolName:"browser_resize"},{toolName:"browser_console_messages"},{toolName:"browser_handle_dialog"},{toolName:"browser_file_upload"},{toolName:"browser_install"},{toolName:"browser_press_key"},{toolName:"browser_navigate"},{toolName:"browser_navigate_back"},{toolName:"browser_navigate_forward"},{toolName:"browser_network_requests"},{toolName:"browser_pdf_save"},{toolName:"browser_take_screenshot"},{toolName:"browser_snapshot"},{toolName:"browser_click"},{toolName:"browser_drag"},{toolName:"browser_hover"},{toolName:"browser_type"},{toolName:"browser_select_option"},{toolName:"browser_tab_list"},{toolName:"browser_tab_new"},{toolName:"browser_tab_select"},{toolName:"browser_tab_close"},{toolName:"browser_generate_playwright_test"},{toolName:"browser_wait_for"}]},primer:{tools:[{toolName:"init"},{toolName:"list_components"},{toolName:"get_component"},{toolName:"get_component_examples"},{toolName:"get_component_usage_guidelines"},{toolName:"get_component_accessibility_guidelines"},{toolName:"list_patterns"},{toolName:"get_pattern"},{toolName:"list_tokens"},{toolName:"get_color_usage"},{toolName:"get_typography_usage"},{toolName:"list_icons"},{toolName:"get_icon"},{toolName:"review_alt_text"}]},azure:"azure-mcp-server","azure-azmcp":"azure-mcp-server","azure-mcp-server-azmcp":"azure-mcp-server","azure-mcp-server":{tools:[{toolName:"aks"},{toolName:"appconfig"},{toolName:"azureterraformbestpractices"},{toolName:"bestpractices"},{toolName:"bicepschema"},{toolName:"cosmos"},{toolName:"datadog"},{toolName:"documentation"},{toolName:"extension_az"},{toolName:"extension_azd"},{toolName:"extension_azqr"},{toolName:"foundry"},{toolName:"grafana"},{toolName:"group"},{toolName:"keyvault"},{toolName:"kusto"},{toolName:"loadtesting"},{toolName:"marketplace"},{toolName:"monitor"},{toolName:"postgres"},{toolName:"redis"},{toolName:"role"},{toolName:"search"},{toolName:"servicebus"},{toolName:"sql"},{toolName:"storage"},{toolName:"subscription"},{toolName:"workbooks"}]}};function z7(t,e,I){let l=(I||V7e)[t.toLowerCase()],n=new Set;for(;typeof l=="string";){if(n.has(l))return!1;n.add(l),l=V7e[l]}if(!l)return!1;let c=e.toLowerCase();return l.tools.some(r=>r.toolName===c)}var S$I="image";var O$I="resource",M$I=180*1e3,T$I={timeout:M$I};var $Ze=class{constructor(e,I,l){this.settings=e;this.logger=I;this.cacheProviderTools=l}cachedTools=new Map;async invokeTool(e,I,l="hidden_characters"){let n=await this.doInvokeTool(e,I);return this.invokeToolResponseToToolResult(n,l)}invokeToolResponseToToolResult(e,I){let l=e.content||[],n="",c=[];for(let o of l)if(o.type==="text")n+=o.text||"";else if(o.type==="resource"){let G=o.resource;G&&G.blob?c.push({type:O$I,data:G.blob,mimeType:G.mimeType||"application/octet-stream"}):G&&G.text&&(n+=G.text)}else o.type==="image"&&c.push({type:S$I,data:o.data,mimeType:o.mimeType});let r=n;if(n==="")this.logger.debug("Tool invocation result is empty or undefined, skipping content filtering."),r=n;else try{let o=JSON.parse(n),G=Aue(o,I);r=JSON.stringify(G)}catch(o){this.logger.debug(`Unable to parse tool invocation as JSON. Treating it as a string for filtering: ${o}`),r=gue(n,I)}this.logger.debug(`Tool invocation result: ${r}`);let s={},a=r?ac(r,"output"):"";return e.isToolError?{textResultForLlm:r,resultType:"failure",error:r,sessionLog:a,toolTelemetry:s}:{textResultForLlm:r,binaryResultForLlm:c,resultType:"success",sessionLog:a,toolTelemetry:s}}async loadTools(e,I={requestRequired:!1}){let l=this.getProviderCacheKey(e),n=this.cachedTools.get(l),c=n??await this.loadToolsFromProvider(e);this.cacheProviderTools&&!n&&this.cachedTools.set(l,c);let r={};for(let[s,a]of Object.entries(c)){let o=a.filterMode||"hidden_characters";r[s]={name:a.name,namespacedName:a.namespacedName,title:a.title||a.name,description:a.description,input_schema:a.input_schema,callback:async G=>{let i=c[s].serverName,d=c[s].name,b=c[s].title;if(!I.requestRequired)return this.invokeTool(s,G,o);let m=await I.request({kind:"mcp",serverName:i,toolName:d,toolTitle:b,args:G,readOnly:!!a.readOnly});switch(m.kind){case"approved":return this.invokeTool(s,G,o);case"denied-by-rules":return Rj(m.rules);case"denied-no-approval-rule-and-could-not-request-from-user":return yj;case"denied-interactively-by-user":return Vj;default:vm(m,`Unhandled permission result kind: ${m}`)}},safeForTelemetry:a.safeForTelemetry}}return Object.values(r)}};var Vz=class t extends $Ze{toolIdToClientInfo=new Map;constructor(e,I,l=!1){super(e,I,l)}async doInvokeTool(e,I){let l=this.toolIdToClientInfo.get(e);if(!l)throw new Error(`No MCP client found for tool ID: ${e}`);let n=l.mcpClient,c=t.getToolNameFromIdAndClientName(e,l.clientName),r=await n.callTool({name:c,arguments:I},void 0,{...T$I,onprogress:s=>{this.logger.info(`Tool ${e} progress: ${JSON.stringify(s)}`)},resetTimeoutOnProgress:!0});if(!Array.isArray(r.content))throw new Error("Expected array of results");return{content:r.content,isToolError:r.error!==void 0&&r.error!==null||r.isError===!0}}getProviderCacheKey(e){return[e.clientName,...e.tools,JSON.stringify(e.filterMapping)].join("+")}async loadToolsFromProvider(e){let I={};this.logger.debug(`Loading tools for client: ${e.clientName}`);for(let l of(await e.mcpClient.listTools()).tools){if(!e.tools.includes("*")&&!e.tools.includes(l.name)){this.logger.debug(`Skipping tool ${l.name} for client ${e.clientName}`);continue}let n=t.getToolIdFromClientAndToolName(e.clientName,l.name);this.toolIdToClientInfo.set(n,e);let c;e.safeForTelemetry===!0?c={name:!0,inputsNames:!0}:e.safeForTelemetry&&typeof e.safeForTelemetry=="object"?c=e.safeForTelemetry:c={name:z7(e.clientName,l.name),inputsNames:!1},this.logger.debug(`Adding tool: ${n}`);let r;e.filterMapping===void 0?r="hidden_characters":typeof e.filterMapping=="object"?r=e.filterMapping[l.name]||"hidden_characters":r=e.filterMapping,I[n]={serverName:e.clientName,name:n,namespacedName:`${e.clientName}/${l.name}`,title:l.title||l.annotations?.title||l.name,description:l.description||"",input_schema:l.inputSchema,readOnly:l.annotations?.readOnlyHint,safeForTelemetry:c,filterMode:r}}return I}static getToolIdFromClientAndToolName(e,I){return`${e}-${I}`}static getToolNameFromIdAndClientName(e,I){return e.substring(I.length+1)}};var U7=class{settings;logger;gitHandler;location;commitPriorToCompletionWithTools;jitInstructions;emittedJitInstructions;constructor(e,I,l,n,c,r){this.settings=e,this.logger=I,this.gitHandler=l,this.location=n,this.commitPriorToCompletionWithTools=c,this.jitInstructions=r||{},this.emittedJitInstructions=new Set}toJSON(){return"JitInstructionsProcessor"}async*preRequest(e){if(this.jitInstructions&&Object.keys(this.jitInstructions).length>0){let I,l=async()=>{if(I===void 0)try{I=(await this.gitHandler.getChangedPaths(this.location,"HEAD",this.commitPriorToCompletionWithTools)).length}catch(s){this.logger.error(`Failed to get changed paths, err: ${s}`),I=1}return I},n=[];for(let[s,a]of Object.entries(this.jitInstructions)){let o=IVe(this.settings,a.percentRemainingOfTimeout);o.isWithin&&n.push({config:a,withinMs:o.withinMs})}let c=n.map(({config:s,withinMs:a})=>{let o=typeof s.instruction=="function"?s.instruction(this.location):s.instruction;return{config:s,withinMs:a,instruction:o}}).filter(({instruction:s})=>!this.emittedJitInstructions.has(s)),r;for(let{config:s,withinMs:a,instruction:o}of c)(s.whenNoPathsChanged?await l()===0:!0)&&(!r||a<r.withinMs)&&(r={withinMs:a,instruction:o});if(r){this.logger.debug(`Adding JIT instructions to the history: ${r.instruction}`),this.emittedJitInstructions.add(r.instruction);let s={role:"user",content:r.instruction};e.messages.push(s),yield{kind:"message",turn:e.turn,callId:e.callId,message:s,source:"jit-instruction"}}}}},IWe={remindWhereToDoWork:{instruction:Cqe,percentRemainingOfTimeout:1/2,whenNoPathsChanged:!0},completeAsSoonAsPossible:{instruction:F7.completeAsSoonAsPossible,percentRemainingOfTimeout:1/6},commitNow:{instruction:F7.commitNow,percentRemainingOfTimeout:2/15},finalAnswerNeeded:{instruction:F7.finalAnswerNeeded,percentRemainingOfTimeout:1/10}};var Rz=class{logger;forcePremiumRequest=!1;constructor(e){this.logger=e}async*preRequest(e){e.turn===0||this.forcePremiumRequest?(e.additionalRequestHeaders["X-Initiator"]="user",this.logger.debug("InitiatorHeaderProcessor: Setting X-Initiator to 'user'")):(e.additionalRequestHeaders["X-Initiator"]="agent",this.logger.debug("InitiatorHeaderProcessor: Setting X-Initiator to 'agent'")),this.resetPremiumRequest(),yield*[]}setForcePremiumRequest(){this.forcePremiumRequest=!0}toJSON(){return JSON.stringify({type:"InitiatorHeaderProcessor"})}resetPremiumRequest(){this.forcePremiumRequest=!1}},yz=class{logger;constructor(e){this.logger=e}async*preRequest(e){e.additionalRequestHeaders["X-Initiator"]="agent",this.logger.debug("FreeRequestProcessor: Setting X-Initiator to 'agent'"),yield*[]}setForcePremiumRequest(){}toJSON(){return JSON.stringify({type:"FreeRequestProcessor"})}};function S7(t){return t.kind==="message"&&t.message.role==="assistant"}function R7e(t){return t.kind==="message"&&t.message.role==="user"}function y7e(t){return t.kind==="message"&&t.message.role==="assistant"&&!!t.message.tool_calls}function g7e(t){return t.kind==="message"&&t.message.role==="tool"}function j$I(t,e){return t.toolCalls.find(I=>I.toolCallId===e)}function D$I(t,e,I){let l=I.function.name;try{let n=JSON.parse(I.function.arguments||"{}"),c=e.find(o=>o.name===l),r=c?.safeForTelemetry||{name:!1,inputsNames:!1},s=zX(c),a;if(s&&t.customAgents&&t.settings){let o=t.customAgents.find(G=>G.name===l);if(o){let G=t.settings.github?.repo?.name??"",i=G.split("/"),d=i.length===2?i[0]:"",b=i.length===2?i[1]:G,m=o.mcpServers?Object.keys(o.mcpServers).join(","):"",h=o.mcpServers?Object.keys(o.mcpServers).length:0;a={repoOwner:d,repoName:b,displayName:o.name,mcpServerNames:m,mcpServerCount:h}}}return{toolCallId:I.id,toolName:l,arguments:I.function.arguments,safeForTelemetryToolName:r===!0||r.name?l:sy(l),safeForTelemetryArguments:r===!0||r.inputsNames?IUe(n):"",isCustomAgent:s,customAgentInfo:a}}catch{return{toolCallId:I.id,toolName:l,arguments:I.function.arguments,safeForTelemetryToolName:sy(l),safeForTelemetryArguments:"",isCustomAgent:!1,customAgentInfo:void 0}}}var O7=class{constructor(e,I,l){this.runtimeContext=e;this.forAgent=I;this.toolsInUse=l}turnDataCache=new Map;emittedTurns=new Set;getTurnData(){return this.turnDataCache}async ingestEvent(e){let I,l;if("turn"in e&&typeof e.turn=="number"){if(I=e.turn+1,this.emittedTurns.has(I))return;this.turnDataCache.has(I)||this.turnDataCache.set(I,{featureFlagsAsString:see(this.runtimeContext.settings),toolCalls:[],toolCallExecutions:[],turn:I}),l=this.turnDataCache.get(I)}else return;e.kind==="tool_execution"?await this.ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(l,e):e.kind==="turn_started"||e.kind==="turn_failed"||e.kind==="turn_retry"||e.kind==="turn_ended"?(l={...l,model:e.model,modelInfo:JSON.stringify(e.modelInfo)},e.kind==="turn_started"?l={...l,startTimeMs:e.timestampMs}:e.kind==="turn_retry"?l={...l,endTimeMs:e.timestampMs,retriesUsed:(l.retriesUsed??0)+1}:e.kind==="turn_failed"?l={...l,endTimeMs:e.timestampMs,error:e.error}:e.kind==="turn_ended"&&(l={...l,endTimeMs:e.timestampMs})):e.kind==="history_truncated"?l={...l,truncateEvent:e}:e.kind==="image_processing"?l={...l,imageProcessingMetrics:e.imageProcessingMetrics}:e.kind==="images_removed"?l={...l,largeImagesRemoved:(l.largeImagesRemoved??0)+(e.largeImagesRemoved?1:0),imagesRemoved:(l.imagesRemoved??0)+(e.imagesRemoved?1:0)}:e.kind==="model_call_success"||e.kind==="model_call_failure"?(l={...l,callId:e.callId,modelCallDurationMs:e.modelCallDurationMs,api_call_id:e.modelCall.api_id,provider_call_id:e.modelCall.request_id,conversationStructureSummary:tUe(e.requestMessages)},e.kind==="model_call_success"&&(l={...l,responsePromptTokens:e.responseUsage?.prompt_tokens,responseCompletionTokens:e.responseUsage?.completion_tokens,responseTotalTokens:e.responseUsage?.total_tokens})):R7e(e)&&e.source==="jit-instruction"?l={...l,jitInstructionsAdded:(l?.jitInstructionsAdded??0)+1}:S7(e)&&e.message.tool_calls?l={...l,toolCalls:l.toolCalls.concat(e.message.tool_calls.map(n=>({...D$I(this.runtimeContext,this.toolsInUse,n)})))}:g7e(e)&&(l={...l,toolCallExecutions:l.toolCallExecutions.concat([e.message.tool_call_id])}),this.turnDataCache.set(I,l),e.kind==="turn_ended"&&(await this.emitTurnTelemetry(I),this.emittedTurns.add(I),this.turnDataCache.delete(I))}async emitTurnTelemetry(e){let I=this.turnDataCache.get(e);if(I){let l={kind:"telemetry",telemetry:{event:"get_completion_with_tools_turn",properties:{callId:I.callId,model:I.model||"default",modelInfo:I.modelInfo||"{}",api_call_id:I.api_call_id,provider_call_id:I.provider_call_id,agent:this.forAgent,toolCalls:JSON.stringify(I.toolCalls.map(n=>({toolCallId:n.toolCallId,toolName:n.safeForTelemetryToolName}))),toolCallExecutions:JSON.stringify(I.toolCallExecutions),error:I.error,featureFlags:see(this.runtimeContext.settings),conversationStructureSummary:I.conversationStructureSummary,truncationPerformedBy:I.truncateEvent?.performedBy},metrics:{turn:e,turnDurationMs:I.endTimeMs!==void 0&&I.startTimeMs!==void 0?I.endTimeMs-I.startTimeMs:0,modelCallDurationMs:I.modelCallDurationMs,retriesUsed:I.retriesUsed??0,numToolCalls:I.toolCalls.length,numToolExecutions:I.toolCallExecutions.length,largeImagesRemoved:I.largeImagesRemoved,imagesRemoved:I.imagesRemoved,responsePromptTokens:I.responsePromptTokens,responseCompletionTokens:I.responseCompletionTokens,responseTotalTokens:I.responseTotalTokens,jitInstructionsAdded:I.jitInstructionsAdded,...I.truncateEvent?.truncateResult,...I.imageProcessingMetrics},restrictedProperties:{}}};await this.runtimeContext.callback?.progress(l)}}async ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(e,I){let l=I.toolCallId,n=j$I(e,l);if(n){let c=I.toolResult,r={kind:"telemetry",telemetry:{event:"tool_call_executed",properties:{...c.toolTelemetry.properties,completionWithToolsCallId:I.callId,resultType:c.resultType,toolCallId:l,arguments:n.safeForTelemetryArguments,toolName:n.safeForTelemetryToolName,api_call_id:e.api_call_id,isCustomAgent:n.isCustomAgent?"true":"false"},restrictedProperties:{...c.toolTelemetry.restrictedProperties,arguments:n.arguments,result:c.textResultForLlm,toolName:n.toolName,error:c.error,customAgent:n.customAgentInfo?JSON.stringify({repoOwner:n.customAgentInfo.repoOwner,repoName:n.customAgentInfo.repoName,displayName:n.customAgentInfo.displayName,mcpServerNames:n.customAgentInfo.mcpServerNames}):void 0},metrics:{...c.toolTelemetry.metrics,durationMs:I.durationMs,customAgentMcpServerCount:n.customAgentInfo?.mcpServerCount}}};await this.runtimeContext.callback?.progress(r)}}};var gz=class{async*preRequest(e){yield*[]}handleCallbackResponse(e){}getUserMessages(){return[]}clearUserMessages(){}canProcessUserMessages(){return!1}toJSON(){return JSON.stringify({type:"NoopUserMessageProcessor"})}};var K$I=void 0,M7=class{constructor(e,I=K$I){this.runtimeContext=e;this.agentId=I;this.gitHandlers={silent:new Lo(new Vm,this.runtimeContext.exec),logging:new Lo(this.runtimeContext.logger,this.runtimeContext.exec)}}gitHandlers;async agent(e,I,l,n,c,r,s,a=new gz,o){let G=async(m,h,u)=>{let Z={role:"user",content:m};return await this.runtimeContext.callback?.progress({kind:"message",turn:0,callId:this.agentId,message:Z}),await this.runCompletionWithTools(e,I,[...h??[],Z],r,s,c,{executeToolsInParallel:Ql(this.runtimeContext.settings,"copilot_swe_agent_parallel_tool_execution"),initialTurnCount:u},o,a)},i=n,d=l??[],b;for(;i;){let m=await G(i,d,b);b=m.finalTurnCount,d=m.messages,i=await o?.onResult(m.postCompletionWithToolsCommitHash)}for(let m of r)if(m.shutdown){let h=await m.shutdown();h&&await this.runtimeContext.callback?.progress(h)}return{finalTurnCount:b||0,messages:d}}async runCompletionWithTools(e,I,l,n,c,r,s,a,o=new gz){let G=this.runtimeContext.callback?new O7(this.runtimeContext,"sweagent-capi",n):void 0,i=this.gitHandlers.logging,d=await i.getCurrentCommitHash(e),b=l.filter(y=>y.role==="user").at(-1),m=this.createCompletionWithToolsProcessors(e,d,n,c,o,r,a,b),h=this.runtimeContext.client.getCompletionWithTools(I,l,n,{...s,callId:this.agentId,processors:m}),u=0,Z=[...l],N=[];for await(let y of h){if(Ql(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")){let A=await this.runtimeContext.callback?.progress(y,{accepts_user_messages:o.canProcessUserMessages()});o.handleCallbackResponse(A)}else await this.runtimeContext.callback?.progress(y);G&&await G.ingestEvent(y),(y.kind==="message"||y.kind==="response")&&(y.kind==="message"&&Z.push(y.message),y.kind==="response"&&N.push(y.response),u=Math.max(u,y.turn??0))}let g=await i.getCurrentCommitHash(e);return{finalTurnCount:u,messages:Z,resultMessages:N,preCompletionWithToolsCommitHash:d,postCompletionWithToolsCommitHash:g}}createCompletionWithToolsProcessors(e,I,l,n,c,r,s,a){let o=new B7(this.runtimeContext.logger,this.runtimeContext.settings,l.find(b=>b.name==="github-mcp-server-get_file_contents")),G=new U7(this.runtimeContext.settings,this.runtimeContext.logger,this.gitHandlers.silent,e,I,r),i=new fv(a,this.runtimeContext.logger),d=[G,o,i];return Ql(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")&&d.push(c),d.push(n),{preRequest:d.filter(b=>b!==void 0),preToolsExecution:[s].filter(b=>b!==void 0),postToolExecution:[o,s].filter(b=>b!==void 0),onRequestError:[o,i].filter(b=>b!==void 0)}}};async function tWe(t,e,I,l,n){try{return(await l.invokeTool("blackbird-mcp-server/search_repository_with_agent",{task:t,depth:2,owner:e,repo:I,numSnippets:10},"hidden_characters")).textResultForLlm}catch(c){return n.error(`Error during Blackbird search: ${c}`),""}}var A7e=t=>Ql(t,"copilot_swe_agent_search")||eVe(t,"SearchAgentExperiment")==="enabled",F7e="search";function lWe(t){return t!==null&&typeof t=="object"&&"question"in t&&"reason"in t&&"searchCommand"in t}var P$I=(t,e,I)=>`
1371
+ </reminder>`),l.trim()},F7={completeAsSoonAsPossible:"You will soon run out of iterations. Begin making your final code changes. Complete any code changes that are still pending instead of performing validations.",commitNow:"You are imminently out of iterations. Call **report_progress** detailing your current progress. After doing so, provide a final answer as soon as possible.",finalAnswerNeeded:"You have reached the maximum number of iterations. Consider your work completed. I no longer need more changes. Please provide a final answer."},Cqe=t=>`<reminder>You haven't committed any changes yet. Any code changes not meant to be temporary must be made in ${iZe(t)}. Commit changes by using the **report_progress** tool.</reminder>`;var XZe="/tmp/playwright-logs",Y8I="0.0.40",EZe=[`@playwright/mcp@${Y8I}`,"--viewport-size","1280, 720","--output-dir",XZe],QBl=[...EZe,"--isolated"];var DZe=class t extends Error{constructor(e){super(e),this.name="ImageSizeError",Object.setPrototypeOf(this,t.prototype)}},k7;async function W7e(){if(k7)return k7;try{return k7=(await Promise.resolve().then(()=>vl(u7e(),1))).default,k7}catch{}}var Zz=2e3;async function N$I(t,e,I,l){let n={"Content-Type":"application/octet-stream",Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",Authorization:"Bearer "+e},c=`${BVe(l)}/${t}`;I.info(`Downloading image from ${c}`);try{let r=await fetch(c,{method:"GET",headers:n});if(I.info(`Response status: ${r.status} ${r.statusText}`),I.debug(`Download Response URL: ${r.url}`),!r.ok){I.info(`Failed to download image, status: ${r.status}, statusText: ${r.statusText}`);try{let d=await r.text();I.info(`Error response body: ${d}`)}catch(d){I.info(`Could not read error response body: ${d}`)}return{size:0}}let a=(await r.json()).url;if(!a)return I.error(`No asset URL found in response for image GUID: ${t}`),{size:0};let o=await fetch(a,{method:"GET"});if(!o.ok)return I.error(`Failed to download image: ${o.status} ${o.statusText}`),{size:0};let G=await o.arrayBuffer(),i=G.byteLength;return I.info(`Downloaded content size: ${ah(i)}`),{size:i,buffer:Buffer.from(G),mimeType:o.headers.get("content-type")||void 0}}catch(r){return I.error("Network error downloading image"),r instanceof Error&&(I.info(`Error message: ${r.message}`),I.info(`Error stack: ${r.stack}`)),{size:0}}}function KZe(t,e,I,l){let n=/<img\b[^>]*\bsrc="([^"]+)"[^>]*>/g,c=/!\[.*?\]\((.*?)\)/g,r=[];return r.push(...Z7e(t,e,n,I,l)),r.push(...Z7e(t,e,c,I,l)),r}function Z7e(t,e,I,l,n){let c=t.matchAll(I),r=[],s=/\/([a-f0-9-]+)$/;for(let a of c){let o=y$I(a[1],e),G=g$I(a[1],e,n);if(o||G){let i=a[1].match(s),d={url:a[1],guid:"",kind:G?"legacy_attachment":"attachment"};i&&i.length>1&&(d.guid=i[1]),r.push(d)}else if(l){let i={url:a[1],guid:"",kind:"committed_attachment"};r.push(i)}}return r}function Y$I(t){return!t.startsWith("http://")&&!t.startsWith("https://")&&qZe(t)}function qZe(t){return/\.(png|jpe?g|gif|svg|webp|bmp|tiff?|ico|heic|avif)$/i.test(t)}function V$I(t){try{let e=/Here are relevant code snippets from the repository that might help with this task:\s*(\[[\s\S]*?\])(?=\n|$)/,I=t.match(e);if(!I?.[1]||I[1].length<=1)return null;let l=I[1].trim();return JSON.parse(l)}catch{return null}}function R$I(t,e,I){if(!t?.url||!t?.ref||!t?.path)throw new Error("Invalid repository insight: missing required fields");if(!e||e.trim()==="")throw new Error("Invalid image path: path cannot be empty");let l=t.url.split("/").slice(3,5).join("/"),n=t.ref.split("/")[2],c;if(e.startsWith("/"))c=e.slice(1);else{let s=t.path,a=Wz.dirname(s);c=Wz.resolve("/",a,e).slice(1)}return`${I}/${l}/blob/${n}/${c}`}function y$I(t,e){return e?!!t.startsWith(`${e}/user-attachments/assets`):!1}function g$I(t,e,I){return e&&new RegExp(`^${e}/[\\w.-]+/[\\w.-]+/assets/\\d+/[^.]+$`).test(t)?(I.debug(`Legacy GitHub asset URL detected: ${t}`),!0):!1}async function _Ze(t){let{width:e,height:I}=Q6e(t);if(e===void 0||I===void 0)throw new Error("Unable to determine image dimensions.");return{width:e,height:I}}async function x7(t,e,I,l,n,c){t.debug(`Checking if image is valid size and dimensions. Max size: ${I}, Max dimension: ${l}`);let{exceedsSizeLimit:r,exceedsDimensionLimit:s}=await Nz(I,l,c);if(!s&&!r)return t.debug("Image is within size and dimension limits."),c;if(s){t.debug(`Image x or y dimension exceeds the maximum limit of ${l}, attempting to resize`);let[a,o]=await Q$I(t,c,l,I,n);if(!a){t.debug("Failed to resize image to fit within the maximum dimensions limits, skipping"),e.imagesRemovedDueToDimensions++,e.imagesFailedToResize++,o==="unsupported_mime_type"?e.resizeErrorsUnsupportedMimeType++:e.resizeErrorsUnknown++;return}let{exceedsDimensionLimit:G}=await Nz(I,l,a);if(G){e.imagesRemovedDueToDimensions++,t.debug("Image dimensions exceed the maximum dimensions limits, skipping");return}return e.imagesResized++,t.debug("Image resized successfully."),a}if(r){t.debug(`Image size ${ah(c.length)} is larger than the maximum size of ${ah(I)}, attempting to reduce image quality`);let a=await w$I(t,c,l,I,n);if(!a){t.debug("Failed to reduce image quality to fit within the maximum size, skipping"),e.imagesFailedToReduceQuality++,e.imagesRemovedDueToSize++;return}return e.imagesWithLoweredQuality++,t.debug("Image quality successfully reduced."),a}}async function Nz(t,e,I){let l=await _Ze(I),n=I.length;return!l.width||!l.height?{exceedsSizeLimit:n>t,exceedsDimensionLimit:!1}:{exceedsSizeLimit:await A$I(t,I),exceedsDimensionLimit:await F$I(e,I)}}async function F$I(t,e){let I=await _Ze(e);return!I.width||!I.height?!1:I.width>t||I.height>t}async function A$I(t,e){return e.length>t}async function Q$I(t,e,I,l,n){try{if(!N7e(t,n))return[void 0,"unsupported_mime_type"];let c=await _Ze(e);if(!c.width||!c.height)return t.error("Failed to determine size of uploaded image"),[void 0,"determine_dimensions_failed"];let r=async(u,Z)=>{let N=await W7e();if(!N)return;let g=N(e).resize(u,Z,{fit:"inside",withoutEnlargement:!0});return PZe(t,await g.toBuffer(),void 0,n)},s=Math.min(I,c.width),a=Math.min(I,c.height),o=await r(s,a);if(o&&o.length<=l)return[o,void 0];let G=Math.max(s,a),i=1,d=G-1,b,m=0,h=10;for(;i<=d&&m<h;){let u=Math.floor((i+d)/2),Z=await r(u,u);if(!Z)break;let{exceedsSizeLimit:N,exceedsDimensionLimit:g}=await Nz(l,I,Z);!N&&!g?(b=Z,i=u+1):d=u-1,m++}return[b,void 0]}catch(c){return t.error(`Failed to resize image for upload: ${c instanceof Error?c.message:String(c)}`),[void 0,"unknown"]}}async function w$I(t,e,I,l,n){try{let c=n==="image/png"?80:100,r=n==="image/png"?Math.floor(c*.4):20,s=await PZe(t,e,r,n);if(!s||s.length>l)return;let a=r,o=c,G,i=0,d=10,b=a,m=o-1;for(;b<=m&&i<d;){let h=Math.floor((b+m)/2),u=await PZe(t,e,h,n);if(!u)return G;let{exceedsSizeLimit:Z,exceedsDimensionLimit:N}=await Nz(l,I,u);!Z&&!N?(G=u,b=h+1):m=h-1,i++}return G}catch(c){t.error(`Failed to reduce image quality: ${c instanceof Error?c.message:String(c)}`);return}}async function PZe(t,e,I,l){let n=await W7e();if(!n)return;let c=n(e);switch(l){case"image/png":return I?c.png({quality:I}).toBuffer():c.png().toBuffer();case"image/jpeg":return I?c.jpeg({quality:I}).toBuffer():c.jpeg().toBuffer();default:t.debug(`Unsupported image format: ${l}`);return}}var Yz=class{imagesRemovedDueToSize=0;imagesRemovedDueToDimensions=0;imagesResized=0;imagesWithLoweredQuality=0;imagesFailedToResize=0;imagesFailedToReduceQuality=0;base64ImagesSize=[];resizedBase64ImagesSize=[];extractedImagesSize=[];imagesResolvedFromGitHubMCPSize=[];resizeErrorsUnsupportedMimeType=0;resizeErrorsUnknown=0};function X$I(t,e,I,l){if(e<=0)return[];let n=[];for(let c of t){if(c.role!=="user"||n.length>=e)continue;let r=typeof c.content=="string"?c.content:JSON.stringify(c.content),s=V$I(r);if(s)for(let a in s){if(n.length>=e)break;let o=s[a].contents,G=KZe(o,I,!0,l);for(let i of G){if(n.length>=e)break;let d=i.url,b="",m=!1;if(i.kind==="attachment"||i.kind==="legacy_attachment"?n.push(i):Y$I(d)?(m=!0,b=R$I(s[a],d,I),n.push({url:b,guid:i.guid,kind:"committed_attachment"})):qZe(d)&&d.startsWith(I)&&(m=!0,n.push({...i,kind:"committed_attachment"})),m){let h=n[n.length-1],u=new RegExp(`^${I}/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$`),Z=h.url.match(u);if(l.info(`Blob match for ${h.url}: ${JSON.stringify(Z)}`),Z&&Z.length===5){let[,N,g,y,A]=Z;h.owner=N,h.repo=g,h.branch=y,h.path=A,l.info(`Repository metadata extracted: owner=${N}, repo=${g}, branch=${y}, path=${A}`)}else l.info(`Failed to extract repository metadata from URL: ${h.url}`)}}}}return n}function E$I(t,e){let I=e.flatMap(n=>J0(n)?n.content.flatMap(c=>c.type==="image_url"?c.image_url.url:[]):[]),l=new Set(I);return t.filter(n=>!l.has(n.url))}var B7=class{async resolveRepositoryImages(e,I,l,n,c,r){if(I<=0)return[];let s=X$I(e,I,l,n);this.logger.debug(`Found ${s.length} repository image URLs to process`);let a=E$I(s,e),o=await this.processImageReferences(a,c,r);return this.logger.debug(`Processed ${o.addedImages.length} repository image URLs`),o.addedImages}async*preRequest(e){let I=e.modelInfo;if(!I.capabilities?.limits){this.logger.debug("Model limits not defined, skipping image processing");return}if(!I.capabilities?.supports?.vision||!this.settings.featureFlags?.copilot_swe_agent_vision){this.logger.debug("Vision not supported or enabled, skipping image processing");return}if(!this.gitHubServerUrl){this.logger.debug("GitHub server URL is not set, skipping image processing");return}for(let i of this.messagesToInsertOnNextPreRequest)e.messages.push(i),yield{kind:"message",turn:e.turn,callId:e.callId,message:i};this.messagesToInsertOnNextPreRequest.splice(0);let l=[],n=I.capabilities.limits.vision?.max_prompt_images??1,c=I.capabilities.limits.vision?.max_prompt_image_size??3145728,r=0,s=[],a=new Yz,o=new Map;for(let i of e.messages)if(i.role=="user")if(typeof i.content=="string"){let d=KZe(i.content,this.gitHubServerUrl,!1,this.logger).filter(m=>!this.processedImageUrls.has(m.url)),b=await this.processImageReferences(d,c,a);s.push(...b.addedImages)}else{let d=[];for(let[b,m]of i.content.entries()){if(m.type==="text"){let h=KZe(m.text,this.gitHubServerUrl,!1,this.logger).filter(Z=>!this.processedImageUrls.has(Z.url)),u=await this.processImageReferences(h,c,a);s.push(...u.addedImages)}else if(m.type==="image_url"){if(m.image_url.url.startsWith("data:")){let[h,u]=await this.extractAndUploadImageData(m,c,a);if(h===""){this.logger.debug("Skipping image upload for empty image data");continue}if(s.push(h),b>=1&&d.length>0){let Z=d.at(-1);Z&&Z.type==="text"&&Z.text&&Z.text.includes("screenshot")&&o.set(h,vqe(h))}d.pop();continue}r++}d.push(m)}i.content=d}for(this.logger.debug(`Found ${s.length} image urls in the messages`),this.logger.debug(`Allowed number of images: ${n}`);r<n&&s.length>0;){let i=s.shift();if(!i){this.logger.debug("Skipping empty image url");continue}if(this.processedImageUrls.has(i)){this.logger.debug(`Skipping already processed image url: ${i}`);continue}this.processedImageUrls.add(i);let d=`Here is the image url: ${i}`;o.has(i)&&(d=o.get(i)||d),this.logger.debug(`Adding image url: ${i}`),l.push({role:"user",content:[{type:"text",text:d},{type:"image_url",image_url:{url:i}}]}),r++}if(this.settings.featureFlags?.copilot_swe_agent_resolve_repo_images&&(this.logger.debug("Resolving repository images..."),r<n)){let i=await this.resolveRepositoryImages(e.messages,n-r,this.settings.github?.serverUrl||"",this.logger,c,a);this.logger.debug(`Resolved ${i.length} repository image URLs`);for(let d of i){if(r>=n)break;if(this.processedImageUrls.has(d)){this.logger.debug(`Skipping already processed repository image url: ${d}`);continue}l.push({role:"user",content:[{type:"text",text:"Here is the image url:"},{type:"image_url",image_url:{url:d}}]}),this.processedImageUrls.add(d),r++}}let G={imagesExtractedCount:a.extractedImagesSize.length,base64ImagesCount:a.base64ImagesSize.length,imagesRemovedDueToSize:a.imagesRemovedDueToSize,imagesRemovedDueToDimensions:a.imagesRemovedDueToDimensions,imagesResized:a.imagesResized,imagesResolvedFromGitHubMCPCount:a.imagesResolvedFromGitHubMCPSize.length};for(let i=0;i<a.base64ImagesSize.length;i++)G[`base64ImageSize_${i}`]=a.base64ImagesSize[i];for(let i=0;i<a.resizedBase64ImagesSize.length;i++)G[`resizedBase64ImageSize_${i}`]=a.resizedBase64ImagesSize[i];for(let i=0;i<a.extractedImagesSize.length;i++)G[`extractedImageSize_${i}`]=a.extractedImagesSize[i];for(let i=0;i<a.imagesResolvedFromGitHubMCPSize.length;i++)G[`imagesResolvedFromGitHubMCPSize_${i}`]=a.imagesResolvedFromGitHubMCPSize[i];l.length>0&&this.logger.debug(`Using ${l.length} image messages`);for(let i of l)yield{kind:"message",turn:e.turn,callId:e.callId,message:i},e.messages.push(i);G.allImagesSendToLlm=e.messages.filter(J0).length,yield{kind:"image_processing",turn:e.turn,imageProcessingMetrics:G},e.messages.some(i=>J0(i))&&(e.additionalRequestHeaders["Copilot-Vision-Request"]="true")}async extractAndUploadImageData(e,I,l){let n=BC(this.settings);if(!n)return this.logger.debug("No user token available, skipping image upload"),[""];this.logger.debug("Found base64 image data, uploading...");let c=e.image_url.url.match(/^data:(.*?);base64,(.*)$/);if(!c||c.length<3)return this.logger.debug("Invalid base64 image data format, skipping"),[""];let r=c[1];if(!N7e(this.logger,r))return[""];let s=c[2];if(s.length===0)return this.logger.debug("Empty base64 image data, skipping"),[""];let a=Buffer.from(s,"base64");if(l.base64ImagesSize.push(a.length),a=await x7(this.logger,l,I,Zz,r,a),l.resizedBase64ImagesSize.push(a?.length??-1),!a)return["",new DZe(`Image size exceeds maximum size of ${ah(I)}`)];s=a.toString("base64");try{let o=await this.uploadBase64ImageData(s,r,n);return o?(this.logger.debug(`Uploaded image url: ${o}`),e.image_url.url=o,[o]):(this.logger.debug("Failed to upload image, skipping"),[""])}catch(o){let G=o instanceof Error?o.message:String(o);return this.logger.debug(`Error during image upload: ${G}`),[""]}}async uploadBase64ImageData(e,I,l){try{let n=xVe(this.settings),c=I.split("/").at(1),r=`image-${Date.now()}.${c}`;if(!e||e.trim()==="")return this.logger.error("Empty image data provided for upload"),null;let s=Buffer.from(e,"base64");if(s.length===0)return this.logger.error("Converted image data has zero length"),null;let a=this.settings.github?.repo?.id;if(!a)return this.logger.error("GitHub repository ID is not configured, cannot upload image"),null;let o=`${n}?name=${encodeURIComponent(r)}&content_type=${encodeURIComponent(I)}&repository_id=${a}`;this.logger.debug(`Uploading image data (${ah(s.length)}) to ${n} with name ${encodeURIComponent(r)} and content type ${encodeURIComponent(I)}`);let G={"Content-Type":"application/octet-stream",Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",Authorization:"Bearer "+l},i=await fetch(o,{method:"POST",headers:G,body:s}).catch(b=>{throw b instanceof Error?(this.logger.error(`Failed to upload image: ${b.message}`),b.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):b.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(b.message.includes("request entity too large")||b.message.includes("payload too large"))&&this.logger.error("Request payload too large. Try reducing the image size.")):typeof b=="object"&&b!==null&&"code"in b&&"message"in b?(this.logger.error(`Failed to upload image: ${b.message}`),b.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):b.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(b.message.includes("request entity too large")||b.message.includes("payload too large"))&&this.logger.error("Request payload too large. Try reducing the image size.")):this.logger.error(`Failed to upload image: ${String(b)}`),this.logger.debug(`Complete error details: ${JSON.stringify({code:b?.code,message:b?.message,stack:b?.stack,name:b?.name,cause:b?.cause},null,2)}`),b});if(!i.ok){let b=await i.text().catch(()=>"Unable to read error response");return this.logger.error(`Failed to upload image: ${i.status} ${i.statusText} - ${b}`),null}let d=await i.json();return this.logger.debug(`Upload result: ${JSON.stringify(d,null,2)}`),d.url||null}catch(n){return this.logger.error(`Error handling image upload: ${n instanceof Error?n.message:String(n)}`),n instanceof Error&&n.stack&&this.logger.debug(`Stack trace: ${n.stack}`),null}}async getRepositoryImageViaTools(e){if(this.logger.debug(`Attempting to retrieve repository image: ${e.owner}/${e.repo}/${e.path}@${e.branch}`),this.githubGetFileContentsTool){this.logger.debug(`GitHub MCP tool found, calling with image reference: ${JSON.stringify(e)}`);try{let I=await this.githubGetFileContentsTool.callback({owner:e.owner,repo:e.repo,path:e.path,branch:e.branch},{toolCallId:crypto.randomUUID(),settings:this.settings});if(this.logger.debug(`GitHub tool call completed. Result type: ${typeof I}`),this.logger.debug(`GitHub tool call result structure: ${typeof I=="object"&&I!==null?Object.keys(I).join(", "):typeof I}`),typeof I=="object"&&I!==null&&"binaryResultForLlm"in I&&Array.isArray(I.binaryResultForLlm)){this.logger.debug(`Tool result has binaryResultForLlm array with ${I.binaryResultForLlm.length} items`);try{for(let l of I.binaryResultForLlm)if(l.data&&l.mimeType){let n=Buffer.from(l.data,"base64"),c=l.mimeType;return{buffer:n,mimeType:c}}}catch(l){this.logger.error(`Failed to parse GitHub tool response: ${l}`),this.logger.debug(`binaryResultForLlm length: ${I.binaryResultForLlm?.length||0}`)}}else typeof I=="string"?this.logger.debug(`GitHub tool returned string result: ${I}`):this.logger.debug(`GitHub tool call failed or returned unexpected format. Result structure: ${typeof I=="object"&&I!==null?Object.keys(I).join(", "):typeof I}`)}catch(I){this.logger.error(`Error calling GitHub MCP tool: ${I}`)}}else this.logger.debug("GitHub MCP tool 'github-mcp-server-get_file_contents' not available");return this.logger.debug("Failed to retrieve repository image, returning null"),null}async getImgRefsSmallerThanMaxSize(e,I,l){let n=[],c=await Promise.all(e);for(let{imgRef:r,attachment:s}of c)if(this.logger.debug(`Processing attachment for ${r.url}, has buffer: ${!!s.buffer}, buffer size: ${s.buffer?.length||0}`),s.buffer)if(I.extractedImagesSize.push(s.buffer.length),Ql(this.settings,"copilot_swe_agent_resize_image_references")){if(!await x7(this.logger,I,l,Zz,s.mimeType,s.buffer)){this.logger.info("Unable to resize image to be within limits, skipping");continue}n.push(r.url)}else{let a=await Nz(l,Zz,s.buffer);if(this.logger.debug(`Image size check for ${r.url}: size=${s.buffer.length}, maxSize=${l}, exceedsSize=${a.exceedsSizeLimit}, exceedsDimensions=${a.exceedsDimensionLimit}`),a.exceedsSizeLimit?(I.imagesRemovedDueToSize++,this.logger.debug(`Image ${r.url} removed due to size (${s.buffer.length} > ${l})`)):a.exceedsDimensionLimit&&(I.imagesRemovedDueToDimensions++,this.logger.debug(`Image ${r.url} removed due to dimensions`)),a.exceedsSizeLimit||a.exceedsDimensionLimit){this.processedImageUrls.add(r.url),this.logger.info(`Image has been removed from the request due to size constraints. Please resize images to be smaller than ${ah(l)}.`);continue}n.push(r.url),this.logger.debug(`Image ${r.url} passed size checks and added to results`)}else this.processedImageUrls.add(r.url),this.logger.debug(`Skipping image ${r.url} - could not fetch image data`);return n}async processImageReferences(e,I,l){let n=this.settings.github?.serverUrl||"";this.logger.debug(`Processing ${e.length} image references`),this.logger.debug(`GitHub server URL: ${n}`),this.logger.debug(`Image references: ${e.map(s=>s.url).join(", ")}`);let c=e.filter(s=>!this.processedImageUrls.has(s.url)).map(async s=>{if(this.logger.debug(`Processing image reference: ${JSON.stringify(s,null,2)}`),s.kind==="committed_attachment"){this.logger.debug(`Detected repository image - Owner: ${s.owner}, Repo: ${s.repo}, Branch: ${s.branch}, Path: ${s.path}`);let a=await this.getRepositoryImageViaTools(s);return a?.buffer?(this.logger.debug(`Successfully fetched repository image buffer, size: ${a.buffer.length} bytes`),l.imagesResolvedFromGitHubMCPSize.push(a.buffer.length)):this.logger.debug("Failed to fetch repository image buffer"),{imgRef:s,attachment:{size:a?.buffer?.length||0,mimeType:a?.mimeType||"",buffer:a?.buffer||null}}}else return this.logger.debug(`Non-repository image, using getAttachmentFromGuid for: ${s.url}`),{imgRef:s,attachment:await N$I(s.guid,BC(this.settings),this.logger,this.settings)}}),r=await this.getImgRefsSmallerThanMaxSize(c,l,I);return this.logger.debug(`Processed image references, found ${r.length} attachments smaller than max size of ${ah(I)}`),{addedImages:r}}logger;settings;gitHubServerUrl;processedImageUrls;messagesToInsertOnNextPreRequest;githubGetFileContentsTool;constructor(e,I,l){this.logger=e,this.settings=I,this.gitHubServerUrl=I.github?.serverUrl,this.githubGetFileContentsTool=l,this.processedImageUrls=new Set,this.messagesToInsertOnNextPreRequest=[]}toJSON(){return"CAPIImageProcessor"}async onRequestError(e){}async preErrorThrow(e){this.processedImageUrls.size>0&&(e.isVisionFlow=!0)}async postToolExecution(e){let I=e.modelInfo,l=e.toolCall.function.name,n=e.toolResult;if(I?.capabilities?.supports?.vision){let c=Array.from(H$I(n,l));if(c.length===0){let r=await J$I(e.toolCall,this.logger);r&&c.push(r)}this.insertImageUrlMessages(c)}}insertImageUrlMessages(e){this.logger.info(`Inserted ${e.length} image URLs from tools into chat history.`);for(let I of e)this.messagesToInsertOnNextPreRequest.push({role:"user",content:[{type:"text",text:I.isScreenshot?"Here is a screenshot:":"Here is an image:"},{type:"image_url",image_url:{url:I.url}}]})}};function*H$I(t,e){for(let I of t.binaryResultForLlm??[])I.type==="image"&&(yield{url:`data:${I.mimeType};base64,${I.data}`,isScreenshot:e.toLowerCase().includes("screenshot")})}var v$I="playwright-browser_take_screenshot";function C$I(t){return typeof t=="object"&&t!==null&&typeof t.filename=="string"}async function J$I(t,e){if(t.function.name!==v$I)return;e.debug("Adding images using Playwright params fallback strategy");let I=JSON.parse(t.function.arguments);if(C$I(I)){let l=Wz.isAbsolute(I.filename)?I.filename:Wz.join(XZe,I.filename);e.debug(`Image from Playwright params: ${I.filename}. Updated to ${l}.`);let n=await f$I(l,e);if(n){let c=n.buffer.toString("base64");return{url:`data:${n.mimeType};base64,${c}`,isScreenshot:!0}}}}function L$I(t){switch(Wz.extname(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";default:return null}}function N7e(t,e){return e!=="image/png"&&e!=="image/jpeg"?(t.debug(`Unsupported content type: ${e}, only image / png and image / jpeg are supported`),!1):!0}async function f$I(t,e){try{if(!qZe(t))return e.debug(`Image ${t} does not have a valid image extension, skipping read`),null;let I=L$I(t);return I?{buffer:await W$I.readFile(t),mimeType:I}:(e.debug(`Image ${t} is not a mime type supported for file -> data URI flow`),null)}catch(I){return e.error(`Failed to read image from disk: ${I instanceof Error?I.message:String(I)}`),null}}var fv=class t{static DEFAULT_TOKEN_LIMIT=128e3;static DEFAULT_TOKEN_LIMIT_BUFFER=0;static MAX_TOKEN_LIMIT_BUFFER=.5;latestUserPromptMessage;logger;modelToTokenLimit;constructor(e,I){this.latestUserPromptMessage=e,this.logger=I,this.modelToTokenLimit=new Map}toJSON(){return"BasicTruncator"}async*preRequest(e){this.initializeStateForModelOnFirstRequest(e);let I=this.modelToTokenLimit.get(e.modelInfo.name),l=I?.tokenLimit??t.DEFAULT_TOKEN_LIMIT;e.getCompletionWithToolsOptions?.failIfInitialInputsTooLong&&this.throwIfOverTokenLimitOnFirstTurn(e,l);let n=I?.tokenLimitBuffer??t.DEFAULT_TOKEN_LIMIT_BUFFER,c=l*(1-n),r=this.latestUserPromptMessage?nUe(this.latestUserPromptMessage,e.messages):-1,s=[()=>B$I(e.messages,e.toolDefinitions,e.modelInfo.name,c),r===-1?void 0:()=>z$I(e.messages,e.toolDefinitions,e.modelInfo.name,c,r)].filter(G=>G!==void 0),a=0,o;for(;(!o||o.postTruncationTokensInMessages>c)&&a<s.length;){let G=s[a]();o=x$I(o,G),a++}return o=o??U$I(e.messages,e.toolDefinitions,e.modelInfo.name,c),o.tokensRemovedDuringTruncation>0&&this.logger.debug(`BasicTruncator truncated: ${JSON.stringify(o)}`),yield{kind:"history_truncated",turn:e.turn,performedBy:"BasicTruncator",truncateResult:o},o}async preErrorThrow(){}async onRequestError(e){let I=this.modelToTokenLimit.get(e.modelInfo.name);if(I===void 0){this.logger.warning("Unable to determine if error relates to token limits due to missing information.");return}let{tokenLimit:l,tokenLimitBuffer:n}=I,c=k$I(e.error,l);if(c!==void 0){if(c<l)this.modelToTokenLimit.set(e.modelInfo.name,{tokenLimit:c,tokenLimitBuffer:t.DEFAULT_TOKEN_LIMIT_BUFFER}),this.logger.debug(`Adjusted model token limit to ${c}`);else{let r=Math.min(n+t.MAX_TOKEN_LIMIT_BUFFER/e.maxRetries,t.MAX_TOKEN_LIMIT_BUFFER);this.modelToTokenLimit.set(e.modelInfo.name,{tokenLimit:l,tokenLimitBuffer:r}),this.logger.debug(`Adjusted model token limit to ${l}, token limit retry buffer to ${r}`)}return{retryAfter:1}}}getTokenLimitForModel(e){let I=this.modelToTokenLimit.get(e),l=I?I.tokenLimit*(1-I.tokenLimitBuffer):void 0;return{tokenLimit:I?.tokenLimit,tokenLimitBuffer:I?.tokenLimitBuffer,effectiveTokenLimit:l}}initializeStateForModelOnFirstRequest(e){e.turn===0&&e.retry===0&&this.modelToTokenLimit.set(e.modelInfo.name,{tokenLimit:e.modelInfo.capabilities?.limits?.max_prompt_tokens||e.modelInfo.capabilities?.limits?.max_context_window_tokens||t.DEFAULT_TOKEN_LIMIT,tokenLimitBuffer:t.DEFAULT_TOKEN_LIMIT_BUFFER})}throwIfOverTokenLimitOnFirstTurn(e,I){if(e.turn===0){let l=GVe(e.messages,e.modelInfo.name),n=iVe(e.toolDefinitions,e.modelInfo.name);if(l+n>I){if(e.getCompletionWithToolsOptions?.failIfInitialInputsTooLong)throw new Error(`Initial inputs exceed the model token limit of ${I} tokens.`);this.logger.warning(`Initial inputs exceed the model token limit of ${I} tokens. The model may not be able to process the inputs correctly.`)}}}};function k$I(t,e){if(t&&typeof t=="object"){let I="message"in t&&typeof t.message=="string"?t.message.match(/prompt token count of (\d+) exceeds the limit of (\d+)/):null;if(I){let r=parseInt(I[2],10);return isNaN(r)?e:r}if("code"in t&&t.code==="model_max_prompt_tokens_exceeded")return e;let n=[JSON.stringify(t)];t instanceof Error&&(n.push(t.message),t.cause instanceof Error?n.push(t.cause.message):t.cause&&n.push(JSON.stringify(t.cause)));let c="Input length and `max_tokens` exceed context limit";if(n.some(r=>r.includes(c)))return e}}function x$I(t,e){return t?{preTruncationMessagesLength:t.preTruncationMessagesLength,preTruncationTokensInMessages:t.preTruncationTokensInMessages,tokensRemovedDuringTruncation:t.tokensRemovedDuringTruncation+e.tokensRemovedDuringTruncation,messagesRemovedDuringTruncation:t.messagesRemovedDuringTruncation+e.messagesRemovedDuringTruncation,tokenLimit:t.tokenLimit,postTruncationMessagesLength:e.postTruncationMessagesLength,postTruncationTokensInMessages:e.postTruncationTokensInMessages}:e}var Y7e=.95;function B$I(t,e,I,l,n){let c=t.length;if(c===0)return{tokenLimit:l,preTruncationTokensInMessages:0,preTruncationMessagesLength:c,postTruncationTokensInMessages:0,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let r=t.map(b=>pA(b,I)),s=Gb(JSON.stringify(e),I),a=l*Y7e,o=r.reduce((b,m)=>b+m,0)+s;if(o<=a)return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let G=new Set,i=0,d=Math.min(n??t.length,t.length);for(let b=0;b<d;b++){let m=t[b];if(m.role!=="system"&&m.role!=="tool"&&m.role!=="user"){if(m.role==="assistant"){let h=m.tool_calls||[],u=h.filter(SG).filter(y=>y.function.name===MJ),Z=h.filter(SG).filter(y=>y.function.name!==MJ),N=u.length===0,g=new Set(Z.map(y=>y.id));if(Z.length>0&&(m.tool_calls=u,r[b]=pA(m,I)),N&&(G.add(b),i+=r[b]),g.size>0)for(let y=b+1;y<t.length;y++){let A=t[y];if(A.role==="tool"&&g.has(A.tool_call_id)&&(G.add(y),i+=r[y],g.delete(A.tool_call_id),g.size===0))break}}if(o-i<a)break}}for(let b=t.length-1;b>=0;b--)G.has(b)&&t.splice(b,1);return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o-i,postTruncationMessagesLength:t.length,tokensRemovedDuringTruncation:i,messagesRemovedDuringTruncation:c-t.length}}function z$I(t,e,I,l,n){let c=t.length;if(c===0)return{tokenLimit:l,preTruncationTokensInMessages:0,preTruncationMessagesLength:c,postTruncationTokensInMessages:0,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let r=t.map(b=>pA(b,I)),s=Gb(JSON.stringify(e),I),a=l*Y7e,o=r.reduce((b,m)=>b+m,0)+s;if(o<=a)return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let G=new Set,i=0,d=Math.min(n??t.length,t.length);for(let b=0;b<d;b++){let m=t[b];if(m.role!=="system"&&m.role!=="tool"){if(m.role==="user")G.add(b),i+=r[b];else if(m.role==="assistant"){let h=m.tool_calls||[],u=new Set(h.map(Z=>Z.id));if(G.add(b),i+=r[b],u.size>0)for(let Z=b+1;Z<t.length;Z++){let N=t[Z];if(N.role==="tool"&&u.has(N.tool_call_id)&&(G.add(Z),i+=r[Z],u.delete(N.tool_call_id),u.size===0))break}}if(o-i<a)break}}for(let b=t.length-1;b>=0;b--)G.has(b)&&t.splice(b,1);return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o-i,postTruncationMessagesLength:t.length,tokensRemovedDuringTruncation:i,messagesRemovedDuringTruncation:c-t.length}}function U$I(t,e,I,l){let n=t.length;if(n===0)return{tokenLimit:l,preTruncationTokensInMessages:0,preTruncationMessagesLength:n,postTruncationTokensInMessages:0,postTruncationMessagesLength:n,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let c=t.map(a=>pA(a,I)),r=Gb(JSON.stringify(e),I),s=c.reduce((a,o)=>a+o,0)+r;return{tokenLimit:l,preTruncationTokensInMessages:s,preTruncationMessagesLength:n,postTruncationTokensInMessages:s,postTruncationMessagesLength:n,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0}}var Vm=class extends mu{constructor(){super()}debug(e){}log(e){}info(e){}notice(e){}warning(e){}error(e){}startGroup(e,I){}endGroup(e){}};var V7e={fetch:{tools:[{toolName:"fetch"}]},time:{tools:[{toolName:"get_current_time"},{toolName:"convert_time"}]},sequentialthinking:{tools:[{toolName:"sequentialthinking"}]},"github-mcp-server":{tools:[{toolName:"get_code_scanning_alert"},{toolName:"get_commit"},{toolName:"get_file_contents"},{toolName:"get_issue"},{toolName:"get_issue_comments"},{toolName:"get_me"},{toolName:"get_copilot_space"},{toolName:"get_pull_request"},{toolName:"get_pull_request_comments"},{toolName:"get_pull_request_files"},{toolName:"get_pull_request_reviews"},{toolName:"get_pull_request_status"},{toolName:"get_secret_scanning_alert"},{toolName:"get_tag"},{toolName:"list_branches"},{toolName:"list_code_scanning_alerts"},{toolName:"list_commits"},{toolName:"list_issues"},{toolName:"list_pull_requests"},{toolName:"list_secret_scanning_alerts"},{toolName:"list_tags"},{toolName:"search_code"},{toolName:"search_issues"},{toolName:"search_repositories"},{toolName:"search_users"},{toolName:"get_job_logs"},{toolName:"get_workflow_run"},{toolName:"get_workflow_run_logs"},{toolName:"list_workflow_jobs"},{toolName:"list_workflow_runs"},{toolName:"list_workflow_run_artifacts"},{toolName:"list_workflows"},{toolName:"summarize_job_log_failures"}]},playwright:{tools:[{toolName:"browser_close"},{toolName:"browser_resize"},{toolName:"browser_console_messages"},{toolName:"browser_handle_dialog"},{toolName:"browser_file_upload"},{toolName:"browser_install"},{toolName:"browser_press_key"},{toolName:"browser_navigate"},{toolName:"browser_navigate_back"},{toolName:"browser_navigate_forward"},{toolName:"browser_network_requests"},{toolName:"browser_pdf_save"},{toolName:"browser_take_screenshot"},{toolName:"browser_snapshot"},{toolName:"browser_click"},{toolName:"browser_drag"},{toolName:"browser_hover"},{toolName:"browser_type"},{toolName:"browser_select_option"},{toolName:"browser_tab_list"},{toolName:"browser_tab_new"},{toolName:"browser_tab_select"},{toolName:"browser_tab_close"},{toolName:"browser_generate_playwright_test"},{toolName:"browser_wait_for"}]},primer:{tools:[{toolName:"init"},{toolName:"list_components"},{toolName:"get_component"},{toolName:"get_component_examples"},{toolName:"get_component_usage_guidelines"},{toolName:"get_component_accessibility_guidelines"},{toolName:"list_patterns"},{toolName:"get_pattern"},{toolName:"list_tokens"},{toolName:"get_color_usage"},{toolName:"get_typography_usage"},{toolName:"list_icons"},{toolName:"get_icon"},{toolName:"review_alt_text"}]},azure:"azure-mcp-server","azure-azmcp":"azure-mcp-server","azure-mcp-server-azmcp":"azure-mcp-server","azure-mcp-server":{tools:[{toolName:"aks"},{toolName:"appconfig"},{toolName:"azureterraformbestpractices"},{toolName:"bestpractices"},{toolName:"bicepschema"},{toolName:"cosmos"},{toolName:"datadog"},{toolName:"documentation"},{toolName:"extension_az"},{toolName:"extension_azd"},{toolName:"extension_azqr"},{toolName:"foundry"},{toolName:"grafana"},{toolName:"group"},{toolName:"keyvault"},{toolName:"kusto"},{toolName:"loadtesting"},{toolName:"marketplace"},{toolName:"monitor"},{toolName:"postgres"},{toolName:"redis"},{toolName:"role"},{toolName:"search"},{toolName:"servicebus"},{toolName:"sql"},{toolName:"storage"},{toolName:"subscription"},{toolName:"workbooks"}]}};function z7(t,e,I){let l=(I||V7e)[t.toLowerCase()],n=new Set;for(;typeof l=="string";){if(n.has(l))return!1;n.add(l),l=V7e[l]}if(!l)return!1;let c=e.toLowerCase();return l.tools.some(r=>r.toolName===c)}var S$I="image";var O$I="resource",M$I=180*1e3,T$I={timeout:M$I};var $Ze=class{constructor(e,I,l){this.settings=e;this.logger=I;this.cacheProviderTools=l}cachedTools=new Map;async invokeTool(e,I,l="hidden_characters"){let n=await this.doInvokeTool(e,I);return this.invokeToolResponseToToolResult(n,l)}invokeToolResponseToToolResult(e,I){let l=e.content||[],n="",c=[];for(let o of l)if(o.type==="text")n+=o.text||"";else if(o.type==="resource"){let G=o.resource;G&&G.blob?c.push({type:O$I,data:G.blob,mimeType:G.mimeType||"application/octet-stream"}):G&&G.text&&(n+=G.text)}else o.type==="image"&&c.push({type:S$I,data:o.data,mimeType:o.mimeType});let r=n;if(n==="")this.logger.debug("Tool invocation result is empty or undefined, skipping content filtering."),r=n;else try{let o=JSON.parse(n),G=Aue(o,I);r=JSON.stringify(G)}catch(o){this.logger.debug(`Unable to parse tool invocation as JSON. Treating it as a string for filtering: ${o}`),r=gue(n,I)}this.logger.debug(`Tool invocation result: ${r}`);let s={},a=r?ac(r,"output"):"";return e.isToolError?{textResultForLlm:r,resultType:"failure",error:r,sessionLog:a,toolTelemetry:s}:{textResultForLlm:r,binaryResultForLlm:c,resultType:"success",sessionLog:a,toolTelemetry:s}}async loadTools(e,I={requestRequired:!1}){let l=this.getProviderCacheKey(e),n=this.cachedTools.get(l),c=n??await this.loadToolsFromProvider(e);this.cacheProviderTools&&!n&&this.cachedTools.set(l,c);let r={};for(let[s,a]of Object.entries(c)){let o=a.filterMode||"hidden_characters";r[s]={name:a.name,namespacedName:a.namespacedName,title:a.title||a.name,description:a.description,input_schema:a.input_schema,callback:async G=>{let i=c[s].serverName,d=c[s].name,b=c[s].title;if(!I.requestRequired)return this.invokeTool(s,G,o);let m=await I.request({kind:"mcp",serverName:i,toolName:d,toolTitle:b,args:G,readOnly:!!a.readOnly});switch(m.kind){case"approved":return this.invokeTool(s,G,o);case"denied-by-rules":return Rj(m.rules);case"denied-no-approval-rule-and-could-not-request-from-user":return yj;case"denied-interactively-by-user":return Vj;default:vm(m,`Unhandled permission result kind: ${m}`)}},safeForTelemetry:a.safeForTelemetry}}return Object.values(r)}};var Vz=class t extends $Ze{toolIdToClientInfo=new Map;constructor(e,I,l=!1){super(e,I,l)}async doInvokeTool(e,I){let l=this.toolIdToClientInfo.get(e);if(!l)throw new Error(`No MCP client found for tool ID: ${e}`);let n=l.mcpClient,c=t.getToolNameFromIdAndClientName(e,l.clientName),r=await n.callTool({name:c,arguments:I},void 0,{...T$I,...l.timeout!==void 0?{timeout:l.timeout}:{},onprogress:s=>{this.logger.info(`Tool ${e} progress: ${JSON.stringify(s)}`)},resetTimeoutOnProgress:!0});if(!Array.isArray(r.content))throw new Error("Expected array of results");return{content:r.content,isToolError:r.error!==void 0&&r.error!==null||r.isError===!0}}getProviderCacheKey(e){return[e.clientName,...e.tools,JSON.stringify(e.filterMapping),e.timeout?.toString()??"default"].join("+")}async loadToolsFromProvider(e){let I={};this.logger.debug(`Loading tools for client: ${e.clientName}`);for(let l of(await e.mcpClient.listTools()).tools){if(!e.tools.includes("*")&&!e.tools.includes(l.name)){this.logger.debug(`Skipping tool ${l.name} for client ${e.clientName}`);continue}let n=t.getToolIdFromClientAndToolName(e.clientName,l.name);this.toolIdToClientInfo.set(n,e);let c;e.safeForTelemetry===!0?c={name:!0,inputsNames:!0}:e.safeForTelemetry&&typeof e.safeForTelemetry=="object"?c=e.safeForTelemetry:c={name:z7(e.clientName,l.name),inputsNames:!1},this.logger.debug(`Adding tool: ${n}`);let r;e.filterMapping===void 0?r="hidden_characters":typeof e.filterMapping=="object"?r=e.filterMapping[l.name]||"hidden_characters":r=e.filterMapping,I[n]={serverName:e.clientName,name:n,namespacedName:`${e.clientName}/${l.name}`,title:l.title||l.annotations?.title||l.name,description:l.description||"",input_schema:l.inputSchema,readOnly:l.annotations?.readOnlyHint,safeForTelemetry:c,filterMode:r}}return I}static getToolIdFromClientAndToolName(e,I){return`${e}-${I}`}static getToolNameFromIdAndClientName(e,I){return e.substring(I.length+1)}};var U7=class{settings;logger;gitHandler;location;commitPriorToCompletionWithTools;jitInstructions;emittedJitInstructions;constructor(e,I,l,n,c,r){this.settings=e,this.logger=I,this.gitHandler=l,this.location=n,this.commitPriorToCompletionWithTools=c,this.jitInstructions=r||{},this.emittedJitInstructions=new Set}toJSON(){return"JitInstructionsProcessor"}async*preRequest(e){if(this.jitInstructions&&Object.keys(this.jitInstructions).length>0){let I,l=async()=>{if(I===void 0)try{I=(await this.gitHandler.getChangedPaths(this.location,"HEAD",this.commitPriorToCompletionWithTools)).length}catch(s){this.logger.error(`Failed to get changed paths, err: ${s}`),I=1}return I},n=[];for(let[s,a]of Object.entries(this.jitInstructions)){let o=IVe(this.settings,a.percentRemainingOfTimeout);o.isWithin&&n.push({config:a,withinMs:o.withinMs})}let c=n.map(({config:s,withinMs:a})=>{let o=typeof s.instruction=="function"?s.instruction(this.location):s.instruction;return{config:s,withinMs:a,instruction:o}}).filter(({instruction:s})=>!this.emittedJitInstructions.has(s)),r;for(let{config:s,withinMs:a,instruction:o}of c)(s.whenNoPathsChanged?await l()===0:!0)&&(!r||a<r.withinMs)&&(r={withinMs:a,instruction:o});if(r){this.logger.debug(`Adding JIT instructions to the history: ${r.instruction}`),this.emittedJitInstructions.add(r.instruction);let s={role:"user",content:r.instruction};e.messages.push(s),yield{kind:"message",turn:e.turn,callId:e.callId,message:s,source:"jit-instruction"}}}}},IWe={remindWhereToDoWork:{instruction:Cqe,percentRemainingOfTimeout:1/2,whenNoPathsChanged:!0},completeAsSoonAsPossible:{instruction:F7.completeAsSoonAsPossible,percentRemainingOfTimeout:1/6},commitNow:{instruction:F7.commitNow,percentRemainingOfTimeout:2/15},finalAnswerNeeded:{instruction:F7.finalAnswerNeeded,percentRemainingOfTimeout:1/10}};var Rz=class{logger;forcePremiumRequest=!1;constructor(e){this.logger=e}async*preRequest(e){e.turn===0||this.forcePremiumRequest?(e.additionalRequestHeaders["X-Initiator"]="user",this.logger.debug("InitiatorHeaderProcessor: Setting X-Initiator to 'user'")):(e.additionalRequestHeaders["X-Initiator"]="agent",this.logger.debug("InitiatorHeaderProcessor: Setting X-Initiator to 'agent'")),this.resetPremiumRequest(),yield*[]}setForcePremiumRequest(){this.forcePremiumRequest=!0}toJSON(){return JSON.stringify({type:"InitiatorHeaderProcessor"})}resetPremiumRequest(){this.forcePremiumRequest=!1}},yz=class{logger;constructor(e){this.logger=e}async*preRequest(e){e.additionalRequestHeaders["X-Initiator"]="agent",this.logger.debug("FreeRequestProcessor: Setting X-Initiator to 'agent'"),yield*[]}setForcePremiumRequest(){}toJSON(){return JSON.stringify({type:"FreeRequestProcessor"})}};function S7(t){return t.kind==="message"&&t.message.role==="assistant"}function R7e(t){return t.kind==="message"&&t.message.role==="user"}function y7e(t){return t.kind==="message"&&t.message.role==="assistant"&&!!t.message.tool_calls}function g7e(t){return t.kind==="message"&&t.message.role==="tool"}function j$I(t,e){return t.toolCalls.find(I=>I.toolCallId===e)}function D$I(t,e,I){let l=I.function.name;try{let n=JSON.parse(I.function.arguments||"{}"),c=e.find(o=>o.name===l),r=c?.safeForTelemetry||{name:!1,inputsNames:!1},s=zX(c),a;if(s&&t.customAgents&&t.settings){let o=t.customAgents.find(G=>G.name===l);if(o){let G=t.settings.github?.repo?.name??"",i=G.split("/"),d=i.length===2?i[0]:"",b=i.length===2?i[1]:G,m=o.mcpServers?Object.keys(o.mcpServers).join(","):"",h=o.mcpServers?Object.keys(o.mcpServers).length:0;a={repoOwner:d,repoName:b,displayName:o.name,mcpServerNames:m,mcpServerCount:h}}}return{toolCallId:I.id,toolName:l,arguments:I.function.arguments,safeForTelemetryToolName:r===!0||r.name?l:sy(l),safeForTelemetryArguments:r===!0||r.inputsNames?IUe(n):"",isCustomAgent:s,customAgentInfo:a}}catch{return{toolCallId:I.id,toolName:l,arguments:I.function.arguments,safeForTelemetryToolName:sy(l),safeForTelemetryArguments:"",isCustomAgent:!1,customAgentInfo:void 0}}}var O7=class{constructor(e,I,l){this.runtimeContext=e;this.forAgent=I;this.toolsInUse=l}turnDataCache=new Map;emittedTurns=new Set;getTurnData(){return this.turnDataCache}async ingestEvent(e){let I,l;if("turn"in e&&typeof e.turn=="number"){if(I=e.turn+1,this.emittedTurns.has(I))return;this.turnDataCache.has(I)||this.turnDataCache.set(I,{featureFlagsAsString:see(this.runtimeContext.settings),toolCalls:[],toolCallExecutions:[],turn:I}),l=this.turnDataCache.get(I)}else return;e.kind==="tool_execution"?await this.ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(l,e):e.kind==="turn_started"||e.kind==="turn_failed"||e.kind==="turn_retry"||e.kind==="turn_ended"?(l={...l,model:e.model,modelInfo:JSON.stringify(e.modelInfo)},e.kind==="turn_started"?l={...l,startTimeMs:e.timestampMs}:e.kind==="turn_retry"?l={...l,endTimeMs:e.timestampMs,retriesUsed:(l.retriesUsed??0)+1}:e.kind==="turn_failed"?l={...l,endTimeMs:e.timestampMs,error:e.error}:e.kind==="turn_ended"&&(l={...l,endTimeMs:e.timestampMs})):e.kind==="history_truncated"?l={...l,truncateEvent:e}:e.kind==="image_processing"?l={...l,imageProcessingMetrics:e.imageProcessingMetrics}:e.kind==="images_removed"?l={...l,largeImagesRemoved:(l.largeImagesRemoved??0)+(e.largeImagesRemoved?1:0),imagesRemoved:(l.imagesRemoved??0)+(e.imagesRemoved?1:0)}:e.kind==="model_call_success"||e.kind==="model_call_failure"?(l={...l,callId:e.callId,modelCallDurationMs:e.modelCallDurationMs,api_call_id:e.modelCall.api_id,provider_call_id:e.modelCall.request_id,conversationStructureSummary:tUe(e.requestMessages)},e.kind==="model_call_success"&&(l={...l,responsePromptTokens:e.responseUsage?.prompt_tokens,responseCompletionTokens:e.responseUsage?.completion_tokens,responseTotalTokens:e.responseUsage?.total_tokens})):R7e(e)&&e.source==="jit-instruction"?l={...l,jitInstructionsAdded:(l?.jitInstructionsAdded??0)+1}:S7(e)&&e.message.tool_calls?l={...l,toolCalls:l.toolCalls.concat(e.message.tool_calls.map(n=>({...D$I(this.runtimeContext,this.toolsInUse,n)})))}:g7e(e)&&(l={...l,toolCallExecutions:l.toolCallExecutions.concat([e.message.tool_call_id])}),this.turnDataCache.set(I,l),e.kind==="turn_ended"&&(await this.emitTurnTelemetry(I),this.emittedTurns.add(I),this.turnDataCache.delete(I))}async emitTurnTelemetry(e){let I=this.turnDataCache.get(e);if(I){let l={kind:"telemetry",telemetry:{event:"get_completion_with_tools_turn",properties:{callId:I.callId,model:I.model||"default",modelInfo:I.modelInfo||"{}",api_call_id:I.api_call_id,provider_call_id:I.provider_call_id,agent:this.forAgent,toolCalls:JSON.stringify(I.toolCalls.map(n=>({toolCallId:n.toolCallId,toolName:n.safeForTelemetryToolName}))),toolCallExecutions:JSON.stringify(I.toolCallExecutions),error:I.error,featureFlags:see(this.runtimeContext.settings),conversationStructureSummary:I.conversationStructureSummary,truncationPerformedBy:I.truncateEvent?.performedBy},metrics:{turn:e,turnDurationMs:I.endTimeMs!==void 0&&I.startTimeMs!==void 0?I.endTimeMs-I.startTimeMs:0,modelCallDurationMs:I.modelCallDurationMs,retriesUsed:I.retriesUsed??0,numToolCalls:I.toolCalls.length,numToolExecutions:I.toolCallExecutions.length,largeImagesRemoved:I.largeImagesRemoved,imagesRemoved:I.imagesRemoved,responsePromptTokens:I.responsePromptTokens,responseCompletionTokens:I.responseCompletionTokens,responseTotalTokens:I.responseTotalTokens,jitInstructionsAdded:I.jitInstructionsAdded,...I.truncateEvent?.truncateResult,...I.imageProcessingMetrics},restrictedProperties:{}}};await this.runtimeContext.callback?.progress(l)}}async ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(e,I){let l=I.toolCallId,n=j$I(e,l);if(n){let c=I.toolResult,r={kind:"telemetry",telemetry:{event:"tool_call_executed",properties:{...c.toolTelemetry.properties,completionWithToolsCallId:I.callId,resultType:c.resultType,toolCallId:l,arguments:n.safeForTelemetryArguments,toolName:n.safeForTelemetryToolName,api_call_id:e.api_call_id,isCustomAgent:n.isCustomAgent?"true":"false"},restrictedProperties:{...c.toolTelemetry.restrictedProperties,arguments:n.arguments,result:c.textResultForLlm,toolName:n.toolName,error:c.error,customAgent:n.customAgentInfo?JSON.stringify({repoOwner:n.customAgentInfo.repoOwner,repoName:n.customAgentInfo.repoName,displayName:n.customAgentInfo.displayName,mcpServerNames:n.customAgentInfo.mcpServerNames}):void 0},metrics:{...c.toolTelemetry.metrics,durationMs:I.durationMs,customAgentMcpServerCount:n.customAgentInfo?.mcpServerCount}}};await this.runtimeContext.callback?.progress(r)}}};var gz=class{async*preRequest(e){yield*[]}handleCallbackResponse(e){}getUserMessages(){return[]}clearUserMessages(){}canProcessUserMessages(){return!1}toJSON(){return JSON.stringify({type:"NoopUserMessageProcessor"})}};var K$I=void 0,M7=class{constructor(e,I=K$I){this.runtimeContext=e;this.agentId=I;this.gitHandlers={silent:new Lo(new Vm,this.runtimeContext.exec),logging:new Lo(this.runtimeContext.logger,this.runtimeContext.exec)}}gitHandlers;async agent(e,I,l,n,c,r,s,a=new gz,o){let G=async(m,h,u)=>{let Z={role:"user",content:m};return await this.runtimeContext.callback?.progress({kind:"message",turn:0,callId:this.agentId,message:Z}),await this.runCompletionWithTools(e,I,[...h??[],Z],r,s,c,{executeToolsInParallel:Ql(this.runtimeContext.settings,"copilot_swe_agent_parallel_tool_execution"),initialTurnCount:u},o,a)},i=n,d=l??[],b;for(;i;){let m=await G(i,d,b);b=m.finalTurnCount,d=m.messages,i=await o?.onResult(m.postCompletionWithToolsCommitHash)}for(let m of r)if(m.shutdown){let h=await m.shutdown();h&&await this.runtimeContext.callback?.progress(h)}return{finalTurnCount:b||0,messages:d}}async runCompletionWithTools(e,I,l,n,c,r,s,a,o=new gz){let G=this.runtimeContext.callback?new O7(this.runtimeContext,"sweagent-capi",n):void 0,i=this.gitHandlers.logging,d=await i.getCurrentCommitHash(e),b=l.filter(y=>y.role==="user").at(-1),m=this.createCompletionWithToolsProcessors(e,d,n,c,o,r,a,b),h=this.runtimeContext.client.getCompletionWithTools(I,l,n,{...s,callId:this.agentId,processors:m}),u=0,Z=[...l],N=[];for await(let y of h){if(Ql(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")){let A=await this.runtimeContext.callback?.progress(y,{accepts_user_messages:o.canProcessUserMessages()});o.handleCallbackResponse(A)}else await this.runtimeContext.callback?.progress(y);G&&await G.ingestEvent(y),(y.kind==="message"||y.kind==="response")&&(y.kind==="message"&&Z.push(y.message),y.kind==="response"&&N.push(y.response),u=Math.max(u,y.turn??0))}let g=await i.getCurrentCommitHash(e);return{finalTurnCount:u,messages:Z,resultMessages:N,preCompletionWithToolsCommitHash:d,postCompletionWithToolsCommitHash:g}}createCompletionWithToolsProcessors(e,I,l,n,c,r,s,a){let o=new B7(this.runtimeContext.logger,this.runtimeContext.settings,l.find(b=>b.name==="github-mcp-server-get_file_contents")),G=new U7(this.runtimeContext.settings,this.runtimeContext.logger,this.gitHandlers.silent,e,I,r),i=new fv(a,this.runtimeContext.logger),d=[G,o,i];return Ql(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")&&d.push(c),d.push(n),{preRequest:d.filter(b=>b!==void 0),preToolsExecution:[s].filter(b=>b!==void 0),postToolExecution:[o,s].filter(b=>b!==void 0),onRequestError:[o,i].filter(b=>b!==void 0)}}};async function tWe(t,e,I,l,n){try{return(await l.invokeTool("blackbird-mcp-server/search_repository_with_agent",{task:t,depth:2,owner:e,repo:I,numSnippets:10},"hidden_characters")).textResultForLlm}catch(c){return n.error(`Error during Blackbird search: ${c}`),""}}var A7e=t=>Ql(t,"copilot_swe_agent_search")||eVe(t,"SearchAgentExperiment")==="enabled",F7e="search";function lWe(t){return t!==null&&typeof t=="object"&&"question"in t&&"reason"in t&&"searchCommand"in t}var P$I=(t,e,I)=>`
1372
1372
  You are a question answering agent that is a component of GitHub Copilot coding agent. Your task is to take the given question
1373
1373
  and answer it using the given facts.
1374
1374
 
@@ -1491,14 +1491,14 @@ Pay attention to the following when using it:
1491
1491
  `,l),r=-1;if(n!==-1&&c!==-1?r=Math.min(n,c):n!==-1?r=n:c!==-1&&(r=c),r===-1){I=t.slice(l);break}else{let s=t.slice(l,r);e.push(s),l=r+1,t[l-1]==="\r"&&t[l]===`
1492
1492
  `&&l++}}return[e,I]}var Q$=class extends Event{constructor(e,I){var l,n;super(e),this.code=(l=I?.code)!=null?l:void 0,this.message=(n=I?.message)!=null?n:void 0}[Symbol.for("nodejs.util.inspect.custom")](e,I,l){return l(atI(this),I)}[Symbol.for("Deno.customInspect")](e,I){return e(atI(this),I)}};function Dot(t){let e=globalThis.DOMException;return typeof e=="function"?new e(t,"SyntaxError"):new SyntaxError(t)}function CYe(t){return t instanceof Error?"errors"in t&&Array.isArray(t.errors)?t.errors.map(CYe).join(", "):"cause"in t&&t.cause instanceof Error?`${t}: ${CYe(t.cause)}`:t.message:`${t}`}function atI(t){return{type:t.type,message:t.message,code:t.code,defaultPrevented:t.defaultPrevented,cancelable:t.cancelable,timeStamp:t.timeStamp}}var GtI=t=>{throw TypeError(t)},UYe=(t,e,I)=>e.has(t)||GtI("Cannot "+I),ll=(t,e,I)=>(UYe(t,e,"read from private field"),I?I.call(t):e.get(t)),zr=(t,e,I)=>e.has(t)?GtI("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,I),cc=(t,e,I,l)=>(UYe(t,e,"write to private field"),e.set(t,I),I),PW=(t,e,I)=>(UYe(t,e,"access private method"),I),zG,IA,ZC,A$,w$,ZU,YC,WU,_V,WC,VC,NC,pU,wm,JYe,LYe,fYe,otI,kYe,xYe,uU,BYe,zYe,tA=class extends EventTarget{constructor(e,I){var l,n;super(),zr(this,wm),this.CONNECTING=0,this.OPEN=1,this.CLOSED=2,zr(this,zG),zr(this,IA),zr(this,ZC),zr(this,A$),zr(this,w$),zr(this,ZU),zr(this,YC),zr(this,WU,null),zr(this,_V),zr(this,WC),zr(this,VC,null),zr(this,NC,null),zr(this,pU,null),zr(this,LYe,async c=>{var r;ll(this,WC).reset();let{body:s,redirected:a,status:o,headers:G}=c;if(o===204){PW(this,wm,uU).call(this,"Server sent HTTP 204, not reconnecting",204),this.close();return}if(a?cc(this,ZC,new URL(c.url)):cc(this,ZC,void 0),o!==200){PW(this,wm,uU).call(this,`Non-200 status code (${o})`,o);return}if(!(G.get("content-type")||"").startsWith("text/event-stream")){PW(this,wm,uU).call(this,'Invalid content type, expected "text/event-stream"',o);return}if(ll(this,zG)===this.CLOSED)return;cc(this,zG,this.OPEN);let i=new Event("open");if((r=ll(this,pU))==null||r.call(this,i),this.dispatchEvent(i),typeof s!="object"||!s||!("getReader"in s)){PW(this,wm,uU).call(this,"Invalid response body, expected a web ReadableStream",o),this.close();return}let d=new TextDecoder,b=s.getReader(),m=!0;do{let{done:h,value:u}=await b.read();u&&ll(this,WC).feed(d.decode(u,{stream:!h})),h&&(m=!1,ll(this,WC).reset(),PW(this,wm,BYe).call(this))}while(m)}),zr(this,fYe,c=>{cc(this,_V,void 0),!(c.name==="AbortError"||c.type==="aborted")&&PW(this,wm,BYe).call(this,CYe(c))}),zr(this,kYe,c=>{typeof c.id=="string"&&cc(this,WU,c.id);let r=new MessageEvent(c.event||"message",{data:c.data,origin:ll(this,ZC)?ll(this,ZC).origin:ll(this,IA).origin,lastEventId:c.id||""});ll(this,NC)&&(!c.event||c.event==="message")&&ll(this,NC).call(this,r),this.dispatchEvent(r)}),zr(this,xYe,c=>{cc(this,ZU,c)}),zr(this,zYe,()=>{cc(this,YC,void 0),ll(this,zG)===this.CONNECTING&&PW(this,wm,JYe).call(this)});try{if(e instanceof URL)cc(this,IA,e);else if(typeof e=="string")cc(this,IA,new URL(e,Kot()));else throw new Error("Invalid URL")}catch{throw Dot("An invalid or illegal string was specified")}cc(this,WC,F$({onEvent:ll(this,kYe),onRetry:ll(this,xYe)})),cc(this,zG,this.CONNECTING),cc(this,ZU,3e3),cc(this,w$,(l=I?.fetch)!=null?l:globalThis.fetch),cc(this,A$,(n=I?.withCredentials)!=null?n:!1),PW(this,wm,JYe).call(this)}get readyState(){return ll(this,zG)}get url(){return ll(this,IA).href}get withCredentials(){return ll(this,A$)}get onerror(){return ll(this,VC)}set onerror(e){cc(this,VC,e)}get onmessage(){return ll(this,NC)}set onmessage(e){cc(this,NC,e)}get onopen(){return ll(this,pU)}set onopen(e){cc(this,pU,e)}addEventListener(e,I,l){let n=I;super.addEventListener(e,n,l)}removeEventListener(e,I,l){let n=I;super.removeEventListener(e,n,l)}close(){ll(this,YC)&&clearTimeout(ll(this,YC)),ll(this,zG)!==this.CLOSED&&(ll(this,_V)&&ll(this,_V).abort(),cc(this,zG,this.CLOSED),cc(this,_V,void 0))}};zG=new WeakMap,IA=new WeakMap,ZC=new WeakMap,A$=new WeakMap,w$=new WeakMap,ZU=new WeakMap,YC=new WeakMap,WU=new WeakMap,_V=new WeakMap,WC=new WeakMap,VC=new WeakMap,NC=new WeakMap,pU=new WeakMap,wm=new WeakSet,JYe=function(){cc(this,zG,this.CONNECTING),cc(this,_V,new AbortController),ll(this,w$)(ll(this,IA),PW(this,wm,otI).call(this)).then(ll(this,LYe)).catch(ll(this,fYe))},LYe=new WeakMap,fYe=new WeakMap,otI=function(){var t;let e={mode:"cors",redirect:"follow",headers:{Accept:"text/event-stream",...ll(this,WU)?{"Last-Event-ID":ll(this,WU)}:void 0},cache:"no-store",signal:(t=ll(this,_V))==null?void 0:t.signal};return"window"in globalThis&&(e.credentials=this.withCredentials?"include":"same-origin"),e},kYe=new WeakMap,xYe=new WeakMap,uU=function(t,e){var I;ll(this,zG)!==this.CLOSED&&cc(this,zG,this.CLOSED);let l=new Q$("error",{code:e,message:t});(I=ll(this,VC))==null||I.call(this,l),this.dispatchEvent(l)},BYe=function(t,e){var I;if(ll(this,zG)===this.CLOSED)return;cc(this,zG,this.CONNECTING);let l=new Q$("error",{code:e,message:t});(I=ll(this,VC))==null||I.call(this,l),this.dispatchEvent(l),cc(this,YC,setTimeout(ll(this,zYe),ll(this,ZU)))},zYe=new WeakMap,tA.CONNECTING=0,tA.OPEN=1,tA.CLOSED=2;function Kot(){let t="document"in globalThis?globalThis.document:void 0;return t&&typeof t=="object"&&"baseURI"in t&&typeof t.baseURI=="string"?t.baseURI:void 0}var SYe;SYe=globalThis.crypto?.webcrypto??globalThis.crypto??import("node:crypto").then(t=>t.webcrypto);async function Pot(t){return(await SYe).getRandomValues(new Uint8Array(t))}async function qot(t){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~",I="",l=await Pot(t);for(let n=0;n<t;n++){let c=l[n]%e.length;I+=e[c]}return I}async function _ot(t){return await qot(t)}async function $ot(t){let e=await(await SYe).subtle.digest("SHA-256",new TextEncoder().encode(t));return btoa(String.fromCharCode(...new Uint8Array(e))).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}async function OYe(t){if(t||(t=43),t<43||t>128)throw`Expected a length between 43 and 128. Received ${t}.`;let e=await _ot(t),I=await $ot(e);return{code_verifier:e,code_challenge:I}}var Ns=V.string().url().superRefine((t,e)=>{if(!URL.canParse(t))return e.addIssue({code:V.ZodIssueCode.custom,message:"URL must be parseable",fatal:!0}),V.NEVER}).refine(t=>{let e=new URL(t);return e.protocol!=="javascript:"&&e.protocol!=="data:"&&e.protocol!=="vbscript:"},{message:"URL cannot use javascript:, data:, or vbscript: scheme"}),itI=V.object({resource:V.string().url(),authorization_servers:V.array(Ns).optional(),jwks_uri:V.string().url().optional(),scopes_supported:V.array(V.string()).optional(),bearer_methods_supported:V.array(V.string()).optional(),resource_signing_alg_values_supported:V.array(V.string()).optional(),resource_name:V.string().optional(),resource_documentation:V.string().optional(),resource_policy_uri:V.string().url().optional(),resource_tos_uri:V.string().url().optional(),tls_client_certificate_bound_access_tokens:V.boolean().optional(),authorization_details_types_supported:V.array(V.string()).optional(),dpop_signing_alg_values_supported:V.array(V.string()).optional(),dpop_bound_access_tokens_required:V.boolean().optional()}).passthrough(),MYe=V.object({issuer:V.string(),authorization_endpoint:Ns,token_endpoint:Ns,registration_endpoint:Ns.optional(),scopes_supported:V.array(V.string()).optional(),response_types_supported:V.array(V.string()),response_modes_supported:V.array(V.string()).optional(),grant_types_supported:V.array(V.string()).optional(),token_endpoint_auth_methods_supported:V.array(V.string()).optional(),token_endpoint_auth_signing_alg_values_supported:V.array(V.string()).optional(),service_documentation:Ns.optional(),revocation_endpoint:Ns.optional(),revocation_endpoint_auth_methods_supported:V.array(V.string()).optional(),revocation_endpoint_auth_signing_alg_values_supported:V.array(V.string()).optional(),introspection_endpoint:V.string().optional(),introspection_endpoint_auth_methods_supported:V.array(V.string()).optional(),introspection_endpoint_auth_signing_alg_values_supported:V.array(V.string()).optional(),code_challenge_methods_supported:V.array(V.string()).optional()}).passthrough(),eGt=V.object({issuer:V.string(),authorization_endpoint:Ns,token_endpoint:Ns,userinfo_endpoint:Ns.optional(),jwks_uri:Ns,registration_endpoint:Ns.optional(),scopes_supported:V.array(V.string()).optional(),response_types_supported:V.array(V.string()),response_modes_supported:V.array(V.string()).optional(),grant_types_supported:V.array(V.string()).optional(),acr_values_supported:V.array(V.string()).optional(),subject_types_supported:V.array(V.string()),id_token_signing_alg_values_supported:V.array(V.string()),id_token_encryption_alg_values_supported:V.array(V.string()).optional(),id_token_encryption_enc_values_supported:V.array(V.string()).optional(),userinfo_signing_alg_values_supported:V.array(V.string()).optional(),userinfo_encryption_alg_values_supported:V.array(V.string()).optional(),userinfo_encryption_enc_values_supported:V.array(V.string()).optional(),request_object_signing_alg_values_supported:V.array(V.string()).optional(),request_object_encryption_alg_values_supported:V.array(V.string()).optional(),request_object_encryption_enc_values_supported:V.array(V.string()).optional(),token_endpoint_auth_methods_supported:V.array(V.string()).optional(),token_endpoint_auth_signing_alg_values_supported:V.array(V.string()).optional(),display_values_supported:V.array(V.string()).optional(),claim_types_supported:V.array(V.string()).optional(),claims_supported:V.array(V.string()).optional(),service_documentation:V.string().optional(),claims_locales_supported:V.array(V.string()).optional(),ui_locales_supported:V.array(V.string()).optional(),claims_parameter_supported:V.boolean().optional(),request_parameter_supported:V.boolean().optional(),request_uri_parameter_supported:V.boolean().optional(),require_request_uri_registration:V.boolean().optional(),op_policy_uri:Ns.optional(),op_tos_uri:Ns.optional()}).passthrough(),dtI=eGt.merge(MYe.pick({code_challenge_methods_supported:!0})),TYe=V.object({access_token:V.string(),id_token:V.string().optional(),token_type:V.string(),expires_in:V.number().optional(),scope:V.string().optional(),refresh_token:V.string().optional()}).strip(),btI=V.object({error:V.string(),error_description:V.string().optional(),error_uri:V.string().optional()}),IGt=V.object({redirect_uris:V.array(Ns),token_endpoint_auth_method:V.string().optional(),grant_types:V.array(V.string()).optional(),response_types:V.array(V.string()).optional(),client_name:V.string().optional(),client_uri:Ns.optional(),logo_uri:Ns.optional(),scope:V.string().optional(),contacts:V.array(V.string()).optional(),tos_uri:Ns.optional(),policy_uri:V.string().optional(),jwks_uri:Ns.optional(),jwks:V.any().optional(),software_id:V.string().optional(),software_version:V.string().optional(),software_statement:V.string().optional()}).strip(),tGt=V.object({client_id:V.string(),client_secret:V.string().optional(),client_id_issued_at:V.number().optional(),client_secret_expires_at:V.number().optional()}).strip(),mtI=IGt.merge(tGt),kTl=V.object({error:V.string(),error_description:V.string().optional()}).strip(),xTl=V.object({token:V.string(),token_type_hint:V.string().optional()}).strip();function htI(t){let e=typeof t=="string"?new URL(t):new URL(t.href);return e.hash="",e}function ptI({requestedResource:t,configuredResource:e}){let I=typeof t=="string"?new URL(t):new URL(t.href),l=typeof e=="string"?new URL(e):new URL(e.href);if(I.origin!==l.origin||I.pathname.length<l.pathname.length)return!1;let n=I.pathname.endsWith("/")?I.pathname:I.pathname+"/",c=l.pathname.endsWith("/")?l.pathname:l.pathname+"/";return n.startsWith(c)}var Wr=class extends Error{constructor(e,I){super(e),this.errorUri=I,this.name=this.constructor.name}toResponseObject(){let e={error:this.errorCode,error_description:this.message};return this.errorUri&&(e.error_uri=this.errorUri),e}get errorCode(){return this.constructor.errorCode}},NU=class extends Wr{};NU.errorCode="invalid_request";var lA=class extends Wr{};lA.errorCode="invalid_client";var nA=class extends Wr{};nA.errorCode="invalid_grant";var cA=class extends Wr{};cA.errorCode="unauthorized_client";var YU=class extends Wr{};YU.errorCode="unsupported_grant_type";var VU=class extends Wr{};VU.errorCode="invalid_scope";var RU=class extends Wr{};RU.errorCode="access_denied";var qW=class extends Wr{};qW.errorCode="server_error";var yU=class extends Wr{};yU.errorCode="temporarily_unavailable";var gU=class extends Wr{};gU.errorCode="unsupported_response_type";var FU=class extends Wr{};FU.errorCode="unsupported_token_type";var AU=class extends Wr{};AU.errorCode="invalid_token";var QU=class extends Wr{};QU.errorCode="method_not_allowed";var wU=class extends Wr{};wU.errorCode="too_many_requests";var XU=class extends Wr{};XU.errorCode="invalid_client_metadata";var EU=class extends Wr{};EU.errorCode="insufficient_scope";var utI={[NU.errorCode]:NU,[lA.errorCode]:lA,[nA.errorCode]:nA,[cA.errorCode]:cA,[YU.errorCode]:YU,[VU.errorCode]:VU,[RU.errorCode]:RU,[qW.errorCode]:qW,[yU.errorCode]:yU,[gU.errorCode]:gU,[FU.errorCode]:FU,[AU.errorCode]:AU,[QU.errorCode]:QU,[wU.errorCode]:wU,[XU.errorCode]:XU,[EU.errorCode]:EU};var UG=class extends Error{constructor(e){super(e??"Unauthorized")}};function WtI(t,e){let I=t.client_secret!==void 0;return e.length===0?I?"client_secret_post":"none":I&&e.includes("client_secret_basic")?"client_secret_basic":I&&e.includes("client_secret_post")?"client_secret_post":e.includes("none")?"none":I?"client_secret_post":"none"}function NtI(t,e,I,l){let{client_id:n,client_secret:c}=e;switch(t){case"client_secret_basic":lGt(n,c,I);return;case"client_secret_post":nGt(n,c,l);return;case"none":cGt(n,l);return;default:throw new Error(`Unsupported client authentication method: ${t}`)}}function lGt(t,e,I){if(!e)throw new Error("client_secret_basic authentication requires a client_secret");let l=btoa(`${t}:${e}`);I.set("Authorization",`Basic ${l}`)}function nGt(t,e,I){I.set("client_id",t),e&&I.set("client_secret",e)}function cGt(t,e){e.set("client_id",t)}async function DYe(t){let e=t instanceof Response?t.status:void 0,I=t instanceof Response?await t.text():t;try{let l=btI.parse(JSON.parse(I)),{error:n,error_description:c,error_uri:r}=l,s=utI[n]||qW;return new s(c||"",r)}catch(l){let n=`${e?`HTTP ${e}: `:""}Invalid OAuth error response: ${l}. Raw body: ${I}`;return new qW(n)}}async function $V(t,e){var I,l;try{return await jYe(t,e)}catch(n){if(n instanceof lA||n instanceof cA)return await((I=t.invalidateCredentials)===null||I===void 0?void 0:I.call(t,"all")),await jYe(t,e);if(n instanceof nA)return await((l=t.invalidateCredentials)===null||l===void 0?void 0:l.call(t,"tokens")),await jYe(t,e);throw n}}async function jYe(t,{serverUrl:e,authorizationCode:I,scope:l,resourceMetadataUrl:n,fetchFn:c}){let r,s;try{r=await sGt(e,{resourceMetadataUrl:n},c),r.authorization_servers&&r.authorization_servers.length>0&&(s=r.authorization_servers[0])}catch{}s||(s=e);let a=await rGt(e,t,r),o=await dGt(s,{fetchFn:c}),G=await Promise.resolve(t.clientInformation());if(!G){if(I!==void 0)throw new Error("Existing OAuth client information is required when exchanging an authorization code");if(!t.saveClientInformation)throw new Error("OAuth client information must be saveable for dynamic registration");let h=await pGt(s,{metadata:o,clientMetadata:t.clientMetadata,fetchFn:c});await t.saveClientInformation(h),G=h}if(I!==void 0){let h=await t.codeVerifier(),u=await mGt(s,{metadata:o,clientInformation:G,authorizationCode:I,codeVerifier:h,redirectUri:t.redirectUrl,resource:a,addClientAuthentication:t.addClientAuthentication,fetchFn:c});return await t.saveTokens(u),"AUTHORIZED"}let i=await t.tokens();if(i?.refresh_token)try{let h=await hGt(s,{metadata:o,clientInformation:G,refreshToken:i.refresh_token,resource:a,addClientAuthentication:t.addClientAuthentication,fetchFn:c});return await t.saveTokens(h),"AUTHORIZED"}catch(h){if(!(!(h instanceof Wr)||h instanceof qW))throw h}let d=t.state?await t.state():void 0,{authorizationUrl:b,codeVerifier:m}=await bGt(s,{metadata:o,clientInformation:G,state:d,redirectUrl:t.redirectUrl,scope:l||t.clientMetadata.scope,resource:a});return await t.saveCodeVerifier(m),await t.redirectToAuthorization(b),"REDIRECT"}async function rGt(t,e,I){let l=htI(t);if(e.validateResourceURL)return await e.validateResourceURL(l,I?.resource);if(I){if(!ptI({requestedResource:l,configuredResource:I.resource}))throw new Error(`Protected resource ${I.resource} does not match expected ${l} (or origin)`);return new URL(I.resource)}}function HU(t){let e=t.headers.get("WWW-Authenticate");if(!e)return;let[I,l]=e.split(" ");if(I.toLowerCase()!=="bearer"||!l)return;let c=/resource_metadata="([^"]*)"/.exec(e);if(c)try{return new URL(c[1])}catch{return}}async function sGt(t,e,I=fetch){let l=await GGt(t,"oauth-protected-resource",I,{protocolVersion:e?.protocolVersion,metadataUrl:e?.resourceMetadataUrl});if(!l||l.status===404)throw new Error("Resource server does not implement OAuth 2.0 Protected Resource Metadata.");if(!l.ok)throw new Error(`HTTP ${l.status} trying to load well-known OAuth protected resource metadata.`);return itI.parse(await l.json())}async function KYe(t,e,I=fetch){try{return await I(t,{headers:e})}catch(l){if(l instanceof TypeError)return e?KYe(t,void 0,I):void 0;throw l}}function aGt(t,e="",I={}){return e.endsWith("/")&&(e=e.slice(0,-1)),I.prependPathname?`${e}/.well-known/${t}`:`/.well-known/${t}${e}`}async function ZtI(t,e,I=fetch){return await KYe(t,{"MCP-Protocol-Version":e},I)}function oGt(t,e){return!t||t.status>=400&&t.status<500&&e!=="/"}async function GGt(t,e,I,l){var n,c;let r=new URL(t),s=(n=l?.protocolVersion)!==null&&n!==void 0?n:lC,a;if(l?.metadataUrl)a=new URL(l.metadataUrl);else{let G=aGt(e,r.pathname);a=new URL(G,(c=l?.metadataServerUrl)!==null&&c!==void 0?c:r),a.search=r.search}let o=await ZtI(a,s,I);if(!l?.metadataUrl&&oGt(o,r.pathname)){let G=new URL(`/.well-known/${e}`,r);o=await ZtI(G,s,I)}return o}function iGt(t){let e=typeof t=="string"?new URL(t):t,I=e.pathname!=="/",l=[];if(!I)return l.push({url:new URL("/.well-known/oauth-authorization-server",e.origin),type:"oauth"}),l.push({url:new URL("/.well-known/openid-configuration",e.origin),type:"oidc"}),l;let n=e.pathname;return n.endsWith("/")&&(n=n.slice(0,-1)),l.push({url:new URL(`/.well-known/oauth-authorization-server${n}`,e.origin),type:"oauth"}),l.push({url:new URL("/.well-known/oauth-authorization-server",e.origin),type:"oauth"}),l.push({url:new URL(`/.well-known/openid-configuration${n}`,e.origin),type:"oidc"}),l.push({url:new URL(`${n}/.well-known/openid-configuration`,e.origin),type:"oidc"}),l}async function dGt(t,{fetchFn:e=fetch,protocolVersion:I=lC}={}){var l;let n={"MCP-Protocol-Version":I},c=iGt(t);for(let{url:r,type:s}of c){let a=await KYe(r,n,e);if(a){if(!a.ok){if(a.status>=400&&a.status<500)continue;throw new Error(`HTTP ${a.status} trying to load ${s==="oauth"?"OAuth":"OpenID provider"} metadata from ${r}`)}if(s==="oauth")return MYe.parse(await a.json());{let o=dtI.parse(await a.json());if(!(!((l=o.code_challenge_methods_supported)===null||l===void 0)&&l.includes("S256")))throw new Error(`Incompatible OIDC provider at ${r}: does not support S256 code challenge method required by MCP specification`);return o}}}}async function bGt(t,{metadata:e,clientInformation:I,redirectUrl:l,scope:n,state:c,resource:r}){let s="code",a="S256",o;if(e){if(o=new URL(e.authorization_endpoint),!e.response_types_supported.includes(s))throw new Error(`Incompatible auth server: does not support response type ${s}`);if(!e.code_challenge_methods_supported||!e.code_challenge_methods_supported.includes(a))throw new Error(`Incompatible auth server: does not support code challenge method ${a}`)}else o=new URL("/authorize",t);let G=await OYe(),i=G.code_verifier,d=G.code_challenge;return o.searchParams.set("response_type",s),o.searchParams.set("client_id",I.client_id),o.searchParams.set("code_challenge",d),o.searchParams.set("code_challenge_method",a),o.searchParams.set("redirect_uri",String(l)),c&&o.searchParams.set("state",c),n&&o.searchParams.set("scope",n),n?.includes("offline_access")&&o.searchParams.append("prompt","consent"),r&&o.searchParams.set("resource",r.href),{authorizationUrl:o,codeVerifier:i}}async function mGt(t,{metadata:e,clientInformation:I,authorizationCode:l,codeVerifier:n,redirectUri:c,resource:r,addClientAuthentication:s,fetchFn:a}){var o;let G="authorization_code",i=e?.token_endpoint?new URL(e.token_endpoint):new URL("/token",t);if(e?.grant_types_supported&&!e.grant_types_supported.includes(G))throw new Error(`Incompatible auth server: does not support grant type ${G}`);let d=new Headers({"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"}),b=new URLSearchParams({grant_type:G,code:l,code_verifier:n,redirect_uri:String(c)});if(s)s(d,b,t,e);else{let h=(o=e?.token_endpoint_auth_methods_supported)!==null&&o!==void 0?o:[],u=WtI(I,h);NtI(u,I,d,b)}r&&b.set("resource",r.href);let m=await(a??fetch)(i,{method:"POST",headers:d,body:b});if(!m.ok)throw await DYe(m);return TYe.parse(await m.json())}async function hGt(t,{metadata:e,clientInformation:I,refreshToken:l,resource:n,addClientAuthentication:c,fetchFn:r}){var s;let a="refresh_token",o;if(e){if(o=new URL(e.token_endpoint),e.grant_types_supported&&!e.grant_types_supported.includes(a))throw new Error(`Incompatible auth server: does not support grant type ${a}`)}else o=new URL("/token",t);let G=new Headers({"Content-Type":"application/x-www-form-urlencoded"}),i=new URLSearchParams({grant_type:a,refresh_token:l});if(c)c(G,i,t,e);else{let b=(s=e?.token_endpoint_auth_methods_supported)!==null&&s!==void 0?s:[],m=WtI(I,b);NtI(m,I,G,i)}n&&i.set("resource",n.href);let d=await(r??fetch)(o,{method:"POST",headers:G,body:i});if(!d.ok)throw await DYe(d);return TYe.parse({refresh_token:l,...await d.json()})}async function pGt(t,{metadata:e,clientMetadata:I,fetchFn:l}){let n;if(e){if(!e.registration_endpoint)throw new Error("Incompatible auth server: does not support dynamic client registration");n=new URL(e.registration_endpoint)}else n=new URL("/register",t);let c=await(l??fetch)(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(I)});if(!c.ok)throw await DYe(c);return mtI.parse(await c.json())}var PYe=class extends Error{constructor(e,I,l){super(`SSE error: ${I}`),this.code=e,this.event=l}},X$=class{constructor(e,I){this._url=e,this._resourceMetadataUrl=void 0,this._eventSourceInit=I?.eventSourceInit,this._requestInit=I?.requestInit,this._authProvider=I?.authProvider,this._fetch=I?.fetch}async _authThenStart(){var e;if(!this._authProvider)throw new UG("No auth provider");let I;try{I=await $V(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 UG;return await this._startOrAuth()}async _commonHeaders(){var e;let I={};if(this._authProvider){let l=await this._authProvider.tokens();l&&(I.Authorization=`Bearer ${l.access_token}`)}return this._protocolVersion&&(I["mcp-protocol-version"]=this._protocolVersion),new Headers({...I,...(e=this._requestInit)===null||e===void 0?void 0:e.headers})}_startOrAuth(){var e,I,l;let n=(l=(I=(e=this===null||this===void 0?void 0:this._eventSourceInit)===null||e===void 0?void 0:e.fetch)!==null&&I!==void 0?I:this._fetch)!==null&&l!==void 0?l:fetch;return new Promise((c,r)=>{this._eventSource=new tA(this._url.href,{...this._eventSourceInit,fetch:async(s,a)=>{let o=await this._commonHeaders();o.set("Accept","text/event-stream");let G=await n(s,{...a,headers:o});return G.status===401&&G.headers.has("www-authenticate")&&(this._resourceMetadataUrl=HU(G)),G}}),this._abortController=new AbortController,this._eventSource.onerror=s=>{var a;if(s.code===401&&this._authProvider){this._authThenStart().then(c,r);return}let o=new PYe(s.code,s.message,s);r(o),(a=this.onerror)===null||a===void 0||a.call(this,o)},this._eventSource.onopen=()=>{},this._eventSource.addEventListener("endpoint",s=>{var a;let o=s;try{if(this._endpoint=new URL(o.data,this._url),this._endpoint.origin!==this._url.origin)throw new Error(`Endpoint origin does not match connection origin: ${this._endpoint.origin}`)}catch(G){r(G),(a=this.onerror)===null||a===void 0||a.call(this,G),this.close();return}c()}),this._eventSource.onmessage=s=>{var a,o;let G=s,i;try{i=OV.parse(JSON.parse(G.data))}catch(d){(a=this.onerror)===null||a===void 0||a.call(this,d);return}(o=this.onmessage)===null||o===void 0||o.call(this,i)}})}async start(){if(this._eventSource)throw new Error("SSEClientTransport already started! If using Client class, note that connect() calls start() automatically.");return await this._startOrAuth()}async finishAuth(e){if(!this._authProvider)throw new UG("No auth provider");if(await $V(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new UG("Failed to authorize")}async close(){var e,I,l;(e=this._abortController)===null||e===void 0||e.abort(),(I=this._eventSource)===null||I===void 0||I.close(),(l=this.onclose)===null||l===void 0||l.call(this)}async send(e){var I,l,n;if(!this._endpoint)throw new Error("Not connected");try{let c=await this._commonHeaders();c.set("content-type","application/json");let r={...this._requestInit,method:"POST",headers:c,body:JSON.stringify(e),signal:(I=this._abortController)===null||I===void 0?void 0:I.signal},s=await((l=this._fetch)!==null&&l!==void 0?l:fetch)(this._endpoint,r);if(!s.ok){if(s.status===401&&this._authProvider){if(this._resourceMetadataUrl=HU(s),await $V(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new UG;return this.send(e)}let a=await s.text().catch(()=>null);throw new Error(`Error POSTing to endpoint (HTTP ${s.status}): ${a}`)}}catch(c){throw(n=this.onerror)===null||n===void 0||n.call(this,c),c}}setProtocolVersion(e){this._protocolVersion=e}};var GlI=vl(alI(),1);import C$ from"node:process";import{PassThrough as OGt}from"node:stream";var H$=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
1493
1493
  `);if(e===-1)return null;let I=this._buffer.toString("utf8",0,e).replace(/\r$/,"");return this._buffer=this._buffer.subarray(e+1),SGt(I)}clear(){this._buffer=void 0}};function SGt(t){return OV.parse(JSON.parse(t))}function olI(t){return JSON.stringify(t)+`
1494
- `}var MGt=C$.platform==="win32"?["APPDATA","HOMEDRIVE","HOMEPATH","LOCALAPPDATA","PATH","PROCESSOR_ARCHITECTURE","SYSTEMDRIVE","SYSTEMROOT","TEMP","USERNAME","USERPROFILE","PROGRAMFILES"]:["HOME","LOGNAME","PATH","SHELL","TERM","USER"];function TGt(){let t={};for(let e of MGt){let I=C$.env[e];I!==void 0&&(I.startsWith("()")||(t[e]=I))}return t}var v$=class{constructor(e){this._abortController=new AbortController,this._readBuffer=new H$,this._stderrStream=null,this._serverParams=e,(e.stderr==="pipe"||e.stderr==="overlapped")&&(this._stderrStream=new OGt)}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,GlI.default)(this._serverParams.command,(l=this._serverParams.args)!==null&&l!==void 0?l:[],{env:{...TGt(),...this._serverParams.env},stdio:["pipe","pipe",(n=this._serverParams.stderr)!==null&&n!==void 0?n:"inherit"],shell:!1,signal:this._abortController.signal,windowsHide:C$.platform==="win32"&&jGt(),cwd:this._serverParams.cwd}),this._process.on("error",a=>{var o,G;if(a.name==="AbortError"){(o=this.onclose)===null||o===void 0||o.call(this);return}I(a),(G=this.onerror)===null||G===void 0||G.call(this,a)}),this._process.on("spawn",()=>{e()}),this._process.on("close",a=>{var o;this._process=void 0,(o=this.onclose)===null||o===void 0||o.call(this)}),(c=this._process.stdin)===null||c===void 0||c.on("error",a=>{var o;(o=this.onerror)===null||o===void 0||o.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 o;(o=this.onerror)===null||o===void 0||o.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=olI(e);this._process.stdin.write(n)?I():this._process.stdin.once("drain",I)})}};function jGt(){return"type"in C$}var J$=class extends TransformStream{constructor({onError:e,onRetry:I,onComment:l}={}){let n;super({start(c){n=F$({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 DGt={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2},vU=class extends Error{constructor(e,I){super(`Streamable HTTP error: ${I}`),this.code=e}},L$=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:DGt}async _authThenStart(){var e;if(!this._authProvider)throw new UG("No auth provider");let I;try{I=await $V(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 UG;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 vU(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,o,G,i;try{let d=e.pipeThrough(new TextDecoderStream).pipeThrough(new J$).getReader();for(;;){let{value:b,done:m}=await d.read();if(m)break;if(b.id&&(r=b.id,n?.(b.id)),!b.event||b.event==="message")try{let h=OV.parse(JSON.parse(b.data));c!==void 0&&Bz(h)&&(h.id=c),(a=this.onmessage)===null||a===void 0||a.call(this,h)}catch(h){(o=this.onerror)===null||o===void 0||o.call(this,h)}}}catch(d){if((G=this.onerror)===null||G===void 0||G.call(this,new Error(`SSE stream disconnected: ${d}`)),l&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:r,onresumptiontoken:n,replayMessageId:c},0)}catch(b){(i=this.onerror)===null||i===void 0||i.call(this,new Error(`Failed to reconnect: ${b instanceof Error?b.message:String(b)}`))}}})()}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 UG("No auth provider");if(await $V(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new UG("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:C_(e)?e.id:void 0}).catch(u=>{var Z;return(Z=this.onerror)===null||Z===void 0?void 0:Z.call(this,u)});return}let o=await this._commonHeaders();o.set("content-type","application/json"),o.set("accept","application/json, text/event-stream");let G={...this._requestInit,method:"POST",headers:o,body:JSON.stringify(e),signal:(l=this._abortController)===null||l===void 0?void 0:l.signal},i=await((n=this._fetch)!==null&&n!==void 0?n:fetch)(this._url,G),d=i.headers.get("mcp-session-id");if(d&&(this._sessionId=d),!i.ok){if(i.status===401&&this._authProvider){if(this._resourceMetadataUrl=HU(i),await $V(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new UG;return this.send(e)}let u=await i.text().catch(()=>null);throw new Error(`Error POSTing to endpoint (HTTP ${i.status}): ${u}`)}if(i.status===202){N$e(e)&&this._startOrAuthSse({resumptionToken:void 0}).catch(u=>{var Z;return(Z=this.onerror)===null||Z===void 0?void 0:Z.call(this,u)});return}let m=(Array.isArray(e)?e:[e]).filter(u=>"method"in u&&"id"in u&&u.id!==void 0).length>0,h=i.headers.get("content-type");if(m)if(h?.includes("text/event-stream"))this._handleSseStream(i.body,{onresumptiontoken:a},!1);else if(h?.includes("application/json")){let u=await i.json(),Z=Array.isArray(u)?u.map(N=>OV.parse(N)):[OV.parse(u)];for(let N of Z)(c=this.onmessage)===null||c===void 0||c.call(this,N)}else throw new vU(-1,`Unexpected content type: ${h}`)}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 vU(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}};var f$=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 r2e(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?.())}},r2e=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 k$=class{createTransport(e){switch(e.type){case"stdio":{let I=new v$({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 L$(new URL(e.url),{requestInit:{headers:e.headers||{}}});case"sse":return new X$(new URL(e.url),{requestInit:{headers:e.headers||{}}});case"memory":return new f$(e.server);default:throw new Error(`Unsupported transport type: ${e.type}`)}}};var CU="blackbird-mcp-server",eR="github-mcp-server",s2e="playwright",JU=[CU];function gC(t){return t.type===void 0||t.type.toLowerCase()==="local"||t.type.toLowerCase()==="stdio"}function ilI(t){return LU(t)||fU(t)}function LU(t){return t.type?.toLowerCase()==="http"}function fU(t){return t.type?.toLowerCase()==="sse"}function kU(t){return t.type?.toLowerCase()==="memory"}var a2e=class extends KGt{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)))}}},x$=class{constructor(e,I=new y$,l=new k$,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 a2e(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))(await this.getServerTools(n,c,e,I)).forEach(s=>{l[s.namespacedName]=s});return this.logger.log(`All tools retrieved: ${JSON.stringify(l,null,2)}`),l}async getServerTools(e,I,l,n){let c=[];try{this.logger.log(`Fetching tools from client: ${e}`);let r=await I.listTools(),s=l?.mcpServers[e].tools,a=l?.mcpServers[e].filterMapping;for(let G of r.tools){if(G.name==="get_copilot_space")continue;if(!(s?.includes("*")||s?.includes(G.name))){this.logger.log(`Tool ${G.name} is not in the allowed list for client: ${e}`);continue}let d=z7(e,G.name),b=`${e}-${G.name}`,m;typeof a=="string"?m=Fue(a):m=Fue(a?.[G.name]??"hidden_characters");let h=`${e}/${G.name}`,u={name:b,namespacedName:h,title:G.title||G.annotations?.title||h||G.name,description:G.description??b,input_schema:G.inputSchema,readOnly:G.annotations?.readOnlyHint,safeForTelemetry:{name:!!(l?.mcpServers[e].isDefaultServer||d),inputsNames:!!l?.mcpServers[e].isDefaultServer},filterMode:m};c.push(u),this.logger.log(`Tool ${G.name} added to tools list for client: ${e}`)}this.logger.log(`Successfully retrieved ${c.length} tools from client: ${e}`);let o=I.getServerVersion();await this.logServerSuccessWithTools(e,c,o,n)}catch(r){this.logger.error(`Failed to get tools from client: ${e} ${r}`)}return c}async logServerSuccessWithTools(e,I,l,n){if(!JU.includes(e)&&n)try{let c=I.map(o=>`- ${o.namespacedName}`).join(`
1494
+ `}var MGt=C$.platform==="win32"?["APPDATA","HOMEDRIVE","HOMEPATH","LOCALAPPDATA","PATH","PROCESSOR_ARCHITECTURE","SYSTEMDRIVE","SYSTEMROOT","TEMP","USERNAME","USERPROFILE","PROGRAMFILES"]:["HOME","LOGNAME","PATH","SHELL","TERM","USER"];function TGt(){let t={};for(let e of MGt){let I=C$.env[e];I!==void 0&&(I.startsWith("()")||(t[e]=I))}return t}var v$=class{constructor(e){this._abortController=new AbortController,this._readBuffer=new H$,this._stderrStream=null,this._serverParams=e,(e.stderr==="pipe"||e.stderr==="overlapped")&&(this._stderrStream=new OGt)}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,GlI.default)(this._serverParams.command,(l=this._serverParams.args)!==null&&l!==void 0?l:[],{env:{...TGt(),...this._serverParams.env},stdio:["pipe","pipe",(n=this._serverParams.stderr)!==null&&n!==void 0?n:"inherit"],shell:!1,signal:this._abortController.signal,windowsHide:C$.platform==="win32"&&jGt(),cwd:this._serverParams.cwd}),this._process.on("error",a=>{var o,G;if(a.name==="AbortError"){(o=this.onclose)===null||o===void 0||o.call(this);return}I(a),(G=this.onerror)===null||G===void 0||G.call(this,a)}),this._process.on("spawn",()=>{e()}),this._process.on("close",a=>{var o;this._process=void 0,(o=this.onclose)===null||o===void 0||o.call(this)}),(c=this._process.stdin)===null||c===void 0||c.on("error",a=>{var o;(o=this.onerror)===null||o===void 0||o.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 o;(o=this.onerror)===null||o===void 0||o.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=olI(e);this._process.stdin.write(n)?I():this._process.stdin.once("drain",I)})}};function jGt(){return"type"in C$}var J$=class extends TransformStream{constructor({onError:e,onRetry:I,onComment:l}={}){let n;super({start(c){n=F$({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 DGt={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2},vU=class extends Error{constructor(e,I){super(`Streamable HTTP error: ${I}`),this.code=e}},L$=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:DGt}async _authThenStart(){var e;if(!this._authProvider)throw new UG("No auth provider");let I;try{I=await $V(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 UG;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 vU(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,o,G,i;try{let d=e.pipeThrough(new TextDecoderStream).pipeThrough(new J$).getReader();for(;;){let{value:b,done:m}=await d.read();if(m)break;if(b.id&&(r=b.id,n?.(b.id)),!b.event||b.event==="message")try{let h=OV.parse(JSON.parse(b.data));c!==void 0&&Bz(h)&&(h.id=c),(a=this.onmessage)===null||a===void 0||a.call(this,h)}catch(h){(o=this.onerror)===null||o===void 0||o.call(this,h)}}}catch(d){if((G=this.onerror)===null||G===void 0||G.call(this,new Error(`SSE stream disconnected: ${d}`)),l&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:r,onresumptiontoken:n,replayMessageId:c},0)}catch(b){(i=this.onerror)===null||i===void 0||i.call(this,new Error(`Failed to reconnect: ${b instanceof Error?b.message:String(b)}`))}}})()}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 UG("No auth provider");if(await $V(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new UG("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:C_(e)?e.id:void 0}).catch(u=>{var Z;return(Z=this.onerror)===null||Z===void 0?void 0:Z.call(this,u)});return}let o=await this._commonHeaders();o.set("content-type","application/json"),o.set("accept","application/json, text/event-stream");let G={...this._requestInit,method:"POST",headers:o,body:JSON.stringify(e),signal:(l=this._abortController)===null||l===void 0?void 0:l.signal},i=await((n=this._fetch)!==null&&n!==void 0?n:fetch)(this._url,G),d=i.headers.get("mcp-session-id");if(d&&(this._sessionId=d),!i.ok){if(i.status===401&&this._authProvider){if(this._resourceMetadataUrl=HU(i),await $V(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new UG;return this.send(e)}let u=await i.text().catch(()=>null);throw new Error(`Error POSTing to endpoint (HTTP ${i.status}): ${u}`)}if(i.status===202){N$e(e)&&this._startOrAuthSse({resumptionToken:void 0}).catch(u=>{var Z;return(Z=this.onerror)===null||Z===void 0?void 0:Z.call(this,u)});return}let m=(Array.isArray(e)?e:[e]).filter(u=>"method"in u&&"id"in u&&u.id!==void 0).length>0,h=i.headers.get("content-type");if(m)if(h?.includes("text/event-stream"))this._handleSseStream(i.body,{onresumptiontoken:a},!1);else if(h?.includes("application/json")){let u=await i.json(),Z=Array.isArray(u)?u.map(N=>OV.parse(N)):[OV.parse(u)];for(let N of Z)(c=this.onmessage)===null||c===void 0||c.call(this,N)}else throw new vU(-1,`Unexpected content type: ${h}`)}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 vU(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}};var f$=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 r2e(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?.())}},r2e=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 k$=class{createTransport(e){switch(e.type){case"stdio":{let I=new v$({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 L$(new URL(e.url),{requestInit:{headers:e.headers||{}}});case"sse":return new X$(new URL(e.url),{requestInit:{headers:e.headers||{}}});case"memory":return new f$(e.server);default:throw new Error(`Unsupported transport type: ${e.type}`)}}};var CU="blackbird-mcp-server",eR="github-mcp-server",s2e="playwright",JU=[CU];function gC(t){return t.type===void 0||t.type.toLowerCase()==="local"||t.type.toLowerCase()==="stdio"}function ilI(t){return LU(t)||fU(t)}function LU(t){return t.type?.toLowerCase()==="http"}function fU(t){return t.type?.toLowerCase()==="sse"}function kU(t){return t.type?.toLowerCase()==="memory"}var a2e=class extends KGt{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)))}}},x$=class{constructor(e,I=new y$,l=new k$,n="indirect"){this.logger=e;this.clientFactory=I;this.transportFactory=l;this.envValueMode=n}clients={};transports={};configs={};async startLocalMcpClient(e,I){this.logger.log(`Starting MCP client for ${e} with command: ${I.command} and args: ${I.args}`);let l=new a2e(e,this.logger),n={type:"stdio",command:I.command,args:I.args,env:{...I.env||{},PATH:process.env.PATH},stderr:l,cwd:I.cwd},c=this.transportFactory.createTransport(n);await this.setupAndConnectClient(e,I,c)}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,I,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,I,n)}async startInMemoryMcpClient(e,I,l){this.logger.log(`Starting in-memory MCP client for ${e}`);let n={type:"memory",server:l},c=this.transportFactory.createTransport(n);await this.setupAndConnectClient(e,I,c)}async setupAndConnectClient(e,I,l){this.transports[e]=l,l.onclose=()=>{this.logger.log(`MCP transport for ${e} closed`),delete this.transports[e],delete this.configs[e]},this.configs[e]=I,I.timeout!==void 0&&this.logger.log(`MCP client for ${e} configured with timeout: ${I.timeout}ms`),this.logger.log(`Creating MCP client for ${e}...`);let n=this.clientFactory.createClient({name:"github-copilot-developer",version:"1.0.0"},{capabilities:{experimental:void 0,roots:void 0,sampling:void 0}}),c=Date.now();this.logger.log(`Connecting MCP client for ${e}...`),await n.connect(l),n.onclose=()=>{this.logger.log(`MCP client for ${e} closed`),delete this.clients[e]},n.onerror=r=>{this.logger.error(`MCP client for ${e} errored ${r}`)},this.logger.log(`MCP client for ${e} connected, took ${Date.now()-c}ms`),this.clients[e]=n}async getTools(e,I){let l={};for(let[n,c]of Object.entries(this.clients))(await this.getServerTools(n,c,e,I)).forEach(s=>{l[s.namespacedName]=s});return this.logger.log(`All tools retrieved: ${JSON.stringify(l,null,2)}`),l}async getServerTools(e,I,l,n){let c=[];try{this.logger.log(`Fetching tools from client: ${e}`);let r=await I.listTools(),s=l?.mcpServers[e].tools,a=l?.mcpServers[e].filterMapping;for(let G of r.tools){if(G.name==="get_copilot_space")continue;if(!(s?.includes("*")||s?.includes(G.name))){this.logger.log(`Tool ${G.name} is not in the allowed list for client: ${e}`);continue}let d=z7(e,G.name),b=`${e}-${G.name}`,m;typeof a=="string"?m=Fue(a):m=Fue(a?.[G.name]??"hidden_characters");let h=`${e}/${G.name}`,u={name:b,namespacedName:h,title:G.title||G.annotations?.title||h||G.name,description:G.description??b,input_schema:G.inputSchema,readOnly:G.annotations?.readOnlyHint,safeForTelemetry:{name:!!(l?.mcpServers[e].isDefaultServer||d),inputsNames:!!l?.mcpServers[e].isDefaultServer},filterMode:m};c.push(u),this.logger.log(`Tool ${G.name} added to tools list for client: ${e}`)}this.logger.log(`Successfully retrieved ${c.length} tools from client: ${e}`);let o=I.getServerVersion();await this.logServerSuccessWithTools(e,c,o,n)}catch(r){this.logger.error(`Failed to get tools from client: ${e} ${r}`)}return c}async logServerSuccessWithTools(e,I,l,n){if(!JU.includes(e)&&n)try{let c=I.map(o=>`- ${o.namespacedName}`).join(`
1495
1495
  `),r=I.reduce((o,G)=>(o[G.name]=G.title||G.namespacedName,o),{}),a=`MCP server started successfully${l?` (version ${l.version})`:""} with ${I.length} ${I.length===1?"tool":"tools"} - for the full output, see the verbose logs
1496
1496
 
1497
- ${c}`;await n.createOrUpdateMCPStartupToolCall({serverName:e,content:a,toolNamesToDisplayNames:r}),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}`)}}};var IR=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 o2e={mcpServers:{}},B$=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"),o2e;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"),o2e;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){if(I.indexOf("/")===-1)continue;let l=I.replace(/\//g,"__");e.mcpServers[l]=e.mcpServers[I],delete e.mcpServers[I]}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}`),o2e}}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[eR]??void 0;if(r&&ilI(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[eR]=s}else this.logger.log("Using default remote GitHub MCP server configuration"),e.mcpServers[eR]=c}configureLocalGitHubMcp(e){if(e.mcpServers[eR]){this.logger.log("Using user-provided GitHub MCP server configuration");let I=e.mcpServers[eR]??{};gC(I)&&!I.command&&(e.mcpServers[eR]={...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[eR]=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[s2e]){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:[...EZe,"--allowed-origins","localhost;localhost:*;127.0.0.1;127.0.0.1:*"],tools:["*"],isDefaultServer:!0};e.mcpServers[s2e]=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[CU]=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[CU]=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[CU]=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 gC(e)||LU(e)||fU(e)||kU(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&&!gC(I)&&!kU(I)?(this.logger.error(`Unsupported server type "${I.type}" for server "${e}". Only "Local", "STDIO", or "Memory" are supported.`),!1):I.tools?gC(I)&&!this.isValidLocalServerConfig(I)?(this.logger.error(`Invalid local server configuration for "${e}". Please ensure 'command' and 'args' are provided.`),!1):(LU(I)||fU(I))&&!this.isValidRemoteServerConfig(I)?(this.logger.error(`Invalid remote server configuration for "${e}". Please ensure 'url' is provided.`),!1):kU(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=IR.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=IR.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=IR.resolveLocalServerConfig(l,n);process.env.GITHUB_WORKSPACE&&c.cwd===void 0&&(c.cwd=process.env.GITHUB_WORKSPACE),this.logger.log(`Starting MCP client for ${e} with
1497
+ ${c}`;await n.createOrUpdateMCPStartupToolCall({serverName:e,content:a,toolNamesToDisplayNames:r}),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}`)}}};var IR=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 o2e={mcpServers:{}},B$=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"),o2e;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"),o2e;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){if(I.indexOf("/")===-1)continue;let l=I.replace(/\//g,"__");e.mcpServers[l]=e.mcpServers[I],delete e.mcpServers[I]}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}`),o2e}}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[eR]??void 0;if(r&&ilI(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[eR]=s}else this.logger.log("Using default remote GitHub MCP server configuration"),e.mcpServers[eR]=c}configureLocalGitHubMcp(e){if(e.mcpServers[eR]){this.logger.log("Using user-provided GitHub MCP server configuration");let I=e.mcpServers[eR]??{};gC(I)&&!I.command&&(e.mcpServers[eR]={...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[eR]=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[s2e]){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:[...EZe,"--allowed-origins","localhost;localhost:*;127.0.0.1;127.0.0.1:*"],tools:["*"],isDefaultServer:!0};e.mcpServers[s2e]=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[CU]=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[CU]=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[CU]=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 gC(e)||LU(e)||fU(e)||kU(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&&!gC(I)&&!kU(I)?(this.logger.error(`Unsupported server type "${I.type}" for server "${e}". Only "Local", "STDIO", or "Memory" are supported.`),!1):I.tools?gC(I)&&!this.isValidLocalServerConfig(I)?(this.logger.error(`Invalid local server configuration for "${e}". Please ensure 'command' and 'args' are provided.`),!1):(LU(I)||fU(I))&&!this.isValidRemoteServerConfig(I)?(this.logger.error(`Invalid remote server configuration for "${e}". Please ensure 'url' is provided.`),!1):kU(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=IR.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=IR.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,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=IR.resolveLocalServerConfig(l,n);process.env.GITHUB_WORKSPACE&&c.cwd===void 0&&(c.cwd=process.env.GITHUB_WORKSPACE),this.logger.log(`Starting MCP client for ${e} with
1498
1498
  command: ${c.command}
1499
1499
  args: ${c.args}
1500
- 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]=IR.resolveString(n,process.env);else for(let[l,n]of Object.entries(e.env)){let c=n.trim(),r=c;if(c.includes("$")&&(r=IR.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(e=e.replace(/\//g,"__"),!this.validateServerConfig(e,I)){this.logger.error(`Skipping server "${e}" due to invalid configuration.`);return}JU.includes(e)||await this.sessionClient?.createOrUpdateMCPStartupToolCall({serverName:e});try{gC(I)?await this.processLocalServer(e,I):LU(I)&&this.remoteEnabled?await this.processHttpServer(e,I):fU(I)&&this.remoteEnabled?await this.processSseServer(e,I):kU(I)&&await this.processInMemoryServer(e,I)}catch(l){JU.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 z$=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 x$(this.logger,void 0,void 0,n),this.processor=new B$(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 Vz(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]}};var zlI=vl(BlI(),1);async function Udt(t={}){let e=await $2e();return P2e((0,zlI.default)({},e,t))}async function UlI(t={}){if(qU())throw new Error("Settings have already been initialized");return Udt(t)}import{promises as Sdt}from"fs";import SlI from"path";var Odt=3*1024*1024;function OlI(t){let e=SlI.extname(t).toLowerCase();return[".png",".jpg",".jpeg",".gif",".webp"].includes(e)}function Mdt(t){switch(SlI.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 Tdt(t,e){e.debug(`Processing local image file: ${t}`);let I=await Sdt.readFile(t),l=Mdt(t);if(!l)throw new Error(`Unsupported image format: ${t}`);let n=new Yz,c=await x7(e,n,Odt,Zz,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 jdt(t,e,I){let l=va();try{let n=await Rse({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 MlI(t,e,I){let l=[],n=t.filter(r=>!OlI(r.path));if(n.length===0)return l;let c=[];for(let r of n)try{let s=await jdt(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 TlI(t,e){let I=t.filter(n=>OlI(n.path));return(await Promise.all(I.map(async n=>{try{return{type:"image_url",image_url:{url:await Tdt(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 jlI="copilot-developer-cli",Ddt=j2e(I_),N2e=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"}},su=class t{sessionId;startTime;modifiedTime;logger;events=[];_chatMessages=[];_selectedModel;eventProcessingQueue=Promise.resolve();eventHandlers={};wildcardEventHandlers=[];isProcessing=!1;messageQueue=[];immediatePromptProcessor;mcpHost;workingDir;abortController;allowedTools;disabledTools;requestPermission;mcpServers;hooks;authInfo;constructor(e={},I={}){this.sessionId=I.sessionId||va(),this.startTime=I.startTime||new Date,this.modifiedTime=I.modifiedTime||this.startTime,this.logger=e.logger||new Vm,this._selectedModel=e.model,this.allowedTools=e.allowedTools,this.disabledTools=e.disabledTools,this.requestPermission=e.requestPermission,this.mcpServers=e.mcpServers,this.hooks=e.hooks,this.authInfo=e.authInfo,this.workingDir=e.workingDirectory||process.cwd(),this.immediatePromptProcessor=new N2e(this.logger,this),this.abortController=e.abortController||new AbortController,cWe(this.workingDir).then(l=>{if(l.found)return G6e(l.gitRoot,!0,this.workingDir)}).catch(l=>{this.logger.debug(`Failed to initialize custom instructions cache: ${l}`)})}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)}})}emitInternal(e,I,l=!1){let n=va(),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(o){this.logger.error(`Error in event handler for event type ${s.type}: ${o instanceof Error?o.message:String(o)}`)}})}emit(e,I){this.emitInternal(e,I)}emitEphemeral(e,I){this.emitInternal(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 TlI(e.data.attachments,this.logger);I.push(...n);let c=await MlI(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||e.data.parentToolCallId)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":{if(e.data.parentToolCallId)break;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=Kdt(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.emitEphemeral("session.idle",{})}}async abort(){this.abortController.abort()}setAuthInfo(e){this.authInfo=e}async initializeMcpHost(){if(!this.mcpHost&&this.mcpServers&&Object.keys(this.mcpServers).length>0)try{this.mcpHost=new z$(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.authInfo)throw new Error("Session was not created with authentication info");let l=new Map,n=new Map;try{let r=(await sN(this.hooks?.userPromptSubmitted,{timestamp:Date.now(),cwd:this.workingDir,prompt:e},this.logger))?.modifiedPrompt??e;this.emit("user.message",{content:g7({problemStatement:r,capabilities:{}}),attachments:I});let s=await kz(this.authInfo),a=this.authInfo.type!=="hmac"?await Ddt(this.authInfo.host,s||"",this.logger):void 0,o=await a$e(this.logger,this.sessionId,this.authInfo,jlI);if(o.type!=="success")throw new Error("Failed to list available models");let G=await k_e(this._selectedModel,this,o.list,this.logger);if(!G)throw new Error("No available models found. Please check your Copilot license and permissions.");let d=new mA().setProblemStatement(r).setAgentModel(`capi:${G}`).setGithubRepoName("copilot-sdk-session").setGithubRepoCommit("copilot-sdk-commit").setGithubRepoReadWrite(!1).setCopilotIntegrationId(jlI).setCopilotUrl(a).setGithubToken(s).build();q2e();let b=await UlI(d),m=b.service?.agent?.model,h=G3(m),u=h.agent,Z=u??"sweagent-capi",N=h.model?{model:h.model}:void 0,g=yme(b,this.logger,u,N),y={location:this.workingDir,timeout:3e4,requireReasoning:!0,toolPartialResultCallback:(ne,oI)=>{this.emitEphemeral("tool.execution_partial_result",{toolCallId:ne,partialOutput:oI})},permissions:this.requestPermission?{requestRequired:!0,request:this.requestPermission}:{requestRequired:!1},shellConfig:(process.platform==="win32"?Fb.powerShell:Fb.bash).withScriptSafetyAssessor(async function(ne){return{result:"completed",commands:[{identifier:ne,readOnly:!1}],possiblePaths:[],hasWriteFileRedirection:!1,canOfferSessionApproval:!1}})},A=await X7e(y,this.logger),f=[];if(this.mcpHost)try{f=await this.mcpHost.getTools(b,this.logger,y.permissions)}catch(ne){this.logger.error(`Failed to get MCP tools: ${ne}`)}let J=[...A,...f].filter(ne=>this.allowedTools?this.allowedTools.includes(ne.name):this.disabledTools?!this.disabledTools.includes(ne.name):!0),X=await cWe(this.workingDir),x={...(H7e()[Z]?.[g.model]??E7e()).supports,reasoning:!0},S=await Hqe({location:X.found?X.gitRoot:"",version:fUe(),currentWorkingDirectory:this.workingDir,parts:{},capabilities:x,toolConfigOverrides:y,tools:J,organizationCustomInstructions:void 0}),le=await this.getChatMessages(),be=le.findLastIndex(ne=>ne.role==="user"),Ae=le.filter(ne=>ne.role==="user").at(-1);if(!Ae)throw new Error("No user message found in session messages after sending prompt");typeof Ae.content=="string"?Ae={...Ae,content:g7({customAgentPrompt:void 0,problemStatement:Ae.content,capabilities:x})}:Ae={...Ae,content:Ae.content.map(ne=>ne.type==="text"?{...ne,text:g7({customAgentPrompt:void 0,problemStatement:ne.text,capabilities:x})}:ne)};let we=le.map((ne,oI)=>oI===be?Ae:ne);await sN(this.hooks?.sessionStart,{timestamp:Date.now(),cwd:this.workingDir,source:"new",initialPrompt:e},this.logger);let Le=new fv(Ae,this.logger),Xe=g.getCompletionWithTools(S,we,J,{failIfInitialInputsTooLong:!1,processors:{preRequest:[Le,this.immediatePromptProcessor,new Rz(this.logger)],onRequestError:[Le]},executeToolsInParallel:!1,abortSignal:this.abortController.signal});for await(let ne of Xe){if(this.abortController.signal.aborted){this.emit("abort",{reason:"user initiated"});break}switch(ne.kind){case"message":{if(S7(ne)){let oI=y7e(ne)?await Promise.all(ne.message.tool_calls.map(async Ye=>{let ze=UX(Ye.function.arguments);l.set(Ye.id,Ye.function.name),n.set(Ye.id,ze);let nl=await sN(this.hooks?.preToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:Ye.function.name,toolArgs:ze},this.logger);return{toolCallId:Ye.id,name:Ye.function.name,arguments:nl?.modifiedArgs??ze}})):[];this.emit("assistant.message",{parentToolCallId:void 0,messageId:va(),content:typeof ne.message.content=="string"?ne.message.content:"",toolRequests:oI});for(let Ye of oI)this.emit("tool.execution_start",{toolCallId:Ye.toolCallId,toolName:Ye.name,arguments:Ye.arguments})}else(ne.message.role==="system"||ne.message.role==="developer")&&this.emit("system.message",{role:ne.message.role,content:typeof ne.message.content=="string"?ne.message.content:JSON.stringify(ne.message.content),name:"name"in ne.message?ne.message.name:void 0});break}case"model_call_failure":{let oI=new Error(ne.modelCall?.error||"Model call failed");await sN(this.hooks?.errorOccurred,{timestamp:Date.now(),cwd:this.workingDir,error:oI,errorContext:"model_call",recoverable:!0},this.logger),this.emit("session.error",{errorType:"model_call",message:oI.message,stack:oI.stack});break}case"tool_execution":{let Ye=(await sN(this.hooks?.postToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:l.get(ne.toolCallId)||"unknown",toolArgs:n.get(ne.toolCallId)||{},toolResult:ne.toolResult},this.logger))?.modifiedResult??ne.toolResult,ze=(Ye.resultType==="failure"?Ye.error:void 0)||Ye.sessionLog||Ye.textResultForLlm;this.emit("tool.execution_complete",{parentToolCallId:void 0,toolCallId:ne.toolCallId,success:Ye.resultType==="success",result:Ye.resultType==="success"?{content:ze}:void 0,error:Ye.resultType!=="success"?{message:ze,code:Ye.resultType}:void 0});break}case"turn_started":{this.emit("assistant.turn_start",{turnId:`${ne.turn}`});break}case"turn_ended":{this.emit("assistant.turn_end",{turnId:`${ne.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: ${ne.kind}`);break;default:vm(ne,"Unhandled event type")}}}catch(c){await sN(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 sN(this.hooks?.sessionEnd,{timestamp:Date.now(),cwd:this.workingDir,reason:"complete"},this.logger)}}};function Kdt(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 o of a.tool_calls)l.has(o.id)||I.push(o.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]}var P$=class{sessions;logger;options;lastAccessedSessionId;constructor(e){this.options=e,this.sessions=new Map,this.logger=e.logger||new Vm}async createSession(){let e=new su(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),this.lastAccessedSessionId===e&&(this.lastAccessedSessionId=void 0)}};var Pdt=fe({command:oe(),description:oe(),timeout:Zs().optional(),sessionId:oe().optional(),async:kl().optional()}),qdt=fe({sessionId:oe(),input:oe(),delay:Zs().optional()}),_dt=fe({sessionId:oe(),delay:Zs()}),$dt=fe({sessionId:oe()}),ebt=wa([Pdt,qdt,_dt,$dt]),Ibt=fe({command:gI("view"),path:oe(),view_range:_7([Zs(),Zs()]).optional()}),tbt=fe({command:gI("create"),path:oe(),file_text:oe()}),lbt=fe({command:gI("str_replace"),path:oe(),new_str:oe().optional(),old_str:oe()}),nbt=fe({command:gI("insert"),path:oe(),insert_line:Zs(),new_str:oe()}),cbt=wz("command",[Ibt,tbt,lbt,nbt]),nKl=fe({path:oe(),view_range:_7([Zs(),Zs()]).optional()}),cKl=fe({path:oe(),file_text:oe()}),rKl=fe({path:oe(),old_str:oe(),new_str:oe().optional()}),Y2e=wa([ebt,cbt,eu()]);var OU=fe({type:gI("text"),text:oe()}),sbt=fe({type:gI("refusal"),refusal:oe()}),abt=fe({type:gI("image_url"),image_url:fe({url:oe(),detail:Iu(["auto","low","high"]).optional()})}),obt=fe({type:gI("input_audio"),input_audio:fe({data:oe(),format:gI("wav").or(gI("mp3"))})}),Gbt=fe({type:gI("file"),file:fe({file_date:oe().optional(),file_id:oe().optional(),filename:oe().optional()})}),ibt=wa([OU,abt,obt,Gbt]),dbt=fe({name:oe(),arguments:oe()}),bbt=fe({name:oe(),input:oe()}),mbt=fe({id:oe(),type:gI("function"),function:dbt}),hbt=fe({id:oe(),type:gI("custom"),custom:bbt}),pbt=wa([mbt,hbt]),ubt=fe({name:oe(),arguments:oe()}),Zbt=fe({id:oe()}),Wbt=fe({content:wa([oe(),Ws(OU)]),role:gI("developer"),name:oe().optional()}),Nbt=fe({content:wa([oe(),Ws(OU)]),role:gI("system"),name:oe().optional()}),Ybt=fe({content:wa([oe(),Ws(ibt)]),role:gI("user"),name:oe().optional()}),Vbt=fe({content:wa([oe(),Ws(wa([OU,sbt]))]).nullable().optional(),role:gI("assistant"),name:oe().optional(),refusal:oe().nullable().optional(),audio:Zbt.nullable().optional(),function_call:ubt.nullable().optional(),tool_calls:Ws(pbt).optional()}),Rbt=fe({content:wa([oe(),Ws(OU)]),role:gI("tool"),tool_call_id:oe()}),ybt=fe({content:oe().nullable(),role:gI("function"),name:oe()}),gbt=wa([Wbt,Nbt,Ybt,Vbt,Rbt,ybt]),Fbt=fe({type:gI("copilot"),text:oe(),isStreaming:kl().optional()}),Abt=fe({type:gI("error"),text:oe()}),Qbt=fe({type:gI("info"),text:oe()}),wbt=fe({type:gI("user"),text:oe()}),Xbt=fe({type:gI("tool_call_requested"),callId:oe(),name:oe(),toolTitle:oe().optional(),intentionSummary:oe().nullable(),arguments:Y2e,partialOutput:oe().optional(),isHidden:kl().optional(),isAlwaysExpanded:kl().optional(),showNoContent:kl().optional()}),Ebt=fe({type:gI("tool_call_completed"),callId:oe(),name:oe(),toolTitle:oe().optional(),intentionSummary:oe().nullable(),result:wa([fe({type:gI("success"),log:oe(),markdown:kl().optional()}),fe({type:gI("failure"),log:oe(),markdown:kl().optional()}),fe({type:gI("rejected"),markdown:kl().optional()}),fe({type:gI("denied"),log:oe(),markdown:kl().optional()})]),arguments:Y2e,isHidden:kl().optional(),isAlwaysExpanded:kl().optional(),showNoContent:kl().optional()}),Hbt=wa([Fbt,Abt,Qbt,wbt,Xbt,Ebt]),vbt=Hbt.and(fe({id:oe(),timestamp:$7.date()})),V2e=fe({sessionId:oe(),startTime:$7.date(),chatMessages:Ws(gbt),timeline:Ws(vbt),selectedModel:Iu(g_).optional()}),tR=H_e(V2e.parse,"history-session");var Nr=fe({id:oe().uuid(),timestamp:oe().datetime(),parentId:oe().uuid().nullable(),ephemeral:kl().optional()}),DlI=fe({parentToolCallId:oe().optional()}),Cbt=Nr.extend({type:gI("session.start"),data:fe({sessionId:oe(),version:Zs(),producer:oe(),copilotVersion:oe(),startTime:oe().datetime(),selectedModel:oe().optional()})}),Jbt=Nr.extend({type:gI("session.resume"),data:fe({resumeTime:oe().datetime(),eventCount:Zs()})}),Lbt=Nr.extend({type:gI("session.error"),data:fe({errorType:oe(),message:oe(),stack:oe().optional()})}),fbt=Nr.extend({type:gI("session.info"),data:fe({infoType:oe(),message:oe()})}),kbt=Nr.extend({type:gI("session.model_change"),data:fe({previousModel:oe().optional(),newModel:oe()})}),xbt=Nr.extend({type:gI("session.import_legacy"),data:fe({legacySession:V2e,importTime:oe().datetime(),sourceFile:oe()})}),Bbt=Nr.extend({type:gI("session.idle"),ephemeral:gI(!0),data:fe({})}),zbt=fe({type:Iu(["file","directory"]),path:oe(),displayName:oe()}),Ubt=Nr.extend({type:gI("user.message"),data:fe({content:oe(),attachments:Ws(zbt).optional()})}),Sbt=Nr.extend({type:gI("assistant.turn_start"),data:fe({turnId:oe()})}),Obt=Nr.extend({type:gI("assistant.message"),data:fe({messageId:oe(),content:oe(),toolRequests:Ws(fe({toolCallId:oe(),name:oe(),arguments:eu()})).optional()}).merge(DlI)}),Mbt=Nr.extend({type:gI("assistant.turn_end"),data:fe({turnId:oe()})}),Tbt=Nr.extend({type:gI("assistant.usage"),ephemeral:gI(!0),data:fe({model:oe().optional(),inputTokens:Zs().optional(),outputTokens:Zs().optional(),cost:Zs().optional(),duration:Zs().optional(),initiator:oe().optional()})}),jbt=Nr.extend({type:gI("abort"),data:fe({reason:oe()})}),Dbt=Nr.extend({type:gI("tool.user_requested"),data:fe({toolCallId:oe(),toolName:oe(),arguments:eu()})}),Kbt=Nr.extend({type:gI("tool.execution_start"),data:fe({toolCallId:oe(),toolName:oe(),arguments:eu()})}),Pbt=Nr.extend({type:gI("tool.execution_partial_result"),ephemeral:gI(!0),data:fe({toolCallId:oe(),partialOutput:oe()})}),qbt=Nr.extend({type:gI("tool.execution_complete"),data:fe({toolCallId:oe(),success:kl(),isUserRequested:kl().optional(),result:fe({content:oe()}).optional(),error:fe({message:oe(),code:oe().optional()}).optional()}).merge(DlI)}),_bt=Nr.extend({type:gI("hook.start"),data:fe({hookInvocationId:oe(),hookType:oe(),input:eu()})}),$bt=Nr.extend({type:gI("hook.end"),data:fe({hookInvocationId:oe(),hookType:oe(),output:eu(),success:kl(),error:fe({message:oe(),stack:oe().optional()}).optional()})}),emt=Nr.extend({type:gI("system.message"),data:fe({content:oe(),role:Iu(["system","developer"]),name:oe().optional(),metadata:fe({promptVersion:oe().optional(),variables:Tv(eu()).optional()}).optional()})}),KlI=wz("type",[Cbt,Jbt,Lbt,Bbt,fbt,kbt,xbt,Ubt,Sbt,Obt,Mbt,Tbt,jbt,Dbt,Kbt,Pbt,qbt,_bt,$bt,emt]);var lR=v_e(KlI.parse,"session");var q$=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 lR.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 R2e(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())}}};function PlI(t){if(t.role==="user")return typeof t.content=="string"?t.content:t.content.find(e=>e.type==="text")?.text}async function lmt(t){if(Imt(t))try{return await M2e(t,e=>{if(e.trim())try{let I=JSON.parse(e);if(I.type==="session.import_legacy"){let l=I.data.legacySession.chatMessages.find(n=>n.role==="user");if(l?.content){let n=PlI(l);if(n)return y2e(n)}}if(I.type==="user.message"){let l=I.data.content;if(l)return y2e(l)}return}catch{return}})}catch{return}}function y2e(t){let e=t.lastIndexOf("<reminder>");e!==-1&&(t=t.substring(0,e).trim());let I=t.replace(/\s+/g," ").trim();return I.length>75&&(I=I.substring(0,55).trim()+"..."),I=I.split("").filter(l=>{let n=l.charCodeAt(0);return n>=32&&n!==127}).join(""),I}var g2e=class extends P${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??va(),l=new Date,n=new su(this.options,{sessionId:I,startTime:l});return this.sessionWriters[I]=new q$(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 q$(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 lR.load(e);return await su.fromEvents(I,this.options)}async loadLegacySession(e){let l=(await tR.directoryFiles()).filter(a=>{let o=a.match(/^session_(.+)_(\d+)\.json$/);return o&&o[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 tR.load(n);if(!c)throw new Error(`Failed to load legacy session from ${n}`);let r=new Date(c.startTime),s=new su(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:tR.path(n.replace(/\.json$/,""))}}async listSessions(){let e=await lR.directoryFilesWithMetadata(),I=await tR.directoryFilesWithMetadata(),l=await Promise.all(e.map(async r=>{let s=r.file.replace(".jsonl",""),a=lR.path(s),o=await lmt(a);return{sessionId:s,startTime:r.birthtime,modifiedTime:r.mtime,summary:o}})),n=(await Promise.all(I.map(async r=>{let s=r.file.match(/^session_(.+)_(\d+)\.json$/);if(!s)return null;let a=s[1],o;try{let G=await tR.load(r.file.replace(/\.json$/,""));if(G){let i=G.chatMessages?.find(d=>d.role==="user");if(i?.content){let d=PlI(i);d&&(o=y2e(d))}}}catch{}return{sessionId:a,startTime:r.birthtime,modifiedTime:r.mtime,summary:o}}))).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=lR.path(e);try{await R2e(I),this.logger.info(`Deleted session file ${I}`),await super.deleteSession(e);return}catch{let c=(await tR.directoryFiles()).filter(r=>{let s=r.match(/^session_(.+)_(\d+)\.json$/);return s&&s[1]===e});if(c.length===0)throw new Error(`Session file not found for ${e}`);for(let r of c){let s=tR.path(r.replace(/\.json$/,""));this.logger.info(`Deleting legacy session file ${s}`),await R2e(s)}await super.deleteSession(e)}}async closeSession(e){this.logger.info(`Closing session ${e}`);let I=this.sessionWriters[e];I&&(await I.flush(),I.dispose(),delete this.sessionWriters[e])}getSessionsDirectory(){return tmt(lR.home(),lR.directory())}setLogger(e){this.logger=e}};var F2e=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))}};import{appendFile as nmt,access as cmt,mkdir as rmt}from"fs/promises";import{constants as smt}from"fs";import{dirname as amt}from"path";var A2e=class extends mu{constructor(I,l,n){super(l,n);this.filePath=I;this.writeQueue=omt(amt(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}
1501
- `;this.writeQueue=this.writeQueue.then(()=>this.performWrite(c)).catch(()=>{})}async performWrite(I){await nmt(this.filePath,I)}};async function omt(t){try{await cmt(t,smt.F_OK)}catch{await rmt(t,{recursive:!0})}}async function MKl(){return f_e}async function*DKl(t){let{prompt:e,...I}=t,l=new su(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{mu as BaseLogger,F2e as CompoundLogger,vR as ConsoleLogger,A2e as FileLogger,Vm as NoopLogger,su as Session,KlI as SessionEventSchema,P$ as SessionManager,Kdt as completeOrphanedToolCalls,sN as executeHooks,MKl as getAvailableModels,qlI as internal,kC as isDebugEnvironment,DKl as query};
1500
+ cwd: ${c.cwd}`);try{let r={...c,env:n};await this.registry.startLocalMcpClient(e,r),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]=IR.resolveString(n,process.env);else for(let[l,n]of Object.entries(e.env)){let c=n.trim(),r=c;if(c.includes("$")&&(r=IR.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(e=e.replace(/\//g,"__"),!this.validateServerConfig(e,I)){this.logger.error(`Skipping server "${e}" due to invalid configuration.`);return}JU.includes(e)||await this.sessionClient?.createOrUpdateMCPStartupToolCall({serverName:e});try{gC(I)?await this.processLocalServer(e,I):LU(I)&&this.remoteEnabled?await this.processHttpServer(e,I):fU(I)&&this.remoteEnabled?await this.processSseServer(e,I):kU(I)&&await this.processInMemoryServer(e,I)}catch(l){JU.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 z$=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 x$(this.logger,void 0,void 0,n),this.processor=new B$(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 Vz(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",timeout:this.config.mcpServers[c]?.timeout},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]}};var zlI=vl(BlI(),1);async function Udt(t={}){let e=await $2e();return P2e((0,zlI.default)({},e,t))}async function UlI(t={}){if(qU())throw new Error("Settings have already been initialized");return Udt(t)}import{promises as Sdt}from"fs";import SlI from"path";var Odt=3*1024*1024;function OlI(t){let e=SlI.extname(t).toLowerCase();return[".png",".jpg",".jpeg",".gif",".webp"].includes(e)}function Mdt(t){switch(SlI.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 Tdt(t,e){e.debug(`Processing local image file: ${t}`);let I=await Sdt.readFile(t),l=Mdt(t);if(!l)throw new Error(`Unsupported image format: ${t}`);let n=new Yz,c=await x7(e,n,Odt,Zz,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 jdt(t,e,I){let l=va();try{let n=await Rse({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 MlI(t,e,I){let l=[],n=t.filter(r=>!OlI(r.path));if(n.length===0)return l;let c=[];for(let r of n)try{let s=await jdt(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 TlI(t,e){let I=t.filter(n=>OlI(n.path));return(await Promise.all(I.map(async n=>{try{return{type:"image_url",image_url:{url:await Tdt(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 jlI="copilot-developer-cli",Ddt=j2e(I_),N2e=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"}},su=class t{sessionId;startTime;modifiedTime;logger;events=[];_chatMessages=[];_selectedModel;eventProcessingQueue=Promise.resolve();eventHandlers={};wildcardEventHandlers=[];isProcessing=!1;messageQueue=[];immediatePromptProcessor;mcpHost;workingDir;abortController;allowedTools;disabledTools;requestPermission;mcpServers;hooks;authInfo;constructor(e={},I={}){this.sessionId=I.sessionId||va(),this.startTime=I.startTime||new Date,this.modifiedTime=I.modifiedTime||this.startTime,this.logger=e.logger||new Vm,this._selectedModel=e.model,this.allowedTools=e.allowedTools,this.disabledTools=e.disabledTools,this.requestPermission=e.requestPermission,this.mcpServers=e.mcpServers,this.hooks=e.hooks,this.authInfo=e.authInfo,this.workingDir=e.workingDirectory||process.cwd(),this.immediatePromptProcessor=new N2e(this.logger,this),this.abortController=e.abortController||new AbortController,cWe(this.workingDir).then(l=>{if(l.found)return G6e(l.gitRoot,!0,this.workingDir)}).catch(l=>{this.logger.debug(`Failed to initialize custom instructions cache: ${l}`)})}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)}})}emitInternal(e,I,l=!1){let n=va(),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(o){this.logger.error(`Error in event handler for event type ${s.type}: ${o instanceof Error?o.message:String(o)}`)}})}emit(e,I){this.emitInternal(e,I)}emitEphemeral(e,I){this.emitInternal(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 TlI(e.data.attachments,this.logger);I.push(...n);let c=await MlI(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||e.data.parentToolCallId)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":{if(e.data.parentToolCallId)break;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=Kdt(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.emitEphemeral("session.idle",{})}}async abort(){this.abortController.abort()}setAuthInfo(e){this.authInfo=e}async initializeMcpHost(){if(!this.mcpHost&&this.mcpServers&&Object.keys(this.mcpServers).length>0)try{this.mcpHost=new z$(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.authInfo)throw new Error("Session was not created with authentication info");let l=new Map,n=new Map;try{let r=(await sN(this.hooks?.userPromptSubmitted,{timestamp:Date.now(),cwd:this.workingDir,prompt:e},this.logger))?.modifiedPrompt??e;this.emit("user.message",{content:g7({problemStatement:r,capabilities:{}}),attachments:I});let s=await kz(this.authInfo),a=this.authInfo.type!=="hmac"?await Ddt(this.authInfo.host,s||"",this.logger):void 0,o=await a$e(this.logger,this.sessionId,this.authInfo,jlI);if(o.type!=="success")throw new Error("Failed to list available models");let G=await k_e(this._selectedModel,this,o.list,this.logger);if(!G)throw new Error("No available models found. Please check your Copilot license and permissions.");let d=new mA().setProblemStatement(r).setAgentModel(`capi:${G}`).setGithubRepoName("copilot-sdk-session").setGithubRepoCommit("copilot-sdk-commit").setGithubRepoReadWrite(!1).setCopilotIntegrationId(jlI).setCopilotUrl(a).setGithubToken(s).build();q2e();let b=await UlI(d),m=b.service?.agent?.model,h=G3(m),u=h.agent,Z=u??"sweagent-capi",N=h.model?{model:h.model}:void 0,g=yme(b,this.logger,u,N),y={location:this.workingDir,timeout:3e4,requireReasoning:!0,toolPartialResultCallback:(ne,oI)=>{this.emitEphemeral("tool.execution_partial_result",{toolCallId:ne,partialOutput:oI})},permissions:this.requestPermission?{requestRequired:!0,request:this.requestPermission}:{requestRequired:!1},shellConfig:(process.platform==="win32"?Fb.powerShell:Fb.bash).withScriptSafetyAssessor(async function(ne){return{result:"completed",commands:[{identifier:ne,readOnly:!1}],possiblePaths:[],hasWriteFileRedirection:!1,canOfferSessionApproval:!1}})},A=await X7e(y,this.logger),f=[];if(this.mcpHost)try{f=await this.mcpHost.getTools(b,this.logger,y.permissions)}catch(ne){this.logger.error(`Failed to get MCP tools: ${ne}`)}let J=[...A,...f].filter(ne=>this.allowedTools?this.allowedTools.includes(ne.name):this.disabledTools?!this.disabledTools.includes(ne.name):!0),X=await cWe(this.workingDir),x={...(H7e()[Z]?.[g.model]??E7e()).supports,reasoning:!0},S=await Hqe({location:X.found?X.gitRoot:"",version:fUe(),currentWorkingDirectory:this.workingDir,parts:{},capabilities:x,toolConfigOverrides:y,tools:J,organizationCustomInstructions:void 0}),le=await this.getChatMessages(),be=le.findLastIndex(ne=>ne.role==="user"),Ae=le.filter(ne=>ne.role==="user").at(-1);if(!Ae)throw new Error("No user message found in session messages after sending prompt");typeof Ae.content=="string"?Ae={...Ae,content:g7({customAgentPrompt:void 0,problemStatement:Ae.content,capabilities:x})}:Ae={...Ae,content:Ae.content.map(ne=>ne.type==="text"?{...ne,text:g7({customAgentPrompt:void 0,problemStatement:ne.text,capabilities:x})}:ne)};let we=le.map((ne,oI)=>oI===be?Ae:ne);await sN(this.hooks?.sessionStart,{timestamp:Date.now(),cwd:this.workingDir,source:"new",initialPrompt:e},this.logger);let Le=new fv(Ae,this.logger),Xe=g.getCompletionWithTools(S,we,J,{failIfInitialInputsTooLong:!1,processors:{preRequest:[Le,this.immediatePromptProcessor,new Rz(this.logger)],onRequestError:[Le]},executeToolsInParallel:!1,abortSignal:this.abortController.signal});for await(let ne of Xe){if(this.abortController.signal.aborted){this.emit("abort",{reason:"user initiated"});break}switch(ne.kind){case"message":{if(S7(ne)){let oI=y7e(ne)?await Promise.all(ne.message.tool_calls.map(async Ye=>{let ze=UX(Ye.function.arguments);l.set(Ye.id,Ye.function.name),n.set(Ye.id,ze);let nl=await sN(this.hooks?.preToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:Ye.function.name,toolArgs:ze},this.logger);return{toolCallId:Ye.id,name:Ye.function.name,arguments:nl?.modifiedArgs??ze}})):[];this.emit("assistant.message",{parentToolCallId:void 0,messageId:va(),content:typeof ne.message.content=="string"?ne.message.content:"",toolRequests:oI});for(let Ye of oI)this.emit("tool.execution_start",{toolCallId:Ye.toolCallId,toolName:Ye.name,arguments:Ye.arguments})}else(ne.message.role==="system"||ne.message.role==="developer")&&this.emit("system.message",{role:ne.message.role,content:typeof ne.message.content=="string"?ne.message.content:JSON.stringify(ne.message.content),name:"name"in ne.message?ne.message.name:void 0});break}case"model_call_failure":{let oI=new Error(ne.modelCall?.error||"Model call failed");await sN(this.hooks?.errorOccurred,{timestamp:Date.now(),cwd:this.workingDir,error:oI,errorContext:"model_call",recoverable:!0},this.logger),this.emit("session.error",{errorType:"model_call",message:oI.message,stack:oI.stack});break}case"tool_execution":{let Ye=(await sN(this.hooks?.postToolUse,{timestamp:Date.now(),cwd:this.workingDir,toolName:l.get(ne.toolCallId)||"unknown",toolArgs:n.get(ne.toolCallId)||{},toolResult:ne.toolResult},this.logger))?.modifiedResult??ne.toolResult,ze=(Ye.resultType==="failure"?Ye.error:void 0)||Ye.sessionLog||Ye.textResultForLlm;this.emit("tool.execution_complete",{parentToolCallId:void 0,toolCallId:ne.toolCallId,success:Ye.resultType==="success",result:Ye.resultType==="success"?{content:ze}:void 0,error:Ye.resultType!=="success"?{message:ze,code:Ye.resultType}:void 0});break}case"turn_started":{this.emit("assistant.turn_start",{turnId:`${ne.turn}`});break}case"turn_ended":{this.emit("assistant.turn_end",{turnId:`${ne.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: ${ne.kind}`);break;default:vm(ne,"Unhandled event type")}}}catch(c){await sN(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 sN(this.hooks?.sessionEnd,{timestamp:Date.now(),cwd:this.workingDir,reason:"complete"},this.logger)}}};function Kdt(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 o of a.tool_calls)l.has(o.id)||I.push(o.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]}var P$=class{sessions;logger;options;lastAccessedSessionId;constructor(e){this.options=e,this.sessions=new Map,this.logger=e.logger||new Vm}async createSession(){let e=new su(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),this.lastAccessedSessionId===e&&(this.lastAccessedSessionId=void 0)}};var Pdt=fe({command:oe(),description:oe(),timeout:Zs().optional(),sessionId:oe().optional(),async:kl().optional()}),qdt=fe({sessionId:oe(),input:oe(),delay:Zs().optional()}),_dt=fe({sessionId:oe(),delay:Zs()}),$dt=fe({sessionId:oe()}),ebt=wa([Pdt,qdt,_dt,$dt]),Ibt=fe({command:gI("view"),path:oe(),view_range:_7([Zs(),Zs()]).optional()}),tbt=fe({command:gI("create"),path:oe(),file_text:oe()}),lbt=fe({command:gI("str_replace"),path:oe(),new_str:oe().optional(),old_str:oe()}),nbt=fe({command:gI("insert"),path:oe(),insert_line:Zs(),new_str:oe()}),cbt=wz("command",[Ibt,tbt,lbt,nbt]),rKl=fe({path:oe(),view_range:_7([Zs(),Zs()]).optional()}),sKl=fe({path:oe(),file_text:oe()}),aKl=fe({path:oe(),old_str:oe(),new_str:oe().optional()}),Y2e=wa([ebt,cbt,eu()]);var OU=fe({type:gI("text"),text:oe()}),sbt=fe({type:gI("refusal"),refusal:oe()}),abt=fe({type:gI("image_url"),image_url:fe({url:oe(),detail:Iu(["auto","low","high"]).optional()})}),obt=fe({type:gI("input_audio"),input_audio:fe({data:oe(),format:gI("wav").or(gI("mp3"))})}),Gbt=fe({type:gI("file"),file:fe({file_date:oe().optional(),file_id:oe().optional(),filename:oe().optional()})}),ibt=wa([OU,abt,obt,Gbt]),dbt=fe({name:oe(),arguments:oe()}),bbt=fe({name:oe(),input:oe()}),mbt=fe({id:oe(),type:gI("function"),function:dbt}),hbt=fe({id:oe(),type:gI("custom"),custom:bbt}),pbt=wa([mbt,hbt]),ubt=fe({name:oe(),arguments:oe()}),Zbt=fe({id:oe()}),Wbt=fe({content:wa([oe(),Ws(OU)]),role:gI("developer"),name:oe().optional()}),Nbt=fe({content:wa([oe(),Ws(OU)]),role:gI("system"),name:oe().optional()}),Ybt=fe({content:wa([oe(),Ws(ibt)]),role:gI("user"),name:oe().optional()}),Vbt=fe({content:wa([oe(),Ws(wa([OU,sbt]))]).nullable().optional(),role:gI("assistant"),name:oe().optional(),refusal:oe().nullable().optional(),audio:Zbt.nullable().optional(),function_call:ubt.nullable().optional(),tool_calls:Ws(pbt).optional()}),Rbt=fe({content:wa([oe(),Ws(OU)]),role:gI("tool"),tool_call_id:oe()}),ybt=fe({content:oe().nullable(),role:gI("function"),name:oe()}),gbt=wa([Wbt,Nbt,Ybt,Vbt,Rbt,ybt]),Fbt=fe({type:gI("copilot"),text:oe(),isStreaming:kl().optional()}),Abt=fe({type:gI("error"),text:oe()}),Qbt=fe({type:gI("info"),text:oe()}),wbt=fe({type:gI("user"),text:oe()}),Xbt=fe({type:gI("tool_call_requested"),callId:oe(),name:oe(),toolTitle:oe().optional(),intentionSummary:oe().nullable(),arguments:Y2e,partialOutput:oe().optional(),isHidden:kl().optional(),isAlwaysExpanded:kl().optional(),showNoContent:kl().optional()}),Ebt=fe({type:gI("tool_call_completed"),callId:oe(),name:oe(),toolTitle:oe().optional(),intentionSummary:oe().nullable(),result:wa([fe({type:gI("success"),log:oe(),markdown:kl().optional()}),fe({type:gI("failure"),log:oe(),markdown:kl().optional()}),fe({type:gI("rejected"),markdown:kl().optional()}),fe({type:gI("denied"),log:oe(),markdown:kl().optional()})]),arguments:Y2e,isHidden:kl().optional(),isAlwaysExpanded:kl().optional(),showNoContent:kl().optional()}),Hbt=wa([Fbt,Abt,Qbt,wbt,Xbt,Ebt]),vbt=Hbt.and(fe({id:oe(),timestamp:$7.date()})),V2e=fe({sessionId:oe(),startTime:$7.date(),chatMessages:Ws(gbt),timeline:Ws(vbt),selectedModel:Iu(g_).optional()}),tR=H_e(V2e.parse,"history-session");var Nr=fe({id:oe().uuid(),timestamp:oe().datetime(),parentId:oe().uuid().nullable(),ephemeral:kl().optional()}),DlI=fe({parentToolCallId:oe().optional()}),Cbt=Nr.extend({type:gI("session.start"),data:fe({sessionId:oe(),version:Zs(),producer:oe(),copilotVersion:oe(),startTime:oe().datetime(),selectedModel:oe().optional()})}),Jbt=Nr.extend({type:gI("session.resume"),data:fe({resumeTime:oe().datetime(),eventCount:Zs()})}),Lbt=Nr.extend({type:gI("session.error"),data:fe({errorType:oe(),message:oe(),stack:oe().optional()})}),fbt=Nr.extend({type:gI("session.info"),data:fe({infoType:oe(),message:oe()})}),kbt=Nr.extend({type:gI("session.model_change"),data:fe({previousModel:oe().optional(),newModel:oe()})}),xbt=Nr.extend({type:gI("session.import_legacy"),data:fe({legacySession:V2e,importTime:oe().datetime(),sourceFile:oe()})}),Bbt=Nr.extend({type:gI("session.idle"),ephemeral:gI(!0),data:fe({})}),zbt=fe({type:Iu(["file","directory"]),path:oe(),displayName:oe()}),Ubt=Nr.extend({type:gI("user.message"),data:fe({content:oe(),attachments:Ws(zbt).optional()})}),Sbt=Nr.extend({type:gI("assistant.turn_start"),data:fe({turnId:oe()})}),Obt=Nr.extend({type:gI("assistant.message"),data:fe({messageId:oe(),content:oe(),toolRequests:Ws(fe({toolCallId:oe(),name:oe(),arguments:eu()})).optional()}).merge(DlI)}),Mbt=Nr.extend({type:gI("assistant.turn_end"),data:fe({turnId:oe()})}),Tbt=Nr.extend({type:gI("assistant.usage"),ephemeral:gI(!0),data:fe({model:oe().optional(),inputTokens:Zs().optional(),outputTokens:Zs().optional(),cost:Zs().optional(),duration:Zs().optional(),initiator:oe().optional()})}),jbt=Nr.extend({type:gI("abort"),data:fe({reason:oe()})}),Dbt=Nr.extend({type:gI("tool.user_requested"),data:fe({toolCallId:oe(),toolName:oe(),arguments:eu()})}),Kbt=Nr.extend({type:gI("tool.execution_start"),data:fe({toolCallId:oe(),toolName:oe(),arguments:eu()})}),Pbt=Nr.extend({type:gI("tool.execution_partial_result"),ephemeral:gI(!0),data:fe({toolCallId:oe(),partialOutput:oe()})}),qbt=Nr.extend({type:gI("tool.execution_complete"),data:fe({toolCallId:oe(),success:kl(),isUserRequested:kl().optional(),result:fe({content:oe()}).optional(),error:fe({message:oe(),code:oe().optional()}).optional()}).merge(DlI)}),_bt=Nr.extend({type:gI("hook.start"),data:fe({hookInvocationId:oe(),hookType:oe(),input:eu()})}),$bt=Nr.extend({type:gI("hook.end"),data:fe({hookInvocationId:oe(),hookType:oe(),output:eu(),success:kl(),error:fe({message:oe(),stack:oe().optional()}).optional()})}),emt=Nr.extend({type:gI("system.message"),data:fe({content:oe(),role:Iu(["system","developer"]),name:oe().optional(),metadata:fe({promptVersion:oe().optional(),variables:Tv(eu()).optional()}).optional()})}),KlI=wz("type",[Cbt,Jbt,Lbt,Bbt,fbt,kbt,xbt,Ubt,Sbt,Obt,Mbt,Tbt,jbt,Dbt,Kbt,Pbt,qbt,_bt,$bt,emt]);var lR=v_e(KlI.parse,"session");var q$=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 lR.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 R2e(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())}}};function PlI(t){if(t.role==="user")return typeof t.content=="string"?t.content:t.content.find(e=>e.type==="text")?.text}async function lmt(t){if(Imt(t))try{return await M2e(t,e=>{if(e.trim())try{let I=JSON.parse(e);if(I.type==="session.import_legacy"){let l=I.data.legacySession.chatMessages.find(n=>n.role==="user");if(l?.content){let n=PlI(l);if(n)return y2e(n)}}if(I.type==="user.message"){let l=I.data.content;if(l)return y2e(l)}return}catch{return}})}catch{return}}function y2e(t){let e=t.lastIndexOf("<reminder>");e!==-1&&(t=t.substring(0,e).trim());let I=t.replace(/\s+/g," ").trim();return I.length>75&&(I=I.substring(0,55).trim()+"..."),I=I.split("").filter(l=>{let n=l.charCodeAt(0);return n>=32&&n!==127}).join(""),I}var g2e=class extends P${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??va(),l=new Date,n=new su(this.options,{sessionId:I,startTime:l});return this.sessionWriters[I]=new q$(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 q$(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 lR.load(e);return await su.fromEvents(I,this.options)}async loadLegacySession(e){let l=(await tR.directoryFiles()).filter(a=>{let o=a.match(/^session_(.+)_(\d+)\.json$/);return o&&o[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 tR.load(n);if(!c)throw new Error(`Failed to load legacy session from ${n}`);let r=new Date(c.startTime),s=new su(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:tR.path(n.replace(/\.json$/,""))}}async listSessions(){let e=await lR.directoryFilesWithMetadata(),I=await tR.directoryFilesWithMetadata(),l=await Promise.all(e.map(async r=>{let s=r.file.replace(".jsonl",""),a=lR.path(s),o=await lmt(a);return{sessionId:s,startTime:r.birthtime,modifiedTime:r.mtime,summary:o}})),n=(await Promise.all(I.map(async r=>{let s=r.file.match(/^session_(.+)_(\d+)\.json$/);if(!s)return null;let a=s[1],o;try{let G=await tR.load(r.file.replace(/\.json$/,""));if(G){let i=G.chatMessages?.find(d=>d.role==="user");if(i?.content){let d=PlI(i);d&&(o=y2e(d))}}}catch{}return{sessionId:a,startTime:r.birthtime,modifiedTime:r.mtime,summary:o}}))).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=lR.path(e);try{await R2e(I),this.logger.info(`Deleted session file ${I}`),await super.deleteSession(e);return}catch{let c=(await tR.directoryFiles()).filter(r=>{let s=r.match(/^session_(.+)_(\d+)\.json$/);return s&&s[1]===e});if(c.length===0)throw new Error(`Session file not found for ${e}`);for(let r of c){let s=tR.path(r.replace(/\.json$/,""));this.logger.info(`Deleting legacy session file ${s}`),await R2e(s)}await super.deleteSession(e)}}async closeSession(e){this.logger.info(`Closing session ${e}`);let I=this.sessionWriters[e];I&&(await I.flush(),I.dispose(),delete this.sessionWriters[e])}getSessionsDirectory(){return tmt(lR.home(),lR.directory())}setLogger(e){this.logger=e}};var F2e=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))}};import{appendFile as nmt,access as cmt,mkdir as rmt}from"fs/promises";import{constants as smt}from"fs";import{dirname as amt}from"path";var A2e=class extends mu{constructor(I,l,n){super(l,n);this.filePath=I;this.writeQueue=omt(amt(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}
1501
+ `;this.writeQueue=this.writeQueue.then(()=>this.performWrite(c)).catch(()=>{})}async performWrite(I){await nmt(this.filePath,I)}};async function omt(t){try{await cmt(t,smt.F_OK)}catch{await rmt(t,{recursive:!0})}}async function jKl(){return f_e}async function*PKl(t){let{prompt:e,...I}=t,l=new su(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{mu as BaseLogger,F2e as CompoundLogger,vR as ConsoleLogger,A2e as FileLogger,Vm as NoopLogger,su as Session,KlI as SessionEventSchema,P$ as SessionManager,Kdt as completeOrphanedToolCalls,sN as executeHooks,jKl as getAvailableModels,qlI as internal,kC as isDebugEnvironment,PKl as query};
1502
1502
  /*! Bundled license information:
1503
1503
 
1504
1504
  tmp/lib/tmp.js: