@github/copilot 0.0.333 → 0.0.334-1

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.333",
4
+ "version": "0.0.334-1",
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": "4cbf3da"
36
+ "gitCommit": "766a52f"
37
37
  },
38
38
  "dependencies": {
39
39
  "node-pty": "npm:@devm33/node-pty@^1.0.8",
package/sdk/index.d.ts CHANGED
@@ -826,6 +826,11 @@ declare class SessionManager_2 {
826
826
  * @returns An array of chat context messages.
827
827
  */
828
828
  getChatContextMessages(): ChatCompletionMessageParam[];
829
+ /**
830
+ * Get all system messages from the current session.
831
+ * @returns An array of system messages only.
832
+ */
833
+ getSystemContextMessages(): ChatCompletionMessageParam[];
829
834
  /**
830
835
  * Handle aborted operations by completing any pending tool calls with cancellation messages.
831
836
  * This provides consistent behavior whether interrupted by kill vs Esc/Ctrl+C.
package/sdk/index.js CHANGED
@@ -1021,7 +1021,7 @@ Good questions adhere to the following criteria:
1021
1021
  * I am editing the src/admin/landingPage.tsx file. What are the style, linting, and formatting practices to follow? Has there been any user feedback I should consider?
1022
1022
  </examples>
1023
1023
  </${uN}>
1024
- `;G();var JGI="/tmp/playwright-logs",MHe="0.0.40",LGI=[`@playwright/mcp@${MHe}`,"--viewport-size","1280, 720","--output-dir",JGI],mJl=[...LGI,"--isolated"];var fGI=class t extends Error{constructor(I){super(I),this.name="ImageSizeError",Object.setPrototypeOf(this,t.prototype)}},kGI=2e3;async function jHe(t,I,e,l){let c={"Content-Type":"application/octet-stream",Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",Authorization:"Bearer "+I},n=`${YmI(l)}/${t}`;e.info(`Downloading image from ${n}`);try{let a=await fetch(n,{method:"GET",headers:c});if(e.info(`Response status: ${a.status} ${a.statusText}`),e.debug(`Download Response URL: ${a.url}`),!a.ok){e.info(`Failed to download image, status: ${a.status}, statusText: ${a.statusText}`);try{let h=await a.text();e.info(`Error response body: ${h}`)}catch(h){e.info(`Could not read error response body: ${h}`)}return{size:0}}let r=(await a.json()).url;if(!r)return e.error(`No asset URL found in response for image GUID: ${t}`),{size:0};let o=await fetch(r,{method:"GET"});if(!o.ok)return e.error(`Failed to download image: ${o.status} ${o.statusText}`),{size:0};let d=await o.arrayBuffer(),b=d.byteLength;return e.info(`Downloaded content size: ${ji(b)}`),{size:b,buffer:Buffer.from(d),mimeType:o.headers.get("content-type")||void 0}}catch(a){return e.error("Network error downloading image"),a instanceof Error&&(e.info(`Error message: ${a.message}`),e.info(`Error stack: ${a.stack}`)),{size:0}}}function xGI(t,I,e,l){let c=/<img\b[^>]*\bsrc="([^"]+)"[^>]*>/g,n=/!\[.*?\]\((.*?)\)/g,a=[];return a.push(...Q9I(t,I,c,e,l)),a.push(...Q9I(t,I,n,e,l)),a}function Q9I(t,I,e,l,c){let n=t.matchAll(e),a=[],s=/\/([a-f0-9-]+)$/;for(let r of n){let o=qHe(r[1],I),d=_He(r[1],I,c);if(o||d){let b=r[1].match(s),h={url:r[1],guid:"",kind:d?"legacy_attachment":"attachment"};b&&b.length>1&&(h.guid=b[1]),a.push(h)}else if(l){let b={url:r[1],guid:"",kind:"committed_attachment"};a.push(b)}}return a}function DHe(t){return!t.startsWith("http://")&&!t.startsWith("https://")&&UGI(t)}function UGI(t){return/\.(png|jpe?g|gif|svg|webp|bmp|tiff?|ico|heic|avif)$/i.test(t)}function KHe(t){try{let I=/Here are relevant code snippets from the repository that might help with this task:\s*(\[[\s\S]*?\])(?=\n|$)/,e=t.match(I);if(!e?.[1]||e[1].length<=1)return null;let l=e[1].trim();return JSON.parse(l)}catch{return null}}function PHe(t,I,e){if(!t?.url||!t?.ref||!t?.path)throw new Error("Invalid repository insight: missing required fields");if(!I||I.trim()==="")throw new Error("Invalid image path: path cannot be empty");let l=t.url.split("/").slice(3,5).join("/"),c=t.ref.split("/")[2],n;if(I.startsWith("/"))n=I.slice(1);else{let s=t.path,r=Dk.dirname(s);n=Dk.resolve("/",r,I).slice(1)}return`${e}/${l}/blob/${c}/${n}`}function qHe(t,I){return I?!!t.startsWith(`${I}/user-attachments/assets`):!1}function _He(t,I,e){return I&&new RegExp(`^${I}/[\\w.-]+/[\\w.-]+/assets/\\d+/[^.]+$`).test(t)?(e.debug(`Legacy GitHub asset URL detected: ${t}`),!0):!1}async function SGI(t){let{width:I,height:e}=ukI(t);if(I===void 0||e===void 0)throw new Error("Unable to determine image dimensions.");return{width:I,height:e}}async function g9I(t,I,e,l,c,n){t.debug(`Checking if image is valid size and dimensions. Max size: ${e}, Max dimension: ${l}`);let{exceedsSizeLimit:a,exceedsDimensionLimit:s}=await Kk(e,l,n);if(!s&&!a)return t.debug("Image is within size and dimension limits."),n;if(s){t.debug(`Image x or y dimension exceeds the maximum limit of ${l}, attempting to resize`);let[r,o]=await tEe(t,n,l,e,c);if(!r){t.debug("Failed to resize image to fit within the maximum dimensions limits, skipping"),I.imagesRemovedDueToDimensions++,I.imagesFailedToResize++,o==="unsupported_mime_type"?I.resizeErrorsUnsupportedMimeType++:I.resizeErrorsUnknown++;return}let{exceedsDimensionLimit:d}=await Kk(e,l,r);if(d){I.imagesRemovedDueToDimensions++,t.debug("Image dimensions exceed the maximum dimensions limits, skipping");return}return I.imagesResized++,t.debug("Image resized successfully."),r}if(a){t.debug(`Image size ${ji(n.length)} is larger than the maximum size of ${ji(e)}, attempting to reduce image quality`);let r=await lEe(t,n,l,e,c);if(!r){t.debug("Failed to reduce image quality to fit within the maximum size, skipping"),I.imagesFailedToReduceQuality++,I.imagesRemovedDueToSize++;return}return I.imagesWithLoweredQuality++,t.debug("Image quality successfully reduced."),r}}async function Kk(t,I,e){let l=await SGI(e),c=e.length;return!l.width||!l.height?{exceedsSizeLimit:c>t,exceedsDimensionLimit:!1}:{exceedsSizeLimit:await IEe(t,e),exceedsDimensionLimit:await $He(I,e)}}async function $He(t,I){let e=await SGI(I);return!e.width||!e.height?!1:e.width>t||e.height>t}async function IEe(t,I){return I.length>t}var eEe;async function A9I(){return eEe||=(await import("sharp")).default}async function tEe(t,I,e,l,c){try{if(!X9I(t,c))return[void 0,"unsupported_mime_type"];let n=await SGI(I);if(!n.width||!n.height)return t.error("Failed to determine size of uploaded image"),[void 0,"determine_dimensions_failed"];let a=await A9I(),s=async(Y,F)=>{let A=a(I).resize(Y,F,{fit:"inside",withoutEnlargement:!0});return BGI(t,await A.toBuffer(),void 0,c)},r=Math.min(e,n.width),o=Math.min(e,n.height),d=await s(r,o);if(d&&d.length<=l)return[d,void 0];let b=Math.max(r,o),h=1,Z=b-1,p,W=0,N=10;for(;h<=Z&&W<N;){let Y=Math.floor((h+Z)/2),F=await s(Y,Y);if(!F)break;let{exceedsSizeLimit:A,exceedsDimensionLimit:g}=await Kk(l,e,F);!A&&!g?(p=F,h=Y+1):Z=Y-1,W++}return[p,void 0]}catch(n){return t.error(`Failed to resize image for upload: ${n instanceof Error?n.message:String(n)}`),[void 0,"unknown"]}}async function lEe(t,I,e,l,c){try{let n=c==="image/png"?80:100,a=c==="image/png"?Math.floor(n*.4):20,s=await BGI(t,I,a,c);if(!s||s.length>l)return;let r=a,o=n,d,b=0,h=10,Z=r,p=o-1;for(;Z<=p&&b<h;){let W=Math.floor((Z+p)/2),N=await BGI(t,I,W,c);if(!N)return d;let{exceedsSizeLimit:Y,exceedsDimensionLimit:F}=await Kk(l,e,N);!Y&&!F?(d=N,Z=W+1):p=W-1,b++}return d}catch(n){t.error(`Failed to reduce image quality: ${n instanceof Error?n.message:String(n)}`);return}}async function BGI(t,I,e,l){let n=(await A9I())(I);switch(l){case"image/png":return e?n.png({quality:e}).toBuffer():n.png().toBuffer();case"image/jpeg":return e?n.jpeg({quality:e}).toBuffer():n.jpeg().toBuffer();default:t.debug(`Unsupported image format: ${l}`);return}}var zGI=class{imagesRemovedDueToSize=0;imagesRemovedDueToDimensions=0;imagesResized=0;imagesWithLoweredQuality=0;imagesFailedToResize=0;imagesFailedToReduceQuality=0;base64ImagesSize=[];resizedBase64ImagesSize=[];extractedImagesSize=[];imagesResolvedFromGitHubMCPSize=[];resizeErrorsUnsupportedMimeType=0;resizeErrorsUnknown=0};function cEe(t,I,e,l){if(I<=0)return[];let c=[];for(let n of t){if(n.role!=="user"||c.length>=I)continue;let a=typeof n.content=="string"?n.content:JSON.stringify(n.content),s=KHe(a);if(s)for(let r in s){if(c.length>=I)break;let o=s[r].contents,d=xGI(o,e,!0,l);for(let b of d){if(c.length>=I)break;let h=b.url,Z="",p=!1;if(b.kind==="attachment"||b.kind==="legacy_attachment"?c.push(b):DHe(h)?(p=!0,Z=PHe(s[r],h,e),c.push({url:Z,guid:b.guid,kind:"committed_attachment"})):UGI(h)&&h.startsWith(e)&&(p=!0,c.push({...b,kind:"committed_attachment"})),p){let W=c[c.length-1],N=new RegExp(`^${e}/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$`),Y=W.url.match(N);if(l.info(`Blob match for ${W.url}: ${JSON.stringify(Y)}`),Y&&Y.length===5){let[,F,A,g,X]=Y;W.owner=F,W.repo=A,W.branch=g,W.path=X,l.info(`Repository metadata extracted: owner=${F}, repo=${A}, branch=${g}, path=${X}`)}else l.info(`Failed to extract repository metadata from URL: ${W.url}`)}}}}return c}function nEe(t,I){let e=I.flatMap(c=>kg(c)?c.content.flatMap(n=>n.type==="image_url"?n.image_url.url:[]):[]),l=new Set(e);return t.filter(c=>!l.has(c.url))}var HD=class{async resolveRepositoryImages(I,e,l,c,n,a){if(e<=0)return[];let s=cEe(I,e,l,c);this.logger.debug(`Found ${s.length} repository image URLs to process`);let r=nEe(s,I),o=await this.processImageReferences(r,n,a);return this.logger.debug(`Processed ${o.addedImages.length} repository image URLs`),o.addedImages}async*preRequest(I){let e=I.modelInfo;if(!e.capabilities?.limits){this.logger.debug("Model limits not defined, skipping image processing");return}if(!e.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 b of this.messagesToInsertOnNextPreRequest)I.messages.push(b),yield{kind:"message",message:b,turn:I.turn};this.messagesToInsertOnNextPreRequest.splice(0);let l=[],c=e.capabilities.limits.vision?.max_prompt_images??1,n=e.capabilities.limits.vision?.max_prompt_image_size??3145728,a=0,s=[],r=new zGI,o=new Map;for(let b of I.messages)if(b.role=="user")if(typeof b.content=="string"){let h=xGI(b.content,this.gitHubServerUrl,!1,this.logger).filter(p=>!this.processedImageUrls.has(p.url)),Z=await this.processImageReferences(h,n,r);s.push(...Z.addedImages)}else{let h=[];for(let[Z,p]of b.content.entries()){if(p.type==="text"){let W=xGI(p.text,this.gitHubServerUrl,!1,this.logger).filter(Y=>!this.processedImageUrls.has(Y.url)),N=await this.processImageReferences(W,n,r);s.push(...N.addedImages)}else if(p.type==="image_url"){if(p.image_url.url.startsWith("data:")){let[W,N]=await this.extractAndUploadImageData(p,n,r);if(W===""){this.logger.debug("Skipping image upload for empty image data");continue}if(s.push(W),Z>=1&&h.length>0){let Y=h.at(-1);Y&&Y.type==="text"&&Y.text&&Y.text.includes("screenshot")&&o.set(W,V9I(W))}h.pop();continue}a++}h.push(p)}b.content=h}for(this.logger.debug(`Found ${s.length} image urls in the messages`),this.logger.debug(`Allowed number of images: ${c}`);a<c&&s.length>0;){let b=s.shift();if(!b){this.logger.debug("Skipping empty image url");continue}if(this.processedImageUrls.has(b)){this.logger.debug(`Skipping already processed image url: ${b}`);continue}this.processedImageUrls.add(b);let h=`Here is the image url: ${b}`;o.has(b)&&(h=o.get(b)||h),this.logger.debug(`Adding image url: ${b}`),l.push({role:"user",content:[{type:"text",text:h},{type:"image_url",image_url:{url:b}}]}),a++}if(this.settings.featureFlags?.copilot_swe_agent_resolve_repo_images&&(this.logger.debug("Resolving repository images..."),a<c)){let b=await this.resolveRepositoryImages(I.messages,c-a,this.settings.github?.serverUrl||"",this.logger,n,r);this.logger.debug(`Resolved ${b.length} repository image URLs`);for(let h of b){if(a>=c)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),a++}}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 b=0;b<r.base64ImagesSize.length;b++)d[`base64ImageSize_${b}`]=r.base64ImagesSize[b];for(let b=0;b<r.resizedBase64ImagesSize.length;b++)d[`resizedBase64ImageSize_${b}`]=r.resizedBase64ImagesSize[b];for(let b=0;b<r.extractedImagesSize.length;b++)d[`extractedImageSize_${b}`]=r.extractedImagesSize[b];for(let b=0;b<r.imagesResolvedFromGitHubMCPSize.length;b++)d[`imagesResolvedFromGitHubMCPSize_${b}`]=r.imagesResolvedFromGitHubMCPSize[b];l.length>0&&this.logger.debug(`Using ${l.length} image messages`);for(let b of l)yield{kind:"message",message:b,turn:I.turn},I.messages.push(b);d.allImagesSendToLlm=I.messages.filter(kg).length,yield{kind:"image_processing",turn:I.turn,imageProcessingMetrics:d}}async extractAndUploadImageData(I,e,l){let c=ZE(this.settings);if(!c)return this.logger.debug("No user token available, skipping image upload"),[""];this.logger.debug("Found base64 image data, uploading...");let n=I.image_url.url.match(/^data:(.*?);base64,(.*)$/);if(!n||n.length<3)return this.logger.debug("Invalid base64 image data format, skipping"),[""];let a=n[1];if(!X9I(this.logger,a))return[""];let s=n[2];if(s.length===0)return this.logger.debug("Empty base64 image data, skipping"),[""];let r=Buffer.from(s,"base64");if(l.base64ImagesSize.push(r.length),r=await g9I(this.logger,l,e,kGI,a,r),l.resizedBase64ImagesSize.push(r?.length??-1),!r)return["",new fGI(`Image size exceeds maximum size of ${ji(e)}`)];s=r.toString("base64");try{let o=await this.uploadBase64ImageData(s,a,c);return o?(this.logger.debug(`Uploaded image url: ${o}`),I.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(I,e,l){try{let c=NmI(this.settings),n=e.split("/").at(1),a=`image-${Date.now()}.${n}`;if(!I||I.trim()==="")return this.logger.error("Empty image data provided for upload"),null;let s=Buffer.from(I,"base64");if(s.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=`${c}?name=${encodeURIComponent(a)}&content_type=${encodeURIComponent(e)}&repository_id=${r}`;this.logger.debug(`Uploading image data (${ji(s.length)}) to ${c} with name ${encodeURIComponent(a)} and content type ${encodeURIComponent(e)}`);let d={"Content-Type":"application/octet-stream",Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",Authorization:"Bearer "+l},b=await fetch(o,{method:"POST",headers:d,body:s}).catch(Z=>{throw Z instanceof Error?(this.logger.error(`Failed to upload image: ${Z.message}`),Z.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):Z.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(Z.message.includes("request entity too large")||Z.message.includes("payload too large"))&&this.logger.error("Request payload too large. Try reducing the image size.")):typeof Z=="object"&&Z!==null&&"code"in Z&&"message"in Z?(this.logger.error(`Failed to upload image: ${Z.message}`),Z.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):Z.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(Z.message.includes("request entity too large")||Z.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(Z)}`),this.logger.debug(`Complete error details: ${JSON.stringify({code:Z?.code,message:Z?.message,stack:Z?.stack,name:Z?.name,cause:Z?.cause},null,2)}`),Z});if(!b.ok){let Z=await b.text().catch(()=>"Unable to read error response");return this.logger.error(`Failed to upload image: ${b.status} ${b.statusText} - ${Z}`),null}let h=await b.json();return this.logger.debug(`Upload result: ${JSON.stringify(h,null,2)}`),h.url||null}catch(c){return this.logger.error(`Error handling image upload: ${c instanceof Error?c.message:String(c)}`),c instanceof Error&&c.stack&&this.logger.debug(`Stack trace: ${c.stack}`),null}}async getRepositoryImageViaTools(I){if(this.logger.debug(`Attempting to retrieve repository image: ${I.owner}/${I.repo}/${I.path}@${I.branch}`),this.githubGetFileContentsTool){this.logger.debug(`GitHub MCP tool found, calling with image reference: ${JSON.stringify(I)}`);try{let e=await this.githubGetFileContentsTool.callback({owner:I.owner,repo:I.repo,path:I.path,branch:I.branch},{settings:this.settings});if(this.logger.debug(`GitHub tool call completed. Result type: ${typeof e}`),this.logger.debug(`GitHub tool call result structure: ${typeof e=="object"&&e!==null?Object.keys(e).join(", "):typeof e}`),typeof e=="object"&&e!==null&&"binaryResultForLlm"in e&&Array.isArray(e.binaryResultForLlm)){this.logger.debug(`Tool result has binaryResultForLlm array with ${e.binaryResultForLlm.length} items`);try{for(let l of e.binaryResultForLlm)if(l.data&&l.mimeType){let c=Buffer.from(l.data,"base64"),n=l.mimeType;return{buffer:c,mimeType:n}}}catch(l){this.logger.error(`Failed to parse GitHub tool response: ${l}`),this.logger.debug(`binaryResultForLlm length: ${e.binaryResultForLlm?.length||0}`)}}else typeof e=="string"?this.logger.debug(`GitHub tool returned string result: ${e}`):this.logger.debug(`GitHub tool call failed or returned unexpected format. Result structure: ${typeof e=="object"&&e!==null?Object.keys(e).join(", "):typeof e}`)}catch(e){this.logger.error(`Error calling GitHub MCP tool: ${e}`)}}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(I,e,l){let c=[],n=await Promise.all(I);for(let{imgRef:a,attachment:s}of n)if(this.logger.debug(`Processing attachment for ${a.url}, has buffer: ${!!s.buffer}, buffer size: ${s.buffer?.length||0}`),s.buffer)if(e.extractedImagesSize.push(s.buffer.length),ql(this.settings,"copilot_swe_agent_resize_image_references")){if(!await g9I(this.logger,e,l,kGI,s.mimeType,s.buffer)){this.logger.info("Unable to resize image to be within limits, skipping");continue}c.push(a.url)}else{let r=await Kk(l,kGI,s.buffer);if(this.logger.debug(`Image size check for ${a.url}: size=${s.buffer.length}, maxSize=${l}, exceedsSize=${r.exceedsSizeLimit}, exceedsDimensions=${r.exceedsDimensionLimit}`),r.exceedsSizeLimit?(e.imagesRemovedDueToSize++,this.logger.debug(`Image ${a.url} removed due to size (${s.buffer.length} > ${l})`)):r.exceedsDimensionLimit&&(e.imagesRemovedDueToDimensions++,this.logger.debug(`Image ${a.url} removed due to dimensions`)),r.exceedsSizeLimit||r.exceedsDimensionLimit){this.processedImageUrls.add(a.url),this.logger.info(`Image has been removed from the request due to size constraints. Please resize images to be smaller than ${ji(l)}.`);continue}c.push(a.url),this.logger.debug(`Image ${a.url} passed size checks and added to results`)}else this.processedImageUrls.add(a.url),this.logger.debug(`Skipping image ${a.url} - could not fetch image data`);return c}async processImageReferences(I,e,l){let c=this.settings.github?.serverUrl||"";this.logger.debug(`Processing ${I.length} image references`),this.logger.debug(`GitHub server URL: ${c}`),this.logger.debug(`Image references: ${I.map(s=>s.url).join(", ")}`);let n=I.filter(s=>!this.processedImageUrls.has(s.url)).map(async s=>{if(this.logger.debug(`Processing image reference: ${JSON.stringify(s,null,2)}`),s.kind==="committed_attachment"){this.logger.debug(`Detected repository image - Owner: ${s.owner}, Repo: ${s.repo}, Branch: ${s.branch}, Path: ${s.path}`);let r=await this.getRepositoryImageViaTools(s);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:s,attachment:{size:r?.buffer?.length||0,mimeType:r?.mimeType||"",buffer:r?.buffer||null}}}else return this.logger.debug(`Non-repository image, using getAttachmentFromGuid for: ${s.url}`),{imgRef:s,attachment:await jHe(s.guid,ZE(this.settings),this.logger,this.settings)}}),a=await this.getImgRefsSmallerThanMaxSize(n,l,e);return this.logger.debug(`Processed image references, found ${a.length} attachments smaller than max size of ${ji(e)}`),{addedImages:a}}logger;settings;gitHubServerUrl;processedImageUrls;messagesToInsertOnNextPreRequest;githubGetFileContentsTool;constructor(I,e,l){this.logger=I,this.settings=e,this.gitHubServerUrl=e.github?.serverUrl,this.githubGetFileContentsTool=l,this.processedImageUrls=new Set,this.messagesToInsertOnNextPreRequest=[]}toJSON(){return"CAPIImageProcessor"}async onRequestError(I){}async preErrorThrow(I){this.processedImageUrls.size>0&&(I.isVisionFlow=!0)}async postToolExecution(I){let e=I.modelInfo,l=I.toolCall.function.name,c=I.toolResult;if(e?.capabilities?.supports?.vision){let n=Array.from(aEe(c,l));if(n.length===0){let a=await GEe(I.toolCall,this.logger);a&&n.push(a)}this.insertImageUrlMessages(n)}}insertImageUrlMessages(I){this.logger.info(`Inserted ${I.length} image URLs from tools into chat history.`);for(let e of I)this.messagesToInsertOnNextPreRequest.push({role:"user",content:[{type:"text",text:e.isScreenshot?"Here is a screenshot:":"Here is an image:"},{type:"image_url",image_url:{url:e.url}}]})}};function*aEe(t,I){for(let e of t.binaryResultForLlm??[])e.type==="image"&&(yield{url:`data:${e.mimeType};base64,${e.data}`,isScreenshot:I.toLowerCase().includes("screenshot")})}var sEe="playwright-browser_take_screenshot";function rEe(t){return typeof t=="object"&&t!==null&&typeof t.filename=="string"}async function GEe(t,I){if(t.function.name!==sEe)return;I.debug("Adding images using Playwright params fallback strategy");let e=JSON.parse(t.function.arguments);if(rEe(e)){let l=Dk.isAbsolute(e.filename)?e.filename:Dk.join(JGI,e.filename);I.debug(`Image from Playwright params: ${e.filename}. Updated to ${l}.`);let c=await dEe(l,I);if(c){let n=c.buffer.toString("base64");return{url:`data:${c.mimeType};base64,${n}`,isScreenshot:!0}}}}function oEe(t){switch(Dk.extname(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";default:return null}}function X9I(t,I){return I!=="image/png"&&I!=="image/jpeg"?(t.debug(`Unsupported content type: ${I}, only image / png and image / jpeg are supported`),!1):!0}async function dEe(t,I){try{if(!UGI(t))return I.debug(`Image ${t} does not have a valid image extension, skipping read`),null;let e=oEe(t);return e?{buffer:await THe.readFile(t),mimeType:e}:(I.debug(`Image ${t} is not a mime type supported for file -> data URI flow`),null)}catch(e){return I.error(`Failed to read image from disk: ${e instanceof Error?e.message:String(e)}`),null}}G();var YH=class{logger;constructor(I){this.logger=I}toJSON(){return"BasicTruncator"}async*preRequest(I){let e=await w9I(I.messages,I.toolDefinitions,I.modelInfo.name,I.tokenLimit);e.tokensRemovedDuringTruncation>0&&this.logger.debug(`BasicTruncator truncated: ${JSON.stringify(e)}`),yield{kind:"history_truncated",turn:I.turn,performedBy:"BasicTruncator",truncateResult:e}}},ED=class{truncateOnNextRequest=!1;userMessageToTruncateUpTo;logger;constructor(I,e){this.userMessageToTruncateUpTo=I,this.logger=e,this.logger.debug(`AnthropicTokenLimitErrorTruncator will truncate up to message: ${JSON.stringify(I)}`)}async*preRequest(I){if(this.truncateOnNextRequest){this.truncateOnNextRequest=!1;let e=ZvI(this.userMessageToTruncateUpTo,I.messages);if(e===-1){this.logger.debug(`Failed to find user message to truncate up to: ${JSON.stringify(this.userMessageToTruncateUpTo)}`),this.logger.debug(`Current messages: ${JSON.stringify(I.messages)}`);return}let l=await w9I(I.messages,I.toolDefinitions,I.modelInfo.name,I.tokenLimit,e);l.tokensRemovedDuringTruncation>0&&this.logger.debug(`AnthropicTokenLimitErrorTruncator truncated: ${JSON.stringify(l)}`),yield{kind:"history_truncated",turn:I.turn,performedBy:"AnthropicTokenLimitErrorTruncator",truncateResult:l}}}async preErrorThrow(I){}async onRequestError(I){if(I){if(typeof I=="object"&&"code"in I&&I.code==="model_max_prompt_tokens_exceeded"){this.truncateOnNextRequest=!0;return}let e=[JSON.stringify(I)];I instanceof Error&&(e.push(I.message),I.cause instanceof Error?e.push(I.cause.message):I.cause&&e.push(JSON.stringify(I.cause)));let l="Input length and `max_tokens` exceed context limit";this.logger.debug(`Looking for error amongst: ${e.join(", ")}`),e.some(c=>c.includes(l))&&(this.truncateOnNextRequest=!0)}}toJSON(){return"AnthropicTokenLimitErrorTruncator"}},bEe=.95;function w9I(t,I,e,l,c){let n=t.length;if(n===0)return{preTruncationTokensInMessages:0,preTruncationMessagesLength:n,postTruncationTokensInMessages:0,postTruncationMessagesLength:n,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let a=t.map(Z=>Ff(Z,e)),s=Uh(JSON.stringify(I),e),r=l*bEe,o=a.reduce((Z,p)=>Z+p,0)+s;if(o<=r)return{preTruncationTokensInMessages:o,preTruncationMessagesLength:n,postTruncationTokensInMessages:o,postTruncationMessagesLength:n,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let d=new Set,b=0,h=Math.min(c??t.length,t.length);for(let Z=0;Z<h;Z++){let p=t[Z];if(p.role!=="system"&&p.role!=="tool"&&p.role!=="user"){if(p.role==="assistant"){let W=p.tool_calls||[],N=W.filter(MG).filter(g=>g.function.name===S1),Y=W.filter(MG).filter(g=>g.function.name!==S1),F=N.length===0,A=new Set(Y.map(g=>g.id));if(Y.length>0&&(p.tool_calls=N,a[Z]=Ff(p,e)),F&&(d.add(Z),b+=a[Z]),A.size>0)for(let g=Z+1;g<t.length;g++){let X=t[g];if(X.role==="tool"&&A.has(X.tool_call_id)&&(d.add(g),b+=a[g],A.delete(X.tool_call_id),A.size===0))break}}if(o-b<r)break}}for(let Z=t.length-1;Z>=0;Z--)d.has(Z)&&t.splice(Z,1);return{preTruncationTokensInMessages:o,preTruncationMessagesLength:n,postTruncationTokensInMessages:o-b,postTruncationMessagesLength:t.length,tokensRemovedDuringTruncation:b,messagesRemovedDuringTruncation:n-t.length}}G();var zr=class extends Bh{constructor(){super()}debug(I){}log(I){}info(I){}notice(I){}warning(I){}error(I){}startGroup(I,e){}endGroup(I){}};G();G();var H9I={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"}]},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 vD(t,I,e){let l=(e||H9I)[t.toLowerCase()],c=new Set;for(;typeof l=="string";){if(c.has(l))return!1;c.add(l),l=H9I[l]}if(!l)return!1;let n=I.toLowerCase();return l.tools.some(a=>a.toolName===n)}var iEe="image";var mEe="resource",hEe=60*1e3*2,ZEe={timeout:hEe};var OGI=class{constructor(I,e,l){this.settings=I;this.logger=e;this.permissions=l}async invokeTool(I,e,l="hidden_characters"){let c=await this.doInvokeTool(I,e);return this.invokeToolResponseToToolResult(c,l)}invokeToolResponseToToolResult(I,e){let l=I.content||[],c="",n=[];for(let o of l)if(o.type==="text")c+=o.text||"";else if(o.type==="resource"){let d=o.resource;d&&d.blob?n.push({type:mEe,data:d.blob,mimeType:d.mimeType||"application/octet-stream"}):d&&d.text&&(c+=d.text)}else o.type==="image"&&n.push({type:iEe,data:o.data,mimeType:o.mimeType});let a=c;if(c==="")this.logger.debug("Tool invocation result is empty or undefined, skipping content filtering."),a=c;else try{let o=JSON.parse(c),d=$rI(o,e);a=JSON.stringify(d)}catch(o){this.logger.debug(`Unable to parse tool invocation as JSON. Treating it as a string for filtering: ${o}`),a=qrI(c,e)}this.logger.debug(`Tool invocation result: ${a}`);let s={},r=a?Tc(a,"output"):"";return I.isToolError?{textResultForLlm:a,resultType:"failure",error:a,sessionLog:r,toolTelemetry:s}:{textResultForLlm:a,binaryResultForLlm:n,resultType:"success",sessionLog:r,toolTelemetry:s}}async loadTools(I){let e=await this.loadToolsFromProvider(I),l={};for(let[c,n]of Object.entries(e)){let a=n.filterMode||"hidden_characters";l[c]={name:n.name,title:n.title||n.name,description:n.description,input_schema:n.input_schema,callback:async s=>{let r=e[c].serverName,o=e[c].name,d=e[c].title;if(!this.permissions.requestRequired)return this.invokeTool(c,s,a);let b=await this.permissions.request({kind:"mcp",serverName:r,toolName:o,toolTitle:d,args:s,readOnly:!!n.readOnly});switch(b.kind){case"approved":return this.invokeTool(c,s,a);case"denied-by-rules":return eU(b.rules);case"denied-no-approval-rule-and-could-not-request-from-user":return tU;case"denied-interactively-by-user":return IU;default:qY(b,`Unhandled permission result kind: ${b}`)}},safeForTelemetry:n.safeForTelemetry}}return Object.values(l)}};var Pk=class t extends OGI{toolIdToClientInfo=new Map;constructor(I,e,l={requestRequired:!1}){super(I,e,l)}async doInvokeTool(I,e){let l=this.toolIdToClientInfo.get(I);if(!l)throw new Error(`No MCP client found for tool ID: ${I}`);let c=l.mcpClient,n=t.getToolNameFromIdAndClientName(I,l.clientName),a=await c.callTool({name:n,arguments:e},void 0,{...ZEe,onprogress:s=>{this.logger.info(`Tool ${I} progress: ${JSON.stringify(s)}`)},resetTimeoutOnProgress:!0});if(!Array.isArray(a.content))throw new Error("Expected array of results");return{content:a.content,isToolError:a.error!==void 0&&a.error!==null||a.isError===!0}}async loadToolsFromProvider(I){let e={};this.logger.debug(`Loading tools for client: ${I.clientName}`);for(let l of(await I.mcpClient.listTools()).tools){if(!I.tools.includes("*")&&!I.tools.includes(l.name)){this.logger.debug(`Skipping tool ${l.name} for client ${I.clientName}`);continue}let c=t.getToolIdFromClientAndToolName(I.clientName,l.name);this.toolIdToClientInfo.set(c,I);let n;I.safeForTelemetry===!0?n={name:!0,inputsNames:!0}:I.safeForTelemetry&&typeof I.safeForTelemetry=="object"?n=I.safeForTelemetry:n={name:vD(I.clientName,l.name),inputsNames:!1},this.logger.debug(`Adding tool: ${c}`);let a;I.filterMapping===void 0?a="hidden_characters":typeof I.filterMapping=="object"?a=I.filterMapping[l.name]||"hidden_characters":a=I.filterMapping,e[c]={serverName:I.clientName,name:c,title:l.title||l.annotations?.title||l.name,description:l.description||"",input_schema:l.inputSchema,readOnly:l.annotations?.readOnlyHint,safeForTelemetry:n,filterMode:a}}return e}static getToolIdFromClientAndToolName(I,e){return`${I}-${e}`}static getToolNameFromIdAndClientName(I,e){return I.substring(e.length+1)}};G();var CD=class{settings;logger;gitHandler;location;commitPriorToCompletionWithTools;jitInstructions;emittedJitInstructions;constructor(I,e,l,c,n,a){this.settings=I,this.logger=e,this.gitHandler=l,this.location=c,this.commitPriorToCompletionWithTools=n,this.jitInstructions=a||{},this.emittedJitInstructions=new Set}toJSON(){return"JitInstructionsProcessor"}async*preRequest(I){if(this.jitInstructions&&Object.keys(this.jitInstructions).length>0){let e,l=async()=>{if(e===void 0)try{e=(await this.gitHandler.getChangedPaths(this.location,"HEAD",this.commitPriorToCompletionWithTools)).length}catch(a){this.logger.error(`Failed to get changed paths, err: ${a}`),e=1}return e},c;for(let[a,s]of Object.entries(this.jitInstructions)){let r=CiI(this.settings,s.percentRemainingOfTimeout);r.isWithin&&(!s.whenNoPathsChanged||await l()===0)&&(!c||r.withinMs<c[0])&&(c=[r.withinMs,s.instruction])}let n=c?.[1];if(typeof n=="function"&&(n=n(this.location)),n&&!this.emittedJitInstructions.has(n)){this.logger.debug(`Adding JIT instructions to the history: ${n}`),this.emittedJitInstructions.add(n);let a={role:"user",content:n};I.messages.push(a),yield{kind:"message",message:a,turn:I.turn,source:"jit-instruction"}}}}},TGI={remindWhereToDoWork:{instruction:F9I,percentRemainingOfTimeout:1/2,whenNoPathsChanged:!0},completeAsSoonAsPossible:{instruction:wD.completeAsSoonAsPossible,percentRemainingOfTimeout:1/6},commitNow:{instruction:wD.commitNow,percentRemainingOfTimeout:2/15},finalAnswerNeeded:{instruction:wD.finalAnswerNeeded,percentRemainingOfTimeout:1/10}};G();G();function jGI(t){if(!t)return pvI;let[I,...e]=t?.split(":")??[t,void 0],l=e.join(":")||void 0;return{agent:I||void 0,model:l||void 0}}G();G();function JD(t){return t.kind==="message"&&t.message.role==="assistant"}function E9I(t){return t.kind==="message"&&t.message.role==="user"}function v9I(t){return t.kind==="message"&&t.message.role==="assistant"&&!!t.message.tool_calls}function C9I(t){return t.kind==="message"&&t.message.role==="tool"}function pEe(t,I){return t.toolCalls.find(e=>e.toolCallId===I)}function uEe(t,I){let e=I.function.name;try{let l=JSON.parse(I.function.arguments||"{}"),n=t.find(a=>a.name===e)?.safeForTelemetry||{name:!1,inputsNames:!1};return{toolCallId:I.id,toolName:e,arguments:I.function.arguments,safeForTelemetryToolName:n===!0||n.name?e:MV(e),safeForTelemetryArguments:n===!0||n.inputsNames?ivI(l):""}}catch{return{toolCallId:I.id,toolName:e,arguments:I.function.arguments,safeForTelemetryToolName:MV(e),safeForTelemetryArguments:""}}}var LD=class{forAgent;turnDataCache;emittedTurns=new Set;callback;settings;toolsInUse;constructor(I,e,l,c){this.forAgent=I,this.turnDataCache=new Map,this.emittedTurns=new Set,this.callback=e,this.settings=l,this.toolsInUse=c}getTurnData(){return this.turnDataCache}async ingestEvent(I){let e,l;if("turn"in I&&typeof I.turn=="number"){if(e=I.turn+1,this.emittedTurns.has(e))return;this.turnDataCache.has(e)||this.turnDataCache.set(e,{featureFlagsAsString:MP(this.settings),toolCalls:[],toolCallExecutions:[],turn:e}),l=this.turnDataCache.get(e)}else return;I.kind==="tool_execution"?await this.ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(l,I):I.kind==="turn_started"||I.kind==="turn_failed"||I.kind==="turn_retry"||I.kind==="turn_ended"?(l={...l,model:I.model,modelInfo:JSON.stringify(I.modelInfo)},I.kind==="turn_started"?l={...l,startTimeMs:I.timestampMs}:I.kind==="turn_retry"?l={...l,endTimeMs:I.timestampMs,retriesUsed:(l.retriesUsed??0)+1}:I.kind==="turn_failed"?l={...l,endTimeMs:I.timestampMs,error:I.error}:I.kind==="turn_ended"&&(l={...l,endTimeMs:I.timestampMs})):I.kind==="history_truncated"?l={...l,truncateEvent:I}:I.kind==="image_processing"?l={...l,imageProcessingMetrics:I.imageProcessingMetrics}:I.kind==="images_removed"?l={...l,largeImagesRemoved:(l.largeImagesRemoved??0)+(I.largeImagesRemoved?1:0),imagesRemoved:(l.imagesRemoved??0)+(I.imagesRemoved?1:0)}:I.kind==="model_call_success"||I.kind==="model_call_failure"?(l={...l,modelCallDurationMs:I.modelCallDurationMs,api_call_id:I.modelCall.api_id,provider_call_id:I.modelCall.request_id,conversationStructureSummary:mvI(I.requestMessages)},I.kind==="model_call_success"&&(l={...l,responsePromptTokens:I.responseUsage?.prompt_tokens,responseCompletionTokens:I.responseUsage?.completion_tokens,responseTotalTokens:I.responseUsage?.total_tokens})):E9I(I)&&I.source==="jit-instruction"?l={...l,jitInstructionsAdded:(l?.jitInstructionsAdded??0)+1}:JD(I)&&I.message.tool_calls?l={...l,toolCalls:l.toolCalls.concat(I.message.tool_calls.map(c=>({...uEe(this.toolsInUse,c)})))}:C9I(I)&&(l={...l,toolCallExecutions:l.toolCallExecutions.concat([I.message.tool_call_id])}),this.turnDataCache.set(e,l),I.kind==="turn_ended"&&(await this.emitTurnTelemetry(e),this.emittedTurns.add(e),this.turnDataCache.delete(e))}async emitTurnTelemetry(I){let e=this.turnDataCache.get(I);if(e){let l={kind:"telemetry",telemetry:{event:"get_completion_with_tools_turn",properties:{model:e.model||"default",modelInfo:e.modelInfo||"{}",api_call_id:e.api_call_id,provider_call_id:e.provider_call_id,agent:this.forAgent,toolCalls:JSON.stringify(e.toolCalls.map(c=>({toolCallId:c.toolCallId,toolName:c.safeForTelemetryToolName}))),toolCallExecutions:JSON.stringify(e.toolCallExecutions),error:e.error,featureFlags:MP(this.settings),conversationStructureSummary:e.conversationStructureSummary,truncationPerformedBy:e.truncateEvent?.performedBy},metrics:{turn:I,turnDurationMs:e.endTimeMs!==void 0&&e.startTimeMs!==void 0?e.endTimeMs-e.startTimeMs:0,modelCallDurationMs:e.modelCallDurationMs,retriesUsed:e.retriesUsed??0,numToolCalls:e.toolCalls.length,numToolExecutions:e.toolCallExecutions.length,largeImagesRemoved:e.largeImagesRemoved,imagesRemoved:e.imagesRemoved,responsePromptTokens:e.responsePromptTokens,responseCompletionTokens:e.responseCompletionTokens,responseTotalTokens:e.responseTotalTokens,jitInstructionsAdded:e.jitInstructionsAdded,...e.truncateEvent?.truncateResult,...e.imageProcessingMetrics},restrictedProperties:{}}};await this.callback.progress(l)}}async ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(I,e){let l=e.toolCallId,c=pEe(I,l);if(c){let n=e.toolResult,a={kind:"telemetry",telemetry:{event:"tool_call_executed",properties:{...n.toolTelemetry.properties,resultType:n.resultType,toolCallId:l,arguments:c.safeForTelemetryArguments,toolName:c.safeForTelemetryToolName,api_call_id:I.api_call_id},restrictedProperties:{...n.toolTelemetry.restrictedProperties,arguments:c.arguments,result:n.textResultForLlm,toolName:c.toolName,error:n.error},metrics:{...n.toolTelemetry.metrics,durationMs:e.durationMs}}};await this.callback.progress(a)}}};G();G();var qk=class{async*preRequest(I){yield*[]}handleCallbackResponse(I){}getUserMessages(){return[]}clearUserMessages(){}canProcessUserMessages(){return!1}toJSON(){return JSON.stringify({type:"NoopUserMessageProcessor"})}};var kD=class{constructor(I,e){this.runtimeContext=I;this.customAgentName=e;this.gitHandlers={silent:new Mr(new zr,this.runtimeContext.exec),logging:new Mr(this.runtimeContext.logger,this.runtimeContext.exec)}}gitHandlers;async agent(I,e,l,c,n,a,s=new qk,r){let o=async(Z,p,W)=>{let N={role:"user",content:Z};return await this.runtimeContext.callback?.progress({kind:"message",message:N,turn:0}),await this.runCompletionWithTools(I,e,[...p??[],N],a,n,{executeToolsInParallel:ql(this.runtimeContext.settings,"copilot_swe_agent_parallel_tool_execution"),initialTurnCount:W},r,s)},d=c,b=l??[],h;for(;d;){let Z=await o(d,b,h);h=Z.finalTurnCount,b=Z.messages,d=await r?.onResult(Z.postCompletionWithToolsCommitHash)}for(let Z of a)if(Z.shutdown){let p=await Z.shutdown();p&&await this.runtimeContext.callback?.progress(p)}return{finalTurnCount:h||0,messages:b}}async runCompletionWithTools(I,e,l,c,n,a,s,r=new qk){let o=this.runtimeContext.callback?new LD("sweagent-capi",this.runtimeContext.callback,this.runtimeContext.settings,c):void 0,d=this.gitHandlers.logging,b=await d.getCurrentCommitHash(I),h=l.filter(A=>A.role==="user").at(-1),Z=this.createCompletionWithToolsProcessors(I,b,c,r,n,s,h),p=this.runtimeContext.client.getCompletionWithTools(e,l,c,{...a,processors:Z}),W=0,N=[...l],Y=[];for await(let A of p){if(ql(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")){let g=await this.runtimeContext.callback?.progress(A,{accepts_user_messages:r.canProcessUserMessages()});r.handleCallbackResponse(g)}else A.kind==="response"||A.kind==="message"?await this.runtimeContext.callback?.progress({...A,customAgentName:this.customAgentName}):await this.runtimeContext.callback?.progress(A);o&&await o.ingestEvent(A),(A.kind==="message"||A.kind==="response")&&(A.kind==="message"&&N.push(A.message),A.kind==="response"&&Y.push(A.response),W=Math.max(W,A.turn??0))}let F=await d.getCurrentCommitHash(I);return{finalTurnCount:W,messages:N,resultMessages:Y,preCompletionWithToolsCommitHash:b,postCompletionWithToolsCommitHash:F}}createCompletionWithToolsProcessors(I,e,l,c,n,a,s){let r=new HD(this.runtimeContext.logger,this.runtimeContext.settings,l.find(Z=>Z.name==="github-mcp-server-get_file_contents")),o=new CD(this.runtimeContext.settings,this.runtimeContext.logger,this.gitHandlers.silent,I,e,n),d=new YH(this.runtimeContext.logger),b=s?new ED(s,this.runtimeContext.logger):void 0,h=[o,r,d,b];return ql(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")&&h.push(c),{preRequest:h.filter(Z=>Z!==void 0),preToolsExecution:[a].filter(Z=>Z!==void 0),postToolExecution:[r,a].filter(Z=>Z!==void 0),onRequestError:[r,b].filter(Z=>Z!==void 0)}}};G();async function DGI(t,I,e,l,c){try{return(await l.invokeTool("blackbird-mcp-server/search_repository_with_agent",{task:t,depth:2,owner:I,repo:e,numSnippets:10},"hidden_characters")).textResultForLlm}catch(n){return c.error(`Error during Blackbird search: ${n}`),""}}var L9I=t=>ql(t,"copilot_swe_agent_search")||viI(t,"SearchAgentExperiment")==="enabled",J9I="search";function KGI(t){return t!==null&&typeof t=="object"&&"question"in t&&"reason"in t&&"searchCommand"in t}var WEe=(t,I,e)=>`
1024
+ `;G();var JGI="/tmp/playwright-logs",MHe="0.0.40",LGI=[`@playwright/mcp@${MHe}`,"--viewport-size","1280, 720","--output-dir",JGI],mJl=[...LGI,"--isolated"];var fGI=class t extends Error{constructor(I){super(I),this.name="ImageSizeError",Object.setPrototypeOf(this,t.prototype)}},kGI=2e3;async function jHe(t,I,e,l){let c={"Content-Type":"application/octet-stream",Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",Authorization:"Bearer "+I},n=`${YmI(l)}/${t}`;e.info(`Downloading image from ${n}`);try{let a=await fetch(n,{method:"GET",headers:c});if(e.info(`Response status: ${a.status} ${a.statusText}`),e.debug(`Download Response URL: ${a.url}`),!a.ok){e.info(`Failed to download image, status: ${a.status}, statusText: ${a.statusText}`);try{let h=await a.text();e.info(`Error response body: ${h}`)}catch(h){e.info(`Could not read error response body: ${h}`)}return{size:0}}let r=(await a.json()).url;if(!r)return e.error(`No asset URL found in response for image GUID: ${t}`),{size:0};let o=await fetch(r,{method:"GET"});if(!o.ok)return e.error(`Failed to download image: ${o.status} ${o.statusText}`),{size:0};let d=await o.arrayBuffer(),b=d.byteLength;return e.info(`Downloaded content size: ${ji(b)}`),{size:b,buffer:Buffer.from(d),mimeType:o.headers.get("content-type")||void 0}}catch(a){return e.error("Network error downloading image"),a instanceof Error&&(e.info(`Error message: ${a.message}`),e.info(`Error stack: ${a.stack}`)),{size:0}}}function xGI(t,I,e,l){let c=/<img\b[^>]*\bsrc="([^"]+)"[^>]*>/g,n=/!\[.*?\]\((.*?)\)/g,a=[];return a.push(...Q9I(t,I,c,e,l)),a.push(...Q9I(t,I,n,e,l)),a}function Q9I(t,I,e,l,c){let n=t.matchAll(e),a=[],s=/\/([a-f0-9-]+)$/;for(let r of n){let o=qHe(r[1],I),d=_He(r[1],I,c);if(o||d){let b=r[1].match(s),h={url:r[1],guid:"",kind:d?"legacy_attachment":"attachment"};b&&b.length>1&&(h.guid=b[1]),a.push(h)}else if(l){let b={url:r[1],guid:"",kind:"committed_attachment"};a.push(b)}}return a}function DHe(t){return!t.startsWith("http://")&&!t.startsWith("https://")&&UGI(t)}function UGI(t){return/\.(png|jpe?g|gif|svg|webp|bmp|tiff?|ico|heic|avif)$/i.test(t)}function KHe(t){try{let I=/Here are relevant code snippets from the repository that might help with this task:\s*(\[[\s\S]*?\])(?=\n|$)/,e=t.match(I);if(!e?.[1]||e[1].length<=1)return null;let l=e[1].trim();return JSON.parse(l)}catch{return null}}function PHe(t,I,e){if(!t?.url||!t?.ref||!t?.path)throw new Error("Invalid repository insight: missing required fields");if(!I||I.trim()==="")throw new Error("Invalid image path: path cannot be empty");let l=t.url.split("/").slice(3,5).join("/"),c=t.ref.split("/")[2],n;if(I.startsWith("/"))n=I.slice(1);else{let s=t.path,r=Dk.dirname(s);n=Dk.resolve("/",r,I).slice(1)}return`${e}/${l}/blob/${c}/${n}`}function qHe(t,I){return I?!!t.startsWith(`${I}/user-attachments/assets`):!1}function _He(t,I,e){return I&&new RegExp(`^${I}/[\\w.-]+/[\\w.-]+/assets/\\d+/[^.]+$`).test(t)?(e.debug(`Legacy GitHub asset URL detected: ${t}`),!0):!1}async function SGI(t){let{width:I,height:e}=ukI(t);if(I===void 0||e===void 0)throw new Error("Unable to determine image dimensions.");return{width:I,height:e}}async function g9I(t,I,e,l,c,n){t.debug(`Checking if image is valid size and dimensions. Max size: ${e}, Max dimension: ${l}`);let{exceedsSizeLimit:a,exceedsDimensionLimit:s}=await Kk(e,l,n);if(!s&&!a)return t.debug("Image is within size and dimension limits."),n;if(s){t.debug(`Image x or y dimension exceeds the maximum limit of ${l}, attempting to resize`);let[r,o]=await tEe(t,n,l,e,c);if(!r){t.debug("Failed to resize image to fit within the maximum dimensions limits, skipping"),I.imagesRemovedDueToDimensions++,I.imagesFailedToResize++,o==="unsupported_mime_type"?I.resizeErrorsUnsupportedMimeType++:I.resizeErrorsUnknown++;return}let{exceedsDimensionLimit:d}=await Kk(e,l,r);if(d){I.imagesRemovedDueToDimensions++,t.debug("Image dimensions exceed the maximum dimensions limits, skipping");return}return I.imagesResized++,t.debug("Image resized successfully."),r}if(a){t.debug(`Image size ${ji(n.length)} is larger than the maximum size of ${ji(e)}, attempting to reduce image quality`);let r=await lEe(t,n,l,e,c);if(!r){t.debug("Failed to reduce image quality to fit within the maximum size, skipping"),I.imagesFailedToReduceQuality++,I.imagesRemovedDueToSize++;return}return I.imagesWithLoweredQuality++,t.debug("Image quality successfully reduced."),r}}async function Kk(t,I,e){let l=await SGI(e),c=e.length;return!l.width||!l.height?{exceedsSizeLimit:c>t,exceedsDimensionLimit:!1}:{exceedsSizeLimit:await IEe(t,e),exceedsDimensionLimit:await $He(I,e)}}async function $He(t,I){let e=await SGI(I);return!e.width||!e.height?!1:e.width>t||e.height>t}async function IEe(t,I){return I.length>t}var eEe;async function A9I(){return eEe||=(await import("sharp")).default}async function tEe(t,I,e,l,c){try{if(!X9I(t,c))return[void 0,"unsupported_mime_type"];let n=await SGI(I);if(!n.width||!n.height)return t.error("Failed to determine size of uploaded image"),[void 0,"determine_dimensions_failed"];let a=await A9I(),s=async(Y,F)=>{let A=a(I).resize(Y,F,{fit:"inside",withoutEnlargement:!0});return BGI(t,await A.toBuffer(),void 0,c)},r=Math.min(e,n.width),o=Math.min(e,n.height),d=await s(r,o);if(d&&d.length<=l)return[d,void 0];let b=Math.max(r,o),h=1,Z=b-1,p,W=0,N=10;for(;h<=Z&&W<N;){let Y=Math.floor((h+Z)/2),F=await s(Y,Y);if(!F)break;let{exceedsSizeLimit:A,exceedsDimensionLimit:g}=await Kk(l,e,F);!A&&!g?(p=F,h=Y+1):Z=Y-1,W++}return[p,void 0]}catch(n){return t.error(`Failed to resize image for upload: ${n instanceof Error?n.message:String(n)}`),[void 0,"unknown"]}}async function lEe(t,I,e,l,c){try{let n=c==="image/png"?80:100,a=c==="image/png"?Math.floor(n*.4):20,s=await BGI(t,I,a,c);if(!s||s.length>l)return;let r=a,o=n,d,b=0,h=10,Z=r,p=o-1;for(;Z<=p&&b<h;){let W=Math.floor((Z+p)/2),N=await BGI(t,I,W,c);if(!N)return d;let{exceedsSizeLimit:Y,exceedsDimensionLimit:F}=await Kk(l,e,N);!Y&&!F?(d=N,Z=W+1):p=W-1,b++}return d}catch(n){t.error(`Failed to reduce image quality: ${n instanceof Error?n.message:String(n)}`);return}}async function BGI(t,I,e,l){let n=(await A9I())(I);switch(l){case"image/png":return e?n.png({quality:e}).toBuffer():n.png().toBuffer();case"image/jpeg":return e?n.jpeg({quality:e}).toBuffer():n.jpeg().toBuffer();default:t.debug(`Unsupported image format: ${l}`);return}}var zGI=class{imagesRemovedDueToSize=0;imagesRemovedDueToDimensions=0;imagesResized=0;imagesWithLoweredQuality=0;imagesFailedToResize=0;imagesFailedToReduceQuality=0;base64ImagesSize=[];resizedBase64ImagesSize=[];extractedImagesSize=[];imagesResolvedFromGitHubMCPSize=[];resizeErrorsUnsupportedMimeType=0;resizeErrorsUnknown=0};function cEe(t,I,e,l){if(I<=0)return[];let c=[];for(let n of t){if(n.role!=="user"||c.length>=I)continue;let a=typeof n.content=="string"?n.content:JSON.stringify(n.content),s=KHe(a);if(s)for(let r in s){if(c.length>=I)break;let o=s[r].contents,d=xGI(o,e,!0,l);for(let b of d){if(c.length>=I)break;let h=b.url,Z="",p=!1;if(b.kind==="attachment"||b.kind==="legacy_attachment"?c.push(b):DHe(h)?(p=!0,Z=PHe(s[r],h,e),c.push({url:Z,guid:b.guid,kind:"committed_attachment"})):UGI(h)&&h.startsWith(e)&&(p=!0,c.push({...b,kind:"committed_attachment"})),p){let W=c[c.length-1],N=new RegExp(`^${e}/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$`),Y=W.url.match(N);if(l.info(`Blob match for ${W.url}: ${JSON.stringify(Y)}`),Y&&Y.length===5){let[,F,A,g,X]=Y;W.owner=F,W.repo=A,W.branch=g,W.path=X,l.info(`Repository metadata extracted: owner=${F}, repo=${A}, branch=${g}, path=${X}`)}else l.info(`Failed to extract repository metadata from URL: ${W.url}`)}}}}return c}function nEe(t,I){let e=I.flatMap(c=>kg(c)?c.content.flatMap(n=>n.type==="image_url"?n.image_url.url:[]):[]),l=new Set(e);return t.filter(c=>!l.has(c.url))}var HD=class{async resolveRepositoryImages(I,e,l,c,n,a){if(e<=0)return[];let s=cEe(I,e,l,c);this.logger.debug(`Found ${s.length} repository image URLs to process`);let r=nEe(s,I),o=await this.processImageReferences(r,n,a);return this.logger.debug(`Processed ${o.addedImages.length} repository image URLs`),o.addedImages}async*preRequest(I){let e=I.modelInfo;if(!e.capabilities?.limits){this.logger.debug("Model limits not defined, skipping image processing");return}if(!e.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 b of this.messagesToInsertOnNextPreRequest)I.messages.push(b),yield{kind:"message",message:b,turn:I.turn};this.messagesToInsertOnNextPreRequest.splice(0);let l=[],c=e.capabilities.limits.vision?.max_prompt_images??1,n=e.capabilities.limits.vision?.max_prompt_image_size??3145728,a=0,s=[],r=new zGI,o=new Map;for(let b of I.messages)if(b.role=="user")if(typeof b.content=="string"){let h=xGI(b.content,this.gitHubServerUrl,!1,this.logger).filter(p=>!this.processedImageUrls.has(p.url)),Z=await this.processImageReferences(h,n,r);s.push(...Z.addedImages)}else{let h=[];for(let[Z,p]of b.content.entries()){if(p.type==="text"){let W=xGI(p.text,this.gitHubServerUrl,!1,this.logger).filter(Y=>!this.processedImageUrls.has(Y.url)),N=await this.processImageReferences(W,n,r);s.push(...N.addedImages)}else if(p.type==="image_url"){if(p.image_url.url.startsWith("data:")){let[W,N]=await this.extractAndUploadImageData(p,n,r);if(W===""){this.logger.debug("Skipping image upload for empty image data");continue}if(s.push(W),Z>=1&&h.length>0){let Y=h.at(-1);Y&&Y.type==="text"&&Y.text&&Y.text.includes("screenshot")&&o.set(W,V9I(W))}h.pop();continue}a++}h.push(p)}b.content=h}for(this.logger.debug(`Found ${s.length} image urls in the messages`),this.logger.debug(`Allowed number of images: ${c}`);a<c&&s.length>0;){let b=s.shift();if(!b){this.logger.debug("Skipping empty image url");continue}if(this.processedImageUrls.has(b)){this.logger.debug(`Skipping already processed image url: ${b}`);continue}this.processedImageUrls.add(b);let h=`Here is the image url: ${b}`;o.has(b)&&(h=o.get(b)||h),this.logger.debug(`Adding image url: ${b}`),l.push({role:"user",content:[{type:"text",text:h},{type:"image_url",image_url:{url:b}}]}),a++}if(this.settings.featureFlags?.copilot_swe_agent_resolve_repo_images&&(this.logger.debug("Resolving repository images..."),a<c)){let b=await this.resolveRepositoryImages(I.messages,c-a,this.settings.github?.serverUrl||"",this.logger,n,r);this.logger.debug(`Resolved ${b.length} repository image URLs`);for(let h of b){if(a>=c)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),a++}}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 b=0;b<r.base64ImagesSize.length;b++)d[`base64ImageSize_${b}`]=r.base64ImagesSize[b];for(let b=0;b<r.resizedBase64ImagesSize.length;b++)d[`resizedBase64ImageSize_${b}`]=r.resizedBase64ImagesSize[b];for(let b=0;b<r.extractedImagesSize.length;b++)d[`extractedImageSize_${b}`]=r.extractedImagesSize[b];for(let b=0;b<r.imagesResolvedFromGitHubMCPSize.length;b++)d[`imagesResolvedFromGitHubMCPSize_${b}`]=r.imagesResolvedFromGitHubMCPSize[b];l.length>0&&this.logger.debug(`Using ${l.length} image messages`);for(let b of l)yield{kind:"message",message:b,turn:I.turn},I.messages.push(b);d.allImagesSendToLlm=I.messages.filter(kg).length,yield{kind:"image_processing",turn:I.turn,imageProcessingMetrics:d}}async extractAndUploadImageData(I,e,l){let c=ZE(this.settings);if(!c)return this.logger.debug("No user token available, skipping image upload"),[""];this.logger.debug("Found base64 image data, uploading...");let n=I.image_url.url.match(/^data:(.*?);base64,(.*)$/);if(!n||n.length<3)return this.logger.debug("Invalid base64 image data format, skipping"),[""];let a=n[1];if(!X9I(this.logger,a))return[""];let s=n[2];if(s.length===0)return this.logger.debug("Empty base64 image data, skipping"),[""];let r=Buffer.from(s,"base64");if(l.base64ImagesSize.push(r.length),r=await g9I(this.logger,l,e,kGI,a,r),l.resizedBase64ImagesSize.push(r?.length??-1),!r)return["",new fGI(`Image size exceeds maximum size of ${ji(e)}`)];s=r.toString("base64");try{let o=await this.uploadBase64ImageData(s,a,c);return o?(this.logger.debug(`Uploaded image url: ${o}`),I.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(I,e,l){try{let c=NmI(this.settings),n=e.split("/").at(1),a=`image-${Date.now()}.${n}`;if(!I||I.trim()==="")return this.logger.error("Empty image data provided for upload"),null;let s=Buffer.from(I,"base64");if(s.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=`${c}?name=${encodeURIComponent(a)}&content_type=${encodeURIComponent(e)}&repository_id=${r}`;this.logger.debug(`Uploading image data (${ji(s.length)}) to ${c} with name ${encodeURIComponent(a)} and content type ${encodeURIComponent(e)}`);let d={"Content-Type":"application/octet-stream",Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",Authorization:"Bearer "+l},b=await fetch(o,{method:"POST",headers:d,body:s}).catch(Z=>{throw Z instanceof Error?(this.logger.error(`Failed to upload image: ${Z.message}`),Z.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):Z.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(Z.message.includes("request entity too large")||Z.message.includes("payload too large"))&&this.logger.error("Request payload too large. Try reducing the image size.")):typeof Z=="object"&&Z!==null&&"code"in Z&&"message"in Z?(this.logger.error(`Failed to upload image: ${Z.message}`),Z.code==="ECONNREFUSED"?this.logger.error("Connection refused. The server might be down or blocked."):Z.code==="ETIMEDOUT"?this.logger.error("Connection timed out. Check network conditions or server load."):(Z.message.includes("request entity too large")||Z.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(Z)}`),this.logger.debug(`Complete error details: ${JSON.stringify({code:Z?.code,message:Z?.message,stack:Z?.stack,name:Z?.name,cause:Z?.cause},null,2)}`),Z});if(!b.ok){let Z=await b.text().catch(()=>"Unable to read error response");return this.logger.error(`Failed to upload image: ${b.status} ${b.statusText} - ${Z}`),null}let h=await b.json();return this.logger.debug(`Upload result: ${JSON.stringify(h,null,2)}`),h.url||null}catch(c){return this.logger.error(`Error handling image upload: ${c instanceof Error?c.message:String(c)}`),c instanceof Error&&c.stack&&this.logger.debug(`Stack trace: ${c.stack}`),null}}async getRepositoryImageViaTools(I){if(this.logger.debug(`Attempting to retrieve repository image: ${I.owner}/${I.repo}/${I.path}@${I.branch}`),this.githubGetFileContentsTool){this.logger.debug(`GitHub MCP tool found, calling with image reference: ${JSON.stringify(I)}`);try{let e=await this.githubGetFileContentsTool.callback({owner:I.owner,repo:I.repo,path:I.path,branch:I.branch},{settings:this.settings});if(this.logger.debug(`GitHub tool call completed. Result type: ${typeof e}`),this.logger.debug(`GitHub tool call result structure: ${typeof e=="object"&&e!==null?Object.keys(e).join(", "):typeof e}`),typeof e=="object"&&e!==null&&"binaryResultForLlm"in e&&Array.isArray(e.binaryResultForLlm)){this.logger.debug(`Tool result has binaryResultForLlm array with ${e.binaryResultForLlm.length} items`);try{for(let l of e.binaryResultForLlm)if(l.data&&l.mimeType){let c=Buffer.from(l.data,"base64"),n=l.mimeType;return{buffer:c,mimeType:n}}}catch(l){this.logger.error(`Failed to parse GitHub tool response: ${l}`),this.logger.debug(`binaryResultForLlm length: ${e.binaryResultForLlm?.length||0}`)}}else typeof e=="string"?this.logger.debug(`GitHub tool returned string result: ${e}`):this.logger.debug(`GitHub tool call failed or returned unexpected format. Result structure: ${typeof e=="object"&&e!==null?Object.keys(e).join(", "):typeof e}`)}catch(e){this.logger.error(`Error calling GitHub MCP tool: ${e}`)}}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(I,e,l){let c=[],n=await Promise.all(I);for(let{imgRef:a,attachment:s}of n)if(this.logger.debug(`Processing attachment for ${a.url}, has buffer: ${!!s.buffer}, buffer size: ${s.buffer?.length||0}`),s.buffer)if(e.extractedImagesSize.push(s.buffer.length),ql(this.settings,"copilot_swe_agent_resize_image_references")){if(!await g9I(this.logger,e,l,kGI,s.mimeType,s.buffer)){this.logger.info("Unable to resize image to be within limits, skipping");continue}c.push(a.url)}else{let r=await Kk(l,kGI,s.buffer);if(this.logger.debug(`Image size check for ${a.url}: size=${s.buffer.length}, maxSize=${l}, exceedsSize=${r.exceedsSizeLimit}, exceedsDimensions=${r.exceedsDimensionLimit}`),r.exceedsSizeLimit?(e.imagesRemovedDueToSize++,this.logger.debug(`Image ${a.url} removed due to size (${s.buffer.length} > ${l})`)):r.exceedsDimensionLimit&&(e.imagesRemovedDueToDimensions++,this.logger.debug(`Image ${a.url} removed due to dimensions`)),r.exceedsSizeLimit||r.exceedsDimensionLimit){this.processedImageUrls.add(a.url),this.logger.info(`Image has been removed from the request due to size constraints. Please resize images to be smaller than ${ji(l)}.`);continue}c.push(a.url),this.logger.debug(`Image ${a.url} passed size checks and added to results`)}else this.processedImageUrls.add(a.url),this.logger.debug(`Skipping image ${a.url} - could not fetch image data`);return c}async processImageReferences(I,e,l){let c=this.settings.github?.serverUrl||"";this.logger.debug(`Processing ${I.length} image references`),this.logger.debug(`GitHub server URL: ${c}`),this.logger.debug(`Image references: ${I.map(s=>s.url).join(", ")}`);let n=I.filter(s=>!this.processedImageUrls.has(s.url)).map(async s=>{if(this.logger.debug(`Processing image reference: ${JSON.stringify(s,null,2)}`),s.kind==="committed_attachment"){this.logger.debug(`Detected repository image - Owner: ${s.owner}, Repo: ${s.repo}, Branch: ${s.branch}, Path: ${s.path}`);let r=await this.getRepositoryImageViaTools(s);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:s,attachment:{size:r?.buffer?.length||0,mimeType:r?.mimeType||"",buffer:r?.buffer||null}}}else return this.logger.debug(`Non-repository image, using getAttachmentFromGuid for: ${s.url}`),{imgRef:s,attachment:await jHe(s.guid,ZE(this.settings),this.logger,this.settings)}}),a=await this.getImgRefsSmallerThanMaxSize(n,l,e);return this.logger.debug(`Processed image references, found ${a.length} attachments smaller than max size of ${ji(e)}`),{addedImages:a}}logger;settings;gitHubServerUrl;processedImageUrls;messagesToInsertOnNextPreRequest;githubGetFileContentsTool;constructor(I,e,l){this.logger=I,this.settings=e,this.gitHubServerUrl=e.github?.serverUrl,this.githubGetFileContentsTool=l,this.processedImageUrls=new Set,this.messagesToInsertOnNextPreRequest=[]}toJSON(){return"CAPIImageProcessor"}async onRequestError(I){}async preErrorThrow(I){this.processedImageUrls.size>0&&(I.isVisionFlow=!0)}async postToolExecution(I){let e=I.modelInfo,l=I.toolCall.function.name,c=I.toolResult;if(e?.capabilities?.supports?.vision){let n=Array.from(aEe(c,l));if(n.length===0){let a=await GEe(I.toolCall,this.logger);a&&n.push(a)}this.insertImageUrlMessages(n)}}insertImageUrlMessages(I){this.logger.info(`Inserted ${I.length} image URLs from tools into chat history.`);for(let e of I)this.messagesToInsertOnNextPreRequest.push({role:"user",content:[{type:"text",text:e.isScreenshot?"Here is a screenshot:":"Here is an image:"},{type:"image_url",image_url:{url:e.url}}]})}};function*aEe(t,I){for(let e of t.binaryResultForLlm??[])e.type==="image"&&(yield{url:`data:${e.mimeType};base64,${e.data}`,isScreenshot:I.toLowerCase().includes("screenshot")})}var sEe="playwright-browser_take_screenshot";function rEe(t){return typeof t=="object"&&t!==null&&typeof t.filename=="string"}async function GEe(t,I){if(t.function.name!==sEe)return;I.debug("Adding images using Playwright params fallback strategy");let e=JSON.parse(t.function.arguments);if(rEe(e)){let l=Dk.isAbsolute(e.filename)?e.filename:Dk.join(JGI,e.filename);I.debug(`Image from Playwright params: ${e.filename}. Updated to ${l}.`);let c=await dEe(l,I);if(c){let n=c.buffer.toString("base64");return{url:`data:${c.mimeType};base64,${n}`,isScreenshot:!0}}}}function oEe(t){switch(Dk.extname(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";default:return null}}function X9I(t,I){return I!=="image/png"&&I!=="image/jpeg"?(t.debug(`Unsupported content type: ${I}, only image / png and image / jpeg are supported`),!1):!0}async function dEe(t,I){try{if(!UGI(t))return I.debug(`Image ${t} does not have a valid image extension, skipping read`),null;let e=oEe(t);return e?{buffer:await THe.readFile(t),mimeType:e}:(I.debug(`Image ${t} is not a mime type supported for file -> data URI flow`),null)}catch(e){return I.error(`Failed to read image from disk: ${e instanceof Error?e.message:String(e)}`),null}}G();var YH=class{logger;constructor(I){this.logger=I}toJSON(){return"BasicTruncator"}async*preRequest(I){let e=await w9I(I.messages,I.toolDefinitions,I.modelInfo.name,I.tokenLimit);e.tokensRemovedDuringTruncation>0&&this.logger.debug(`BasicTruncator truncated: ${JSON.stringify(e)}`),yield{kind:"history_truncated",turn:I.turn,performedBy:"BasicTruncator",truncateResult:e}}},ED=class{truncateOnNextRequest=!1;userMessageToTruncateUpTo;logger;constructor(I,e){this.userMessageToTruncateUpTo=I,this.logger=e,this.logger.debug(`AnthropicTokenLimitErrorTruncator will truncate up to message: ${JSON.stringify(I)}`)}async*preRequest(I){if(this.truncateOnNextRequest){this.truncateOnNextRequest=!1;let e=ZvI(this.userMessageToTruncateUpTo,I.messages);if(e===-1){this.logger.debug(`Failed to find user message to truncate up to: ${JSON.stringify(this.userMessageToTruncateUpTo)}`),this.logger.debug(`Current messages: ${JSON.stringify(I.messages)}`);return}let l=await w9I(I.messages,I.toolDefinitions,I.modelInfo.name,I.tokenLimit,e);l.tokensRemovedDuringTruncation>0&&this.logger.debug(`AnthropicTokenLimitErrorTruncator truncated: ${JSON.stringify(l)}`),yield{kind:"history_truncated",turn:I.turn,performedBy:"AnthropicTokenLimitErrorTruncator",truncateResult:l}}}async preErrorThrow(I){}async onRequestError(I){if(I){if(typeof I=="object"&&"code"in I&&I.code==="model_max_prompt_tokens_exceeded"){this.truncateOnNextRequest=!0;return}let e=[JSON.stringify(I)];I instanceof Error&&(e.push(I.message),I.cause instanceof Error?e.push(I.cause.message):I.cause&&e.push(JSON.stringify(I.cause)));let l="Input length and `max_tokens` exceed context limit";this.logger.debug(`Looking for error amongst: ${e.join(", ")}`),e.some(c=>c.includes(l))&&(this.truncateOnNextRequest=!0)}}toJSON(){return"AnthropicTokenLimitErrorTruncator"}},bEe=.95;function w9I(t,I,e,l,c){let n=t.length;if(n===0)return{tokenLimit:l,preTruncationTokensInMessages:0,preTruncationMessagesLength:n,postTruncationTokensInMessages:0,postTruncationMessagesLength:n,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let a=t.map(Z=>Ff(Z,e)),s=Uh(JSON.stringify(I),e),r=l*bEe,o=a.reduce((Z,p)=>Z+p,0)+s;if(o<=r)return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:n,postTruncationTokensInMessages:o,postTruncationMessagesLength:n,tokensRemovedDuringTruncation:0,messagesRemovedDuringTruncation:0};let d=new Set,b=0,h=Math.min(c??t.length,t.length);for(let Z=0;Z<h;Z++){let p=t[Z];if(p.role!=="system"&&p.role!=="tool"&&p.role!=="user"){if(p.role==="assistant"){let W=p.tool_calls||[],N=W.filter(MG).filter(g=>g.function.name===S1),Y=W.filter(MG).filter(g=>g.function.name!==S1),F=N.length===0,A=new Set(Y.map(g=>g.id));if(Y.length>0&&(p.tool_calls=N,a[Z]=Ff(p,e)),F&&(d.add(Z),b+=a[Z]),A.size>0)for(let g=Z+1;g<t.length;g++){let X=t[g];if(X.role==="tool"&&A.has(X.tool_call_id)&&(d.add(g),b+=a[g],A.delete(X.tool_call_id),A.size===0))break}}if(o-b<r)break}}for(let Z=t.length-1;Z>=0;Z--)d.has(Z)&&t.splice(Z,1);return{tokenLimit:l,preTruncationTokensInMessages:o,preTruncationMessagesLength:n,postTruncationTokensInMessages:o-b,postTruncationMessagesLength:t.length,tokensRemovedDuringTruncation:b,messagesRemovedDuringTruncation:n-t.length}}G();var zr=class extends Bh{constructor(){super()}debug(I){}log(I){}info(I){}notice(I){}warning(I){}error(I){}startGroup(I,e){}endGroup(I){}};G();G();var H9I={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"}]},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 vD(t,I,e){let l=(e||H9I)[t.toLowerCase()],c=new Set;for(;typeof l=="string";){if(c.has(l))return!1;c.add(l),l=H9I[l]}if(!l)return!1;let n=I.toLowerCase();return l.tools.some(a=>a.toolName===n)}var iEe="image";var mEe="resource",hEe=60*1e3*2,ZEe={timeout:hEe};var OGI=class{constructor(I,e,l){this.settings=I;this.logger=e;this.permissions=l}async invokeTool(I,e,l="hidden_characters"){let c=await this.doInvokeTool(I,e);return this.invokeToolResponseToToolResult(c,l)}invokeToolResponseToToolResult(I,e){let l=I.content||[],c="",n=[];for(let o of l)if(o.type==="text")c+=o.text||"";else if(o.type==="resource"){let d=o.resource;d&&d.blob?n.push({type:mEe,data:d.blob,mimeType:d.mimeType||"application/octet-stream"}):d&&d.text&&(c+=d.text)}else o.type==="image"&&n.push({type:iEe,data:o.data,mimeType:o.mimeType});let a=c;if(c==="")this.logger.debug("Tool invocation result is empty or undefined, skipping content filtering."),a=c;else try{let o=JSON.parse(c),d=$rI(o,e);a=JSON.stringify(d)}catch(o){this.logger.debug(`Unable to parse tool invocation as JSON. Treating it as a string for filtering: ${o}`),a=qrI(c,e)}this.logger.debug(`Tool invocation result: ${a}`);let s={},r=a?Tc(a,"output"):"";return I.isToolError?{textResultForLlm:a,resultType:"failure",error:a,sessionLog:r,toolTelemetry:s}:{textResultForLlm:a,binaryResultForLlm:n,resultType:"success",sessionLog:r,toolTelemetry:s}}async loadTools(I){let e=await this.loadToolsFromProvider(I),l={};for(let[c,n]of Object.entries(e)){let a=n.filterMode||"hidden_characters";l[c]={name:n.name,title:n.title||n.name,description:n.description,input_schema:n.input_schema,callback:async s=>{let r=e[c].serverName,o=e[c].name,d=e[c].title;if(!this.permissions.requestRequired)return this.invokeTool(c,s,a);let b=await this.permissions.request({kind:"mcp",serverName:r,toolName:o,toolTitle:d,args:s,readOnly:!!n.readOnly});switch(b.kind){case"approved":return this.invokeTool(c,s,a);case"denied-by-rules":return eU(b.rules);case"denied-no-approval-rule-and-could-not-request-from-user":return tU;case"denied-interactively-by-user":return IU;default:qY(b,`Unhandled permission result kind: ${b}`)}},safeForTelemetry:n.safeForTelemetry}}return Object.values(l)}};var Pk=class t extends OGI{toolIdToClientInfo=new Map;constructor(I,e,l={requestRequired:!1}){super(I,e,l)}async doInvokeTool(I,e){let l=this.toolIdToClientInfo.get(I);if(!l)throw new Error(`No MCP client found for tool ID: ${I}`);let c=l.mcpClient,n=t.getToolNameFromIdAndClientName(I,l.clientName),a=await c.callTool({name:n,arguments:e},void 0,{...ZEe,onprogress:s=>{this.logger.info(`Tool ${I} progress: ${JSON.stringify(s)}`)},resetTimeoutOnProgress:!0});if(!Array.isArray(a.content))throw new Error("Expected array of results");return{content:a.content,isToolError:a.error!==void 0&&a.error!==null||a.isError===!0}}async loadToolsFromProvider(I){let e={};this.logger.debug(`Loading tools for client: ${I.clientName}`);for(let l of(await I.mcpClient.listTools()).tools){if(!I.tools.includes("*")&&!I.tools.includes(l.name)){this.logger.debug(`Skipping tool ${l.name} for client ${I.clientName}`);continue}let c=t.getToolIdFromClientAndToolName(I.clientName,l.name);this.toolIdToClientInfo.set(c,I);let n;I.safeForTelemetry===!0?n={name:!0,inputsNames:!0}:I.safeForTelemetry&&typeof I.safeForTelemetry=="object"?n=I.safeForTelemetry:n={name:vD(I.clientName,l.name),inputsNames:!1},this.logger.debug(`Adding tool: ${c}`);let a;I.filterMapping===void 0?a="hidden_characters":typeof I.filterMapping=="object"?a=I.filterMapping[l.name]||"hidden_characters":a=I.filterMapping,e[c]={serverName:I.clientName,name:c,title:l.title||l.annotations?.title||l.name,description:l.description||"",input_schema:l.inputSchema,readOnly:l.annotations?.readOnlyHint,safeForTelemetry:n,filterMode:a}}return e}static getToolIdFromClientAndToolName(I,e){return`${I}-${e}`}static getToolNameFromIdAndClientName(I,e){return I.substring(e.length+1)}};G();var CD=class{settings;logger;gitHandler;location;commitPriorToCompletionWithTools;jitInstructions;emittedJitInstructions;constructor(I,e,l,c,n,a){this.settings=I,this.logger=e,this.gitHandler=l,this.location=c,this.commitPriorToCompletionWithTools=n,this.jitInstructions=a||{},this.emittedJitInstructions=new Set}toJSON(){return"JitInstructionsProcessor"}async*preRequest(I){if(this.jitInstructions&&Object.keys(this.jitInstructions).length>0){let e,l=async()=>{if(e===void 0)try{e=(await this.gitHandler.getChangedPaths(this.location,"HEAD",this.commitPriorToCompletionWithTools)).length}catch(a){this.logger.error(`Failed to get changed paths, err: ${a}`),e=1}return e},c;for(let[a,s]of Object.entries(this.jitInstructions)){let r=CiI(this.settings,s.percentRemainingOfTimeout);r.isWithin&&(!s.whenNoPathsChanged||await l()===0)&&(!c||r.withinMs<c[0])&&(c=[r.withinMs,s.instruction])}let n=c?.[1];if(typeof n=="function"&&(n=n(this.location)),n&&!this.emittedJitInstructions.has(n)){this.logger.debug(`Adding JIT instructions to the history: ${n}`),this.emittedJitInstructions.add(n);let a={role:"user",content:n};I.messages.push(a),yield{kind:"message",message:a,turn:I.turn,source:"jit-instruction"}}}}},TGI={remindWhereToDoWork:{instruction:F9I,percentRemainingOfTimeout:1/2,whenNoPathsChanged:!0},completeAsSoonAsPossible:{instruction:wD.completeAsSoonAsPossible,percentRemainingOfTimeout:1/6},commitNow:{instruction:wD.commitNow,percentRemainingOfTimeout:2/15},finalAnswerNeeded:{instruction:wD.finalAnswerNeeded,percentRemainingOfTimeout:1/10}};G();G();function jGI(t){if(!t)return pvI;let[I,...e]=t?.split(":")??[t,void 0],l=e.join(":")||void 0;return{agent:I||void 0,model:l||void 0}}G();G();function JD(t){return t.kind==="message"&&t.message.role==="assistant"}function E9I(t){return t.kind==="message"&&t.message.role==="user"}function v9I(t){return t.kind==="message"&&t.message.role==="assistant"&&!!t.message.tool_calls}function C9I(t){return t.kind==="message"&&t.message.role==="tool"}function pEe(t,I){return t.toolCalls.find(e=>e.toolCallId===I)}function uEe(t,I){let e=I.function.name;try{let l=JSON.parse(I.function.arguments||"{}"),n=t.find(a=>a.name===e)?.safeForTelemetry||{name:!1,inputsNames:!1};return{toolCallId:I.id,toolName:e,arguments:I.function.arguments,safeForTelemetryToolName:n===!0||n.name?e:MV(e),safeForTelemetryArguments:n===!0||n.inputsNames?ivI(l):""}}catch{return{toolCallId:I.id,toolName:e,arguments:I.function.arguments,safeForTelemetryToolName:MV(e),safeForTelemetryArguments:""}}}var LD=class{forAgent;turnDataCache;emittedTurns=new Set;callback;settings;toolsInUse;constructor(I,e,l,c){this.forAgent=I,this.turnDataCache=new Map,this.emittedTurns=new Set,this.callback=e,this.settings=l,this.toolsInUse=c}getTurnData(){return this.turnDataCache}async ingestEvent(I){let e,l;if("turn"in I&&typeof I.turn=="number"){if(e=I.turn+1,this.emittedTurns.has(e))return;this.turnDataCache.has(e)||this.turnDataCache.set(e,{featureFlagsAsString:MP(this.settings),toolCalls:[],toolCallExecutions:[],turn:e}),l=this.turnDataCache.get(e)}else return;I.kind==="tool_execution"?await this.ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(l,I):I.kind==="turn_started"||I.kind==="turn_failed"||I.kind==="turn_retry"||I.kind==="turn_ended"?(l={...l,model:I.model,modelInfo:JSON.stringify(I.modelInfo)},I.kind==="turn_started"?l={...l,startTimeMs:I.timestampMs}:I.kind==="turn_retry"?l={...l,endTimeMs:I.timestampMs,retriesUsed:(l.retriesUsed??0)+1}:I.kind==="turn_failed"?l={...l,endTimeMs:I.timestampMs,error:I.error}:I.kind==="turn_ended"&&(l={...l,endTimeMs:I.timestampMs})):I.kind==="history_truncated"?l={...l,truncateEvent:I}:I.kind==="image_processing"?l={...l,imageProcessingMetrics:I.imageProcessingMetrics}:I.kind==="images_removed"?l={...l,largeImagesRemoved:(l.largeImagesRemoved??0)+(I.largeImagesRemoved?1:0),imagesRemoved:(l.imagesRemoved??0)+(I.imagesRemoved?1:0)}:I.kind==="model_call_success"||I.kind==="model_call_failure"?(l={...l,modelCallDurationMs:I.modelCallDurationMs,api_call_id:I.modelCall.api_id,provider_call_id:I.modelCall.request_id,conversationStructureSummary:mvI(I.requestMessages)},I.kind==="model_call_success"&&(l={...l,responsePromptTokens:I.responseUsage?.prompt_tokens,responseCompletionTokens:I.responseUsage?.completion_tokens,responseTotalTokens:I.responseUsage?.total_tokens})):E9I(I)&&I.source==="jit-instruction"?l={...l,jitInstructionsAdded:(l?.jitInstructionsAdded??0)+1}:JD(I)&&I.message.tool_calls?l={...l,toolCalls:l.toolCalls.concat(I.message.tool_calls.map(c=>({...uEe(this.toolsInUse,c)})))}:C9I(I)&&(l={...l,toolCallExecutions:l.toolCallExecutions.concat([I.message.tool_call_id])}),this.turnDataCache.set(e,l),I.kind==="turn_ended"&&(await this.emitTurnTelemetry(e),this.emittedTurns.add(e),this.turnDataCache.delete(e))}async emitTurnTelemetry(I){let e=this.turnDataCache.get(I);if(e){let l={kind:"telemetry",telemetry:{event:"get_completion_with_tools_turn",properties:{model:e.model||"default",modelInfo:e.modelInfo||"{}",api_call_id:e.api_call_id,provider_call_id:e.provider_call_id,agent:this.forAgent,toolCalls:JSON.stringify(e.toolCalls.map(c=>({toolCallId:c.toolCallId,toolName:c.safeForTelemetryToolName}))),toolCallExecutions:JSON.stringify(e.toolCallExecutions),error:e.error,featureFlags:MP(this.settings),conversationStructureSummary:e.conversationStructureSummary,truncationPerformedBy:e.truncateEvent?.performedBy},metrics:{turn:I,turnDurationMs:e.endTimeMs!==void 0&&e.startTimeMs!==void 0?e.endTimeMs-e.startTimeMs:0,modelCallDurationMs:e.modelCallDurationMs,retriesUsed:e.retriesUsed??0,numToolCalls:e.toolCalls.length,numToolExecutions:e.toolCallExecutions.length,largeImagesRemoved:e.largeImagesRemoved,imagesRemoved:e.imagesRemoved,responsePromptTokens:e.responsePromptTokens,responseCompletionTokens:e.responseCompletionTokens,responseTotalTokens:e.responseTotalTokens,jitInstructionsAdded:e.jitInstructionsAdded,...e.truncateEvent?.truncateResult,...e.imageProcessingMetrics},restrictedProperties:{}}};await this.callback.progress(l)}}async ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(I,e){let l=e.toolCallId,c=pEe(I,l);if(c){let n=e.toolResult,a={kind:"telemetry",telemetry:{event:"tool_call_executed",properties:{...n.toolTelemetry.properties,resultType:n.resultType,toolCallId:l,arguments:c.safeForTelemetryArguments,toolName:c.safeForTelemetryToolName,api_call_id:I.api_call_id},restrictedProperties:{...n.toolTelemetry.restrictedProperties,arguments:c.arguments,result:n.textResultForLlm,toolName:c.toolName,error:n.error},metrics:{...n.toolTelemetry.metrics,durationMs:e.durationMs}}};await this.callback.progress(a)}}};G();G();var qk=class{async*preRequest(I){yield*[]}handleCallbackResponse(I){}getUserMessages(){return[]}clearUserMessages(){}canProcessUserMessages(){return!1}toJSON(){return JSON.stringify({type:"NoopUserMessageProcessor"})}};var kD=class{constructor(I,e){this.runtimeContext=I;this.customAgentName=e;this.gitHandlers={silent:new Mr(new zr,this.runtimeContext.exec),logging:new Mr(this.runtimeContext.logger,this.runtimeContext.exec)}}gitHandlers;async agent(I,e,l,c,n,a,s=new qk,r){let o=async(Z,p,W)=>{let N={role:"user",content:Z};return await this.runtimeContext.callback?.progress({kind:"message",message:N,turn:0}),await this.runCompletionWithTools(I,e,[...p??[],N],a,n,{executeToolsInParallel:ql(this.runtimeContext.settings,"copilot_swe_agent_parallel_tool_execution"),initialTurnCount:W},r,s)},d=c,b=l??[],h;for(;d;){let Z=await o(d,b,h);h=Z.finalTurnCount,b=Z.messages,d=await r?.onResult(Z.postCompletionWithToolsCommitHash)}for(let Z of a)if(Z.shutdown){let p=await Z.shutdown();p&&await this.runtimeContext.callback?.progress(p)}return{finalTurnCount:h||0,messages:b}}async runCompletionWithTools(I,e,l,c,n,a,s,r=new qk){let o=this.runtimeContext.callback?new LD("sweagent-capi",this.runtimeContext.callback,this.runtimeContext.settings,c):void 0,d=this.gitHandlers.logging,b=await d.getCurrentCommitHash(I),h=l.filter(A=>A.role==="user").at(-1),Z=this.createCompletionWithToolsProcessors(I,b,c,r,n,s,h),p=this.runtimeContext.client.getCompletionWithTools(e,l,c,{...a,processors:Z}),W=0,N=[...l],Y=[];for await(let A of p){if(ql(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")){let g=await this.runtimeContext.callback?.progress(A,{accepts_user_messages:r.canProcessUserMessages()});r.handleCallbackResponse(g)}else A.kind==="response"||A.kind==="message"?await this.runtimeContext.callback?.progress({...A,customAgentName:this.customAgentName}):await this.runtimeContext.callback?.progress(A);o&&await o.ingestEvent(A),(A.kind==="message"||A.kind==="response")&&(A.kind==="message"&&N.push(A.message),A.kind==="response"&&Y.push(A.response),W=Math.max(W,A.turn??0))}let F=await d.getCurrentCommitHash(I);return{finalTurnCount:W,messages:N,resultMessages:Y,preCompletionWithToolsCommitHash:b,postCompletionWithToolsCommitHash:F}}createCompletionWithToolsProcessors(I,e,l,c,n,a,s){let r=new HD(this.runtimeContext.logger,this.runtimeContext.settings,l.find(Z=>Z.name==="github-mcp-server-get_file_contents")),o=new CD(this.runtimeContext.settings,this.runtimeContext.logger,this.gitHandlers.silent,I,e,n),d=new YH(this.runtimeContext.logger),b=s?new ED(s,this.runtimeContext.logger):void 0,h=[o,r,d,b];return ql(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")&&h.push(c),{preRequest:h.filter(Z=>Z!==void 0),preToolsExecution:[a].filter(Z=>Z!==void 0),postToolExecution:[r,a].filter(Z=>Z!==void 0),onRequestError:[r,b].filter(Z=>Z!==void 0)}}};G();async function DGI(t,I,e,l,c){try{return(await l.invokeTool("blackbird-mcp-server/search_repository_with_agent",{task:t,depth:2,owner:I,repo:e,numSnippets:10},"hidden_characters")).textResultForLlm}catch(n){return c.error(`Error during Blackbird search: ${n}`),""}}var L9I=t=>ql(t,"copilot_swe_agent_search")||viI(t,"SearchAgentExperiment")==="enabled",J9I="search";function KGI(t){return t!==null&&typeof t=="object"&&"question"in t&&"reason"in t&&"searchCommand"in t}var WEe=(t,I,e)=>`
1025
1025
  You are a question answering agent that is a component of GitHub Copilot coding agent. Your task is to take the given question
1026
1026
  and answer it using the given facts.
1027
1027
 
@@ -1125,9 +1125,9 @@ Answer:
1125
1125
  `}var B3e=jK.platform==="win32"?["APPDATA","HOMEDRIVE","HOMEPATH","LOCALAPPDATA","PATH","PROCESSOR_ARCHITECTURE","SYSTEMDRIVE","SYSTEMROOT","TEMP","USERNAME","USERPROFILE","PROGRAMFILES"]:["HOME","LOGNAME","PATH","SHELL","TERM","USER"];function z3e(){let t={};for(let I of B3e){let e=jK.env[I];e!==void 0&&(e.startsWith("()")||(t[I]=e))}return t}var TK=class{constructor(I){this._abortController=new AbortController,this._readBuffer=new MK,this._stderrStream=null,this._serverParams=I,(I.stderr==="pipe"||I.stderr==="overlapped")&&(this._stderrStream=new x3e)}async start(){if(this._process)throw new Error("StdioClientTransport already started! If using Client class, note that connect() calls start() automatically.");return new Promise((I,e)=>{var l,c,n,a,s;this._process=(0,_zI.default)(this._serverParams.command,(l=this._serverParams.args)!==null&&l!==void 0?l:[],{env:{...z3e(),...this._serverParams.env},stdio:["pipe","pipe",(c=this._serverParams.stderr)!==null&&c!==void 0?c:"inherit"],shell:!1,signal:this._abortController.signal,windowsHide:jK.platform==="win32"&&U3e(),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}e(r),(d=this.onerror)===null||d===void 0||d.call(this,r)}),this._process.on("spawn",()=>{I()}),this._process.on("close",r=>{var o;this._process=void 0,(o=this.onclose)===null||o===void 0||o.call(this)}),(n=this._process.stdin)===null||n===void 0||n.on("error",r=>{var o;(o=this.onerror)===null||o===void 0||o.call(this,r)}),(a=this._process.stdout)===null||a===void 0||a.on("data",r=>{this._readBuffer.append(r),this.processReadBuffer()}),(s=this._process.stdout)===null||s===void 0||s.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 I,e;return this._stderrStream?this._stderrStream:(e=(I=this._process)===null||I===void 0?void 0:I.stderr)!==null&&e!==void 0?e:null}get pid(){var I,e;return(e=(I=this._process)===null||I===void 0?void 0:I.pid)!==null&&e!==void 0?e:null}processReadBuffer(){for(var I,e;;)try{let l=this._readBuffer.readMessage();if(l===null)break;(I=this.onmessage)===null||I===void 0||I.call(this,l)}catch(l){(e=this.onerror)===null||e===void 0||e.call(this,l)}}async close(){this._abortController.abort(),this._process=void 0,this._readBuffer.clear()}send(I){return new Promise(e=>{var l;if(!(!((l=this._process)===null||l===void 0)&&l.stdin))throw new Error("Not connected");let c=qzI(I);this._process.stdin.write(c)?e():this._process.stdin.once("drain",e)})}};function U3e(){return"type"in jK}G();G();var DK=class extends TransformStream{constructor({onError:I,onRetry:e,onComment:l}={}){let c;super({start(n){c=xK({onEvent:a=>{n.enqueue(a)},onError(a){I==="terminate"?n.error(a):typeof I=="function"&&I(a)},onRetry:e,onComment:l})},transform(n){c.feed(n)}})}};var S3e={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2},P9=class extends Error{constructor(I,e){super(`Streamable HTTP error: ${e}`),this.code=I}},KK=class{constructor(I,e){var l;this._url=I,this._resourceMetadataUrl=void 0,this._requestInit=e?.requestInit,this._authProvider=e?.authProvider,this._fetch=e?.fetch,this._sessionId=e?.sessionId,this._reconnectionOptions=(l=e?.reconnectionOptions)!==null&&l!==void 0?l:S3e}async _authThenStart(){var I;if(!this._authProvider)throw new OG("No auth provider");let e;try{e=await MY(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})}catch(l){throw(I=this.onerror)===null||I===void 0||I.call(this,l),l}if(e!=="AUTHORIZED")throw new OG;return await this._startOrAuthSse({resumptionToken:void 0})}async _commonHeaders(){var I;let e={};if(this._authProvider){let c=await this._authProvider.tokens();c&&(e.Authorization=`Bearer ${c.access_token}`)}this._sessionId&&(e["mcp-session-id"]=this._sessionId),this._protocolVersion&&(e["mcp-protocol-version"]=this._protocolVersion);let l=this._normalizeHeaders((I=this._requestInit)===null||I===void 0?void 0:I.headers);return new Headers({...e,...l})}async _startOrAuthSse(I){var e,l,c;let{resumptionToken:n}=I;try{let a=await this._commonHeaders();a.set("Accept","text/event-stream"),n&&a.set("last-event-id",n);let s=await((e=this._fetch)!==null&&e!==void 0?e:fetch)(this._url,{method:"GET",headers:a,signal:(l=this._abortController)===null||l===void 0?void 0:l.signal});if(!s.ok){if(s.status===401&&this._authProvider)return await this._authThenStart();if(s.status===405)return;throw new P9(s.status,`Failed to open SSE stream: ${s.statusText}`)}this._handleSseStream(s.body,I,!0)}catch(a){throw(c=this.onerror)===null||c===void 0||c.call(this,a),a}}_getNextReconnectionDelay(I){let e=this._reconnectionOptions.initialReconnectionDelay,l=this._reconnectionOptions.reconnectionDelayGrowFactor,c=this._reconnectionOptions.maxReconnectionDelay;return Math.min(e*Math.pow(l,I),c)}_normalizeHeaders(I){return I?I instanceof Headers?Object.fromEntries(I.entries()):Array.isArray(I)?Object.fromEntries(I):{...I}:{}}_scheduleReconnection(I,e=0){var l;let c=this._reconnectionOptions.maxRetries;if(c>0&&e>=c){(l=this.onerror)===null||l===void 0||l.call(this,new Error(`Maximum reconnection attempts (${c}) exceeded.`));return}let n=this._getNextReconnectionDelay(e);setTimeout(()=>{this._startOrAuthSse(I).catch(a=>{var s;(s=this.onerror)===null||s===void 0||s.call(this,new Error(`Failed to reconnect SSE stream: ${a instanceof Error?a.message:String(a)}`)),this._scheduleReconnection(I,e+1)})},n)}_handleSseStream(I,e,l){if(!I)return;let{onresumptiontoken:c,replayMessageId:n}=e,a;(async()=>{var r,o,d,b;try{let h=I.pipeThrough(new TextDecoderStream).pipeThrough(new DK).getReader();for(;;){let{value:Z,done:p}=await h.read();if(p)break;if(Z.id&&(a=Z.id,c?.(Z.id)),!Z.event||Z.event==="message")try{let W=LY.parse(JSON.parse(Z.data));n!==void 0&&l9(W)&&(W.id=n),(r=this.onmessage)===null||r===void 0||r.call(this,W)}catch(W){(o=this.onerror)===null||o===void 0||o.call(this,W)}}}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:a,onresumptiontoken:c,replayMessageId:n},0)}catch(Z){(b=this.onerror)===null||b===void 0||b.call(this,new Error(`Failed to reconnect: ${Z instanceof Error?Z.message:String(Z)}`))}}})()}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(I){if(!this._authProvider)throw new OG("No auth provider");if(await MY(this._authProvider,{serverUrl:this._url,authorizationCode:I,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new OG("Failed to authorize")}async close(){var I,e;(I=this._abortController)===null||I===void 0||I.abort(),(e=this.onclose)===null||e===void 0||e.call(this)}async send(I,e){var l,c,n,a;try{let{resumptionToken:s,onresumptiontoken:r}=e||{};if(s){this._startOrAuthSse({resumptionToken:s,replayMessageId:jD(I)?I.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(I),signal:(l=this._abortController)===null||l===void 0?void 0:l.signal},b=await((c=this._fetch)!==null&&c!==void 0?c:fetch)(this._url,d),h=b.headers.get("mcp-session-id");if(h&&(this._sessionId=h),!b.ok){if(b.status===401&&this._authProvider){if(this._resourceMetadataUrl=K9(b),await MY(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,fetchFn:this._fetch})!=="AUTHORIZED")throw new OG;return this.send(I)}let N=await b.text().catch(()=>null);throw new Error(`Error POSTing to endpoint (HTTP ${b.status}): ${N}`)}if(b.status===202){rfI(I)&&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 p=(Array.isArray(I)?I:[I]).filter(N=>"method"in N&&"id"in N&&N.id!==void 0).length>0,W=b.headers.get("content-type");if(p)if(W?.includes("text/event-stream"))this._handleSseStream(b.body,{onresumptiontoken:r},!1);else if(W?.includes("application/json")){let N=await b.json(),Y=Array.isArray(N)?N.map(F=>LY.parse(F)):[LY.parse(N)];for(let F of Y)(n=this.onmessage)===null||n===void 0||n.call(this,F)}else throw new P9(-1,`Unexpected content type: ${W}`)}catch(s){throw(a=this.onerror)===null||a===void 0||a.call(this,s),s}}get sessionId(){return this._sessionId}async terminateSession(){var I,e,l;if(this._sessionId)try{let c=await this._commonHeaders(),n={...this._requestInit,method:"DELETE",headers:c,signal:(I=this._abortController)===null||I===void 0?void 0:I.signal},a=await((e=this._fetch)!==null&&e!==void 0?e:fetch)(this._url,n);if(!a.ok&&a.status!==405)throw new P9(a.status,`Failed to terminate session: ${a.statusText}`);this._sessionId=void 0}catch(c){throw(l=this.onerror)===null||l===void 0||l.call(this,c),c}}setProtocolVersion(I){this._protocolVersion=I}get protocolVersion(){return this._protocolVersion}};G();var PK=class{constructor(I){this.server=I}onmessage;onerror;onclose;serverTransport;closed=!1;async start(){if(this.closed)throw new Error("Transport is closed");this.serverTransport=new gbI(this),await this.server.connect(this.serverTransport)}async send(I){if(this.closed)throw new Error("Transport is closed");setImmediate(()=>{try{this.serverTransport?.onmessage?.(I)}catch(e){this.onerror?.(e instanceof Error?e:new Error(String(e)))}})}receive(I){this.closed||this.onmessage?.(I)}async close(){this.closed||(this.closed=!0,await this.serverTransport?.close(),this.onclose?.())}},gbI=class{constructor(I){this.clientTransport=I}onmessage;onerror;onclose;closed=!1;async start(){}async send(I){if(this.closed)throw new Error("Transport is closed");setImmediate(()=>{try{this.clientTransport.receive(I)}catch(e){this.onerror?.(e instanceof Error?e:new Error(String(e)))}})}async close(){this.closed||(this.closed=!0,this.onclose?.())}};var qK=class{createTransport(I){switch(I.type){case"stdio":{let e=new TK({command:I.command,args:I.args,env:I.env,stderr:I.stderr?"pipe":void 0});return e.stderr?.pipe(I.stderr),e}case"http":return new KK(new URL(I.url),{requestInit:{headers:I.headers||{}}});case"sse":return new SK(new URL(I.url),{requestInit:{headers:I.headers||{}}});case"memory":return new PK(I.server);default:throw new Error(`Unsupported transport type: ${I.type}`)}}};G();var Ry="blackbird-mcp-server",_H="github-mcp-server",AbI="playwright";function $H(t){return t.type===void 0||t.type.toLowerCase()==="local"||t.type.toLowerCase()==="stdio"}function _K(t){return t.type?.toLowerCase()==="http"}function $K(t){return t.type?.toLowerCase()==="sse"}function q9(t){return t.type?.toLowerCase()==="memory"}var XbI=class extends O3e{constructor(e,l){super({decodeStrings:!1});this.serverName=e;this.logger=l}_write(e,l,c){try{let n=e.toString();this.logger.log(`[mcp server ${this.serverName} stderr] ${n}`),c()}catch(n){c(n instanceof Error?n:new Error(String(n)))}}},IP=class{constructor(I,e=new kK,l=new qK){this.logger=I;this.clientFactory=e;this.transportFactory=l}clients={};transports={};async startLocalMcpClient(I,e,l,c){this.logger.log(`Starting MCP client for ${I} with command: ${l} and args: ${c}`);let n=new XbI(I,this.logger),a={type:"stdio",command:l,args:c,env:{...e,PATH:process.env.PATH},stderr:n},s=this.transportFactory.createTransport(a);await this.setupAndConnectClient(I,s)}async startHttpMcpClient(I,e){this.logger.log(`Starting remote MCP client for ${I} with url: ${e.url}`);let l={type:"http",url:e.url,headers:e.headers},c=this.transportFactory.createTransport(l);await this.setupAndConnectClient(I,c)}async startSseMcpClient(I,e){this.logger.log(`Starting remote MCP client for ${I} with url: ${e.url}`);let l={type:"sse",url:e.url,headers:e.headers},c=this.transportFactory.createTransport(l);await this.setupAndConnectClient(I,c)}async startInMemoryMcpClient(I,e){this.logger.log(`Starting in-memory MCP client for ${I}`);let l={type:"memory",server:e},c=this.transportFactory.createTransport(l);await this.setupAndConnectClient(I,c)}async setupAndConnectClient(I,e){this.transports[I]=e,e.onclose=()=>{this.logger.log(`MCP transport for ${I} closed`),delete this.transports[I]},this.logger.log(`Creating MCP client for ${I}...`);let l=this.clientFactory.createClient({name:"github-copilot-developer",version:"1.0.0"},{capabilities:{experimental:void 0,roots:void 0,sampling:void 0}}),c=Date.now();this.logger.log(`Connecting MCP client for ${I}...`),await l.connect(e),l.onclose=()=>{this.logger.log(`MCP client for ${I} closed`),delete this.clients[I]},l.onerror=n=>{this.logger.error(`MCP client for ${I} errored ${n}`)},this.logger.log(`MCP client for ${I} connected, took ${Date.now()-c}ms`),this.clients[I]=l}async getTools(I,e){let l={};for(let[c,n]of Object.entries(this.clients)){let a=[];try{this.logger.log(`Fetching tools from client: ${c}`);let s=await n.listTools(),r=I?.mcpServers[c].tools,o=I?.mcpServers[c].filterMapping;for(let b of s.tools){if(b.name==="get_copilot_space")continue;if(!(r?.includes("*")||r?.includes(b.name))){this.logger.log(`Tool ${b.name} is not in the allowed list for client: ${c}`);continue}let Z=vD(c,b.name),p=`${c}-${b.name}`,W;typeof o=="string"?W=_rI(o):W=_rI(o?.[b.name]??"hidden_characters"),l[`${c}/${b.name}`]={name:p,title:b.title??b.annotations?.title??b.name,description:b.description??p,input_schema:b.inputSchema,readOnly:b.annotations?.readOnlyHint,safeForTelemetry:{name:!!(I?.mcpServers[c].isDefaultServer||Z),inputsNames:!!I?.mcpServers[c].isDefaultServer},filterMode:W},a.push(b.name),this.logger.log(`Tool ${b.name} added to tools list for client: ${c}`)}this.logger.log(`Successfully retrieved ${a.length} tools from client: ${c}`);let d=n.getServerVersion();await this.logServerSuccessWithTools(c,a,d,e)}catch(s){this.logger.error(`Failed to get tools from client: ${c} ${s}`)}}return this.logger.log(`All tools retrieved: ${JSON.stringify(l,null,2)}`),l}async logServerSuccessWithTools(I,e,l,c){if(I!=Ry&&c)try{let n=e.map(r=>`- ${r}`).join(`
1126
1126
  `),s=`MCP server started successfully${l?` (version ${l.version})`:""} with ${e.length} ${e.length===1?"tool":"tools"} - for the full output, see the verbose logs
1127
1127
 
1128
- ${n}`;await c.logMCPSetup(I,s),this.logger.log(`Updated session log for ${I} with ${e.length} tools`)}catch(n){this.logger.error(`Failed to update session log for ${I}: ${n}`)}}};G();var wbI={mcpServers:{}},eP=class{constructor(I,e,l){this.logger=I;this.registry=e;this.remoteEnabled=l?.remoteEnabled??!1,this.mcp3pEnabled=l?.mcp3pEnabled??!1,this.blackbirdMetisIndexEnabled=l?.blackbirdMetisIndexEnabled??!1,this.sessionClient=l?.sessionClient,this.mcpEnvConfig=void 0}remoteEnabled;mcp3pEnabled;blackbirdMetisIndexEnabled;mcpEnvConfig;sessionClient;ReadMcpConfigFromEnv(I){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 e=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(e,I),this.configureGitHubMcp(e,I),this.configurePlaywrightMcp(e)),e}validateEnvConfig(){if(!this.mcp3pEnabled)return this.logger.log("User-provided MCPs are disabled"),wbI;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"),wbI;try{let I=JSON.parse(this.mcpEnvConfig);if(!I.mcpServers)throw new Error("User-provided config had incorrect format. Missing 'mcpServers' property.");for(let e in I.mcpServers)I.mcpServers[e].isDefaultServer=!1;return I}catch(I){return this.logger.error(`Warning: User-provided MCP servers were defined but invalid: ${I}`),wbI}}configureGitHubMcp(I,e){this.remoteEnabled?this.configureRemoteGitHubMcp(I,e):this.configureLocalGitHubMcp(I)}configureRemoteGitHubMcp(I,e){this.logger.log("Using default remote GitHub MCP server configuration");let l="repos,issues,users,pull_requests,code_security,secret_protection,actions";process.env.COPILOT_MCP_COPILOT_SPACES_ENABLED==="true"&&(this.logger.log("Enabling Copilot Spaces in GitHub MCP server configuration"),l=l+",copilot_spaces");let c={Authorization:"Bearer "+process.env.GITHUB_PERSONAL_ACCESS_TOKEN,"X-MCP-Toolsets":l,"X-MCP-Host":"github-coding-agent","X-Initiator":"agent"};e&&e.api?.copilot?.integrationId&&(c["Copilot-Integration-Id"]=e.api.copilot.integrationId),process.env.GITHUB_COPILOT_INTERACTION_ID&&(c["X-Interaction-Id"]=process.env.GITHUB_COPILOT_INTERACTION_ID);let n={type:"http",url:this.getCapiMcpUrl(),headers:c,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"}};I.mcpServers[_H]=n}configureLocalGitHubMcp(I){if(I.mcpServers[_H]){this.logger.log("Using user-provided GitHub MCP server configuration");let e=I.mcpServers[_H]??{};$H(e)&&!e.command&&(I.mcpServers[_H]={...e,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 e={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};I.mcpServers[_H]=e}}configurePlaywrightMcp(I){if(!I.mcpServers[AbI]){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 e={command:"npx",args:[...LGI,"--allowed-origins","localhost;localhost:*;127.0.0.1;127.0.0.1:*"],tools:["*"],isDefaultServer:!0};I.mcpServers[AbI]=e}}configureBlackbirdMcp(I,e){this.remoteEnabled?this.configureRemoteBlackbirdMcp(I):this.blackbirdMetisIndexEnabled?this.configureLocalMetisBlackbirdMCP(I,e):this.configureLocalBlackbirdMcp(I)}configureLocalMetisBlackbirdMCP(I,e){this.logger.log("Using local Metis Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${e.blackbird?.mode}`);let l=process.env.AGENT_DIR||"/agent";this.logger.log(`Using agent directory: ${l}`);let c=[];e.blackbird?.mode==="tool"&&(c=["*"]),this.logger.log(`Using blackbird Metis server: ${e.blackbird?.mode}`);let n={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:c,isDefaultServer:!0};I.mcpServers[Ry]=n}configureLocalBlackbirdMcp(I){this.logger.log("Using local Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${process.env.BLACKBIRD_MODE}`);let e=[];process.env.BLACKBIRD_MODE==="tool"&&(e=["*"]);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:e,isDefaultServer:!0};I.mcpServers[Ry]=l}configureRemoteBlackbirdMcp(I){this.logger.log("Using remote Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${process.env.BLACKBIRD_MODE}`);let e=[];process.env.BLACKBIRD_MODE==="tool"&&(e=["*"]);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 c={type:"http",url:this.getCapiMcpUrl(),headers:l,tools:e,isDefaultServer:!0};I.mcpServers[Ry]=c}getCapiMcpUrl(){return process.env.COPILOT_API_URL?new URL("/mcp/readonly",process.env.COPILOT_API_URL).toString():"https://api.githubcopilot.com/mcp/readonly"}isValidServerType(I){return $H(I)||_K(I)||$K(I)||q9(I)}isValidLocalServerConfig(I){return I.command!==void 0&&I.command.trim()!==""&&Array.isArray(I.args)}isValidRemoteServerConfig(I){return I.url!==void 0&&I.url.trim()!==""}isValidInMemoryServerConfig(I){return I.serverInstance!==void 0&&typeof I.serverInstance=="object"}validateServerConfig(I,e){return this.remoteEnabled&&!this.isValidServerType(e)?(this.logger.error(`Unsupported server type "${e.type}" for server "${I}". Only "Local", "STDIO", "HTTP", "SSE", or "Memory" are supported.`),!1):!this.remoteEnabled&&!$H(e)&&!q9(e)?(this.logger.error(`Unsupported server type "${e.type}" for server "${I}". Only "Local", "STDIO", or "Memory" are supported.`),!1):e.tools?$H(e)&&!this.isValidLocalServerConfig(e)?(this.logger.error(`Invalid local server configuration for "${I}". Please ensure 'command' and 'args' are provided.`),!1):(_K(e)||$K(e))&&!this.isValidRemoteServerConfig(e)?(this.logger.error(`Invalid remote server configuration for "${I}". Please ensure 'url' is provided.`),!1):q9(e)&&!this.isValidInMemoryServerConfig(e)?(this.logger.error(`Invalid in-memory server configuration for "${I}". Please ensure 'serverInstance' is provided and is an instance of MCPServer.`),!1):!0:(this.logger.error(`No tools specified for server "${I}". Please provide a list of tools or "*" to include all tools.`),!1)}async processHttpServer(I,e){try{let l=this.resolveHeaders(e.headers,process.env),c={...e,headers:l};await this.registry.startHttpMcpClient(I,c),this.logger.log(`Started MCP client for remote server ${I}`)}catch(l){throw this.logger.error(`Failed to start MCP client for remote server ${I}: ${l}`),l}}async processSseServer(I,e){try{let l=this.resolveHeaders(e.headers,process.env),c={...e,headers:l};await this.registry.startSseMcpClient(I,c),this.logger.log(`Started MCP client for remote server ${I}`)}catch(l){throw this.logger.error(`Failed to start MCP client for remote server ${I}: ${l}`),l}}async processInMemoryServer(I,e){try{await this.registry.startInMemoryMcpClient(I,e.serverInstance),this.logger.log(`Started in-memory MCP client for ${I}`)}catch(l){throw this.logger.error(`Failed to start in-memory MCP client for ${I}: ${l}`),l}}async processLocalServer(I,e){let l={...e};if(e.command==="python")try{l=await this.convertPythonToPipx(l)}catch(a){this.logger.error(`Failed to handle Python module for ${I}: ${a}`)}let c=this.buildEnvironment(l),n=this.resolveArray(l.args,c);this.logger.log(`Starting MCP client for ${I} with command: ${l.command} and args: ${n}`);try{await this.registry.startLocalMcpClient(I,c,l.command,n),this.logger.log(`Started MCP client for ${I}`)}catch(a){throw this.logger.error(`Failed to start MCP client for ${I}: ${a}`),a}}convertPythonToPipx(I){if(!I||!I.args||I.args.length===0)return I;let e=I.args,l=e.indexOf("-m");if(l===-1||l===e.length-1)throw new Error("Python command with -m flag must specify a module");let c=e[l+1];this.logger.log(`Converting Python module: ${c} to pipx command`);let n=["run",c];for(let a=l+2;a<e.length;a++)n.push(e[a]);for(let a=0;a<l;a++)n.push(e[a]);return{...I,command:"pipx",args:n}}buildEnvironment(I){let e={};if(I.env)for(let[l,c]of Object.entries(I.env)){let n=c.trim();process.env[n]!==void 0&&(e[l]=process.env[n])}return e}resolveArray(I,e){return I?e?I.map(l=>l.replace(/\$([A-Z0-9_]+)/g,(c,n)=>e[n]||c)):I:[]}resolveHeaders(I,e){if(!I)return{};if(!e)return I;let l={};for(let[c,n]of Object.entries(I)){let a=this.resolveArray([n],e);l[c]=a[0]}return l}async processServers(I){if(!I)throw new Error("No servers to process");for(let[e,l]of Object.entries(I.mcpServers))await this.processServer(e,l)}async processServer(I,e){if(!this.validateServerConfig(I,e)){this.logger.error(`Skipping server "${I}" due to invalid configuration.`);return}try{$H(e)?await this.processLocalServer(I,e):_K(e)&&this.remoteEnabled?await this.processHttpServer(I,e):$K(e)&&this.remoteEnabled?await this.processSseServer(I,e):q9(e)&&await this.processInMemoryServer(I,e)}catch(l){I!==Ry&&await this.logServerFailure(I,l)}}async logServerFailure(I,e){if(this.sessionClient)try{await this.sessionClient.logMCPSetup(I,`<error>MCP server failed to start: ${e.message} - for the full output, see the verbose logs</error>`)}catch(l){this.logger.error(`Failed to log failure for MCP Server '${I}': '${l}'`)}}};var tP=class{constructor(I,e,l){this.logger=I;let c;if(typeof e=="string"){if(c=JSON.parse(e),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=e;this.disabledServers=new Set(l||[]),this.registry=new IP(this.logger),this.processor=new eP(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(I){}async processServersWithExtensions(){await this.injectDefaultServers(this.config);let I;if(this.disabledServers.size>0){let e={};for(let[l,c]of Object.entries(this.config.mcpServers))this.disabledServers.has(l)?this.logger.log(`Skipping disabled MCP server: ${l}`):e[l]=c;I={...this.config,mcpServers:e}}else I=this.config;return this.processor.processServers(I)}async stopServers(){for(let[I,e]of Object.entries(this.registry.transports))try{await e.close()}catch(l){this.logger.error(`Error closing transport for ${I}: ${l}`)}this.startServersPromise=null,this.allTools=null}async getTools(I,e,l){if(!this.allTools){await this.startServers();let c=new Pk(I,e,l),n=[];for(let a of Object.keys(this.registry.clients)){let s=await c.loadTools({mcpClient:this.registry.clients[a],clientName:a,tools:this.config.mcpServers[a]?.tools||["*"],filterMapping:this.config.mcpServers[a]?.filterMapping||"hidden_characters"});n.push(...s)}this.allTools=n}return this.allTools}getConfig(){return this.config}async startServer(I,e){await this.startServers(),this.config.mcpServers[I]=e,await this.processor.processServer(I,e),this.allTools=null}async stopServer(I){let e=this.registry.transports[I];if(e)try{await e.close(),delete this.registry.transports[I]}catch(l){this.logger.error(`Error closing transport for ${I}: ${l}`)}this.registry.clients[I]&&delete this.registry.clients[I],this.allTools=null}async restartServer(I,e){this.isServerRunning(I)&&await this.stopServer(I),delete this.config.mcpServers[I],await this.startServer(I,e)}isServerRunning(I){return I in this.registry.transports&&I in this.registry.clients}isServerDisabled(I){return this.disabledServers.has(I)}async disableServer(I){if(this.disabledServers.has(I)){this.logger.log(`Server ${I} is already disabled`);return}this.disabledServers.add(I),this.logger.log(`Disabled server ${I} for this session`),this.isServerRunning(I)&&await this.stopServer(I),this.allTools=null}async enableServer(I){if(!this.disabledServers.has(I)){this.logger.log(`Server ${I} is not disabled`);return}this.disabledServers.delete(I),this.logger.log(`Enabled server ${I} for this session`);let e=this.getServerConfig(I);e?await this.startServer(I,e):await this.startBuiltInServer(I),this.allTools=null}async startBuiltInServer(I){}getServerConfig(I){return this.config.mcpServers[I]}};G();var AUI=Qc(gUI(),1);async function k9e(t={}){let I=await EiI();return XiI((0,AUI.default)({},I,t))}async function XUI(t={}){if(Nf())throw new Error("Settings have already been initialized");return k9e(t)}G();async function TY(t,I,e){if(!t||t.length===0)return;let l=!1,c={};for(let n of t)try{let a=await n(I);a&&(l=!0,c={...c,...a})}catch(a){e.error(`Hook execution failed: ${a}`)}return l?c:void 0}G();G();G();var zbI=class{loggers;constructor(I){this.loggers=I}isDebug(){return this.loggers.some(I=>I.isDebug())}debug(I){this.loggers.forEach(e=>e.debug(I))}log(I){this.loggers.forEach(e=>e.log(I))}info(I){this.loggers.forEach(e=>e.info(I))}notice(I){this.loggers.forEach(e=>e.notice(I))}warning(I){this.loggers.forEach(e=>e.warning(I))}error(I){this.loggers.forEach(e=>e.error(I))}startGroup(I,e){this.loggers.forEach(l=>l.startGroup(I,e))}endGroup(I){this.loggers.forEach(e=>e.endGroup(I))}};G();import{appendFile as f9e,access as x9e,mkdir as B9e}from"fs/promises";import{constants as z9e}from"fs";import{dirname as U9e}from"path";var UbI=class extends Bh{constructor(e,l,c){super(l,c);this.filePath=e;this.writeQueue=S9e(U9e(this.filePath)).catch(()=>{})}writeQueue=Promise.resolve();log(e){this.write("LOG",e)}debug(e){super.shouldLog(8)&&this.write("DEBUG",this.filterSecrets(e).toString())}info(e){super.shouldLog(4)&&this.write("INFO",this.filterSecrets(e).toString())}notice(e){super.shouldLog(2)&&this.write("NOTICE",this.filterSecrets(e).toString())}warning(e){super.shouldLog(2)&&this.write("WARNING",this.filterSecrets(e).toString())}error(e){super.shouldLog(1)&&this.write("ERROR",this.filterSecrets(e).toString())}startGroup(e,l){super.shouldLog(l||4)&&this.write("START-GROUP",e)}endGroup(e){super.shouldLog(e||4)&&this.write("END-GROUP","")}write(e,l){let n=`${new Date().toISOString()} [${e}] ${l}
1128
+ ${n}`;await c.logMCPSetup(I,s),this.logger.log(`Updated session log for ${I} with ${e.length} tools`)}catch(n){this.logger.error(`Failed to update session log for ${I}: ${n}`)}}};G();var wbI={mcpServers:{}},eP=class{constructor(I,e,l){this.logger=I;this.registry=e;this.remoteEnabled=l?.remoteEnabled??!1,this.mcp3pEnabled=l?.mcp3pEnabled??!1,this.blackbirdMetisIndexEnabled=l?.blackbirdMetisIndexEnabled??!1,this.sessionClient=l?.sessionClient,this.mcpEnvConfig=void 0}remoteEnabled;mcp3pEnabled;blackbirdMetisIndexEnabled;mcpEnvConfig;sessionClient;ReadMcpConfigFromEnv(I){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 e=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(e,I),this.configureGitHubMcp(e,I),this.configurePlaywrightMcp(e)),e}validateEnvConfig(){if(!this.mcp3pEnabled)return this.logger.log("User-provided MCPs are disabled"),wbI;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"),wbI;try{let I=JSON.parse(this.mcpEnvConfig);if(!I.mcpServers)throw new Error("User-provided config had incorrect format. Missing 'mcpServers' property.");for(let e in I.mcpServers)I.mcpServers[e].isDefaultServer=!1;return I}catch(I){return this.logger.error(`Warning: User-provided MCP servers were defined but invalid: ${I}`),wbI}}configureGitHubMcp(I,e){this.remoteEnabled?this.configureRemoteGitHubMcp(I,e):this.configureLocalGitHubMcp(I)}configureRemoteGitHubMcp(I,e){this.logger.log("Using default remote GitHub MCP server configuration");let l="repos,issues,users,pull_requests,code_security,secret_protection,actions";process.env.COPILOT_MCP_COPILOT_SPACES_ENABLED==="true"&&(this.logger.log("Enabling Copilot Spaces in GitHub MCP server configuration"),l=l+",copilot_spaces");let c={Authorization:"Bearer "+process.env.GITHUB_PERSONAL_ACCESS_TOKEN,"X-MCP-Toolsets":l,"X-MCP-Host":"github-coding-agent","X-Initiator":"agent"};e&&e.api?.copilot?.integrationId&&(c["Copilot-Integration-Id"]=e.api.copilot.integrationId),process.env.GITHUB_COPILOT_INTERACTION_ID&&(c["X-Interaction-Id"]=process.env.GITHUB_COPILOT_INTERACTION_ID);let n={type:"http",url:this.getCapiMcpUrl(),headers:c,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"}};I.mcpServers[_H]=n}configureLocalGitHubMcp(I){if(I.mcpServers[_H]){this.logger.log("Using user-provided GitHub MCP server configuration");let e=I.mcpServers[_H]??{};$H(e)&&!e.command&&(I.mcpServers[_H]={...e,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 e={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};I.mcpServers[_H]=e}}configurePlaywrightMcp(I){if(!I.mcpServers[AbI]){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 e={command:"npx",args:[...LGI,"--allowed-origins","localhost;localhost:*;127.0.0.1;127.0.0.1:*"],tools:["*"],isDefaultServer:!0};I.mcpServers[AbI]=e}}configureBlackbirdMcp(I,e){this.remoteEnabled?this.configureRemoteBlackbirdMcp(I):this.blackbirdMetisIndexEnabled?this.configureLocalMetisBlackbirdMCP(I,e):this.configureLocalBlackbirdMcp(I)}configureLocalMetisBlackbirdMCP(I,e){this.logger.log("Using local Metis Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${e.blackbird?.mode}`);let l=process.env.AGENT_DIR||"/agent";this.logger.log(`Using agent directory: ${l}`);let c=[];e.blackbird?.mode==="tool"&&(c=["*"]),this.logger.log(`Using blackbird Metis server: ${e.blackbird?.mode}`);let n={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:c,isDefaultServer:!0};I.mcpServers[Ry]=n}configureLocalBlackbirdMcp(I){this.logger.log("Using local Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${process.env.BLACKBIRD_MODE}`);let e=[];process.env.BLACKBIRD_MODE==="tool"&&(e=["*"]);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:e,isDefaultServer:!0};I.mcpServers[Ry]=l}configureRemoteBlackbirdMcp(I){this.logger.log("Using remote Blackbird MCP server configuration"),this.logger.log(`Using blackbird mode: ${process.env.BLACKBIRD_MODE}`);let e=[];process.env.BLACKBIRD_MODE==="tool"&&(e=["*"]);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 c={type:"http",url:this.getCapiMcpUrl(),headers:l,tools:e,isDefaultServer:!0};I.mcpServers[Ry]=c}getCapiMcpUrl(){return process.env.COPILOT_API_URL?new URL("/mcp/readonly",process.env.COPILOT_API_URL).toString():"https://api.githubcopilot.com/mcp/readonly"}isValidServerType(I){return $H(I)||_K(I)||$K(I)||q9(I)}isValidLocalServerConfig(I){return I.command!==void 0&&I.command.trim()!==""&&Array.isArray(I.args)}isValidRemoteServerConfig(I){return I.url!==void 0&&I.url.trim()!==""}isValidInMemoryServerConfig(I){return I.serverInstance!==void 0&&typeof I.serverInstance=="object"}validateServerConfig(I,e){return this.remoteEnabled&&!this.isValidServerType(e)?(this.logger.error(`Unsupported server type "${e.type}" for server "${I}". Only "Local", "STDIO", "HTTP", "SSE", or "Memory" are supported.`),!1):!this.remoteEnabled&&!$H(e)&&!q9(e)?(this.logger.error(`Unsupported server type "${e.type}" for server "${I}". Only "Local", "STDIO", or "Memory" are supported.`),!1):e.tools?$H(e)&&!this.isValidLocalServerConfig(e)?(this.logger.error(`Invalid local server configuration for "${I}". Please ensure 'command' and 'args' are provided.`),!1):(_K(e)||$K(e))&&!this.isValidRemoteServerConfig(e)?(this.logger.error(`Invalid remote server configuration for "${I}". Please ensure 'url' is provided.`),!1):q9(e)&&!this.isValidInMemoryServerConfig(e)?(this.logger.error(`Invalid in-memory server configuration for "${I}". Please ensure 'serverInstance' is provided and is an instance of MCPServer.`),!1):!0:(this.logger.error(`No tools specified for server "${I}". Please provide a list of tools or "*" to include all tools.`),!1)}async processHttpServer(I,e){try{let l=this.resolveHeaders(e.headers,process.env),c={...e,headers:l};await this.registry.startHttpMcpClient(I,c),this.logger.log(`Started MCP client for remote server ${I}`)}catch(l){throw this.logger.error(`Failed to start MCP client for remote server ${I}: ${l}`),l}}async processSseServer(I,e){try{let l=this.resolveHeaders(e.headers,process.env),c={...e,headers:l};await this.registry.startSseMcpClient(I,c),this.logger.log(`Started MCP client for remote server ${I}`)}catch(l){throw this.logger.error(`Failed to start MCP client for remote server ${I}: ${l}`),l}}async processInMemoryServer(I,e){try{await this.registry.startInMemoryMcpClient(I,e.serverInstance),this.logger.log(`Started in-memory MCP client for ${I}`)}catch(l){throw this.logger.error(`Failed to start in-memory MCP client for ${I}: ${l}`),l}}async processLocalServer(I,e){let l={...e};if(e.command==="python")try{l=await this.convertPythonToPipx(l)}catch(a){this.logger.error(`Failed to handle Python module for ${I}: ${a}`)}let c=this.buildEnvironment(l),n=this.resolveArray(l.args,c);this.logger.log(`Starting MCP client for ${I} with command: ${l.command} and args: ${n}`);try{await this.registry.startLocalMcpClient(I,c,l.command,n),this.logger.log(`Started MCP client for ${I}`)}catch(a){throw this.logger.error(`Failed to start MCP client for ${I}: ${a}`),a}}convertPythonToPipx(I){if(!I||!I.args||I.args.length===0)return I;let e=I.args,l=e.indexOf("-m");if(l===-1||l===e.length-1)throw new Error("Python command with -m flag must specify a module");let c=e[l+1];this.logger.log(`Converting Python module: ${c} to pipx command`);let n=["run",c];for(let a=l+2;a<e.length;a++)n.push(e[a]);for(let a=0;a<l;a++)n.push(e[a]);return{...I,command:"pipx",args:n}}buildEnvironment(I){let e={};if(I.env)for(let[l,c]of Object.entries(I.env)){let n=c.trim();process.env[n]!==void 0&&(e[l]=process.env[n])}return e}resolveArray(I,e){return I?e?I.map(l=>l.replace(/\$([A-Z0-9_]+)/g,(c,n)=>e[n]||c)):I:[]}resolveHeaders(I,e){if(!I)return{};if(!e)return I;let l={};for(let[c,n]of Object.entries(I)){let a=this.resolveArray([n],e);l[c]=a[0]}return l}async processServers(I){if(!I)throw new Error("No servers to process");let e=Object.entries(I.mcpServers).map(([l,c])=>this.processServer(l,c));await Promise.all(e)}async processServer(I,e){if(!this.validateServerConfig(I,e)){this.logger.error(`Skipping server "${I}" due to invalid configuration.`);return}try{$H(e)?await this.processLocalServer(I,e):_K(e)&&this.remoteEnabled?await this.processHttpServer(I,e):$K(e)&&this.remoteEnabled?await this.processSseServer(I,e):q9(e)&&await this.processInMemoryServer(I,e)}catch(l){I!==Ry&&await this.logServerFailure(I,l)}}async logServerFailure(I,e){if(this.sessionClient)try{await this.sessionClient.logMCPSetup(I,`<error>MCP server failed to start: ${e.message} - for the full output, see the verbose logs</error>`)}catch(l){this.logger.error(`Failed to log failure for MCP Server '${I}': '${l}'`)}}};var tP=class{constructor(I,e,l){this.logger=I;let c;if(typeof e=="string"){if(c=JSON.parse(e),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=e;this.disabledServers=new Set(l||[]),this.registry=new IP(this.logger),this.processor=new eP(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(I){}async processServersWithExtensions(){await this.injectDefaultServers(this.config);let I;if(this.disabledServers.size>0){let e={};for(let[l,c]of Object.entries(this.config.mcpServers))this.disabledServers.has(l)?this.logger.log(`Skipping disabled MCP server: ${l}`):e[l]=c;I={...this.config,mcpServers:e}}else I=this.config;return this.processor.processServers(I)}async stopServers(){for(let[I,e]of Object.entries(this.registry.transports))try{await e.close()}catch(l){this.logger.error(`Error closing transport for ${I}: ${l}`)}this.startServersPromise=null,this.allTools=null}async getTools(I,e,l){if(!this.allTools){await this.startServers();let c=new Pk(I,e,l),n=[];for(let a of Object.keys(this.registry.clients)){let s=await c.loadTools({mcpClient:this.registry.clients[a],clientName:a,tools:this.config.mcpServers[a]?.tools||["*"],filterMapping:this.config.mcpServers[a]?.filterMapping||"hidden_characters"});n.push(...s)}this.allTools=n}return this.allTools}getConfig(){return this.config}async startServer(I,e){await this.startServers(),this.config.mcpServers[I]=e,await this.processor.processServer(I,e),this.allTools=null}async stopServer(I){let e=this.registry.transports[I];if(e)try{await e.close(),delete this.registry.transports[I]}catch(l){this.logger.error(`Error closing transport for ${I}: ${l}`)}this.registry.clients[I]&&delete this.registry.clients[I],this.allTools=null}async restartServer(I,e){this.isServerRunning(I)&&await this.stopServer(I),delete this.config.mcpServers[I],await this.startServer(I,e)}isServerRunning(I){return I in this.registry.transports&&I in this.registry.clients}isServerDisabled(I){return this.disabledServers.has(I)}async disableServer(I){if(this.disabledServers.has(I)){this.logger.log(`Server ${I} is already disabled`);return}this.disabledServers.add(I),this.logger.log(`Disabled server ${I} for this session`),this.isServerRunning(I)&&await this.stopServer(I),this.allTools=null}async enableServer(I){if(!this.disabledServers.has(I)){this.logger.log(`Server ${I} is not disabled`);return}this.disabledServers.delete(I),this.logger.log(`Enabled server ${I} for this session`);let e=this.getServerConfig(I);e?await this.startServer(I,e):await this.startBuiltInServer(I),this.allTools=null}async startBuiltInServer(I){}getServerConfig(I){return this.config.mcpServers[I]}};G();var AUI=Qc(gUI(),1);async function k9e(t={}){let I=await EiI();return XiI((0,AUI.default)({},I,t))}async function XUI(t={}){if(Nf())throw new Error("Settings have already been initialized");return k9e(t)}G();async function TY(t,I,e){if(!t||t.length===0)return;let l=!1,c={};for(let n of t)try{let a=await n(I);a&&(l=!0,c={...c,...a})}catch(a){e.error(`Hook execution failed: ${a}`)}return l?c:void 0}G();G();G();var zbI=class{loggers;constructor(I){this.loggers=I}isDebug(){return this.loggers.some(I=>I.isDebug())}debug(I){this.loggers.forEach(e=>e.debug(I))}log(I){this.loggers.forEach(e=>e.log(I))}info(I){this.loggers.forEach(e=>e.info(I))}notice(I){this.loggers.forEach(e=>e.notice(I))}warning(I){this.loggers.forEach(e=>e.warning(I))}error(I){this.loggers.forEach(e=>e.error(I))}startGroup(I,e){this.loggers.forEach(l=>l.startGroup(I,e))}endGroup(I){this.loggers.forEach(e=>e.endGroup(I))}};G();import{appendFile as f9e,access as x9e,mkdir as B9e}from"fs/promises";import{constants as z9e}from"fs";import{dirname as U9e}from"path";var UbI=class extends Bh{constructor(e,l,c){super(l,c);this.filePath=e;this.writeQueue=S9e(U9e(this.filePath)).catch(()=>{})}writeQueue=Promise.resolve();log(e){this.write("LOG",e)}debug(e){super.shouldLog(8)&&this.write("DEBUG",this.filterSecrets(e).toString())}info(e){super.shouldLog(4)&&this.write("INFO",this.filterSecrets(e).toString())}notice(e){super.shouldLog(2)&&this.write("NOTICE",this.filterSecrets(e).toString())}warning(e){super.shouldLog(2)&&this.write("WARNING",this.filterSecrets(e).toString())}error(e){super.shouldLog(1)&&this.write("ERROR",this.filterSecrets(e).toString())}startGroup(e,l){super.shouldLog(l||4)&&this.write("START-GROUP",e)}endGroup(e){super.shouldLog(e||4)&&this.write("END-GROUP","")}write(e,l){let n=`${new Date().toISOString()} [${e}] ${l}
1129
1129
  `;this.writeQueue=this.writeQueue.then(()=>this.performWrite(n)).catch(()=>{})}async performWrite(e){await f9e(this.filePath,e)}};async function S9e(t){try{await x9e(t,z9e.F_OK)}catch{await B9e(t,{recursive:!0})}}G();var lE=class{id;startTime;selectedModel;logger;constructor({id:I,startTime:e,selectedModel:l}={},c){this.id=I||Oo(),this.startTime=e||new Date,this.selectedModel=l,this.logger=c||new zr}};var lf=class extends lE{messages=[];constructor({chatMessages:I,...e}={},l){super(e,l),this.messages=I||[]}async getChatMessages(){return[...this.messages]}async addChatMessage(I){this.messages.push(I)}async onAbort(){}},wUI=class{sessions=new Map;logger;constructor(I){this.logger=I?.logger||new zr}async createSession(){let I=new lf({},this.logger);return this.sessions.set(I.id,I),this.logger.info(`Created new in-memory session with ID: ${I.id}`),I}async getLastSession(){let I=Array.from(this.sessions.values()).pop();if(!I)throw new Error("No sessions available");return I}async getSession(I){let e=this.sessions.get(I);if(!e)throw new Error(`Session with ID ${I} not found`);return e}async listSessions(){return Array.from(this.sessions.values()).map(I=>({id:I.id,startTime:I.startTime,selectedModel:I.selectedModel}))}async saveSession(I){this.logger.info(`Session with ID ${I.id} is in-memory and does not require saving.`)}enableAutoSave(){this.logger.info("Auto-save is not applicable for in-memory sessions.")}async deleteSession(I){this.sessions.delete(I.id)?this.logger.info(`Deleted session with ID: ${I.id}`):this.logger.warning(`Attempted to delete non-existent session with ID: ${I.id}`)}};var dP=class{static name="Copilot";static description="Base Copilot Agent";options;logger;workingDir;session;constructor(I){this.options=I,this.logger=I.logger||new zr,this.workingDir=I.workingDirectory||process.cwd(),this.session=I.session||new lf}async*query(I){let e=new Map,l;try{if(this.options.mcpServers&&Object.keys(this.options.mcpServers).length>0)try{l=new tP(this.logger,{mcpServers:this.options.mcpServers},this.options.disabledTools),await l.startServers()}catch(FI){this.logger.error(`Failed to initialize MCP host: ${FI}`)}let c={timestamp:Date.now(),cwd:this.workingDir,prompt:I},a=(await TY(this.options.hooks?.userPromptSubmitted,c,this.logger))?.modifiedPrompt??I;await this.session.addChatMessage({role:"user",content:a});let r=new ky().setProblemStatement(a).setAgentModel(this.buildAgentModelString()).setGithubRepoName("copilot-sdk-session").setGithubRepoCommit("copilot-sdk-commit").setGithubRepoReadWrite(!1).setCopilotIntegrationId(this.options.integrationId||"copilot-sdk-unknown").setCopilotHmacKey(this.options.hmacKey).setCopilotToken(this.options.copilotToken).build();wiI();let o=await XUI(r),d=o.service?.agent?.model,b=jGI(d),h=b.agent,Z=b.model?{model:b.model}:void 0,p=raI(o,this.logger,h,Z),W={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"?pb.powerShell:pb.bash},N=await x9I(W,this.logger),Y=[];if(l)try{Y=await l.getTools(o,this.logger,W.permissions)}catch(FI){this.logger.error(`Failed to get MCP tools: ${FI}`)}let F=[...N,...Y],A=this.applyToolFiltering(F,this.options.allowedTools,this.options.disabledTools),g=await lkI(this.workingDir),k={...(z9I()["sweagent-capi"]?.["claude-sonnet-4"]??B9I()).supports,reasoning:!0},z=await Y9I(g.found?g.gitRoot:"",uCI(),this.workingDir,{},k,W),rI=(await this.session.getChatMessages()).slice(0,-1),VI={role:"user",content:y9I(a,k)},UI=[...rI,VI],HI={timestamp:Date.now(),cwd:this.workingDir,source:"new",initialPrompt:I};await TY(this.options.hooks?.sessionStart,HI,this.logger);let hI=p.getCompletionWithTools(z,UI,A,{failIfInitialInputsTooLong:!1,processors:{preRequest:[new YH(this.logger)]},executeToolsInParallel:!1,abortSignal:this.options.abortController?.signal});for await(let FI of hI){if(this.options.abortController?.signal.aborted){yield{type:"error",error:new Error("Operation was cancelled")};return}let EI=await this.translateEvent(FI,e);for(let Pt of EI)Pt.type==="message"&&Pt.role==="assistant"&&await this.session.addChatMessage({role:"assistant",content:Pt.content}),yield Pt}yield{type:"complete"}}catch(c){let n={timestamp:Date.now(),cwd:this.workingDir,reason:"error",error:c instanceof Error?c:new Error(String(c))};await TY(this.options.hooks?.sessionEnd,n,this.logger),yield{type:"error",error:c instanceof Error?c:new Error(String(c))}}finally{let c={timestamp:Date.now(),cwd:this.workingDir,reason:"complete"};if(await TY(this.options.hooks?.sessionEnd,c,this.logger),l)try{await l.stopServers(),this.logger.log("MCP host stopped successfully")}catch(n){this.logger.error(`Error stopping MCP host: ${n}`)}}}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(I,e,l){let c=I;return e&&e.length>0&&(c=c.filter(n=>e.includes(n.name))),l&&l.length>0&&(c=c.filter(n=>!l.includes(n.name))),c}async translateEvent(I,e){switch(I.kind){case"message":{if(JD(I)&&I.message.content)return[{type:"message",content:typeof I.message.content=="string"?I.message.content:"",role:"assistant"}];if(v9I(I)){let l=[];for(let c of I.message.tool_calls){let n=Jg(c.function.arguments);e.set(c.id,c.function.name);let a={timestamp:Date.now(),cwd:this.workingDir,toolName:c.function.name,toolArgs:n},r=(await TY(this.options.hooks?.preToolUse,a,this.logger))?.modifiedArgs??n;l.push({type:"tool_use",toolName:c.function.name,args:r,toolCallId:c.id})}return l}return[]}case"response":return I.response.content&&typeof I.response.content=="string"?[{type:"message",content:I.response.content,role:"assistant"}]:[];case"model_call_failure":{let l=new Error(I.modelCall?.error||"Model call failed"),c={timestamp:Date.now(),cwd:this.workingDir,error:l,errorContext:"model_call",recoverable:!0};return await TY(this.options.hooks?.errorOccurred,c,this.logger),[{type:"error",error:l}]}case"tool_execution":{let l=e.get(I.toolCallId)||"unknown",c={timestamp:Date.now(),cwd:this.workingDir,toolName:l,toolArgs:{},toolResult:I.toolResult},a=(await TY(this.options.hooks?.postToolUse,c,this.logger))?.modifiedResult??I.toolResult;return[{type:"tool_result",toolName:l,result:a,toolCallId:I.toolCallId}]}default:return[]}}};G();G();G();G();var YSI=Qc(oSI(),1);G();import{existsSync as ciI}from"fs";import{mkdir as Lxe,readdir as kxe,readFile as fxe,stat as xxe,writeFile as Bxe}from"fs/promises";import{homedir as zxe}from"os";import{dirname as Uxe,join as sf}from"path";G();G();var Hxe=new Error("timeout while waiting for mutex to become available"),Czl=new Error("mutex already locked"),Exe=new Error("request for lock canceled"),vxe=function(t,I,e,l){function c(n){return n instanceof e?n:new e(function(a){a(n)})}return new(e||(e=Promise))(function(n,a){function s(d){try{o(l.next(d))}catch(b){a(b)}}function r(d){try{o(l.throw(d))}catch(b){a(b)}}function o(d){d.done?n(d.value):c(d.value).then(s,r)}o((l=l.apply(t,I||[])).next())})},liI=class{constructor(I,e=Exe){this._value=I,this._cancelError=e,this._queue=[],this._weightedWaiters=[]}acquire(I=1,e=0){if(I<=0)throw new Error(`invalid weight ${I}: must be positive`);return new Promise((l,c)=>{let n={resolve:l,reject:c,weight:I,priority:e},a=bSI(this._queue,s=>e<=s.priority);a===-1&&I<=this._value?this._dispatchItem(n):this._queue.splice(a+1,0,n)})}runExclusive(I){return vxe(this,arguments,void 0,function*(e,l=1,c=0){let[n,a]=yield this.acquire(l,c);try{return yield e(n)}finally{a()}})}waitForUnlock(I=1,e=0){if(I<=0)throw new Error(`invalid weight ${I}: must be positive`);return this._couldLockImmediately(I,e)?Promise.resolve():new Promise(l=>{this._weightedWaiters[I-1]||(this._weightedWaiters[I-1]=[]),Cxe(this._weightedWaiters[I-1],{resolve:l,priority:e})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(I){this._value=I,this._dispatchQueue()}release(I=1){if(I<=0)throw new Error(`invalid weight ${I}: must be positive`);this._value+=I,this._dispatchQueue()}cancel(){this._queue.forEach(I=>I.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(I){let e=this._value;this._value-=I.weight,I.resolve([e,this._newReleaser(I.weight)])}_newReleaser(I){let e=!1;return()=>{e||(e=!0,this.release(I))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let I=this._value;I>0;I--){let e=this._weightedWaiters[I-1];e&&(e.forEach(l=>l.resolve()),this._weightedWaiters[I-1]=[])}else{let I=this._queue[0].priority;for(let e=this._value;e>0;e--){let l=this._weightedWaiters[e-1];if(!l)continue;let c=l.findIndex(n=>n.priority<=I);(c===-1?l:l.splice(0,c)).forEach(n=>n.resolve())}}}_couldLockImmediately(I,e){return(this._queue.length===0||this._queue[0].priority<e)&&I<=this._value}};function Cxe(t,I){let e=bSI(t,l=>I.priority<=l.priority);t.splice(e+1,0,I)}function bSI(t,I){for(let e=t.length-1;e>=0;e--)if(I(t[e]))return e;return-1}var Jxe=function(t,I,e,l){function c(n){return n instanceof e?n:new e(function(a){a(n)})}return new(e||(e=Promise))(function(n,a){function s(d){try{o(l.next(d))}catch(b){a(b)}}function r(d){try{o(l.throw(d))}catch(b){a(b)}}function o(d){d.done?n(d.value):c(d.value).then(s,r)}o((l=l.apply(t,I||[])).next())})},AP=class{constructor(I){this._semaphore=new liI(1,I)}acquire(){return Jxe(this,arguments,void 0,function*(I=0){let[,e]=yield this._semaphore.acquire(1,I);return e})}runExclusive(I,e=0){return this._semaphore.runExclusive(()=>I(),1,e)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(I=0){return this._semaphore.waitForUnlock(1,I)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}},dSI=function(t,I,e,l){function c(n){return n instanceof e?n:new e(function(a){a(n)})}return new(e||(e=Promise))(function(n,a){function s(d){try{o(l.next(d))}catch(b){a(b)}}function r(d){try{o(l.throw(d))}catch(b){a(b)}}function o(d){d.done?n(d.value):c(d.value).then(s,r)}o((l=l.apply(t,I||[])).next())})};function iSI(t,I,e=Hxe){return{acquire:(l,c)=>{let n;if(gP(t)?n=l:(n=void 0,c=l),n!==void 0&&n<=0)throw new Error(`invalid weight ${n}: must be positive`);return new Promise((a,s)=>dSI(this,void 0,void 0,function*(){let r=!1,o=setTimeout(()=>{r=!0,s(e)},I);try{let d=yield gP(t)?t.acquire(n,c):t.acquire(c);r?(Array.isArray(d)?d[1]:d)():(clearTimeout(o),a(d))}catch(d){r||(clearTimeout(o),s(d))}}))},runExclusive(l,c,n){return dSI(this,void 0,void 0,function*(){let a=()=>{};try{let s=yield this.acquire(c,n);return Array.isArray(s)?(a=s[1],yield l(s[0])):(a=s,yield l())}finally{a()}})},release(l){t.release(l)},cancel(){return t.cancel()},waitForUnlock:(l,c)=>{let n;if(gP(t)?n=l:(n=void 0,c=l),n!==void 0&&n<=0)throw new Error(`invalid weight ${n}: must be positive`);return new Promise((a,s)=>{let r=setTimeout(()=>s(e),I);(gP(t)?t.waitForUnlock(n,c):t.waitForUnlock(c)).then(()=>{clearTimeout(r),a()})})},isLocked:()=>t.isLocked(),getValue:()=>t.getValue(),setValue:l=>t.setValue(l)}}function gP(t){return t.getValue!==void 0}var XP=class{mutexes=new Map;async runExclusive(I,e,l=5e3){let c=this.mutexes.get(I);c||(c=new AP,c.refCount=0,this.mutexes.set(I,c));let n=c;try{return n.refCount++,await iSI(c,l).runExclusive(e)}finally{--n.refCount===0&&this.mutexes.delete(I)}}};var niI=(e=>(e.DEFAULT="config",e.MCP="mcp",e))(niI||{});function mSI(t){return Object.values(niI).includes(t)}var hSI=".copilot",ZSI=new XP;async function Sxe(t){let I=Uxe(t);try{await Lxe(I,{recursive:!0,mode:448})}catch{}}async function Oxe(t,I){if(ciI(t))try{let e={},l=await ZSI.runExclusive(t,()=>fxe(t,"utf8"));return l.trim().startsWith("{")?e=JSON.parse(l):l.split(`
1130
- `).forEach(c=>{let[n,a]=c.split("=").map(s=>s.trim());n&&a&&(e[n]=a)}),I(e)}catch(e){throw new Error(`Failed to read configuration from ${t}: ${e}`)}}async function Mxe(t,I){try{await Sxe(t);let e=JSON.stringify(I,null,2);await ZSI.runExclusive(t,()=>Bxe(t,e,{mode:384}))}catch(e){throw new Error(`Failed to write configuration to ${t}: ${e}`)}}var pSI=(t,I)=>{let e=()=>{let o=mSI(I)?process.env.XDG_CONFIG_HOME:process.env.XDG_STATE_HOME;return o?sf(o,hSI):sf(zxe(),hSI)},l=()=>{let o=mSI(I)?"-config":"-state";return`${I}${I=="config"?"":o}`},c=o=>{let d=".json",b=l()+(o?"":d),h=sf(e(),b,o?`${o}${d}`:"");return!ciI(h)&&ciI(h.replace(/\.json$/,""))&&(h=h.replace(/\.json$/,"")),h},n=async()=>{let o=sf(e(),l());try{let b=(await kxe(o)).filter(Z=>Z.endsWith(".json")),h=await Promise.all(b.map(async Z=>{let p=sf(o,Z);try{let W=await xxe(p);return{file:Z,mtime:W.mtime}}catch{return{file:Z,mtime:new Date}}}));return h.sort((Z,p)=>p.mtime.getTime()-Z.mtime.getTime()),h.map(Z=>Z.file)}catch{}return[]},a=async o=>await Oxe(c(o),t),s=async(o,d)=>{await Mxe(c(d),o)};return{load:a,write:s,writeKey:async(o,d,b)=>{let h=await a(b);if(d===void 0){h&&(delete h[o],await s(h,b));return}let Z={[o]:d},p;h?p={...h,...Z}:p=Z,await s(p,b)},path:c,directoryFiles:n}},uSI=(t,I)=>pSI(t,I),WSI=(t,I)=>pSI(t,I);var NSI=Ae({host:vI(),login:vI()}),Txe=Ae({banner:au(["always","once","never"]).optional(),beep:fa().optional(),last_logged_in_user:NSI.optional(),logged_in_users:Us(NSI).optional(),model:au(wP).optional(),render_markdown:fa().optional(),screen_reader:fa().optional(),theme:vI().optional(),trusted_folders:Us(vI()).optional(),capi_hmac_key:vI().optional(),copilot_hmac_key:vI().optional(),copilot_integration_id:vI().optional(),copilot_tokens:OD(vI(),vI()).optional(),copilot_url:vI().optional()}),jxe=OD(vI(),IoI()),Dxe=jxe.transform(t=>(0,YSI.default)(t,(I,e)=>{let l=e.toLowerCase();return l==="github_copilot_integration_id"?"copilot_integration_id":l})),Kxe=Dxe.pipe(Txe),Pxe=uSI(Kxe.parse,"config");var wP=["claude-sonnet-4.5","claude-sonnet-4","gpt-5"];G();var qxe=Ae({type:sl("copilot"),text:vI()}),_xe=Ae({type:sl("error"),text:vI()}),$xe=Ae({type:sl("info"),text:vI()}),IBe=Ae({displayText:vI(),fullPath:vI(),type:au(["file","directory","unresolved","image"]),startIndex:wh()}),eBe=Ae({type:sl("user"),text:vI(),expandedText:vI().optional(),mentions:Us(IBe).optional(),imageAttachments:Us(Ae({type:sl("image_url"),image_url:Ae({url:vI()})})).optional()}),tBe=Ae({command:vI(),description:vI(),timeout:wh().optional(),sessionId:vI().optional(),async:fa().optional()}),lBe=Ae({sessionId:vI(),input:vI(),delay:wh().optional()}),cBe=Ae({sessionId:vI(),delay:wh()}),nBe=Ae({sessionId:vI()}),aBe=Ss([tBe,lBe,cBe,nBe]),sBe=Ae({command:sl("view"),path:vI(),view_range:loI([wh(),wh()]).optional()}),rBe=Ae({command:sl("create"),path:vI(),file_text:vI()}),GBe=Ae({command:sl("str_replace"),path:vI(),new_str:vI().optional(),old_str:vI()}),oBe=Ae({command:sl("insert"),path:vI(),insert_line:wh(),new_str:vI()}),dBe=toI("command",[sBe,rBe,GBe,oBe]),VSI=Ss([aBe,dBe,eoI()]),bBe=Ae({type:sl("tool_call_requested"),callId:vI(),name:vI(),toolTitle:vI().optional(),intentionSummary:vI().nullable(),arguments:VSI,partialOutput:vI().optional(),isHidden:fa().optional(),isAlwaysExpanded:fa().optional(),showNoContent:fa().optional()}),iBe=Ae({type:sl("tool_call_completed"),callId:vI(),name:vI(),toolTitle:vI().optional(),intentionSummary:vI().nullable(),result:Ss([Ae({type:sl("success"),log:vI(),markdown:fa().optional()}),Ae({type:sl("failure"),log:vI(),markdown:fa().optional()}),Ae({type:sl("rejected"),markdown:fa().optional()}),Ae({type:sl("denied"),log:vI(),markdown:fa().optional()})]),arguments:VSI,isHidden:fa().optional(),isAlwaysExpanded:fa().optional(),showNoContent:fa().optional()}),mBe=Ss([qxe,_xe,$xe,eBe,bBe,iBe]),RSI=mBe.and(Ae({id:vI(),timestamp:e9.date()}));var rf=Ae({type:sl("text"),text:vI()}),hBe=Ae({type:sl("refusal"),refusal:vI()}),ZBe=Ae({type:sl("image_url"),image_url:Ae({url:vI(),detail:au(["auto","low","high"]).optional()})}),pBe=Ae({type:sl("input_audio"),input_audio:Ae({data:vI(),format:sl("wav").or(sl("mp3"))})}),uBe=Ae({type:sl("file"),file:Ae({file_date:vI().optional(),file_id:vI().optional(),filename:vI().optional()})}),WBe=Ss([rf,ZBe,pBe,uBe]),NBe=Ae({name:vI(),arguments:vI()}),YBe=Ae({name:vI(),input:vI()}),VBe=Ae({id:vI(),type:sl("function"),function:NBe}),RBe=Ae({id:vI(),type:sl("custom"),custom:YBe}),yBe=Ss([VBe,RBe]),FBe=Ae({name:vI(),arguments:vI()}),QBe=Ae({id:vI()}),gBe=Ae({content:Ss([vI(),Us(rf)]),role:sl("developer"),name:vI().optional()}),ABe=Ae({content:Ss([vI(),Us(rf)]),role:sl("system"),name:vI().optional()}),XBe=Ae({content:Ss([vI(),Us(WBe)]),role:sl("user"),name:vI().optional()}),wBe=Ae({content:Ss([vI(),Us(Ss([rf,hBe]))]).nullable().optional(),role:sl("assistant"),name:vI().optional(),refusal:vI().nullable().optional(),audio:QBe.nullable().optional(),function_call:FBe.nullable().optional(),tool_calls:Us(yBe).optional()}),HBe=Ae({content:Ss([vI(),Us(rf)]),role:sl("tool"),tool_call_id:vI()}),EBe=Ae({content:vI().nullable(),role:sl("function"),name:vI()}),vBe=Ss([gBe,ABe,XBe,wBe,HBe,EBe]),CBe=Ae({sessionId:vI(),startTime:e9.date(),chatMessages:Us(vBe),timeline:Us(RSI),selectedModel:au(wP).optional()}),Nu=WSI(CBe.parse,"history-session");G();function JBe(t){return`session_${t.sessionId}_${t.startTime.getTime()}`}function ySI(t){let I=/^session_(.+)_(\d+)\.json$/,e=t.match(I);if(!e)return null;let[,l,c]=e;return{sessionId:l,startTime:new Date(parseInt(c,10))}}var GE=class t{currentSession;onTimelineEntriesChangeCallback=null;debounceSave=null;logger;needsSessionPicker=!1;autoSaveEnabled=!1;usageMetrics={totalPremiumRequests:0,totalApiDurationMs:0,sessionStartTime:Date.now(),codeChanges:{linesAdded:0,linesRemoved:0,filesModified:new Set},modelMetrics:new Map};static async create(I){let e=new t;switch(I.kind){case"new":break;case"resume-last":await e.resumeLastSession();break;case"resume":await e.resumeSpecificSession(I.sessionId);break;case"resume-with-picker":e.needsSessionPicker=!0;break;default:{let l=I;throw new Error(`unexpected session kind: ${JSON.stringify(l)}`)}}return e}static async hasMultipleSessions(){try{return(await Nu.directoryFiles()).length>1}catch{return!1}}constructor(){this.currentSession=this.generateSession(),this.logger=new zr}setLogger(I){this.logger=I}getLogger(){return this.logger}isWaitingForSessionPicker(){return this.needsSessionPicker}async selectSession(I){this.needsSessionPicker=!1,await this.resumeSpecificSession(I)}setOnTimelineEntriesChangeCallback(I){this.onTimelineEntriesChangeCallback=I,this.notifyTimelineEntriesChange()}notifyTimelineEntriesChange(){this.onTimelineEntriesChangeCallback?.([...this.currentSession.timeline])}enableAutoSave(){this.autoSaveEnabled=!0}async forceSave(){await this.saveHistorySession(this.currentSession)}scheduleSave(){this.debounceSave&&clearTimeout(this.debounceSave);let I=this.currentSession;this.debounceSave=setTimeout(()=>{this.autoSaveEnabled&&this.saveHistorySession(I)},100)}getTimelineEntries(){return[...this.currentSession.timeline]}async loadHistorySession(I){try{let e=await Nu.load(I);if(!e)return;let l={...e,startTime:new Date(e.startTime)};this.currentSession=l;for(let c of this.currentSession.timeline)c.timestamp=new Date(c.timestamp);this.currentSession.chatMessages=this.completeOrphanedToolCalls(this.currentSession.chatMessages),this.enableAutoSave(),this.notifyTimelineEntriesChange()}catch(e){throw this.logger.error(`Error loading history session: ${e}`),e}}async saveHistorySession(I){let e=JBe(I);await Nu.write(I,e)}getCurrentSessionId(){return this.currentSession?.sessionId}getCurrentSessionStartTime(){return this.currentSession?.startTime}getSelectedModel(){return this.currentSession?.selectedModel}getCurrentModel(I){return I||this.currentSession?.selectedModel||this.usageMetrics.currentModel||""}setSelectedModel(I){this.currentSession.selectedModel=I,this.scheduleSave()}addTimelineEntry(I){try{this.currentSession.timeline.push({id:Oo(),timestamp:new Date,...I}),this.scheduleSave(),this.notifyTimelineEntriesChange()}catch(e){this.logger.error(`Error adding timeline entry: ${e}`)}}clearHistory(){this.currentSession.chatMessages=[],this.currentSession.timeline=[],this.scheduleSave(),this.notifyTimelineEntriesChange()}addChatMessage(I){this.currentSession.chatMessages.push(I),this.scheduleSave()}getChatContextMessages(){return this.currentSession.chatMessages.filter(I=>I.role!=="system")}handleAbortedOperation(){this.currentSession.chatMessages=this.completeOrphanedToolCalls(this.currentSession.chatMessages),this.scheduleSave()}completeOrphanedToolCalls(I){if(I.length===0)return I;let e=[];for(let n=I.length-1;n>=0;n--){let a=I[n];if(a.role==="assistant"&&"tool_calls"in a&&a.tool_calls&&a.tool_calls.length>0)for(let s of a.tool_calls)e.push(s.id);else break}if(e.length===0)return I;let l="The execution of this tool, or a previous tool was interrupted.";this.logger.info(`Completing ${e.length} orphaned tool calls.`);let c=e.map(n=>({role:"tool",tool_call_id:n,content:l}));for(let n of e)this.updateToolCallTimelineEntryResult({callId:n,resultType:"rejected",log:l});return[...I,...c]}updateToolCallTimelineEntryResult(I){let e=this.currentSession.timeline.findLastIndex(n=>n.type==="tool_call_requested"&&n.callId===I.callId);if(e===-1){this.logger.error(`Pending tool call with ID ${I.callId} not found`);return}let l=this.currentSession.timeline[e];if(l.type==="tool_call_requested"&&l.name==="str_replace_editor"&&I.log){let s=l.arguments?.path;this.updateCodeChangeMetrics(I.log,s)}let c=this.currentSession.timeline[e];this.currentSession.timeline[e]={type:"tool_call_completed",id:c.id,timestamp:c.timestamp,callId:c.callId,name:c.name,toolTitle:c.toolTitle,intentionSummary:c.intentionSummary,arguments:c.arguments,result:{type:I.resultType,log:I.log,markdown:I.markdown},isAlwaysExpanded:c.isAlwaysExpanded,showNoContent:c.showNoContent},this.scheduleSave(),this.notifyTimelineEntriesChange()}updateToolCallTimelineEntryPartialOutput(I,e){let l=this.currentSession.timeline.findLastIndex(n=>n.type==="tool_call_requested"&&n.callId===I);if(l===-1){this.logger.error(`Pending tool call with ID ${I} not found`);return}let c=this.currentSession.timeline[l];this.currentSession.timeline[l]={type:"tool_call_requested",id:c.id,timestamp:c.timestamp,callId:c.callId,name:c.name,toolTitle:c.toolTitle,intentionSummary:c.intentionSummary,arguments:c.arguments,partialOutput:e,isAlwaysExpanded:c.isAlwaysExpanded,showNoContent:c.showNoContent},this.notifyTimelineEntriesChange()}async resumeSpecificSession(I){let e=await Nu.directoryFiles();if(e.length===0)throw new Error(`Session not found: ${I}`);let l=null,c=[];for(let n of e){let a=ySI(n);if(a&&a.sessionId===I){l=n;break}}if(!l){for(let n of e){let a=ySI(n);a&&a.sessionId.startsWith(I)&&c.push({file:n,parsed:a})}c.length>0&&(c.sort((n,a)=>a.parsed.startTime.getTime()-n.parsed.startTime.getTime()),l=c[0].file)}if(!l)throw new Error(`Session not found: ${I}`);try{await this.loadHistorySession(l)}catch(n){throw new Error(`Failed to load session ${I}: ${n}`)}}async resumeLastSession(){let I=await Nu.directoryFiles();if(I.length===0)throw new Error("No sessions found");let e=I[0];try{await this.loadHistorySession(e)}catch(l){throw new Error(`Failed to resume last session: ${l}`)}}generateSession(){return this.resetUsageMetrics(),{sessionId:this.generateSessionId(),startTime:new Date,chatMessages:[],timeline:[]}}generateSessionId(){return Oo()}getUsageMetrics(){return this.usageMetrics}resetUsageMetrics(){this.usageMetrics={totalPremiumRequests:0,totalApiDurationMs:0,sessionStartTime:Date.now(),codeChanges:{linesAdded:0,linesRemoved:0,filesModified:new Set},modelMetrics:new Map}}getModelRequestMultiplier(I){return{"claude-sonnet-4":1,"gpt-5":1,"claude-sonnet-4.5":1}[I]??1}trackUserMessage(I){let e=I||"",c=1*this.getModelRequestMultiplier(e);this.usageMetrics.totalPremiumRequests+=c,this.usageMetrics.modelMetrics.has(e)||this.usageMetrics.modelMetrics.set(e,{requests:{count:0,cost:0},usage:{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0}});let n=this.usageMetrics.modelMetrics.get(e);n.requests.count+=1,n.requests.cost+=c,this.usageMetrics.currentModel=e}updateModelUsageMetrics(I,e,l){let c=I||"";if(this.usageMetrics.totalApiDurationMs+=e,l){this.usageMetrics.modelMetrics.has(c)||this.usageMetrics.modelMetrics.set(c,{requests:{count:0,cost:0},usage:{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0}});let n=this.usageMetrics.modelMetrics.get(c);if(n.usage.inputTokens+=l.prompt_tokens||0,n.usage.outputTokens+=l.completion_tokens||0,l.prompt_tokens_details?.cached_tokens){n.usage.cacheReadTokens+=l.prompt_tokens_details.cached_tokens;let a=(l.prompt_tokens||0)-l.prompt_tokens_details.cached_tokens;n.usage.cacheWriteTokens+=Math.max(0,a)}}}updateCodeChangeMetrics(I,e){if(!I||!I.includes("diff --git"))return;let l=I.split(`
1130
+ `).forEach(c=>{let[n,a]=c.split("=").map(s=>s.trim());n&&a&&(e[n]=a)}),I(e)}catch(e){throw new Error(`Failed to read configuration from ${t}: ${e}`)}}async function Mxe(t,I){try{await Sxe(t);let e=JSON.stringify(I,null,2);await ZSI.runExclusive(t,()=>Bxe(t,e,{mode:384}))}catch(e){throw new Error(`Failed to write configuration to ${t}: ${e}`)}}var pSI=(t,I)=>{let e=()=>{let o=mSI(I)?process.env.XDG_CONFIG_HOME:process.env.XDG_STATE_HOME;return o?sf(o,hSI):sf(zxe(),hSI)},l=()=>{let o=mSI(I)?"-config":"-state";return`${I}${I=="config"?"":o}`},c=o=>{let d=".json",b=l()+(o?"":d),h=sf(e(),b,o?`${o}${d}`:"");return!ciI(h)&&ciI(h.replace(/\.json$/,""))&&(h=h.replace(/\.json$/,"")),h},n=async()=>{let o=sf(e(),l());try{let b=(await kxe(o)).filter(Z=>Z.endsWith(".json")),h=await Promise.all(b.map(async Z=>{let p=sf(o,Z);try{let W=await xxe(p);return{file:Z,mtime:W.mtime}}catch{return{file:Z,mtime:new Date}}}));return h.sort((Z,p)=>p.mtime.getTime()-Z.mtime.getTime()),h.map(Z=>Z.file)}catch{}return[]},a=async o=>await Oxe(c(o),t),s=async(o,d)=>{await Mxe(c(d),o)};return{load:a,write:s,writeKey:async(o,d,b)=>{let h=await a(b);if(d===void 0){h&&(delete h[o],await s(h,b));return}let Z={[o]:d},p;h?p={...h,...Z}:p=Z,await s(p,b)},path:c,directoryFiles:n}},uSI=(t,I)=>pSI(t,I),WSI=(t,I)=>pSI(t,I);var NSI=Ae({host:vI(),login:vI()}),Txe=Ae({banner:au(["always","once","never"]).optional(),beep:fa().optional(),last_logged_in_user:NSI.optional(),logged_in_users:Us(NSI).optional(),model:au(wP).optional(),render_markdown:fa().optional(),screen_reader:fa().optional(),theme:vI().optional(),trusted_folders:Us(vI()).optional(),capi_hmac_key:vI().optional(),copilot_hmac_key:vI().optional(),copilot_integration_id:vI().optional(),copilot_tokens:OD(vI(),vI()).optional(),copilot_url:vI().optional()}),jxe=OD(vI(),IoI()),Dxe=jxe.transform(t=>(0,YSI.default)(t,(I,e)=>{let l=e.toLowerCase();return l==="github_copilot_integration_id"?"copilot_integration_id":l})),Kxe=Dxe.pipe(Txe),Pxe=uSI(Kxe.parse,"config");var wP=["claude-sonnet-4.5","claude-sonnet-4","gpt-5"];G();var qxe=Ae({type:sl("copilot"),text:vI()}),_xe=Ae({type:sl("error"),text:vI()}),$xe=Ae({type:sl("info"),text:vI()}),IBe=Ae({displayText:vI(),fullPath:vI(),type:au(["file","directory","unresolved","image"]),startIndex:wh()}),eBe=Ae({type:sl("user"),text:vI(),expandedText:vI().optional(),mentions:Us(IBe).optional(),imageAttachments:Us(Ae({type:sl("image_url"),image_url:Ae({url:vI()})})).optional()}),tBe=Ae({command:vI(),description:vI(),timeout:wh().optional(),sessionId:vI().optional(),async:fa().optional()}),lBe=Ae({sessionId:vI(),input:vI(),delay:wh().optional()}),cBe=Ae({sessionId:vI(),delay:wh()}),nBe=Ae({sessionId:vI()}),aBe=Ss([tBe,lBe,cBe,nBe]),sBe=Ae({command:sl("view"),path:vI(),view_range:loI([wh(),wh()]).optional()}),rBe=Ae({command:sl("create"),path:vI(),file_text:vI()}),GBe=Ae({command:sl("str_replace"),path:vI(),new_str:vI().optional(),old_str:vI()}),oBe=Ae({command:sl("insert"),path:vI(),insert_line:wh(),new_str:vI()}),dBe=toI("command",[sBe,rBe,GBe,oBe]),VSI=Ss([aBe,dBe,eoI()]),bBe=Ae({type:sl("tool_call_requested"),callId:vI(),name:vI(),toolTitle:vI().optional(),intentionSummary:vI().nullable(),arguments:VSI,partialOutput:vI().optional(),isHidden:fa().optional(),isAlwaysExpanded:fa().optional(),showNoContent:fa().optional()}),iBe=Ae({type:sl("tool_call_completed"),callId:vI(),name:vI(),toolTitle:vI().optional(),intentionSummary:vI().nullable(),result:Ss([Ae({type:sl("success"),log:vI(),markdown:fa().optional()}),Ae({type:sl("failure"),log:vI(),markdown:fa().optional()}),Ae({type:sl("rejected"),markdown:fa().optional()}),Ae({type:sl("denied"),log:vI(),markdown:fa().optional()})]),arguments:VSI,isHidden:fa().optional(),isAlwaysExpanded:fa().optional(),showNoContent:fa().optional()}),mBe=Ss([qxe,_xe,$xe,eBe,bBe,iBe]),RSI=mBe.and(Ae({id:vI(),timestamp:e9.date()}));var rf=Ae({type:sl("text"),text:vI()}),hBe=Ae({type:sl("refusal"),refusal:vI()}),ZBe=Ae({type:sl("image_url"),image_url:Ae({url:vI(),detail:au(["auto","low","high"]).optional()})}),pBe=Ae({type:sl("input_audio"),input_audio:Ae({data:vI(),format:sl("wav").or(sl("mp3"))})}),uBe=Ae({type:sl("file"),file:Ae({file_date:vI().optional(),file_id:vI().optional(),filename:vI().optional()})}),WBe=Ss([rf,ZBe,pBe,uBe]),NBe=Ae({name:vI(),arguments:vI()}),YBe=Ae({name:vI(),input:vI()}),VBe=Ae({id:vI(),type:sl("function"),function:NBe}),RBe=Ae({id:vI(),type:sl("custom"),custom:YBe}),yBe=Ss([VBe,RBe]),FBe=Ae({name:vI(),arguments:vI()}),QBe=Ae({id:vI()}),gBe=Ae({content:Ss([vI(),Us(rf)]),role:sl("developer"),name:vI().optional()}),ABe=Ae({content:Ss([vI(),Us(rf)]),role:sl("system"),name:vI().optional()}),XBe=Ae({content:Ss([vI(),Us(WBe)]),role:sl("user"),name:vI().optional()}),wBe=Ae({content:Ss([vI(),Us(Ss([rf,hBe]))]).nullable().optional(),role:sl("assistant"),name:vI().optional(),refusal:vI().nullable().optional(),audio:QBe.nullable().optional(),function_call:FBe.nullable().optional(),tool_calls:Us(yBe).optional()}),HBe=Ae({content:Ss([vI(),Us(rf)]),role:sl("tool"),tool_call_id:vI()}),EBe=Ae({content:vI().nullable(),role:sl("function"),name:vI()}),vBe=Ss([gBe,ABe,XBe,wBe,HBe,EBe]),CBe=Ae({sessionId:vI(),startTime:e9.date(),chatMessages:Us(vBe),timeline:Us(RSI),selectedModel:au(wP).optional()}),Nu=WSI(CBe.parse,"history-session");G();function JBe(t){return`session_${t.sessionId}_${t.startTime.getTime()}`}function ySI(t){let I=/^session_(.+)_(\d+)\.json$/,e=t.match(I);if(!e)return null;let[,l,c]=e;return{sessionId:l,startTime:new Date(parseInt(c,10))}}var GE=class t{currentSession;onTimelineEntriesChangeCallback=null;debounceSave=null;logger;needsSessionPicker=!1;autoSaveEnabled=!1;usageMetrics={totalPremiumRequests:0,totalApiDurationMs:0,sessionStartTime:Date.now(),codeChanges:{linesAdded:0,linesRemoved:0,filesModified:new Set},modelMetrics:new Map};static async create(I){let e=new t;switch(I.kind){case"new":break;case"resume-last":await e.resumeLastSession();break;case"resume":await e.resumeSpecificSession(I.sessionId);break;case"resume-with-picker":e.needsSessionPicker=!0;break;default:{let l=I;throw new Error(`unexpected session kind: ${JSON.stringify(l)}`)}}return e}static async hasMultipleSessions(){try{return(await Nu.directoryFiles()).length>1}catch{return!1}}constructor(){this.currentSession=this.generateSession(),this.logger=new zr}setLogger(I){this.logger=I}getLogger(){return this.logger}isWaitingForSessionPicker(){return this.needsSessionPicker}async selectSession(I){this.needsSessionPicker=!1,await this.resumeSpecificSession(I)}setOnTimelineEntriesChangeCallback(I){this.onTimelineEntriesChangeCallback=I,this.notifyTimelineEntriesChange()}notifyTimelineEntriesChange(){this.onTimelineEntriesChangeCallback?.([...this.currentSession.timeline])}enableAutoSave(){this.autoSaveEnabled=!0}async forceSave(){await this.saveHistorySession(this.currentSession)}scheduleSave(){this.debounceSave&&clearTimeout(this.debounceSave);let I=this.currentSession;this.debounceSave=setTimeout(()=>{this.autoSaveEnabled&&this.saveHistorySession(I)},100)}getTimelineEntries(){return[...this.currentSession.timeline]}async loadHistorySession(I){try{let e=await Nu.load(I);if(!e)return;let l={...e,startTime:new Date(e.startTime)};this.currentSession=l;for(let c of this.currentSession.timeline)c.timestamp=new Date(c.timestamp);this.currentSession.chatMessages=this.completeOrphanedToolCalls(this.currentSession.chatMessages),this.enableAutoSave(),this.notifyTimelineEntriesChange()}catch(e){throw this.logger.error(`Error loading history session: ${e}`),e}}async saveHistorySession(I){let e=JBe(I);await Nu.write(I,e)}getCurrentSessionId(){return this.currentSession?.sessionId}getCurrentSessionStartTime(){return this.currentSession?.startTime}getSelectedModel(){return this.currentSession?.selectedModel}getCurrentModel(I){return I||this.currentSession?.selectedModel||this.usageMetrics.currentModel||""}setSelectedModel(I){this.currentSession.selectedModel=I,this.scheduleSave()}addTimelineEntry(I){try{this.currentSession.timeline.push({id:Oo(),timestamp:new Date,...I}),this.scheduleSave(),this.notifyTimelineEntriesChange()}catch(e){this.logger.error(`Error adding timeline entry: ${e}`)}}clearHistory(){this.currentSession.chatMessages=[],this.currentSession.timeline=[],this.scheduleSave(),this.notifyTimelineEntriesChange()}addChatMessage(I){this.currentSession.chatMessages.push(I),this.scheduleSave()}getChatContextMessages(){return this.currentSession.chatMessages.filter(I=>I.role!=="system")}getSystemContextMessages(){return this.currentSession.chatMessages.filter(I=>I.role==="system")}handleAbortedOperation(){this.currentSession.chatMessages=this.completeOrphanedToolCalls(this.currentSession.chatMessages),this.scheduleSave()}completeOrphanedToolCalls(I){if(I.length===0)return I;let e=[];for(let n=I.length-1;n>=0;n--){let a=I[n];if(a.role==="assistant"&&"tool_calls"in a&&a.tool_calls&&a.tool_calls.length>0)for(let s of a.tool_calls)e.push(s.id);else break}if(e.length===0)return I;let l="The execution of this tool, or a previous tool was interrupted.";this.logger.info(`Completing ${e.length} orphaned tool calls.`);let c=e.map(n=>({role:"tool",tool_call_id:n,content:l}));for(let n of e)this.updateToolCallTimelineEntryResult({callId:n,resultType:"rejected",log:l});return[...I,...c]}updateToolCallTimelineEntryResult(I){let e=this.currentSession.timeline.findLastIndex(n=>n.type==="tool_call_requested"&&n.callId===I.callId);if(e===-1){this.logger.error(`Pending tool call with ID ${I.callId} not found`);return}let l=this.currentSession.timeline[e];if(l.type==="tool_call_requested"&&l.name==="str_replace_editor"&&I.log){let s=l.arguments?.path;this.updateCodeChangeMetrics(I.log,s)}let c=this.currentSession.timeline[e];this.currentSession.timeline[e]={type:"tool_call_completed",id:c.id,timestamp:c.timestamp,callId:c.callId,name:c.name,toolTitle:c.toolTitle,intentionSummary:c.intentionSummary,arguments:c.arguments,result:{type:I.resultType,log:I.log,markdown:I.markdown},isAlwaysExpanded:c.isAlwaysExpanded,showNoContent:c.showNoContent},this.scheduleSave(),this.notifyTimelineEntriesChange()}updateToolCallTimelineEntryPartialOutput(I,e){let l=this.currentSession.timeline.findLastIndex(n=>n.type==="tool_call_requested"&&n.callId===I);if(l===-1){this.logger.error(`Pending tool call with ID ${I} not found`);return}let c=this.currentSession.timeline[l];this.currentSession.timeline[l]={type:"tool_call_requested",id:c.id,timestamp:c.timestamp,callId:c.callId,name:c.name,toolTitle:c.toolTitle,intentionSummary:c.intentionSummary,arguments:c.arguments,partialOutput:e,isAlwaysExpanded:c.isAlwaysExpanded,showNoContent:c.showNoContent},this.notifyTimelineEntriesChange()}async resumeSpecificSession(I){let e=await Nu.directoryFiles();if(e.length===0)throw new Error(`Session not found: ${I}`);let l=null,c=[];for(let n of e){let a=ySI(n);if(a&&a.sessionId===I){l=n;break}}if(!l){for(let n of e){let a=ySI(n);a&&a.sessionId.startsWith(I)&&c.push({file:n,parsed:a})}c.length>0&&(c.sort((n,a)=>a.parsed.startTime.getTime()-n.parsed.startTime.getTime()),l=c[0].file)}if(!l)throw new Error(`Session not found: ${I}`);try{await this.loadHistorySession(l)}catch(n){throw new Error(`Failed to load session ${I}: ${n}`)}}async resumeLastSession(){let I=await Nu.directoryFiles();if(I.length===0)throw new Error("No sessions found");let e=I[0];try{await this.loadHistorySession(e)}catch(l){throw new Error(`Failed to resume last session: ${l}`)}}generateSession(){return this.resetUsageMetrics(),{sessionId:this.generateSessionId(),startTime:new Date,chatMessages:[],timeline:[]}}generateSessionId(){return Oo()}getUsageMetrics(){return this.usageMetrics}resetUsageMetrics(){this.usageMetrics={totalPremiumRequests:0,totalApiDurationMs:0,sessionStartTime:Date.now(),codeChanges:{linesAdded:0,linesRemoved:0,filesModified:new Set},modelMetrics:new Map}}getModelRequestMultiplier(I){return{"claude-sonnet-4":1,"gpt-5":1,"claude-sonnet-4.5":1}[I]??1}trackUserMessage(I){let e=I||"",c=1*this.getModelRequestMultiplier(e);this.usageMetrics.totalPremiumRequests+=c,this.usageMetrics.modelMetrics.has(e)||this.usageMetrics.modelMetrics.set(e,{requests:{count:0,cost:0},usage:{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0}});let n=this.usageMetrics.modelMetrics.get(e);n.requests.count+=1,n.requests.cost+=c,this.usageMetrics.currentModel=e}updateModelUsageMetrics(I,e,l){let c=I||"";if(this.usageMetrics.totalApiDurationMs+=e,l){this.usageMetrics.modelMetrics.has(c)||this.usageMetrics.modelMetrics.set(c,{requests:{count:0,cost:0},usage:{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0}});let n=this.usageMetrics.modelMetrics.get(c);if(n.usage.inputTokens+=l.prompt_tokens||0,n.usage.outputTokens+=l.completion_tokens||0,l.prompt_tokens_details?.cached_tokens){n.usage.cacheReadTokens+=l.prompt_tokens_details.cached_tokens;let a=(l.prompt_tokens||0)-l.prompt_tokens_details.cached_tokens;n.usage.cacheWriteTokens+=Math.max(0,a)}}}updateCodeChangeMetrics(I,e){if(!I||!I.includes("diff --git"))return;let l=I.split(`
1131
1131
  `),c=0,n=0;for(let a of l)a.startsWith("+")&&!a.startsWith("+++")?c++:a.startsWith("-")&&!a.startsWith("---")&&n++;this.usageMetrics.codeChanges.linesAdded+=c,this.usageMetrics.codeChanges.linesRemoved+=n,e&&this.usageMetrics.codeChanges.filesModified.add(e)}formatTokenCount(I){return I===0?"0":I<1e3?I.toString():I<1e6?`${(I/1e3).toFixed(1)}k`:`${(I/1e6).toFixed(1)}m`}formatDuration(I){let e=Math.floor(I/1e3),l=Math.floor(e/60),c=Math.floor(l/60);if(c>0){let n=l%60,a=I%6e4/1e3;return`${c}h ${n}m ${a.toFixed(1)}s`}else if(l>0){let n=I%6e4/1e3;return`${l}m ${n.toFixed(1)}s`}else return`${(I/1e3).toFixed(1)}s`}getFormattedUsageOutput(){let I=this.usageMetrics,e=this.formatDuration(Date.now()-I.sessionStartTime),l=this.formatDuration(I.totalApiDurationMs),c=Math.round(I.totalPremiumRequests),a=[`Total usage est: ${c} ${c===1?"Premium request":"Premium requests"}`,`Total duration (API): ${l}`,`Total duration (wall): ${e}`,`Total code changes: ${I.codeChanges.linesAdded} lines added, ${I.codeChanges.linesRemoved} lines removed`];if(I.modelMetrics.size>0){a.push("Usage by model:");for(let[s,r]of I.modelMetrics){let{requests:o,usage:d}=r,b=this.formatTokenCount(d.inputTokens),h=this.formatTokenCount(d.outputTokens),Z=this.formatTokenCount(d.cacheReadTokens),p=this.formatTokenCount(d.cacheWriteTokens),W=Math.round(o.cost),N=W===1?"Premium request":"Premium requests",F=(s||"(unknown)").padEnd(20);a.push(` ${F} ${b} input, ${h} output, ${Z} cache read, ${p} cache write (Est. ${W} ${N})`)}}return a.join(`
1132
1132
  `)}};var Gf=class extends lE{constructor(e,l){super({id:e.getCurrentSessionId(),startTime:e.getCurrentSessionStartTime(),selectedModel:e.getSelectedModel()},l);this.cliSessionManager=e}async getChatMessages(){return this.cliSessionManager.getChatContextMessages()}async addChatMessage(e){this.cliSessionManager.addChatMessage(e)}async onAbort(){this.cliSessionManager.handleAbortedOperation()}async save(){await this.cliSessionManager.forceSave()}},FSI=class{logger;constructor(I={}){this.logger=I.logger||new zr}async createSession(){let I=await GE.create({kind:"new"});return I.setLogger(this.logger),new Gf(I,this.logger)}async getLastSession(){let I=await GE.create({kind:"resume-last"});return I.setLogger(this.logger),new Gf(I,this.logger)}async getSession(I){let e=await GE.create({kind:"resume",sessionId:I});return e.setLogger(this.logger),new Gf(e,this.logger)}async listSessions(){let I=await Nu.directoryFiles(),e=[],l=c=>{let n=/^session_(.+)_(\d+)\.json$/,a=c.match(n);if(!a)return null;let[,s,r]=a;return{sessionId:s,startTime:new Date(parseInt(r,10))}};for(let c of I){let n=l(c);if(n){let a=await Nu.load(c);e.push({id:n.sessionId,startTime:n.startTime,selectedModel:a?.selectedModel})}}return e.sort((c,n)=>n.startTime.getTime()-c.startTime.getTime())}async saveSession(I){await I.save()}async deleteSession(I){throw new Error("Deleting sessions is not supported in this adapter.")}};G();async function*RUl(t){let{prompt:I,...e}=t;yield*new dP(e).query(I)}G();export{dP as Agent,Bh as BaseLogger,lE as BaseSession,zbI as CompoundLogger,OV as ConsoleLogger,Gf as CopilotCLISession,FSI as CopilotCLISessionManager,UbI as FileLogger,lf as InMemorySession,wUI as InMemorySessionManager,zr as NoopLogger,TY as executeHooks,mE as isDebugEnvironment,RUl as query};
1133
1133
  /*! Bundled license information: