@github/copilot 0.0.355-8 → 0.0.355-9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +1 -1
- package/package.json +2 -2
package/index.js
CHANGED
|
@@ -1914,7 +1914,7 @@ https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety
|
|
|
1914
1914
|
${b}`)}try{r=await m.getSecret("capi-token")}catch(b){l.debug(`Failed to get Copilot GitHub OAuth token from secret provider:
|
|
1915
1915
|
${b}`)}I=!!(a||r)}let s,o=NZt(e),c=Dte(e),d=e.api?.copilot?.sessionId??tC(e);if(l.debug(`Using Copilot API at ${o} with integration ID ${c}`),r&&(l.debug("Using GitHub OAuth token for Copilot API"),s=QT.createWithOAuthToken(l,o,c,r,d,n?.requestHeaders)),a){l.debug("Using Copilot HMAC key for Copilot API");let m=process.env.GITHUB_USER_ID;m?l.debug(`Using user ID ${m} for Copilot HMAC key`):l.debug("No user ID provided for Copilot HMAC key"),s=QT.createWithHmac(l,o,c,a,d,m,n?.requestHeaders)}if(s===void 0)throw new Error("No GitHub OAuth token or Copilot HMAC key provided");return s}},T8=class t extends Eu{request_id;constructor(e){super(e.status,e.error,e.message,e.headers),this.name="CAPIError",this.cause=e.cause,this.ghRequestId=e.headers?.get("x-github-request-id")||this.requestID,this.request_id=this.requestID}ghRequestId;static fromAPIError(e){if(!(!e||!(e instanceof Eu)))return new t(e)}};var eKe={type:"ephemeral"},pL=class t{constructor(e,l,n,r){this.settings=l;this.logger=n;this.clientOptions=t.initDefaultOptions(r),n.info(" "),n.debug(`Using model: ${this.model}`),this.clientPromise=e.createClient(l,n,r),this.modelPromise=this.clientPromise.then(async()=>{let a=await this.getModel();return n.debug(`Got model info: ${JSON.stringify(a,null,2)}`),a})}clientOptions;clientPromise;modelPromise;get model(){return this.clientOptions.model}static initDefaultOptions(e){return{model:e?.model||y0e["sweagent-capi"],toolTokenBudgetProportion:e?.toolTokenBudgetProportion??.25,retryPolicy:{maxRetries:e?.retryPolicy?.maxRetries??5,errorCodesToRetry:e?.retryPolicy?.errorCodesToRetry??[],rateLimitRetryPolicy:{defaultRetryAfterSeconds:e?.retryPolicy?.rateLimitRetryPolicy?.defaultRetryAfterSeconds??5,initialRetryBackoffExtraSeconds:e?.retryPolicy?.rateLimitRetryPolicy?.initialRetryBackoffExtraSeconds??1,retryBackoffExtraGrowth:e?.retryPolicy?.rateLimitRetryPolicy?.retryBackoffExtraGrowth??2,maxRetryAfterSeconds:e?.retryPolicy?.rateLimitRetryPolicy?.maxRetryAfterSeconds??180}},thinkingMode:e?.thinkingMode??!1,requestHeaders:e?.requestHeaders??{}}}getCompletionOptions(e,l){let n={snippy:{enabled:!1}};return{temperature:0,top_p:.95,frequency_penalty:0,presence_penalty:0,tool_choice:l?.toolChoice,...n}}makeRequest(e,l,n,r,a,I,s){return e.chat.completions.create({model:l,messages:[...n],...r,tools:a},{maxRetries:I,headers:s?.requestHeaders,signal:s?.abortSignal}).withResponse()}makeRequestStreaming(e,l,n,r,a,I,s){return e.chat.completions.create({model:l,messages:[...n],...r,tools:a,stream:!0,stream_options:{include_usage:!0}},{maxRetries:I,headers:s?.requestHeaders,signal:s?.abortSignal}).withResponse()}async*getCompletionWithTools(e,l,n,r){let a=this.model,I=await this.clientPromise,s=await this.modelPromise,o=N5(n),c=[{role:"system",content:e,copilot_cache_control:eKe},...l.map(Z=>Mse(Z))],d=n.map((Z,W)=>({type:"function",function:{name:Z.name,description:Z.description,parameters:Z.input_schema},copilot_cache_control:W===n.length-1?eKe:void 0}));this.logger.startGroup("Completion request configuration: ",8),this.logger.debug("Client options: "),this.logger.debug(JSON.stringify(this.clientOptions,null,2)),this.logger.debug("Request options: "),this.logger.debug(JSON.stringify(r??{},null,2)),this.logger.debug("Tools: "),this.logger.debug(JSON.stringify(d,null,2)),this.logger.endGroup(8);let m=this.getCompletionOptions(n,r),b=r?.initialTurnCount!==void 0?r.initialTurnCount+1:0,p=!1,A=!1;for(;!p&&!A;){let Z=Date.now();yield{kind:"turn_started",model:a,modelInfo:s,turn:b,timestampMs:Z};let W=0,R=0,V=0,f=[429,503,500,400],X=this.clientOptions.retryPolicy.maxRetries,S=this.clientOptions.retryPolicy.rateLimitRetryPolicy.initialRetryBackoffExtraSeconds,O=0,T=this.clientOptions.retryPolicy.rateLimitRetryPolicy.maxRetryAfterSeconds,j,x;try{let z=[],se;do{V>0&&(yield{kind:"turn_retry",model:a,modelInfo:s,turn:b,timestampMs:Date.now()});try{let Ge={};for(let U of r?.processors?.preRequest||[]){let re=U.preRequest({turn:b,retry:V,messages:c,toolDefinitions:d,modelInfo:s,additionalRequestHeaders:Ge,getCompletionWithToolsOptions:r});for await(let ae of re)yield ae}if(this.logger.startGroup("Sending request to the AI model",8),to(this.settings,"copilot_swe_agent_request_logging")){let U=JSON.stringify(c,null,2),re=JSON.stringify(m,null,2);this.logger.debug(`Request messages: ${U}`),this.logger.debug(`Request options: ${re}`)}z=c.map((U,re)=>re===c.length-1?{...U,copilot_cache_control:eKe}:U),W=Date.now(),I.setAdditionalHeaders(Ge);let Ne;if(r?.stream){let U=await this.makeRequestStreaming(I,a,z,m,d,X,r);Ne=await IRn(U,I,r)}else Ne=await this.makeRequest(I,a,z,m,d,X,r);R=Date.now()-W,j=Ne.data,se={model:a,api_id:j.id,request_id:Ne.response.headers.get("x-github-request-id")||void 0,initiator:r?.requestHeaders?.["X-Initiator"]||Ge["X-Initiator"]};let K={};Ne.response.headers.forEach((U,re)=>{if(re.toLowerCase().startsWith(u6e)){let ae=$Tt(U);ae&&(K[re.replace(u6e,"")]=ae)}}),yield{kind:"model_call_success",turn:b,callId:r?.callId,modelCallDurationMs:R,modelCall:se,responseChunk:fvt(j),responseUsage:j.usage,requestMessages:JSON.stringify(z),quotaSnapshots:K},this.logger.debug(`response (Request-ID ${Ne.request_id}):`),this.logger.debug("data:"),this.logger.debug(JSON.stringify(Ne.data,null,2))}catch(Ge){R=Date.now()-W;let Ne=T8.fromAPIError(Ge),K=Ne?.error;if(Ne){yield{kind:"model_call_failure",turn:b,callId:r?.callId,modelCallDurationMs:R,requestMessages:JSON.stringify(z),modelCall:{model:a,status:Ne.status,error:JSON.stringify(Ne?.error||Ne?.message||"unknown error"),api_id:Ne.requestID||void 0,request_id:Ne.headers?.get("x-github-request-id")||""}},x=Ne;let re=Ne.ghRequestId||Ne.headers?.get("x-github-request-id")||Ne.requestID;this.logger.error(`error (Request-ID ${re})`),this.logger.error(JSON.stringify(Ne,Object.getOwnPropertyNames(Ne),2)),this.logger.debug(`Failed to get response from the AI model: ${Ne}`),K&&this.logger.debug(`Inner error: ${JSON.stringify(K,null,2)}`);let ae;for(let Re of r?.processors?.onRequestError||[])ae=await Re.onRequestError({turn:b,retry:V,maxRetries:X,error:K,modelInfo:s,getCompletionWithToolsOptions:r})||ae;let ye=Ne.status,me=ye?this.clientOptions.retryPolicy.errorCodesToRetry.some(Re=>Array.isArray(Re)?ye>=Re[0]&&(Re[1]===void 0||ye<=Re[1]):ye===Re):!1,fe;if(ae)fe=ae.retryAfter;else if(Ne.status!==402){if(Ne.status===413){this.logger.debug("Request is too large, trying to remove images from the request");let Re=0;for(let he=c.length-1;he>=0;he--)_4(c[he])&&(c.splice(he,1),Re++,yield{kind:"images_removed",turn:b,imagesRemoved:1,largeImagesRemoved:1});Re>0?(this.logger.info(`Images have been removed from the request due to size constraints. Please resize images to be smaller than ${YE(s.capabilities.limits.vision?.max_prompt_image_size||0)}.`),this.logger.debug(`Removed ${Re} image messages from the request`),fe=1):this.logger.debug("No image messages found in the request - unsure why the request is too large - will fail")}else if((typeof Ne.status=="number"&&f.includes(Ne.status)||me)&&(fe=parseInt(Ne.headers?.get("retry-after")||`${this.clientOptions.retryPolicy.rateLimitRetryPolicy.defaultRetryAfterSeconds}`,10)+S,S*=this.clientOptions.retryPolicy.rateLimitRetryPolicy.retryBackoffExtraGrowth,V==X-1))for(let Re=c.length-1;Re>=0;Re--)_4(c[Re])&&(this.logger.debug(`Removing image message at index ${Re} to avoid failure`),c.splice(Re,1),yield{kind:"images_removed",turn:b,imagesRemoved:1})}if(fe!==void 0&&fe<=T){let Re=.8+Math.random()*.4,he=fe*Re;this.logger.debug(`Retrying after ${he} seconds...`),await new Promise(Ie=>setTimeout(Ie,he*1e3)),O+=he,this.logger.debug(`Retrying after ${fe} seconds... Will try again now!`);continue}else fe?this.logger.error(`Retry after ${fe} seconds is too long. Giving up.`):this.logger.error("Retry after is not set. Giving up.")}let U=Ne||Ge;for(let re of r?.processors?.onRequestError||[])await re.preErrorThrow(Ge);throw this.logger.error("error"),this.logger.error(JSON.stringify(U,null,2)),U}finally{I.setAdditionalHeaders({}),this.logger.endGroup(8)}}while(!j&&V++<X);if(!j){this.logger.debug("Recent messages prior to failure:");for(let Ne=Math.max(0,c.length-6);Ne<c.length;Ne++)this.logger.debug(`${Ne}: ${JSON.stringify(c[Ne],null,2)}`);let Ge=new Error(`Failed to get response from the AI model; retried ${V-1} times (total retry wait time: ${O} seconds)`,{cause:x});throw this.isRateLimitExceededError(Ge)&&(this.logger.info(`Rate limit exceeded after ${V-1} retries, will fail job but skip Sentry reporting`),Ge.skipReport=!0),Ge}for(let Ge of j.choices.map(Ne=>Ne.message))aRn(Ge.tool_calls||[]),c.push(Ge),yield{kind:"message",turn:b,callId:r?.callId,modelCall:se,message:Mse(Z6(Ge))};if(this.isToolCallResponse(j)){let Ne=(s.capabilities.limits.max_prompt_tokens||s.capabilities.limits.max_context_window_tokens)*this.clientOptions.toolTokenBudgetProportion,K=PRt(a,Ne,this,this.settings),re=j.choices.filter(fe=>fe.message.tool_calls!==void 0).flatMap(fe=>fe.message.tool_calls||[]).filter(kA),ae=new Map;for(let fe of r?.processors?.preToolsExecution||[]){let Re=await fe.preToolsExecution({turn:b,toolCalls:re,modelInfo:s});if(Re)for(let[he,Ie]of Re)ae.set(he,Ie)}let ye=re.filter(fe=>!ae.has(fe.id)),me=this.mergeToolResults(ae,re,ye,o,K,r?.executeToolsInParallel);for await(let fe of me){fe.toolResult.resultType==="rejected"&&(A=!0);let Re={role:"tool",tool_call_id:fe.originalCall.id,content:fe.toolResult.textResultForLlm};c.push(Re),yield{kind:"message",turn:b,callId:r?.callId,modelCall:se,message:Mse(Re)},yield{kind:"tool_execution",turn:b,callId:r?.callId,toolCallId:fe.originalCall.id,toolResult:fe.toolResult,durationMs:fe.durationMs};for(let he of r?.processors?.postToolExecution||[])await he.postToolExecution({toolCall:fe.originalCall,toolResult:fe.toolResult,turn:b,modelInfo:s})}}else for(let Ge of j.choices.map(Ne=>Ne.message))yield{kind:"response",turn:b,callId:r?.callId,modelCall:{model:a,api_id:j.id},response:Mse(Z6(Ge))},p=!0}catch(z){let se;throw z instanceof Error&&z.cause&&z.cause instanceof T8?se=`${z} (Cause: ${z.cause})`:se=`${z}`,yield{kind:"turn_failed",model:a,modelInfo:s,turn:b,error:se,timestampMs:Date.now()},z}finally{let z=Date.now();yield{kind:"turn_ended",model:a,modelInfo:s,turn:b,timestampMs:z},b++}}}async*mergeToolResults(e,l,n,r,a,I=!1){for(let[s,o]of e){let c=l.find(d=>d.id===s);c&&(yield{durationMs:0,originalCall:c,toolResult:o})}n.length>0&&(yield*this.callTools(n,r,a,I))}async*callTools(e,l,n,r=!1){if(e.length===0)throw new Error("Tool call is missing");this.logger.debug(`Tool calls count: ${e.length}`);let a=e.some(s=>{let o=l[s.function.name];return tL(o)}),I=r&&!a;if(a&&r&&this.logger.debug("Custom agent detected in tool calls, forcing sequential execution"),I)this.logger.debug("Running tool calls in parallel"),yield*TRt(e.map(s=>()=>this.callTool(s,l,n)));else{this.logger.debug("Running tool calls sequentially");for(let s of e)yield await this.callTool(s,l,n)}}async callTool(e,l,n){let r=0,a=e?.function.name;if(!a)throw new Error("Tool name is missing");let I=e?.function.arguments;if(I==null)throw new Error("Tool call arguments are missing");let s=e?.id;if(!s)throw new Error("Tool call id is missing");let o,c=l[a];try{let d=lL(I);if(!c||!c.callback)o={textResultForLlm:`Tool '${a}' does not exist. Available tools that can be called are ${Object.keys(l).join(", ")}.`,resultType:"failure",error:`Tool '${a}' does not exist.`,sessionLog:`<error>Tool '${a}' does not exist.</error>`,toolTelemetry:{}};else{let m=c.callback,b=Date.now(),p={...n,toolCallId:s,toolOptions:this.settings.service?.tools?.[a]},A=await m({...d},p);r=Date.now()-b,o=typeof A=="string"?{textResultForLlm:A,resultType:"success",toolTelemetry:{}}:A}}catch(d){d instanceof SyntaxError?(o={textResultForLlm:`The arguments for the tool call '${a}' were not valid JSON. The arguments have been cleared. Arguments: ${I}. JSON parse error: ${d.message}`,resultType:"failure",error:`${d.message}`,sessionLog:`<error>Failed to execute \`${a}\` tool with arguments: ${I} due to syntax error: ${d.message}</error>`,toolTelemetry:{properties:{wasSyntaxError:"true"}}},e.function.arguments="{}"):o={textResultForLlm:`Failed to execute \`${a}\` tool with arguments: ${I} due to error: ${d}`,resultType:"failure",error:d instanceof Error?d.message:`${d}`,sessionLog:`<error>Failed to execute \`${a}\` tool with arguments: ${I}</error>`,toolTelemetry:{}}}return{durationMs:r,originalCall:e,toolResult:o}}isToolCallResponse(e){return e.choices.find(l=>l.message.tool_calls!==void 0)!==void 0}isRateLimitExceededError(e){if(e instanceof Error){if(e.message?.includes("exceeded maximum number of retries")&&e.message?.includes("rate-limited requests"))return!0;if(e.message?.includes("Failed to get response from the AI model")&&e.cause instanceof T8)return e.cause.status===429}return!1}async getModel(){let e=this.clientOptions.model,l={id:e,name:e,capabilities:{supports:{vision:!1},limits:{max_prompt_tokens:9e4,max_context_window_tokens:128e3,vision:{max_prompt_image_size:3145728,max_prompt_images:1,supported_media_types:["image/jpeg","image/png","image/webp"]}}}};return(await(await this.clientPromise).listModels()).filter(I=>I.id===e).at(0)||l}};function aRn(t){for(let e of t)e.function.name=e.function.name.replace(/[^a-zA-Z0-9_-]+/g,"_")}async function IRn(t,e,l){let n=sRn(t.data,e).toReadableStream(),r=Iv.fromReadableStream(n),a=l?.processors?.onStreamingChunk;if(a?.length)for await(let I of r){l?.abortSignal?.throwIfAborted();let s={chunk:I};for(let o of a)o.onStreamingChunk(s)}return{data:await r.finalChatCompletion(),response:t.response,request_id:t.request_id}}function sRn(t,e){let l=new Map;return new u0(async function*(){for await(let n of t)n.choices?.forEach(r=>{if(r.delta.role??="assistant",!!r.delta?.tool_calls?.length){r.finish_reason??="tool_calls";let I=l.get(r.index);I||(I={nextSequenceNumber:0,mappings:new Map},l.set(r.index,I)),r.delta.tool_calls?.forEach(s=>{let o=I.mappings.get(s.index);if(o!==void 0)s.id&&o.callId!==s.id&&(o.sequenceNumber=I.nextSequenceNumber++,o.callId=s.id),s.index=o.sequenceNumber;else{let c={callId:s.id,sequenceNumber:I.nextSequenceNumber++};I.mappings.set(s.index,c),s.index=c.sequenceNumber}})}}),yield n},t.controller,e)}var D1e=class extends pL{constructor(e,l,n){let r=new B8;super(r,e,l,n)}};var z1e=class t{constructor(e,l,n,r){this.settings=l;this.logger=n;this.clientOptions=t.initDefaultOptions(r),this.logger.info(`Using responses with model: ${this.model}`),this.clientPromise=e.createClient(l,n,this.clientOptions)}clientOptions;clientPromise;get model(){return this.clientOptions.model}static initDefaultOptions(e){return{model:e?.model||"o4-mini",toolTokenBudgetProportion:e?.toolTokenBudgetProportion??.25,retryPolicy:{maxRetries:e?.retryPolicy?.maxRetries??5,errorCodesToRetry:e?.retryPolicy?.errorCodesToRetry??[],rateLimitRetryPolicy:{defaultRetryAfterSeconds:e?.retryPolicy?.rateLimitRetryPolicy?.defaultRetryAfterSeconds??5,initialRetryBackoffExtraSeconds:e?.retryPolicy?.rateLimitRetryPolicy?.initialRetryBackoffExtraSeconds??1,retryBackoffExtraGrowth:e?.retryPolicy?.rateLimitRetryPolicy?.retryBackoffExtraGrowth??2,maxRetryAfterSeconds:e?.retryPolicy?.rateLimitRetryPolicy?.maxRetryAfterSeconds??60}},thinkingMode:e?.thinkingMode??!0,requestHeaders:e?.requestHeaders??{}}}makeRequest(e,l,n,r,a,I,s,o){return e.responses.create({model:l,previous_response_id:I,instructions:n,input:r,parallel_tool_calls:a.length>0?!0:void 0,tools:a,reasoning:{summary:"auto",effort:"medium"},store:!1,include:["reasoning.encrypted_content"]},{maxRetries:s||this.clientOptions.retryPolicy.maxRetries,headers:o?.requestHeaders,signal:o?.abortSignal}).withResponse()}async*getCompletionWithTools(e,l,n,r){let a=await this.clientPromise,I=N5(n),s=n.map(W=>({name:W.name,description:W.description,parameters:W.input_schema,strict:!1,type:"function"})),o=0,c=this.clientOptions.retryPolicy.maxRetries,d=this.clientOptions.retryPolicy.rateLimitRetryPolicy.initialRetryBackoffExtraSeconds,m=0,b=this.clientOptions.retryPolicy.rateLimitRetryPolicy.maxRetryAfterSeconds,p=l.flatMap(lKe),A,Z=!1;for(;!Z;){let W;do{W=void 0;try{let R=await this.makeRequest(a,this.model,e,p,s,void 0,c,r);A=R.data,p.push(...A.output),this.logger.debug(`response (Request-ID ${R.request_id}):`),this.logger.debug("data:"),this.logger.debug(JSON.stringify(R.data,null,2))}catch(R){let V=R,f=V.error;if(V){W=V,this.logger.error(`error (Request-ID ${V.requestID})`),this.logger.error(JSON.stringify(V,null,2)),this.logger.debug(`Failed to get response from the AI model: ${V}`),f&&this.logger.debug(`Inner error: ${JSON.stringify(f,null,2)}`);let X=V.status,S=X?this.clientOptions.retryPolicy.errorCodesToRetry.some(T=>Array.isArray(T)?X>=T[0]&&(T[1]===void 0||X<=T[1]):X===T):!1,O;if((V.status===429||S)&&(O=parseInt(V.headers?.get("retry-after")||`${this.clientOptions.retryPolicy.rateLimitRetryPolicy.defaultRetryAfterSeconds}`,10)+d,d*=this.clientOptions.retryPolicy.rateLimitRetryPolicy.retryBackoffExtraGrowth),O!==void 0&&O<=b){this.logger.debug(`Retrying after ${O} seconds...`),await new Promise(T=>setTimeout(T,O*1e3)),m+=O,this.logger.debug(`Retrying after ${O} seconds... Will try again now!`);continue}else O?this.logger.error(`Retry after ${O} seconds is too long. Giving up.`):this.logger.error("Retry after is not set. Giving up.")}throw this.logger.error("error"),this.logger.error(JSON.stringify(R,null,2)),R}finally{this.logger.endGroup(8)}}while(W&&o++<c);if(!A||W){this.logger.debug("Recent messages prior to failure:");for(let R=Math.max(0,p.length-6);R<p.length;R++)this.logger.debug(`${R}: ${JSON.stringify(p[R],null,2)}`);throw new Error(`Failed to get response from the AI model; retried ${o-1} times (total retry wait time: ${m} seconds)`,{cause:W})}for(let R of A.output)yield{kind:"message",message:tKe(R)};if(this.requiresToolOutput(A)){let V=(await this.runTool(A,I)).map(f=>({type:"function_call_output",call_id:f.toolCallId,output:f.textResultForLlm}));p.push(...V);for(let f of V)yield{kind:"message",message:tKe(f)}}else yield{kind:"response",response:{content:A.output_text,refusal:null,role:"assistant"}},Z=!0}}async runTool(e,l,n){let r=e.output.filter(I=>I.type==="function_call");if(!r||r.length===0)throw new Error("Tool calls in response are missing");let a=[];for(let I of r){let s=I.name;if(!s)throw new Error("Tool name is missing");let o=I.arguments;if(!o)throw new Error("Tool call arguments are missing");let c=I.call_id;if(!c)throw new Error("Tool call id is missing");let d,m=l[s];try{let b=lL(o);if(!m||!m.callback)d={textResultForLlm:`Tool '${s}' does not exist. Available tools that can be called are ${Object.keys(l).join(", ")}.`,resultType:"failure",error:`Tool '${s}' does not exist.`,sessionLog:`<error>Tool '${s}' does not exist.</error>`,toolTelemetry:{}};else{let p=m.callback,A={...n,toolCallId:c,toolOptions:this.settings.service?.tools?.[s],settings:this.settings},Z=await p({...b},A);d=typeof Z=="string"?{textResultForLlm:Z,resultType:"success",toolTelemetry:{}}:Z}}catch(b){d={textResultForLlm:`Failed to execute \`${s}\` tool with arguments: ${o} due to error: ${b}`,resultType:"failure",error:b instanceof Error?b.message:`${b}`,sessionLog:`<error>Failed to execute \`${s}\` tool with arguments: ${o}</error>`,toolTelemetry:{properties:{wasSyntaxError:b instanceof SyntaxError?"true":"false"}}}}a.push({toolCallId:c,textResultForLlm:d.textResultForLlm,sessionLog:d.resultType=="success"?d.sessionLog:d.error?`<error>${d.error}</error>`:void 0})}return a}requiresToolOutput(e){return e.output.filter(l=>l.type==="function_call").length>0}};function lKe(t){if(t.role==="function")throw new Error("Function role is not supported");let e=[];if(t.reasoning_opaque&&e.push({id:t.reasoning_opaque,type:"reasoning",summary:t.reasoning_text?[{text:t.reasoning_text,type:"summary_text"}]:[],content:t.content?typeof t.content=="string"?[{type:"reasoning_text",text:t.content}]:t.content.filter(l=>l.type==="text").map(l=>({type:"reasoning_text",text:l.text})):[],encrypted_content:t.encrypted_content}),t.role==="assistant"&&t.tool_calls&&t.tool_calls.length>0&&kA(t.tool_calls[0])){let l=t.tool_calls[0];return[...e,{type:"function_call",id:t.id,name:l.function.name,arguments:l.function.arguments,call_id:l.id}]}if(t.role==="tool")return[...e,{type:"function_call_output",id:`fc_${t.tool_call_id}`,call_id:t.tool_call_id,output:typeof t.content=="string"?t.content:t.content.map(l=>l.text).join(" ")??""}];if(!t.content)return e;if(t.role==="assistant"){let l=t.id||crypto.randomUUID();return l.startsWith("msg_")||(l=`msg_${l}`),[...e,{type:"message",id:l,role:t.role,content:[{annotations:[],type:"output_text",text:typeof t.content=="string"?t.content:t.content?.map(n=>n.type==="text"?n.text:"").join(" ")??""}],status:"completed"}]}return[...e,{role:t.role,content:typeof t.content=="string"?[{type:"input_text",text:t.content}]:t.content.map(l=>{if(l.type==="text")return{type:"input_text",text:l.text};if(l.type==="image_url")return{type:"input_image",detail:l.image_url.detail||"auto",image_url:l.image_url.url}}).filter(l=>l!==void 0),type:"message"}]}function tKe(t){if(t.type==="reasoning")return{role:"assistant",reasoning_opaque:t.id,reasoning_text:t.summary?.map(e=>e.text).join(" "),content:t.content?.map(e=>({type:"text",text:e.text})),encrypted_content:t.encrypted_content};if(t.type==="function_call")return{role:"assistant",id:t.id,tool_calls:[{id:t.call_id,type:"function",function:{name:t.name,arguments:t.arguments}}],content:""};if(t.type==="function_call_output")return{role:"tool",content:t.output,tool_call_id:t.call_id};if(t.type==="message")return{role:t.role,content:typeof t.content=="string"?t.content:t.content?.map(e=>e.type==="input_text"||e.type==="output_text"?e.text:"").join(" ")??""};throw new Error(`Unknown item type: ${t.type}`)}function oRn(t){let e;t.incomplete_details?.reason==="content_filter"?e="content_filter":t.incomplete_details?.reason==="max_output_tokens"?e="length":e=t.output.some(r=>r.type==="function_call")?"tool_calls":"stop";let n=t.output.filter(r=>r.type==="message"||r.type==="reasoning"||r.type==="function_call").map(r=>tKe(r)).filter(r=>r.role==="assistant").map((r,a)=>({message:{content:Array.isArray(r.content)?r.content.map(I=>typeof I=="string"?I:"text"in I?I.text:"").join(" "):r.content||null,refusal:r.refusal||null,role:r.role||null,tool_calls:r.tool_calls?.filter(I=>I.type==="function"),reasoning_opaque:r.reasoning_opaque,reasoning_text:r.reasoning_text,encrypted_content:r.encrypted_content},index:a,finish_reason:e,logprobs:null}));return{id:t.id,choices:n,created:t.created_at,model:t.model,object:"chat.completion",usage:{completion_tokens:t.usage?.output_tokens||0,prompt_tokens:t.usage?.input_tokens||0,total_tokens:t.usage?.total_tokens||0}}}function qOt(t){return{request_id:t.request_id,data:oRn(t.data),response:t.response}}var P1e=class extends pL{makeResponsesRequest(e,l,n,r,a,I,s){let o=n.find(p=>p.role==="system")?.content||"",c=Array.isArray(o)?o.join(`
|
|
1916
1916
|
`):o,m=n.filter(p=>p.role!=="system").flatMap(lKe),b=a.filter(p=>p.type==="function").map(p=>({name:p.function.name,description:p.function.description,parameters:p.function.parameters||null,strict:!1,type:"function"}));return this.logger.debug(`Making responses request with input: ${JSON.stringify(m,null,2)}`),e.responses.create({model:l,previous_response_id:void 0,instructions:c,input:m,parallel_tool_calls:a.length>0?!0:void 0,tools:b,reasoning:{summary:"auto",effort:"medium"},store:!1,include:["reasoning.encrypted_content"]},{maxRetries:I||this.clientOptions.retryPolicy.maxRetries,headers:s?.requestHeaders,signal:s?.abortSignal}).withResponse()}makeRequest(e,l,n,r,a,I,s){return this.makeResponsesRequest(e,l,n,r,a,I,s).then(o=>(this.logger.debug(`Responses data: ${JSON.stringify(o.data,null,2)}`),qOt(o)))}async*getCompletionWithTools(e,l,n,r){yield*super.getCompletionWithTools(e,l,n,{...r,stream:!1})}};var j1e=class extends P1e{constructor(e,l,n){let r=new B8;super(r,e,l,n)}};var Mde=class{constructor(e,l,n){this.settings=e;this.logger=l;this.clientOptions=n;this.chatClient=new D1e(e,l,n)}chatClient;get model(){return this.chatClient.model}async*getCompletionWithTools(e,l,n,r){let a=await this.chatClient.modelPromise;E0e(this.settings,this.clientOptions)&&a&&a.supported_endpoints?.includes("/responses")?yield*new j1e(this.settings,this.logger,{model:this.chatClient.model,...this.clientOptions}).getCompletionWithTools(e,l,n,r):yield*this.chatClient.getCompletionWithTools(e,l,n,r)}};var K1e=class extends pL{constructor(e,l,n,r){super(e,l,n,r)}getCompletionOptions(e,l){return{...this.model.startsWith("gpt-4")?{temperature:0,top_p:.95,frequency_penalty:0,presence_penalty:0,parallel_tool_calls:e?!1:void 0}:{},tool_choice:l?.toolChoice}}async*getCompletionWithTools(e,l,n,r){let a=await super.getCompletionWithTools(e,l,n,r);for await(let I of a)I.kind==="message"?yield{...I,message:Z6({...I.message,reasoning_text:I.message?.cot_summary})}:yield I}};var q1e=class extends z1e{constructor(e,l,n,r){super(e,l,n,r)}};var nKe=class extends Jde{constructor(e){super(e)}setInitiatorHeader(e){}setAdditionalHeaders(e){}listModels(){return Promise.resolve([])}},$1e=class{async createClient(e,l,n){l.startGroup("configured settings:",8),l.debug(JSON.stringify(e,null,2)),l.endGroup(8);let r=e.api?.openai?.apiKey,a=e.api?.openai?.azureKeyVaultUri,I=e.api?.openai?.azureSecretName;if(!r&&a){l.debug("No API_KEY provided, trying secret provider");let d=$6e(a,l);try{r=await d.getSecret(I||"azure-openai-api-key")}catch(m){l.debug(`Failed to get API Key from secret provider:
|
|
1917
|
-
${m}`)}}let s=ZZt(e);l.debug(`Using Azure Open API at ${s}`);let c={baseURL:`${new URL(s).origin}/openai`,apiVersion:e.api?.openai?.azure?.apiVersion||"2024-10-21",deployment:n?.model,defaultHeaders:n?.requestHeaders};if(r)c={...c,apiKey:r},l.debug("Using Azure OpenAI API Key");else{let d=new hw,b=rPe(d,"https://cognitiveservices.azure.com/.default");c={...c,azureADTokenProvider:b},l.debug("Using Azure Managed Identity")}return new nKe(c)}};var rKe=class extends ia{constructor(e){super(e)}setInitiatorHeader(e){}setAdditionalHeaders(e){}listModels(){return Promise.resolve([])}},eVe=class{async createClient(e,l,n){l.startGroup("configured settings:",8),l.debug(JSON.stringify(e,null,2)),l.endGroup(8);let r=gZt(e),a=e.api?.openai?.baseUrl,I=n?.requestHeaders;return new rKe({baseURL:a,apiKey:r,defaultHeaders:I})}};function _de(t,e,l,n){switch(l){case"sweagent-aip":return new L2e(t,e,n);case"sweagent-anthropic":return new a1e(t,e,n);case"sweagent-capi":return new Mde(t,e,n);case"sweagent-openai":return E0e(t,n)?new q1e($Ot(t),t,e,n):new K1e($Ot(t),t,e,n);default:return new Mde(t,e,n)}}function $Ot(t){return t.api?.openai?.azure?.url?new $1e:new eVe}var FT=class{logger;forcePremiumRequest=!1;constructor(e){this.logger=e}async*preRequest(e){e.turn===0||this.forcePremiumRequest?(e.additionalRequestHeaders["X-Initiator"]="user",this.logger.debug("InitiatorHeaderProcessor: Setting X-Initiator to 'user'")):(e.additionalRequestHeaders["X-Initiator"]="agent",this.logger.debug("InitiatorHeaderProcessor: Setting X-Initiator to 'agent'")),this.resetPremiumRequest(),yield*[]}setForcePremiumRequest(){this.forcePremiumRequest=!0}toJSON(){return JSON.stringify({type:"InitiatorHeaderProcessor"})}resetPremiumRequest(){this.forcePremiumRequest=!1}},O8=class{logger;constructor(e){this.logger=e}async*preRequest(e){e.additionalRequestHeaders["X-Initiator"]="agent",this.logger.debug("FreeRequestProcessor: Setting X-Initiator to 'agent'"),yield*[]}setForcePremiumRequest(){}toJSON(){return JSON.stringify({type:"FreeRequestProcessor"})}};function hL(t){return t.kind==="message"&&t.message.role==="assistant"}function eUt(t){return t.kind==="message"&&t.message.role==="user"}function U8(t){return t.kind==="message"&&t.message.role==="assistant"&&!!t.message.tool_calls}function tVe(t){return t.kind==="message"&&t.message.role==="tool"}function iRn(t,e){return t.toolCalls.find(l=>l.toolCallId===e)}function cRn(t,e,l){let n=l.function.name;try{let r=JSON.parse(l.function.arguments||"{}"),a=e.find(c=>c.name===n),I=a?.safeForTelemetry||{name:!1,inputsNames:!1},s=tL(a),o;if(s&&t.customAgents&&t.settings){let c=t.customAgents.find(d=>d.name===n);if(c){let d=t.settings.github?.repo?.name??"",m=d.split("/"),b=m.length===2?m[0]:"",p=m.length===2?m[1]:d,A=c.mcpServers?Object.keys(c.mcpServers).join(","):"",Z=c.mcpServers?Object.keys(c.mcpServers).length:0;o={repoOwner:b,repoName:p,displayName:c.name,mcpServerNames:A,mcpServerCount:Z}}}return{toolCallId:l.id,toolName:n,arguments:l.function.arguments,safeForTelemetryToolName:I===!0||I.name?n:dS(n),safeForTelemetryArguments:I===!0||I.inputsNames?qTt(r):"",isCustomAgent:s,customAgentInfo:o}}catch{return{toolCallId:l.id,toolName:n,arguments:l.function.arguments,safeForTelemetryToolName:dS(n),safeForTelemetryArguments:"",isCustomAgent:!1,customAgentInfo:void 0}}}var lVe=class{constructor(e,l,n){this.runtimeContext=e;this.forAgent=l;this.toolsInUse=n}turnDataCache=new Map;emittedTurns=new Set;getTurnData(){return this.turnDataCache}async ingestEvent(e){let l,n;if("turn"in e&&typeof e.turn=="number"){if(l=e.turn+1,this.emittedTurns.has(l))return;this.turnDataCache.has(l)||this.turnDataCache.set(l,{featureFlagsAsString:vJe(this.runtimeContext.settings),toolCalls:[],toolCallExecutions:[],turn:l}),n=this.turnDataCache.get(l)}else return;e.kind==="tool_execution"?await this.ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(n,e):e.kind==="turn_started"||e.kind==="turn_failed"||e.kind==="turn_retry"||e.kind==="turn_ended"?(n={...n,model:e.model,modelInfo:JSON.stringify(e.modelInfo)},e.kind==="turn_started"?n={...n,startTimeMs:e.timestampMs}:e.kind==="turn_retry"?n={...n,endTimeMs:e.timestampMs,retriesUsed:(n.retriesUsed??0)+1}:e.kind==="turn_failed"?n={...n,endTimeMs:e.timestampMs,error:e.error}:e.kind==="turn_ended"&&(n={...n,endTimeMs:e.timestampMs})):e.kind==="history_truncated"?n={...n,truncateEvent:e}:e.kind==="image_processing"?n={...n,imageProcessingMetrics:e.imageProcessingMetrics}:e.kind==="images_removed"?n={...n,largeImagesRemoved:(n.largeImagesRemoved??0)+(e.largeImagesRemoved?1:0),imagesRemoved:(n.imagesRemoved??0)+(e.imagesRemoved?1:0)}:e.kind==="model_call_success"||e.kind==="model_call_failure"?(n={...n,callId:e.callId,modelCallDurationMs:e.modelCallDurationMs,api_call_id:e.modelCall.api_id,provider_call_id:e.modelCall.request_id,conversationStructureSummary:Cvt(e.requestMessages)},e.kind==="model_call_success"&&(n={...n,responsePromptTokens:e.responseUsage?.prompt_tokens,responseCompletionTokens:e.responseUsage?.completion_tokens,responseTotalTokens:e.responseUsage?.total_tokens})):eUt(e)&&e.source==="jit-instruction"?n={...n,jitInstructionsAdded:(n?.jitInstructionsAdded??0)+1}:hL(e)&&e.message.tool_calls?n={...n,toolCalls:n.toolCalls.concat(e.message.tool_calls.map(r=>({...cRn(this.runtimeContext,this.toolsInUse,r)})))}:tVe(e)&&(n={...n,toolCallExecutions:n.toolCallExecutions.concat([e.message.tool_call_id])}),this.turnDataCache.set(l,n),e.kind==="turn_ended"&&(await this.emitTurnTelemetry(l),this.emittedTurns.add(l),this.turnDataCache.delete(l))}async emitTurnTelemetry(e){let l=this.turnDataCache.get(e);if(l){let n={kind:"telemetry",telemetry:{event:"get_completion_with_tools_turn",properties:{callId:l.callId,model:l.model||"default",modelInfo:l.modelInfo||"{}",api_call_id:l.api_call_id,provider_call_id:l.provider_call_id,agent:this.forAgent,toolCalls:JSON.stringify(l.toolCalls.map(r=>({toolCallId:r.toolCallId,toolName:r.safeForTelemetryToolName}))),toolCallExecutions:JSON.stringify(l.toolCallExecutions),error:l.error,featureFlags:vJe(this.runtimeContext.settings),conversationStructureSummary:l.conversationStructureSummary,truncationPerformedBy:l.truncateEvent?.performedBy},metrics:{turn:e,turnDurationMs:l.endTimeMs!==void 0&&l.startTimeMs!==void 0?l.endTimeMs-l.startTimeMs:0,modelCallDurationMs:l.modelCallDurationMs,retriesUsed:l.retriesUsed??0,numToolCalls:l.toolCalls.length,numToolExecutions:l.toolCallExecutions.length,largeImagesRemoved:l.largeImagesRemoved,imagesRemoved:l.imagesRemoved,responsePromptTokens:l.responsePromptTokens,responseCompletionTokens:l.responseCompletionTokens,responseTotalTokens:l.responseTotalTokens,jitInstructionsAdded:l.jitInstructionsAdded,...l.truncateEvent?.truncateResult,...l.imageProcessingMetrics},restrictedProperties:{}}};await this.runtimeContext.callback?.progress(n)}}async ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(e,l){let n=l.toolCallId,r=iRn(e,n);if(r){let a=l.toolResult,I={kind:"telemetry",telemetry:{event:"tool_call_executed",properties:{...a.toolTelemetry.properties,completionWithToolsCallId:l.callId,resultType:a.resultType,toolCallId:n,arguments:r.safeForTelemetryArguments,toolName:r.safeForTelemetryToolName,api_call_id:e.api_call_id,isCustomAgent:r.isCustomAgent?"true":"false"},restrictedProperties:{...a.toolTelemetry.restrictedProperties,arguments:r.arguments,result:a.textResultForLlm,toolName:r.toolName,error:a.error,customAgent:r.customAgentInfo?JSON.stringify({repoOwner:r.customAgentInfo.repoOwner,repoName:r.customAgentInfo.repoName,displayName:r.customAgentInfo.displayName,mcpServerNames:r.customAgentInfo.mcpServerNames}):void 0},metrics:{...a.toolTelemetry.metrics,durationMs:l.durationMs,customAgentMcpServerCount:r.customAgentInfo?.mcpServerCount}}};await this.runtimeContext.callback?.progress(I)}}};var tUt={shell:["bash","powershell"],bash:["bash"],powershell:["powershell"],read:["view"],NotebookRead:["view"],edit:["str_replace_editor","create","edit"],MultiEdit:["str_replace_editor","create","edit"],Write:["str_replace_editor","create","edit"],NotebookEdit:["str_replace_editor","create","edit"],search:["search"],Grep:["search"],Glob:["search"],"custom-agent":[]};function dRn(t,e,l){if(!t.endsWith("/*"))return!1;t=nUt(t);let n=t.slice(0,-2).toLowerCase();for(let r of e)aKe(r).startsWith(n+"/")&&l.add(r);return!0}function uRn(t,e,l){t=nUt(t);let n=e.get(t.toLowerCase());return n?(l.add(n),!0):!1}function mRn(t,e,l,n){if(!t.includes("/"))return!1;let[r,a]=t.split("/",2),I=a.toLowerCase(),s=e.get(I);if(s)return l.add(s),!0;let o=!1,c=n[I];if(c)for(let d of c){let m=e.get(d.toLowerCase());m&&(l.add(m),o=!0)}return o}function bRn(t,e,l){if(t!=="shell")return!1;let n=process.platform==="win32"?"powershell":"bash",r=process.platform==="win32"?"bash":"powershell",a=e.get(n.toLowerCase());return a||(a=e.get(r.toLowerCase())),a?(l.add(a),!0):!1}function GRn(t,e,l,n){let r=n[t.toLowerCase()];if(!r)return!1;let a=!1;for(let I of r){let s=e.get(I.toLowerCase());s&&(l.add(s),a=!0)}return a}function lUt(t,e,l=[]){let n=new Map,r=new Set;for(let s of e)n.set(aKe(s),s);let a=[...tUt["custom-agent"]];for(let s of l)tL(s)&&a.push(aKe(s));let I={};for(let[s,o]of Object.entries(tUt))I[s.toLowerCase()]=o;I["custom-agent"]=a,I.task=a;for(let s of t){let o=s.toLowerCase().split("/"),c=o.length>2?o[0]+"__"+o.slice(1).join("/"):s.toLowerCase();dRn(c,e,r)||GRn(c,n,r,I)||uRn(c,n,r)||mRn(c,n,r,I)||bRn(c,n,r)}return Array.from(r)}function nUt(t){return t.startsWith("github__github-mcp-server/")?t.replace("github__github-mcp-server/","github-mcp-server/"):t.startsWith("microsoft__playwright-mcp/")?t.replace("microsoft__playwright-mcp/","playwright/"):t.startsWith("github/")?t.replace("github/","github-mcp-server/"):t}var aKe=t=>(t.namespacedName||t.name).toLowerCase();var Dde=class{async*preRequest(e){yield*[]}handleCallbackResponse(e){}getUserMessages(){return[]}clearUserMessages(){}canProcessUserMessages(){return!1}toJSON(){return JSON.stringify({type:"NoopUserMessageProcessor"})}};var pRn=["sweagent-capi","sweagent-aip","sweagent-anthropic","sweagent-openai"];function n5t(t){return pRn.includes(t)}var nVe={start:"\u25B6\uFE0F Begin custom agent",end:"\u23F9\uFE0F End custom agent"},hRn=void 0,zde=class{constructor(e,l=hRn){this.runtimeContext=e;this.agentId=l;this.gitHandlers={silent:new hZ(new xd,this.runtimeContext.exec),logging:new hZ(this.runtimeContext.logger,this.runtimeContext.exec)}}gitHandlers;async agent(e,l,n,r,a,I,s,o=new Dde,c){let d=async(A,Z,W)=>{let R={role:"user",content:A};return await this.runtimeContext.callback?.progress({kind:"message",turn:0,callId:this.agentId,message:R}),await this.runCompletionWithTools(e,l,[...Z??[],R],I,s,a,{executeToolsInParallel:to(this.runtimeContext.settings,"copilot_swe_agent_parallel_tool_execution"),initialTurnCount:W},c,o)},m=r,b=n??[],p;for(;m;){let A=await d(m,b,p);p=A.finalTurnCount,b=A.messages,m=await c?.onResult(A.postCompletionWithToolsCommitHash)}for(let A of I)if(A.shutdown){let Z=await A.shutdown();Z&&await this.runtimeContext.callback?.progress(Z)}return{finalTurnCount:p||0,messages:b}}async runCompletionWithTools(e,l,n,r,a,I,s,o,c=new Dde){let d=this.runtimeContext.callback?new lVe(this.runtimeContext,"sweagent-capi",r):void 0,m=this.gitHandlers.logging,b=await m.getCurrentCommitHash(e),p=n.filter(X=>X.role==="user").at(-1),A=this.createCompletionWithToolsProcessors(e,b,r,a,c,I,o,p),Z=this.runtimeContext.client.getCompletionWithTools(l,n,r,{...s,callId:this.agentId,processors:A}),W=0,R=[...n],V=[];for await(let X of Z){if(to(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")){let S=await this.runtimeContext.callback?.progress(X,{accepts_user_messages:c.canProcessUserMessages()});c.handleCallbackResponse(S)}else await this.runtimeContext.callback?.progress(X);d&&await d.ingestEvent(X),(X.kind==="message"||X.kind==="response")&&(X.kind==="message"&&R.push(X.message),X.kind==="response"&&V.push(X.response),W=Math.max(W,X.turn??0))}let f=await m.getCurrentCommitHash(e);return{finalTurnCount:W,messages:R,resultMessages:V,preCompletionWithToolsCommitHash:b,postCompletionWithToolsCommitHash:f}}createCompletionWithToolsProcessors(e,l,n,r,a,I,s,o){let c=new A0e(this.runtimeContext.logger,this.runtimeContext.settings,n.find(p=>p.name==="github-mcp-server-get_file_contents")),d=new N0e(this.runtimeContext.settings,this.runtimeContext.logger,this.gitHandlers.silent,e,l,I),m=new q4(o,this.runtimeContext.logger),b=[d,c,m];return to(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")&&b.push(a),b.push(r),{preRequest:b.filter(p=>p!==void 0),preToolsExecution:[s].filter(p=>p!==void 0),postToolExecution:[c,s].filter(p=>p!==void 0),onRequestError:[c,m].filter(p=>p!==void 0)}}};function ARn(t){let e=t.content;if(typeof e=="string")return e;if(!Array.isArray(e)||e.length===0||!("text"in e[0]))throw new Error("Expected text content in response");return e[0].text}async function gRn(t,e,l,n){if(!e.mcpServers||Object.keys(e.mcpServers).length===0||!n)return l;t.info(`Custom agent ${e.name} is using MCP servers: ${Object.keys(e.mcpServers).join(", ")}`);let r=l;for(let[a,I]of Object.entries(e.mcpServers))try{t.info(`Adding MCP server '${a}' for custom agent '${e.name}'`),r=await ZRn(t,e,a,I,r,n)}catch(s){t.error(`Encountered an issue when trying to add MCP ${a} for custom agent '${e.name}': ${s}`)}return r}async function ZRn(t,e,l,n,r,a){let I=await a.addServerAndGetTools(l,n,t);if(I.length>0){t.info(`Adding ${I.length} new tools from server '${l}' for custom agent '${e.name}'`);for(let s of I)t.info(`Adding new tool: ${s.name}`),r.push(s)}return r}async function rUt(t,e,l){if(!t.callback||!l)return;let n=l.displayName||l.name;e==="begin"?await t.callback.progress({kind:"title_and_body_content",title:`${nVe.start}: ${n}`,body:`All messages from here to '${nVe.end}' are from the ${n} custom agent.`}):await t.callback.progress({kind:"title_and_body_content",title:`${nVe.end}: ${n}`,body:`All messages from here back to '${nVe.start}' are from the ${n} custom agent.`})}function IUt(t,e,l,n,r,a,I){async function s(o,c){let d=c?.toolCallId;await rUt(r,"begin",l);let m=await l.prompt();r.logger.info(`Starting custom agent as tool: ${l.name}`),r.logger.info(`Custom agent system prompt: ${m}`),r.logger.info(`Candidate tools for custom agent: ${a.map(X=>X.namespacedName||X.name).join(", ")}`),r.logger.info(`Requested tools for custom agent: ${l.tools?.join(", ")??"none"}`),a=await gRn(r.logger,l,a,I);let b=yRn(a,l,"tool");r.logger.info(`Custom agent tools after filtering: ${b.map(X=>X.name).join(", ")}`);let p=new zde(r,d),A=await t(b),Z=new O8(r.logger),W=e(m,o.prompt),R=await p.agent(n,A,void 0,W,{},b,Z),V=R.messages[R.messages.length-1],f=V?ARn(V):"No response from tool";return await rUt(r,"end",l),{textResultForLlm:f,resultType:"success",toolTelemetry:{}}}return{title:`${l.displayName||l.name} custom agent`,name:jRt(l.name),description:`${d6e} ${l.description}`,input_schema:{type:"object",properties:{prompt:{type:"string",description:"The prompt for the agent."}},required:["prompt"]},callback:s}}var rVe=class{constructor(e,l,n={requestRequired:!1}){this.mcpHost=e;this.settings=l;this.permissions=n}async addServerAndGetTools(e,l,n){try{await this.mcpHost.startServer(e,l),n.info(`Successfully started MCP server '${e}'`);let a=(await this.mcpHost.getTools(this.settings,n,this.permissions)).filter(I=>I.name.startsWith(`${e}-`)||I.namespacedName?.startsWith(`${e}/`));return n.info(`Found ${a.length} MCP tools from server '${e}'`),a}catch(r){return n.error(`Failed to add MCP server '${e}': ${r}`),[]}}},NRn=[cS,yWe],WRn=[_Rt],aUt=[cS,yWe];function yRn(t,e,l){if(!e?.tools||e.tools.length===1&&e.tools[0]==="*")return t.filter(s=>l==="top-level"||!aUt.includes(s.name));let n=t.filter(s=>tL(s)),r=l==="top-level"?NRn:WRn;return lUt([...e.tools,...r],t,n).filter(s=>l==="top-level"||!aUt.includes(s.name))}async function IKe(t,e,l,n,r){try{return(await n.invokeTool("blackbird-mcp-server/search_repository_with_agent",{task:t,depth:2,owner:e,repo:l,numSnippets:10},"hidden_characters")).textResultForLlm}catch(a){return r.error(`Error during Blackbird search: ${a}`),""}}var oUt=t=>to(t,"copilot_swe_agent_search")||sZt(t,"SearchAgentExperiment")==="enabled",sUt="search";function sKe(t){return t!==null&&typeof t=="object"&&"question"in t&&"reason"in t&&"searchCommand"in t}var ERn=(t,e,l)=>`
|
|
1917
|
+
${m}`)}}let s=ZZt(e);l.debug(`Using Azure Open API at ${s}`);let c={baseURL:`${new URL(s).origin}/openai`,apiVersion:e.api?.openai?.azure?.apiVersion||"2024-10-21",deployment:n?.model,defaultHeaders:n?.requestHeaders};if(r)c={...c,apiKey:r},l.debug("Using Azure OpenAI API Key");else{let d=new hw,b=rPe(d,"https://cognitiveservices.azure.com/.default");c={...c,azureADTokenProvider:b},l.debug("Using Azure Managed Identity")}return new nKe(c)}};var rKe=class extends ia{constructor(e){super(e)}setInitiatorHeader(e){}setAdditionalHeaders(e){}listModels(){return Promise.resolve([])}},eVe=class{async createClient(e,l,n){l.startGroup("configured settings:",8),l.debug(JSON.stringify(e,null,2)),l.endGroup(8);let r=gZt(e),a=e.api?.openai?.baseUrl,I=n?.requestHeaders;return new rKe({baseURL:a,apiKey:r,defaultHeaders:I})}};function _de(t,e,l,n){switch(l){case"sweagent-aip":return new L2e(t,e,n);case"sweagent-anthropic":return new a1e(t,e,n);case"sweagent-capi":return new Mde(t,e,n);case"sweagent-openai":return E0e(t,n)?new q1e($Ot(t),t,e,n):new K1e($Ot(t),t,e,n);default:return new Mde(t,e,n)}}function $Ot(t){return t.api?.openai?.azure?.url?new $1e:new eVe}var FT=class{logger;forcePremiumRequest=!1;constructor(e){this.logger=e}async*preRequest(e){e.turn===0||this.forcePremiumRequest?(e.additionalRequestHeaders["X-Initiator"]="user",this.logger.debug("InitiatorHeaderProcessor: Setting X-Initiator to 'user'")):(e.additionalRequestHeaders["X-Initiator"]="agent",this.logger.debug("InitiatorHeaderProcessor: Setting X-Initiator to 'agent'")),this.resetPremiumRequest(),yield*[]}setForcePremiumRequest(){this.forcePremiumRequest=!0}toJSON(){return JSON.stringify({type:"InitiatorHeaderProcessor"})}resetPremiumRequest(){this.forcePremiumRequest=!1}},O8=class{logger;constructor(e){this.logger=e}async*preRequest(e){e.additionalRequestHeaders["X-Initiator"]="agent",this.logger.debug("FreeRequestProcessor: Setting X-Initiator to 'agent'"),yield*[]}setForcePremiumRequest(){}toJSON(){return JSON.stringify({type:"FreeRequestProcessor"})}};function hL(t){return t.kind==="message"&&t.message.role==="assistant"}function eUt(t){return t.kind==="message"&&t.message.role==="user"}function U8(t){return t.kind==="message"&&t.message.role==="assistant"&&!!t.message.tool_calls}function tVe(t){return t.kind==="message"&&t.message.role==="tool"}function iRn(t,e){return t.toolCalls.find(l=>l.toolCallId===e)}function cRn(t,e,l){let n=l.function.name;try{let r=JSON.parse(l.function.arguments||"{}"),a=e.find(c=>c.name===n),I=a?.safeForTelemetry||{name:!1,inputsNames:!1},s=tL(a),o;if(s&&t.customAgents&&t.settings){let c=t.customAgents.find(d=>d.name===n);if(c){let d=t.settings.github?.repo?.name??"",m=d.split("/"),b=m.length===2?m[0]:"",p=m.length===2?m[1]:d,A=c.mcpServers?Object.keys(c.mcpServers).join(","):"",Z=c.mcpServers?Object.keys(c.mcpServers).length:0;o={repoOwner:b,repoName:p,displayName:c.name,mcpServerNames:A,mcpServerCount:Z}}}return{toolCallId:l.id,toolName:n,arguments:l.function.arguments,safeForTelemetryToolName:I===!0||I.name?n:dS(n),safeForTelemetryArguments:I===!0||I.inputsNames?qTt(r):"",isCustomAgent:s,customAgentInfo:o}}catch{return{toolCallId:l.id,toolName:n,arguments:l.function.arguments,safeForTelemetryToolName:dS(n),safeForTelemetryArguments:"",isCustomAgent:!1,customAgentInfo:void 0}}}var lVe=class{constructor(e,l,n){this.runtimeContext=e;this.forAgent=l;this.toolsInUse=n}turnDataCache=new Map;emittedTurns=new Set;getTurnData(){return this.turnDataCache}async ingestEvent(e){let l,n;if("turn"in e&&typeof e.turn=="number"){if(l=e.turn+1,this.emittedTurns.has(l))return;this.turnDataCache.has(l)||this.turnDataCache.set(l,{featureFlagsAsString:vJe(this.runtimeContext.settings),toolCalls:[],toolCallExecutions:[],turn:l}),n=this.turnDataCache.get(l)}else return;e.kind==="tool_execution"?await this.ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(n,e):e.kind==="turn_started"||e.kind==="turn_failed"||e.kind==="turn_retry"||e.kind==="turn_ended"?(n={...n,model:e.model,modelInfo:JSON.stringify(e.modelInfo)},e.kind==="turn_started"?n={...n,startTimeMs:e.timestampMs}:e.kind==="turn_retry"?n={...n,endTimeMs:e.timestampMs,retriesUsed:(n.retriesUsed??0)+1}:e.kind==="turn_failed"?n={...n,endTimeMs:e.timestampMs,error:e.error}:e.kind==="turn_ended"&&(n={...n,endTimeMs:e.timestampMs})):e.kind==="history_truncated"?n={...n,truncateEvent:e}:e.kind==="image_processing"?n={...n,imageProcessingMetrics:e.imageProcessingMetrics}:e.kind==="images_removed"?n={...n,largeImagesRemoved:(n.largeImagesRemoved??0)+(e.largeImagesRemoved?1:0),imagesRemoved:(n.imagesRemoved??0)+(e.imagesRemoved?1:0)}:e.kind==="model_call_success"||e.kind==="model_call_failure"?(n={...n,callId:e.callId,modelCallDurationMs:e.modelCallDurationMs,api_call_id:e.modelCall.api_id,provider_call_id:e.modelCall.request_id,conversationStructureSummary:Cvt(e.requestMessages)},e.kind==="model_call_success"&&(n={...n,responsePromptTokens:e.responseUsage?.prompt_tokens,responseCompletionTokens:e.responseUsage?.completion_tokens,responseTotalTokens:e.responseUsage?.total_tokens})):eUt(e)&&e.source==="jit-instruction"?n={...n,jitInstructionsAdded:(n?.jitInstructionsAdded??0)+1}:hL(e)&&e.message.tool_calls?n={...n,toolCalls:n.toolCalls.concat(e.message.tool_calls.map(r=>({...cRn(this.runtimeContext,this.toolsInUse,r)})))}:tVe(e)&&(n={...n,toolCallExecutions:n.toolCallExecutions.concat([e.message.tool_call_id])}),this.turnDataCache.set(l,n),e.kind==="turn_ended"&&(await this.emitTurnTelemetry(l),this.emittedTurns.add(l),this.turnDataCache.delete(l))}async emitTurnTelemetry(e){let l=this.turnDataCache.get(e);if(l){let n={kind:"telemetry",telemetry:{event:"get_completion_with_tools_turn",properties:{callId:l.callId,model:l.model||"default",modelInfo:l.modelInfo||"{}",api_call_id:l.api_call_id,provider_call_id:l.provider_call_id,agent:this.forAgent,toolCalls:JSON.stringify(l.toolCalls.map(r=>({toolCallId:r.toolCallId,toolName:r.safeForTelemetryToolName}))),toolCallExecutions:JSON.stringify(l.toolCallExecutions),error:l.error,featureFlags:vJe(this.runtimeContext.settings),conversationStructureSummary:l.conversationStructureSummary,truncationPerformedBy:l.truncateEvent?.performedBy},metrics:{turn:e,turnDurationMs:l.endTimeMs!==void 0&&l.startTimeMs!==void 0?l.endTimeMs-l.startTimeMs:0,modelCallDurationMs:l.modelCallDurationMs,retriesUsed:l.retriesUsed??0,numToolCalls:l.toolCalls.length,numToolExecutions:l.toolCallExecutions.length,largeImagesRemoved:l.largeImagesRemoved,imagesRemoved:l.imagesRemoved,responsePromptTokens:l.responsePromptTokens,responseCompletionTokens:l.responseCompletionTokens,responseTotalTokens:l.responseTotalTokens,jitInstructionsAdded:l.jitInstructionsAdded,...l.truncateEvent?.truncateResult,...l.imageProcessingMetrics},restrictedProperties:{}}};await this.runtimeContext.callback?.progress(n)}}async ingestToolExecutionEventAndEmitToolCallExecutedTelemetry(e,l){let n=l.toolCallId,r=iRn(e,n);if(r){let a=l.toolResult,I={kind:"telemetry",telemetry:{event:"tool_call_executed",properties:{...a.toolTelemetry.properties,completionWithToolsCallId:l.callId,resultType:a.resultType,toolCallId:n,arguments:r.safeForTelemetryArguments,toolName:r.safeForTelemetryToolName,api_call_id:e.api_call_id,isCustomAgent:r.isCustomAgent?"true":"false"},restrictedProperties:{...a.toolTelemetry.restrictedProperties,arguments:r.arguments,result:a.textResultForLlm,toolName:r.toolName,error:a.error,customAgent:r.customAgentInfo?JSON.stringify({repoOwner:r.customAgentInfo.repoOwner,repoName:r.customAgentInfo.repoName,displayName:r.customAgentInfo.displayName,mcpServerNames:r.customAgentInfo.mcpServerNames}):void 0},metrics:{...a.toolTelemetry.metrics,durationMs:l.durationMs,customAgentMcpServerCount:r.customAgentInfo?.mcpServerCount}}};await this.runtimeContext.callback?.progress(I)}}};var tUt={shell:["bash","powershell"],bash:["bash"],powershell:["powershell"],read:["view"],NotebookRead:["view"],edit:["str_replace_editor","create","edit"],MultiEdit:["str_replace_editor","create","edit"],Write:["str_replace_editor","create","edit"],NotebookEdit:["str_replace_editor","create","edit"],search:["search"],Grep:["search"],Glob:["search"],"custom-agent":[],task:[],runCommands:["bash","powershell"],"runCommands-runInTerminal":["bash","powershell"],runInTerminal:["bash","powershell"],"edit-editFiles":["str_replace_editor","edit"],editFiles:["str_replace_editor","edit"],"create-createFile":["str_replace_editor","create"],createFile:["str_replace_editor","create"],createDirectory:["str_replace_editor","create"],"search-codebase":["search"],codebase:["search"],"search-fileSearch":["search"],fileSearch:["search"],"search-textSearch":["search"],textSearch:["search"],"search-readFile":["view"],readFile:["view"]};function dRn(t,e,l){if(!t.endsWith("/*"))return!1;t=nUt(t);let n=t.slice(0,-2).toLowerCase();for(let r of e)aKe(r).startsWith(n+"/")&&l.add(r);return!0}function uRn(t,e,l){t=nUt(t);let n=e.get(t.toLowerCase());return n?(l.add(n),!0):!1}function mRn(t,e,l,n){if(!t.includes("/"))return!1;let[r,a]=t.split("/",2),I=a.toLowerCase(),s=e.get(I);if(s)return l.add(s),!0;let o=!1,c=n[I];if(c)for(let d of c){let m=e.get(d.toLowerCase());m&&(l.add(m),o=!0)}return o}function bRn(t,e,l){if(t!=="shell"&&t!=="runcommands"&&t!=="runcommands-runinterminal"&&t!=="runinterminal")return!1;let n=process.platform==="win32"?"powershell":"bash",r=process.platform==="win32"?"bash":"powershell",a=e.get(n.toLowerCase());return a||(a=e.get(r.toLowerCase())),a?(l.add(a),!0):!1}function GRn(t,e,l,n){let r=n[t.toLowerCase()];if(!r)return!1;let a=!1;for(let I of r){let s=e.get(I.toLowerCase());s&&(l.add(s),a=!0)}return a}function lUt(t,e,l=[]){let n=new Map,r=new Set;for(let s of e)n.set(aKe(s),s);let a=[...tUt["custom-agent"]];for(let s of l)tL(s)&&a.push(aKe(s));let I={};for(let[s,o]of Object.entries(tUt))I[s.toLowerCase()]=o;I["custom-agent"]=a,I.task=a;for(let s of t){let o=s.toLowerCase().split("/"),c=o.length>2?o[0]+"__"+o.slice(1).join("/"):s.toLowerCase();dRn(c,e,r)||GRn(c,n,r,I)||uRn(c,n,r)||mRn(c,n,r,I)||bRn(c,n,r)}return Array.from(r)}function nUt(t){return t.startsWith("github__github-mcp-server/")?t.replace("github__github-mcp-server/","github-mcp-server/"):t.startsWith("microsoft__playwright-mcp/")?t.replace("microsoft__playwright-mcp/","playwright/"):t.startsWith("github/")?t.replace("github/","github-mcp-server/"):t}var aKe=t=>(t.namespacedName||t.name).toLowerCase();var Dde=class{async*preRequest(e){yield*[]}handleCallbackResponse(e){}getUserMessages(){return[]}clearUserMessages(){}canProcessUserMessages(){return!1}toJSON(){return JSON.stringify({type:"NoopUserMessageProcessor"})}};var pRn=["sweagent-capi","sweagent-aip","sweagent-anthropic","sweagent-openai"];function n5t(t){return pRn.includes(t)}var nVe={start:"\u25B6\uFE0F Begin custom agent",end:"\u23F9\uFE0F End custom agent"},hRn=void 0,zde=class{constructor(e,l=hRn){this.runtimeContext=e;this.agentId=l;this.gitHandlers={silent:new hZ(new xd,this.runtimeContext.exec),logging:new hZ(this.runtimeContext.logger,this.runtimeContext.exec)}}gitHandlers;async agent(e,l,n,r,a,I,s,o=new Dde,c){let d=async(A,Z,W)=>{let R={role:"user",content:A};return await this.runtimeContext.callback?.progress({kind:"message",turn:0,callId:this.agentId,message:R}),await this.runCompletionWithTools(e,l,[...Z??[],R],I,s,a,{executeToolsInParallel:to(this.runtimeContext.settings,"copilot_swe_agent_parallel_tool_execution"),initialTurnCount:W},c,o)},m=r,b=n??[],p;for(;m;){let A=await d(m,b,p);p=A.finalTurnCount,b=A.messages,m=await c?.onResult(A.postCompletionWithToolsCommitHash)}for(let A of I)if(A.shutdown){let Z=await A.shutdown();Z&&await this.runtimeContext.callback?.progress(Z)}return{finalTurnCount:p||0,messages:b}}async runCompletionWithTools(e,l,n,r,a,I,s,o,c=new Dde){let d=this.runtimeContext.callback?new lVe(this.runtimeContext,"sweagent-capi",r):void 0,m=this.gitHandlers.logging,b=await m.getCurrentCommitHash(e),p=n.filter(X=>X.role==="user").at(-1),A=this.createCompletionWithToolsProcessors(e,b,r,a,c,I,o,p),Z=this.runtimeContext.client.getCompletionWithTools(l,n,r,{...s,callId:this.agentId,processors:A}),W=0,R=[...n],V=[];for await(let X of Z){if(to(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")){let S=await this.runtimeContext.callback?.progress(X,{accepts_user_messages:c.canProcessUserMessages()});c.handleCallbackResponse(S)}else await this.runtimeContext.callback?.progress(X);d&&await d.ingestEvent(X),(X.kind==="message"||X.kind==="response")&&(X.kind==="message"&&R.push(X.message),X.kind==="response"&&V.push(X.response),W=Math.max(W,X.turn??0))}let f=await m.getCurrentCommitHash(e);return{finalTurnCount:W,messages:R,resultMessages:V,preCompletionWithToolsCommitHash:b,postCompletionWithToolsCommitHash:f}}createCompletionWithToolsProcessors(e,l,n,r,a,I,s,o){let c=new A0e(this.runtimeContext.logger,this.runtimeContext.settings,n.find(p=>p.name==="github-mcp-server-get_file_contents")),d=new N0e(this.runtimeContext.settings,this.runtimeContext.logger,this.gitHandlers.silent,e,l,I),m=new q4(o,this.runtimeContext.logger),b=[d,c,m];return to(this.runtimeContext.settings,"copilot_swe_agent_progress_commands")&&b.push(a),b.push(r),{preRequest:b.filter(p=>p!==void 0),preToolsExecution:[s].filter(p=>p!==void 0),postToolExecution:[c,s].filter(p=>p!==void 0),onRequestError:[c,m].filter(p=>p!==void 0)}}};function ARn(t){let e=t.content;if(typeof e=="string")return e;if(!Array.isArray(e)||e.length===0||!("text"in e[0]))throw new Error("Expected text content in response");return e[0].text}async function gRn(t,e,l,n){if(!e.mcpServers||Object.keys(e.mcpServers).length===0||!n)return l;t.info(`Custom agent ${e.name} is using MCP servers: ${Object.keys(e.mcpServers).join(", ")}`);let r=l;for(let[a,I]of Object.entries(e.mcpServers))try{t.info(`Adding MCP server '${a}' for custom agent '${e.name}'`),r=await ZRn(t,e,a,I,r,n)}catch(s){t.error(`Encountered an issue when trying to add MCP ${a} for custom agent '${e.name}': ${s}`)}return r}async function ZRn(t,e,l,n,r,a){let I=await a.addServerAndGetTools(l,n,t);if(I.length>0){t.info(`Adding ${I.length} new tools from server '${l}' for custom agent '${e.name}'`);for(let s of I)t.info(`Adding new tool: ${s.name}`),r.push(s)}return r}async function rUt(t,e,l){if(!t.callback||!l)return;let n=l.displayName||l.name;e==="begin"?await t.callback.progress({kind:"title_and_body_content",title:`${nVe.start}: ${n}`,body:`All messages from here to '${nVe.end}' are from the ${n} custom agent.`}):await t.callback.progress({kind:"title_and_body_content",title:`${nVe.end}: ${n}`,body:`All messages from here back to '${nVe.start}' are from the ${n} custom agent.`})}function IUt(t,e,l,n,r,a,I){async function s(o,c){let d=c?.toolCallId;await rUt(r,"begin",l);let m=await l.prompt();r.logger.info(`Starting custom agent as tool: ${l.name}`),r.logger.info(`Custom agent system prompt: ${m}`),r.logger.info(`Candidate tools for custom agent: ${a.map(X=>X.namespacedName||X.name).join(", ")}`),r.logger.info(`Requested tools for custom agent: ${l.tools?.join(", ")??"none"}`),a=await gRn(r.logger,l,a,I);let b=yRn(a,l,"tool");r.logger.info(`Custom agent tools after filtering: ${b.map(X=>X.name).join(", ")}`);let p=new zde(r,d),A=await t(b),Z=new O8(r.logger),W=e(m,o.prompt),R=await p.agent(n,A,void 0,W,{},b,Z),V=R.messages[R.messages.length-1],f=V?ARn(V):"No response from tool";return await rUt(r,"end",l),{textResultForLlm:f,resultType:"success",toolTelemetry:{}}}return{title:`${l.displayName||l.name} custom agent`,name:jRt(l.name),description:`${d6e} ${l.description}`,input_schema:{type:"object",properties:{prompt:{type:"string",description:"The prompt for the agent."}},required:["prompt"]},callback:s}}var rVe=class{constructor(e,l,n={requestRequired:!1}){this.mcpHost=e;this.settings=l;this.permissions=n}async addServerAndGetTools(e,l,n){try{await this.mcpHost.startServer(e,l),n.info(`Successfully started MCP server '${e}'`);let a=(await this.mcpHost.getTools(this.settings,n,this.permissions)).filter(I=>I.name.startsWith(`${e}-`)||I.namespacedName?.startsWith(`${e}/`));return n.info(`Found ${a.length} MCP tools from server '${e}'`),a}catch(r){return n.error(`Failed to add MCP server '${e}': ${r}`),[]}}},NRn=[cS,yWe],WRn=[_Rt],aUt=[cS,yWe];function yRn(t,e,l){if(!e?.tools||e.tools.length===1&&e.tools[0]==="*")return t.filter(s=>l==="top-level"||!aUt.includes(s.name));let n=t.filter(s=>tL(s)),r=l==="top-level"?NRn:WRn;return lUt([...e.tools,...r],t,n).filter(s=>l==="top-level"||!aUt.includes(s.name))}async function IKe(t,e,l,n,r){try{return(await n.invokeTool("blackbird-mcp-server/search_repository_with_agent",{task:t,depth:2,owner:e,repo:l,numSnippets:10},"hidden_characters")).textResultForLlm}catch(a){return r.error(`Error during Blackbird search: ${a}`),""}}var oUt=t=>to(t,"copilot_swe_agent_search")||sZt(t,"SearchAgentExperiment")==="enabled",sUt="search";function sKe(t){return t!==null&&typeof t=="object"&&"question"in t&&"reason"in t&&"searchCommand"in t}var ERn=(t,e,l)=>`
|
|
1918
1918
|
You are a question answering agent that is a component of GitHub Copilot coding agent. Your task is to take the given question
|
|
1919
1919
|
and answer it using the given facts.
|
|
1920
1920
|
|
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.355-
|
|
4
|
+
"version": "0.0.355-9",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"repository": {
|
|
@@ -37,6 +37,6 @@
|
|
|
37
37
|
"worker/**/*"
|
|
38
38
|
],
|
|
39
39
|
"buildMetadata": {
|
|
40
|
-
"gitCommit": "
|
|
40
|
+
"gitCommit": "84ecf12"
|
|
41
41
|
}
|
|
42
42
|
}
|