@github/copilot 0.0.341-5 → 0.0.341-6

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@github/copilot",
3
3
  "description": "GitHub Copilot CLI brings the power of Copilot coding agent directly to your terminal.",
4
- "version": "0.0.341-5",
4
+ "version": "0.0.341-6",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",
@@ -33,7 +33,7 @@
33
33
  "sdk/**/*"
34
34
  ],
35
35
  "buildMetadata": {
36
- "gitCommit": "3f8caa5"
36
+ "gitCommit": "5643ce8"
37
37
  },
38
38
  "dependencies": {
39
39
  "node-pty": "npm:@devm33/node-pty@^1.0.8",
package/sdk/index.js CHANGED
@@ -1241,7 +1241,7 @@ ${zOe()}
1241
1241
 
1242
1242
  <reminder>
1243
1243
  The user may have mentioned images, if so these will have been attached to this message, in the order they were mentioned
1244
- </reminder>`),l.trim()},d6={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."},SOe=t=>`<reminder>You haven't committed any changes yet. Any code changes not meant to be temporary must be made in ${xbe(t)}. Commit changes by using the **report_progress** tool.</reminder>`;G();var nme="/tmp/playwright-logs",E9I="0.0.40",cme=[`@playwright/mcp@${E9I}`,"--viewport-size","1280, 720","--output-dir",nme],HTl=[...cme,"--isolated"];var ame=class t extends Error{constructor(e){super(e),this.name="ImageSizeError",Object.setPrototypeOf(this,t.prototype)}},sme=2e3;async function v9I(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=`${Que(l)}/${t}`;I.info(`Downloading image from ${c}`);try{let s=await fetch(c,{method:"GET",headers:n});if(I.info(`Response status: ${s.status} ${s.statusText}`),I.debug(`Download Response URL: ${s.url}`),!s.ok){I.info(`Failed to download image, status: ${s.status}, statusText: ${s.statusText}`);try{let h=await s.text();I.info(`Error response body: ${h}`)}catch(h){I.info(`Could not read error response body: ${h}`)}return{size:0}}let r=(await s.json()).url;if(!r)return I.error(`No asset URL found in response for image GUID: ${t}`),{size:0};let o=await fetch(r,{method:"GET"});if(!o.ok)return I.error(`Failed to download image: ${o.status} ${o.statusText}`),{size:0};let d=await o.arrayBuffer(),i=d.byteLength;return I.info(`Downloaded content size: ${pm(i)}`),{size:i,buffer:Buffer.from(d),mimeType:o.headers.get("content-type")||void 0}}catch(s){return I.error("Network error downloading image"),s instanceof Error&&(I.info(`Error message: ${s.message}`),I.info(`Error stack: ${s.stack}`)),{size:0}}}function rme(t,e,I,l){let n=/<img\b[^>]*\bsrc="([^"]+)"[^>]*>/g,c=/!\[.*?\]\((.*?)\)/g,s=[];return s.push(...OOe(t,e,n,I,l)),s.push(...OOe(t,e,c,I,l)),s}function OOe(t,e,I,l,n){let c=t.matchAll(I),s=[],a=/\/([a-f0-9-]+)$/;for(let r of c){let o=k9I(r[1],e),d=f9I(r[1],e,n);if(o||d){let i=r[1].match(a),h={url:r[1],guid:"",kind:d?"legacy_attachment":"attachment"};i&&i.length>1&&(h.guid=i[1]),s.push(h)}else if(l){let i={url:r[1],guid:"",kind:"committed_attachment"};s.push(i)}}return s}function C9I(t){return!t.startsWith("http://")&&!t.startsWith("https://")&&dme(t)}function dme(t){return/\.(png|jpe?g|gif|svg|webp|bmp|tiff?|ico|heic|avif)$/i.test(t)}function J9I(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 L9I(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 a=t.path,r=J9.dirname(a);c=J9.resolve("/",r,e).slice(1)}return`${I}/${l}/blob/${n}/${c}`}function k9I(t,e){return e?!!t.startsWith(`${e}/user-attachments/assets`):!1}function f9I(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 ime(t){let{width:e,height:I}=vSe(t);if(e===void 0||I===void 0)throw new Error("Unable to determine image dimensions.");return{width:e,height:I}}async function MOe(t,e,I,l,n,c){t.debug(`Checking if image is valid size and dimensions. Max size: ${I}, Max dimension: ${l}`);let{exceedsSizeLimit:s,exceedsDimensionLimit:a}=await L9(I,l,c);if(!a&&!s)return t.debug("Image is within size and dimension limits."),c;if(a){t.debug(`Image x or y dimension exceeds the maximum limit of ${l}, attempting to resize`);let[r,o]=await z9I(t,c,l,I,n);if(!r){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:d}=await L9(I,l,r);if(d){e.imagesRemovedDueToDimensions++,t.debug("Image dimensions exceed the maximum dimensions limits, skipping");return}return e.imagesResized++,t.debug("Image resized successfully."),r}if(s){t.debug(`Image size ${pm(c.length)} is larger than the maximum size of ${pm(I)}, attempting to reduce image quality`);let r=await U9I(t,c,l,I,n);if(!r){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."),r}}async function L9(t,e,I){let l=await ime(I),n=I.length;return!l.width||!l.height?{exceedsSizeLimit:n>t,exceedsDimensionLimit:!1}:{exceedsSizeLimit:await B9I(t,I),exceedsDimensionLimit:await x9I(e,I)}}async function x9I(t,e){let I=await ime(e);return!I.width||!I.height?!1:I.width>t||I.height>t}async function B9I(t,e){return e.length>t}async function z9I(t,e,I,l,n){try{if(!jOe(t,n))return[void 0,"unsupported_mime_type"];let c=await ime(e);if(!c.width||!c.height)return t.error("Failed to determine size of uploaded image"),[void 0,"determine_dimensions_failed"];let s=async(N,Y)=>{let y=TOe(e).resize(N,Y,{fit:"inside",withoutEnlargement:!0});return Gme(t,await y.toBuffer(),void 0,n)},a=Math.min(I,c.width),r=Math.min(I,c.height),o=await s(a,r);if(o&&o.length<=l)return[o,void 0];let d=Math.max(a,r),i=1,h=d-1,p,Z=0,u=10;for(;i<=h&&Z<u;){let N=Math.floor((i+h)/2),Y=await s(N,N);if(!Y)break;let{exceedsSizeLimit:y,exceedsDimensionLimit:Q}=await L9(l,I,Y);!y&&!Q?(p=Y,i=N+1):h=N-1,Z++}return[p,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 U9I(t,e,I,l,n){try{let c=n==="image/png"?80:100,s=n==="image/png"?Math.floor(c*.4):20,a=await Gme(t,e,s,n);if(!a||a.length>l)return;let r=s,o=c,d,i=0,h=10,p=r,Z=o-1;for(;p<=Z&&i<h;){let u=Math.floor((p+Z)/2),N=await Gme(t,e,u,n);if(!N)return d;let{exceedsSizeLimit:Y,exceedsDimensionLimit:y}=await L9(l,I,N);!Y&&!y?(d=N,p=u+1):Z=u-1,i++}return d}catch(c){t.error(`Failed to reduce image quality: ${c instanceof Error?c.message:String(c)}`);return}}async function Gme(t,e,I,l){let n=TOe(e);switch(l){case"image/png":return I?n.png({quality:I}).toBuffer():n.png().toBuffer();case"image/jpeg":return I?n.jpeg({quality:I}).toBuffer():n.jpeg().toBuffer();default:t.debug(`Unsupported image format: ${l}`);return}}var ome=class{imagesRemovedDueToSize=0;imagesRemovedDueToDimensions=0;imagesResized=0;imagesWithLoweredQuality=0;imagesFailedToResize=0;imagesFailedToReduceQuality=0;base64ImagesSize=[];resizedBase64ImagesSize=[];extractedImagesSize=[];imagesResolvedFromGitHubMCPSize=[];resizeErrorsUnsupportedMimeType=0;resizeErrorsUnknown=0};function S9I(t,e,I,l){if(e<=0)return[];let n=[];for(let c of t){if(c.role!=="user"||n.length>=e)continue;let s=typeof c.content=="string"?c.content:JSON.stringify(c.content),a=J9I(s);if(a)for(let r in a){if(n.length>=e)break;let o=a[r].contents,d=rme(o,I,!0,l);for(let i of d){if(n.length>=e)break;let h=i.url,p="",Z=!1;if(i.kind==="attachment"||i.kind==="legacy_attachment"?n.push(i):C9I(h)?(Z=!0,p=L9I(a[r],h,I),n.push({url:p,guid:i.guid,kind:"committed_attachment"})):dme(h)&&h.startsWith(I)&&(Z=!0,n.push({...i,kind:"committed_attachment"})),Z){let u=n[n.length-1],N=new RegExp(`^${I}/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$`),Y=u.url.match(N);if(l.info(`Blob match for ${u.url}: ${JSON.stringify(Y)}`),Y&&Y.length===5){let[,y,Q,A,w]=Y;u.owner=y,u.repo=Q,u.branch=A,u.path=w,l.info(`Repository metadata extracted: owner=${y}, repo=${Q}, branch=${A}, path=${w}`)}else l.info(`Failed to extract repository metadata from URL: ${u.url}`)}}}}return n}function O9I(t,e){let I=e.flatMap(n=>ay(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 i6=class{async resolveRepositoryImages(e,I,l,n,c,s){if(I<=0)return[];let a=S9I(e,I,l,n);this.logger.debug(`Found ${a.length} repository image URLs to process`);let r=O9I(a,e),o=await this.processImageReferences(r,c,s);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",message:i,turn:e.turn};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,s=0,a=[],r=new ome,o=new Map;for(let i of e.messages)if(i.role=="user")if(typeof i.content=="string"){let h=rme(i.content,this.gitHubServerUrl,!1,this.logger).filter(Z=>!this.processedImageUrls.has(Z.url)),p=await this.processImageReferences(h,c,r);a.push(...p.addedImages)}else{let h=[];for(let[p,Z]of i.content.entries()){if(Z.type==="text"){let u=rme(Z.text,this.gitHubServerUrl,!1,this.logger).filter(Y=>!this.processedImageUrls.has(Y.url)),N=await this.processImageReferences(u,c,r);a.push(...N.addedImages)}else if(Z.type==="image_url"){if(Z.image_url.url.startsWith("data:")){let[u,N]=await this.extractAndUploadImageData(Z,c,r);if(u===""){this.logger.debug("Skipping image upload for empty image data");continue}if(a.push(u),p>=1&&h.length>0){let Y=h.at(-1);Y&&Y.type==="text"&&Y.text&&Y.text.includes("screenshot")&&o.set(u,BOe(u))}h.pop();continue}s++}h.push(Z)}i.content=h}for(this.logger.debug(`Found ${a.length} image urls in the messages`),this.logger.debug(`Allowed number of images: ${n}`);s<n&&a.length>0;){let i=a.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 h=`Here is the image url: ${i}`;o.has(i)&&(h=o.get(i)||h),this.logger.debug(`Adding image url: ${i}`),l.push({role:"user",content:[{type:"text",text:h},{type:"image_url",image_url:{url:i}}]}),s++}if(this.settings.featureFlags?.copilot_swe_agent_resolve_repo_images&&(this.logger.debug("Resolving repository images..."),s<n)){let i=await this.resolveRepositoryImages(e.messages,n-s,this.settings.github?.serverUrl||"",this.logger,c,r);this.logger.debug(`Resolved ${i.length} repository image URLs`);for(let h of i){if(s>=n)break;if(this.processedImageUrls.has(h)){this.logger.debug(`Skipping already processed repository image url: ${h}`);continue}l.push({role:"user",content:[{type:"text",text:"Here is the image url:"},{type:"image_url",image_url:{url:h}}]}),this.processedImageUrls.add(h),s++}}let d={imagesExtractedCount:r.extractedImagesSize.length,base64ImagesCount:r.base64ImagesSize.length,imagesRemovedDueToSize:r.imagesRemovedDueToSize,imagesRemovedDueToDimensions:r.imagesRemovedDueToDimensions,imagesResized:r.imagesResized,imagesResolvedFromGitHubMCPCount:r.imagesResolvedFromGitHubMCPSize.length};for(let i=0;i<r.base64ImagesSize.length;i++)d[`base64ImageSize_${i}`]=r.base64ImagesSize[i];for(let i=0;i<r.resizedBase64ImagesSize.length;i++)d[`resizedBase64ImageSize_${i}`]=r.resizedBase64ImagesSize[i];for(let i=0;i<r.extractedImagesSize.length;i++)d[`extractedImageSize_${i}`]=r.extractedImagesSize[i];for(let i=0;i<r.imagesResolvedFromGitHubMCPSize.length;i++)d[`imagesResolvedFromGitHubMCPSize_${i}`]=r.imagesResolvedFromGitHubMCPSize[i];l.length>0&&this.logger.debug(`Using ${l.length} image messages`);for(let i of l)yield{kind:"message",message:i,turn:e.turn},e.messages.push(i);d.allImagesSendToLlm=e.messages.filter(ay).length,yield{kind:"image_processing",turn:e.turn,imageProcessingMetrics:d},e.messages.some(i=>ay(i))&&(e.additionalRequestHeaders["Copilot-Vision-Request"]="true")}async extractAndUploadImageData(e,I,l){let n=N1(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 s=c[1];if(!jOe(this.logger,s))return[""];let a=c[2];if(a.length===0)return this.logger.debug("Empty base64 image data, skipping"),[""];let r=Buffer.from(a,"base64");if(l.base64ImagesSize.push(r.length),r=await MOe(this.logger,l,I,sme,s,r),l.resizedBase64ImagesSize.push(r?.length??-1),!r)return["",new ame(`Image size exceeds maximum size of ${pm(I)}`)];a=r.toString("base64");try{let o=await this.uploadBase64ImageData(a,s,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 d=o instanceof Error?o.message:String(o);return this.logger.debug(`Error during image upload: ${d}`),[""]}}async uploadBase64ImageData(e,I,l){try{let n=gue(this.settings),c=I.split("/").at(1),s=`image-${Date.now()}.${c}`;if(!e||e.trim()==="")return this.logger.error("Empty image data provided for upload"),null;let a=Buffer.from(e,"base64");if(a.length===0)return this.logger.error("Converted image data has zero length"),null;let r=this.settings.github?.repo?.id;if(!r)return this.logger.error("GitHub repository ID is not configured, cannot upload image"),null;let o=`${n}?name=${encodeURIComponent(s)}&content_type=${encodeURIComponent(I)}&repository_id=${r}`;this.logger.debug(`Uploading image data (${pm(a.length)}) to ${n} with name ${encodeURIComponent(s)} and content type ${encodeURIComponent(I)}`);let d={"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:d,body:a}).catch(p=>{throw p instanceof Error?(this.logger.error(`Failed to upload image: ${p.message}`),p.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):p.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(p.message.includes("request entity too large")||p.message.includes("payload too large"))&&this.logger.error("Request payload too large. Try reducing the image size.")):typeof p=="object"&&p!==null&&"code"in p&&"message"in p?(this.logger.error(`Failed to upload image: ${p.message}`),p.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):p.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(p.message.includes("request entity too large")||p.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(p)}`),this.logger.debug(`Complete error details: ${JSON.stringify({code:p?.code,message:p?.message,stack:p?.stack,name:p?.name,cause:p?.cause},null,2)}`),p});if(!i.ok){let p=await i.text().catch(()=>"Unable to read error response");return this.logger.error(`Failed to upload image: ${i.status} ${i.statusText} - ${p}`),null}let h=await i.json();return this.logger.debug(`Upload result: ${JSON.stringify(h,null,2)}`),h.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},{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:s,attachment:a}of c)if(this.logger.debug(`Processing attachment for ${s.url}, has buffer: ${!!a.buffer}, buffer size: ${a.buffer?.length||0}`),a.buffer)if(I.extractedImagesSize.push(a.buffer.length),Cl(this.settings,"copilot_swe_agent_resize_image_references")){if(!await MOe(this.logger,I,l,sme,a.mimeType,a.buffer)){this.logger.info("Unable to resize image to be within limits, skipping");continue}n.push(s.url)}else{let r=await L9(l,sme,a.buffer);if(this.logger.debug(`Image size check for ${s.url}: size=${a.buffer.length}, maxSize=${l}, exceedsSize=${r.exceedsSizeLimit}, exceedsDimensions=${r.exceedsDimensionLimit}`),r.exceedsSizeLimit?(I.imagesRemovedDueToSize++,this.logger.debug(`Image ${s.url} removed due to size (${a.buffer.length} > ${l})`)):r.exceedsDimensionLimit&&(I.imagesRemovedDueToDimensions++,this.logger.debug(`Image ${s.url} removed due to dimensions`)),r.exceedsSizeLimit||r.exceedsDimensionLimit){this.processedImageUrls.add(s.url),this.logger.info(`Image has been removed from the request due to size constraints. Please resize images to be smaller than ${pm(l)}.`);continue}n.push(s.url),this.logger.debug(`Image ${s.url} passed size checks and added to results`)}else this.processedImageUrls.add(s.url),this.logger.debug(`Skipping image ${s.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(a=>a.url).join(", ")}`);let c=e.filter(a=>!this.processedImageUrls.has(a.url)).map(async a=>{if(this.logger.debug(`Processing image reference: ${JSON.stringify(a,null,2)}`),a.kind==="committed_attachment"){this.logger.debug(`Detected repository image - Owner: ${a.owner}, Repo: ${a.repo}, Branch: ${a.branch}, Path: ${a.path}`);let r=await this.getRepositoryImageViaTools(a);return r?.buffer?(this.logger.debug(`Successfully fetched repository image buffer, size: ${r.buffer.length} bytes`),l.imagesResolvedFromGitHubMCPSize.push(r.buffer.length)):this.logger.debug("Failed to fetch repository image buffer"),{imgRef:a,attachment:{size:r?.buffer?.length||0,mimeType:r?.mimeType||"",buffer:r?.buffer||null}}}else return this.logger.debug(`Non-repository image, using getAttachmentFromGuid for: ${a.url}`),{imgRef:a,attachment:await v9I(a.guid,N1(this.settings),this.logger,this.settings)}}),s=await this.getImgRefsSmallerThanMaxSize(c,l,I);return this.logger.debug(`Processed image references, found ${s.length} attachments smaller than max size of ${pm(I)}`),{addedImages:s}}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(M9I(n,l));if(c.length===0){let s=await D9I(e.toolCall,this.logger);s&&c.push(s)}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*M9I(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 T9I="playwright-browser_take_screenshot";function j9I(t){return typeof t=="object"&&t!==null&&typeof t.filename=="string"}async function D9I(t,e){if(t.function.name!==T9I)return;e.debug("Adding images using Playwright params fallback strategy");let I=JSON.parse(t.function.arguments);if(j9I(I)){let l=J9.isAbsolute(I.filename)?I.filename:J9.join(nme,I.filename);e.debug(`Image from Playwright params: ${I.filename}. Updated to ${l}.`);let n=await P9I(l,e);if(n){let c=n.buffer.toString("base64");return{url:`data:${n.mimeType};base64,${c}`,isScreenshot:!0}}}}function K9I(t){switch(J9.extname(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";default:return null}}function jOe(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 P9I(t,e){try{if(!dme(t))return e.debug(`Image ${t} does not have a valid image extension, skipping read`),null;let I=K9I(t);return I?{buffer:await H9I.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}}G();var XH=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),s=this.latestUserPromptMessage?zke(this.latestUserPromptMessage,e.messages):-1,a=[()=>$9I(e.messages,e.toolDefinitions,e.modelInfo.name,c),s===-1?void 0:()=>exI(e.messages,e.toolDefinitions,e.modelInfo.name,c,s)].filter(d=>d!==void 0),r=0,o;for(;(!o||o.postTruncationTokensInMessages>c)&&r<a.length;){let d=a[r]();o=_9I(o,d),r++}return o=o??IxI(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=q9I(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 s=Math.min(n+t.MAX_TOKEN_LIMIT_BUFFER/e.maxRetries,t.MAX_TOKEN_LIMIT_BUFFER);this.modelToTokenLimit.set(e.modelInfo.name,{tokenLimit:l,tokenLimitBuffer:s}),this.logger.debug(`Adjusted model token limit to ${l}, token limit retry buffer to ${s}`)}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=KZe(e.messages,e.modelInfo.name),n=PZe(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 q9I(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 s=parseInt(I[2],10);return isNaN(s)?e:s}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(s=>s.includes(c)))return e}}function _9I(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 DOe=.95;function $9I(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 s=t.map(p=>EF(p,I)),a=Vi(JSON.stringify(e),I),r=l*DOe,o=s.reduce((p,Z)=>p+Z,0)+a;if(o<=r)return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let d=new Set,i=0,h=Math.min(n??t.length,t.length);for(let p=0;p<h;p++){let Z=t[p];if(Z.role!=="system"&&Z.role!=="tool"&&Z.role!=="user"){if(Z.role==="assistant"){let u=Z.tool_calls||[],N=u.filter(no).filter(A=>A.function.name===FC),Y=u.filter(no).filter(A=>A.function.name!==FC),y=N.length===0,Q=new Set(Y.map(A=>A.id));if(Y.length>0&&(Z.tool_calls=N,s[p]=EF(Z,I)),y&&(d.add(p),i+=s[p]),Q.size>0)for(let A=p+1;A<t.length;A++){let w=t[A];if(w.role==="tool"&&Q.has(w.tool_call_id)&&(d.add(A),i+=s[A],Q.delete(w.tool_call_id),Q.size===0))break}}if(o-i<r)break}}for(let p=t.length-1;p>=0;p--)d.has(p)&&t.splice(p,1);return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o-i,postTruncationMessagesLength:t.length,tokensRemovedDuringTruncation:i,messagesRemovedDuringTruncation:c-t.length}}function exI(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 s=t.map(p=>EF(p,I)),a=Vi(JSON.stringify(e),I),r=l*DOe,o=s.reduce((p,Z)=>p+Z,0)+a;if(o<=r)return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let d=new Set,i=0,h=Math.min(n??t.length,t.length);for(let p=0;p<h;p++){let Z=t[p];if(Z.role!=="system"&&Z.role!=="tool"){if(Z.role==="user")d.add(p),i+=s[p];else if(Z.role==="assistant"){let u=Z.tool_calls||[],N=new Set(u.map(Y=>Y.id));if(d.add(p),i+=s[p],N.size>0)for(let Y=p+1;Y<t.length;Y++){let y=t[Y];if(y.role==="tool"&&N.has(y.tool_call_id)&&(d.add(Y),i+=s[Y],N.delete(y.tool_call_id),N.size===0))break}}if(o-i<r)break}}for(let p=t.length-1;p>=0;p--)d.has(p)&&t.splice(p,1);return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o-i,postTruncationMessagesLength:t.length,tokensRemovedDuringTruncation:i,messagesRemovedDuringTruncation:c-t.length}}function IxI(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(r=>EF(r,I)),s=Vi(JSON.stringify(e),I),a=c.reduce((r,o)=>r+o,0)+s;return{tokenLimit:l,preTruncationTokensInMessages:a,preTruncationMessagesLength:n,postTruncationTokensInMessages:a,postTruncationMessagesLength:n,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0}}G();var oi=class extends bp{constructor(){super()}debug(e){}log(e){}info(e){}notice(e){}warning(e){}error(e){}startGroup(e,I){}endGroup(e){}};G();G();var KOe={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"}]},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 b6(t,e,I){let l=(I||KOe)[t.toLowerCase()],n=new Set;for(;typeof l=="string";){if(n.has(l))return!1;n.add(l),l=KOe[l]}if(!l)return!1;let c=e.toLowerCase();return l.tools.some(s=>s.toolName===c)}var txI="image";var lxI="resource",nxI=60*1e3*2,cxI={timeout:nxI};var bme=class{constructor(e,I,l){this.settings=e;this.logger=I;this.permissions=l}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 d=o.resource;d&&d.blob?c.push({type:lxI,data:d.blob,mimeType:d.mimeType||"application/octet-stream"}):d&&d.text&&(n+=d.text)}else o.type==="image"&&c.push({type:txI,data:o.data,mimeType:o.mimeType});let s=n;if(n==="")this.logger.debug("Tool invocation result is empty or undefined, skipping content filtering."),s=n;else try{let o=JSON.parse(n),d=Zbe(o,I);s=JSON.stringify(d)}catch(o){this.logger.debug(`Unable to parse tool invocation as JSON. Treating it as a string for filtering: ${o}`),s=hbe(n,I)}this.logger.debug(`Tool invocation result: ${s}`);let a={},r=s?_n(s,"output"):"";return e.isToolError?{textResultForLlm:s,resultType:"failure",error:s,sessionLog:r,toolTelemetry:a}:{textResultForLlm:s,binaryResultForLlm:c,resultType:"success",sessionLog:r,toolTelemetry:a}}async loadTools(e){let I=await this.loadToolsFromProvider(e),l={};for(let[n,c]of Object.entries(I)){let s=c.filterMode||"hidden_characters";l[n]={name:c.name,namespacedName:c.namespacedName,title:c.title||c.name,description:c.description,input_schema:c.input_schema,callback:async a=>{let r=I[n].serverName,o=I[n].name,d=I[n].title;if(!this.permissions.requestRequired)return this.invokeTool(n,a,s);let i=await this.permissions.request({kind:"mcp",serverName:r,toolName:o,toolTitle:d,args:a,readOnly:!!c.readOnly});switch(i.kind){case"approved":return this.invokeTool(n,a,s);case"denied-by-rules":return FO(i.rules);case"denied-no-approval-rule-and-could-not-request-from-user":return gO;case"denied-interactively-by-user":return yO;default:vV(i,`Unhandled permission result kind: ${i}`)}},safeForTelemetry:c.safeForTelemetry}}return Object.values(l)}};var k9=class t extends bme{toolIdToClientInfo=new Map;constructor(e,I,l={requestRequired:!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),s=await n.callTool({name:c,arguments:I},void 0,{...cxI,onprogress:a=>{this.logger.info(`Tool ${e} progress: ${JSON.stringify(a)}`)},resetTimeoutOnProgress:!0});if(!Array.isArray(s.content))throw new Error("Expected array of results");return{content:s.content,isToolError:s.error!==void 0&&s.error!==null||s.isError===!0}}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:b6(e.clientName,l.name),inputsNames:!1},this.logger.debug(`Adding tool: ${n}`);let s;e.filterMapping===void 0?s="hidden_characters":typeof e.filterMapping=="object"?s=e.filterMapping[l.name]||"hidden_characters":s=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:s}}return I}static getToolIdFromClientAndToolName(e,I){return`${e}-${I}`}static getToolNameFromIdAndClientName(e,I){return e.substring(I.length+1)}};G();var m6=class{settings;logger;gitHandler;location;commitPriorToCompletionWithTools;jitInstructions;emittedJitInstructions;constructor(e,I,l,n,c,s){this.settings=e,this.logger=I,this.gitHandler=l,this.location=n,this.commitPriorToCompletionWithTools=c,this.jitInstructions=s||{},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 r=BZe(this.settings,a.percentRemainingOfTimeout);r.isWithin&&(!a.whenNoPathsChanged||await l()===0)&&(!n||r.withinMs<n[0])&&(n=[r.withinMs,a.instruction])}let c=n?.[1];if(typeof c=="function"&&(c=c(this.location)),c&&!this.emittedJitInstructions.has(c)){this.logger.debug(`Adding JIT instructions to the history: ${c}`),this.emittedJitInstructions.add(c);let s={role:"user",content:c};e.messages.push(s),yield{kind:"message",message:s,turn:e.turn,source:"jit-instruction"}}}}},hme={remindWhereToDoWork:{instruction:SOe,percentRemainingOfTimeout:1/2,whenNoPathsChanged:!0},completeAsSoonAsPossible:{instruction:d6.completeAsSoonAsPossible,percentRemainingOfTimeout:1/6},commitNow:{instruction:d6.commitNow,percentRemainingOfTimeout:2/15},finalAnswerNeeded:{instruction:d6.finalAnswerNeeded,percentRemainingOfTimeout:1/10}};G();G();function pme(t){if(!t)return Uke;let[e,...I]=t?.split(":")??[t,void 0],l=I.join(":")||void 0;return{agent:e||void 0,model:l||void 0}}G();G();function h6(t){return t.kind==="message"&&t.message.role==="assistant"}function POe(t){return t.kind==="message"&&t.message.role==="user"}function qOe(t){return t.kind==="message"&&t.message.role==="assistant"&&!!t.message.tool_calls}function _Oe(t){return t.kind==="message"&&t.message.role==="tool"}function sxI(t,e){return t.toolCalls.find(I=>I.toolCallId===e)}function axI(t,e){let I=e.function.name;try{let l=JSON.parse(e.function.arguments||"{}"),c=t.find(s=>s.name===I)?.safeForTelemetry||{name:!1,inputsNames:!1};return{toolCallId:e.id,toolName:I,arguments:e.function.arguments,safeForTelemetryToolName:c===!0||c.name?I:v2(I),safeForTelemetryArguments:c===!0||c.inputsNames?fke(l):""}}catch{return{toolCallId:e.id,toolName:I,arguments:e.function.arguments,safeForTelemetryToolName:v2(I),safeForTelemetryArguments:""}}}var p6=class{forAgent;turnDataCache;emittedTurns=new Set;callback;settings;toolsInUse;constructor(e,I,l,n){this.forAgent=e,this.turnDataCache=new Map,this.emittedTurns=new Set,this.callback=I,this.settings=l,this.toolsInUse=n}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:d8(this.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,modelCallDurationMs:e.modelCallDurationMs,api_call_id:e.modelCall.api_id,provider_call_id:e.modelCall.request_id,conversationStructureSummary:xke(e.requestMessages)},e.kind==="model_call_success"&&(l={...l,responsePromptTokens:e.responseUsage?.prompt_tokens,responseCompletionTokens:e.responseUsage?.completion_tokens,responseTotalTokens:e.responseUsage?.total_tokens})):POe(e)&&e.source==="jit-instruction"?l={...l,jitInstructionsAdded:(l?.jitInstructionsAdded??0)+1}:h6(e)&&e.message.tool_calls?l={...l,toolCalls:l.toolCalls.concat(e.message.tool_calls.map(n=>({...axI(this.toolsInUse,n)})))}:_Oe(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:{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:d8(this.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.callback.progress(l)}}async ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(e,I){let l=I.toolCallId,n=sxI(e,l);if(n){let c=I.toolResult,s={kind:"telemetry",telemetry:{event:"tool_call_executed",properties:{...c.toolTelemetry.properties,resultType:c.resultType,toolCallId:l,arguments:n.safeForTelemetryArguments,toolName:n.safeForTelemetryToolName,api_call_id:e.api_call_id},restrictedProperties:{...c.toolTelemetry.restrictedProperties,arguments:n.arguments,result:c.textResultForLlm,toolName:n.toolName,error:c.error},metrics:{...c.toolTelemetry.metrics,durationMs:I.durationMs}}};await this.callback.progress(s)}}};G();G();var f9=class{async*preRequest(e){yield*[]}handleCallbackResponse(e){}getUserMessages(){return[]}clearUserMessages(){}canProcessUserMessages(){return!1}toJSON(){return JSON.stringify({type:"NoopUserMessageProcessor"})}};var Z6=class{constructor(e,I){this.runtimeContext=e;this.customAgentName=I;this.gitHandlers={silent:new $r(new oi,this.runtimeContext.exec),logging:new $r(this.runtimeContext.logger,this.runtimeContext.exec)}}gitHandlers;async agent(e,I,l,n,c,s,a=new f9,r){let o=async(p,Z,u)=>{let N={role:"user",content:p};return await this.runtimeContext.callback?.progress({kind:"message",message:N,turn:0}),await this.runCompletionWithTools(e,I,[...Z??[],N],s,c,{executeToolsInParallel:Cl(this.runtimeContext.settings,"copilot_swe_agent_parallel_tool_execution"),initialTurnCount:u},r,a)},d=n,i=l??[],h;for(;d;){let p=await o(d,i,h);h=p.finalTurnCount,i=p.messages,d=await r?.onResult(p.postCompletionWithToolsCommitHash)}for(let p of s)if(p.shutdown){let Z=await p.shutdown();Z&&await this.runtimeContext.callback?.progress(Z)}return{finalTurnCount:h||0,messages:i}}async runCompletionWithTools(e,I,l,n,c,s,a,r=new f9){let o=this.runtimeContext.callback?new p6("sweagent-capi",this.runtimeContext.callback,this.runtimeContext.settings,n):void 0,d=this.gitHandlers.logging,i=await d.getCurrentCommitHash(e),h=l.filter(Q=>Q.role==="user").at(-1),p=this.createCompletionWithToolsProcessors(e,i,n,r,c,a,h),Z=this.runtimeContext.client.getCompletionWithTools(I,l,n,{...s,processors:p}),u=0,N=[...l],Y=[];for await(let Q of Z){if(Cl(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")){let A=await this.runtimeContext.callback?.progress(Q,{accepts_user_messages:r.canProcessUserMessages()});r.handleCallbackResponse(A)}else Q.kind==="response"||Q.kind==="message"?await this.runtimeContext.callback?.progress({...Q,customAgentName:this.customAgentName}):await this.runtimeContext.callback?.progress(Q);o&&await o.ingestEvent(Q),(Q.kind==="message"||Q.kind==="response")&&(Q.kind==="message"&&N.push(Q.message),Q.kind==="response"&&Y.push(Q.response),u=Math.max(u,Q.turn??0))}let y=await d.getCurrentCommitHash(e);return{finalTurnCount:u,messages:N,resultMessages:Y,preCompletionWithToolsCommitHash:i,postCompletionWithToolsCommitHash:y}}createCompletionWithToolsProcessors(e,I,l,n,c,s,a){let r=new i6(this.runtimeContext.logger,this.runtimeContext.settings,l.find(h=>h.name==="github-mcp-server-get_file_contents")),o=new m6(this.runtimeContext.settings,this.runtimeContext.logger,this.gitHandlers.silent,e,I,c),d=new XH(a,this.runtimeContext.logger),i=[o,r,d];return Cl(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")&&i.push(n),{preRequest:i.filter(h=>h!==void 0),preToolsExecution:[s].filter(h=>h!==void 0),postToolExecution:[r,s].filter(h=>h!==void 0),onRequestError:[r,d].filter(h=>h!==void 0)}}};G();async function Zme(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 eMe=t=>Cl(t,"copilot_swe_agent_search")||xZe(t,"SearchAgentExperiment")==="enabled",$Oe="search";function ume(t){return t!==null&&typeof t=="object"&&"question"in t&&"reason"in t&&"searchCommand"in t}var rxI=(t,e,I)=>`
1244
+ </reminder>`),l.trim()},d6={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."},SOe=t=>`<reminder>You haven't committed any changes yet. Any code changes not meant to be temporary must be made in ${xbe(t)}. Commit changes by using the **report_progress** tool.</reminder>`;G();var nme="/tmp/playwright-logs",E9I="0.0.40",cme=[`@playwright/mcp@${E9I}`,"--viewport-size","1280, 720","--output-dir",nme],HTl=[...cme,"--isolated"];var ame=class t extends Error{constructor(e){super(e),this.name="ImageSizeError",Object.setPrototypeOf(this,t.prototype)}},sme=2e3;async function v9I(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=`${Que(l)}/${t}`;I.info(`Downloading image from ${c}`);try{let s=await fetch(c,{method:"GET",headers:n});if(I.info(`Response status: ${s.status} ${s.statusText}`),I.debug(`Download Response URL: ${s.url}`),!s.ok){I.info(`Failed to download image, status: ${s.status}, statusText: ${s.statusText}`);try{let h=await s.text();I.info(`Error response body: ${h}`)}catch(h){I.info(`Could not read error response body: ${h}`)}return{size:0}}let r=(await s.json()).url;if(!r)return I.error(`No asset URL found in response for image GUID: ${t}`),{size:0};let o=await fetch(r,{method:"GET"});if(!o.ok)return I.error(`Failed to download image: ${o.status} ${o.statusText}`),{size:0};let d=await o.arrayBuffer(),i=d.byteLength;return I.info(`Downloaded content size: ${pm(i)}`),{size:i,buffer:Buffer.from(d),mimeType:o.headers.get("content-type")||void 0}}catch(s){return I.error("Network error downloading image"),s instanceof Error&&(I.info(`Error message: ${s.message}`),I.info(`Error stack: ${s.stack}`)),{size:0}}}function rme(t,e,I,l){let n=/<img\b[^>]*\bsrc="([^"]+)"[^>]*>/g,c=/!\[.*?\]\((.*?)\)/g,s=[];return s.push(...OOe(t,e,n,I,l)),s.push(...OOe(t,e,c,I,l)),s}function OOe(t,e,I,l,n){let c=t.matchAll(I),s=[],a=/\/([a-f0-9-]+)$/;for(let r of c){let o=k9I(r[1],e),d=f9I(r[1],e,n);if(o||d){let i=r[1].match(a),h={url:r[1],guid:"",kind:d?"legacy_attachment":"attachment"};i&&i.length>1&&(h.guid=i[1]),s.push(h)}else if(l){let i={url:r[1],guid:"",kind:"committed_attachment"};s.push(i)}}return s}function C9I(t){return!t.startsWith("http://")&&!t.startsWith("https://")&&dme(t)}function dme(t){return/\.(png|jpe?g|gif|svg|webp|bmp|tiff?|ico|heic|avif)$/i.test(t)}function J9I(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 L9I(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 a=t.path,r=J9.dirname(a);c=J9.resolve("/",r,e).slice(1)}return`${I}/${l}/blob/${n}/${c}`}function k9I(t,e){return e?!!t.startsWith(`${e}/user-attachments/assets`):!1}function f9I(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 ime(t){let{width:e,height:I}=vSe(t);if(e===void 0||I===void 0)throw new Error("Unable to determine image dimensions.");return{width:e,height:I}}async function MOe(t,e,I,l,n,c){t.debug(`Checking if image is valid size and dimensions. Max size: ${I}, Max dimension: ${l}`);let{exceedsSizeLimit:s,exceedsDimensionLimit:a}=await L9(I,l,c);if(!a&&!s)return t.debug("Image is within size and dimension limits."),c;if(a){t.debug(`Image x or y dimension exceeds the maximum limit of ${l}, attempting to resize`);let[r,o]=await z9I(t,c,l,I,n);if(!r){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:d}=await L9(I,l,r);if(d){e.imagesRemovedDueToDimensions++,t.debug("Image dimensions exceed the maximum dimensions limits, skipping");return}return e.imagesResized++,t.debug("Image resized successfully."),r}if(s){t.debug(`Image size ${pm(c.length)} is larger than the maximum size of ${pm(I)}, attempting to reduce image quality`);let r=await U9I(t,c,l,I,n);if(!r){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."),r}}async function L9(t,e,I){let l=await ime(I),n=I.length;return!l.width||!l.height?{exceedsSizeLimit:n>t,exceedsDimensionLimit:!1}:{exceedsSizeLimit:await B9I(t,I),exceedsDimensionLimit:await x9I(e,I)}}async function x9I(t,e){let I=await ime(e);return!I.width||!I.height?!1:I.width>t||I.height>t}async function B9I(t,e){return e.length>t}async function z9I(t,e,I,l,n){try{if(!jOe(t,n))return[void 0,"unsupported_mime_type"];let c=await ime(e);if(!c.width||!c.height)return t.error("Failed to determine size of uploaded image"),[void 0,"determine_dimensions_failed"];let s=async(N,Y)=>{let y=TOe(e).resize(N,Y,{fit:"inside",withoutEnlargement:!0});return Gme(t,await y.toBuffer(),void 0,n)},a=Math.min(I,c.width),r=Math.min(I,c.height),o=await s(a,r);if(o&&o.length<=l)return[o,void 0];let d=Math.max(a,r),i=1,h=d-1,p,Z=0,u=10;for(;i<=h&&Z<u;){let N=Math.floor((i+h)/2),Y=await s(N,N);if(!Y)break;let{exceedsSizeLimit:y,exceedsDimensionLimit:Q}=await L9(l,I,Y);!y&&!Q?(p=Y,i=N+1):h=N-1,Z++}return[p,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 U9I(t,e,I,l,n){try{let c=n==="image/png"?80:100,s=n==="image/png"?Math.floor(c*.4):20,a=await Gme(t,e,s,n);if(!a||a.length>l)return;let r=s,o=c,d,i=0,h=10,p=r,Z=o-1;for(;p<=Z&&i<h;){let u=Math.floor((p+Z)/2),N=await Gme(t,e,u,n);if(!N)return d;let{exceedsSizeLimit:Y,exceedsDimensionLimit:y}=await L9(l,I,N);!Y&&!y?(d=N,p=u+1):Z=u-1,i++}return d}catch(c){t.error(`Failed to reduce image quality: ${c instanceof Error?c.message:String(c)}`);return}}async function Gme(t,e,I,l){let n=TOe(e);switch(l){case"image/png":return I?n.png({quality:I}).toBuffer():n.png().toBuffer();case"image/jpeg":return I?n.jpeg({quality:I}).toBuffer():n.jpeg().toBuffer();default:t.debug(`Unsupported image format: ${l}`);return}}var ome=class{imagesRemovedDueToSize=0;imagesRemovedDueToDimensions=0;imagesResized=0;imagesWithLoweredQuality=0;imagesFailedToResize=0;imagesFailedToReduceQuality=0;base64ImagesSize=[];resizedBase64ImagesSize=[];extractedImagesSize=[];imagesResolvedFromGitHubMCPSize=[];resizeErrorsUnsupportedMimeType=0;resizeErrorsUnknown=0};function S9I(t,e,I,l){if(e<=0)return[];let n=[];for(let c of t){if(c.role!=="user"||n.length>=e)continue;let s=typeof c.content=="string"?c.content:JSON.stringify(c.content),a=J9I(s);if(a)for(let r in a){if(n.length>=e)break;let o=a[r].contents,d=rme(o,I,!0,l);for(let i of d){if(n.length>=e)break;let h=i.url,p="",Z=!1;if(i.kind==="attachment"||i.kind==="legacy_attachment"?n.push(i):C9I(h)?(Z=!0,p=L9I(a[r],h,I),n.push({url:p,guid:i.guid,kind:"committed_attachment"})):dme(h)&&h.startsWith(I)&&(Z=!0,n.push({...i,kind:"committed_attachment"})),Z){let u=n[n.length-1],N=new RegExp(`^${I}/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$`),Y=u.url.match(N);if(l.info(`Blob match for ${u.url}: ${JSON.stringify(Y)}`),Y&&Y.length===5){let[,y,Q,A,w]=Y;u.owner=y,u.repo=Q,u.branch=A,u.path=w,l.info(`Repository metadata extracted: owner=${y}, repo=${Q}, branch=${A}, path=${w}`)}else l.info(`Failed to extract repository metadata from URL: ${u.url}`)}}}}return n}function O9I(t,e){let I=e.flatMap(n=>ay(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 i6=class{async resolveRepositoryImages(e,I,l,n,c,s){if(I<=0)return[];let a=S9I(e,I,l,n);this.logger.debug(`Found ${a.length} repository image URLs to process`);let r=O9I(a,e),o=await this.processImageReferences(r,c,s);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",message:i,turn:e.turn};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,s=0,a=[],r=new ome,o=new Map;for(let i of e.messages)if(i.role=="user")if(typeof i.content=="string"){let h=rme(i.content,this.gitHubServerUrl,!1,this.logger).filter(Z=>!this.processedImageUrls.has(Z.url)),p=await this.processImageReferences(h,c,r);a.push(...p.addedImages)}else{let h=[];for(let[p,Z]of i.content.entries()){if(Z.type==="text"){let u=rme(Z.text,this.gitHubServerUrl,!1,this.logger).filter(Y=>!this.processedImageUrls.has(Y.url)),N=await this.processImageReferences(u,c,r);a.push(...N.addedImages)}else if(Z.type==="image_url"){if(Z.image_url.url.startsWith("data:")){let[u,N]=await this.extractAndUploadImageData(Z,c,r);if(u===""){this.logger.debug("Skipping image upload for empty image data");continue}if(a.push(u),p>=1&&h.length>0){let Y=h.at(-1);Y&&Y.type==="text"&&Y.text&&Y.text.includes("screenshot")&&o.set(u,BOe(u))}h.pop();continue}s++}h.push(Z)}i.content=h}for(this.logger.debug(`Found ${a.length} image urls in the messages`),this.logger.debug(`Allowed number of images: ${n}`);s<n&&a.length>0;){let i=a.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 h=`Here is the image url: ${i}`;o.has(i)&&(h=o.get(i)||h),this.logger.debug(`Adding image url: ${i}`),l.push({role:"user",content:[{type:"text",text:h},{type:"image_url",image_url:{url:i}}]}),s++}if(this.settings.featureFlags?.copilot_swe_agent_resolve_repo_images&&(this.logger.debug("Resolving repository images..."),s<n)){let i=await this.resolveRepositoryImages(e.messages,n-s,this.settings.github?.serverUrl||"",this.logger,c,r);this.logger.debug(`Resolved ${i.length} repository image URLs`);for(let h of i){if(s>=n)break;if(this.processedImageUrls.has(h)){this.logger.debug(`Skipping already processed repository image url: ${h}`);continue}l.push({role:"user",content:[{type:"text",text:"Here is the image url:"},{type:"image_url",image_url:{url:h}}]}),this.processedImageUrls.add(h),s++}}let d={imagesExtractedCount:r.extractedImagesSize.length,base64ImagesCount:r.base64ImagesSize.length,imagesRemovedDueToSize:r.imagesRemovedDueToSize,imagesRemovedDueToDimensions:r.imagesRemovedDueToDimensions,imagesResized:r.imagesResized,imagesResolvedFromGitHubMCPCount:r.imagesResolvedFromGitHubMCPSize.length};for(let i=0;i<r.base64ImagesSize.length;i++)d[`base64ImageSize_${i}`]=r.base64ImagesSize[i];for(let i=0;i<r.resizedBase64ImagesSize.length;i++)d[`resizedBase64ImageSize_${i}`]=r.resizedBase64ImagesSize[i];for(let i=0;i<r.extractedImagesSize.length;i++)d[`extractedImageSize_${i}`]=r.extractedImagesSize[i];for(let i=0;i<r.imagesResolvedFromGitHubMCPSize.length;i++)d[`imagesResolvedFromGitHubMCPSize_${i}`]=r.imagesResolvedFromGitHubMCPSize[i];l.length>0&&this.logger.debug(`Using ${l.length} image messages`);for(let i of l)yield{kind:"message",message:i,turn:e.turn},e.messages.push(i);d.allImagesSendToLlm=e.messages.filter(ay).length,yield{kind:"image_processing",turn:e.turn,imageProcessingMetrics:d},e.messages.some(i=>ay(i))&&(e.additionalRequestHeaders["Copilot-Vision-Request"]="true")}async extractAndUploadImageData(e,I,l){let n=N1(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 s=c[1];if(!jOe(this.logger,s))return[""];let a=c[2];if(a.length===0)return this.logger.debug("Empty base64 image data, skipping"),[""];let r=Buffer.from(a,"base64");if(l.base64ImagesSize.push(r.length),r=await MOe(this.logger,l,I,sme,s,r),l.resizedBase64ImagesSize.push(r?.length??-1),!r)return["",new ame(`Image size exceeds maximum size of ${pm(I)}`)];a=r.toString("base64");try{let o=await this.uploadBase64ImageData(a,s,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 d=o instanceof Error?o.message:String(o);return this.logger.debug(`Error during image upload: ${d}`),[""]}}async uploadBase64ImageData(e,I,l){try{let n=gue(this.settings),c=I.split("/").at(1),s=`image-${Date.now()}.${c}`;if(!e||e.trim()==="")return this.logger.error("Empty image data provided for upload"),null;let a=Buffer.from(e,"base64");if(a.length===0)return this.logger.error("Converted image data has zero length"),null;let r=this.settings.github?.repo?.id;if(!r)return this.logger.error("GitHub repository ID is not configured, cannot upload image"),null;let o=`${n}?name=${encodeURIComponent(s)}&content_type=${encodeURIComponent(I)}&repository_id=${r}`;this.logger.debug(`Uploading image data (${pm(a.length)}) to ${n} with name ${encodeURIComponent(s)} and content type ${encodeURIComponent(I)}`);let d={"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:d,body:a}).catch(p=>{throw p instanceof Error?(this.logger.error(`Failed to upload image: ${p.message}`),p.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):p.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(p.message.includes("request entity too large")||p.message.includes("payload too large"))&&this.logger.error("Request payload too large. Try reducing the image size.")):typeof p=="object"&&p!==null&&"code"in p&&"message"in p?(this.logger.error(`Failed to upload image: ${p.message}`),p.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):p.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(p.message.includes("request entity too large")||p.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(p)}`),this.logger.debug(`Complete error details: ${JSON.stringify({code:p?.code,message:p?.message,stack:p?.stack,name:p?.name,cause:p?.cause},null,2)}`),p});if(!i.ok){let p=await i.text().catch(()=>"Unable to read error response");return this.logger.error(`Failed to upload image: ${i.status} ${i.statusText} - ${p}`),null}let h=await i.json();return this.logger.debug(`Upload result: ${JSON.stringify(h,null,2)}`),h.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},{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:s,attachment:a}of c)if(this.logger.debug(`Processing attachment for ${s.url}, has buffer: ${!!a.buffer}, buffer size: ${a.buffer?.length||0}`),a.buffer)if(I.extractedImagesSize.push(a.buffer.length),Cl(this.settings,"copilot_swe_agent_resize_image_references")){if(!await MOe(this.logger,I,l,sme,a.mimeType,a.buffer)){this.logger.info("Unable to resize image to be within limits, skipping");continue}n.push(s.url)}else{let r=await L9(l,sme,a.buffer);if(this.logger.debug(`Image size check for ${s.url}: size=${a.buffer.length}, maxSize=${l}, exceedsSize=${r.exceedsSizeLimit}, exceedsDimensions=${r.exceedsDimensionLimit}`),r.exceedsSizeLimit?(I.imagesRemovedDueToSize++,this.logger.debug(`Image ${s.url} removed due to size (${a.buffer.length} > ${l})`)):r.exceedsDimensionLimit&&(I.imagesRemovedDueToDimensions++,this.logger.debug(`Image ${s.url} removed due to dimensions`)),r.exceedsSizeLimit||r.exceedsDimensionLimit){this.processedImageUrls.add(s.url),this.logger.info(`Image has been removed from the request due to size constraints. Please resize images to be smaller than ${pm(l)}.`);continue}n.push(s.url),this.logger.debug(`Image ${s.url} passed size checks and added to results`)}else this.processedImageUrls.add(s.url),this.logger.debug(`Skipping image ${s.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(a=>a.url).join(", ")}`);let c=e.filter(a=>!this.processedImageUrls.has(a.url)).map(async a=>{if(this.logger.debug(`Processing image reference: ${JSON.stringify(a,null,2)}`),a.kind==="committed_attachment"){this.logger.debug(`Detected repository image - Owner: ${a.owner}, Repo: ${a.repo}, Branch: ${a.branch}, Path: ${a.path}`);let r=await this.getRepositoryImageViaTools(a);return r?.buffer?(this.logger.debug(`Successfully fetched repository image buffer, size: ${r.buffer.length} bytes`),l.imagesResolvedFromGitHubMCPSize.push(r.buffer.length)):this.logger.debug("Failed to fetch repository image buffer"),{imgRef:a,attachment:{size:r?.buffer?.length||0,mimeType:r?.mimeType||"",buffer:r?.buffer||null}}}else return this.logger.debug(`Non-repository image, using getAttachmentFromGuid for: ${a.url}`),{imgRef:a,attachment:await v9I(a.guid,N1(this.settings),this.logger,this.settings)}}),s=await this.getImgRefsSmallerThanMaxSize(c,l,I);return this.logger.debug(`Processed image references, found ${s.length} attachments smaller than max size of ${pm(I)}`),{addedImages:s}}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(M9I(n,l));if(c.length===0){let s=await D9I(e.toolCall,this.logger);s&&c.push(s)}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*M9I(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 T9I="playwright-browser_take_screenshot";function j9I(t){return typeof t=="object"&&t!==null&&typeof t.filename=="string"}async function D9I(t,e){if(t.function.name!==T9I)return;e.debug("Adding images using Playwright params fallback strategy");let I=JSON.parse(t.function.arguments);if(j9I(I)){let l=J9.isAbsolute(I.filename)?I.filename:J9.join(nme,I.filename);e.debug(`Image from Playwright params: ${I.filename}. Updated to ${l}.`);let n=await P9I(l,e);if(n){let c=n.buffer.toString("base64");return{url:`data:${n.mimeType};base64,${c}`,isScreenshot:!0}}}}function K9I(t){switch(J9.extname(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";default:return null}}function jOe(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 P9I(t,e){try{if(!dme(t))return e.debug(`Image ${t} does not have a valid image extension, skipping read`),null;let I=K9I(t);return I?{buffer:await H9I.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}}G();var XH=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),s=this.latestUserPromptMessage?zke(this.latestUserPromptMessage,e.messages):-1,a=[()=>$9I(e.messages,e.toolDefinitions,e.modelInfo.name,c),s===-1?void 0:()=>exI(e.messages,e.toolDefinitions,e.modelInfo.name,c,s)].filter(d=>d!==void 0),r=0,o;for(;(!o||o.postTruncationTokensInMessages>c)&&r<a.length;){let d=a[r]();o=_9I(o,d),r++}return o=o??IxI(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=q9I(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 s=Math.min(n+t.MAX_TOKEN_LIMIT_BUFFER/e.maxRetries,t.MAX_TOKEN_LIMIT_BUFFER);this.modelToTokenLimit.set(e.modelInfo.name,{tokenLimit:l,tokenLimitBuffer:s}),this.logger.debug(`Adjusted model token limit to ${l}, token limit retry buffer to ${s}`)}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=KZe(e.messages,e.modelInfo.name),n=PZe(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 q9I(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 s=parseInt(I[2],10);return isNaN(s)?e:s}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(s=>s.includes(c)))return e}}function _9I(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 DOe=.95;function $9I(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 s=t.map(p=>EF(p,I)),a=Vi(JSON.stringify(e),I),r=l*DOe,o=s.reduce((p,Z)=>p+Z,0)+a;if(o<=r)return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let d=new Set,i=0,h=Math.min(n??t.length,t.length);for(let p=0;p<h;p++){let Z=t[p];if(Z.role!=="system"&&Z.role!=="tool"&&Z.role!=="user"){if(Z.role==="assistant"){let u=Z.tool_calls||[],N=u.filter(no).filter(A=>A.function.name===FC),Y=u.filter(no).filter(A=>A.function.name!==FC),y=N.length===0,Q=new Set(Y.map(A=>A.id));if(Y.length>0&&(Z.tool_calls=N,s[p]=EF(Z,I)),y&&(d.add(p),i+=s[p]),Q.size>0)for(let A=p+1;A<t.length;A++){let w=t[A];if(w.role==="tool"&&Q.has(w.tool_call_id)&&(d.add(A),i+=s[A],Q.delete(w.tool_call_id),Q.size===0))break}}if(o-i<r)break}}for(let p=t.length-1;p>=0;p--)d.has(p)&&t.splice(p,1);return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o-i,postTruncationMessagesLength:t.length,tokensRemovedDuringTruncation:i,messagesRemovedDuringTruncation:c-t.length}}function exI(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 s=t.map(p=>EF(p,I)),a=Vi(JSON.stringify(e),I),r=l*DOe,o=s.reduce((p,Z)=>p+Z,0)+a;if(o<=r)return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o,postTruncationMessagesLength:c,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let d=new Set,i=0,h=Math.min(n??t.length,t.length);for(let p=0;p<h;p++){let Z=t[p];if(Z.role!=="system"&&Z.role!=="tool"){if(Z.role==="user")d.add(p),i+=s[p];else if(Z.role==="assistant"){let u=Z.tool_calls||[],N=new Set(u.map(Y=>Y.id));if(d.add(p),i+=s[p],N.size>0)for(let Y=p+1;Y<t.length;Y++){let y=t[Y];if(y.role==="tool"&&N.has(y.tool_call_id)&&(d.add(Y),i+=s[Y],N.delete(y.tool_call_id),N.size===0))break}}if(o-i<r)break}}for(let p=t.length-1;p>=0;p--)d.has(p)&&t.splice(p,1);return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:c,postTruncationTokensInMessages:o-i,postTruncationMessagesLength:t.length,tokensRemovedDuringTruncation:i,messagesRemovedDuringTruncation:c-t.length}}function IxI(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(r=>EF(r,I)),s=Vi(JSON.stringify(e),I),a=c.reduce((r,o)=>r+o,0)+s;return{tokenLimit:l,preTruncationTokensInMessages:a,preTruncationMessagesLength:n,postTruncationTokensInMessages:a,postTruncationMessagesLength:n,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0}}G();var oi=class extends bp{constructor(){super()}debug(e){}log(e){}info(e){}notice(e){}warning(e){}error(e){}startGroup(e,I){}endGroup(e){}};G();G();var KOe={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"}]},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 b6(t,e,I){let l=(I||KOe)[t.toLowerCase()],n=new Set;for(;typeof l=="string";){if(n.has(l))return!1;n.add(l),l=KOe[l]}if(!l)return!1;let c=e.toLowerCase();return l.tools.some(s=>s.toolName===c)}var txI="image";var lxI="resource",nxI=60*1e3*2,cxI={timeout:nxI};var bme=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 d=o.resource;d&&d.blob?c.push({type:lxI,data:d.blob,mimeType:d.mimeType||"application/octet-stream"}):d&&d.text&&(n+=d.text)}else o.type==="image"&&c.push({type:txI,data:o.data,mimeType:o.mimeType});let s=n;if(n==="")this.logger.debug("Tool invocation result is empty or undefined, skipping content filtering."),s=n;else try{let o=JSON.parse(n),d=Zbe(o,I);s=JSON.stringify(d)}catch(o){this.logger.debug(`Unable to parse tool invocation as JSON. Treating it as a string for filtering: ${o}`),s=hbe(n,I)}this.logger.debug(`Tool invocation result: ${s}`);let a={},r=s?_n(s,"output"):"";return e.isToolError?{textResultForLlm:s,resultType:"failure",error:s,sessionLog:r,toolTelemetry:a}:{textResultForLlm:s,binaryResultForLlm:c,resultType:"success",sessionLog:r,toolTelemetry:a}}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 s={};for(let[a,r]of Object.entries(c)){let o=r.filterMode||"hidden_characters";s[a]={name:r.name,namespacedName:r.namespacedName,title:r.title||r.name,description:r.description,input_schema:r.input_schema,callback:async d=>{let i=c[a].serverName,h=c[a].name,p=c[a].title;if(!I.requestRequired)return this.invokeTool(a,d,o);let Z=await I.request({kind:"mcp",serverName:i,toolName:h,toolTitle:p,args:d,readOnly:!!r.readOnly});switch(Z.kind){case"approved":return this.invokeTool(a,d,o);case"denied-by-rules":return FO(Z.rules);case"denied-no-approval-rule-and-could-not-request-from-user":return gO;case"denied-interactively-by-user":return yO;default:vV(Z,`Unhandled permission result kind: ${Z}`)}},safeForTelemetry:r.safeForTelemetry}}return Object.values(s)}};var k9=class t extends bme{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),s=await n.callTool({name:c,arguments:I},void 0,{...cxI,onprogress:a=>{this.logger.info(`Tool ${e} progress: ${JSON.stringify(a)}`)},resetTimeoutOnProgress:!0});if(!Array.isArray(s.content))throw new Error("Expected array of results");return{content:s.content,isToolError:s.error!==void 0&&s.error!==null||s.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:b6(e.clientName,l.name),inputsNames:!1},this.logger.debug(`Adding tool: ${n}`);let s;e.filterMapping===void 0?s="hidden_characters":typeof e.filterMapping=="object"?s=e.filterMapping[l.name]||"hidden_characters":s=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:s}}return I}static getToolIdFromClientAndToolName(e,I){return`${e}-${I}`}static getToolNameFromIdAndClientName(e,I){return e.substring(I.length+1)}};G();var m6=class{settings;logger;gitHandler;location;commitPriorToCompletionWithTools;jitInstructions;emittedJitInstructions;constructor(e,I,l,n,c,s){this.settings=e,this.logger=I,this.gitHandler=l,this.location=n,this.commitPriorToCompletionWithTools=c,this.jitInstructions=s||{},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 r=BZe(this.settings,a.percentRemainingOfTimeout);r.isWithin&&(!a.whenNoPathsChanged||await l()===0)&&(!n||r.withinMs<n[0])&&(n=[r.withinMs,a.instruction])}let c=n?.[1];if(typeof c=="function"&&(c=c(this.location)),c&&!this.emittedJitInstructions.has(c)){this.logger.debug(`Adding JIT instructions to the history: ${c}`),this.emittedJitInstructions.add(c);let s={role:"user",content:c};e.messages.push(s),yield{kind:"message",message:s,turn:e.turn,source:"jit-instruction"}}}}},hme={remindWhereToDoWork:{instruction:SOe,percentRemainingOfTimeout:1/2,whenNoPathsChanged:!0},completeAsSoonAsPossible:{instruction:d6.completeAsSoonAsPossible,percentRemainingOfTimeout:1/6},commitNow:{instruction:d6.commitNow,percentRemainingOfTimeout:2/15},finalAnswerNeeded:{instruction:d6.finalAnswerNeeded,percentRemainingOfTimeout:1/10}};G();G();function pme(t){if(!t)return Uke;let[e,...I]=t?.split(":")??[t,void 0],l=I.join(":")||void 0;return{agent:e||void 0,model:l||void 0}}G();G();function h6(t){return t.kind==="message"&&t.message.role==="assistant"}function POe(t){return t.kind==="message"&&t.message.role==="user"}function qOe(t){return t.kind==="message"&&t.message.role==="assistant"&&!!t.message.tool_calls}function _Oe(t){return t.kind==="message"&&t.message.role==="tool"}function sxI(t,e){return t.toolCalls.find(I=>I.toolCallId===e)}function axI(t,e){let I=e.function.name;try{let l=JSON.parse(e.function.arguments||"{}"),c=t.find(s=>s.name===I)?.safeForTelemetry||{name:!1,inputsNames:!1};return{toolCallId:e.id,toolName:I,arguments:e.function.arguments,safeForTelemetryToolName:c===!0||c.name?I:v2(I),safeForTelemetryArguments:c===!0||c.inputsNames?fke(l):""}}catch{return{toolCallId:e.id,toolName:I,arguments:e.function.arguments,safeForTelemetryToolName:v2(I),safeForTelemetryArguments:""}}}var p6=class{forAgent;turnDataCache;emittedTurns=new Set;callback;settings;toolsInUse;constructor(e,I,l,n){this.forAgent=e,this.turnDataCache=new Map,this.emittedTurns=new Set,this.callback=I,this.settings=l,this.toolsInUse=n}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:d8(this.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,modelCallDurationMs:e.modelCallDurationMs,api_call_id:e.modelCall.api_id,provider_call_id:e.modelCall.request_id,conversationStructureSummary:xke(e.requestMessages)},e.kind==="model_call_success"&&(l={...l,responsePromptTokens:e.responseUsage?.prompt_tokens,responseCompletionTokens:e.responseUsage?.completion_tokens,responseTotalTokens:e.responseUsage?.total_tokens})):POe(e)&&e.source==="jit-instruction"?l={...l,jitInstructionsAdded:(l?.jitInstructionsAdded??0)+1}:h6(e)&&e.message.tool_calls?l={...l,toolCalls:l.toolCalls.concat(e.message.tool_calls.map(n=>({...axI(this.toolsInUse,n)})))}:_Oe(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:{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:d8(this.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.callback.progress(l)}}async ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(e,I){let l=I.toolCallId,n=sxI(e,l);if(n){let c=I.toolResult,s={kind:"telemetry",telemetry:{event:"tool_call_executed",properties:{...c.toolTelemetry.properties,resultType:c.resultType,toolCallId:l,arguments:n.safeForTelemetryArguments,toolName:n.safeForTelemetryToolName,api_call_id:e.api_call_id},restrictedProperties:{...c.toolTelemetry.restrictedProperties,arguments:n.arguments,result:c.textResultForLlm,toolName:n.toolName,error:c.error},metrics:{...c.toolTelemetry.metrics,durationMs:I.durationMs}}};await this.callback.progress(s)}}};G();G();var f9=class{async*preRequest(e){yield*[]}handleCallbackResponse(e){}getUserMessages(){return[]}clearUserMessages(){}canProcessUserMessages(){return!1}toJSON(){return JSON.stringify({type:"NoopUserMessageProcessor"})}};var Z6=class{constructor(e,I){this.runtimeContext=e;this.customAgentName=I;this.gitHandlers={silent:new $r(new oi,this.runtimeContext.exec),logging:new $r(this.runtimeContext.logger,this.runtimeContext.exec)}}gitHandlers;async agent(e,I,l,n,c,s,a=new f9,r){let o=async(p,Z,u)=>{let N={role:"user",content:p};return await this.runtimeContext.callback?.progress({kind:"message",message:N,turn:0}),await this.runCompletionWithTools(e,I,[...Z??[],N],s,c,{executeToolsInParallel:Cl(this.runtimeContext.settings,"copilot_swe_agent_parallel_tool_execution"),initialTurnCount:u},r,a)},d=n,i=l??[],h;for(;d;){let p=await o(d,i,h);h=p.finalTurnCount,i=p.messages,d=await r?.onResult(p.postCompletionWithToolsCommitHash)}for(let p of s)if(p.shutdown){let Z=await p.shutdown();Z&&await this.runtimeContext.callback?.progress(Z)}return{finalTurnCount:h||0,messages:i}}async runCompletionWithTools(e,I,l,n,c,s,a,r=new f9){let o=this.runtimeContext.callback?new p6("sweagent-capi",this.runtimeContext.callback,this.runtimeContext.settings,n):void 0,d=this.gitHandlers.logging,i=await d.getCurrentCommitHash(e),h=l.filter(Q=>Q.role==="user").at(-1),p=this.createCompletionWithToolsProcessors(e,i,n,r,c,a,h),Z=this.runtimeContext.client.getCompletionWithTools(I,l,n,{...s,processors:p}),u=0,N=[...l],Y=[];for await(let Q of Z){if(Cl(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")){let A=await this.runtimeContext.callback?.progress(Q,{accepts_user_messages:r.canProcessUserMessages()});r.handleCallbackResponse(A)}else Q.kind==="response"||Q.kind==="message"?await this.runtimeContext.callback?.progress({...Q,customAgentName:this.customAgentName}):await this.runtimeContext.callback?.progress(Q);o&&await o.ingestEvent(Q),(Q.kind==="message"||Q.kind==="response")&&(Q.kind==="message"&&N.push(Q.message),Q.kind==="response"&&Y.push(Q.response),u=Math.max(u,Q.turn??0))}let y=await d.getCurrentCommitHash(e);return{finalTurnCount:u,messages:N,resultMessages:Y,preCompletionWithToolsCommitHash:i,postCompletionWithToolsCommitHash:y}}createCompletionWithToolsProcessors(e,I,l,n,c,s,a){let r=new i6(this.runtimeContext.logger,this.runtimeContext.settings,l.find(h=>h.name==="github-mcp-server-get_file_contents")),o=new m6(this.runtimeContext.settings,this.runtimeContext.logger,this.gitHandlers.silent,e,I,c),d=new XH(a,this.runtimeContext.logger),i=[o,r,d];return Cl(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")&&i.push(n),{preRequest:i.filter(h=>h!==void 0),preToolsExecution:[s].filter(h=>h!==void 0),postToolExecution:[r,s].filter(h=>h!==void 0),onRequestError:[r,d].filter(h=>h!==void 0)}}};G();async function Zme(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 eMe=t=>Cl(t,"copilot_swe_agent_search")||xZe(t,"SearchAgentExperiment")==="enabled",$Oe="search";function ume(t){return t!==null&&typeof t=="object"&&"question"in t&&"reason"in t&&"searchCommand"in t}var rxI=(t,e,I)=>`
1245
1245
  You are a question answering agent that is a component of GitHub Copilot coding agent. Your task is to take the given question
1246
1246
  and answer it using the given facts.
1247
1247
 
@@ -1354,11 +1354,11 @@ Pay attention to the following when using it:
1354
1354
  `}var LjI=Aq.platform==="win32"?["APPDATA","HOMEDRIVE","HOMEPATH","LOCALAPPDATA","PATH","PROCESSOR_ARCHITECTURE","SYSTEMDRIVE","SYSTEMROOT","TEMP","USERNAME","USERPROFILE","PROGRAMFILES"]:["HOME","LOGNAME","PATH","SHELL","TERM","USER"];function kjI(){let t={};for(let e of LjI){let I=Aq.env[e];I!==void 0&&(I.startsWith("()")||(t[e]=I))}return t}var Qq=class{constructor(e){this._abortController=new AbortController,this._readBuffer=new gq,this._stderrStream=null,this._serverParams=e,(e.stderr==="pipe"||e.stderr==="overlapped")&&(this._stderrStream=new JjI)}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,s,a;this._process=(0,pKe.default)(this._serverParams.command,(l=this._serverParams.args)!==null&&l!==void 0?l:[],{env:{...kjI(),...this._serverParams.env},stdio:["pipe","pipe",(n=this._serverParams.stderr)!==null&&n!==void 0?n:"inherit"],shell:!1,signal:this._abortController.signal,windowsHide:Aq.platform==="win32"&&fjI(),cwd:this._serverParams.cwd}),this._process.on("error",r=>{var o,d;if(r.name==="AbortError"){(o=this.onclose)===null||o===void 0||o.call(this);return}I(r),(d=this.onerror)===null||d===void 0||d.call(this,r)}),this._process.on("spawn",()=>{e()}),this._process.on("close",r=>{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",r=>{var o;(o=this.onerror)===null||o===void 0||o.call(this,r)}),(s=this._process.stdout)===null||s===void 0||s.on("data",r=>{this._readBuffer.append(r),this.processReadBuffer()}),(a=this._process.stdout)===null||a===void 0||a.on("error",r=>{var o;(o=this.onerror)===null||o===void 0||o.call(this,r)}),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=hKe(e);this._process.stdin.write(n)?I():this._process.stdin.once("drain",I)})}};function fjI(){return"type"in Aq}G();G();var wq=class extends TransformStream{constructor({onError:e,onRetry:I,onComment:l}={}){let n;super({start(c){n=Nq({onEvent:s=>{c.enqueue(s)},onError(s){e==="terminate"?c.error(s):typeof e=="function"&&e(s)},onRetry:I,onComment:l})},transform(c){n.feed(c)}})}};var xjI={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2},Lx=class extends Error{constructor(e,I){super(`Streamable HTTP error: ${I}`),this.code=e}},Xq=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:xjI}async _authThenStart(){var e;if(!this._authProvider)throw new lo("No auth provider");let I;try{I=await gV(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 lo;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 s=await this._commonHeaders();s.set("Accept","text/event-stream"),c&&s.set("last-event-id",c);let a=await((I=this._fetch)!==null&&I!==void 0?I:fetch)(this._url,{method:"GET",headers:s,signal:(l=this._abortController)===null||l===void 0?void 0:l.signal});if(!a.ok){if(a.status===401&&this._authProvider)return await this._authThenStart();if(a.status===405)return;throw new Lx(a.status,`Failed to open SSE stream: ${a.statusText}`)}this._handleSseStream(a.body,e,!0)}catch(s){throw(n=this.onerror)===null||n===void 0||n.call(this,s),s}}_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(s=>{var a;(a=this.onerror)===null||a===void 0||a.call(this,new Error(`Failed to reconnect SSE stream: ${s instanceof Error?s.message:String(s)}`)),this._scheduleReconnection(e,I+1)})},c)}_handleSseStream(e,I,l){if(!e)return;let{onresumptiontoken:n,replayMessageId:c}=I,s;(async()=>{var r,o,d,i;try{let h=e.pipeThrough(new TextDecoderStream).pipeThrough(new wq).getReader();for(;;){let{value:p,done:Z}=await h.read();if(Z)break;if(p.id&&(s=p.id,n?.(p.id)),!p.event||p.event==="message")try{let u=ZV.parse(JSON.parse(p.data));c!==void 0&&S9(u)&&(u.id=c),(r=this.onmessage)===null||r===void 0||r.call(this,u)}catch(u){(o=this.onerror)===null||o===void 0||o.call(this,u)}}}catch(h){if((d=this.onerror)===null||d===void 0||d.call(this,new Error(`SSE stream disconnected: ${h}`)),l&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:s,onresumptiontoken:n,replayMessageId:c},0)}catch(p){(i=this.onerror)===null||i===void 0||i.call(this,new Error(`Failed to reconnect: ${p instanceof Error?p.message:String(p)}`))}}})()}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 lo("No auth provider");if(await gV(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new lo("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,s;try{let{resumptionToken:a,onresumptiontoken:r}=I||{};if(a){this._startOrAuthSse({resumptionToken:a,replayMessageId:A6(e)?e.id:void 0}).catch(N=>{var Y;return(Y=this.onerror)===null||Y===void 0?void 0:Y.call(this,N)});return}let o=await this._commonHeaders();o.set("content-type","application/json"),o.set("accept","application/json, text/event-stream");let d={...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,d),h=i.headers.get("mcp-session-id");if(h&&(this._sessionId=h),!i.ok){if(i.status===401&&this._authProvider){if(this._resourceMetadataUrl=Jx(i),await gV(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new lo;return this.send(e)}let N=await i.text().catch(()=>null);throw new Error(`Error POSTing to endpoint (HTTP ${i.status}): ${N}`)}if(i.status===202){gMe(e)&&this._startOrAuthSse({resumptionToken:void 0}).catch(N=>{var Y;return(Y=this.onerror)===null||Y===void 0?void 0:Y.call(this,N)});return}let Z=(Array.isArray(e)?e:[e]).filter(N=>"method"in N&&"id"in N&&N.id!==void 0).length>0,u=i.headers.get("content-type");if(Z)if(u?.includes("text/event-stream"))this._handleSseStream(i.body,{onresumptiontoken:r},!1);else if(u?.includes("application/json")){let N=await i.json(),Y=Array.isArray(N)?N.map(y=>ZV.parse(y)):[ZV.parse(N)];for(let y of Y)(c=this.onmessage)===null||c===void 0||c.call(this,y)}else throw new Lx(-1,`Unexpected content type: ${u}`)}catch(a){throw(s=this.onerror)===null||s===void 0||s.call(this,a),a}}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},s=await((I=this._fetch)!==null&&I!==void 0?I:fetch)(this._url,c);if(!s.ok&&s.status!==405)throw new Lx(s.status,`Failed to terminate session: ${s.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}};G();var Eq=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 Dpe(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?.())}},Dpe=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 Hq=class{createTransport(e){switch(e.type){case"stdio":{let I=new Qq({command:e.command,args:e.args,env:e.env,stderr:e.stderr?"pipe":void 0});return I.stderr?.pipe(e.stderr),I}case"http":return new Xq(new URL(e.url),{requestInit:{headers:e.headers||{}}});case"sse":return new yq(new URL(e.url),{requestInit:{headers:e.headers||{}}});case"memory":return new Eq(e.server);default:throw new Error(`Unsupported transport type: ${e.type}`)}}};G();var uF="blackbird-mcp-server",G1="github-mcp-server",Kpe="playwright";function o1(t){return t.type===void 0||t.type.toLowerCase()==="local"||t.type.toLowerCase()==="stdio"}function vq(t){return t.type?.toLowerCase()==="http"}function Cq(t){return t.type?.toLowerCase()==="sse"}function kx(t){return t.type?.toLowerCase()==="memory"}var Ppe=class extends BjI{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)))}}},Jq=class{constructor(e,I=new uq,l=new Hq,n="indirect"){this.logger=e;this.clientFactory=I;this.transportFactory=l;this.envValueMode=n}clients={};transports={};async startLocalMcpClient(e,I,l,n){this.logger.log(`Starting MCP client for ${e} with command: ${l} and args: ${n}`);let c=new Ppe(e,this.logger),s={type:"stdio",command:l,args:n,env:{...I,PATH:process.env.PATH},stderr:c},a=this.transportFactory.createTransport(s);await this.setupAndConnectClient(e,a)}async startHttpMcpClient(e,I){this.logger.log(`Starting remote MCP client for ${e} with url: ${I.url}`);let l={type:"http",url:I.url,headers:I.headers},n=this.transportFactory.createTransport(l);await this.setupAndConnectClient(e,n)}async startSseMcpClient(e,I){this.logger.log(`Starting remote MCP client for ${e} with url: ${I.url}`);let l={type:"sse",url:I.url,headers:I.headers},n=this.transportFactory.createTransport(l);await this.setupAndConnectClient(e,n)}async startInMemoryMcpClient(e,I){this.logger.log(`Starting in-memory MCP client for ${e}`);let l={type:"memory",server:I},n=this.transportFactory.createTransport(l);await this.setupAndConnectClient(e,n)}async setupAndConnectClient(e,I){this.transports[e]=I,I.onclose=()=>{this.logger.log(`MCP transport for ${e} closed`),delete this.transports[e]},this.logger.log(`Creating MCP client for ${e}...`);let l=this.clientFactory.createClient({name:"github-copilot-developer",version:"1.0.0"},{capabilities:{experimental:void 0,roots:void 0,sampling:void 0}}),n=Date.now();this.logger.log(`Connecting MCP client for ${e}...`),await l.connect(I),l.onclose=()=>{this.logger.log(`MCP client for ${e} closed`),delete this.clients[e]},l.onerror=c=>{this.logger.error(`MCP client for ${e} errored ${c}`)},this.logger.log(`MCP client for ${e} connected, took ${Date.now()-n}ms`),this.clients[e]=l}async getTools(e,I){let l={};for(let[n,c]of Object.entries(this.clients)){let s=[];try{this.logger.log(`Fetching tools from client: ${n}`);let a=await c.listTools(),r=e?.mcpServers[n].tools,o=e?.mcpServers[n].filterMapping;for(let i of a.tools){if(i.name==="get_copilot_space")continue;if(!(r?.includes("*")||r?.includes(i.name))){this.logger.log(`Tool ${i.name} is not in the allowed list for client: ${n}`);continue}let p=b6(n,i.name),Z=`${n}-${i.name}`,u;typeof o=="string"?u=pbe(o):u=pbe(o?.[i.name]??"hidden_characters"),l[`${n}/${i.name}`]={name:Z,namespacedName:`${n}/${i.name}`,title:i.title??i.annotations?.title??i.name,description:i.description??Z,input_schema:i.inputSchema,readOnly:i.annotations?.readOnlyHint,safeForTelemetry:{name:!!(e?.mcpServers[n].isDefaultServer||p),inputsNames:!!e?.mcpServers[n].isDefaultServer},filterMode:u},s.push(i.name),this.logger.log(`Tool ${i.name} added to tools list for client: ${n}`)}this.logger.log(`Successfully retrieved ${s.length} tools from client: ${n}`);let d=c.getServerVersion();await this.logServerSuccessWithTools(n,s,d,I)}catch(a){this.logger.error(`Failed to get tools from client: ${n} ${a}`)}}return this.logger.log(`All tools retrieved: ${JSON.stringify(l,null,2)}`),l}async logServerSuccessWithTools(e,I,l,n){if(e!=uF&&n)try{let c=I.map(r=>`- ${r}`).join(`
1355
1355
  `),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
1356
1356
 
1357
- ${c}`;await n.logMCPSetup(e,a),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}`)}}};G();var qpe={mcpServers:{}},Lq=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"),qpe;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"),qpe;try{let e=JSON.parse(this.mcpEnvConfig);if(!e.mcpServers)throw new Error("User-provided config had incorrect format. Missing 'mcpServers' property.");for(let I in e.mcpServers)e.mcpServers[I].isDefaultServer=!1;return e}catch(e){return this.logger.error(`Warning: User-provided MCP servers were defined but invalid: ${e}`),qpe}}configureGitHubMcp(e,I){this.remoteEnabled?this.configureRemoteGitHubMcp(e,I):this.configureLocalGitHubMcp(e)}configureRemoteGitHubMcp(e,I){this.logger.log("Using default remote GitHub MCP server configuration");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,filterMapping:{get_issue:"markdown",get_issue_comments:"markdown",get_pull_request:"markdown",get_pull_request_comments:"markdown",get_pull_request_reviews:"markdown"}};e.mcpServers[G1]=c}configureLocalGitHubMcp(e){if(e.mcpServers[G1]){this.logger.log("Using user-provided GitHub MCP server configuration");let I=e.mcpServers[G1]??{};o1(I)&&!I.command&&(e.mcpServers[G1]={...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[G1]=I}}configurePlaywrightMcp(e){if(!e.mcpServers[Kpe]){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:[...cme,"--allowed-origins","localhost;localhost:*;127.0.0.1;127.0.0.1:*"],tools:["*"],isDefaultServer:!0};e.mcpServers[Kpe]=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[uF]=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[uF]=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[uF]=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 o1(e)||vq(e)||Cq(e)||kx(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&&!o1(I)&&!kx(I)?(this.logger.error(`Unsupported server type "${I.type}" for server "${e}". Only "Local", "STDIO", or "Memory" are supported.`),!1):I.tools?o1(I)&&!this.isValidLocalServerConfig(I)?(this.logger.error(`Invalid local server configuration for "${e}". Please ensure 'command' and 'args' are provided.`),!1):(vq(I)||Cq(I))&&!this.isValidRemoteServerConfig(I)?(this.logger.error(`Invalid remote server configuration for "${e}". Please ensure 'url' is provided.`),!1):kx(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=this.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=this.resolveRemoteServerConfig(I);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}}resolveRemoteServerConfig(e){return e.url=this.resolveString(e.url,process.env),e.headers=this.resolveHeaders(e.headers,process.env),{...e,url:e.url,headers:e.headers}}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(s){this.logger.error(`Failed to handle Python module for ${e}: ${s}`)}let n=this.buildEnvironment(l),c=this.resolveLocalServerConfig(l,n);this.logger.log(`Starting MCP client for ${e} with command: ${c.command} and args: ${c.args}`);try{await this.registry.startLocalMcpClient(e,n,c.command,c.args),this.logger.log(`Started MCP client for ${e}`)}catch(s){throw this.logger.error(`Failed to start MCP client for ${e}: ${s}`),s}}convertPythonToPipx(e){if(!e||!e.args||e.args.length===0)return e;let I=e.args,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 s=l+2;s<I.length;s++)c.push(I[s]);for(let s=0;s<l;s++)c.push(I[s]);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]=this.resolveString(n,process.env);else for(let[l,n]of Object.entries(e.env)){let c=n.trim(),s=c;if(c.includes("$")&&(s=this.resolveString(c,process.env)),s!==c){I[l]=s;continue}process.env[c]!==void 0&&(I[l]=process.env[c])}return I}resolveLocalServerConfig(e,I){let l=this.resolveString(e.command,I),n=this.resolveArray(e.args,I);return{...e,command:l,args:n}}resolveString(e,I){return I?e.replace(/\$(?:\{([A-Z0-9_]+)(?::-(.*?))?\}|([A-Z0-9_]+))/g,(l,n,c,s)=>{let r=I[n||s];return r!==void 0?r:c!==void 0?c:l}):e}resolveArray(e,I){return e?I?e.map(l=>this.resolveString(l,I)):e:[]}resolveHeaders(e,I){if(!e)return{};if(!I)return e;let l={};for(let[n,c]of Object.entries(e)){let s=this.resolveArray([c],I);l[n]=s[0]}return l}async processServers(e){if(!e)throw new Error("No servers to process");let I=Object.entries(e.mcpServers).map(([l,n])=>this.processServer(l,n));await Promise.all(I)}async processServer(e,I){if(!this.validateServerConfig(e,I)){this.logger.error(`Skipping server "${e}" due to invalid configuration.`);return}try{o1(I)?await this.processLocalServer(e,I):vq(I)&&this.remoteEnabled?await this.processHttpServer(e,I):Cq(I)&&this.remoteEnabled?await this.processSseServer(e,I):kx(I)&&await this.processInMemoryServer(e,I)}catch(l){e!==uF&&await this.logServerFailure(e,l)}}async logServerFailure(e,I){if(this.sessionClient)try{await this.sessionClient.logMCPSetup(e,`<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 kq=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 Jq(this.logger,void 0,void 0,n),this.processor=new Lq(this.logger,this.registry,{mcp3pEnabled:!0,remoteEnabled:!0})}registry;processor;config;startServersPromise=null;allTools=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.allTools=null}async getTools(e,I,l){if(!this.allTools){await this.startServers();let n=new k9(e,I,l),c=[];for(let s of Object.keys(this.registry.clients)){let a=await n.loadTools({mcpClient:this.registry.clients[s],clientName:s,tools:this.config.mcpServers[s]?.tools||["*"],filterMapping:this.config.mcpServers[s]?.filterMapping||"hidden_characters"});c.push(...a)}this.allTools=c}return this.allTools}getConfig(){return this.config}async startServer(e,I){await this.startServers(),this.config.mcpServers[e]=I,await this.processor.processServer(e,I),this.allTools=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.allTools=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.allTools=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.allTools=null}async startBuiltInServer(e){}getServerConfig(e){return this.config.mcpServers[e]}};G();var TKe=dn(MKe(),1);async function vKI(t={}){let e=await fZe();return JZe((0,TKe.default)({},e,t))}async function jKe(t={}){if($x())throw new Error("Settings have already been initialized");return vKI(t)}G();async function QV(t,e,I){if(!t||t.length===0)return;let l=!1,n={};for(let c of t)try{let s=await c(e);s&&(l=!0,n={...n,...s})}catch(s){I.error(`Hook execution failed: ${s}`)}return l?n:void 0}G();var AV=class{sessionId;startTime;events=[];_chatMessages=[];_selectedModel;logger;eventCallbacks=[];constructor({sessionId:e,startTime:I,logger:l}={}){this.sessionId=e||ld(),this.startTime=I||new Date,this.logger=l||new oi}static fromEvents({events:e,logger: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 this({sessionId:l.data.sessionId,startTime:new Date(l.data.startTime),logger:I||new oi});n._selectedModel=l.data.selectedModel,n.events.push(l);for(let c=1;c<e.length;c++){let s=e[c];n.events.push(s),n.processEventForState(s)}return n}addEvent(e){let I=e.id||ld(),l=e.timestamp||new Date().toISOString(),n=e.parentId!==void 0?e.parentId:this.getLastEventId(),c={...e,id:I,timestamp:l,parentId:n};return this.events.push(c),this.processEventForState(c),this.notifyEventCallbacks(c),c}getEvents(){return this.events}onEvent(e){return this.eventCallbacks.push(e),()=>{let I=this.eventCallbacks.indexOf(e);I>-1&&this.eventCallbacks.splice(I,1)}}get chatMessages(){return this._chatMessages}get selectedModel(){return this._selectedModel}setSelectedModel(e){let I=this._selectedModel;this._selectedModel=e,this.addEvent({type:"session.model_change",data:{previousModel:I,newModel:e}})}getChatContextMessages(){return this._chatMessages.filter(e=>e.role!=="system")}getSystemContextMessages(){return this._chatMessages.filter(e=>e.role==="system")}getLastEventId(){return this.events.length===0?null:this.events[this.events.length-1].id}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":this._chatMessages.push({role:"user",content:e.data.content});break;case"assistant.message":{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":{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.resume":case"session.error":case"session.info":case"session.import_legacy":case"assistant.turn_start":case"assistant.turn_end":case"assistant.usage":case"abort":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}}}notifyEventCallbacks(e){for(let I of this.eventCallbacks)try{I(e)}catch(l){this.logger.error(`Error in event callback: ${l instanceof Error?l.message:String(l)}`)}}};var Tq=class{static name="Copilot";static description="Base Copilot Agent";options;logger;workingDir;session;constructor(e){this.options=e,this.logger=e.logger||new oi,this.workingDir=e.workingDirectory||process.cwd(),this.session=e.session||new AV,Nme(this.workingDir).then(I=>{if(I.found)return hSe(I.gitRoot,!0,this.workingDir)}).catch(I=>{this.logger.debug(`Failed to initialize custom instructions cache: ${I}`)})}async*query(e){let I=new Map,l;try{if(this.options.mcpServers&&Object.keys(this.options.mcpServers).length>0)try{l=new kq(this.logger,{mcpServers:this.options.mcpServers},this.options.disabledTools),await l.startServers()}catch(Ne){this.logger.error(`Failed to initialize MCP host: ${Ne}`)}let n={timestamp:Date.now(),cwd:this.workingDir,prompt:e},s=(await QV(this.options.hooks?.userPromptSubmitted,n,this.logger))?.modifiedPrompt??e;this.session.addEvent({type:"user.message",data:{content:s}});let r=new wF().setProblemStatement(s).setAgentModel(this.buildAgentModelString()).setGithubRepoName("copilot-sdk-session").setGithubRepoCommit("copilot-sdk-commit").setGithubRepoReadWrite(!1).setCopilotIntegrationId(this.options.integrationId||"copilot-developer-cli").setCopilotHmacKey(this.options.hmacKey).setCopilotToken(this.options.copilotToken).build();LZe();let o=await jKe(r),d=o.service?.agent?.model,i=pme(d),h=i.agent,p=i.model?{model:i.model}:void 0,Z=Yoe(o,this.logger,h,p),u={location:this.workingDir,timeout:3e4,requireReasoning:!0,toolPartialResultCallback:void 0,permissions:this.options.requestPermission?{requestRequired:!0,request:this.options.requestPermission}:{requestRequired:!1},shellConfig:process.platform==="win32"?fi.powerShell:fi.bash},N=await lMe(u,this.logger),Y=[];if(l)try{Y=await l.getTools(o,this.logger,u.permissions)}catch(Ne){this.logger.error(`Failed to get MCP tools: ${Ne}`)}let y=[...N,...Y],Q=this.applyToolFiltering(y,this.options.allowedTools,this.options.disabledTools),A=await Nme(this.workingDir),E={...(cMe()["sweagent-capi"]?.["claude-sonnet-4"]??nMe()).supports,reasoning:!0},J=await xOe(A.found?A.gitRoot:"",Yfe(),this.workingDir,{},E,u,Q,void 0),te=this.session.chatMessages.slice(0,-1),Fe={role:"user",content:UOe({customAgentPrompt:void 0,problemStatement:s,capabilities:E})},ye=[...te,Fe],He={timestamp:Date.now(),cwd:this.workingDir,source:"new",initialPrompt:e};await QV(this.options.hooks?.sessionStart,He,this.logger);let Qe=Z.getCompletionWithTools(J,ye,Q,{failIfInitialInputsTooLong:!1,processors:{preRequest:[new XH(Fe,this.logger)]},executeToolsInParallel:!1,abortSignal:this.options.abortController?.signal});for await(let Ne of Qe){if(this.options.abortController?.signal.aborted){yield{type:"error",error:new Error("Operation was cancelled")};return}let WI=await this.translateEvent(Ne,I);for(let Ae of WI)Ae.type==="message"&&Ae.role==="assistant"&&this.session.addEvent({type:"assistant.message",data:{messageId:`msg-${Date.now()}`,content:Ae.content}}),yield Ae}yield{type:"complete"}}catch(n){let c={timestamp:Date.now(),cwd:this.workingDir,reason:"error",error:n instanceof Error?n:new Error(String(n))};await QV(this.options.hooks?.sessionEnd,c,this.logger),yield{type:"error",error:n instanceof Error?n:new Error(String(n))}}finally{let n={timestamp:Date.now(),cwd:this.workingDir,reason:"complete"};if(await QV(this.options.hooks?.sessionEnd,n,this.logger),l)try{await l.stopServers(),this.logger.log("MCP host stopped successfully")}catch(c){this.logger.error(`Error stopping MCP host: ${c}`)}}}buildAgentModelString(){switch(this.options.modelProvider.type){case"openai":return`openai:${this.options.modelProvider.model}`;case"anthropic":return`anthropic:${this.options.modelProvider.model}`;case"copilot":return`capi:${this.options.modelProvider.model}`;default:throw new Error(`Unsupported provider: ${this.options.modelProvider.type}`)}}applyToolFiltering(e,I,l){let n=e;return I&&I.length>0&&(n=n.filter(c=>I.includes(c.name))),l&&l.length>0&&(n=n.filter(c=>!l.includes(c.name))),n}async translateEvent(e,I){switch(e.kind){case"message":{if(h6(e)&&e.message.content)return[{type:"message",content:typeof e.message.content=="string"?e.message.content:"",role:"assistant"}];if(qOe(e)){let l=[];for(let n of e.message.tool_calls){let c=tw(n.function.arguments);I.set(n.id,n.function.name);let s={timestamp:Date.now(),cwd:this.workingDir,toolName:n.function.name,toolArgs:c},r=(await QV(this.options.hooks?.preToolUse,s,this.logger))?.modifiedArgs??c;l.push({type:"tool_use",toolName:n.function.name,args:r,toolCallId:n.id})}return l}return[]}case"response":return[];case"model_call_failure":{let l=new Error(e.modelCall?.error||"Model call failed"),n={timestamp:Date.now(),cwd:this.workingDir,error:l,errorContext:"model_call",recoverable:!0};return await QV(this.options.hooks?.errorOccurred,n,this.logger),[{type:"error",error:l}]}case"tool_execution":{let l=I.get(e.toolCallId)||"unknown",n={timestamp:Date.now(),cwd:this.workingDir,toolName:l,toolArgs:{},toolResult:e.toolResult},s=(await QV(this.options.hooks?.postToolUse,n,this.logger))?.modifiedResult??e.toolResult;return[{type:"tool_result",toolName:l,result:s,toolCallId:e.toolCallId}]}default:return[]}}};var IPe={};jc(IPe,{CLISession:()=>m1,CLISessionManager:()=>GZe});G();G();G();G();var Os=Sl({id:ZI().uuid(),timestamp:ZI().datetime(),parentId:ZI().uuid().nullable(),ephemeral:xH().optional()}),CKI=Os.extend({type:ic("session.start"),data:Sl({sessionId:ZI(),version:pV(),producer:ZI(),copilotVersion:ZI(),startTime:ZI().datetime(),selectedModel:ZI().optional()})}),JKI=Os.extend({type:ic("session.resume"),data:Sl({resumeTime:ZI().datetime(),eventCount:pV()})}),LKI=Os.extend({type:ic("session.error"),data:Sl({errorType:ZI(),message:ZI(),stack:ZI().optional()})}),kKI=Os.extend({type:ic("session.info"),data:Sl({infoType:ZI(),message:ZI()})}),fKI=Os.extend({type:ic("session.model_change"),data:Sl({previousModel:ZI().optional(),newModel:ZI()})}),xKI=Os.extend({type:ic("session.import_legacy"),data:Sl({legacySession:Sl({sessionId:ZI(),startTime:ZI(),chatMessages:BH(y6()),timeline:BH(y6()),selectedModel:ZI().optional()}),importTime:ZI().datetime(),sourceFile:ZI()})}),BKI=Os.extend({type:ic("user.message"),data:Sl({content:ZI(),attachments:BH(Sl({type:F6(["file","directory"]),path:ZI(),displayName:ZI()})).optional()})}),zKI=Os.extend({type:ic("assistant.turn_start"),data:Sl({turnId:ZI()})}),UKI=Os.extend({type:ic("assistant.message"),data:Sl({messageId:ZI(),content:ZI(),toolRequests:BH(Sl({toolCallId:ZI(),name:ZI(),arguments:IF()})).optional()})}),SKI=Os.extend({type:ic("assistant.turn_end"),data:Sl({turnId:ZI()})}),OKI=Os.extend({type:ic("assistant.usage"),ephemeral:ic(!0),data:Sl({model:ZI().optional(),tokensUsed:pV().optional(),cost:pV().optional(),duration:pV().optional()})}),MKI=Os.extend({type:ic("abort"),data:Sl({reason:ZI()})}),TKI=Os.extend({type:ic("tool.execution_start"),data:Sl({toolCallId:ZI(),toolName:ZI(),arguments:IF()})}),jKI=Os.extend({type:ic("tool.execution_partial_result"),ephemeral:ic(!0),data:Sl({toolCallId:ZI(),toolName:ZI(),partialOutput:ZI()})}),DKI=Os.extend({type:ic("tool.execution_complete"),data:Sl({toolCallId:ZI(),toolName:ZI(),success:xH(),result:Sl({content:ZI()}).optional(),error:Sl({message:ZI(),code:ZI().optional()}).optional()})}),KKI=Os.extend({type:ic("hook.start"),data:Sl({hookInvocationId:ZI(),hookType:ZI(),input:IF()})}),PKI=Os.extend({type:ic("hook.end"),data:Sl({hookInvocationId:ZI(),hookType:ZI(),output:IF(),success:xH(),error:Sl({message:ZI(),stack:ZI().optional()}).optional()})}),qKI=Os.extend({type:ic("system.message"),data:Sl({content:ZI(),role:F6(["system","developer"]),name:ZI().optional(),metadata:Sl({promptVersion:ZI().optional(),variables:Fme(IF()).optional()}).optional()})}),DKe=yme("type",[CKI,JKI,LKI,kKI,fKI,xKI,BKI,zKI,UKI,SKI,OKI,MKI,TKI,jKI,DKI,KKI,PKI,qKI]);G();import{existsSync as lPI}from"fs";import{appendFile as nPI,mkdir as cPI,readdir as sPI,readFile as aPI,stat as rPI,writeFile as j_l}from"fs/promises";import{homedir as GPI}from"os";import{dirname as oPI,join as Sx}from"path";G();G();var _KI=new Error("timeout while waiting for mutex to become available"),x_l=new Error("mutex already locked"),$KI=new Error("request for lock canceled"),ePI=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(s){s(c)})}return new(I||(I=Promise))(function(c,s){function a(d){try{o(l.next(d))}catch(i){s(i)}}function r(d){try{o(l.throw(d))}catch(i){s(i)}}function o(d){d.done?c(d.value):n(d.value).then(a,r)}o((l=l.apply(t,e||[])).next())})},rZe=class{constructor(e,I=$KI){this._value=e,this._cancelError=I,this._queue=[],this._weightedWaiters=[]}acquire(e=1,I=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return new Promise((l,n)=>{let c={resolve:l,reject:n,weight:e,priority:I},s=PKe(this._queue,a=>I<=a.priority);s===-1&&e<=this._value?this._dispatchItem(c):this._queue.splice(s+1,0,c)})}runExclusive(e){return ePI(this,arguments,void 0,function*(I,l=1,n=0){let[c,s]=yield this.acquire(l,n);try{return yield I(c)}finally{s()}})}waitForUnlock(e=1,I=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,I)?Promise.resolve():new Promise(l=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),IPI(this._weightedWaiters[e-1],{resolve:l,priority:I})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(e){this._value=e,this._dispatchQueue()}release(e=1){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);this._value+=e,this._dispatchQueue()}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatchQueue(){for(this._drainUnlockWaiters();this._queue.length>0&&this._queue[0].weight<=this._value;)this._dispatchItem(this._queue.shift()),this._drainUnlockWaiters()}_dispatchItem(e){let I=this._value;this._value-=e.weight,e.resolve([I,this._newReleaser(e.weight)])}_newReleaser(e){let I=!1;return()=>{I||(I=!0,this.release(e))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let e=this._value;e>0;e--){let I=this._weightedWaiters[e-1];I&&(I.forEach(l=>l.resolve()),this._weightedWaiters[e-1]=[])}else{let e=this._queue[0].priority;for(let I=this._value;I>0;I--){let l=this._weightedWaiters[I-1];if(!l)continue;let n=l.findIndex(c=>c.priority<=e);(n===-1?l:l.splice(0,n)).forEach(c=>c.resolve())}}}_couldLockImmediately(e,I){return(this._queue.length===0||this._queue[0].priority<I)&&e<=this._value}};function IPI(t,e){let I=PKe(t,l=>e.priority<=l.priority);t.splice(I+1,0,e)}function PKe(t,e){for(let I=t.length-1;I>=0;I--)if(e(t[I]))return I;return-1}var tPI=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(s){s(c)})}return new(I||(I=Promise))(function(c,s){function a(d){try{o(l.next(d))}catch(i){s(i)}}function r(d){try{o(l.throw(d))}catch(i){s(i)}}function o(d){d.done?c(d.value):n(d.value).then(a,r)}o((l=l.apply(t,e||[])).next())})},Dq=class{constructor(e){this._semaphore=new rZe(1,e)}acquire(){return tPI(this,arguments,void 0,function*(e=0){let[,I]=yield this._semaphore.acquire(1,e);return I})}runExclusive(e,I=0){return this._semaphore.runExclusive(()=>e(),1,I)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(e=0){return this._semaphore.waitForUnlock(1,e)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}},KKe=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(s){s(c)})}return new(I||(I=Promise))(function(c,s){function a(d){try{o(l.next(d))}catch(i){s(i)}}function r(d){try{o(l.throw(d))}catch(i){s(i)}}function o(d){d.done?c(d.value):n(d.value).then(a,r)}o((l=l.apply(t,e||[])).next())})};function qKe(t,e,I=_KI){return{acquire:(l,n)=>{let c;if(jq(t)?c=l:(c=void 0,n=l),c!==void 0&&c<=0)throw new Error(`invalid weight ${c}: must be positive`);return new Promise((s,a)=>KKe(this,void 0,void 0,function*(){let r=!1,o=setTimeout(()=>{r=!0,a(I)},e);try{let d=yield jq(t)?t.acquire(c,n):t.acquire(n);r?(Array.isArray(d)?d[1]:d)():(clearTimeout(o),s(d))}catch(d){r||(clearTimeout(o),a(d))}}))},runExclusive(l,n,c){return KKe(this,void 0,void 0,function*(){let s=()=>{};try{let a=yield this.acquire(n,c);return Array.isArray(a)?(s=a[1],yield l(a[0])):(s=a,yield l())}finally{s()}})},release(l){t.release(l)},cancel(){return t.cancel()},waitForUnlock:(l,n)=>{let c;if(jq(t)?c=l:(c=void 0,n=l),c!==void 0&&c<=0)throw new Error(`invalid weight ${c}: must be positive`);return new Promise((s,a)=>{let r=setTimeout(()=>a(I),e);(jq(t)?t.waitForUnlock(c,n):t.waitForUnlock(n)).then(()=>{clearTimeout(r),s()})})},isLocked:()=>t.isLocked(),getValue:()=>t.getValue(),setValue:l=>t.setValue(l)}}function jq(t){return t.getValue!==void 0}var Kq=class{mutexes=new Map;async runExclusive(e,I,l=5e3){let n=this.mutexes.get(e);n||(n=new Dq,n.refCount=0,this.mutexes.set(e,n));let c=n;try{return c.refCount++,await qKe(n,l).runExclusive(I)}finally{--c.refCount===0&&this.mutexes.delete(e)}}};var _Ke=".copilot",$Ke=new Kq;async function dPI(t){let e=oPI(t);try{await cPI(e,{recursive:!0,mode:448})}catch{}}var ePe=(t,e)=>{let I=()=>{let r=process.env.XDG_STATE_HOME;return r?Sx(r,_Ke):Sx(GPI(),_Ke)},l=()=>`${e}-state`,n=r=>{let o=".jsonl",d=l()+(r?"":o);return Sx(I(),d,r?`${r}${o}`:"")};return{load:async r=>{let o=n(r);if(!lPI(o))return[];try{let i=(await $Ke.runExclusive(o,()=>aPI(o,"utf8"))).trim().split(`
1357
+ ${c}`;await n.logMCPSetup(e,a),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}`)}}};G();var qpe={mcpServers:{}},Lq=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"),qpe;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"),qpe;try{let e=JSON.parse(this.mcpEnvConfig);if(!e.mcpServers)throw new Error("User-provided config had incorrect format. Missing 'mcpServers' property.");for(let I in e.mcpServers)e.mcpServers[I].isDefaultServer=!1;return e}catch(e){return this.logger.error(`Warning: User-provided MCP servers were defined but invalid: ${e}`),qpe}}configureGitHubMcp(e,I){this.remoteEnabled?this.configureRemoteGitHubMcp(e,I):this.configureLocalGitHubMcp(e)}configureRemoteGitHubMcp(e,I){this.logger.log("Using default remote GitHub MCP server configuration");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,filterMapping:{get_issue:"markdown",get_issue_comments:"markdown",get_pull_request:"markdown",get_pull_request_comments:"markdown",get_pull_request_reviews:"markdown"}};e.mcpServers[G1]=c}configureLocalGitHubMcp(e){if(e.mcpServers[G1]){this.logger.log("Using user-provided GitHub MCP server configuration");let I=e.mcpServers[G1]??{};o1(I)&&!I.command&&(e.mcpServers[G1]={...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[G1]=I}}configurePlaywrightMcp(e){if(!e.mcpServers[Kpe]){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:[...cme,"--allowed-origins","localhost;localhost:*;127.0.0.1;127.0.0.1:*"],tools:["*"],isDefaultServer:!0};e.mcpServers[Kpe]=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[uF]=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[uF]=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[uF]=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 o1(e)||vq(e)||Cq(e)||kx(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&&!o1(I)&&!kx(I)?(this.logger.error(`Unsupported server type "${I.type}" for server "${e}". Only "Local", "STDIO", or "Memory" are supported.`),!1):I.tools?o1(I)&&!this.isValidLocalServerConfig(I)?(this.logger.error(`Invalid local server configuration for "${e}". Please ensure 'command' and 'args' are provided.`),!1):(vq(I)||Cq(I))&&!this.isValidRemoteServerConfig(I)?(this.logger.error(`Invalid remote server configuration for "${e}". Please ensure 'url' is provided.`),!1):kx(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=this.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=this.resolveRemoteServerConfig(I);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}}resolveRemoteServerConfig(e){return e.url=this.resolveString(e.url,process.env),e.headers=this.resolveHeaders(e.headers,process.env),{...e,url:e.url,headers:e.headers}}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(s){this.logger.error(`Failed to handle Python module for ${e}: ${s}`)}let n=this.buildEnvironment(l),c=this.resolveLocalServerConfig(l,n);this.logger.log(`Starting MCP client for ${e} with command: ${c.command} and args: ${c.args}`);try{await this.registry.startLocalMcpClient(e,n,c.command,c.args),this.logger.log(`Started MCP client for ${e}`)}catch(s){throw this.logger.error(`Failed to start MCP client for ${e}: ${s}`),s}}convertPythonToPipx(e){if(!e||!e.args||e.args.length===0)return e;let I=e.args,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 s=l+2;s<I.length;s++)c.push(I[s]);for(let s=0;s<l;s++)c.push(I[s]);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]=this.resolveString(n,process.env);else for(let[l,n]of Object.entries(e.env)){let c=n.trim(),s=c;if(c.includes("$")&&(s=this.resolveString(c,process.env)),s!==c){I[l]=s;continue}process.env[c]!==void 0&&(I[l]=process.env[c])}return I}resolveLocalServerConfig(e,I){let l=this.resolveString(e.command,I),n=this.resolveArray(e.args,I);return{...e,command:l,args:n}}resolveString(e,I){return I?e.replace(/\$(?:\{([A-Z0-9_]+)(?::-(.*?))?\}|([A-Z0-9_]+))/g,(l,n,c,s)=>{let r=I[n||s];return r!==void 0?r:c!==void 0?c:l}):e}resolveArray(e,I){return e?I?e.map(l=>this.resolveString(l,I)):e:[]}resolveHeaders(e,I){if(!e)return{};if(!I)return e;let l={};for(let[n,c]of Object.entries(e)){let s=this.resolveArray([c],I);l[n]=s[0]}return l}async processServers(e){if(!e)throw new Error("No servers to process");let I=Object.entries(e.mcpServers).map(([l,n])=>this.processServer(l,n));await Promise.all(I)}async processServer(e,I){if(!this.validateServerConfig(e,I)){this.logger.error(`Skipping server "${e}" due to invalid configuration.`);return}try{o1(I)?await this.processLocalServer(e,I):vq(I)&&this.remoteEnabled?await this.processHttpServer(e,I):Cq(I)&&this.remoteEnabled?await this.processSseServer(e,I):kx(I)&&await this.processInMemoryServer(e,I)}catch(l){e!==uF&&await this.logServerFailure(e,l)}}async logServerFailure(e,I){if(this.sessionClient)try{await this.sessionClient.logMCPSetup(e,`<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 kq=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 Jq(this.logger,void 0,void 0,n),this.processor=new Lq(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 k9(e,I,!0);let n=[];for(let c of Object.keys(this.registry.clients)){let s=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(...s)}return n}getConfig(){return this.config}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]}};G();var TKe=dn(MKe(),1);async function vKI(t={}){let e=await fZe();return JZe((0,TKe.default)({},e,t))}async function jKe(t={}){if($x())throw new Error("Settings have already been initialized");return vKI(t)}G();async function QV(t,e,I){if(!t||t.length===0)return;let l=!1,n={};for(let c of t)try{let s=await c(e);s&&(l=!0,n={...n,...s})}catch(s){I.error(`Hook execution failed: ${s}`)}return l?n:void 0}G();var AV=class{sessionId;startTime;events=[];_chatMessages=[];_selectedModel;logger;eventCallbacks=[];constructor({sessionId:e,startTime:I,logger:l}={}){this.sessionId=e||ld(),this.startTime=I||new Date,this.logger=l||new oi}static fromEvents({events:e,logger: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 this({sessionId:l.data.sessionId,startTime:new Date(l.data.startTime),logger:I||new oi});n._selectedModel=l.data.selectedModel,n.events.push(l);for(let c=1;c<e.length;c++){let s=e[c];n.events.push(s),n.processEventForState(s)}return n}addEvent(e){let I=e.id||ld(),l=e.timestamp||new Date().toISOString(),n=e.parentId!==void 0?e.parentId:this.getLastEventId(),c={...e,id:I,timestamp:l,parentId:n};return this.events.push(c),this.processEventForState(c),this.notifyEventCallbacks(c),c}getEvents(){return this.events}onEvent(e){return this.eventCallbacks.push(e),()=>{let I=this.eventCallbacks.indexOf(e);I>-1&&this.eventCallbacks.splice(I,1)}}get chatMessages(){return this._chatMessages}get selectedModel(){return this._selectedModel}setSelectedModel(e){let I=this._selectedModel;this._selectedModel=e,this.addEvent({type:"session.model_change",data:{previousModel:I,newModel:e}})}getChatContextMessages(){return this._chatMessages.filter(e=>e.role!=="system")}getSystemContextMessages(){return this._chatMessages.filter(e=>e.role==="system")}getLastEventId(){return this.events.length===0?null:this.events[this.events.length-1].id}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":this._chatMessages.push({role:"user",content:e.data.content});break;case"assistant.message":{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":{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.resume":case"session.error":case"session.info":case"session.import_legacy":case"assistant.turn_start":case"assistant.turn_end":case"assistant.usage":case"abort":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}}}notifyEventCallbacks(e){for(let I of this.eventCallbacks)try{I(e)}catch(l){this.logger.error(`Error in event callback: ${l instanceof Error?l.message:String(l)}`)}}};var Tq=class{static name="Copilot";static description="Base Copilot Agent";options;logger;workingDir;session;constructor(e){this.options=e,this.logger=e.logger||new oi,this.workingDir=e.workingDirectory||process.cwd(),this.session=e.session||new AV,Nme(this.workingDir).then(I=>{if(I.found)return hSe(I.gitRoot,!0,this.workingDir)}).catch(I=>{this.logger.debug(`Failed to initialize custom instructions cache: ${I}`)})}async*query(e){let I=new Map,l;try{if(this.options.mcpServers&&Object.keys(this.options.mcpServers).length>0)try{l=new kq(this.logger,{mcpServers:this.options.mcpServers},this.options.disabledTools),await l.startServers()}catch(Ne){this.logger.error(`Failed to initialize MCP host: ${Ne}`)}let n={timestamp:Date.now(),cwd:this.workingDir,prompt:e},s=(await QV(this.options.hooks?.userPromptSubmitted,n,this.logger))?.modifiedPrompt??e;this.session.addEvent({type:"user.message",data:{content:s}});let r=new wF().setProblemStatement(s).setAgentModel(this.buildAgentModelString()).setGithubRepoName("copilot-sdk-session").setGithubRepoCommit("copilot-sdk-commit").setGithubRepoReadWrite(!1).setCopilotIntegrationId(this.options.integrationId||"copilot-developer-cli").setCopilotHmacKey(this.options.hmacKey).setCopilotToken(this.options.copilotToken).build();LZe();let o=await jKe(r),d=o.service?.agent?.model,i=pme(d),h=i.agent,p=i.model?{model:i.model}:void 0,Z=Yoe(o,this.logger,h,p),u={location:this.workingDir,timeout:3e4,requireReasoning:!0,toolPartialResultCallback:void 0,permissions:this.options.requestPermission?{requestRequired:!0,request:this.options.requestPermission}:{requestRequired:!1},shellConfig:process.platform==="win32"?fi.powerShell:fi.bash},N=await lMe(u,this.logger),Y=[];if(l)try{Y=await l.getTools(o,this.logger,u.permissions)}catch(Ne){this.logger.error(`Failed to get MCP tools: ${Ne}`)}let y=[...N,...Y],Q=this.applyToolFiltering(y,this.options.allowedTools,this.options.disabledTools),A=await Nme(this.workingDir),E={...(cMe()["sweagent-capi"]?.["claude-sonnet-4"]??nMe()).supports,reasoning:!0},J=await xOe(A.found?A.gitRoot:"",Yfe(),this.workingDir,{},E,u,Q,void 0),te=this.session.chatMessages.slice(0,-1),Fe={role:"user",content:UOe({customAgentPrompt:void 0,problemStatement:s,capabilities:E})},ye=[...te,Fe],He={timestamp:Date.now(),cwd:this.workingDir,source:"new",initialPrompt:e};await QV(this.options.hooks?.sessionStart,He,this.logger);let Qe=Z.getCompletionWithTools(J,ye,Q,{failIfInitialInputsTooLong:!1,processors:{preRequest:[new XH(Fe,this.logger)]},executeToolsInParallel:!1,abortSignal:this.options.abortController?.signal});for await(let Ne of Qe){if(this.options.abortController?.signal.aborted){yield{type:"error",error:new Error("Operation was cancelled")};return}let WI=await this.translateEvent(Ne,I);for(let Ae of WI)Ae.type==="message"&&Ae.role==="assistant"&&this.session.addEvent({type:"assistant.message",data:{messageId:`msg-${Date.now()}`,content:Ae.content}}),yield Ae}yield{type:"complete"}}catch(n){let c={timestamp:Date.now(),cwd:this.workingDir,reason:"error",error:n instanceof Error?n:new Error(String(n))};await QV(this.options.hooks?.sessionEnd,c,this.logger),yield{type:"error",error:n instanceof Error?n:new Error(String(n))}}finally{let n={timestamp:Date.now(),cwd:this.workingDir,reason:"complete"};if(await QV(this.options.hooks?.sessionEnd,n,this.logger),l)try{await l.stopServers(),this.logger.log("MCP host stopped successfully")}catch(c){this.logger.error(`Error stopping MCP host: ${c}`)}}}buildAgentModelString(){switch(this.options.modelProvider.type){case"openai":return`openai:${this.options.modelProvider.model}`;case"anthropic":return`anthropic:${this.options.modelProvider.model}`;case"copilot":return`capi:${this.options.modelProvider.model}`;default:throw new Error(`Unsupported provider: ${this.options.modelProvider.type}`)}}applyToolFiltering(e,I,l){let n=e;return I&&I.length>0&&(n=n.filter(c=>I.includes(c.name))),l&&l.length>0&&(n=n.filter(c=>!l.includes(c.name))),n}async translateEvent(e,I){switch(e.kind){case"message":{if(h6(e)&&e.message.content)return[{type:"message",content:typeof e.message.content=="string"?e.message.content:"",role:"assistant"}];if(qOe(e)){let l=[];for(let n of e.message.tool_calls){let c=tw(n.function.arguments);I.set(n.id,n.function.name);let s={timestamp:Date.now(),cwd:this.workingDir,toolName:n.function.name,toolArgs:c},r=(await QV(this.options.hooks?.preToolUse,s,this.logger))?.modifiedArgs??c;l.push({type:"tool_use",toolName:n.function.name,args:r,toolCallId:n.id})}return l}return[]}case"response":return[];case"model_call_failure":{let l=new Error(e.modelCall?.error||"Model call failed"),n={timestamp:Date.now(),cwd:this.workingDir,error:l,errorContext:"model_call",recoverable:!0};return await QV(this.options.hooks?.errorOccurred,n,this.logger),[{type:"error",error:l}]}case"tool_execution":{let l=I.get(e.toolCallId)||"unknown",n={timestamp:Date.now(),cwd:this.workingDir,toolName:l,toolArgs:{},toolResult:e.toolResult},s=(await QV(this.options.hooks?.postToolUse,n,this.logger))?.modifiedResult??e.toolResult;return[{type:"tool_result",toolName:l,result:s,toolCallId:e.toolCallId}]}default:return[]}}};var IPe={};jc(IPe,{CLISession:()=>m1,CLISessionManager:()=>GZe});G();G();G();G();var Os=Sl({id:ZI().uuid(),timestamp:ZI().datetime(),parentId:ZI().uuid().nullable(),ephemeral:xH().optional()}),CKI=Os.extend({type:ic("session.start"),data:Sl({sessionId:ZI(),version:pV(),producer:ZI(),copilotVersion:ZI(),startTime:ZI().datetime(),selectedModel:ZI().optional()})}),JKI=Os.extend({type:ic("session.resume"),data:Sl({resumeTime:ZI().datetime(),eventCount:pV()})}),LKI=Os.extend({type:ic("session.error"),data:Sl({errorType:ZI(),message:ZI(),stack:ZI().optional()})}),kKI=Os.extend({type:ic("session.info"),data:Sl({infoType:ZI(),message:ZI()})}),fKI=Os.extend({type:ic("session.model_change"),data:Sl({previousModel:ZI().optional(),newModel:ZI()})}),xKI=Os.extend({type:ic("session.import_legacy"),data:Sl({legacySession:Sl({sessionId:ZI(),startTime:ZI(),chatMessages:BH(y6()),timeline:BH(y6()),selectedModel:ZI().optional()}),importTime:ZI().datetime(),sourceFile:ZI()})}),BKI=Os.extend({type:ic("user.message"),data:Sl({content:ZI(),attachments:BH(Sl({type:F6(["file","directory"]),path:ZI(),displayName:ZI()})).optional()})}),zKI=Os.extend({type:ic("assistant.turn_start"),data:Sl({turnId:ZI()})}),UKI=Os.extend({type:ic("assistant.message"),data:Sl({messageId:ZI(),content:ZI(),toolRequests:BH(Sl({toolCallId:ZI(),name:ZI(),arguments:IF()})).optional()})}),SKI=Os.extend({type:ic("assistant.turn_end"),data:Sl({turnId:ZI()})}),OKI=Os.extend({type:ic("assistant.usage"),ephemeral:ic(!0),data:Sl({model:ZI().optional(),tokensUsed:pV().optional(),cost:pV().optional(),duration:pV().optional()})}),MKI=Os.extend({type:ic("abort"),data:Sl({reason:ZI()})}),TKI=Os.extend({type:ic("tool.execution_start"),data:Sl({toolCallId:ZI(),toolName:ZI(),arguments:IF()})}),jKI=Os.extend({type:ic("tool.execution_partial_result"),ephemeral:ic(!0),data:Sl({toolCallId:ZI(),toolName:ZI(),partialOutput:ZI()})}),DKI=Os.extend({type:ic("tool.execution_complete"),data:Sl({toolCallId:ZI(),toolName:ZI(),success:xH(),result:Sl({content:ZI()}).optional(),error:Sl({message:ZI(),code:ZI().optional()}).optional()})}),KKI=Os.extend({type:ic("hook.start"),data:Sl({hookInvocationId:ZI(),hookType:ZI(),input:IF()})}),PKI=Os.extend({type:ic("hook.end"),data:Sl({hookInvocationId:ZI(),hookType:ZI(),output:IF(),success:xH(),error:Sl({message:ZI(),stack:ZI().optional()}).optional()})}),qKI=Os.extend({type:ic("system.message"),data:Sl({content:ZI(),role:F6(["system","developer"]),name:ZI().optional(),metadata:Sl({promptVersion:ZI().optional(),variables:Fme(IF()).optional()}).optional()})}),DKe=yme("type",[CKI,JKI,LKI,kKI,fKI,xKI,BKI,zKI,UKI,SKI,OKI,MKI,TKI,jKI,DKI,KKI,PKI,qKI]);G();import{existsSync as lPI}from"fs";import{appendFile as nPI,mkdir as cPI,readdir as sPI,readFile as aPI,stat as rPI,writeFile as D_l}from"fs/promises";import{homedir as GPI}from"os";import{dirname as oPI,join as Sx}from"path";G();G();var _KI=new Error("timeout while waiting for mutex to become available"),B_l=new Error("mutex already locked"),$KI=new Error("request for lock canceled"),ePI=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(s){s(c)})}return new(I||(I=Promise))(function(c,s){function a(d){try{o(l.next(d))}catch(i){s(i)}}function r(d){try{o(l.throw(d))}catch(i){s(i)}}function o(d){d.done?c(d.value):n(d.value).then(a,r)}o((l=l.apply(t,e||[])).next())})},rZe=class{constructor(e,I=$KI){this._value=e,this._cancelError=I,this._queue=[],this._weightedWaiters=[]}acquire(e=1,I=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return new Promise((l,n)=>{let c={resolve:l,reject:n,weight:e,priority:I},s=PKe(this._queue,a=>I<=a.priority);s===-1&&e<=this._value?this._dispatchItem(c):this._queue.splice(s+1,0,c)})}runExclusive(e){return ePI(this,arguments,void 0,function*(I,l=1,n=0){let[c,s]=yield this.acquire(l,n);try{return yield I(c)}finally{s()}})}waitForUnlock(e=1,I=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,I)?Promise.resolve():new Promise(l=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),IPI(this._weightedWaiters[e-1],{resolve:l,priority:I})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(e){this._value=e,this._dispatchQueue()}release(e=1){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);this._value+=e,this._dispatchQueue()}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatchQueue(){for(this._drainUnlockWaiters();this._queue.length>0&&this._queue[0].weight<=this._value;)this._dispatchItem(this._queue.shift()),this._drainUnlockWaiters()}_dispatchItem(e){let I=this._value;this._value-=e.weight,e.resolve([I,this._newReleaser(e.weight)])}_newReleaser(e){let I=!1;return()=>{I||(I=!0,this.release(e))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let e=this._value;e>0;e--){let I=this._weightedWaiters[e-1];I&&(I.forEach(l=>l.resolve()),this._weightedWaiters[e-1]=[])}else{let e=this._queue[0].priority;for(let I=this._value;I>0;I--){let l=this._weightedWaiters[I-1];if(!l)continue;let n=l.findIndex(c=>c.priority<=e);(n===-1?l:l.splice(0,n)).forEach(c=>c.resolve())}}}_couldLockImmediately(e,I){return(this._queue.length===0||this._queue[0].priority<I)&&e<=this._value}};function IPI(t,e){let I=PKe(t,l=>e.priority<=l.priority);t.splice(I+1,0,e)}function PKe(t,e){for(let I=t.length-1;I>=0;I--)if(e(t[I]))return I;return-1}var tPI=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(s){s(c)})}return new(I||(I=Promise))(function(c,s){function a(d){try{o(l.next(d))}catch(i){s(i)}}function r(d){try{o(l.throw(d))}catch(i){s(i)}}function o(d){d.done?c(d.value):n(d.value).then(a,r)}o((l=l.apply(t,e||[])).next())})},Dq=class{constructor(e){this._semaphore=new rZe(1,e)}acquire(){return tPI(this,arguments,void 0,function*(e=0){let[,I]=yield this._semaphore.acquire(1,e);return I})}runExclusive(e,I=0){return this._semaphore.runExclusive(()=>e(),1,I)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(e=0){return this._semaphore.waitForUnlock(1,e)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}},KKe=function(t,e,I,l){function n(c){return c instanceof I?c:new I(function(s){s(c)})}return new(I||(I=Promise))(function(c,s){function a(d){try{o(l.next(d))}catch(i){s(i)}}function r(d){try{o(l.throw(d))}catch(i){s(i)}}function o(d){d.done?c(d.value):n(d.value).then(a,r)}o((l=l.apply(t,e||[])).next())})};function qKe(t,e,I=_KI){return{acquire:(l,n)=>{let c;if(jq(t)?c=l:(c=void 0,n=l),c!==void 0&&c<=0)throw new Error(`invalid weight ${c}: must be positive`);return new Promise((s,a)=>KKe(this,void 0,void 0,function*(){let r=!1,o=setTimeout(()=>{r=!0,a(I)},e);try{let d=yield jq(t)?t.acquire(c,n):t.acquire(n);r?(Array.isArray(d)?d[1]:d)():(clearTimeout(o),s(d))}catch(d){r||(clearTimeout(o),a(d))}}))},runExclusive(l,n,c){return KKe(this,void 0,void 0,function*(){let s=()=>{};try{let a=yield this.acquire(n,c);return Array.isArray(a)?(s=a[1],yield l(a[0])):(s=a,yield l())}finally{s()}})},release(l){t.release(l)},cancel(){return t.cancel()},waitForUnlock:(l,n)=>{let c;if(jq(t)?c=l:(c=void 0,n=l),c!==void 0&&c<=0)throw new Error(`invalid weight ${c}: must be positive`);return new Promise((s,a)=>{let r=setTimeout(()=>a(I),e);(jq(t)?t.waitForUnlock(c,n):t.waitForUnlock(n)).then(()=>{clearTimeout(r),s()})})},isLocked:()=>t.isLocked(),getValue:()=>t.getValue(),setValue:l=>t.setValue(l)}}function jq(t){return t.getValue!==void 0}var Kq=class{mutexes=new Map;async runExclusive(e,I,l=5e3){let n=this.mutexes.get(e);n||(n=new Dq,n.refCount=0,this.mutexes.set(e,n));let c=n;try{return c.refCount++,await qKe(n,l).runExclusive(I)}finally{--c.refCount===0&&this.mutexes.delete(e)}}};var _Ke=".copilot",$Ke=new Kq;async function dPI(t){let e=oPI(t);try{await cPI(e,{recursive:!0,mode:448})}catch{}}var ePe=(t,e)=>{let I=()=>{let r=process.env.XDG_STATE_HOME;return r?Sx(r,_Ke):Sx(GPI(),_Ke)},l=()=>`${e}-state`,n=r=>{let o=".jsonl",d=l()+(r?"":o);return Sx(I(),d,r?`${r}${o}`:"")};return{load:async r=>{let o=n(r);if(!lPI(o))return[];try{let i=(await $Ke.runExclusive(o,()=>aPI(o,"utf8"))).trim().split(`
1358
1358
  `).filter(p=>p.trim()),h=[];for(let p=0;p<i.length;p++)try{let Z=JSON.parse(i[p]),u=t(Z);h.push(u)}catch(Z){throw new Error(`Invalid event at line ${p+1} in ${o}: ${Z}`)}return h}catch(d){throw new Error(`Failed to read JSONL from ${o}: ${d}`)}},append:async(r,o)=>{let d=n(o),i=Array.isArray(r)?r:[r];try{await dPI(d);let h=i.map(p=>JSON.stringify(p)).join(`
1359
1359
  `)+`
1360
1360
  `;await $Ke.runExclusive(d,()=>nPI(d,h,{mode:384}))}catch(h){throw new Error(`Failed to append to JSONL file ${d}: ${h}`)}},path:n,directoryFiles:async()=>{let r=Sx(I(),l());try{let d=(await sPI(r)).filter(h=>h.endsWith(".jsonl")),i=await Promise.all(d.map(async h=>{let p=Sx(r,h);try{let Z=await rPI(p);return{file:h,mtime:Z.mtime}}catch{return{file:h,mtime:new Date}}}));return i.sort((h,p)=>p.mtime.getTime()-h.mtime.getTime()),i.map(h=>h.file)}catch{return[]}},home:I,directory:l}};var Gp=ePe(DKe.parse,"session");var m1=class t extends AV{flushTimer=null;flushDebounceMs;isDirty=!1;unflushedEvents=[];constructor({sessionId:e,startTime:I,logger:l,options:n}){super({sessionId:e,startTime:I,logger:l}),this.flushDebounceMs=n?.flushDebounceMs??100}addEvent(e){let I=super.addEvent(e);return this.unflushedEvents.push(I),this.isDirty=!0,this.getEvents().length>1&&this.scheduleDebouncedFlush(),I}scheduleDebouncedFlush(){this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=setTimeout(()=>{this.flush().catch(e=>{this.logger.error(`Debounced flush failed: ${e}`)})},this.flushDebounceMs)}async flush(){if(!(!this.isDirty||this.unflushedEvents.length===0)){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null);try{let e=this.unflushedEvents.filter(I=>!I.ephemeral);await Gp.append(e,this.sessionId),this.unflushedEvents=[],this.isDirty=!1}catch(e){throw this.logger.error(`Failed to flush session ${this.sessionId}: ${e}`),e}}}getFilePath(){return Gp.path(this.sessionId)}static async load(e,I){let l=await Gp.load(e);if(l.length===0)throw new Error(`Session ${e} has no events`);if(l[0].type!=="session.start")throw new Error("First event must be a session.start event");let c=t.fromEvents({events:l,logger:I});return c.isDirty=!1,c.unflushedEvents=[],c}};G();import{unlink as iPI}from"fs/promises";import{join as bPI}from"path";G();var Pq=class{sessions;logger;lastAccessedSessionId;constructor({logger:e}={}){this.sessions=new Map,this.logger=e||new oi}async createSession(){let e=new AV({logger:this.logger});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}))}async saveSession(e){}async deleteSession(e){this.sessions.delete(e.sessionId),this.lastAccessedSessionId===e.sessionId&&(this.lastAccessedSessionId=void 0)}};var GZe=class extends Pq{copilotVersion;constructor({logger:e,version:I}){super({logger:e}),this.copilotVersion=I||"unknown"}async createSession(e){let I=e?.sessionId??ld(),l=new Date,n=new m1({sessionId:I,startTime:l,logger:this.logger});return n.addEvent({type:"session.start",data:{sessionId:I,version:1,producer:"copilot-agent",copilotVersion:this.copilotVersion,startTime:l.toISOString(),selectedModel:e?.selectedModel}}),n}async getSession(e){try{return await m1.load(e,this.logger)}catch{return}}async listSessions(){let e=await Gp.directoryFiles();return(await Promise.all(e.map(async l=>{let n=l.replace(".jsonl","");try{let c=await Gp.load(n);if(c.length===0)return null;let s=c[0];return s.type!=="session.start"?null:{sessionId:s.data.sessionId,startTime:new Date(s.data.startTime)}}catch{return null}}))).filter(l=>l!==null)}async getLastSession(){let e=await this.listSessions();if(e.length===0)return;e.sort((l,n)=>n.startTime.getTime()-l.startTime.getTime());let I=e[0].sessionId;return await this.getSession(I)}async deleteSession(e){let I=Gp.path(e.sessionId);await iPI(I)}getSessionsDirectory(){return bPI(Gp.home(),Gp.directory())}};G();G();var oZe=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))}};G();import{appendFile as mPI,access as hPI,mkdir as pPI}from"fs/promises";import{constants as ZPI}from"fs";import{dirname as uPI}from"path";var dZe=class extends bp{constructor(I,l,n){super(l,n);this.filePath=I;this.writeQueue=WPI(uPI(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}
1361
- `;this.writeQueue=this.writeQueue.then(()=>this.performWrite(c)).catch(()=>{})}async performWrite(I){await mPI(this.filePath,I)}};async function WPI(t){try{await hPI(t,ZPI.F_OK)}catch{await pPI(t,{recursive:!0})}}G();async function*B$l(t){let{prompt:e,...I}=t;yield*new Tq(I).query(e)}export{Tq as Agent,bp as BaseLogger,oZe as CompoundLogger,c2 as ConsoleLogger,dZe as FileLogger,oi as NoopLogger,AV as Session,Pq as SessionManager,QV as executeHooks,IPe as internal,u1 as isDebugEnvironment,B$l as query};
1361
+ `;this.writeQueue=this.writeQueue.then(()=>this.performWrite(c)).catch(()=>{})}async performWrite(I){await mPI(this.filePath,I)}};async function WPI(t){try{await hPI(t,ZPI.F_OK)}catch{await pPI(t,{recursive:!0})}}G();async function*z$l(t){let{prompt:e,...I}=t;yield*new Tq(I).query(e)}export{Tq as Agent,bp as BaseLogger,oZe as CompoundLogger,c2 as ConsoleLogger,dZe as FileLogger,oi as NoopLogger,AV as Session,Pq as SessionManager,QV as executeHooks,IPe as internal,u1 as isDebugEnvironment,z$l as query};
1362
1362
  /*! Bundled license information:
1363
1363
 
1364
1364
  tmp/lib/tmp.js: