@sourcegraph/amp 0.0.1751587373-g37e9ff → 0.0.1751599640-ge1e427
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/dist/main.js +10 -12
- package/package.json +1 -1
package/dist/main.js
CHANGED
@@ -6870,7 +6870,7 @@ For each affected file, describe the changes made and review the code for correc
|
|
6870
6870
|
</format>
|
6871
6871
|
|
6872
6872
|
When authoring your review, obey these principles:
|
6873
|
-
- Be concise but thorough`,Z)).message?.choices[0]?.message?.content||"Failed to generate analysis";try{let M=b_6(J,"amp-review.md");await g_6(M,H,"utf8")}catch(M){k1.error("Failed to write amp-review.md:",M)}X.next({status:"done",result:{toolOutput:"A detailed review of the changes has been written to amp-review.md",hidden_reviewMarkdown:H,hidden_progress:{type:"diff",diff:G,untrackedFiles:D?q:void 0,gitCommand:z,statusMessage:"Analysis complete"}}})}catch(Y){let F=Y instanceof Error?Y.message:`Error: ${Y}`;X.error({message:F})}X.complete()}catch(G){let q=G instanceof Error?G.message:"Unknown error occurred";X.next({status:"error",error:{message:q}}),X.complete()}})()})};var ou0=x1(()=>{D2();$2();uo();Ez()});var eu0={};J2(eu0,{nodeCommitAttributionTool:()=>p_6});import{spawn as m_6}from"node:child_process";import{resolve as u_6}from"path";function Yl(A,Q){return new Promise((B,J)=>{let D=m_6("git",A,{cwd:Q,stdio:"pipe"}),z="",Z="";D.stdout?.on("data",(X)=>{z+=X.toString()}),D.stderr?.on("data",(X)=>{Z+=X.toString()}),D.on("close",(X)=>{if(X===0)B(z);else J(new Error(`Git command failed (exit code ${X}): ${Z||z}`))}),D.on("error",(X)=>{J(new Error(`Failed to run git command: ${X.message}`))})})}var p_6=({args:A},{dir:Q,config:B,thread:J})=>{y5(Q);let D=u_6(Q.fsPath);return new UA((z)=>{(async()=>{try{if(await Yl(["rev-parse","--git-dir"],D),z.next({status:"in-progress",progress:{message:"Preparing commit..."}}),A.addAll)z.next({status:"in-progress",progress:{message:"Adding all files..."}}),await Yl(["add","-A"],D);else if(A.files&&A.files.length>0)z.next({status:"in-progress",progress:{message:`Adding ${A.files.length} files...`}}),await Yl(["add",...A.files],D);if((await Yl(["diff","--cached","--name-only"],D)).trim()===""){z.next({status:"done",result:{output:"No staged changes to commit. Use addAll: true or specify files to add changes first."}});return}let K=["commit","-m",A.message],G=A.threadId||J.id
|
6873
|
+
- Be concise but thorough`,Z)).message?.choices[0]?.message?.content||"Failed to generate analysis";try{let M=b_6(J,"amp-review.md");await g_6(M,H,"utf8")}catch(M){k1.error("Failed to write amp-review.md:",M)}X.next({status:"done",result:{toolOutput:"A detailed review of the changes has been written to amp-review.md",hidden_reviewMarkdown:H,hidden_progress:{type:"diff",diff:G,untrackedFiles:D?q:void 0,gitCommand:z,statusMessage:"Analysis complete"}}})}catch(Y){let F=Y instanceof Error?Y.message:`Error: ${Y}`;X.error({message:F})}X.complete()}catch(G){let q=G instanceof Error?G.message:"Unknown error occurred";X.next({status:"error",error:{message:q}}),X.complete()}})()})};var ou0=x1(()=>{D2();$2();uo();Ez()});var eu0={};J2(eu0,{nodeCommitAttributionTool:()=>p_6});import{spawn as m_6}from"node:child_process";import{resolve as u_6}from"path";function Yl(A,Q){return new Promise((B,J)=>{let D=m_6("git",A,{cwd:Q,stdio:"pipe"}),z="",Z="";D.stdout?.on("data",(X)=>{z+=X.toString()}),D.stderr?.on("data",(X)=>{Z+=X.toString()}),D.on("close",(X)=>{if(X===0)B(z);else J(new Error(`Git command failed (exit code ${X}): ${Z||z}`))}),D.on("error",(X)=>{J(new Error(`Failed to run git command: ${X.message}`))})})}var p_6=({args:A},{dir:Q,config:B,thread:J})=>{y5(Q);let D=u_6(Q.fsPath);return new UA((z)=>{(async()=>{try{if(await Yl(["rev-parse","--git-dir"],D),z.next({status:"in-progress",progress:{message:"Preparing commit..."}}),A.addAll)z.next({status:"in-progress",progress:{message:"Adding all files..."}}),await Yl(["add","-A"],D);else if(A.files&&A.files.length>0)z.next({status:"in-progress",progress:{message:`Adding ${A.files.length} files...`}}),await Yl(["add",...A.files],D);if((await Yl(["diff","--cached","--name-only"],D)).trim()===""){z.next({status:"done",result:{output:"No staged changes to commit. Use addAll: true or specify files to add changes first."}});return}let K=["commit","-m",A.message],G=A.threadId||J.id,q=A.threadUrl||`${B.settings.url?.replace(/\/$/,"")||"https://ampcode.com"}/threads/${G}`;K.push("--trailer",`Amp-Thread=${q}`),K.push("--trailer","Co-authored-by: Amp <amp@ampcode.com>"),z.next({status:"in-progress",progress:{message:"Creating commit with Amp attribution..."}});let Y=await Yl(K,D),E=Y.match(/\[[\w-]+\s+([a-f0-9]+)\]/)?.[1],w=["Commit created successfully",Y,"","Attribution trailers added:",`- Amp-Thread: ${q}`,"- Co-authored-by: Amp <amp@ampcode.com>"].join(`
|
6874
6874
|
`);z.next({status:"done",result:{output:w,commitHash:E}})}catch(X){z.next({status:"done",result:{output:`Error: ${X instanceof Error?X.message:String(X)}`}})}})()})};var Ap0=x1(()=>{D2();Ez()});var a_6={};import{createRequire as c_6}from"node:module";import{runInNewContext as l_6}from"node:vm";import{isMainThread as d_6,parentPort as Qp0,workerData as i_6}from"node:worker_threads";class Bp0{port;constructor(A){this.port=A}sendToolCall(A){this.port.postMessage({type:"tool-call",...A})}sendConsole(A){this.port.postMessage({type:"console",...A})}sendResult(A){this.port.postMessage({type:"result",...A})}on(A,Q){this.port.on(A,Q)}off(A,Q){this.port.off(A,Q)}}var __filename="/home/runner/work/amp/amp/core/src/tools/builtin/run_javascript/worker.node.ts";var Jp0=x1(()=>{if(!d_6&&Qp0){let z=function(K){let G={};for(let[q]of Object.entries(K))G[q]=async(Y)=>{return new Promise((F,E)=>{let w=Math.random().toString(36).slice(2,9);A.sendToolCall({id:w,toolName:q,args:Y});let H=(M)=>{if(M.type==="tool-response"&&M.id===w)if(A.off("message",H),M.error)E(new Error(M.error));else F(M.result)};A.on("message",H)})};return G},Z=function(){let K=(G,...q)=>{let Y=q.map((F)=>typeof F==="object"?JSON.stringify(F):String(F)).join(" ");A.sendConsole({level:G,message:Y})};return{log:(...G)=>K("log",...G),error:(...G)=>K("error",...G),warn:(...G)=>K("warn",...G),info:(...G)=>K("info",...G)}},A=new Bp0(Qp0),{code:Q,dir:B,toolWrappers:J,env:D}=i_6;async function X(){let K=c_6(__filename),G=Z(),q=z(J);function Y(H,M){return H!==void 0?{[M]:H}:{}}let F={console:G,require:(H)=>{if(H.startsWith("node:"))return K(H);if(H==="amp/tools")return{Task:q.Task,format_file:q.format_file,get_diagnostics:q.get_diagnostics,web_search:q.web_search};throw new Error(`Module '${H}' is not allowed. Only Node.js built-in modules and 'amp/tools' are permitted.`)},exports:{},module:{exports:{}},global:{},__dirname:B??"",__filename:"<ampsandbox>",process:{...process,env:D,cwd:()=>B??""},AbortController,AbortSignal,Blob,Buffer,ByteLengthQueuingStrategy,atob,btoa,BroadcastChannel,clearImmediate,clearInterval,clearTimeout,CompressionStream,CountQueuingStrategy,Crypto,crypto,CryptoKey,CustomEvent,DecompressionStream,Event,EventTarget,fetch,File,FormData,Headers,MessageChannel,MessageEvent,MessagePort,...Y(typeof navigator!=="undefined"?navigator:void 0,"navigator"),PerformanceEntry,PerformanceMark,PerformanceMeasure,PerformanceObserver,PerformanceObserverEntryList,PerformanceResourceTiming,performance,queueMicrotask,ReadableByteStreamController,ReadableStream,ReadableStreamBYOBReader,ReadableStreamBYOBRequest,ReadableStreamDefaultController,ReadableStreamDefaultReader,Request,Response,setImmediate,setInterval,setTimeout,structuredClone,SubtleCrypto,DOMException,TextDecoder,TextDecoderStream,TextEncoder,TextEncoderStream,TransformStream,TransformStreamDefaultController,URL,URLSearchParams,WebAssembly,...Y(typeof WebSocket!=="undefined"?WebSocket:void 0,"WebSocket"),WritableStream,WritableStreamDefaultController,WritableStreamDefaultWriter},E="(async () => { "+Q+" })()",w=await l_6(E,F,{filename:"<ampsandbox>"});A.sendResult({returnValue:w})}X()}});import{readFile as n_6}from"node:fs/promises";import{resolve as s_6}from"node:path";import{Worker as r_6}from"node:worker_threads";var hP1;var Dp0=x1(()=>{D2();lK();OE();hP1=class hP1 extends C8{#A=new AbortController;#Q;#B;#J=[];#D=new Map;constructor(A,Q){super();this.#Q=A,this.#B=Q,this.start().catch((B)=>{this.next({status:"error",error:{message:`Setup error: ${B instanceof Error?B.message:String(B)}`}}),this.complete()})}dispose(){this.#A.abort()}#z(A){if(this.#J.push(A),A.event==="tool-call")this.#D.set(A.id,this.#J.length-1);this.next({status:"in-progress",progress:{executionTimeline:[...this.#J]}})}#Z(A,Q){let B=this.#D.get(A);if(B===void 0)throw new Error("tool call not found for id");this.#J[B]={...this.#J[B],run:Q},this.next({status:"in-progress",progress:{executionTimeline:[...this.#J]}})}async getScriptCode(){if(this.#Q.codeFile){let A=s_6(this.#B?.dir?.fsPath??"/",this.#Q.codeFile);return n_6(A,"utf8")}else if(this.#Q.code)return this.#Q.code;else throw new Error("Either code or filePath parameter must be provided")}async start(){let A=await this.getScriptCode(),Q=yq(),B=Q.registerTool(d91),J=await l6(Q.tools,this.#A.signal),D={};for(let X of J)if(X.enabled&&X.spec.name!=="run_javascript")D[X.spec.name]=!0;let z=new r_6(c0.resolve("/home/runner/work/amp/amp/core/src/tools/builtin/run_javascript/worker.node.ts"),{workerData:{code:A,dir:this.#B?.dir?.toString(),toolWrappers:D,env:this.#Q?.env||{}}}),Z=()=>{if(z.terminate(),B)B.dispose();if(Q)Q.dispose()};this.#A.signal.addEventListener("abort",Z),z.on("message",async(X)=>{try{switch(X.type){case"console":{this.#z({event:"console-output",level:X.level,message:X.message});break}case"tool-call":{this.#z({event:"tool-call",id:X.id,toolName:X.toolName,args:X.args,run:{status:"queued"}});let K=await Ow(Q.invokeTool(X.toolName,{args:X.args},this.#B).pipe($q(200),Lw((G)=>{this.#Z(X.id,G)})),this.#A.signal);z.postMessage({type:"tool-response",id:X.id,result:K});break}case"result":this.next({status:"done",result:{returnValue:X.returnValue,executionTimeline:[...this.#J]}}),z.terminate(),this.complete();break}}catch(K){this.next({status:"error",error:{message:`Message handling error: ${K instanceof Error?K.message:String(K)}`}}),z.terminate(),this.complete()}}),z.on("error",(X)=>{this.next({status:"error",error:{message:`Worker error: ${X.message}`}}),z.terminate(),this.complete()}),z.on("exit",(X)=>{if(this.#A.signal.removeEventListener("abort",Z),X!==0)this.next({status:"error",error:{message:`Worker stopped with exit code ${X}`}}),this.complete();if(B)B.dispose();if(Q)Q.dispose()})}}});var zp0={};J2(zp0,{nodeRunJavaScriptTool:()=>o_6});var o_6=({args:A},Q)=>{return new UA((B)=>{let J=new hP1(A,Q),D=J.subscribe(B);return()=>{D.unsubscribe(),J.dispose()}})};var Zp0=x1(()=>{D2();Dp0()});var mp0=Q1((zx2,hp0)=>{function oP1(A){if(A instanceof Map)A.clear=A.delete=A.set=function(){throw new Error("map is read-only")};else if(A instanceof Set)A.add=A.clear=A.delete=function(){throw new Error("set is read-only")};return Object.freeze(A),Object.getOwnPropertyNames(A).forEach(function(Q){var B=A[Q];if(typeof B=="object"&&!Object.isFrozen(B))oP1(B)}),A}var Sp0=oP1,cT6=oP1;Sp0.default=cT6;class sP1{constructor(A){if(A.data===void 0)A.data={};this.data=A.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function Jf(A){return A.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function RC(A,...Q){let B=Object.create(null);for(let J in A)B[J]=A[J];return Q.forEach(function(J){for(let D in J)B[D]=J[D]}),B}var lT6="</span>",Rp0=(A)=>{return!!A.kind};class vp0{constructor(A,Q){this.buffer="",this.classPrefix=Q.classPrefix,A.walk(this)}addText(A){this.buffer+=Jf(A)}openNode(A){if(!Rp0(A))return;let Q=A.kind;if(!A.sublanguage)Q=`${this.classPrefix}${Q}`;this.span(Q)}closeNode(A){if(!Rp0(A))return;this.buffer+=lT6}value(){return this.buffer}span(A){this.buffer+=`<span class="${A}">`}}class tP1{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(A){this.top.children.push(A)}openNode(A){let Q={kind:A,children:[]};this.add(Q),this.stack.push(Q)}closeNode(){if(this.stack.length>1)return this.stack.pop();return}closeAllNodes(){while(this.closeNode());}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(A){return this.constructor._walk(A,this.rootNode)}static _walk(A,Q){if(typeof Q==="string")A.addText(Q);else if(Q.children)A.openNode(Q),Q.children.forEach((B)=>this._walk(A,B)),A.closeNode(Q);return A}static _collapse(A){if(typeof A==="string")return;if(!A.children)return;if(A.children.every((Q)=>typeof Q==="string"))A.children=[A.children.join("")];else A.children.forEach((Q)=>{tP1._collapse(Q)})}}class $p0 extends tP1{constructor(A){super();this.options=A}addKeyword(A,Q){if(A==="")return;this.openNode(Q),this.addText(A),this.closeNode()}addText(A){if(A==="")return;this.add(A)}addSublanguage(A,Q){let B=A.root;B.kind=Q,B.sublanguage=!0,this.add(B)}toHTML(){return new vp0(this,this.options).value()}finalize(){return!0}}function dT6(A){return new RegExp(A.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function Ml(A){if(!A)return null;if(typeof A==="string")return A;return A.source}function iT6(...A){return A.map((B)=>Ml(B)).join("")}function aT6(...A){return"("+A.map((B)=>Ml(B)).join("|")+")"}function nT6(A){return new RegExp(A.toString()+"|").exec("").length-1}function sT6(A,Q){let B=A&&A.exec(Q);return B&&B.index===0}var rT6=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function oT6(A,Q="|"){let B=0;return A.map((J)=>{B+=1;let D=B,z=Ml(J),Z="";while(z.length>0){let X=rT6.exec(z);if(!X){Z+=z;break}if(Z+=z.substring(0,X.index),z=z.substring(X.index+X[0].length),X[0][0]==="\\"&&X[1])Z+="\\"+String(Number(X[1])+D);else if(Z+=X[0],X[0]==="(")B++}return Z}).map((J)=>`(${J})`).join(Q)}var tT6=/\b\B/,fp0="[a-zA-Z]\\w*",eP1="[a-zA-Z_]\\w*",AS1="\\b\\d+(\\.\\d+)?",kp0="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",yp0="\\b(0b[01]+)",eT6="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",Aj6=(A={})=>{let Q=/^#![ ]*\//;if(A.binary)A.begin=iT6(Q,/.*\b/,A.binary,/\b.*/);return RC({className:"meta",begin:Q,end:/$/,relevance:0,"on:begin":(B,J)=>{if(B.index!==0)J.ignoreMatch()}},A)},Wl={begin:"\\\\[\\s\\S]",relevance:0},Qj6={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[Wl]},Bj6={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[Wl]},gp0={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},o91=function(A,Q,B={}){let J=RC({className:"comment",begin:A,end:Q,contains:[]},B);return J.contains.push(gp0),J.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),J},Jj6=o91("//","$"),Dj6=o91("/\\*","\\*/"),zj6=o91("#","$"),Zj6={className:"number",begin:AS1,relevance:0},Xj6={className:"number",begin:kp0,relevance:0},Kj6={className:"number",begin:yp0,relevance:0},Gj6={className:"number",begin:AS1+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},qj6={begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[Wl,{begin:/\[/,end:/\]/,relevance:0,contains:[Wl]}]}]},Yj6={className:"title",begin:fp0,relevance:0},Uj6={className:"title",begin:eP1,relevance:0},Fj6={begin:"\\.\\s*"+eP1,relevance:0},Ej6=function(A){return Object.assign(A,{"on:begin":(Q,B)=>{B.data._beginMatch=Q[1]},"on:end":(Q,B)=>{if(B.data._beginMatch!==Q[1])B.ignoreMatch()}})},r91=Object.freeze({__proto__:null,MATCH_NOTHING_RE:tT6,IDENT_RE:fp0,UNDERSCORE_IDENT_RE:eP1,NUMBER_RE:AS1,C_NUMBER_RE:kp0,BINARY_NUMBER_RE:yp0,RE_STARTERS_RE:eT6,SHEBANG:Aj6,BACKSLASH_ESCAPE:Wl,APOS_STRING_MODE:Qj6,QUOTE_STRING_MODE:Bj6,PHRASAL_WORDS_MODE:gp0,COMMENT:o91,C_LINE_COMMENT_MODE:Jj6,C_BLOCK_COMMENT_MODE:Dj6,HASH_COMMENT_MODE:zj6,NUMBER_MODE:Zj6,C_NUMBER_MODE:Xj6,BINARY_NUMBER_MODE:Kj6,CSS_NUMBER_MODE:Gj6,REGEXP_MODE:qj6,TITLE_MODE:Yj6,UNDERSCORE_TITLE_MODE:Uj6,METHOD_GUARD:Fj6,END_SAME_AS_BEGIN:Ej6});function wj6(A,Q){if(A.input[A.index-1]===".")Q.ignoreMatch()}function Hj6(A,Q){if(!Q)return;if(!A.beginKeywords)return;if(A.begin="\\b("+A.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",A.__beforeBegin=wj6,A.keywords=A.keywords||A.beginKeywords,delete A.beginKeywords,A.relevance===void 0)A.relevance=0}function Mj6(A,Q){if(!Array.isArray(A.illegal))return;A.illegal=aT6(...A.illegal)}function Wj6(A,Q){if(!A.match)return;if(A.begin||A.end)throw new Error("begin & end are not supported with match");A.begin=A.match,delete A.match}function Ij6(A,Q){if(A.relevance===void 0)A.relevance=1}var Nj6=["of","and","for","in","not","or","if","then","parent","list","value"],Cj6="keyword";function bp0(A,Q,B=Cj6){let J={};if(typeof A==="string")D(B,A.split(" "));else if(Array.isArray(A))D(B,A);else Object.keys(A).forEach(function(z){Object.assign(J,bp0(A[z],Q,z))});return J;function D(z,Z){if(Q)Z=Z.map((X)=>X.toLowerCase());Z.forEach(function(X){let K=X.split("|");J[K[0]]=[z,Vj6(K[0],K[1])]})}}function Vj6(A,Q){if(Q)return Number(Q);return Oj6(A)?0:1}function Oj6(A){return Nj6.includes(A.toLowerCase())}function Rj6(A,{plugins:Q}){function B(X,K){return new RegExp(Ml(X),"m"+(A.case_insensitive?"i":"")+(K?"g":""))}class J{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(X,K){K.position=this.position++,this.matchIndexes[this.matchAt]=K,this.regexes.push([K,X]),this.matchAt+=nT6(X)+1}compile(){if(this.regexes.length===0)this.exec=()=>null;let X=this.regexes.map((K)=>K[1]);this.matcherRe=B(oT6(X),!0),this.lastIndex=0}exec(X){this.matcherRe.lastIndex=this.lastIndex;let K=this.matcherRe.exec(X);if(!K)return null;let G=K.findIndex((Y,F)=>F>0&&Y!==void 0),q=this.matchIndexes[G];return K.splice(0,G),Object.assign(K,q)}}class D{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(X){if(this.multiRegexes[X])return this.multiRegexes[X];let K=new J;return this.rules.slice(X).forEach(([G,q])=>K.addRule(G,q)),K.compile(),this.multiRegexes[X]=K,K}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(X,K){if(this.rules.push([X,K]),K.type==="begin")this.count++}exec(X){let K=this.getMatcher(this.regexIndex);K.lastIndex=this.lastIndex;let G=K.exec(X);if(this.resumingScanAtSamePosition())if(G&&G.index===this.lastIndex);else{let q=this.getMatcher(0);q.lastIndex=this.lastIndex+1,G=q.exec(X)}if(G){if(this.regexIndex+=G.position+1,this.regexIndex===this.count)this.considerAll()}return G}}function z(X){let K=new D;if(X.contains.forEach((G)=>K.addRule(G.begin,{rule:G,type:"begin"})),X.terminatorEnd)K.addRule(X.terminatorEnd,{type:"end"});if(X.illegal)K.addRule(X.illegal,{type:"illegal"});return K}function Z(X,K){let G=X;if(X.isCompiled)return G;[Wj6].forEach((Y)=>Y(X,K)),A.compilerExtensions.forEach((Y)=>Y(X,K)),X.__beforeBegin=null,[Hj6,Mj6,Ij6].forEach((Y)=>Y(X,K)),X.isCompiled=!0;let q=null;if(typeof X.keywords==="object")q=X.keywords.$pattern,delete X.keywords.$pattern;if(X.keywords)X.keywords=bp0(X.keywords,A.case_insensitive);if(X.lexemes&&q)throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");if(q=q||X.lexemes||/\w+/,G.keywordPatternRe=B(q,!0),K){if(!X.begin)X.begin=/\B|\b/;if(G.beginRe=B(X.begin),X.endSameAsBegin)X.end=X.begin;if(!X.end&&!X.endsWithParent)X.end=/\B|\b/;if(X.end)G.endRe=B(X.end);if(G.terminatorEnd=Ml(X.end)||"",X.endsWithParent&&K.terminatorEnd)G.terminatorEnd+=(X.end?"|":"")+K.terminatorEnd}if(X.illegal)G.illegalRe=B(X.illegal);if(!X.contains)X.contains=[];if(X.contains=[].concat(...X.contains.map(function(Y){return Lj6(Y==="self"?X:Y)})),X.contains.forEach(function(Y){Z(Y,G)}),X.starts)Z(X.starts,K);return G.matcher=z(G),G}if(!A.compilerExtensions)A.compilerExtensions=[];if(A.contains&&A.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return A.classNameAliases=RC(A.classNameAliases||{}),Z(A)}function xp0(A){if(!A)return!1;return A.endsWithParent||xp0(A.starts)}function Lj6(A){if(A.variants&&!A.cachedVariants)A.cachedVariants=A.variants.map(function(Q){return RC(A,{variants:null},Q)});if(A.cachedVariants)return A.cachedVariants;if(xp0(A))return RC(A,{starts:A.starts?RC(A.starts):null});if(Object.isFrozen(A))return RC(A);return A}var _j6="10.7.3";function Tj6(A){return Boolean(A||A==="")}function jj6(A){let Q={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){if(this.unknownLanguage)return"";return"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!A.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,Jf(this.code);let J={};if(this.autoDetect)J=A.highlightAuto(this.code),this.detectedLanguage=J.language;else J=A.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language;return J.value},autoDetect(){return!this.language||Tj6(this.autodetect)},ignoreIllegals(){return!0}},render(J){return J("pre",{},[J("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:Q,VuePlugin:{install(J){J.component("highlightjs",Q)}}}}var Pj6={"after:highlightElement":({el:A,result:Q,text:B})=>{let J=Lp0(A);if(!J.length)return;let D=document.createElement("div");D.innerHTML=Q.value,Q.value=Sj6(J,Lp0(D),B)}};function rP1(A){return A.nodeName.toLowerCase()}function Lp0(A){let Q=[];return function B(J,D){for(let z=J.firstChild;z;z=z.nextSibling)if(z.nodeType===3)D+=z.nodeValue.length;else if(z.nodeType===1){if(Q.push({event:"start",offset:D,node:z}),D=B(z,D),!rP1(z).match(/br|hr|img|input/))Q.push({event:"stop",offset:D,node:z})}return D}(A,0),Q}function Sj6(A,Q,B){let J=0,D="",z=[];function Z(){if(!A.length||!Q.length)return A.length?A:Q;if(A[0].offset!==Q[0].offset)return A[0].offset<Q[0].offset?A:Q;return Q[0].event==="start"?A:Q}function X(q){function Y(F){return" "+F.nodeName+'="'+Jf(F.value)+'"'}D+="<"+rP1(q)+[].map.call(q.attributes,Y).join("")+">"}function K(q){D+="</"+rP1(q)+">"}function G(q){(q.event==="start"?X:K)(q.node)}while(A.length||Q.length){let q=Z();if(D+=Jf(B.substring(J,q[0].offset)),J=q[0].offset,q===A){z.reverse().forEach(K);do G(q.splice(0,1)[0]),q=Z();while(q===A&&q.length&&q[0].offset===J);z.reverse().forEach(X)}else{if(q[0].event==="start")z.push(q[0].node);else z.pop();G(q.splice(0,1)[0])}}return D+Jf(B.substr(J))}var _p0={},aP1=(A)=>{console.error(A)},Tp0=(A,...Q)=>{console.log(`WARN: ${A}`,...Q)},nG=(A,Q)=>{if(_p0[`${A}/${Q}`])return;console.log(`Deprecated as of ${A}. ${Q}`),_p0[`${A}/${Q}`]=!0},nP1=Jf,jp0=RC,Pp0=Symbol("nomatch"),vj6=function(A){let Q=Object.create(null),B=Object.create(null),J=[],D=!0,z=/(^(<[^>]+>|\t|)+|\n)/gm,Z="Could not find the language '{}', did you forget to load/include a language module?",X={disableAutodetect:!0,name:"Plain text",contains:[]},K={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:$p0};function G(t){return K.noHighlightRe.test(t)}function q(t){let D1=t.className+" ";D1+=t.parentNode?t.parentNode.className:"";let A1=K.languageDetectRe.exec(D1);if(A1){let K1=g(A1[1]);if(!K1)Tp0(Z.replace("{}",A1[1])),Tp0("Falling back to no-highlight mode for this block.",t);return K1?A1[1]:"no-highlight"}return D1.split(/\s+/).find((K1)=>G(K1)||g(K1))}function Y(t,D1,A1,K1){let X1="",N1="";if(typeof D1==="object")X1=t,A1=D1.ignoreIllegals,N1=D1.language,K1=void 0;else nG("10.7.0","highlight(lang, code, ...args) has been deprecated."),nG("10.7.0",`Please use highlight(code, options) instead.
|
6875
6875
|
https://github.com/highlightjs/highlight.js/issues/2277`),N1=t,X1=D1;let s={code:X1,language:N1};d("before:highlight",s);let r=s.result?s.result:F(s.language,s.code,A1,K1);return r.code=s.code,d("after:highlight",r),r}function F(t,D1,A1,K1){function X1(m1,H1){let l1=V1.case_insensitive?H1[0].toLowerCase():H1[0];return Object.prototype.hasOwnProperty.call(m1.keywords,l1)&&m1.keywords[l1]}function N1(){if(!J0.keywords){D0.addText(X0);return}let m1=0;J0.keywordPatternRe.lastIndex=0;let H1=J0.keywordPatternRe.exec(X0),l1="";while(H1){l1+=X0.substring(m1,H1.index);let L1=X1(J0,H1);if(L1){let[i1,o1]=L1;if(D0.addText(l1),l1="",u1+=o1,i1.startsWith("_"))l1+=H1[0];else{let q0=V1.classNameAliases[i1]||i1;D0.addKeyword(H1[0],q0)}}else l1+=H1[0];m1=J0.keywordPatternRe.lastIndex,H1=J0.keywordPatternRe.exec(X0)}l1+=X0.substr(m1),D0.addText(l1)}function s(){if(X0==="")return;let m1=null;if(typeof J0.subLanguage==="string"){if(!Q[J0.subLanguage]){D0.addText(X0);return}m1=F(J0.subLanguage,X0,!0,H0[J0.subLanguage]),H0[J0.subLanguage]=m1.top}else m1=w(X0,J0.subLanguage.length?J0.subLanguage:null);if(J0.relevance>0)u1+=m1.relevance;D0.addSublanguage(m1.emitter,m1.language)}function r(){if(J0.subLanguage!=null)s();else N1();X0=""}function e(m1){if(m1.className)D0.openNode(V1.classNameAliases[m1.className]||m1.className);return J0=Object.create(m1,{parent:{value:J0}}),J0}function G1(m1,H1,l1){let L1=sT6(m1.endRe,l1);if(L1){if(m1["on:end"]){let i1=new sP1(m1);if(m1["on:end"](H1,i1),i1.isMatchIgnored)L1=!1}if(L1){while(m1.endsParent&&m1.parent)m1=m1.parent;return m1}}if(m1.endsWithParent)return G1(m1.parent,H1,l1)}function q1(m1){if(J0.matcher.regexIndex===0)return X0+=m1[0],1;else return v1=!0,0}function Y1(m1){let H1=m1[0],l1=m1.rule,L1=new sP1(l1),i1=[l1.__beforeBegin,l1["on:begin"]];for(let o1 of i1){if(!o1)continue;if(o1(m1,L1),L1.isMatchIgnored)return q1(H1)}if(l1&&l1.endSameAsBegin)l1.endRe=dT6(H1);if(l1.skip)X0+=H1;else{if(l1.excludeBegin)X0+=H1;if(r(),!l1.returnBegin&&!l1.excludeBegin)X0=H1}return e(l1),l1.returnBegin?0:H1.length}function U1(m1){let H1=m1[0],l1=D1.substr(m1.index),L1=G1(J0,m1,l1);if(!L1)return Pp0;let i1=J0;if(i1.skip)X0+=H1;else{if(!(i1.returnEnd||i1.excludeEnd))X0+=H1;if(r(),i1.excludeEnd)X0=H1}do{if(J0.className)D0.closeNode();if(!J0.skip&&!J0.subLanguage)u1+=J0.relevance;J0=J0.parent}while(J0!==L1.parent);if(L1.starts){if(L1.endSameAsBegin)L1.starts.endRe=L1.endRe;e(L1.starts)}return i1.returnEnd?0:H1.length}function P1(){let m1=[];for(let H1=J0;H1!==V1;H1=H1.parent)if(H1.className)m1.unshift(H1.className);m1.forEach((H1)=>D0.openNode(H1))}let R1={};function T1(m1,H1){let l1=H1&&H1[0];if(X0+=m1,l1==null)return r(),0;if(R1.type==="begin"&&H1.type==="end"&&R1.index===H1.index&&l1===""){if(X0+=D1.slice(H1.index,H1.index+1),!D){let L1=new Error("0 width match regex");throw L1.languageName=t,L1.badRule=R1.rule,L1}return 1}if(R1=H1,H1.type==="begin")return Y1(H1);else if(H1.type==="illegal"&&!A1){let L1=new Error('Illegal lexeme "'+l1+'" for mode "'+(J0.className||"<unnamed>")+'"');throw L1.mode=J0,L1}else if(H1.type==="end"){let L1=U1(H1);if(L1!==Pp0)return L1}if(H1.type==="illegal"&&l1==="")return 1;if(p1>1e5&&p1>H1.index*3)throw new Error("potential infinite loop, way more iterations than matches");return X0+=l1,l1.length}let V1=g(t);if(!V1)throw aP1(Z.replace("{}",t)),new Error('Unknown language: "'+t+'"');let I1=Rj6(V1,{plugins:J}),t1="",J0=K1||I1,H0={},D0=new K.__emitter(K);P1();let X0="",u1=0,M1=0,p1=0,v1=!1;try{J0.matcher.considerAll();for(;;){if(p1++,v1)v1=!1;else J0.matcher.considerAll();J0.matcher.lastIndex=M1;let m1=J0.matcher.exec(D1);if(!m1)break;let H1=D1.substring(M1,m1.index),l1=T1(H1,m1);M1=m1.index+l1}return T1(D1.substr(M1)),D0.closeAllNodes(),D0.finalize(),t1=D0.toHTML(),{relevance:Math.floor(u1),value:t1,language:t,illegal:!1,emitter:D0,top:J0}}catch(m1){if(m1.message&&m1.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:m1.message,context:D1.slice(M1-100,M1+100),mode:m1.mode},sofar:t1,relevance:0,value:nP1(D1),emitter:D0};else if(D)return{illegal:!1,relevance:0,value:nP1(D1),emitter:D0,language:t,top:J0,errorRaised:m1};else throw m1}}function E(t){let D1={relevance:0,emitter:new K.__emitter(K),value:nP1(t),illegal:!1,top:X};return D1.emitter.addText(t),D1}function w(t,D1){D1=D1||K.languages||Object.keys(Q);let A1=E(t),K1=D1.filter(g).filter(u).map((e)=>F(e,t,!1));K1.unshift(A1);let X1=K1.sort((e,G1)=>{if(e.relevance!==G1.relevance)return G1.relevance-e.relevance;if(e.language&&G1.language){if(g(e.language).supersetOf===G1.language)return 1;else if(g(G1.language).supersetOf===e.language)return-1}return 0}),[N1,s]=X1,r=N1;return r.second_best=s,r}function H(t){if(!(K.tabReplace||K.useBR))return t;return t.replace(z,(D1)=>{if(D1===`
|
6876
6876
|
`)return K.useBR?"<br>":D1;else if(K.tabReplace)return D1.replace(/\t/g,K.tabReplace);return D1})}function M(t,D1,A1){let K1=D1?B[D1]:A1;if(t.classList.add("hljs"),K1)t.classList.add(K1)}let W={"before:highlightElement":({el:t})=>{if(K.useBR)t.innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,`
|
@@ -7127,12 +7127,11 @@ This tool is useful for:
|
|
7127
7127
|
- If the user makes a request that doesn't specify anything about the revisions to diff, assume they want the current staged and unstaged working changes (from \`git diff HEAD\`)
|
7128
7128
|
`,inputSchema:{type:"object",properties:{includeUntracked:{type:"boolean",description:"Whether to include untracked files in the analysis. Defaults to true.",default:!0},gitDiffCommand:{type:"string",description:'The git diff command to execute (e.g., "git diff --cached").'}},required:["gitDiffCommand"]},source:"builtin"},fn:Promise.resolve().then(() => (ou0(),ru0)).then(({nodeGitDiffSummaryTool:A})=>A)};uV();A91();AK();OE();var xP1={spec:{name:"commit_attribution",description:`Creates a git commit with Amp thread attribution trailers.
|
7129
7129
|
|
7130
|
-
This tool commits changes with git commit trailers that link the commit back to the Amp thread where it was created.
|
7130
|
+
This tool commits changes with git commit trailers that link the commit back to the Amp thread where it was created and marks Amp as a co-author.
|
7131
7131
|
|
7132
7132
|
## Parameters
|
7133
7133
|
|
7134
7134
|
- \`message\` (required): The commit message
|
7135
|
-
- \`threadId\` (optional): The Amp thread ID to attribute this commit to. If not provided, automatically determined from the current thread context.
|
7136
7135
|
- \`threadUrl\` (optional): The URL of the Amp thread. If not provided, automatically determined from the Amp configuration.
|
7137
7136
|
- \`addAll\` (optional): Whether to add all modified files before committing (equivalent to git add -A). Defaults to false.
|
7138
7137
|
- \`files\` (optional): Specific files to add before committing. If neither addAll nor files are specified, commits only staged changes.
|
@@ -7140,17 +7139,16 @@ This tool commits changes with git commit trailers that link the commit back to
|
|
7140
7139
|
## Trailers Added
|
7141
7140
|
|
7142
7141
|
The tool automatically adds these git commit trailers:
|
7143
|
-
- \`Amp-Thread
|
7144
|
-
- \`
|
7142
|
+
- \`Amp-Thread: <threadUrl>\` (automatically determined from Amp configuration or provided threadUrl)
|
7143
|
+
- \`Co-authored-by: Amp <amp@ampcode.com>\` (marks Amp as co-author of the commit)
|
7145
7144
|
|
7146
7145
|
## Examples
|
7147
7146
|
|
7148
7147
|
- Basic commit with automatic thread attribution: { message: "Fix authentication bug" }
|
7149
7148
|
- Commit all changes: { message: "Refactor components", addAll: true }
|
7150
7149
|
- Commit specific files: { message: "Update styles", files: ["src/styles.css", "src/components/Button.tsx"] }
|
7151
|
-
- Commit with custom thread ID override: { message: "Add new feature", threadId: "T-12049593-b965-47f6-9c7f-def3cbc37ebe" }
|
7152
7150
|
- Commit with custom thread URL: { message: "Deploy fix", threadUrl: "https://custom.ampcode.com/threads/T-12049593-b965-47f6-9c7f-def3cbc37ebe" }
|
7153
|
-
`,inputSchema:{type:"object",properties:{message:{type:"string",description:"The commit message"},
|
7151
|
+
`,inputSchema:{type:"object",properties:{message:{type:"string",description:"The commit message"},threadUrl:{type:"string",description:"The URL of the Amp thread (optional)"},addAll:{type:"boolean",description:"Whether to add all modified files before committing (git add -A)",default:!1},files:{type:"array",items:{type:"string"},description:"Specific files to add before committing"}},required:["message"]},source:"builtin"},fn:Promise.resolve().then(() => (Ap0(),eu0)).then(({nodeCommitAttributionTool:A})=>A)};var Xp0={spec:{name:"run_javascript",description:`Execute a JavaScript script using Node.js.
|
7154
7152
|
|
7155
7153
|
This tool allows you to run JavaScript code directly in a sandboxed Node.js environment.
|
7156
7154
|
|
@@ -7341,7 +7339,7 @@ Please report this to https://github.com/markedjs/marked.`,A){let J="<p>An error
|
|
7341
7339
|
`)}function mv1(A){return{public:A==="public",private:A==="private"}}$2();import{readlinkSync as _p6,fstatSync as Tp6,openSync as jp6}from"node:fs";import WAA from"node:tty";class ol extends Error{cause;constructor(A,Q){super(A);this.cause=Q;this.name="StdinReadError"}}async function IAA(){let A=jp6("/dev/tty","r");if(!WAA.isatty(A))throw new ol("/dev/tty is not a a TTY device");return new WAA.ReadStream(A)}async function Pp6(A={}){let{maxSizeBytes:Q=1048576,timeoutMs:B=30000}=A;if(process.stdin.isTTY)return{content:"",truncated:!1,timedOut:!1,bytesRead:0};try{if(Tp6(process.stdin.fd).isCharacterDevice()){let D=`/proc/self/fd/${process.stdin.fd}`;try{let z=_p6(D);if(z==="/dev/zero")return k1.warn("Detected /dev/zero input, returning empty content to avoid infinite read"),{content:"",truncated:!1,timedOut:!1,bytesRead:0};if(z==="/dev/random"||z==="/dev/urandom")throw new ol(`Refusing to read from special device: ${z}. This would cause infinite data consumption.`)}catch{}}}catch{}return new Promise((J,D)=>{let z="",Z=0,X=!1,K=!1,G=null,q=()=>{if(G)clearTimeout(G),G=null;process.stdin.removeAllListeners("data"),process.stdin.removeAllListeners("end"),process.stdin.removeAllListeners("error")},Y=()=>{q(),J({content:z,truncated:X,timedOut:K,bytesRead:Z})};G=setTimeout(()=>{K=!0,Y()},B),process.stdin.once("error",(F)=>{q(),D(new ol("Failed to read from stdin",F))}),process.stdin.once("end",()=>{Y()}),process.stdin.on("data",(F)=>{let E=F.length;if(Z+E>Q){let w=Q-Z;if(w>0)z+=F.subarray(0,w).toString("utf8"),Z=Q;X=!0,Y();return}z+=F.toString("utf8"),Z+=E}),process.stdin.resume()})}async function NAA(){let A=await Pp6();if(A.timedOut)throw new ol("Timeout while reading from stdin");if(A.truncated)k1.warn(`Warning: stdin input was truncated at ${A.bytesRead} bytes`);return A.content}$2();D2();import Of from"node:fs/promises";import{homedir as OAA}from"node:os";import yC from"node:path";import Sp6 from"os";import o41 from"path";var kC=Sp6.homedir(),{env:f3}=process,Vf=f3.XDG_DATA_HOME||(kC?o41.join(kC,".local","share"):void 0),r41=f3.XDG_CONFIG_HOME||(kC?o41.join(kC,".config"):void 0),CAA=f3.XDG_STATE_HOME||(kC?o41.join(kC,".local","state"):void 0),VAA=f3.XDG_CACHE_HOME||(kC?o41.join(kC,".cache"):void 0),dl2=f3.XDG_RUNTIME_DIR||void 0,vp6=(f3.XDG_DATA_DIRS||"/usr/local/share/:/usr/share/").split(":");if(Vf)vp6.unshift(Vf);var $p6=(f3.XDG_CONFIG_DIRS||"/etc/xdg").split(":");if(r41)$p6.unshift(r41);var RAA=yC.join(Vf||yC.join(OAA(),".local/share"),"amp"),jE=yC.join(r41||yC.join(OAA(),".config"),"amp","settings.json"),uv1="secrets.json",t41=yC.join(RAA,uv1);function pv1(A){let Q=A?.settingsFile??jE,B=new C8,J;async function D(){try{let X=yC.dirname(Q);await Of.mkdir(X,{recursive:!0})}catch(X){throw k1.error(`Failed to create config directory: ${X}`),X}}async function z(){if(J)return J;try{await D();let X=await Of.readFile(Q,"utf-8"),K;try{K=JSON.parse(X)}catch(q){throw new Error(`Invalid JSON in settings file: ${Q}`)}let G={};for(let[q,Y]of Object.entries(K))if(q.startsWith("amp.")){let F=q.substring(4);G[F]=Y}return J=G,G}catch(X){if(X.code==="ENOENT")return J={},J;throw k1.error(`Failed to read settings: ${X}`),X}}async function Z(X){try{await D();let K={};for(let[G,q]of Object.entries(X))K[`amp.${G}`]=q;await Of.writeFile(Q,JSON.stringify(K,null,2),"utf-8"),J=X}catch(K){throw k1.error(`Failed to write settings: ${K}`),K}}return{async get(X){return(await z())[X]},async set(X,K,G){if(G==="workspace")throw new Error(`Unsupported target: ${G}`);let q=await z();q[X]=K,await Z(q),B.next([X])},async delete(X,K){if(K==="workspace")throw new Error(`Unsupported target: ${K}`);let G=await z();delete G[X],await Z(G),B.next([X])},async keys(){let X=await z();return Object.keys(X)},changes:B}}function tl(A){let Q=A?.dataDir||RAA,B=new C8,J;async function D(){try{await Of.mkdir(Q,{recursive:!0})}catch(X){throw k1.error(`Failed to create data directory: ${X}`),X}}async function z(){if(J)return J;try{await D();let X=A?.dataDir?yC.join(Q,uv1):t41,K=await Of.readFile(X,"utf-8");return J=JSON.parse(K),J}catch(X){if(X.code==="ENOENT")return J={},J;throw k1.error(`Failed to read secrets: ${X}`),X}}async function Z(X){try{await D();let K=A?.dataDir?yC.join(Q,uv1):t41;await Of.writeFile(K,JSON.stringify(X,null,2),"utf-8"),J=X}catch(K){throw k1.error(`Failed to write secrets: ${K}`),K}}return{async get(X,K){return(await z())[`${X}@${K}`]},async set(X,K,G){let q=`${X}@${G}`,Y=await z();Y[q]=K,await Z(Y),B.next(q)},changes:B}}DO();Wg();import{arch as fp6,cpus as kp6,freemem as yp6,platform as gp6,release as bp6,totalmem as xp6}from"node:os";import{promises as hp6}from"node:fs";class cv1{async collect(){let A=kp6(),Q=xp6(),B=yp6(),J={platform:gp6(),version:bp6(),architecture:fp6(),memory:{total:Q,free:B,used:Q-B},cpu:{model:A[0]?.model||"Unknown",cores:A.length,speed:A[0]?.speed||0},node:{version:process.version,execPath:process.execPath}};try{let D=await this.getDiskSpace();if(D)J.diskSpace=D}catch{}return J}async getDiskSpace(){try{let A=await hp6.statfs(".");return{free:A.bavail*A.bsize,total:A.blocks*A.bsize}}catch{return null}}}import{execFile as mp6}from"node:child_process";import{promises as gC}from"node:fs";import{homedir as lv1}from"node:os";import{join as BU}from"node:path";import{promisify as up6}from"node:util";var Rf=up6(mp6);class dv1{async collect(){let[A,Q,B,J,D]=await Promise.all([this.collectInstallationInfo(),this.collectEnvironmentInfo(),this.collectConfigInfo(),this.collectCliTestInfo(),this.collectLogsInfo()]);return{installation:A,environment:Q,config:B,logs:D,cliTest:J}}async collectInstallationInfo(){let A={installMethod:"unknown",packageManager:"unknown"};try{A.cliVersion=await this.getCliVersion()}catch{}try{A.installMethod=await this.detectInstallMethod()}catch{}try{A.packageManager=await this.detectPackageManager()}catch{}try{A.executablePath=process.execPath}catch{}return A}async collectEnvironmentInfo(){let A={};for(let[Q,B]of Object.entries(process.env))if(Q.startsWith("AMP_")&&B!==void 0)A[Q]=B;return{variables:A}}async collectConfigInfo(){let A={};try{let Q=this.getSettingsPath(),B=await gC.readFile(Q,"utf8");A.settings=JSON.parse(B)}catch(Q){A.configError=Q instanceof Error?Q.message:String(Q)}try{let Q=this.getSecretsPath(),B=await gC.readFile(Q,"utf8");A.secrets=JSON.parse(B)}catch(Q){A.secretsError=Q instanceof Error?Q.message:String(Q)}return A}async collectCliTestInfo(){let A=new Date().toISOString();try{await Rf("which",["amp"],{timeout:5000})}catch{return{executedAt:A,initialTest:{command:`echo "what is today's date" | amp`,stdout:"",stderr:"",exitCode:127,error:"amp command not found in PATH"},additionalTests:[]}}let Q=await this.runCliCommand(`echo "what is today's date" | amp`),B=[];if(Q.exitCode===0){let J=["amp threads list","amp tools show"];for(let D of J){let z=await this.runCliCommand(D);B.push(z)}}return{executedAt:A,initialTest:Q,additionalTests:B}}async runCliCommand(A){let Q={command:A,stdout:"",stderr:"",exitCode:-1};try{let{spawn:B}=await import("node:child_process");return new Promise((J)=>{let D=B("sh",["-c",A],{stdio:["pipe","pipe","pipe"],timeout:30000}),z="",Z="";D.stdout?.on("data",(X)=>{z+=X.toString()}),D.stderr?.on("data",(X)=>{Z+=X.toString()}),D.on("close",(X)=>{Q.stdout=z,Q.stderr=Z,Q.exitCode=X??-1,J(Q)}),D.on("error",(X)=>{Q.error=X.message,Q.exitCode=-1,J(Q)}),setTimeout(()=>{D.kill("SIGTERM"),Q.error="Command timed out after 30 seconds",Q.exitCode=-1,J(Q)},30000)})}catch(B){return Q.error=B instanceof Error?B.message:String(B),Q.exitCode=-1,Q}}async collectLogsInfo(){let A={recentLogs:[]};try{let Q=this.getLogPath(),J=(await gC.readFile(Q,"utf8")).split(`
|
7342
7340
|
`).filter((D)=>D.trim());A.recentLogs=J.slice(-1000)}catch(Q){A.logError=Q instanceof Error?Q.message:String(Q)}return A}async getCliVersion(){try{let{stdout:A}=await Rf("npm",["list","-g","@sourcegraph/amp","--depth=0","--json"],{timeout:5000}),B=JSON.parse(A).dependencies?.["@sourcegraph/amp"];if(B?.version)return B.version}catch{}try{let A=BU(process.cwd(),"node_modules","@sourcegraph","amp","package.json"),Q=await gC.readFile(A,"utf8"),B=JSON.parse(Q);if(B.version)return B.version}catch{}try{let{stdout:A}=await Rf("pnpm",["list","-g","@sourcegraph/amp","--depth=0","--json"],{timeout:5000}),Q=JSON.parse(A),B=Array.isArray(Q)?Q:[Q];for(let J of B){let D=J.dependencies?.["@sourcegraph/amp"];if(D?.version)return D.version}}catch{}try{let{stdout:A}=await Rf("yarn",["global","list","--pattern","@sourcegraph/amp","--json"],{timeout:5000}),Q=A.split(`
|
7343
7341
|
`).filter((B)=>B.trim());for(let B of Q)try{let J=JSON.parse(B);if(J.type==="info"&&J.data&&typeof J.data==="string"){let D=J.data.match(/"@sourcegraph\/amp@(.+?)"/);if(D?.[1])return D[1]}}catch{}}catch{}try{let{stdout:A}=await Rf("amp",["--version"],{timeout:5000}),Q=A.trim().match(/(\d+\.\d+\.\d+[\w\-.]*)/g);if(Q?.[0])return Q[0]}catch{}return}async detectInstallMethod(){try{return await Rf("npm",["list","-g","@sourcegraph/amp"],{timeout:5000}),"global"}catch{}try{let A=BU(process.cwd(),"node_modules","@sourcegraph","amp");return await gC.access(A),"local"}catch{}if(process.argv[0]?.includes("npx")||process.env.npm_execpath?.includes("npx"))return"npx";return"unknown"}async detectPackageManager(){try{return await gC.access(BU(process.cwd(),"pnpm-lock.yaml")),"pnpm"}catch{}try{return await gC.access(BU(process.cwd(),"yarn.lock")),"yarn"}catch{}try{return await gC.access(BU(process.cwd(),"package-lock.json")),"npm"}catch{}return"unknown"}getSettingsPath(){let A=process.env.XDG_CONFIG_HOME||BU(lv1(),".config");return BU(A,"amp","settings.json")}getSecretsPath(){let A=process.env.XDG_DATA_HOME||BU(lv1(),".local","share");return BU(A,"amp","secrets.json")}getLogPath(){let A=process.env.XDG_CACHE_HOME||BU(lv1(),".cache");return BU(A,"amp","logs","cli.log")}}import{lookup as pp6}from"node:dns";import{promisify as cp6}from"node:util";var lp6=cp6(pp6);class iv1{testUrls=["https://ampcode.com","https://sourcegraph.com","https://ampcodestatus.com"];testDomains=["ampcode.com","sourcegraph.com","ampcodestatus.com","github.com"];async collect(){let[A,Q]=await Promise.all([this.runConnectivityTests(),this.runDnsTests()]);return{connectivity:A,dns:Q,proxy:this.detectProxy(),timestamp:new Date().toISOString()}}async runConnectivityTests(){return(await Promise.allSettled(this.testUrls.map((Q)=>this.testConnectivity(Q)))).map((Q,B)=>{if(Q.status==="fulfilled")return Q.value;else return{url:this.testUrls[B],success:!1,responseTime:0,error:Q.reason instanceof Error?Q.reason.message:String(Q.reason)}})}async runDnsTests(){return(await Promise.allSettled(this.testDomains.map((Q)=>this.testDnsResolution(Q)))).map((Q,B)=>{if(Q.status==="fulfilled")return Q.value;else return{domain:this.testDomains[B],success:!1,responseTime:0,error:Q.reason instanceof Error?Q.reason.message:String(Q.reason)}})}async testConnectivity(A){let Q=Date.now();try{let B=new AbortController,J=setTimeout(()=>B.abort(),1e4),D=await fetch(A,{method:"HEAD",signal:B.signal});clearTimeout(J);let z=Date.now()-Q,Z={};return D.headers.forEach((X,K)=>{Z[K]=X}),{url:A,success:D.ok,status:D.status,statusText:D.statusText,responseTime:z,headers:Z}}catch(B){let J=Date.now()-Q;return{url:A,success:!1,responseTime:J,error:B instanceof Error?B.message:String(B)}}}async testDnsResolution(A){let Q=Date.now();try{let B=await lp6(A,{all:!0}),J=Date.now()-Q;return{domain:A,success:!0,addresses:B.map((D)=>D.address),responseTime:J}}catch(B){let J=Date.now()-Q;return{domain:A,success:!1,responseTime:J,error:B instanceof Error?B.message:String(B)}}}detectProxy(){let A={detected:!1},Q=process.env.HTTP_PROXY||process.env.http_proxy,B=process.env.HTTPS_PROXY||process.env.https_proxy,J=process.env.NO_PROXY||process.env.no_proxy,D=process.env.NODE_EXTRA_CA_CERTS;if(Q||B||D)A.httpProxy=Q,A.httpsProxy=B,A.noProxy=J,A.nodeExtraCaCerts=D,A.detected=!0;return A}}import{execFile as dp6}from"node:child_process";import{promises as e41}from"node:fs";import{platform as LAA}from"node:os";import{promisify as ip6}from"node:util";var av1=ip6(dp6);class nv1{testUrls=["https://ampcode.com","https://sourcegraph.com"];async collect(){let[A,Q]=await Promise.all([this.collectTrustedCertificates(),this.testCertificateChains()]);return{trustedCertificates:A,certificateTests:Q,platform:LAA(),timestamp:new Date().toISOString()}}async collectTrustedCertificates(){let A={count:0,sources:[],sampleCertificates:[]};try{let Q=LAA();switch(Q){case"darwin":await this.collectMacOSCertificates(A);break;case"win32":await this.collectWindowsCertificates(A);break;case"linux":await this.collectLinuxCertificates(A);break;default:A.error=`Unsupported platform: ${Q}`}}catch(Q){A.error=Q instanceof Error?Q.message:String(Q)}return A}async testCertificateChains(){return(await Promise.allSettled(this.testUrls.map((Q)=>this.testCertificateChain(Q)))).map((Q,B)=>{if(Q.status==="fulfilled")return Q.value;else return{url:this.testUrls[B],success:!1,error:Q.reason instanceof Error?Q.reason.message:String(Q.reason)}})}async collectMacOSCertificates(A){try{let{stdout:Q}=await av1("security",["find-certificate","-a","-p","/System/Library/Keychains/SystemRootCertificates.keychain"],{timeout:1e4}),B=this.parsePEMCertificates(Q);A.count=B.length,A.sources.push("/System/Library/Keychains/SystemRootCertificates.keychain"),A.sampleCertificates=B.slice(0,3);try{let{stdout:J}=await av1("security",["find-certificate","-a","-p","login.keychain"],{timeout:5000}),D=this.parsePEMCertificates(J);if(D.length>0)A.count+=D.length,A.sources.push("login.keychain"),A.sampleCertificates.push(...D.slice(0,2))}catch{}}catch(Q){throw new Error(`Failed to collect macOS certificates: ${Q instanceof Error?Q.message:String(Q)}`)}}async collectWindowsCertificates(A){try{let{stdout:Q}=await av1("powershell",["-Command","Get-ChildItem -Path Cert:\\LocalMachine\\Root | Select-Object Subject, Issuer, SerialNumber, NotBefore, NotAfter, Thumbprint | ConvertTo-Json"],{timeout:1e4}),B=JSON.parse(Q),J=Array.isArray(B)?B:[B];A.count=J.length,A.sources.push("Cert:\\LocalMachine\\Root"),A.sampleCertificates=J.slice(0,3).map((D)=>({subject:D.Subject,issuer:D.Issuer,serialNumber:D.SerialNumber,notBefore:D.NotBefore,notAfter:D.NotAfter,fingerprint:D.Thumbprint}))}catch(Q){throw new Error(`Failed to collect Windows certificates: ${Q instanceof Error?Q.message:String(Q)}`)}}async collectLinuxCertificates(A){let Q=["/etc/ssl/certs","/usr/local/share/ca-certificates","/etc/pki/tls/certs","/etc/ssl/ca-bundle.pem"],B=0,J=[],D=[];for(let z of Q)try{let Z=await e41.stat(z);if(Z.isDirectory()){let K=(await e41.readdir(z)).filter((G)=>G.endsWith(".crt")||G.endsWith(".pem"));if(K.length>0){if(B+=K.length,J.push(z),D.length<3)try{let G=await e41.readFile(`${z}/${K[0]}`,"utf8"),q=this.parsePEMCertificates(G);D.push(...q.slice(0,1))}catch{}}}else if(Z.isFile()){let X=await e41.readFile(z,"utf8"),K=this.parsePEMCertificates(X);if(K.length>0)B+=K.length,J.push(z),D.push(...K.slice(0,2))}}catch{}if(A.count=B,A.sources=J,A.sampleCertificates=D.slice(0,3),B===0)throw new Error("No certificate sources found")}async testCertificateChain(A){try{let Q=new URL(A),B=await import("node:https");return new Promise((J,D)=>{let z=B.request({hostname:Q.hostname,port:Q.port||443,method:"HEAD",timeout:1e4},(Z)=>{if(process.versions.bun)return J({url:A,success:!1,error:"The binary version of Amp does not support certificate testing"});let X=Z.socket,K=X.getPeerCertificate(!0),G=X.getCipher();if(K&&Object.keys(K).length>0){let q=this.extractCertificateChain(K);J({url:A,success:!0,certificates:q,tlsVersion:X.getProtocol(),cipherSuite:G?`${G.name} (${G.version})`:void 0})}else J({url:A,success:!1,error:"No certificate information available"})});z.on("error",(Z)=>{J({url:A,success:!1,error:Z.message})}),z.on("timeout",()=>{z.destroy(),J({url:A,success:!1,error:"Connection timeout"})}),z.end()})}catch(Q){return{url:A,success:!1,error:Q instanceof Error?Q.message:String(Q)}}}parsePEMCertificates(A){let Q=[],B=/-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----/g,J=A.match(B);if(J)for(let D of J.slice(0,5))try{let z=D.split(`
|
7344
|
-
`),Z={subject:"Unknown",issuer:"Unknown"};for(let X of z){if(X.includes("Subject:"))Z.subject=X.split("Subject:")[1]?.trim()||"Unknown";if(X.includes("Issuer:"))Z.issuer=X.split("Issuer:")[1]?.trim()||"Unknown"}Q.push(Z)}catch{}return Q}extractCertificateChain(A){let Q=[],B=A;while(B&&Q.length<10)if(Q.push({subject:B.subject?.CN||B.subject?.O||"Unknown",issuer:B.issuer?.CN||B.issuer?.O||"Unknown",serialNumber:B.serialNumber,notBefore:B.valid_from,notAfter:B.valid_to,fingerprint:B.fingerprint}),B=B.issuerCertificate,B===A)break;return Q}}import{createWriteStream as ap6}from"node:fs";import{join as np6}from"node:path";import{pipeline as sp6}from"node:stream/promises";import{createGzip as rp6}from"node:zlib";SP1();class A51{systemCollector=new cv1;ampCollector=new dv1;networkCollector=new iv1;sslCollector=new nv1;async generate(A={}){let Q=new Date().toISOString().replace(/[:.]/g,"-"),B=A.outputDir||process.cwd(),J=await this.collectData(),D=o$(J),z=np6(B,`amp-support-bundle-${Q}.json.gz`);return await this.createBundle(D,z),z}async collectData(){let[A,Q,B,J]=await Promise.all([this.systemCollector.collect(),this.ampCollector.collect(),this.networkCollector.collect(),this.sslCollector.collect()]);return{systemInfo:A,ampInfo:Q,networkDiagnostics:B,sslCertificates:J,timestamp:new Date().toISOString(),metadata:{generatedAt:new Date().toISOString(),generatedBy:"amp-doctor",redacted:!0}}}async createBundle(A,Q){let B=JSON.stringify(A,null,2),J=ap6(Q),D=rp6();await sp6(async function*(){yield B},D,J)}}aF1();$2();var l3=G6(f9A(),1);import as6 from"node:fs";import{homedir as ns6}from"node:os";import P51 from"node:path";var k9A=Object.keys(k1);function Cd(A){let Q=P51.join(VAA||P51.join(ns6(),".cache"),"amp","logs"),B=A?.logFile||P51.join(Q,"cli.log"),J=A?.logLevel||"info";if(!k9A.includes(J))console.warn(`Invalid log level: ${J}. Using 'info' instead.`);try{as6.mkdirSync(P51.dirname(B),{recursive:!0})}catch(z){console.error(`Failed to create log directory: ${z}`)}let D=l3.default.createLogger({level:k9A.includes(J)?J:"info",format:l3.default.format.combine(l3.default.format.timestamp(),l3.default.format.json(),l3.default.format.errors({stack:!0})),transports:[new l3.default.transports.File({filename:B})]});kx1({error:D.error.bind(D),warn:D.warn.bind(D),info:D.info.bind(D),debug:D.debug.bind(D),audit:(z,...Z)=>D.info(z,{audit:!0,...Z[0]})})}var y9A={url:{value:"https://ampcode.com",visible:!1,description:"The Amp server URL to connect to"},"anthropic.thinking.enabled":{value:!1,visible:!1,description:"Enable Claude thinking process output for debugging"},"anthropic.temperature":{value:1,visible:!1,description:"Temperature setting for Anthropic models (0.0 = deterministic, 1.0 = creative). Note: Only takes effect when thinking is disabled. Internal use only."},"notifications.enabled":{value:!0,visible:!0,description:"Enable system sound notifications when agent completes tasks"},"todos.enabled":{value:!0,visible:!1,description:"Enable TODO tracking and management features"},mcpServers:{value:{filesystem:{command:"npx",args:["@modelcontextprotocol/server-filesystem","/path/to/allowed/dir"]}},visible:!0,description:"Model Context Protocol servers to connect to for additional tools"},"tools.disable":{value:["browser_navigate","builtin:edit_file"],visible:!0,description:"Array of tool names to disable. Use 'builtin:toolname' to disable only the builtin tool with that name (allowing an MCP server to provide a tool by that name)."},"tools.stopTimeout":{value:300,visible:!1,description:"Timeout for stopping tools"},"commands.allowlist":{value:["git status","ls -la","npm run build"],visible:!0,description:"Array of shell commands that can be executed without confirmation"},"commands.strict":{value:!1,visible:!0,description:"Enable strict command validation. When disabled, certain commands like Bazel get relaxed path validation."},dangerouslyAllowAll:{value:!1,visible:!0,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},submitOnEnter:{value:!0,visible:!1,description:"Whether to submit messages on Enter (true) or require Ctrl+Enter (false)"},"terminal.commands.environment":{value:"vscode-terminal",visible:!1,description:"Terminal environment for executing commands (vscode-terminal or node-spawn)"},"terminal.commands.hide":{value:!1,visible:!1,description:"Hide terminal command output from the user"},"terminal.commands.vscodeTerminal.detachTimeout":{value:90,visible:!1,description:"Timeout for detaching from a terminal in milliseconds"},"terminal.commands.vscodeTerminal.shellPath":{value:void 0,visible:!1,description:"Path to the shell to use in vscode-terminal mode"},"terminal.commands.vscodeTerminal.shellArgs":{value:void 0,visible:!1,description:"Arguments to pass to the custom shell in vscode-terminal mode. Only used when terminal.commands.vscodeTerminal.shellPath is set"},"terminal.commands.nodeSpawn.loadProfile":{value:"daily",visible:!1,description:"How often to load shell profile in node-spawn mode (always, daily, never)"},"terminal.commands.nodeSpawn.detachedLogsDirectory":{value:void 0,visible:!1,description:"Directory to store detached logs in node-spawn mode"},"tab.enabled":{value:!0,visible:!1,description:"Enable tab completion features"},"tab.disabledLanguages":{value:[],visible:!1,description:"List of language IDs for which tab completion is disabled"},"tab.disableOnComment":{value:!1,visible:!1,description:"Dsiable tab completion on comment lines"},"tab.autoImport.enabled":{value:!1,visible:!1,description:"Enable auto-import feature for tab completion"},"tab.verboseLogs":{value:!1,visible:!1,description:"Enable verbose logging for tab completion"},debugLogs:{value:!1,visible:!1,description:"Enable debug logging output"},hooks:{value:[],visible:!1,description:"Custom hooks for extending Amp functionality"},"gemini.enabled":{value:!1,visible:!1,description:"Whether to use Gemini 2.5 pro as the primary model"},"vertexai.enabled":{value:!1,visible:!1,description:"Whether to use Vertex AI for Anthropic Claude inference"},"experimental.run_javascript.enabled":{value:!1,visible:!1,description:"Whether to enable the experimental run_javascript tool"},"
|
7342
|
+
`),Z={subject:"Unknown",issuer:"Unknown"};for(let X of z){if(X.includes("Subject:"))Z.subject=X.split("Subject:")[1]?.trim()||"Unknown";if(X.includes("Issuer:"))Z.issuer=X.split("Issuer:")[1]?.trim()||"Unknown"}Q.push(Z)}catch{}return Q}extractCertificateChain(A){let Q=[],B=A;while(B&&Q.length<10)if(Q.push({subject:B.subject?.CN||B.subject?.O||"Unknown",issuer:B.issuer?.CN||B.issuer?.O||"Unknown",serialNumber:B.serialNumber,notBefore:B.valid_from,notAfter:B.valid_to,fingerprint:B.fingerprint}),B=B.issuerCertificate,B===A)break;return Q}}import{createWriteStream as ap6}from"node:fs";import{join as np6}from"node:path";import{pipeline as sp6}from"node:stream/promises";import{createGzip as rp6}from"node:zlib";SP1();class A51{systemCollector=new cv1;ampCollector=new dv1;networkCollector=new iv1;sslCollector=new nv1;async generate(A={}){let Q=new Date().toISOString().replace(/[:.]/g,"-"),B=A.outputDir||process.cwd(),J=await this.collectData(),D=o$(J),z=np6(B,`amp-support-bundle-${Q}.json.gz`);return await this.createBundle(D,z),z}async collectData(){let[A,Q,B,J]=await Promise.all([this.systemCollector.collect(),this.ampCollector.collect(),this.networkCollector.collect(),this.sslCollector.collect()]);return{systemInfo:A,ampInfo:Q,networkDiagnostics:B,sslCertificates:J,timestamp:new Date().toISOString(),metadata:{generatedAt:new Date().toISOString(),generatedBy:"amp-doctor",redacted:!0}}}async createBundle(A,Q){let B=JSON.stringify(A,null,2),J=ap6(Q),D=rp6();await sp6(async function*(){yield B},D,J)}}aF1();$2();var l3=G6(f9A(),1);import as6 from"node:fs";import{homedir as ns6}from"node:os";import P51 from"node:path";var k9A=Object.keys(k1);function Cd(A){let Q=P51.join(VAA||P51.join(ns6(),".cache"),"amp","logs"),B=A?.logFile||P51.join(Q,"cli.log"),J=A?.logLevel||"info";if(!k9A.includes(J))console.warn(`Invalid log level: ${J}. Using 'info' instead.`);try{as6.mkdirSync(P51.dirname(B),{recursive:!0})}catch(z){console.error(`Failed to create log directory: ${z}`)}let D=l3.default.createLogger({level:k9A.includes(J)?J:"info",format:l3.default.format.combine(l3.default.format.timestamp(),l3.default.format.json(),l3.default.format.errors({stack:!0})),transports:[new l3.default.transports.File({filename:B})]});kx1({error:D.error.bind(D),warn:D.warn.bind(D),info:D.info.bind(D),debug:D.debug.bind(D),audit:(z,...Z)=>D.info(z,{audit:!0,...Z[0]})})}var y9A={url:{value:"https://ampcode.com",visible:!1,description:"The Amp server URL to connect to"},"anthropic.thinking.enabled":{value:!1,visible:!1,description:"Enable Claude thinking process output for debugging"},"anthropic.temperature":{value:1,visible:!1,description:"Temperature setting for Anthropic models (0.0 = deterministic, 1.0 = creative). Note: Only takes effect when thinking is disabled. Internal use only."},"notifications.enabled":{value:!0,visible:!0,description:"Enable system sound notifications when agent completes tasks"},"todos.enabled":{value:!0,visible:!1,description:"Enable TODO tracking and management features"},mcpServers:{value:{filesystem:{command:"npx",args:["@modelcontextprotocol/server-filesystem","/path/to/allowed/dir"]}},visible:!0,description:"Model Context Protocol servers to connect to for additional tools"},"tools.disable":{value:["browser_navigate","builtin:edit_file"],visible:!0,description:"Array of tool names to disable. Use 'builtin:toolname' to disable only the builtin tool with that name (allowing an MCP server to provide a tool by that name)."},"tools.stopTimeout":{value:300,visible:!1,description:"Timeout for stopping tools"},"commands.allowlist":{value:["git status","ls -la","npm run build"],visible:!0,description:"Array of shell commands that can be executed without confirmation"},"commands.strict":{value:!1,visible:!0,description:"Enable strict command validation. When disabled, certain commands like Bazel get relaxed path validation."},dangerouslyAllowAll:{value:!1,visible:!0,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},submitOnEnter:{value:!0,visible:!1,description:"Whether to submit messages on Enter (true) or require Ctrl+Enter (false)"},"terminal.commands.environment":{value:"vscode-terminal",visible:!1,description:"Terminal environment for executing commands (vscode-terminal or node-spawn)"},"terminal.commands.hide":{value:!1,visible:!1,description:"Hide terminal command output from the user"},"terminal.commands.vscodeTerminal.detachTimeout":{value:90,visible:!1,description:"Timeout for detaching from a terminal in milliseconds"},"terminal.commands.vscodeTerminal.shellPath":{value:void 0,visible:!1,description:"Path to the shell to use in vscode-terminal mode"},"terminal.commands.vscodeTerminal.shellArgs":{value:void 0,visible:!1,description:"Arguments to pass to the custom shell in vscode-terminal mode. Only used when terminal.commands.vscodeTerminal.shellPath is set"},"terminal.commands.nodeSpawn.loadProfile":{value:"daily",visible:!1,description:"How often to load shell profile in node-spawn mode (always, daily, never)"},"terminal.commands.nodeSpawn.detachedLogsDirectory":{value:void 0,visible:!1,description:"Directory to store detached logs in node-spawn mode"},"tab.enabled":{value:!0,visible:!1,description:"Enable tab completion features"},"tab.disabledLanguages":{value:[],visible:!1,description:"List of language IDs for which tab completion is disabled"},"tab.disableOnComment":{value:!1,visible:!1,description:"Dsiable tab completion on comment lines"},"tab.autoImport.enabled":{value:!1,visible:!1,description:"Enable auto-import feature for tab completion"},"tab.verboseLogs":{value:!1,visible:!1,description:"Enable verbose logging for tab completion"},debugLogs:{value:!1,visible:!1,description:"Enable debug logging output"},hooks:{value:[],visible:!1,description:"Custom hooks for extending Amp functionality"},"gemini.enabled":{value:!1,visible:!1,description:"Whether to use Gemini 2.5 pro as the primary model"},"vertexai.enabled":{value:!1,visible:!1,description:"Whether to use Vertex AI for Anthropic Claude inference"},"experimental.run_javascript.enabled":{value:!1,visible:!1,description:"Whether to enable the experimental run_javascript tool"},"lsp.enabled":{value:!1,visible:!1,description:"Enable LSP-based diagnostics"},"jetbrains.enabled":{value:!1,visible:!1,description:"Enable integrated support for JetBrains-based IDE through the official JetBrains MCP plugin. When this setting is enabled, Amp will automatically try to include the currently open file and selected text (if any) before sending messages."},"experimental.reviewTool":{value:!1,visible:!1,description:"Experimental: Enable the summarize_git_diff tool."},"experimental.tools":{value:[],visible:!1,description:"Enable experimental tools by name. Available tools: chat_llm, commit_attribution"},"summary.provider":{value:"gemini",visible:!1,description:"Summary provider to use (anthropic or gemini)"}},ss6=Object.fromEntries(Object.entries(y9A).filter(([,A])=>A.visible).map(([A,Q])=>[`amp.${A}`,Q.value])),Vd={examples:[{description:"Start an interactive session:",command:"amp"},{description:"Run a command in a non-interactive session:",command:'echo "commit all my unstaged changes" | amp'},{description:"Run from a prompt file in a non-interactive session and store output in a file:",command:"amp < prompt.txt > output.txt"}],configuration:{description:`Amp can be configured using a JSON settings file located at ${jE}. All settings use the "amp." prefix.`,sampleConfig:JSON.stringify(ss6,null,2),keyDescriptions:Object.entries(y9A).filter(([,A])=>A.visible).map(([A,Q])=>({key:`amp.${A}`,description:Q.description}))}};$2();Mi();D2();import{spawn as x9A}from"node:child_process";import yf1 from"node:fs";import h9A from"node:os";import d3 from"node:path";class kf1{cache=new Map;maxSize;constructor(A=100){this.maxSize=A}get(A){let Q=this.cache.get(A);if(Q!==void 0)this.cache.delete(A),this.cache.set(A,Q);return Q}set(A,Q){if(this.cache.has(A))this.cache.delete(A);else if(this.cache.size>=this.maxSize){let B=this.cache.keys().next().value;if(B!==void 0)this.cache.delete(B)}this.cache.set(A,Q)}has(A){return this.cache.has(A)}clear(){this.cache.clear()}get size(){return this.cache.size}}var gf1=500000,g9A=60000,m9A=["!node_modules/","!target/","!build/","!dist/","!out/","!\\.next/","!coverage/","!venv/","!\\.venv/","!vendor/","!deps/","!\\_build/","!\\.elixir_ls/","!\\.elixir-tools/","!\\.git/"],rs6=m9A.map((A)=>A.substring(1).replace(/\\/g,""));function b9A(A){let Q=A.replace(/\\/g,"/");return rs6.some((B)=>{let J=B.endsWith("/")?B.slice(0,-1):B;return Q.startsWith(B)||Q.includes("/"+B)||Q.startsWith(J+"/")||Q.includes("/"+J+"/")})}class S51{process=null;messageId=0;pendingRequests=new Map;queryCache=new kf1(50);messageSubject=new CD(null);subscription=this.messageSubject.pipe($q(250),t7((A)=>A!==null),W5((A)=>{return this.sendMessageObservable(A)})).subscribe((A)=>{k1.debug("Sending message",{pendingMessage:A})});constructor(){}sendMessageObservable(A){return new UA(()=>{return this.sendMessageDirect(A)})}sendMessageDirect(A){if(k1.debug("Sending message directly",{pendingMessage:A}),!this.process?.stdin){A.reject(new Error("Fuzzy server not started"));return}this.pendingRequests.set(A.id,{resolve:A.resolve,reject:A.reject}),this.process.stdin.write(JSON.stringify({...A.message,id:A.id})+`
|
7345
7343
|
`)}async start(){let A=!!process.versions.bun,Q,B;if(k1.info("Starting fuzzy server",{isCompiledBinary:A,argv:process.argv}),A)Q=process.execPath,B=["fuzzy-server"];else if(process.argv[1])Q="node",B=[process.argv[1],"fuzzy-server"];else throw k1.error("Failed to determine command and args for fuzzy server",{argv:process.argv}),new Error("Failed to determine command and args for fuzzy server");if(this.process=x9A(Q,B,{stdio:["pipe","pipe","inherit"]}),!this.process.stdout)throw new Error("Failed to create fuzzy server process");let J="";this.process.stdout.on("data",(D)=>{J+=D.toString();let z=J.split(`
|
7346
7344
|
`);J=z.pop()||"";for(let Z of z)if(Z.trim())try{let X=JSON.parse(Z),K=this.pendingRequests.get(X.id);if(K)this.pendingRequests.delete(X.id),K.resolve(X)}catch(X){k1.error("Failed to parse fuzzy server response",X)}}),this.process.on("error",(D)=>{k1.error("Fuzzy server process error",D)}),this.process.on("exit",(D)=>{k1.debug("Fuzzy server process exited",{code:D})})}async sendMessage(A){let Q=++this.messageId;return new Promise((B,J)=>{this.messageSubject.next({message:A,id:Q,resolve:B,reject:J})})}async addFiles(A){await this.sendMessage({type:"index:add",files:A}),this.queryCache.clear()}async removeFiles(A){await this.sendMessage({type:"index:remove",files:A}),this.queryCache.clear()}async query(A){k1.debug("Processing completion for pattern",{pattern:A});let Q=this.queryCache.get(A);if(Q)return Q;let J=(await this.sendMessage({type:"query",text:A})).results||[];return this.queryCache.set(A,J),J}dispose(){if(this.subscription.unsubscribe(),this.messageSubject.complete(),this.process)this.process.kill(),this.process=null}}async function u9A(A,Q){let B=h9A.homedir();if(d3.resolve(Q)===d3.resolve(B)){k1.debug("Skipping indexing for home directory");return}let J=new Promise((D,z)=>{let Z=qT(),X=["--files","--color","never","--no-require-git","--hidden",...m9A.flatMap((Y)=>["--glob",Y])],K=x9A(Z,X,{cwd:Q,stdio:["ignore","pipe","inherit"]});if(!K.stdout){z(new Error("Failed to start ripgrep process"));return}let G="",q=[];K.stdout.on("data",(Y)=>{G+=Y.toString();let F=G.split(`
|
7347
7345
|
`);G=F.pop()||"";for(let E of F)if(E.trim()&&q.length<gf1)q.push(E.trim());if(q.length>=gf1)K.kill("SIGTERM"),k1.debug(`File indexing stopped at ${gf1} files limit`)}),K.on("error",(Y)=>{k1.error("Ripgrep process error",Y),z(Y)}),K.on("exit",async(Y)=>{if(Y===null){k1.warn("Ripgrep process was terminated during file indexing");try{if(q.length>0)await A.addFiles(q),k1.debug(`Indexed ${q.length} files before termination`);D()}catch(F){z(F)}return}if(Y===0||Y===1)try{await A.addFiles(q),k1.debug(`Indexed ${q.length} files`),D()}catch(F){z(F)}else z(new Error(`Ripgrep exited with code ${Y}`))})});return Promise.race([J,new Promise((D,z)=>setTimeout(()=>z(new Error(`File indexing timed out after ${g9A/1000} seconds`)),g9A))])}function p9A(A,Q){let B=h9A.homedir();if(d3.resolve(Q)===d3.resolve(B))return k1.debug("Skipping file watching for home directory"),{[Symbol.dispose]:()=>{}};let J=[],D=new Set,z=null,Z=async()=>{if(D.size===0)return;let G=Array.from(D);D.clear();let q=[],Y=[];for(let F of G){let E=d3.join(Q,F);try{let w=await yf1.promises.lstat(E);if(w.isFile()||w.isSymbolicLink()&&!b9A(F))if(w.isSymbolicLink())try{await yf1.promises.stat(E),q.push(F)}catch(H){k1.debug("Skipping broken symlink",{file:F,error:H})}else q.push(F)}catch(w){if(w.code==="ENOENT")k1.debug("File not found during indexing",{file:F});else k1.debug("Error accessing file during indexing",{file:F,error:w});Y.push(F)}}try{if(q.length>0)await A.addFiles(q),k1.debug(`Added ${q.length} files to index`);if(Y.length>0)await A.removeFiles(Y),k1.debug(`Removed ${Y.length} files from index`)}catch(F){k1.error("Failed to update fuzzy server index",F)}},X=()=>{if(z)clearTimeout(z);z=setTimeout(Z,100)};return((G)=>{try{let q=yf1.watch(G,{recursive:!0},(Y,F)=>{if(!F)return;if(k1.debug("File system event",{eventType:Y,filename:F,dirPath:G}),Y!=="rename"){k1.debug("Ignoring change event",{eventType:Y,filename:F});return}if(F.includes("/.")||F.startsWith("."))return;let E=d3.relative(Q,d3.join(G,F));if(E.startsWith(".."))return;if(b9A(E)){k1.debug("Skipping excluded path",{relativePath:E});return}D.add(E),X()});J.push(q),q.on("error",(Y)=>{k1.error(`File watcher error for ${G}`,Y)})}catch(q){k1.error(`Failed to watch directory ${G}`,q)}})(Q),{[Symbol.dispose]:()=>{if(z)clearTimeout(z);for(let G of J)G.close();J.length=0}}}function pM(A){return!Array.isArray?r9A(A)==="[object Array]":Array.isArray(A)}var os6=1/0;function ts6(A){if(typeof A=="string")return A;let Q=A+"";return Q=="0"&&1/A==-os6?"-0":Q}function es6(A){return A==null?"":ts6(A)}function $E(A){return typeof A==="string"}function n9A(A){return typeof A==="number"}function Ar6(A){return A===!0||A===!1||Qr6(A)&&r9A(A)=="[object Boolean]"}function s9A(A){return typeof A==="object"}function Qr6(A){return s9A(A)&&A!==null}function KK(A){return A!==void 0&&A!==null}function bf1(A){return!A.trim().length}function r9A(A){return A==null?A===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(A)}var Br6="Incorrect 'index' type",Jr6=(A)=>`Invalid value for key ${A}`,Dr6=(A)=>`Pattern length exceeds max of ${A}.`,zr6=(A)=>`Missing ${A} property in key`,Zr6=(A)=>`Property 'weight' in key '${A}' must be a positive integer`,c9A=Object.prototype.hasOwnProperty;class o9A{constructor(A){this._keys=[],this._keyMap={};let Q=0;A.forEach((B)=>{let J=t9A(B);this._keys.push(J),this._keyMap[J.id]=J,Q+=J.weight}),this._keys.forEach((B)=>{B.weight/=Q})}get(A){return this._keyMap[A]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function t9A(A){let Q=null,B=null,J=null,D=1,z=null;if($E(A)||pM(A))J=A,Q=l9A(A),B=xf1(A);else{if(!c9A.call(A,"name"))throw new Error(zr6("name"));let Z=A.name;if(J=Z,c9A.call(A,"weight")){if(D=A.weight,D<=0)throw new Error(Zr6(Z))}Q=l9A(Z),B=xf1(Z),z=A.getFn}return{path:Q,id:B,weight:D,src:J,getFn:z}}function l9A(A){return pM(A)?A:A.split(".")}function xf1(A){return pM(A)?A.join("."):A}function Xr6(A,Q){let B=[],J=!1,D=(z,Z,X)=>{if(!KK(z))return;if(!Z[X])B.push(z);else{let K=Z[X],G=z[K];if(!KK(G))return;if(X===Z.length-1&&($E(G)||n9A(G)||Ar6(G)))B.push(es6(G));else if(pM(G)){J=!0;for(let q=0,Y=G.length;q<Y;q+=1)D(G[q],Z,X+1)}else if(Z.length)D(G,Z,X+1)}};return D(A,$E(Q)?Q.split("."):Q,0),J?B:B[0]}var Kr6={includeMatches:!1,findAllMatches:!1,minMatchCharLength:1},Gr6={isCaseSensitive:!1,ignoreDiacritics:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(A,Q)=>A.score===Q.score?A.idx<Q.idx?-1:1:A.score<Q.score?-1:1},qr6={location:0,threshold:0.6,distance:100},Yr6={useExtendedSearch:!1,getFn:Xr6,ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1},I8={...Gr6,...Kr6,...qr6,...Yr6},Ur6=/[^ ]+/g;function Fr6(A=1,Q=3){let B=new Map,J=Math.pow(10,Q);return{get(D){let z=D.match(Ur6).length;if(B.has(z))return B.get(z);let Z=1/Math.pow(z,0.5*A),X=parseFloat(Math.round(Z*J)/J);return B.set(z,X),X},clear(){B.clear()}}}class k51{constructor({getFn:A=I8.getFn,fieldNormWeight:Q=I8.fieldNormWeight}={}){this.norm=Fr6(Q,3),this.getFn=A,this.isCreated=!1,this.setIndexRecords()}setSources(A=[]){this.docs=A}setIndexRecords(A=[]){this.records=A}setKeys(A=[]){this.keys=A,this._keysMap={},A.forEach((Q,B)=>{this._keysMap[Q.id]=B})}create(){if(this.isCreated||!this.docs.length)return;if(this.isCreated=!0,$E(this.docs[0]))this.docs.forEach((A,Q)=>{this._addString(A,Q)});else this.docs.forEach((A,Q)=>{this._addObject(A,Q)});this.norm.clear()}add(A){let Q=this.size();if($E(A))this._addString(A,Q);else this._addObject(A,Q)}removeAt(A){this.records.splice(A,1);for(let Q=A,B=this.size();Q<B;Q+=1)this.records[Q].i-=1}getValueForItemAtKeyId(A,Q){return A[this._keysMap[Q]]}size(){return this.records.length}_addString(A,Q){if(!KK(A)||bf1(A))return;let B={v:A,i:Q,n:this.norm.get(A)};this.records.push(B)}_addObject(A,Q){let B={i:Q,$:{}};this.keys.forEach((J,D)=>{let z=J.getFn?J.getFn(A):this.getFn(A,J.path);if(!KK(z))return;if(pM(z)){let Z=[],X=[{nestedArrIndex:-1,value:z}];while(X.length){let{nestedArrIndex:K,value:G}=X.pop();if(!KK(G))continue;if($E(G)&&!bf1(G)){let q={v:G,i:K,n:this.norm.get(G)};Z.push(q)}else if(pM(G))G.forEach((q,Y)=>{X.push({nestedArrIndex:Y,value:q})})}B.$[D]=Z}else if($E(z)&&!bf1(z)){let Z={v:z,n:this.norm.get(z)};B.$[D]=Z}}),this.records.push(B)}toJSON(){return{keys:this.keys,records:this.records}}}function e9A(A,Q,{getFn:B=I8.getFn,fieldNormWeight:J=I8.fieldNormWeight}={}){let D=new k51({getFn:B,fieldNormWeight:J});return D.setKeys(A.map(t9A)),D.setSources(Q),D.create(),D}function Er6(A,{getFn:Q=I8.getFn,fieldNormWeight:B=I8.fieldNormWeight}={}){let{keys:J,records:D}=A,z=new k51({getFn:Q,fieldNormWeight:B});return z.setKeys(J),z.setIndexRecords(D),z}function v51(A,{errors:Q=0,currentLocation:B=0,expectedLocation:J=0,distance:D=I8.distance,ignoreLocation:z=I8.ignoreLocation}={}){let Z=Q/A.length;if(z)return Z;let X=Math.abs(J-B);if(!D)return X?1:Z;return Z+X/D}function wr6(A=[],Q=I8.minMatchCharLength){let B=[],J=-1,D=-1,z=0;for(let Z=A.length;z<Z;z+=1){let X=A[z];if(X&&J===-1)J=z;else if(!X&&J!==-1){if(D=z-1,D-J+1>=Q)B.push([J,D]);J=-1}}if(A[z-1]&&z-J>=Q)B.push([J,z-1]);return B}var i3=32;function Hr6(A,Q,B,{location:J=I8.location,distance:D=I8.distance,threshold:z=I8.threshold,findAllMatches:Z=I8.findAllMatches,minMatchCharLength:X=I8.minMatchCharLength,includeMatches:K=I8.includeMatches,ignoreLocation:G=I8.ignoreLocation}={}){if(Q.length>i3)throw new Error(Dr6(i3));let q=Q.length,Y=A.length,F=Math.max(0,Math.min(J,Y)),E=z,w=F,H=X>1||K,M=H?Array(Y):[],W;while((W=A.indexOf(Q,w))>-1){let R=v51(Q,{currentLocation:W,expectedLocation:F,distance:D,ignoreLocation:G});if(E=Math.min(R,E),w=W+q,H){let j=0;while(j<q)M[W+j]=1,j+=1}}w=-1;let I=[],N=1,V=q+Y,_=1<<q-1;for(let R=0;R<q;R+=1){let j=0,P=V;while(j<P){if(v51(Q,{errors:R,currentLocation:F+P,expectedLocation:F,distance:D,ignoreLocation:G})<=E)j=P;else V=P;P=Math.floor((V-j)/2+j)}V=P;let $=Math.max(1,F-P+1),f=Z?Y:Math.min(F+P,Y)+q,m=Array(f+2);m[f+1]=(1<<R)-1;for(let v=f;v>=$;v-=1){let g=v-1,b=B[A.charAt(g)];if(H)M[g]=+!!b;if(m[v]=(m[v+1]<<1|1)&b,R)m[v]|=(I[v+1]|I[v])<<1|1|I[v+1];if(m[v]&_){if(N=v51(Q,{errors:R,currentLocation:g,expectedLocation:F,distance:D,ignoreLocation:G}),N<=E){if(E=N,w=g,w<=F)break;$=Math.max(1,2*F-w)}}}if(v51(Q,{errors:R+1,currentLocation:F,expectedLocation:F,distance:D,ignoreLocation:G})>E)break;I=m}let T={isMatch:w>=0,score:Math.max(0.001,N)};if(H){let R=wr6(M,X);if(!R.length)T.isMatch=!1;else if(K)T.indices=R}return T}function Mr6(A){let Q={};for(let B=0,J=A.length;B<J;B+=1){let D=A.charAt(B);Q[D]=(Q[D]||0)|1<<J-B-1}return Q}var $51=String.prototype.normalize?(A)=>A.normalize("NFD").replace(/[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/g,""):(A)=>A;class lf1{constructor(A,{location:Q=I8.location,threshold:B=I8.threshold,distance:J=I8.distance,includeMatches:D=I8.includeMatches,findAllMatches:z=I8.findAllMatches,minMatchCharLength:Z=I8.minMatchCharLength,isCaseSensitive:X=I8.isCaseSensitive,ignoreDiacritics:K=I8.ignoreDiacritics,ignoreLocation:G=I8.ignoreLocation}={}){if(this.options={location:Q,threshold:B,distance:J,includeMatches:D,findAllMatches:z,minMatchCharLength:Z,isCaseSensitive:X,ignoreDiacritics:K,ignoreLocation:G},A=X?A:A.toLowerCase(),A=K?$51(A):A,this.pattern=A,this.chunks=[],!this.pattern.length)return;let q=(F,E)=>{this.chunks.push({pattern:F,alphabet:Mr6(F),startIndex:E})},Y=this.pattern.length;if(Y>i3){let F=0,E=Y%i3,w=Y-E;while(F<w)q(this.pattern.substr(F,i3),F),F+=i3;if(E){let H=Y-i3;q(this.pattern.substr(H),H)}}else q(this.pattern,0)}searchIn(A){let{isCaseSensitive:Q,ignoreDiacritics:B,includeMatches:J}=this.options;if(A=Q?A:A.toLowerCase(),A=B?$51(A):A,this.pattern===A){let w={isMatch:!0,score:0};if(J)w.indices=[[0,A.length-1]];return w}let{location:D,distance:z,threshold:Z,findAllMatches:X,minMatchCharLength:K,ignoreLocation:G}=this.options,q=[],Y=0,F=!1;this.chunks.forEach(({pattern:w,alphabet:H,startIndex:M})=>{let{isMatch:W,score:I,indices:N}=Hr6(A,w,H,{location:D+M,distance:z,threshold:Z,findAllMatches:X,minMatchCharLength:K,includeMatches:J,ignoreLocation:G});if(W)F=!0;if(Y+=I,W&&N)q=[...q,...N]});let E={isMatch:F,score:F?Y/this.chunks.length:1};if(F&&J)E.indices=q;return E}}class cM{constructor(A){this.pattern=A}static isMultiMatch(A){return d9A(A,this.multiRegex)}static isSingleMatch(A){return d9A(A,this.singleRegex)}search(){}}function d9A(A,Q){let B=A.match(Q);return B?B[1]:null}class A4A extends cM{constructor(A){super(A)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(A){let Q=A===this.pattern;return{isMatch:Q,score:Q?0:1,indices:[0,this.pattern.length-1]}}}class Q4A extends cM{constructor(A){super(A)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(A){let B=A.indexOf(this.pattern)===-1;return{isMatch:B,score:B?0:1,indices:[0,A.length-1]}}}class B4A extends cM{constructor(A){super(A)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(A){let Q=A.startsWith(this.pattern);return{isMatch:Q,score:Q?0:1,indices:[0,this.pattern.length-1]}}}class J4A extends cM{constructor(A){super(A)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(A){let Q=!A.startsWith(this.pattern);return{isMatch:Q,score:Q?0:1,indices:[0,A.length-1]}}}class D4A extends cM{constructor(A){super(A)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(A){let Q=A.endsWith(this.pattern);return{isMatch:Q,score:Q?0:1,indices:[A.length-this.pattern.length,A.length-1]}}}class z4A extends cM{constructor(A){super(A)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(A){let Q=!A.endsWith(this.pattern);return{isMatch:Q,score:Q?0:1,indices:[0,A.length-1]}}}class df1 extends cM{constructor(A,{location:Q=I8.location,threshold:B=I8.threshold,distance:J=I8.distance,includeMatches:D=I8.includeMatches,findAllMatches:z=I8.findAllMatches,minMatchCharLength:Z=I8.minMatchCharLength,isCaseSensitive:X=I8.isCaseSensitive,ignoreDiacritics:K=I8.ignoreDiacritics,ignoreLocation:G=I8.ignoreLocation}={}){super(A);this._bitapSearch=new lf1(A,{location:Q,threshold:B,distance:J,includeMatches:D,findAllMatches:z,minMatchCharLength:Z,isCaseSensitive:X,ignoreDiacritics:K,ignoreLocation:G})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(A){return this._bitapSearch.searchIn(A)}}class if1 extends cM{constructor(A){super(A)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(A){let Q=0,B,J=[],D=this.pattern.length;while((B=A.indexOf(this.pattern,Q))>-1)Q=B+D,J.push([B,Q-1]);let z=!!J.length;return{isMatch:z,score:z?0:1,indices:J}}}var hf1=[A4A,if1,B4A,J4A,z4A,D4A,Q4A,df1],i9A=hf1.length,Wr6=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,Ir6="|";function Nr6(A,Q={}){return A.split(Ir6).map((B)=>{let J=B.trim().split(Wr6).filter((z)=>z&&!!z.trim()),D=[];for(let z=0,Z=J.length;z<Z;z+=1){let X=J[z],K=!1,G=-1;while(!K&&++G<i9A){let q=hf1[G],Y=q.isMultiMatch(X);if(Y)D.push(new q(Y,Q)),K=!0}if(K)continue;G=-1;while(++G<i9A){let q=hf1[G],Y=q.isSingleMatch(X);if(Y){D.push(new q(Y,Q));break}}}return D})}var Cr6=new Set([df1.type,if1.type]);class Z4A{constructor(A,{isCaseSensitive:Q=I8.isCaseSensitive,ignoreDiacritics:B=I8.ignoreDiacritics,includeMatches:J=I8.includeMatches,minMatchCharLength:D=I8.minMatchCharLength,ignoreLocation:z=I8.ignoreLocation,findAllMatches:Z=I8.findAllMatches,location:X=I8.location,threshold:K=I8.threshold,distance:G=I8.distance}={}){this.query=null,this.options={isCaseSensitive:Q,ignoreDiacritics:B,includeMatches:J,minMatchCharLength:D,findAllMatches:Z,ignoreLocation:z,location:X,threshold:K,distance:G},A=Q?A:A.toLowerCase(),A=B?$51(A):A,this.pattern=A,this.query=Nr6(this.pattern,this.options)}static condition(A,Q){return Q.useExtendedSearch}searchIn(A){let Q=this.query;if(!Q)return{isMatch:!1,score:1};let{includeMatches:B,isCaseSensitive:J,ignoreDiacritics:D}=this.options;A=J?A:A.toLowerCase(),A=D?$51(A):A;let z=0,Z=[],X=0;for(let K=0,G=Q.length;K<G;K+=1){let q=Q[K];Z.length=0,z=0;for(let Y=0,F=q.length;Y<F;Y+=1){let E=q[Y],{isMatch:w,indices:H,score:M}=E.search(A);if(w){if(z+=1,X+=M,B){let W=E.constructor.type;if(Cr6.has(W))Z=[...Z,...H];else Z.push(H)}}else{X=0,z=0,Z.length=0;break}}if(z){let Y={isMatch:!0,score:X/z};if(B)Y.indices=Z;return Y}}return{isMatch:!1,score:1}}}var mf1=[];function Vr6(...A){mf1.push(...A)}function uf1(A,Q){for(let B=0,J=mf1.length;B<J;B+=1){let D=mf1[B];if(D.condition(A,Q))return new D(A,Q)}return new lf1(A,Q)}var f51={AND:"$and",OR:"$or"},pf1={PATH:"$path",PATTERN:"$val"},cf1=(A)=>!!(A[f51.AND]||A[f51.OR]),Or6=(A)=>!!A[pf1.PATH],Rr6=(A)=>!pM(A)&&s9A(A)&&!cf1(A),a9A=(A)=>({[f51.AND]:Object.keys(A).map((Q)=>({[Q]:A[Q]}))});function X4A(A,Q,{auto:B=!0}={}){let J=(D)=>{let z=Object.keys(D),Z=Or6(D);if(!Z&&z.length>1&&!cf1(D))return J(a9A(D));if(Rr6(D)){let K=Z?D[pf1.PATH]:z[0],G=Z?D[pf1.PATTERN]:D[K];if(!$E(G))throw new Error(Jr6(K));let q={keyId:xf1(K),pattern:G};if(B)q.searcher=uf1(G,Q);return q}let X={children:[],operator:z[0]};return z.forEach((K)=>{let G=D[K];if(pM(G))G.forEach((q)=>{X.children.push(J(q))})}),X};if(!cf1(A))A=a9A(A);return J(A)}function Lr6(A,{ignoreFieldNorm:Q=I8.ignoreFieldNorm}){A.forEach((B)=>{let J=1;B.matches.forEach(({key:D,norm:z,score:Z})=>{let X=D?D.weight:null;J*=Math.pow(Z===0&&X?Number.EPSILON:Z,(X||1)*(Q?1:z))}),B.score=J})}function _r6(A,Q){let B=A.matches;if(Q.matches=[],!KK(B))return;B.forEach((J)=>{if(!KK(J.indices)||!J.indices.length)return;let{indices:D,value:z}=J,Z={indices:D,value:z};if(J.key)Z.key=J.key.src;if(J.idx>-1)Z.refIndex=J.idx;Q.matches.push(Z)})}function Tr6(A,Q){Q.score=A.score}function jr6(A,Q,{includeMatches:B=I8.includeMatches,includeScore:J=I8.includeScore}={}){let D=[];if(B)D.push(_r6);if(J)D.push(Tr6);return A.map((z)=>{let{idx:Z}=z,X={item:Q[Z],refIndex:Z};if(D.length)D.forEach((K)=>{K(z,X)});return X})}class cC{constructor(A,Q={},B){this.options={...I8,...Q},this.options.useExtendedSearch,this._keyStore=new o9A(this.options.keys),this.setCollection(A,B)}setCollection(A,Q){if(this._docs=A,Q&&!(Q instanceof k51))throw new Error(Br6);this._myIndex=Q||e9A(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(A){if(!KK(A))return;this._docs.push(A),this._myIndex.add(A)}remove(A=()=>!1){let Q=[];for(let B=0,J=this._docs.length;B<J;B+=1){let D=this._docs[B];if(A(D,B))this.removeAt(B),B-=1,J-=1,Q.push(D)}return Q}removeAt(A){this._docs.splice(A,1),this._myIndex.removeAt(A)}getIndex(){return this._myIndex}search(A,{limit:Q=-1}={}){let{includeMatches:B,includeScore:J,shouldSort:D,sortFn:z,ignoreFieldNorm:Z}=this.options,X=$E(A)?$E(this._docs[0])?this._searchStringList(A):this._searchObjectList(A):this._searchLogical(A);if(Lr6(X,{ignoreFieldNorm:Z}),D)X.sort(z);if(n9A(Q)&&Q>-1)X=X.slice(0,Q);return jr6(X,this._docs,{includeMatches:B,includeScore:J})}_searchStringList(A){let Q=uf1(A,this.options),{records:B}=this._myIndex,J=[];return B.forEach(({v:D,i:z,n:Z})=>{if(!KK(D))return;let{isMatch:X,score:K,indices:G}=Q.searchIn(D);if(X)J.push({item:D,idx:z,matches:[{score:K,value:D,norm:Z,indices:G}]})}),J}_searchLogical(A){let Q=X4A(A,this.options),B=(Z,X,K)=>{if(!Z.children){let{keyId:q,searcher:Y}=Z,F=this._findMatches({key:this._keyStore.get(q),value:this._myIndex.getValueForItemAtKeyId(X,q),searcher:Y});if(F&&F.length)return[{idx:K,item:X,matches:F}];return[]}let G=[];for(let q=0,Y=Z.children.length;q<Y;q+=1){let F=Z.children[q],E=B(F,X,K);if(E.length)G.push(...E);else if(Z.operator===f51.AND)return[]}return G},J=this._myIndex.records,D={},z=[];return J.forEach(({$:Z,i:X})=>{if(KK(Z)){let K=B(Q,Z,X);if(K.length){if(!D[X])D[X]={idx:X,item:Z,matches:[]},z.push(D[X]);K.forEach(({matches:G})=>{D[X].matches.push(...G)})}}}),z}_searchObjectList(A){let Q=uf1(A,this.options),{keys:B,records:J}=this._myIndex,D=[];return J.forEach(({$:z,i:Z})=>{if(!KK(z))return;let X=[];if(B.forEach((K,G)=>{X.push(...this._findMatches({key:K,value:z[G],searcher:Q}))}),X.length)D.push({idx:Z,item:z,matches:X})}),D}_findMatches({key:A,value:Q,searcher:B}){if(!KK(Q))return[];let J=[];if(pM(Q))Q.forEach(({v:D,i:z,n:Z})=>{if(!KK(D))return;let{isMatch:X,score:K,indices:G}=B.searchIn(D);if(X)J.push({score:K,key:A,value:D,idx:z,norm:Z,indices:G})});else{let{v:D,n:z}=Q,{isMatch:Z,score:X,indices:K}=B.searchIn(D);if(Z)J.push({score:X,key:A,value:D,norm:z,indices:K})}return J}}cC.version="7.1.0";cC.createIndex=e9A;cC.parseIndex=Er6;cC.config=I8;cC.parseQuery=X4A;Vr6(Z4A);import*as K4A from"node:readline";class af1{fuse;rootLevelFiles=[];constructor(){this.fuse=new cC([],{keys:["value"],includeScore:!0,location:0,threshold:0.7,distance:256,ignoreLocation:!0,findAllMatches:!0,isCaseSensitive:!1})}addFiles(A){for(let Q of A){let B={value:Q.toLowerCase(),original:Q};if(this.fuse.add(B),!Q.includes("/"))this.rootLevelFiles.push(Q)}}removeFiles(A){for(let Q of A)if(this.fuse.remove((B)=>B.value===Q),!Q.includes("/"))this.rootLevelFiles=this.rootLevelFiles.filter((B)=>B!==Q)}query(A,Q=50){if(!A.trim())return this.rootLevelFiles.slice(0,Q);return this.fuse.search(A,{limit:Q}).map((J)=>J.item.original)}handleMessage(A){try{let{id:Q,type:B}=A;switch(B){case"index:add":return this.addFiles(A.files||[]),{id:Q,type:"response",status:"ok"};case"index:remove":return this.removeFiles(A.files||[]),{id:Q,type:"response",status:"ok"};case"query":{let J=this.query(A.text||"");return{id:Q,type:"response",results:J}}default:return{id:Q,type:"error",message:`Unknown type: ${B}`}}}catch(Q){return{id:A.id,type:"error",message:Q instanceof Error?Q.message:String(Q)}}}start(){let A=K4A.createInterface({input:process.stdin,output:process.stdout,terminal:!1});A.on("line",(Q)=>{try{let B=JSON.parse(Q),J=this.handleMessage(B);process.stdout.write(JSON.stringify(J)+`
|
@@ -7412,7 +7410,7 @@ ${B.join(`
|
|
7412
7410
|
`)}function br6(A,Q){if(A.state!=="active")return{type:"idle"};let B=lC(Q);if(B)return B;if(A.state==="active"){let J=[];for(let D of Q.messages)if(D.role==="user"){for(let z of D.content)if(z.type==="tool_result"&&z.run.status==="in-progress")J.push(z)}if(J.length>0){let D=J[0],z=y7(Q,D.toolUseID);if(z){let Z=J.slice(1).map((X)=>{return y7(Q,X.toolUseID)?.name||"tool"}).filter(Boolean);return b51(z.name,J.length,Date.now(),z.input,Z.length>0?Z:void 0)}}}return{type:"idle"}}class ef1{dependencies;subthreads=new Map;nextAgentNumber=1;events=new C8;constructor(A){this.dependencies=A}get events$(){return this.events}async trackSubthread(A,Q,B){if(this.subthreads.has(A))return;try{let J=await sZ.getOrCreateForThread({configService:this.dependencies.configService,threadService:this.dependencies.threadService,toolService:this.dependencies.toolService,getThreadEnvironment:Nf,systemPromptService:this.dependencies.systemPromptService,threadSummaryService:this.dependencies.threadSummaryService,createFileSystem:await Rd,threadHistoryService:this.dependencies.threadHistoryService,mcpService:this.dependencies.mcpService},A);await J.resume();let D=this.nextAgentNumber++,z={threadID:A,worker:J,agentNumber:D,printedMessageIndexes:new Set,printedToolRuns:new Set,requestedToolConfirmations:new Set,taskDescription:Q,isCompleted:!1};if(this.subthreads.set(A,z),Q&&B)this.events.next({type:"subagent-started",subThreadID:A,agentNumber:D,taskDescription:Q,taskPrompt:B});J.status.subscribe(async(X)=>{if(!z.isCompleted){if(X.state==="active"&&X.inferenceState==="cancelled"){z.isCompleted=!0,this.events.next({type:"subagent-cancelled",subThreadID:A,agentNumber:z.agentNumber,taskDescription:z.taskDescription||"Task cancelled"});return}if(X.state==="active"&&X.ephemeralError){z.isCompleted=!0,this.events.next({type:"subagent-error",subThreadID:A,agentNumber:z.agentNumber,taskDescription:z.taskDescription||"Task failed",error:X.ephemeralError.message||"Unknown error occurred"});return}try{let K=await l6(this.dependencies.threadService.observe(A).pipe(t7((G)=>G!==void 0)));if(K){let G=br6(X,K);if(this.events.next({type:"subagent-status",subThreadID:A,agentNumber:z.agentNumber,taskDescription:z.taskDescription||"Running task",agentState:G}),X.state==="active"){let q=[];for(let Y of K.messages)if(Y.role==="user"){for(let F of Y.content)if(F.type==="tool_result"&&F.run.status==="in-progress")q.push(F)}for(let Y of q){let F=y7(K,Y.toolUseID);if(F){let E=`${A}-${F.id}`;if(!z.toolStartTimes)z.toolStartTimes=new Map;if(!z.toolStartTimes.has(E))z.toolStartTimes.set(E,Date.now());this.events.next({type:"tool-status",toolUse:F,status:"running",startTime:z.toolStartTimes.get(E),subthreadID:A})}}}}}catch(K){k1.error(`Failed to get thread for status update: ${A}`,K)}}}),gW(this.dependencies.threadService.observe(A).pipe(t7((X)=>X!==void 0))).observable.subscribe((X)=>{if(!X)return;let K=wz(X,"assistant");if(ha(K)&&!z.isCompleted){z.isCompleted=!0,this.events.next({type:"subagent-cancelled",subThreadID:A,agentNumber:z.agentNumber,taskDescription:z.taskDescription||"Task cancelled"});return}if(K?.state?.type==="error"&&!z.isCompleted){z.isCompleted=!0,this.events.next({type:"subagent-error",subThreadID:A,agentNumber:z.agentNumber,taskDescription:z.taskDescription||"Task failed",error:K.state.error.message||"Unknown error occurred"});return}for(let F of X.messages)if(F.role==="user"){for(let E of F.content)if(E.type==="tool_result"){let w=y7(X,E.toolUseID);if(w&&!z.printedToolRuns.has(E.toolUseID)){let H=E.run.status==="done"?"completed":E.run.status==="error"?"error":E.run.status==="cancelled"?"cancelled":void 0;if(H){z.printedToolRuns.add(E.toolUseID);let M=`${A}-${w.id}`,W=z.toolStartTimes?.get(M);if(this.events.next({type:"tool-status",toolUse:w,status:H,startTime:W,endTime:Date.now(),subthreadID:A}),z.toolStartTimes)z.toolStartTimes.delete(M)}}}}let q=wz(X,"user")?.content.filter((F)=>F.type==="tool_result"&&F.run.status==="blocked-on-user")??[];if(q.length>0&&!z.isCompleted){let F=[];for(let E of q){let w=y7(X,E.toolUseID);if(w&&w.name===o4&&E.run.status==="blocked-on-user"&&E.userInput===void 0&&!z.requestedToolConfirmations.has(E.toolUseID))F.push({useBlock:w,toAllow:E.run.toAllow}),z.requestedToolConfirmations.add(E.toolUseID)}if(F.length>0)this.events.next({type:"subthread-tool-request",subThreadID:A,agentNumber:z.agentNumber,taskDescription:z.taskDescription||"Running task",tools:F})}if(K?.state.type==="complete"&&K?.state.stopReason==="end_turn"&&!z.isCompleted){z.isCompleted=!0;let F=K.content.filter((E)=>E.type==="text").map((E)=>E.text).join(`
|
7413
7411
|
|
7414
7412
|
`);this.events.next({type:"subagent-finished",subThreadID:A,agentNumber:z.agentNumber,taskDescription:z.taskDescription||"Task completed",result:F})}if(!z.isCompleted){let F=gf(X,z.printedMessageIndexes,z.printedToolRuns);if(F.blocks.length>0)this.events.next({type:"subthread-message",subThreadID:A,agentNumber:z.agentNumber,blocks:F.blocks})}}),k1.debug(`Started tracking subthread ${A}`)}catch(J){k1.error(`Failed to track subthread ${A}`,J)}}scanForTaskToolSubthreads(A){for(let Q of A.messages)if(Q.role==="user"){for(let B of Q.content)if(B.type==="tool_result"){let J=y7(A,B.toolUseID);if(J?.name===FQ&&(B.run.status==="in-progress"||B.run.status==="done"||B.run.status==="cancelled")){let D="progress"in B.run?B.run.progress:void 0,z=ly(D);if(z)this.trackSubthread(z,J.input?.description,J.input?.prompt).catch((Z)=>{k1.error(`Failed to track Task tool subthread ${z}`,Z)})}}}}async handleToolConfirmations(A,Q){let B=this.subthreads.get(A);if(!B){k1.error(`No tracker found for subthread ${A}`);return}k1.info(`Sending tool confirmations to subthread ${A}`,{toolCount:Q.size,responses:Array.from(Q.entries()).map(([J,D])=>({id:J,accepted:D}))});for(let[J,D]of Q)k1.info("Sending tool confirmation to subthread worker",{subThreadID:A,toolUseID:J,accepted:D}),await B.worker.handle({type:"user:tool-input",toolUse:J,value:{accepted:D}})}dispose(){for(let A of this.subthreads.values())A.worker.dispose();this.subthreads.clear(),this.events.complete()}}$2();function M4A(A){let Q=["prompt is too long","exceed context limit"],B=A.error?.type==="invalid_request_error"&&Q.some((D)=>A.error?.message?.includes(D)),J=Q.some((D)=>A.message?.includes(D));return B||J}var W4A="Out of credits";Hz();ql();va();D2();x51();AK();Q81();nL();import{readdir as xr6}from"node:fs/promises";import{homedir as hr6}from"node:os";async function I4A(A,Q){let J=!(await B81(A,Q)).some((z)=>z.type==="project"),D=await mr6();return{shouldGenerate:J&&D}}async function mr6(){let A=process.cwd(),Q=hr6();if(A===Q)return!1;try{return(await xr6(A)).length>0}catch{return!1}}async function N4A(A){await A.handle({type:"user:message",message:{content:[{type:"text",text:mu0}]}})}$2();function n3(A,Q){return(B,J)=>{let D=Q(B,J);if(J.type!=="tick")k1.debug("Transition",{name:A,before:B,event:J,after:D});return D}}$2();import{spawn as V4A}from"node:child_process";import{readlink as ur6,stat as pr6}from"node:fs/promises";import{dirname as C4A,join as cr6}from"node:path";async function O4A(A){try{let Q=new AbortController,B=setTimeout(()=>Q.abort(),500),J=await fetch("https://registry.npmjs.org/@sourcegraph/amp/latest",{signal:Q.signal});if(clearTimeout(B),!J.ok)return{hasUpdate:!1};let z=(await J.json()).version;if(z===void 0)return{hasUpdate:!1};let Z=lr6(A,z),X=Z<0;return k1.info("Version comparison",{currentVersion:A,latestVersion:z,compareResult:Z,hasUpdate:X}),{hasUpdate:X,latestVersion:z}}catch(Q){return{hasUpdate:!1}}}function lr6(A,Q){let B=(Z)=>{let[X,K]=Z.split("-");return{parts:X?.split(".").map(Number)||[],label:K}},J=B(A),D=B(Q),z=Math.max(J.parts.length,D.parts.length);for(let Z=0;Z<z;Z++){let X=J.parts[Z]||0,K=D.parts[Z]||0;if(X<K)return-1;if(X>K)return 1}if(J.label===D.label)return 0;if(!J.label&&D.label)return 1;if(J.label&&!D.label)return-1;if(J.label&&D.label)return J.label<D.label?-1:1;return 0}async function dr6(){try{let A=process.argv[1]||"";k1.debug("Detecting package manager from script path",{currentScript:A});let Q=A;try{let z=await ur6(A);if(z)Q=z,k1.debug("Resolved symlink",{from:A,to:Q});else k1.debug("Not a symlink or readlink returned empty")}catch(z){k1.debug("Error reading symlink (probably not a symlink)",{error:z})}if(k1.debug("Resolved installation path",{actualPath:Q}),Q.includes("/.local/share/pnpm/"))return k1.debug("Detected pnpm from path pattern: /.local/share/pnpm/"),"pnpm";if(Q.includes("/.config/yarn/global/"))return k1.debug("Detected yarn from path pattern: /.config/yarn/global/"),"yarn";if(Q.includes("/.bun/install/global/"))return k1.debug("Detected bun from path pattern: /.bun/install/global/"),"bun";if(Q.includes("/node_modules/@sourcegraph/amp/")){if(k1.debug("Found generic node_modules path, checking for specific patterns"),Q.includes("/.local/share/pnpm/"))return k1.debug("Detected pnpm from node_modules with pnpm-specific path"),"pnpm";if(Q.includes("/.config/yarn/"))return k1.debug("Detected yarn from node_modules with yarn-specific path"),"yarn";if(Q.includes("/.bun/"))return k1.debug("Detected bun from node_modules with bun-specific path"),"bun";return k1.debug("Defaulting to npm for generic node_modules path"),"npm"}k1.debug("No path pattern matched, checking installation directory for lockfiles");let B=C4A(C4A(Q));k1.debug("Checking installation directory",{installDir:B});let J=[{file:"pnpm-lock.yaml",manager:"pnpm"},{file:"yarn.lock",manager:"yarn"},{file:"bun.lockb",manager:"bun"},{file:"package-lock.json",manager:"npm"}];for(let{file:z,manager:Z}of J)try{let X=cr6(B,z);return k1.debug("Checking for lockfile",{filePath:X}),await pr6(X),k1.debug("Found package manager lockfile",{file:z,manager:Z,filePath:X}),Z}catch(X){k1.debug("Lockfile not found",{file:z,error:X})}k1.debug("No lockfiles found, falling back to environment-based detection");let D=await R4A();return k1.debug("Environment-based detection result",{envDetected:D}),D}catch(A){return k1.debug("Error detecting installed package manager",{error:A}),null}}async function R4A(){let A=process.env.npm_config_user_agent;if(A){if(A.includes("pnpm"))return"pnpm";if(A.includes("yarn"))return"yarn";if(A.includes("bun"))return"bun";if(A.includes("npm"))return"npm"}if(process.env.PNPM_HOME||process.env.PNPM_SCRIPT_SRC_DIR)return"pnpm";if(process.env.YARN_WRAP_OUTPUT||process.env.YARNPKG_LOCKFILE_VERSION)return"yarn";if(process.env.BUN_INSTALL)return"bun";let[Q,B,J,D]=await Promise.allSettled([h51("pnpm"),h51("yarn"),h51("bun"),h51("npm")]);if(Q?.status==="fulfilled"&&Q?.value)return"pnpm";if(B?.status==="fulfilled"&&B?.value)return"yarn";if(J?.status==="fulfilled"&&J?.value)return"bun";if(D?.status==="fulfilled"&&D?.value)return"npm";return null}async function h51(A){return new Promise((Q)=>{try{let B=process.env.HOME||process.env.USERPROFILE||"/",D=`env -i ${process.env.SHELL||"/bin/sh"} -l -c 'cd ${B} && ${A} --version'`;k1.debug("Checking command existence",{command:A,fullCommand:D});let z=V4A("/bin/sh",["-c",D],{stdio:"ignore",cwd:process.env.HOME});z.on("close",(Z)=>{k1.debug("Command check result",{command:A,code:Z}),Q(Z===0)}),z.on("error",(Z)=>{k1.debug("Command check error",{command:A,error:Z}),Q(!1)})}catch(B){k1.debug("Error checking command existencer",{command:A,error:B}),Q(!1)}})}function ir6(A,Q){let B=Q?`@sourcegraph/amp@${Q}`:"@sourcegraph/amp";switch(A){case"pnpm":return["pnpm",["add","-g",B]];case"yarn":return["yarn",["global","add",B]];case"bun":return["bun",["add","-g",B]];case"npm":default:return["npm",["install","-g",B]]}}async function L4A(A){let Q=await dr6();if(!Q)Q=await R4A();if(!Q)Q="npm",k1.debug("Falling back to npm for update");k1.debug("Using package manager for update",{packageManager:Q,targetVersion:A});let[B,J]=ir6(Q,A);return new Promise((D,z)=>{let Z=process.env.HOME||process.env.USERPROFILE||"/",X=process.env.SHELL||"/bin/sh",K=`${B} ${J.join(" ")}`,G=`env -i ${X} -l -c 'cd ${Z} && ${K}'`;k1.debug("Running update command",{packageManager:Q,command:B,args:J,fullCommand:G});let q=V4A("/bin/sh",["-c",G],{stdio:"pipe",cwd:process.env.HOME}),Y="",F="";q.stdout?.on("data",(E)=>{Y+=E.toString()}),q.stderr?.on("data",(E)=>{F+=E.toString()}),q.on("close",(E)=>{if(E===0)D();else{let w=F||Y||"No output";z(new Error(`${B} ${J.join(" ")} failed with code ${E}:
|
7415
|
-
${w}`))}}),q.on("error",(E)=>{z(new Error(`Failed to spawn ${B}: ${E.message}`))})})}async function _4A({threadSyncService:A,configService:Q,threadService:B,threadHistoryService:J,mcpService:D,fileWatcher:z,fuzzyServer:Z,summaryService:X,settingsStorage:K,threadStorage:G,toolService:q,systemPromptService:Y,subthreadTracker:F},{threadID:E,isContinued:w,ui:H}){let M=OT(),W=new Set,I=gW(B.observe(E).pipe(t7((S)=>S!==void 0))),N=new Set,V=new Map;await l6(I.observable);let _=await Rd,T=await sZ.getOrCreateForThread({configService:Q,threadService:B,toolService:q,getThreadEnvironment:Nf,systemPromptService:Y,threadSummaryService:X,createFileSystem:_,threadHistoryService:J,mcpService:D},E);await T.resume().catch((S)=>{k1.error("Initial resume",S)});let R=T.status.pipe(r6((S)=>{return{type:"worker-state",status:S}})),j=I.observable.pipe(r6((S)=>{return{type:"thread-state",thread:S}})),P=new C8,$=new C8,f=H(UA.from($)).pipe(r6((S)=>({type:"ui-input",input:S}))),m=F.events$.pipe(r6((S)=>S)),l=M.status.pipe(r6((S)=>({type:"lsp-status",lspState:S}))),v=hU(R,j,hU(P,f,m,l)),g=new C8;async function b(){if($.next({type:"state",state:{type:"shutting-down"}}),await A?.sync().catch((S)=>{k1.error("Thread sync error",S,{threadID:E})}),F.dispose(),await M.stopAllServers(),T.dispose(),A)A.dispose();B.dispose(),await D.dispose(),z[Symbol.dispose](),Z.dispose(),$.complete(),g.next()}let u=v.pipe(qZ(()=>{b()})).pipe(KT(n3("threadSession",function(S,y){function d(D1){k1.info(`Processing user message: ${D1.slice(0,50)}${D1.length>50?"...":""}`);let A1="tokenUsage"in S?S.tokenUsage:void 0;if(A1&&A1.used/A1.maxAvailable>m51.CRITICAL)return k1.info("Blocking message at worker boundary - critical token usage"),$.next({type:"confirm",confirmation:{type:"compaction",severity:"critical"}}),{type:"confirming-compaction",severity:"critical",tokenUsage:S.tokenUsage,compactionPromptState:"final",updateState:"updateState"in S?S.updateState:"none",toolConfirmationStatus:"toolConfirmationStatus"in S?S.toolConfirmationStatus:new Map,currentAssistantMessageIndex:("currentAssistantMessageIndex"in S?S.currentAssistantMessageIndex:null)??null,hasBeenIdle:"hasBeenIdle"in S?S.hasBeenIdle:!1,threadTitle:"threadTitle"in S?S.threadTitle:null,confirmationQueue:"confirmationQueue"in S?S.confirmationQueue:[]};T.handle({type:"user:message",message:{content:[{type:"text",text:D1}]}}).then(()=>{if(A)A.sync().catch((X1)=>{k1.error("Thread sync after submit error",X1,{threadID:E})})}).catch((X1)=>{k1.error("Handle user message failed",X1)}),$.next({type:"state",state:{type:"waiting-on-model",startTime:Date.now()}});let K1=I.value.last;if(K1){let X1=lC(K1);if(X1)$.next({type:"state",state:X1})}return{...S,type:"awaiting-agent",displayedError:null}}async function a(){$.next({type:"state",state:{type:"compacting"}});let D1=await X.summarizeThread(E);await T.handle({type:"summary:created",summary:{type:"internal",summary:D1.summary}})}function z1(){if(S.type==="awaiting-user-message")return k1.debug("already accepting, ignoring event",{state:S,event:y}),S;let D1="tokenUsage"in S?S.tokenUsage:void 0;if(A?.sync()?.catch((A1)=>{k1.error("Thread sync error",A1,{threadID:E})}),D1&&S.type!=="confirming-compaction"&&S.type!=="compacting"){let A1=D1.used/D1.maxAvailable,K1=void 0,X1=S.compactionPromptState;if(A1>m51.CRITICAL)K1="critical",X1="final";else if(A1>m51.WARNING&&S.compactionPromptState==="none")K1="moderate",X1="first";else if(A1>m51.SEVERE&&S.compactionPromptState==="first")K1="severe",X1="final";if(K1)return $.next({type:"confirm",confirmation:{type:"compaction",severity:K1}}),{type:"confirming-compaction",severity:K1,tokenUsage:S.tokenUsage,compactionPromptState:X1,updateState:S.updateState,toolConfirmationStatus:S.toolConfirmationStatus,currentAssistantMessageIndex:S.currentAssistantMessageIndex,hasBeenIdle:S.hasBeenIdle,threadTitle:S.threadTitle,confirmationQueue:S.confirmationQueue}}if($.next({type:"accept-message",initial:!S.hasBeenIdle&&!w}),S.type==="awaiting-agent")S.cancelledWithMessage=void 0;if(D1)$.next({type:"token-usage",tokenUsage:D1});return{...S,type:"awaiting-user-message",hasBeenIdle:!0,tokenUsage:D1??null}}function t(D1){if(D1.length>0)k1.info(`Updating allowlist with ${D1.length} entries`,{entries:D1}),K.get("commands.allowlist","global").then((A1)=>{let K1=[...A1??[],...D1];return K.set("commands.allowlist",K1,"global")}).catch((A1)=>{k1.error("Failed to update allowlist",A1)})}if(S.type==="closing")return S;if(y.type==="thread-state"){let D1=y.thread.title||null;if(S.threadTitle!==D1&&D1!==null)$.next({type:"thread-title",title:D1});if(F.scanForTaskToolSubthreads(y.thread),w&&W.size===0&&y.thread.messages.length>0){let K1=gf(y.thread,W,N);if(K1.blocks.length>0)$.next({type:"messages",blocks:K1.blocks})}let A1=S.tokenUsage;if(y.thread){let K1=xa(y.thread);if(K1)A1={used:K1.totalInputTokens,maxAvailable:K1.maxInputTokens},$.next({type:"token-usage",tokenUsage:A1})}if(S.type==="awaiting-user-confirmation")if(y.thread.messages.at(-1)?.content.some((K1)=>K1.type==="tool_result"&&(K1.run.status==="in-progress"||K1.run.status==="done"))){let K1=lC(y.thread);if(K1)$.next({type:"state",state:K1});else $.next({type:"state",state:{type:"waiting-on-model",startTime:Date.now()}});return{...S,type:"awaiting-agent",displayedError:null,tokenUsage:A1}}else return{...S,type:"awaiting-user-confirmation",tokenUsage:A1};if(S.type==="awaiting-agent"||S.type==="compacting"){let K1=y.thread.messages.at(-1),X1=gf(y.thread,W,N),N1=X1.blocks;if(K1?.role==="assistant"&&K1.state.type==="streaming"&&X1.blocks.length===0){N1=[{type:"message",data:[y.thread.messages.length-1,K1]}];let U1=lC(y.thread);if(U1)$.next({type:"state",state:U1})}if(N1.length>0){for(let Y1 of N1)if(Y1.type==="toolResult"){let[U1,P1]=Y1.data,R1=P1.run.status==="done"?"completed":P1.run.status==="error"?"error":P1.run.status==="cancelled"?"cancelled":"running";if(R1!=="running")$.next({type:"tool-status",toolUse:U1,status:R1,startTime:V.get(U1.id),endTime:Date.now()}),V.delete(U1.id)}$.next({type:"messages",blocks:N1})}if(y.thread.messages.at(-1)?.content.some((Y1)=>Y1.type==="summary"))return{...z1(),tokenUsage:null,compactionPromptState:"none"};if(K1?.role==="assistant"&&K1?.state.type==="complete"&&K1?.state.stopReason==="end_turn"){$.next({type:"state",state:{type:"idle"}});let Y1=z1();return{...Y1,tokenUsage:A1??Y1.tokenUsage}}if(!I)throw new Error("unexpected: thread is required when waiting for tool input");let s=wz(y.thread,"assistant"),r=s?y.thread.messages.indexOf(s):null;if(r!==null&&r!==S.currentAssistantMessageIndex)k1.info("New assistant message detected, clearing tool confirmations",{oldIndex:S.currentAssistantMessageIndex,newIndex:r,previousToolCount:S.toolConfirmationStatus.size}),S.toolConfirmationStatus.clear(),S.currentAssistantMessageIndex=r;let e=wz(y.thread,"user")?.content.filter((Y1)=>Y1.type==="tool_result"&&Y1.run.status==="blocked-on-user")??[],G1=new Set(s?.content.filter((Y1)=>Y1.type==="tool_use").map((Y1)=>Y1.id)??[]),q1=!1;for(let Y1 of e){if(!G1.has(Y1.toolUseID))continue;let U1=y7(y.thread,Y1.toolUseID),P1=S.toolConfirmationStatus.get(Y1.toolUseID);if(U1&&U1.name===o4&&Y1.run.status==="blocked-on-user"&&P1===void 0){if(S.toolConfirmationStatus.set(Y1.toolUseID,"awaiting"),q1=!0,k1.info("Added new tool to confirmation tracking",{toolUseID:Y1.toolUseID,toolName:U1.name}),!V.has(U1.id))V.set(U1.id,Date.now());$.next({type:"tool-status",toolUse:U1,status:"blocked-on-user",startTime:V.get(U1.id)})}}if(q1){let Y1=Array.from(S.toolConfirmationStatus.entries()).filter(([U1,P1])=>P1==="awaiting");if(Y1.length>0){let[U1]=Y1[0],P1=e.find((T1)=>T1.toolUseID===U1),R1=P1?y7(y.thread,P1.toolUseID):null;if(P1&&R1)return k1.info(`Starting tool confirmation process for ${Y1.length} tools`,{firstToolID:U1,toolName:R1.name}),$.next({type:"confirm",confirmation:{type:"tool-use",tools:[{useBlock:R1,toAllow:P1.run.status==="blocked-on-user"?P1.run.toAllow:void 0}]}}),{...S,type:"collecting-tool-confirmations",currentToolID:U1,tokenUsage:A1}}}}}else if(y.type==="worker-state"){if(S.type==="awaiting-user-confirmation"&&y.status.state==="active"&&y.status.ephemeralError)return S;if(S.type==="collecting-tool-confirmations")return k1.info("Already collecting tool confirmations, ignoring worker-state event"),S;let D1=I.value.last?.messages.at(-1),A1=S.tokenUsage;if(y.status.state==="active"){let K1=I.value.last;if(K1){let X1=xa(K1);if(X1)A1={used:X1.totalInputTokens,maxAvailable:X1.maxInputTokens},$.next({type:"token-usage",tokenUsage:A1})}}if(S.type==="confirming-compaction"||S.type==="compacting")return{...S,tokenUsage:A1};switch(y.status.state){case"initial":if(S.type==="initializing")return S;return z1();case"active":if(y.status.ephemeralError)if(y.status.ephemeralError.message.includes(W4A)){if(S.type==="out-of-credits")return S;return $.next({type:"confirm",confirmation:{type:"out-of-credits"}}),{...S,type:"out-of-credits",tokenUsage:A1}}else if(M4A(y.status.ephemeralError))return k1.info("Context limit error, triggering compaction",{error:y.status.ephemeralError,tokenUsage:A1}),$.next({type:"confirm",confirmation:{type:"compaction",severity:"critical"}}),{type:"confirming-compaction",severity:"critical",tokenUsage:S.tokenUsage,compactionPromptState:S.compactionPromptState,updateState:S.updateState,toolConfirmationStatus:S.toolConfirmationStatus,currentAssistantMessageIndex:S.currentAssistantMessageIndex,hasBeenIdle:S.hasBeenIdle,threadTitle:S.threadTitle,confirmationQueue:S.confirmationQueue};else if(y.status.ephemeralError.message.includes("401 unauthorized"))return $.next({type:"error",error:{type:"unauthorized"},retryable:!1}),u.unsubscribe(),{...S,type:"closing"};else{let K1=y.status.ephemeralError.message;if(k1.error("Ephemeral error",{error:K1}),S.type==="awaiting-agent"&&S.displayedError!==K1)return $.next({type:"error",error:{type:"other",error:K1},retryable:!1}),{...S,type:"awaiting-user-confirmation",tokenUsage:A1};else return S}switch(y.status.inferenceState){case"running":{let K1=I.value.last;if(K1){let X1=lC(K1);if(X1)$.next({type:"state",state:X1});else $.next({type:"state",state:{type:"waiting-on-model",startTime:Date.now()}})}else $.next({type:"state",state:{type:"waiting-on-model",startTime:Date.now()}})}if(S.type==="initializing")return{...S,tokenUsage:A1};return{...S,type:"awaiting-agent",displayedError:null,tokenUsage:A1};case"cancelled":if(S.type==="initializing")return{...S,tokenUsage:A1};if($.next({type:"cancelled"}),$.next({type:"state",state:{type:"idle"}}),S.type==="awaiting-agent"&&S.cancelledWithMessage)return S.cancelledWithMessage=void 0,{...S,tokenUsage:A1};else return{...z1(),tokenUsage:A1};case"idle":if(S.type==="initializing")return{...S,tokenUsage:A1};if(D1?.content.some((K1)=>K1.type==="tool_result"&&K1.run.status==="blocked-on-user"))return{...S,type:"awaiting-user-confirmation",tokenUsage:A1};else if(I.value.last?.messages.some((K1)=>K1.role==="user"&&K1.content.some((X1)=>X1.type==="tool_result"&&X1.run.status==="in-progress"))??!1){let K1=I.value.last?.messages.flatMap((N1)=>N1.content).filter((N1)=>N1.type==="tool_result"&&("run"in N1)&&("status"in N1.run)&&N1.run.status==="in-progress"),X1=K1?.length??0;if(X1>0){for(let e of K1||[]){let G1=y7(I.value.last,e.toolUseID);if(G1){if(!V.has(e.toolUseID))V.set(e.toolUseID,Date.now());$.next({type:"tool-status",toolUse:G1,status:"running",startTime:V.get(e.toolUseID)})}}let N1=X1===1&&K1?.[0]&&I.value.last?y7(I.value.last,K1[0].toolUseID):void 0,s=X1>1&&K1&&I.value.last?K1.slice(1,Math.min(4,K1.length)).map((e)=>{return y7(I.value.last,e.toolUseID)?.name||"tool"}).filter(Boolean):void 0,r=N1?b51(N1.name,X1,Date.now(),N1.input,s):{type:"running-tools",toolCount:X1,startTime:Date.now(),queuedTools:s};$.next({type:"state",state:r})}else{let N1=I.value.last;if(N1){let s=lC(N1);if(s)$.next({type:"state",state:s});else $.next({type:"state",state:{type:"idle"}})}else $.next({type:"state",state:{type:"idle"}})}return{...S,type:"awaiting-agent",displayedError:null,tokenUsage:A1}}else if(D1?.role==="assistant"&&D1?.state.type==="complete"&&D1?.state.stopReason==="end_turn")return $.next({type:"state",state:{type:"idle"}}),{...z1(),tokenUsage:A1}}}}else if(y.type==="batch-tool-confirmations-complete")if(S.type==="collecting-tool-confirmations"&&S.subthreadContext)return k1.info("Sending batch tool confirmations to subthread",{subThreadID:S.subthreadContext.subThreadID,toolCount:y.responses.size,responses:Array.from(y.responses.entries()).map(([D1,A1])=>({id:D1,accepted:A1}))}),F.handleToolConfirmations(S.subthreadContext.subThreadID,y.responses).catch((D1)=>{k1.error("Failed to send subthread tool confirmations",D1)}),k1.info("Transitioning to awaiting-agent after sending subthread confirmations"),$.next({type:"state",state:{type:"running-tools",startTime:Date.now()}}),{...S,type:"awaiting-agent",displayedError:null};else return k1.info("Sending batch tool confirmations to worker",{toolCount:y.responses.size,responses:Array.from(y.responses.entries()).map(([D1,A1])=>({id:D1,accepted:A1}))}),y.responses.forEach((D1,A1)=>{k1.info("Sending individual tool confirmation to worker",{toolUseID:A1,accepted:D1}),T.handle({type:"user:tool-input",toolUse:A1,value:{accepted:D1}}),S.toolConfirmationStatus.set(A1,"sent")}),k1.info("Transitioning to awaiting-agent after sending batch confirmations"),$.next({type:"state",state:{type:"running-tools",startTime:Date.now()}}),{...S,type:"awaiting-agent",displayedError:null};else if(y.type==="summary:created"){let D1=I.value.last;if(D1){let A1=xa(D1);if(A1){let K1={used:A1.totalInputTokens,maxAvailable:A1.maxInputTokens},X1=S.type==="compacting"?S.preCompactionTokenUsage:null;if(X1){let N1=X1.used,s=K1.used,r=N1-s,e=N1>0?r/N1*100:0;if(r<=0)k1.warn("Compaction did not reduce token usage",{preUsed:N1,postUsed:s,reduction:r,threadID:E});else if(e<10)k1.warn("Compaction reduction was minimal",{preUsed:N1,postUsed:s,reduction:r,reductionPercent:e.toFixed(1),threadID:E});else k1.info("Compaction successful",{preUsed:N1,postUsed:s,reduction:r,reductionPercent:e.toFixed(1),threadID:E})}else k1.warn("No pre-compaction token usage available for validation",{threadID:E});$.next({type:"token-usage",tokenUsage:K1})}}return z1()}else if(y.type==="compaction-result")if(y.result)return z1();else return $.next({type:"error",error:{type:"other",error:"Compaction failed"},retryable:!1}),$.next({type:"confirm",confirmation:{type:"compaction",severity:y.severity}}),{...S,type:"confirming-compaction",severity:y.severity};else if(y.type==="update-start-updating")return{...S,updateState:"updating"};else if(y.type==="update-result")if(y.success)return setTimeout(()=>{P.next({type:"clear-update-status"})},1e4),{...S,updateState:"success"};else return setTimeout(()=>{P.next({type:"clear-update-status"})},1e4),{...S,updateState:"error"};else if(y.type==="clear-update-status")return{...S,updateState:"none"};else if(y.type==="agent-file-check-complete"){if(S.type==="checking-agent-file")if(y.shouldGenerate)return $.next({type:"confirm",confirmation:{type:"agent-file-creation"}}),{...S,type:"confirming-agent-file-creation"};else return z1()}else if(y.type==="tool-status")return $.next({type:"tool-status",toolUse:y.toolUse,status:y.status,startTime:y.startTime,endTime:y.endTime,subthreadID:y.subthreadID}),S;else if(y.type==="subagent-started"){if(S.type==="initializing")return S;return $.next({type:"subagent-started",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription}),S}else if(y.type==="subagent-status")return $.next({type:"subagent-status",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription,agentState:y.agentState}),S;else if(y.type==="subthread-message"){if(y.blocks.length>0)$.next({type:"subthread-messages",subThreadID:y.subThreadID,blocks:y.blocks});return S}else if(y.type==="historic-thread"){if(S.type!=="initializing")throw new Error(`Historic thread event received in unexpected state: ${S.type}`);if(w&&W.size===0&&y.messages.length>0){let A1=gf({id:E,messages:y.messages},W,N);if(A1.blocks.length>0)$.next({type:"messages",blocks:A1.blocks})}let D1={...S,hasThread:!0};if(D1.hasUI&&D1.hasThread)return z1();return D1}else if(y.type==="subagent-finished")return $.next({type:"subagent-finished",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription,result:y.result}),S;else if(y.type==="subagent-cancelled")return $.next({type:"subagent-cancelled",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription}),S;else if(y.type==="subagent-error")return $.next({type:"subagent-error",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription,error:y.error}),S;else if(y.type==="subthread-tool-request"){if(y.tools.length>0){if(k1.info(`Received tool confirmation request from subthread ${y.subThreadID}`,{subThreadID:y.subThreadID,agentNumber:y.agentNumber,toolCount:y.tools.length,tools:y.tools.map((D1)=>D1.useBlock.name),queueLength:S.confirmationQueue.length}),S.type==="collecting-tool-confirmations"||S.confirmationQueue.length>0)return k1.info("Queueing tool confirmation request",{subThreadID:y.subThreadID,agentNumber:y.agentNumber,currentQueueLength:S.confirmationQueue.length}),{...S,confirmationQueue:[...S.confirmationQueue,{type:"subthread-tool-request",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription,tools:y.tools}]};return $.next({type:"confirm",confirmation:{type:"tool-use",tools:y.tools,subthreadID:y.subThreadID,agentNumber:y.agentNumber}}),{...S,type:"collecting-tool-confirmations",currentToolID:y.tools[0]?.useBlock.id||null,subthreadContext:{subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription}}}return S}else if(y.type==="lsp-status")return $.next({type:"lsp-status",lspState:y.lspState}),S;else if(y.type==="ui-input"){if(y.input.type==="initialized")if(S.type==="initializing"){let D1={...S,hasUI:!0};if(D1.hasUI&&D1.hasThread)if(I.value.last?.messages.length===0)return k1.info("Checking agent file status"),I4A({filesystem:_(E),configService:Q,threadService:B},I.value.last).then((K1)=>{P.next({type:"agent-file-check-complete",shouldGenerate:K1.shouldGenerate})}).catch((K1)=>{k1.error("Agent file check failed",K1),P.next({type:"agent-file-check-complete",shouldGenerate:!1})}),{...S,type:"checking-agent-file"};else return z1();return D1}else throw new Error(`UI initialized event received in unexpected state: ${S.type}`);else if(y.input.type=="message"){let{message:D1}=y.input;return d(D1)}else if(y.input.type==="interrupt")if(S.type==="awaiting-agent"){if($.next({type:"cancelled"}),sZ.cancel(E),y.input.message)S.cancelledWithMessage=y.input.message;return S}else return S;else if(y.input.type==="exit")return u.unsubscribe(),{...S,type:"closing"};else if(y.input.type==="retry")return sZ.retry(E),{...S,type:"awaiting-agent",displayedError:null};else if(y.input.type==="confirmation"){if(S.type==="out-of-credits"&&y.input.confirmation.type==="out-of-credits")sZ.retry(E);else if(S.type==="confirming-compaction"&&y.input.confirmation.type==="compaction")if(y.input.allow){let D1="tokenUsage"in S?S.tokenUsage:void 0;return $.next({type:"state",state:{type:"compacting"}}),a().then(()=>{k1.info("Compaction completed successfully",{preCompactionTokenUsage:D1}),P.next({type:"compaction-result",result:!0,severity:S.severity})}).catch((A1)=>{k1.error("Compaction failed",A1),P.next({type:"compaction-result",result:!1,severity:S.severity})}),{...S,type:"compacting",preCompactionTokenUsage:D1}}else return k1.info("Compaction cancelled"),z1();else if(S.type==="collecting-tool-confirmations"&&y.input.confirmation.type==="tool-use"){if(!S.currentToolID)return k1.error("No current tool ID in collecting-tool-confirmations state"),S;if(k1.info(`Received confirmation for tool: ${y.input.allow?"accepted":"rejected"}`,{toolUseID:S.currentToolID,subthreadID:y.input.confirmation.subthreadID}),y.input.confirmation.subthreadID&&S.subthreadContext){k1.info("Sending tool confirmation to subthread",{subThreadID:S.subthreadContext.subThreadID,toolUseID:S.currentToolID,accepted:y.input.allow});let X1=new Map([[S.currentToolID,y.input.allow]]);if(F.handleToolConfirmations(S.subthreadContext.subThreadID,X1).catch((N1)=>{k1.error("Failed to send subthread tool confirmation",N1)}),S.confirmationQueue.length>0){let N1=S.confirmationQueue[0],s=S.confirmationQueue.slice(1);return k1.info("Processing next queued confirmation request",{subThreadID:N1.subThreadID,agentNumber:N1.agentNumber,remainingQueueLength:s.length}),$.next({type:"confirm",confirmation:{type:"tool-use",tools:N1.tools,subthreadID:N1.subThreadID,agentNumber:N1.agentNumber}}),{...S,type:"collecting-tool-confirmations",currentToolID:N1.tools[0]?.useBlock.id||null,subthreadContext:{subThreadID:N1.subThreadID,agentNumber:N1.agentNumber,taskDescription:N1.taskDescription},confirmationQueue:s}}return k1.info("Transitioning to awaiting-agent after sending subthread confirmation"),$.next({type:"state",state:{type:"running-tools",startTime:Date.now()}}),{...S,type:"awaiting-agent",displayedError:null}}S.toolConfirmationStatus.set(S.currentToolID,y.input.allow?"confirmed":"rejected"),t(y.input.confirmation.addToAllowList);let D1=Array.from(S.toolConfirmationStatus.entries()).filter(([X1,N1])=>N1==="awaiting");if(D1.length>0){let[X1]=D1[0];if(!I.value.isSet)return k1.error("Thread not available for finding next tool"),S;let r=(I.value.last.messages.at(-1)?.content.filter((G1)=>G1.type==="tool_result"&&G1.run.status==="blocked-on-user")??[]).find((G1)=>G1.toolUseID===X1),e=r?y7(I.value.last,r.toolUseID):null;if(r&&e)return k1.info(`Asking confirmation for next tool: ${e.name}`,{toolUseID:X1,remainingCount:D1.length}),$.next({type:"confirm",confirmation:{type:"tool-use",tools:[{useBlock:e,toAllow:r.run.status==="blocked-on-user"?r.run.toAllow:void 0}]}}),{...S,currentToolID:X1}}let A1=Array.from(S.toolConfirmationStatus.entries()).filter(([X1,N1])=>N1==="confirmed"||N1==="rejected");k1.info("All tool confirmations collected, sending batch response",{totalTools:A1.length,responses:A1.map(([X1,N1])=>({id:X1,accepted:N1==="confirmed"}))});let K1=new Map(A1.map(([X1,N1])=>[X1,N1==="confirmed"]));return P.next({type:"batch-tool-confirmations-complete",responses:K1}),$.next({type:"state",state:{type:"running-tools",startTime:Date.now()}}),{...S,type:"awaiting-agent",displayedError:null}}else if(y.input.confirmation.type==="agent-file-creation"&&S.type==="confirming-agent-file-creation")if(y.input.allow)return N4A(T).catch((D1)=>{k1.error("Agent file generation failed",D1)}),$.next({type:"state",state:{type:"generating-agent-file"}}),{...S,type:"awaiting-agent",displayedError:null};else return z1();return S}}return S}),{type:"initializing",hasUI:!1,hasThread:!1,tokenUsage:null,compactionPromptState:"none",updateState:"none",toolConfirmationStatus:new Map,currentAssistantMessageIndex:null,hasBeenIdle:!1,threadTitle:null,confirmationQueue:[]})).subscribe({error:(S)=>{k1.error("Error in state machine",S),b()}});if(w)G.get(E).then((S)=>{if(S&&S.messages)k1.info("Sending historic messages for initialization",{threadId:E,messageCount:S.messages.length}),P.next({type:"historic-thread",messages:S.messages});else k1.info("Sending empty messages for continued thread without stored messages",{threadId:E}),P.next({type:"historic-thread",messages:[]})});else k1.info("Sending empty messages for new thread initialization",{threadId:E}),P.next({type:"historic-thread",messages:[]});return ar6(P).catch((S)=>{k1.debug("Update check startup failed",S)}),await l6(g)}async function ar6(A){try{let Q=await O4A("0.0.1751587373-g37e9ff");if(Q.hasUpdate&&Q.latestVersion)A.next({type:"update-start-updating"}),setTimeout(async()=>{try{await L4A(Q.latestVersion),A.next({type:"update-result",success:!0,version:Q.latestVersion})}catch(B){k1.info("Update failed",B),A.next({type:"update-result",success:!1,version:Q.latestVersion})}},100);else k1.info("No update available")}catch(Q){k1.debug("Update check failed",Q)}}var m51={WARNING:0.8,SEVERE:0.9,CRITICAL:0.98};$2();AK();D2();gq();function T4A(A){let{stdout:Q,threadID:B,pipedInput:J}=A;function D(z){Q.write(JSON.stringify(z)+`
|
7413
|
+
${w}`))}}),q.on("error",(E)=>{z(new Error(`Failed to spawn ${B}: ${E.message}`))})})}async function _4A({threadSyncService:A,configService:Q,threadService:B,threadHistoryService:J,mcpService:D,fileWatcher:z,fuzzyServer:Z,summaryService:X,settingsStorage:K,threadStorage:G,toolService:q,systemPromptService:Y,subthreadTracker:F},{threadID:E,isContinued:w,ui:H}){let M=OT(),W=new Set,I=gW(B.observe(E).pipe(t7((S)=>S!==void 0))),N=new Set,V=new Map;await l6(I.observable);let _=await Rd,T=await sZ.getOrCreateForThread({configService:Q,threadService:B,toolService:q,getThreadEnvironment:Nf,systemPromptService:Y,threadSummaryService:X,createFileSystem:_,threadHistoryService:J,mcpService:D},E);await T.resume().catch((S)=>{k1.error("Initial resume",S)});let R=T.status.pipe(r6((S)=>{return{type:"worker-state",status:S}})),j=I.observable.pipe(r6((S)=>{return{type:"thread-state",thread:S}})),P=new C8,$=new C8,f=H(UA.from($)).pipe(r6((S)=>({type:"ui-input",input:S}))),m=F.events$.pipe(r6((S)=>S)),l=M.status.pipe(r6((S)=>({type:"lsp-status",lspState:S}))),v=hU(R,j,hU(P,f,m,l)),g=new C8;async function b(){if($.next({type:"state",state:{type:"shutting-down"}}),await A?.sync().catch((S)=>{k1.error("Thread sync error",S,{threadID:E})}),F.dispose(),await M.stopAllServers(),T.dispose(),A)A.dispose();B.dispose(),await D.dispose(),z[Symbol.dispose](),Z.dispose(),$.complete(),g.next()}let u=v.pipe(qZ(()=>{b()})).pipe(KT(n3("threadSession",function(S,y){function d(D1){k1.info(`Processing user message: ${D1.slice(0,50)}${D1.length>50?"...":""}`);let A1="tokenUsage"in S?S.tokenUsage:void 0;if(A1&&A1.used/A1.maxAvailable>m51.CRITICAL)return k1.info("Blocking message at worker boundary - critical token usage"),$.next({type:"confirm",confirmation:{type:"compaction",severity:"critical"}}),{type:"confirming-compaction",severity:"critical",tokenUsage:S.tokenUsage,compactionPromptState:"final",updateState:"updateState"in S?S.updateState:"none",toolConfirmationStatus:"toolConfirmationStatus"in S?S.toolConfirmationStatus:new Map,currentAssistantMessageIndex:("currentAssistantMessageIndex"in S?S.currentAssistantMessageIndex:null)??null,hasBeenIdle:"hasBeenIdle"in S?S.hasBeenIdle:!1,threadTitle:"threadTitle"in S?S.threadTitle:null,confirmationQueue:"confirmationQueue"in S?S.confirmationQueue:[]};T.handle({type:"user:message",message:{content:[{type:"text",text:D1}]}}).then(()=>{if(A)A.sync().catch((X1)=>{k1.error("Thread sync after submit error",X1,{threadID:E})})}).catch((X1)=>{k1.error("Handle user message failed",X1)}),$.next({type:"state",state:{type:"waiting-on-model",startTime:Date.now()}});let K1=I.value.last;if(K1){let X1=lC(K1);if(X1)$.next({type:"state",state:X1})}return{...S,type:"awaiting-agent",displayedError:null}}async function a(){$.next({type:"state",state:{type:"compacting"}});let D1=await X.summarizeThread(E);await T.handle({type:"summary:created",summary:{type:"internal",summary:D1.summary}})}function z1(){if(S.type==="awaiting-user-message")return k1.debug("already accepting, ignoring event",{state:S,event:y}),S;let D1="tokenUsage"in S?S.tokenUsage:void 0;if(A?.sync()?.catch((A1)=>{k1.error("Thread sync error",A1,{threadID:E})}),D1&&S.type!=="confirming-compaction"&&S.type!=="compacting"){let A1=D1.used/D1.maxAvailable,K1=void 0,X1=S.compactionPromptState;if(A1>m51.CRITICAL)K1="critical",X1="final";else if(A1>m51.WARNING&&S.compactionPromptState==="none")K1="moderate",X1="first";else if(A1>m51.SEVERE&&S.compactionPromptState==="first")K1="severe",X1="final";if(K1)return $.next({type:"confirm",confirmation:{type:"compaction",severity:K1}}),{type:"confirming-compaction",severity:K1,tokenUsage:S.tokenUsage,compactionPromptState:X1,updateState:S.updateState,toolConfirmationStatus:S.toolConfirmationStatus,currentAssistantMessageIndex:S.currentAssistantMessageIndex,hasBeenIdle:S.hasBeenIdle,threadTitle:S.threadTitle,confirmationQueue:S.confirmationQueue}}if($.next({type:"accept-message",initial:!S.hasBeenIdle&&!w}),S.type==="awaiting-agent")S.cancelledWithMessage=void 0;if(D1)$.next({type:"token-usage",tokenUsage:D1});return{...S,type:"awaiting-user-message",hasBeenIdle:!0,tokenUsage:D1??null}}function t(D1){if(D1.length>0)k1.info(`Updating allowlist with ${D1.length} entries`,{entries:D1}),K.get("commands.allowlist","global").then((A1)=>{let K1=[...A1??[],...D1];return K.set("commands.allowlist",K1,"global")}).catch((A1)=>{k1.error("Failed to update allowlist",A1)})}if(S.type==="closing")return S;if(y.type==="thread-state"){let D1=y.thread.title||null;if(S.threadTitle!==D1&&D1!==null)$.next({type:"thread-title",title:D1});if(F.scanForTaskToolSubthreads(y.thread),w&&W.size===0&&y.thread.messages.length>0){let K1=gf(y.thread,W,N);if(K1.blocks.length>0)$.next({type:"messages",blocks:K1.blocks})}let A1=S.tokenUsage;if(y.thread){let K1=xa(y.thread);if(K1)A1={used:K1.totalInputTokens,maxAvailable:K1.maxInputTokens},$.next({type:"token-usage",tokenUsage:A1})}if(S.type==="awaiting-user-confirmation")if(y.thread.messages.at(-1)?.content.some((K1)=>K1.type==="tool_result"&&(K1.run.status==="in-progress"||K1.run.status==="done"))){let K1=lC(y.thread);if(K1)$.next({type:"state",state:K1});else $.next({type:"state",state:{type:"waiting-on-model",startTime:Date.now()}});return{...S,type:"awaiting-agent",displayedError:null,tokenUsage:A1}}else return{...S,type:"awaiting-user-confirmation",tokenUsage:A1};if(S.type==="awaiting-agent"||S.type==="compacting"){let K1=y.thread.messages.at(-1),X1=gf(y.thread,W,N),N1=X1.blocks;if(K1?.role==="assistant"&&K1.state.type==="streaming"&&X1.blocks.length===0){N1=[{type:"message",data:[y.thread.messages.length-1,K1]}];let U1=lC(y.thread);if(U1)$.next({type:"state",state:U1})}if(N1.length>0){for(let Y1 of N1)if(Y1.type==="toolResult"){let[U1,P1]=Y1.data,R1=P1.run.status==="done"?"completed":P1.run.status==="error"?"error":P1.run.status==="cancelled"?"cancelled":"running";if(R1!=="running")$.next({type:"tool-status",toolUse:U1,status:R1,startTime:V.get(U1.id),endTime:Date.now()}),V.delete(U1.id)}$.next({type:"messages",blocks:N1})}if(y.thread.messages.at(-1)?.content.some((Y1)=>Y1.type==="summary"))return{...z1(),tokenUsage:null,compactionPromptState:"none"};if(K1?.role==="assistant"&&K1?.state.type==="complete"&&K1?.state.stopReason==="end_turn"){$.next({type:"state",state:{type:"idle"}});let Y1=z1();return{...Y1,tokenUsage:A1??Y1.tokenUsage}}if(!I)throw new Error("unexpected: thread is required when waiting for tool input");let s=wz(y.thread,"assistant"),r=s?y.thread.messages.indexOf(s):null;if(r!==null&&r!==S.currentAssistantMessageIndex)k1.info("New assistant message detected, clearing tool confirmations",{oldIndex:S.currentAssistantMessageIndex,newIndex:r,previousToolCount:S.toolConfirmationStatus.size}),S.toolConfirmationStatus.clear(),S.currentAssistantMessageIndex=r;let e=wz(y.thread,"user")?.content.filter((Y1)=>Y1.type==="tool_result"&&Y1.run.status==="blocked-on-user")??[],G1=new Set(s?.content.filter((Y1)=>Y1.type==="tool_use").map((Y1)=>Y1.id)??[]),q1=!1;for(let Y1 of e){if(!G1.has(Y1.toolUseID))continue;let U1=y7(y.thread,Y1.toolUseID),P1=S.toolConfirmationStatus.get(Y1.toolUseID);if(U1&&U1.name===o4&&Y1.run.status==="blocked-on-user"&&P1===void 0){if(S.toolConfirmationStatus.set(Y1.toolUseID,"awaiting"),q1=!0,k1.info("Added new tool to confirmation tracking",{toolUseID:Y1.toolUseID,toolName:U1.name}),!V.has(U1.id))V.set(U1.id,Date.now());$.next({type:"tool-status",toolUse:U1,status:"blocked-on-user",startTime:V.get(U1.id)})}}if(q1){let Y1=Array.from(S.toolConfirmationStatus.entries()).filter(([U1,P1])=>P1==="awaiting");if(Y1.length>0){let[U1]=Y1[0],P1=e.find((T1)=>T1.toolUseID===U1),R1=P1?y7(y.thread,P1.toolUseID):null;if(P1&&R1)return k1.info(`Starting tool confirmation process for ${Y1.length} tools`,{firstToolID:U1,toolName:R1.name}),$.next({type:"confirm",confirmation:{type:"tool-use",tools:[{useBlock:R1,toAllow:P1.run.status==="blocked-on-user"?P1.run.toAllow:void 0}]}}),{...S,type:"collecting-tool-confirmations",currentToolID:U1,tokenUsage:A1}}}}}else if(y.type==="worker-state"){if(S.type==="awaiting-user-confirmation"&&y.status.state==="active"&&y.status.ephemeralError)return S;if(S.type==="collecting-tool-confirmations")return k1.info("Already collecting tool confirmations, ignoring worker-state event"),S;let D1=I.value.last?.messages.at(-1),A1=S.tokenUsage;if(y.status.state==="active"){let K1=I.value.last;if(K1){let X1=xa(K1);if(X1)A1={used:X1.totalInputTokens,maxAvailable:X1.maxInputTokens},$.next({type:"token-usage",tokenUsage:A1})}}if(S.type==="confirming-compaction"||S.type==="compacting")return{...S,tokenUsage:A1};switch(y.status.state){case"initial":if(S.type==="initializing")return S;return z1();case"active":if(y.status.ephemeralError)if(y.status.ephemeralError.message.includes(W4A)){if(S.type==="out-of-credits")return S;return $.next({type:"confirm",confirmation:{type:"out-of-credits"}}),{...S,type:"out-of-credits",tokenUsage:A1}}else if(M4A(y.status.ephemeralError))return k1.info("Context limit error, triggering compaction",{error:y.status.ephemeralError,tokenUsage:A1}),$.next({type:"confirm",confirmation:{type:"compaction",severity:"critical"}}),{type:"confirming-compaction",severity:"critical",tokenUsage:S.tokenUsage,compactionPromptState:S.compactionPromptState,updateState:S.updateState,toolConfirmationStatus:S.toolConfirmationStatus,currentAssistantMessageIndex:S.currentAssistantMessageIndex,hasBeenIdle:S.hasBeenIdle,threadTitle:S.threadTitle,confirmationQueue:S.confirmationQueue};else if(y.status.ephemeralError.message.includes("401 unauthorized"))return $.next({type:"error",error:{type:"unauthorized"},retryable:!1}),u.unsubscribe(),{...S,type:"closing"};else{let K1=y.status.ephemeralError.message;if(k1.error("Ephemeral error",{error:K1}),S.type==="awaiting-agent"&&S.displayedError!==K1)return $.next({type:"error",error:{type:"other",error:K1},retryable:!1}),{...S,type:"awaiting-user-confirmation",tokenUsage:A1};else return S}switch(y.status.inferenceState){case"running":{let K1=I.value.last;if(K1){let X1=lC(K1);if(X1)$.next({type:"state",state:X1});else $.next({type:"state",state:{type:"waiting-on-model",startTime:Date.now()}})}else $.next({type:"state",state:{type:"waiting-on-model",startTime:Date.now()}})}if(S.type==="initializing")return{...S,tokenUsage:A1};return{...S,type:"awaiting-agent",displayedError:null,tokenUsage:A1};case"cancelled":if(S.type==="initializing")return{...S,tokenUsage:A1};if($.next({type:"cancelled"}),$.next({type:"state",state:{type:"idle"}}),S.type==="awaiting-agent"&&S.cancelledWithMessage)return S.cancelledWithMessage=void 0,{...S,tokenUsage:A1};else return{...z1(),tokenUsage:A1};case"idle":if(S.type==="initializing")return{...S,tokenUsage:A1};if(D1?.content.some((K1)=>K1.type==="tool_result"&&K1.run.status==="blocked-on-user"))return{...S,type:"awaiting-user-confirmation",tokenUsage:A1};else if(I.value.last?.messages.some((K1)=>K1.role==="user"&&K1.content.some((X1)=>X1.type==="tool_result"&&X1.run.status==="in-progress"))??!1){let K1=I.value.last?.messages.flatMap((N1)=>N1.content).filter((N1)=>N1.type==="tool_result"&&("run"in N1)&&("status"in N1.run)&&N1.run.status==="in-progress"),X1=K1?.length??0;if(X1>0){for(let e of K1||[]){let G1=y7(I.value.last,e.toolUseID);if(G1){if(!V.has(e.toolUseID))V.set(e.toolUseID,Date.now());$.next({type:"tool-status",toolUse:G1,status:"running",startTime:V.get(e.toolUseID)})}}let N1=X1===1&&K1?.[0]&&I.value.last?y7(I.value.last,K1[0].toolUseID):void 0,s=X1>1&&K1&&I.value.last?K1.slice(1,Math.min(4,K1.length)).map((e)=>{return y7(I.value.last,e.toolUseID)?.name||"tool"}).filter(Boolean):void 0,r=N1?b51(N1.name,X1,Date.now(),N1.input,s):{type:"running-tools",toolCount:X1,startTime:Date.now(),queuedTools:s};$.next({type:"state",state:r})}else{let N1=I.value.last;if(N1){let s=lC(N1);if(s)$.next({type:"state",state:s});else $.next({type:"state",state:{type:"idle"}})}else $.next({type:"state",state:{type:"idle"}})}return{...S,type:"awaiting-agent",displayedError:null,tokenUsage:A1}}else if(D1?.role==="assistant"&&D1?.state.type==="complete"&&D1?.state.stopReason==="end_turn")return $.next({type:"state",state:{type:"idle"}}),{...z1(),tokenUsage:A1}}}}else if(y.type==="batch-tool-confirmations-complete")if(S.type==="collecting-tool-confirmations"&&S.subthreadContext)return k1.info("Sending batch tool confirmations to subthread",{subThreadID:S.subthreadContext.subThreadID,toolCount:y.responses.size,responses:Array.from(y.responses.entries()).map(([D1,A1])=>({id:D1,accepted:A1}))}),F.handleToolConfirmations(S.subthreadContext.subThreadID,y.responses).catch((D1)=>{k1.error("Failed to send subthread tool confirmations",D1)}),k1.info("Transitioning to awaiting-agent after sending subthread confirmations"),$.next({type:"state",state:{type:"running-tools",startTime:Date.now()}}),{...S,type:"awaiting-agent",displayedError:null};else return k1.info("Sending batch tool confirmations to worker",{toolCount:y.responses.size,responses:Array.from(y.responses.entries()).map(([D1,A1])=>({id:D1,accepted:A1}))}),y.responses.forEach((D1,A1)=>{k1.info("Sending individual tool confirmation to worker",{toolUseID:A1,accepted:D1}),T.handle({type:"user:tool-input",toolUse:A1,value:{accepted:D1}}),S.toolConfirmationStatus.set(A1,"sent")}),k1.info("Transitioning to awaiting-agent after sending batch confirmations"),$.next({type:"state",state:{type:"running-tools",startTime:Date.now()}}),{...S,type:"awaiting-agent",displayedError:null};else if(y.type==="summary:created"){let D1=I.value.last;if(D1){let A1=xa(D1);if(A1){let K1={used:A1.totalInputTokens,maxAvailable:A1.maxInputTokens},X1=S.type==="compacting"?S.preCompactionTokenUsage:null;if(X1){let N1=X1.used,s=K1.used,r=N1-s,e=N1>0?r/N1*100:0;if(r<=0)k1.warn("Compaction did not reduce token usage",{preUsed:N1,postUsed:s,reduction:r,threadID:E});else if(e<10)k1.warn("Compaction reduction was minimal",{preUsed:N1,postUsed:s,reduction:r,reductionPercent:e.toFixed(1),threadID:E});else k1.info("Compaction successful",{preUsed:N1,postUsed:s,reduction:r,reductionPercent:e.toFixed(1),threadID:E})}else k1.warn("No pre-compaction token usage available for validation",{threadID:E});$.next({type:"token-usage",tokenUsage:K1})}}return z1()}else if(y.type==="compaction-result")if(y.result)return z1();else return $.next({type:"error",error:{type:"other",error:"Compaction failed"},retryable:!1}),$.next({type:"confirm",confirmation:{type:"compaction",severity:y.severity}}),{...S,type:"confirming-compaction",severity:y.severity};else if(y.type==="update-start-updating")return{...S,updateState:"updating"};else if(y.type==="update-result")if(y.success)return setTimeout(()=>{P.next({type:"clear-update-status"})},1e4),{...S,updateState:"success"};else return setTimeout(()=>{P.next({type:"clear-update-status"})},1e4),{...S,updateState:"error"};else if(y.type==="clear-update-status")return{...S,updateState:"none"};else if(y.type==="agent-file-check-complete"){if(S.type==="checking-agent-file")if(y.shouldGenerate)return $.next({type:"confirm",confirmation:{type:"agent-file-creation"}}),{...S,type:"confirming-agent-file-creation"};else return z1()}else if(y.type==="tool-status")return $.next({type:"tool-status",toolUse:y.toolUse,status:y.status,startTime:y.startTime,endTime:y.endTime,subthreadID:y.subthreadID}),S;else if(y.type==="subagent-started"){if(S.type==="initializing")return S;return $.next({type:"subagent-started",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription}),S}else if(y.type==="subagent-status")return $.next({type:"subagent-status",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription,agentState:y.agentState}),S;else if(y.type==="subthread-message"){if(y.blocks.length>0)$.next({type:"subthread-messages",subThreadID:y.subThreadID,blocks:y.blocks});return S}else if(y.type==="historic-thread"){if(S.type!=="initializing")throw new Error(`Historic thread event received in unexpected state: ${S.type}`);if(w&&W.size===0&&y.messages.length>0){let A1=gf({id:E,messages:y.messages},W,N);if(A1.blocks.length>0)$.next({type:"messages",blocks:A1.blocks})}let D1={...S,hasThread:!0};if(D1.hasUI&&D1.hasThread)return z1();return D1}else if(y.type==="subagent-finished")return $.next({type:"subagent-finished",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription,result:y.result}),S;else if(y.type==="subagent-cancelled")return $.next({type:"subagent-cancelled",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription}),S;else if(y.type==="subagent-error")return $.next({type:"subagent-error",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription,error:y.error}),S;else if(y.type==="subthread-tool-request"){if(y.tools.length>0){if(k1.info(`Received tool confirmation request from subthread ${y.subThreadID}`,{subThreadID:y.subThreadID,agentNumber:y.agentNumber,toolCount:y.tools.length,tools:y.tools.map((D1)=>D1.useBlock.name),queueLength:S.confirmationQueue.length}),S.type==="collecting-tool-confirmations"||S.confirmationQueue.length>0)return k1.info("Queueing tool confirmation request",{subThreadID:y.subThreadID,agentNumber:y.agentNumber,currentQueueLength:S.confirmationQueue.length}),{...S,confirmationQueue:[...S.confirmationQueue,{type:"subthread-tool-request",subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription,tools:y.tools}]};return $.next({type:"confirm",confirmation:{type:"tool-use",tools:y.tools,subthreadID:y.subThreadID,agentNumber:y.agentNumber}}),{...S,type:"collecting-tool-confirmations",currentToolID:y.tools[0]?.useBlock.id||null,subthreadContext:{subThreadID:y.subThreadID,agentNumber:y.agentNumber,taskDescription:y.taskDescription}}}return S}else if(y.type==="lsp-status")return $.next({type:"lsp-status",lspState:y.lspState}),S;else if(y.type==="ui-input"){if(y.input.type==="initialized")if(S.type==="initializing"){let D1={...S,hasUI:!0};if(D1.hasUI&&D1.hasThread)if(I.value.last?.messages.length===0)return k1.info("Checking agent file status"),I4A({filesystem:_(E),configService:Q,threadService:B},I.value.last).then((K1)=>{P.next({type:"agent-file-check-complete",shouldGenerate:K1.shouldGenerate})}).catch((K1)=>{k1.error("Agent file check failed",K1),P.next({type:"agent-file-check-complete",shouldGenerate:!1})}),{...S,type:"checking-agent-file"};else return z1();return D1}else throw new Error(`UI initialized event received in unexpected state: ${S.type}`);else if(y.input.type=="message"){let{message:D1}=y.input;return d(D1)}else if(y.input.type==="interrupt")if(S.type==="awaiting-agent"){if($.next({type:"cancelled"}),sZ.cancel(E),y.input.message)S.cancelledWithMessage=y.input.message;return S}else return S;else if(y.input.type==="exit")return u.unsubscribe(),{...S,type:"closing"};else if(y.input.type==="retry")return sZ.retry(E),{...S,type:"awaiting-agent",displayedError:null};else if(y.input.type==="confirmation"){if(S.type==="out-of-credits"&&y.input.confirmation.type==="out-of-credits")sZ.retry(E);else if(S.type==="confirming-compaction"&&y.input.confirmation.type==="compaction")if(y.input.allow){let D1="tokenUsage"in S?S.tokenUsage:void 0;return $.next({type:"state",state:{type:"compacting"}}),a().then(()=>{k1.info("Compaction completed successfully",{preCompactionTokenUsage:D1}),P.next({type:"compaction-result",result:!0,severity:S.severity})}).catch((A1)=>{k1.error("Compaction failed",A1),P.next({type:"compaction-result",result:!1,severity:S.severity})}),{...S,type:"compacting",preCompactionTokenUsage:D1}}else return k1.info("Compaction cancelled"),z1();else if(S.type==="collecting-tool-confirmations"&&y.input.confirmation.type==="tool-use"){if(!S.currentToolID)return k1.error("No current tool ID in collecting-tool-confirmations state"),S;if(k1.info(`Received confirmation for tool: ${y.input.allow?"accepted":"rejected"}`,{toolUseID:S.currentToolID,subthreadID:y.input.confirmation.subthreadID}),y.input.confirmation.subthreadID&&S.subthreadContext){k1.info("Sending tool confirmation to subthread",{subThreadID:S.subthreadContext.subThreadID,toolUseID:S.currentToolID,accepted:y.input.allow});let X1=new Map([[S.currentToolID,y.input.allow]]);if(F.handleToolConfirmations(S.subthreadContext.subThreadID,X1).catch((N1)=>{k1.error("Failed to send subthread tool confirmation",N1)}),S.confirmationQueue.length>0){let N1=S.confirmationQueue[0],s=S.confirmationQueue.slice(1);return k1.info("Processing next queued confirmation request",{subThreadID:N1.subThreadID,agentNumber:N1.agentNumber,remainingQueueLength:s.length}),$.next({type:"confirm",confirmation:{type:"tool-use",tools:N1.tools,subthreadID:N1.subThreadID,agentNumber:N1.agentNumber}}),{...S,type:"collecting-tool-confirmations",currentToolID:N1.tools[0]?.useBlock.id||null,subthreadContext:{subThreadID:N1.subThreadID,agentNumber:N1.agentNumber,taskDescription:N1.taskDescription},confirmationQueue:s}}return k1.info("Transitioning to awaiting-agent after sending subthread confirmation"),$.next({type:"state",state:{type:"running-tools",startTime:Date.now()}}),{...S,type:"awaiting-agent",displayedError:null}}S.toolConfirmationStatus.set(S.currentToolID,y.input.allow?"confirmed":"rejected"),t(y.input.confirmation.addToAllowList);let D1=Array.from(S.toolConfirmationStatus.entries()).filter(([X1,N1])=>N1==="awaiting");if(D1.length>0){let[X1]=D1[0];if(!I.value.isSet)return k1.error("Thread not available for finding next tool"),S;let r=(I.value.last.messages.at(-1)?.content.filter((G1)=>G1.type==="tool_result"&&G1.run.status==="blocked-on-user")??[]).find((G1)=>G1.toolUseID===X1),e=r?y7(I.value.last,r.toolUseID):null;if(r&&e)return k1.info(`Asking confirmation for next tool: ${e.name}`,{toolUseID:X1,remainingCount:D1.length}),$.next({type:"confirm",confirmation:{type:"tool-use",tools:[{useBlock:e,toAllow:r.run.status==="blocked-on-user"?r.run.toAllow:void 0}]}}),{...S,currentToolID:X1}}let A1=Array.from(S.toolConfirmationStatus.entries()).filter(([X1,N1])=>N1==="confirmed"||N1==="rejected");k1.info("All tool confirmations collected, sending batch response",{totalTools:A1.length,responses:A1.map(([X1,N1])=>({id:X1,accepted:N1==="confirmed"}))});let K1=new Map(A1.map(([X1,N1])=>[X1,N1==="confirmed"]));return P.next({type:"batch-tool-confirmations-complete",responses:K1}),$.next({type:"state",state:{type:"running-tools",startTime:Date.now()}}),{...S,type:"awaiting-agent",displayedError:null}}else if(y.input.confirmation.type==="agent-file-creation"&&S.type==="confirming-agent-file-creation")if(y.input.allow)return N4A(T).catch((D1)=>{k1.error("Agent file generation failed",D1)}),$.next({type:"state",state:{type:"generating-agent-file"}}),{...S,type:"awaiting-agent",displayedError:null};else return z1();return S}}return S}),{type:"initializing",hasUI:!1,hasThread:!1,tokenUsage:null,compactionPromptState:"none",updateState:"none",toolConfirmationStatus:new Map,currentAssistantMessageIndex:null,hasBeenIdle:!1,threadTitle:null,confirmationQueue:[]})).subscribe({error:(S)=>{k1.error("Error in state machine",S),b()}});if(w)G.get(E).then((S)=>{if(S&&S.messages)k1.info("Sending historic messages for initialization",{threadId:E,messageCount:S.messages.length}),P.next({type:"historic-thread",messages:S.messages});else k1.info("Sending empty messages for continued thread without stored messages",{threadId:E}),P.next({type:"historic-thread",messages:[]})});else k1.info("Sending empty messages for new thread initialization",{threadId:E}),P.next({type:"historic-thread",messages:[]});return ar6(P).catch((S)=>{k1.debug("Update check startup failed",S)}),await l6(g)}async function ar6(A){try{let Q=await O4A("0.0.1751599640-ge1e427");if(Q.hasUpdate&&Q.latestVersion)A.next({type:"update-start-updating"}),setTimeout(async()=>{try{await L4A(Q.latestVersion),A.next({type:"update-result",success:!0,version:Q.latestVersion})}catch(B){k1.info("Update failed",B),A.next({type:"update-result",success:!1,version:Q.latestVersion})}},100);else k1.info("No update available")}catch(Q){k1.debug("Update check failed",Q)}}var m51={WARNING:0.8,SEVERE:0.9,CRITICAL:0.98};$2();AK();D2();gq();function T4A(A){let{stdout:Q,threadID:B,pipedInput:J}=A;function D(z){Q.write(JSON.stringify(z)+`
|
7416
7414
|
`)}return(z)=>{let Z=new C8;if(!J)throw new Error("JSONL UI requires piped input (non-interactive mode)");return k1.debug("setting up JSONL UI"),z.pipe(Zi({onSubscribe:()=>{D({type:"initial",threadID:B}),CT().then(()=>{Z.next({type:"initialized"})})},onUnsubscribe:()=>{k1.debug("JSONL UI stopped")}})).pipe(qZ(()=>{Z.complete()})).pipe(KT(n3("JSONL",(X,K)=>{if(k1.debug("JSONL UI event",{event:K}),X.type==="shutting-down")return X;switch(K.type){case"messages":{let G=(E)=>{return E.map((w)=>{if(w.type==="text"){let{type:H,text:M}=w;return{type:H,text:M}}else if(w.type==="image"){let{type:H,source:M}=w;return{type:H,source:M}}else if(w.type==="tool_result"){let{type:H,toolUseID:M,run:W,userInput:I}=w;return{type:H,toolUseID:M,run:W,userInput:I}}else if(w.type==="thinking"){let{type:H,thinking:M}=w;return{type:H,thinking:M}}else if(w.type==="redacted_thinking"){let{type:H,data:M}=w;return{type:H,data:M}}else if(w.type==="tool_use"){let{type:H,id:M,name:W,input:I}=w,N={type:H,id:M,name:W};if(I!==void 0)N.input=I;return N}else if(w.type==="server_tool_use"){let{type:H,id:M,name:W,input:I}=w;return{type:H,id:M,name:W,input:I}}else if(w.type==="web_search_tool_result"){let{type:H,content:M}=w;return{type:H,content:M}}else if(w.type==="summary"){let{type:H,summary:M}=w;return{type:H,summary:M}}return w})},q=(E)=>{switch(E.status){case"blocked-on-user":case"rejected-by-user":return{status:E.status,toAllow:E.toAllow};case"error":return{status:"error",error:typeof E.error==="object"&&"message"in E.error?E.error:{message:String(E.error)}};case"cancelled":case"in-progress":return{status:E.status,progress:E.progress};case"done":return{status:"done",progress:E.progress,result:E.result,files:E.files};default:return{status:E.status}}},Y=[],F=[];for(let E of K.blocks)if(E.type==="message"){let[w,H]=E.data;if(H.role==="user"){let{role:M,content:W,meta:I}=H,N={role:M,content:G(W),meta:I};Y.push([w,N])}else if(H.role==="assistant"){let{role:M,content:W,state:I}=H,N={role:M,content:G(W),state:I};Y.push([w,N])}else if(H.role==="info"){let{role:M,content:W}=H,I={role:M,content:G(W)};Y.push([w,I])}else Y.push([w,H])}else if(E.type==="toolResult"){let[w,H]=E.data;if(w.input&&H.run!==void 0){let M={type:w.type,id:w.id,name:w.name,input:{}},W={type:H.type,toolUseID:H.toolUseID,run:q(z5(H.run))};F.push([M,W])}else k1.warn("Skipping tool result",{useBlock:w,resultBlock:H})}return D({type:"messages",messages:Y,toolResults:F}),X}case"cancelled":return D({type:"cancelled"}),X;case"tool-status":return D({type:"tool-status",toolUse:{id:K.toolUse.id,name:K.toolUse.name,input:K.toolUse.input},status:K.status,startTime:K.startTime,endTime:K.endTime,subthreadID:K.subthreadID}),X;case"token-usage":return D({type:"token-usage",tokenUsage:K.tokenUsage}),X;case"accept-message":if(X.type==="initializing")return k1.info("Sending piped input",{pipedInput:J}),Z.next({type:"message",message:J}),{type:"running"};else return Z.next({type:"exit"}),X;case"error":return D({type:"error",error:K.error}),Z.next({type:"exit"}),X;case"confirm":{if(K.confirmation.type==="tool-use")for(let{useBlock:G}of K.confirmation.tools){if(G.name===o4&&G.input&&typeof G.input==="object"&&"cmd"in G.input)D({type:"tool-rejected",tool:G.name,command:String(G.input.cmd),message:`Tool call rejected. To allow automatically, add to ${jE}: {"amp.commands.allowlist": [${JSON.stringify(G.input.cmd)}]}`});Z.next({type:"confirmation",confirmation:{type:"tool-use",toolUseID:G.id,addToAllowList:[]},allow:!1})}else if(K.confirmation.type==="compaction")Z.next({type:"confirmation",confirmation:K.confirmation,allow:!0});else if(K.confirmation.type==="agent-file-creation")Z.next({type:"confirmation",confirmation:K.confirmation,allow:!1});else if(K.confirmation.type==="out-of-credits")D({type:"out-of-credits",message:"Insufficient usage balance. Visit https://ampcode.com/pay to buy more usage."}),Z.next({type:"exit"});else Z.next({type:"confirmation",confirmation:K.confirmation,allow:!1});return X}case"subagent-started":return D({type:"subagent-started",subThreadID:K.subThreadID,agentNumber:K.agentNumber,taskDescription:K.taskDescription}),X;case"subagent-finished":return D({type:"subagent-finished",subThreadID:K.subThreadID,agentNumber:K.agentNumber,taskDescription:K.taskDescription,result:K.result}),X;case"subagent-cancelled":return D({type:"subagent-cancelled",subThreadID:K.subThreadID,agentNumber:K.agentNumber,taskDescription:K.taskDescription}),X;case"subagent-error":return D({type:"subagent-error",subThreadID:K.subThreadID,agentNumber:K.agentNumber,taskDescription:K.taskDescription,error:K.error}),X;case"subagent-status":return D({type:"subagent-status",subThreadID:K.subThreadID,agentNumber:K.agentNumber,taskDescription:K.taskDescription,agentState:K.agentState}),X;case"subthread-messages":{let G=K.blocks.filter((Y)=>Y.type==="message").length,q=K.blocks.filter((Y)=>Y.type==="toolResult").length;return D({type:"subthread-activity",subThreadID:K.subThreadID,messageCount:G,toolResultCount:q}),X}case"state":switch(K.state.type){case"shutting-down":return D({type:"shutdown"}),{type:"shutting-down"};default:return D({type:"state",state:K.state.type}),X}case"lsp-status":return D({type:"lsp-status",lspState:K.lspState}),X}return X}),{type:"initializing"})).subscribe({error:(X)=>{k1.error("Error in JSONL UI:",X),D({type:"error",error:{type:"other",error:X.toString()}}),Z.next({type:"exit"})}}),UA.from(Z)}}$2();AK();$2();import{exec as bf}from"node:child_process";function xf(A="idle"){try{if(A==="idle"){if(process.platform==="darwin")bf("afplay /System/Library/Sounds/Submarine.aiff");else if(process.platform==="win32")bf("powershell [console]::beep(800,200)");else if(process.platform==="linux")bf("paplay /usr/share/sounds/freedesktop/stereo/message.oga || beep")}else if(A==="requires-user-input"){if(process.platform==="darwin")bf("afplay /System/Library/Sounds/Ping.aiff");else if(process.platform==="win32")bf("powershell [console]::beep(1000,300)");else if(process.platform==="linux")bf("paplay /usr/share/sounds/freedesktop/stereo/dialog-information.oga || beep -f 1000 -l 100")}}catch(Q){k1.error(`Failed to play notification sound (${A}):`,Q)}}D2();$2();import{mkdir as j4A,readFile as P4A,writeFile as Ak1,open as nr6}from"node:fs/promises";import{homedir as sr6}from"node:os";import Ld from"node:path";var rr6=Ld.join(Vf||Ld.join(sr6(),".local/share"),"amp"),or6=Ld.join(rr6,"history.jsonl"),tr6=1000;class _d{history=[];index=-1;loaded=!1;historyFile;maxSize;constructor(A){this.historyFile=A?.historyFile||or6,this.maxSize=A?.maxSize||tr6,this.ensureLoaded()}async ensureLoaded(){if(!this.loaded)this.history=await this.readHistoryFromDisk(),this.loaded=!0}async readHistoryFromDisk(){try{let A=await P4A(this.historyFile,"utf-8");if(!A.trim())return[];return this.parseJsonlContent(A)}catch(A){if(A.code!=="ENOENT")return k1.warn("Failed to read history file",{error:A.message}),[];if(this.historyFile.endsWith(".jsonl")){let Q=this.historyFile.replace(".jsonl",".json");try{let B=await P4A(Q,"utf-8");if(B.trim()){let J=JSON.parse(B);k1.info("Migrating from old history.json to history.jsonl",{oldFile:Q,newFile:this.historyFile,size:J.length}),await this.writeHistoryToDisk(J);try{await import("node:fs/promises").then((D)=>D.unlink(Q))}catch{}return J}}catch{}}return[]}}parseJsonlContent(A){let Q=A.trim().split(`
|
7417
7415
|
`),B=[];for(let J of Q)if(J.trim())try{let D=JSON.parse(J);if(typeof D==="string")B.push(D);else k1.warn("Skipping non-string entry in history",{line:J,type:typeof D})}catch(D){k1.warn("Skipping invalid JSONL line in history",{line:J})}return k1.info("Loaded history from JSONL file",{file:this.historyFile,size:B.length}),B}async writeHistoryToDisk(A){await j4A(Ld.dirname(this.historyFile),{recursive:!0});let Q=A.map((B)=>JSON.stringify(B)).join(`
|
7418
7416
|
`)+`
|
@@ -7540,7 +7538,7 @@ Read about how to prevent this error on https://github.com/vadimdemedes/ink/#isr
|
|
7540
7538
|
`),d=0,a=0;for(let z1=0;z1<y.length;z1++){let t=g6.default(y[z1]).length;if(d+t>=Y){a=d;break}d+=t+1}if(Y>a){let z1=g6.default.substr(G,a,Y-a);N((t)=>[z1,...t.slice(0,9)]),q((t)=>{let D1=g6.default(t);return D1.slice(0,a).join("")+D1.slice(Y).join("")}),F(a)}return}if(u.ctrl&&b==="k"){let y=G.split(`
|
7541
7539
|
`),d=0,a=g6.default(G).length;for(let z1=0;z1<y.length;z1++){let t=g6.default(y[z1]).length;if(d+t>=Y){a=d+t;break}d+=t+1}if(Y<a){let z1=g6.default.substr(G,Y,a-Y);N((t)=>[z1,...t.slice(0,9)]),q((t)=>{let D1=g6.default(t);return D1.slice(0,Y).join("")+D1.slice(a).join("")})}return}if(u.ctrl&&b==="w"||u.alt&&u.backspace||u.ctrl&&u.backspace){if(Y>0){let y=VQA(G,Y),d=g6.default.substr(G,y,Y-y);N((a)=>[d,...a.slice(0,9)]),q((a)=>{let z1=g6.default(a);return z1.slice(0,y).join("")+z1.slice(Y).join("")}),F(y)}return}if(u.ctrl&&b==="d"||u.delete){if(Y<g6.default(G).length){let y=g6.default.substr(G,Y,1);N((d)=>[y,...d.slice(0,9)]),q((d)=>{let a=g6.default(d);return a.slice(0,Y).join("")+a.slice(Y+1).join("")})}return}if(u.alt&&b==="d"){if(Y<g6.default(G).length){let y=OQA(G,Y),d=g6.default.substr(G,Y,y-Y);N((a)=>[d,...a.slice(0,9)]),q((a)=>{let z1=g6.default(a);return z1.slice(0,Y).join("")+z1.slice(y).join("")})}return}if(u.ctrl&&b==="y"){if(I.length>0){let y=I[0];q((d)=>{let a=g6.default(d);return a.slice(0,Y).join("")+y+a.slice(Y).join("")}),F((d)=>d+g6.default(y).length)}return}let S=u.return&&(u.shift||u.meta||u.ctrl)||!u.return&&b==="\r"||u.escape&&u.meta&&!b||b==="\x1B[27;2;13~"||b==="[27;2;13~"||b==="\x1B[13;2u";if(k1.debug("Modified Enter detection",{isModifiedEnter:S,"key.return":u.return,"key.shift":u.shift,"key.meta":u.meta,"key.ctrl":u.ctrl,keyInput:JSON.stringify(b),hasContent:G.trim().length>0}),S){if($)return;q((y)=>{let d=g6.default(y);return d.slice(0,Y).join("")+`
|
7542
7540
|
`+d.slice(Y).join("")}),F((y)=>y+1);return}if(u.return&&!u.shift&&!u.meta&&!u.ctrl){if($)return;if(G.trim().length>0)g(G.trim());else return;return}if(!u.ctrl&&!u.meta&&!u.tab&&b)q((y)=>{let d=g6.default(y);return d.slice(0,Y).join("")+b+d.slice(Y).join("")}),F((y)=>y+g6.default(b).length)});let g=async(b)=>{if(K({virtualLine:0,column:0}),F(0),w(!0),q(""),N([]),_(!1),R(null),Q)Q.add(b),Q.reset();try{A(b)}catch(u){k1.error("Failed to submit message",u)}finally{w(!1)}};return fA(y6,{flexDirection:"column",width:"100%",flexGrow:1,flexShrink:0,ref:Z,children:M.map((b,u)=>fA(y6,{flexShrink:0,flexDirection:"row",children:fA(y6,{flexGrow:1,flexShrink:0,width:"100%",children:u===X.virtualLine?j9(Wy1,{children:[fA(h6,{dimColor:B,children:g6.default.substr(b.content,0,X.column)||""}),fA(h6,{inverse:!B,dimColor:B,children:g6.default(b.content)[X.column]??" "}),fA(h6,{dimColor:B,children:g6.default.substr(b.content,X.column+1)||""})]}):fA(h6,{dimColor:B,children:b.content||" "})})},u))})}function S12(A,Q){let B=A.split(`
|
7543
|
-
`),J=[],D=0;for(let z of B){let Z=g6.default(z);if(Z.length<=Q)J.push({type:"start",content:z,originalLine:D,start:0,end:Z.length});else{let X=z.match(/\S+| +/g)||[""],K="",G=0,q=0,Y=!0;for(let F of X){let E=/^ +$/.test(F),w=g6.default(F).length;if(g6.default(K).length+w<=Q)K+=F;else{if(K){let H=K.replace(/ +$/,""),M=g6.default(K),W=g6.default(H);J.push({type:Y?"start":"continuation",content:H,originalLine:D,start:G,end:G+W.length}),q=G+M.length,Y=!1}if(E){q+=w,G=q,K="";continue}if(G=q,w>Q){let H=g6.default(F);for(let M=0;M<H.length;M+=Q){let W=H.slice(M,M+Q).join("");J.push({type:Y?"start":"continuation",content:W,originalLine:D,start:G+M,end:G+M+g6.default(W).length}),Y=!1}q+=w,G=q,K=""}else K=F}if(!E||g6.default(K).length>0)q+=w}if(K){let F=g6.default(K);J.push({type:Y?"start":"continuation",content:K,originalLine:D,start:G,end:G+F.length})}}D++}return J}var o71=G6(z4(),1);function Oy1({options:A,onSelect:Q,title:B}){let[J,D]=o71.useState(0);if(rM((z,Z)=>{if(Z.downArrow||Z.ctrl&&z.toLowerCase()==="n"||Z.tab&&!Z.shift)D((X)=>(X+1)%A.length);else if(Z.upArrow||Z.ctrl&&z.toLowerCase()==="p"||Z.shift&&Z.tab)D((X)=>(X-1+A.length)%A.length);else if(Z.return&&A[J])Q(A[J].value);else if(Z.escape)Q(null);else if(Z.ctrlC)Q(null)}),o71.useEffect(()=>{D(0)},[A]),A.length===0)return null;return j9(y6,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[B&&fA(y6,{marginBottom:1,children:fA(h6,{bold:!0,children:B})}),A.map((z,Z)=>fA(y6,{children:j9(h6,{bold:Z===J,color:Z===J?"blue":void 0,children:[Z===J?"» ":" ",z.label]})},Z))]})}async function v12(A,Q){try{return await A.query(Q)}catch(B){return k1.error("Completion failed",B),[]}}var LQA=10;function $12({messages:A,agentState:Q}){if(Q.type!=="streaming-thinking"&&Q.type!=="streaming-text")return null;let B=A.findLast((z)=>z.type==="message"&&z.data[1].role==="assistant"&&z.data[1].state?.type==="streaming");if(!B||B.type!=="message")return null;let[,J]=B.data;if(!J.content.some((z)=>z.type==="thinking"||z.type==="text"))return null;return fA(y6,{flexDirection:"column",marginBottom:1,children:J.content.map((z,Z)=>{if(z.type==="thinking"){let X=z.thinking,K=cd(X,!0);return fA(y6,{flexDirection:"column",marginTop:Z>0?1:0,children:K.map((G,q)=>fA(y6,{children:fA(h6,{children:G})},q))},Z)}else if(z.type==="text")return fA(y6,{marginTop:Z>0?1:0,children:fA(Vy1,{children:z.text})},Z);return null})})}function f12(A,Q){let B;switch(A.type){case"tool-use":{if(A.tools.length===1){let J=A.tools[0];if(J?.useBlock)B=k12(J.useBlock);else B="Confirm tool call"}else B=`Confirm ${A.tools.length} tool calls`;break}case"compaction":B=`Compact thread? (${A.severity} token usage)`;break;case"out-of-credits":B="Insufficient usage balance. Retry?";break;case"agent-file-creation":B="Create AGENT.md file for this codebase?";break}if(Q&&Q.total>1)B=`[${Q.current}/${Q.total}] ${B}`;return B}function k12(A){if(A.name===o4){let Q=A.input;return"Run "+al.print(Q.cmd,{foreground:"green",style:"bold"})+`${Q.cwd?` in ${Q.cwd}`:""}?`}else return al.print(`Invoke tool ${A.name} with args ${JSON.stringify(A.input)}?`,{foreground:"yellow"})}function y12(A){switch(A.type){case"tool-use":{let B=A.subthreadID===void 0&&A.tools.some((D)=>D.toAllow),J=[{value:"yes",label:"Yes"},{value:"no",label:"No"}];if(B)J.push({value:"always",label:"Always (add to allowlist)"});return J}case"compaction":return[{value:"yes",label:"Yes"},...A.severity!=="critical"?[{value:"no",label:"No"}]:[]];case"out-of-credits":case"agent-file-creation":return[{value:"yes",label:"Yes"},{value:"no",label:"No"}]}}function g12({todos:A}){if(!Array.isArray(A)||A.length===0)return null;return j9(y6,{borderStyle:"round",paddingX:1,flexDirection:"column",flexGrow:1,flexShrink:0,children:[fA(y6,{children:j9(h6,{bold:!0,children:["TODOs (",A.length,")"]})}),A.map((Q,B)=>fA(y6,{gap:1,children:j9(h6,{wrap:"truncate",children:[fA(h6,{children:"• "}),fA(h6,{bold:Q.status==="in-progress",strikethrough:Q.status==="completed",children:Q.content})]})},Q.id))]})}function _QA(A){return A.filter((Q)=>Q.type==="message").map((Q)=>Q.data[1])}function TQA({outputs:A,inputs:Q,history:B,fuzzyServer:J,useNotifications:D}){let z=Ey1(),[Z,X]=Jk(),[K]=Q_.useState(()=>new C8);Q_.useEffect(()=>{return()=>{K.complete()}},[K]);let[G,q]=Q_.useState({type:"running",agentState:{type:"idle"},tokenUsage:null,lspState:null,todos:[],showCancelled:!1,rerendering:!1,confirmationQueue:[],currentConfirmation:void 0,totalConfirmations:0,threadTitle:"Untitled",messages:[],activeTools:new Map,subagents:new Map,completions:[],selectedCompletionIndex:0,currentMention:void 0}),Y=(M)=>{q((W)=>{if(W.type!=="confirming"||!W.currentConfirmation)return W;let I=W.currentConfirmation,N=W.confirmationQueue.slice(1),V=M===null?"no":M;if(I.type==="tool-use")for(let{useBlock:T,toAllow:R}of I.tools){let j=V==="yes"||V==="always",P=V==="always"&&R?R:[];Q.next({type:"confirmation",allow:j,confirmation:{type:"tool-use",toolUseID:T.id,addToAllowList:P,subthreadID:I.subthreadID}})}else{let T=V==="yes";Q.next({type:"confirmation",allow:T,confirmation:{type:I.type}})}let _=N[0];if(_)return{...W,type:"confirming",currentConfirmation:_,confirmationQueue:N};else return{...W,type:"running",currentConfirmation:void 0,confirmationQueue:N,totalConfirmations:0}})};Q_.useEffect(()=>{let M=A.subscribe((W)=>{switch(W.type){case"state":{switch(W.state.type){case"shutting-down":q({...G,type:"exiting"}),CT().then(()=>{z.exit()});break;case"idle":if(D)xf("idle");q((I)=>({...I,agentState:W.state}));break;default:q((I)=>({...I,agentState:W.state}));break}break}case"messages":{q((I)=>{let N=[...I.messages,...W.blocks],V=_QA(N),_=ma({messages:V});return{...I,messages:N,todos:Array.isArray(_)?_:[],showCancelled:!1}});break}case"token-usage":{q((I)=>({...I,tokenUsage:W.tokenUsage}));break}case"lsp-status":{q((I)=>({...I,lspState:W.lspState}));break}case"cancelled":{q((I)=>({...I,showCancelled:!0,activeTools:new Map,subagents:new Map}));break}case"tool-status":{q((I)=>{let N=new Map(I.activeTools);if(W.toolUse.name===FQ)return{...I,activeTools:N};if(W.status==="completed"||W.status==="error"||W.status==="cancelled")N.delete(W.toolUse.id);else{let V=W.subthreadID;N.set(W.toolUse.id,{toolUse:W.toolUse,status:W.status,startTime:W.startTime,endTime:W.endTime,subthreadID:V})}return{...I,activeTools:N}});break}case"subthread-messages":break;case"subagent-started":{q((I)=>({...I,subagents:new Map(I.subagents).set(W.subThreadID,{subThreadID:W.subThreadID,agentNumber:W.agentNumber,taskDescription:W.taskDescription,status:"running",startTime:Date.now()})}));break}case"subagent-finished":{q((I)=>{let N=new Map(I.subagents);return N.delete(W.subThreadID),{...I,subagents:N}});break}case"subagent-cancelled":{q((I)=>{let N=new Map(I.subagents);return N.delete(W.subThreadID),{...I,subagents:N}});break}case"subagent-error":{q((I)=>{let N=new Map(I.subagents);return N.delete(W.subThreadID),{...I,subagents:N}});break}case"subagent-status":{q((I)=>{let N=new Map(I.subagents),V=N.get(W.subThreadID);if(V)N.set(W.subThreadID,{...V,agentState:W.agentState});return{...I,subagents:N}});break}case"confirm":{if(D)xf("requires-user-input");q((I)=>{let N=[...I.confirmationQueue,W.confirmation];if(I.type==="running"&&N.length===1)return{...I,type:"confirming",currentConfirmation:W.confirmation,confirmationQueue:N,totalConfirmations:N.length};else return{...I,confirmationQueue:N,totalConfirmations:Math.max(I.totalConfirmations,N.length)}});break}case"thread-title":{q((I)=>({...I,threadTitle:W.title}));break}default:k1.info("unhandled ui output",W);break}});return()=>{M.unsubscribe()}},[A,z]);let F=async(M,W)=>{let I=await v12(J,M);q((N)=>({...N,completions:I,selectedCompletionIndex:0,currentMention:W}))},E=()=>{q((M)=>({...M,completions:[],selectedCompletionIndex:0,currentMention:void 0}))},w=(M)=>{if(M!==null)K.next(M),q((W)=>({...W,completions:[],selectedCompletionIndex:0,currentMention:void 0}));else E()};Q_.useEffect(()=>{let M=null,W=()=>{q((I)=>({...I,rerendering:!0})),process.stdout.write("\x1B[2J"),process.stdout.write("\x1B[3J"),process.stdout.write("\x1B[H"),M=setTimeout(()=>{q((I)=>({...I,rerendering:!1}))},LQA)};return process.stdout.on("resize",W),()=>{if(M)clearTimeout(M);process.stdout.off("resize",W)}},[]),rM((M,W)=>{if(G.type==="expanded-view")return;if(G.type==="confirming")return;if(W.escape)Q.next({type:"interrupt"});else if(W.ctrl&&M.toLowerCase()==="r")q({...G,type:"expanded-view"});else if(W.ctrlL)q((I)=>({...I,rerendering:!0})),process.stdout.write("\x1B[2J"),process.stdout.write("\x1B[3J"),process.stdout.write("\x1B[H"),setTimeout(()=>{q((I)=>({...I,rerendering:!1}))},LQA);else if(W.ctrlC)if(G.type==="confirming-exit")Q.next({type:"exit"});else q({...G,type:"confirming-exit"}),setTimeout(()=>{q({...G,type:"running"})},1000)});let H=Z>100;if(G.type==="expanded-view"){let M=_QA(G.messages);return fA(CQA,{threadName:G.threadTitle,messages:M,onExit:()=>q({...G,type:"running"})})}return j9(y6,{flexDirection:"column",minHeight:"100%",flexGrow:1,height:G.rerendering&&G.messages.length==0?0:"auto",children:[!G.rerendering&&fA(c71,{items:G.messages,children:(M,W)=>fA(y6,{children:fA(b12,{block:M,marginTop:W===0?0:1},W)},W)}),G.showCancelled&&fA(y6,{marginTop:1,children:fA(h6,{color:"gray",children:"Cancelled"})}),G.type!=="exiting"&&j9(y6,{flexDirection:"column",marginTop:1,children:[fA($12,{messages:G.messages,agentState:G.agentState}),fA(GQA,{agentState:G.agentState,activeTools:G.activeTools,subagents:G.subagents}),fA(WQA,{activeTools:G.activeTools,subagents:G.subagents,messages:G.messages}),G.type==="confirming"&&G.currentConfirmation&&fA(y6,{marginBottom:1,children:fA(Oy1,{title:f12(G.currentConfirmation,{current:G.totalConfirmations-G.confirmationQueue.length,total:G.totalConfirmations}),options:y12(G.currentConfirmation),onSelect:Y})}),j9(y6,{flexDirection:H?"row-reverse":"column",children:[G.todos.length>0&&fA(y6,{flexGrow:0,flexShrink:0,width:H?"auto":"100%",children:fA(g12,{todos:G.todos})}),fA(y6,{flexGrow:1,borderStyle:"round",paddingX:1,children:fA(RQA,{onSubmit:(M)=>{Q.next({type:"message",message:M})},history:B,disabled:G.type==="confirming",onCompletionRequest:F,onCompletionCancel:E,selectedCompletions:K})})]}),G.completions.length>0&&(()=>{let M=Math.min(10,Math.max(3,Math.floor(X*0.4))),W=G.completions.slice(0,M);return fA(y6,{marginBottom:1,children:fA(Oy1,{title:`File mentions (${W.length}${G.completions.length>M?`/${G.completions.length}`:""})`,options:W.map((I)=>({value:I,label:I})),onSelect:w})})})(),j9(y6,{gap:2,children:[j9(y6,{flexGrow:1,children:[G.type==="confirming-exit"&&fA(h6,{dimColor:!0,children:"Ctrl+C again to exit"}),G.type==="confirming"&&fA(h6,{dimColor:!0,children:"Escape to cancel"}),G.type==="running"&&j9(y6,{gap:1,children:[fA(y6,{gap:1,children:fA(h6,{dimColor:!0,children:"Enter to submit,"})}),fA(y6,{gap:1,children:fA(h6,{dimColor:!0,children:"Ctrl+R to expand"})})]})]}),j9(y6,{flexGrow:0,gap:2,children:[fA(h12,{lspState:G.lspState}),G.tokenUsage&&fA(x12,{tokenUsage:G.tokenUsage})]})]})]})]})}function b12({block:A,marginTop:Q=0}){if(A.type==="message"){let[,B]=A.data;if(B.role==="assistant"&&B.state?.type==="streaming")return null;if(!B.content.some((D)=>D.type==="text"&&B.role!=="info"))return null;return fA(y6,{flexDirection:"column",gap:1,marginTop:Q,children:B.content.map((D,z)=>{if(D.type==="text")switch(B.role){case"assistant":return fA(y6,{children:fA(Vy1,{children:D.text})},z);case"user":return fA(y6,{borderStyle:"bold",borderColor:"green",borderLeft:!0,borderTop:!1,borderBottom:!1,borderRight:!1,paddingLeft:1,children:fA(h6,{color:"green",italic:!0,children:D.text})},z);case"info":return fA(y6,{children:fA(h6,{color:"gray",children:D.text})},z)}else if(D.type==="thinking"){let Z=D.thinking,X=cd(Z,!1);if(X.length===0)return null;return fA(y6,{flexDirection:"column",children:X.map((K,G)=>fA(y6,{children:fA(h6,{children:K})},G))},z)}return null})})}else if(A.type==="toolResult"){let[B,J]=A.data,D=r71(B,J,!1);if(D.length===0)return null;return fA(y6,{marginTop:Q,flexDirection:"column",children:D.map((z,Z)=>fA(y6,{children:fA(h6,{children:z})},Z))})}}function x12({tokenUsage:A}){let Q=A.used/A.maxAvailable,B=Math.round(Q*100),J=Math.max(0,Math.min(B,100)),D="▁▂▃▄▅▆▇█",z=Math.floor(J*8/100),X="▁▂▃▄▅▆▇█"[Math.max(0,Math.min(z,7))],K=`${J}% ┃${X}┃`,G=0.8,q=0.9,Y;if(Q>=0.9)Y="red";else if(Q>=0.8)Y="yellow";return fA(h6,{color:Y,children:K})}function h12({lspState:A}){if(!A||Object.keys(A.servers).length===0)return null;let Q=Object.values(A.servers).map((B)=>{let J=B.status==="active"?"✓":B.status==="starting"?"⧗":"×",D=B.status==="active"?"green":B.status==="starting"?"yellow":"red";return{symbol:J,serverName:B.serverName,color:D}});return fA(y6,{gap:1,children:Q.map(({symbol:B,serverName:J,color:D},z)=>j9(h6,{color:D,children:[B," ",J]},z))})}global.React=Ry1.default;function jQA(A){return JA.level=1,(Q)=>{let B=new C8;return Fy1(Ry1.default.createElement(TQA,{inputs:B,outputs:Q,history:A.history,fuzzyServer:A.fuzzyServer,useNotifications:A.useNotifications}),{patchConsole:!0,exitOnCtrlC:!1,stdout:A.stdout}).waitUntilExit().then(()=>{B.complete()}).catch((D)=>{B.next({type:"exit"})}),UA.from(B)}}var _y1=Ly1.join(CAA||Ly1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");async function Ty1(A){try{await u12(Ly1.dirname(_y1),{recursive:!0}),await c12(_y1,A,"utf-8")}catch(Q){k1.debug("Failed to save last thread ID",Q)}}async function t71(){try{return(await p12(_y1,"utf-8")).trim()}catch(A){return null}}var l12=[{name:"notifications",long:"notifications",type:"flag",default:!1,description:(A)=>`${A?"Enable":"Disable"} sound notifications (enabled by default when interactive)`},{name:"interactive",long:"interactive",type:"switch",default:!1,description:"Force interactive mode"},{name:"color",long:"color",type:"flag",description:(A)=>`${A?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",description:`Custom settings file path (overrides the default location ${jE})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(k1).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:"Set log file location"},{name:"format",long:"format",type:"option",default:"ui",description:"Output format (ui: interactive terminal, jsonl: JSON Lines for scripts)",choices:["ui","jsonl","new-ui"],hidden:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:process.env.TERMINAL_EMULATOR?.includes("JetBrains")??!1,description:(A)=>`${A?"Enable":"Disable"} JetBrains integration. Requires the JetBrains MCP plugin to be installed and you must start Amp in the same directory as your JetBrains project. When enabled, Amp CLI automatically includes your open JetBrains file and text selection with every message, just like it does in VS Code.`,hidden:!0}];function d12(A,Q){let B=Q.args[0],J=Q.commands.map((z)=>z.name());if(B&&!B.includes(" ")&&B.length<30&&!/[./\\]/.test(B)){let z=J.filter((X)=>B.includes(X)||X.includes(B)),Z="Run amp --help for a list of available commands.";if(z.length>0)Z=`Did you mean: ${z.join(", ")}? Or run amp --help for all commands.`;throw new eZ(Qq.unknownCommand(B),1,Z)}}class SQA{async environment(){let A=process.cwd(),Q=j8.file(A),B=tK1(null),J=await mn1(Q,B,{workingDirectory:Q});return{workspacePaths:[A],workingDirectory:A,rootDirectoryListing:J}}}async function B_(A,Q){Cd({logLevel:Q.logLevel||process.env.AMP_LOG_LEVEL,logFile:Q.logFile||process.env.AMP_LOG_FILE}),sc1("0.0.1751587373-g37e9ff");let B=Q.settingsFile??process.env.AMP_SETTINGS_FILE;k1.info("Using settings file",{settingsFile:B});let J=tl(),D=pv1({settingsFile:B}),z=process.env.AMP_API_KEY;if(z)await J.set("apiKey",z,A.ampURL);let Z=gX1({storage:D,secretStorage:J,workspaceRoots:UA.of([j8.file(process.cwd())]),defaultAmpURL:A.ampURL}),X=new SQA,K=yq(),G=ua1({configService:Z,toolService:K});try{await G.initialized}catch(_){k1.warn("Failed to wait for MCP servers, continuing anyway:",_)}let q=await l6(r8);if(Q.dangerouslyAllowAll)q.settings.dangerouslyAllowAll=!0;if(Q.jetbrains)q.settings["jetbrains.enabled"]=!0;let Y=q.settings["experimental.reviewTool"]??!1,F=q.settings["experimental.tools"]??[];mP1(K,!1,Y,F);let E,w;if(A.isInteractiveMode){E=new S51,await E.start();try{await u9A(E,process.cwd())}catch(_){k1.error("Failed to index files for fuzzy completion",_)}w=p9A(E,process.cwd())}else E=new class extends S51{async start(){}async query(){return[]}dispose(){}},w={[Symbol.dispose]:()=>{}};if(!await J.get("apiKey",A.ampURL)){if(K7.write(`No API key found. Starting login flow...
|
7541
|
+
`),J=[],D=0;for(let z of B){let Z=g6.default(z);if(Z.length<=Q)J.push({type:"start",content:z,originalLine:D,start:0,end:Z.length});else{let X=z.match(/\S+| +/g)||[""],K="",G=0,q=0,Y=!0;for(let F of X){let E=/^ +$/.test(F),w=g6.default(F).length;if(g6.default(K).length+w<=Q)K+=F;else{if(K){let H=K.replace(/ +$/,""),M=g6.default(K),W=g6.default(H);J.push({type:Y?"start":"continuation",content:H,originalLine:D,start:G,end:G+W.length}),q=G+M.length,Y=!1}if(E){q+=w,G=q,K="";continue}if(G=q,w>Q){let H=g6.default(F);for(let M=0;M<H.length;M+=Q){let W=H.slice(M,M+Q).join("");J.push({type:Y?"start":"continuation",content:W,originalLine:D,start:G+M,end:G+M+g6.default(W).length}),Y=!1}q+=w,G=q,K=""}else K=F}if(!E||g6.default(K).length>0)q+=w}if(K){let F=g6.default(K);J.push({type:Y?"start":"continuation",content:K,originalLine:D,start:G,end:G+F.length})}}D++}return J}var o71=G6(z4(),1);function Oy1({options:A,onSelect:Q,title:B}){let[J,D]=o71.useState(0);if(rM((z,Z)=>{if(Z.downArrow||Z.ctrl&&z.toLowerCase()==="n"||Z.tab&&!Z.shift)D((X)=>(X+1)%A.length);else if(Z.upArrow||Z.ctrl&&z.toLowerCase()==="p"||Z.shift&&Z.tab)D((X)=>(X-1+A.length)%A.length);else if(Z.return&&A[J])Q(A[J].value);else if(Z.escape)Q(null);else if(Z.ctrlC)Q(null)}),o71.useEffect(()=>{D(0)},[A]),A.length===0)return null;return j9(y6,{flexDirection:"column",borderStyle:"round",paddingX:1,children:[B&&fA(y6,{marginBottom:1,children:fA(h6,{bold:!0,children:B})}),A.map((z,Z)=>fA(y6,{children:j9(h6,{bold:Z===J,color:Z===J?"blue":void 0,children:[Z===J?"» ":" ",z.label]})},Z))]})}async function v12(A,Q){try{return await A.query(Q)}catch(B){return k1.error("Completion failed",B),[]}}var LQA=10;function $12({messages:A,agentState:Q}){if(Q.type!=="streaming-thinking"&&Q.type!=="streaming-text")return null;let B=A.findLast((z)=>z.type==="message"&&z.data[1].role==="assistant"&&z.data[1].state?.type==="streaming");if(!B||B.type!=="message")return null;let[,J]=B.data;if(!J.content.some((z)=>z.type==="thinking"||z.type==="text"))return null;return fA(y6,{flexDirection:"column",marginBottom:1,children:J.content.map((z,Z)=>{if(z.type==="thinking"){let X=z.thinking,K=cd(X,!0);return fA(y6,{flexDirection:"column",marginTop:Z>0?1:0,children:K.map((G,q)=>fA(y6,{children:fA(h6,{children:G})},q))},Z)}else if(z.type==="text")return fA(y6,{marginTop:Z>0?1:0,children:fA(Vy1,{children:z.text})},Z);return null})})}function f12(A,Q){let B;switch(A.type){case"tool-use":{if(A.tools.length===1){let J=A.tools[0];if(J?.useBlock)B=k12(J.useBlock);else B="Confirm tool call"}else B=`Confirm ${A.tools.length} tool calls`;break}case"compaction":B=`Compact thread? (${A.severity} token usage)`;break;case"out-of-credits":B="Insufficient usage balance. Retry?";break;case"agent-file-creation":B="Create AGENT.md file for this codebase?";break}if(Q&&Q.total>1)B=`[${Q.current}/${Q.total}] ${B}`;return B}function k12(A){if(A.name===o4){let Q=A.input;return"Run "+al.print(Q.cmd,{foreground:"green",style:"bold"})+`${Q.cwd?` in ${Q.cwd}`:""}?`}else return al.print(`Invoke tool ${A.name} with args ${JSON.stringify(A.input)}?`,{foreground:"yellow"})}function y12(A){switch(A.type){case"tool-use":{let B=A.subthreadID===void 0&&A.tools.some((D)=>D.toAllow),J=[{value:"yes",label:"Yes"},{value:"no",label:"No"}];if(B)J.push({value:"always",label:"Always (add to allowlist)"});return J}case"compaction":return[{value:"yes",label:"Yes"},...A.severity!=="critical"?[{value:"no",label:"No"}]:[]];case"out-of-credits":case"agent-file-creation":return[{value:"yes",label:"Yes"},{value:"no",label:"No"}]}}function g12({todos:A}){if(!Array.isArray(A)||A.length===0)return null;return j9(y6,{borderStyle:"round",paddingX:1,flexDirection:"column",flexGrow:1,flexShrink:0,children:[fA(y6,{children:j9(h6,{bold:!0,children:["TODOs (",A.length,")"]})}),A.map((Q,B)=>fA(y6,{gap:1,children:j9(h6,{wrap:"truncate",children:[fA(h6,{children:"• "}),fA(h6,{bold:Q.status==="in-progress",strikethrough:Q.status==="completed",children:Q.content})]})},Q.id))]})}function _QA(A){return A.filter((Q)=>Q.type==="message").map((Q)=>Q.data[1])}function TQA({outputs:A,inputs:Q,history:B,fuzzyServer:J,useNotifications:D}){let z=Ey1(),[Z,X]=Jk(),[K]=Q_.useState(()=>new C8);Q_.useEffect(()=>{return()=>{K.complete()}},[K]);let[G,q]=Q_.useState({type:"running",agentState:{type:"idle"},tokenUsage:null,lspState:null,todos:[],showCancelled:!1,rerendering:!1,confirmationQueue:[],currentConfirmation:void 0,totalConfirmations:0,threadTitle:"Untitled",messages:[],activeTools:new Map,subagents:new Map,completions:[],selectedCompletionIndex:0,currentMention:void 0}),Y=(M)=>{q((W)=>{if(W.type!=="confirming"||!W.currentConfirmation)return W;let I=W.currentConfirmation,N=W.confirmationQueue.slice(1),V=M===null?"no":M;if(I.type==="tool-use")for(let{useBlock:T,toAllow:R}of I.tools){let j=V==="yes"||V==="always",P=V==="always"&&R?R:[];Q.next({type:"confirmation",allow:j,confirmation:{type:"tool-use",toolUseID:T.id,addToAllowList:P,subthreadID:I.subthreadID}})}else{let T=V==="yes";Q.next({type:"confirmation",allow:T,confirmation:{type:I.type}})}let _=N[0];if(_)return{...W,type:"confirming",currentConfirmation:_,confirmationQueue:N};else return{...W,type:"running",currentConfirmation:void 0,confirmationQueue:N,totalConfirmations:0}})};Q_.useEffect(()=>{let M=A.subscribe((W)=>{switch(W.type){case"state":{switch(W.state.type){case"shutting-down":q({...G,type:"exiting"}),CT().then(()=>{z.exit()});break;case"idle":if(D)xf("idle");q((I)=>({...I,agentState:W.state}));break;default:q((I)=>({...I,agentState:W.state}));break}break}case"messages":{q((I)=>{let N=[...I.messages,...W.blocks],V=_QA(N),_=ma({messages:V});return{...I,messages:N,todos:Array.isArray(_)?_:[],showCancelled:!1}});break}case"token-usage":{q((I)=>({...I,tokenUsage:W.tokenUsage}));break}case"lsp-status":{q((I)=>({...I,lspState:W.lspState}));break}case"cancelled":{q((I)=>({...I,showCancelled:!0,activeTools:new Map,subagents:new Map}));break}case"tool-status":{q((I)=>{let N=new Map(I.activeTools);if(W.toolUse.name===FQ)return{...I,activeTools:N};if(W.status==="completed"||W.status==="error"||W.status==="cancelled")N.delete(W.toolUse.id);else{let V=W.subthreadID;N.set(W.toolUse.id,{toolUse:W.toolUse,status:W.status,startTime:W.startTime,endTime:W.endTime,subthreadID:V})}return{...I,activeTools:N}});break}case"subthread-messages":break;case"subagent-started":{q((I)=>({...I,subagents:new Map(I.subagents).set(W.subThreadID,{subThreadID:W.subThreadID,agentNumber:W.agentNumber,taskDescription:W.taskDescription,status:"running",startTime:Date.now()})}));break}case"subagent-finished":{q((I)=>{let N=new Map(I.subagents);return N.delete(W.subThreadID),{...I,subagents:N}});break}case"subagent-cancelled":{q((I)=>{let N=new Map(I.subagents);return N.delete(W.subThreadID),{...I,subagents:N}});break}case"subagent-error":{q((I)=>{let N=new Map(I.subagents);return N.delete(W.subThreadID),{...I,subagents:N}});break}case"subagent-status":{q((I)=>{let N=new Map(I.subagents),V=N.get(W.subThreadID);if(V)N.set(W.subThreadID,{...V,agentState:W.agentState});return{...I,subagents:N}});break}case"confirm":{if(D)xf("requires-user-input");q((I)=>{let N=[...I.confirmationQueue,W.confirmation];if(I.type==="running"&&N.length===1)return{...I,type:"confirming",currentConfirmation:W.confirmation,confirmationQueue:N,totalConfirmations:N.length};else return{...I,confirmationQueue:N,totalConfirmations:Math.max(I.totalConfirmations,N.length)}});break}case"thread-title":{q((I)=>({...I,threadTitle:W.title}));break}default:k1.info("unhandled ui output",W);break}});return()=>{M.unsubscribe()}},[A,z]);let F=async(M,W)=>{let I=await v12(J,M);q((N)=>({...N,completions:I,selectedCompletionIndex:0,currentMention:W}))},E=()=>{q((M)=>({...M,completions:[],selectedCompletionIndex:0,currentMention:void 0}))},w=(M)=>{if(M!==null)K.next(M),q((W)=>({...W,completions:[],selectedCompletionIndex:0,currentMention:void 0}));else E()};Q_.useEffect(()=>{let M=null,W=()=>{q((I)=>({...I,rerendering:!0})),process.stdout.write("\x1B[2J"),process.stdout.write("\x1B[3J"),process.stdout.write("\x1B[H"),M=setTimeout(()=>{q((I)=>({...I,rerendering:!1}))},LQA)};return process.stdout.on("resize",W),()=>{if(M)clearTimeout(M);process.stdout.off("resize",W)}},[]),rM((M,W)=>{if(G.type==="expanded-view")return;if(G.type==="confirming")return;if(W.escape)Q.next({type:"interrupt"});else if(W.ctrl&&M.toLowerCase()==="r")q({...G,type:"expanded-view"});else if(W.ctrlL)q((I)=>({...I,rerendering:!0})),process.stdout.write("\x1B[2J"),process.stdout.write("\x1B[3J"),process.stdout.write("\x1B[H"),setTimeout(()=>{q((I)=>({...I,rerendering:!1}))},LQA);else if(W.ctrlC)if(G.type==="confirming-exit")Q.next({type:"exit"});else q({...G,type:"confirming-exit"}),setTimeout(()=>{q({...G,type:"running"})},1000)});let H=Z>100;if(G.type==="expanded-view"){let M=_QA(G.messages);return fA(CQA,{threadName:G.threadTitle,messages:M,onExit:()=>q({...G,type:"running"})})}return j9(y6,{flexDirection:"column",minHeight:"100%",flexGrow:1,height:G.rerendering&&G.messages.length==0?0:"auto",children:[!G.rerendering&&fA(c71,{items:G.messages,children:(M,W)=>fA(y6,{children:fA(b12,{block:M,marginTop:W===0?0:1},W)},W)}),G.showCancelled&&fA(y6,{marginTop:1,children:fA(h6,{color:"gray",children:"Cancelled"})}),G.type!=="exiting"&&j9(y6,{flexDirection:"column",marginTop:1,children:[fA($12,{messages:G.messages,agentState:G.agentState}),fA(GQA,{agentState:G.agentState,activeTools:G.activeTools,subagents:G.subagents}),fA(WQA,{activeTools:G.activeTools,subagents:G.subagents,messages:G.messages}),G.type==="confirming"&&G.currentConfirmation&&fA(y6,{marginBottom:1,children:fA(Oy1,{title:f12(G.currentConfirmation,{current:G.totalConfirmations-G.confirmationQueue.length,total:G.totalConfirmations}),options:y12(G.currentConfirmation),onSelect:Y})}),j9(y6,{flexDirection:H?"row-reverse":"column",children:[G.todos.length>0&&fA(y6,{flexGrow:0,flexShrink:0,width:H?"auto":"100%",children:fA(g12,{todos:G.todos})}),fA(y6,{flexGrow:1,borderStyle:"round",paddingX:1,children:fA(RQA,{onSubmit:(M)=>{Q.next({type:"message",message:M})},history:B,disabled:G.type==="confirming",onCompletionRequest:F,onCompletionCancel:E,selectedCompletions:K})})]}),G.completions.length>0&&(()=>{let M=Math.min(10,Math.max(3,Math.floor(X*0.4))),W=G.completions.slice(0,M);return fA(y6,{marginBottom:1,children:fA(Oy1,{title:`File mentions (${W.length}${G.completions.length>M?`/${G.completions.length}`:""})`,options:W.map((I)=>({value:I,label:I})),onSelect:w})})})(),j9(y6,{gap:2,children:[j9(y6,{flexGrow:1,children:[G.type==="confirming-exit"&&fA(h6,{dimColor:!0,children:"Ctrl+C again to exit"}),G.type==="confirming"&&fA(h6,{dimColor:!0,children:"Escape to cancel"}),G.type==="running"&&j9(y6,{gap:1,children:[fA(y6,{gap:1,children:fA(h6,{dimColor:!0,children:"Enter to submit,"})}),fA(y6,{gap:1,children:fA(h6,{dimColor:!0,children:"Ctrl+R to expand"})})]})]}),j9(y6,{flexGrow:0,gap:2,children:[fA(h12,{lspState:G.lspState}),G.tokenUsage&&fA(x12,{tokenUsage:G.tokenUsage})]})]})]})]})}function b12({block:A,marginTop:Q=0}){if(A.type==="message"){let[,B]=A.data;if(B.role==="assistant"&&B.state?.type==="streaming")return null;if(!B.content.some((D)=>D.type==="text"&&B.role!=="info"))return null;return fA(y6,{flexDirection:"column",gap:1,marginTop:Q,children:B.content.map((D,z)=>{if(D.type==="text")switch(B.role){case"assistant":return fA(y6,{children:fA(Vy1,{children:D.text})},z);case"user":return fA(y6,{borderStyle:"bold",borderColor:"green",borderLeft:!0,borderTop:!1,borderBottom:!1,borderRight:!1,paddingLeft:1,children:fA(h6,{color:"green",italic:!0,children:D.text})},z);case"info":return fA(y6,{children:fA(h6,{color:"gray",children:D.text})},z)}else if(D.type==="thinking"){let Z=D.thinking,X=cd(Z,!1);if(X.length===0)return null;return fA(y6,{flexDirection:"column",children:X.map((K,G)=>fA(y6,{children:fA(h6,{children:K})},G))},z)}return null})})}else if(A.type==="toolResult"){let[B,J]=A.data,D=r71(B,J,!1);if(D.length===0)return null;return fA(y6,{marginTop:Q,flexDirection:"column",children:D.map((z,Z)=>fA(y6,{children:fA(h6,{children:z})},Z))})}}function x12({tokenUsage:A}){let Q=A.used/A.maxAvailable,B=Math.round(Q*100),J=Math.max(0,Math.min(B,100)),D="▁▂▃▄▅▆▇█",z=Math.floor(J*8/100),X="▁▂▃▄▅▆▇█"[Math.max(0,Math.min(z,7))],K=`${J}% ┃${X}┃`,G=0.8,q=0.9,Y;if(Q>=0.9)Y="red";else if(Q>=0.8)Y="yellow";return fA(h6,{color:Y,children:K})}function h12({lspState:A}){if(!A||Object.keys(A.servers).length===0)return null;let Q=Object.values(A.servers).map((B)=>{let J=B.status==="active"?"✓":B.status==="starting"?"⧗":"×",D=B.status==="active"?"green":B.status==="starting"?"yellow":"red";return{symbol:J,serverName:B.serverName,color:D}});return fA(y6,{gap:1,children:Q.map(({symbol:B,serverName:J,color:D},z)=>j9(h6,{color:D,children:[B," ",J]},z))})}global.React=Ry1.default;function jQA(A){return JA.level=1,(Q)=>{let B=new C8;return Fy1(Ry1.default.createElement(TQA,{inputs:B,outputs:Q,history:A.history,fuzzyServer:A.fuzzyServer,useNotifications:A.useNotifications}),{patchConsole:!0,exitOnCtrlC:!1,stdout:A.stdout}).waitUntilExit().then(()=>{B.complete()}).catch((D)=>{B.next({type:"exit"})}),UA.from(B)}}var _y1=Ly1.join(CAA||Ly1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");async function Ty1(A){try{await u12(Ly1.dirname(_y1),{recursive:!0}),await c12(_y1,A,"utf-8")}catch(Q){k1.debug("Failed to save last thread ID",Q)}}async function t71(){try{return(await p12(_y1,"utf-8")).trim()}catch(A){return null}}var l12=[{name:"notifications",long:"notifications",type:"flag",default:!1,description:(A)=>`${A?"Enable":"Disable"} sound notifications (enabled by default when interactive)`},{name:"interactive",long:"interactive",type:"switch",default:!1,description:"Force interactive mode"},{name:"color",long:"color",type:"flag",description:(A)=>`${A?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",description:`Custom settings file path (overrides the default location ${jE})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(k1).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:"Set log file location"},{name:"format",long:"format",type:"option",default:"ui",description:"Output format (ui: interactive terminal, jsonl: JSON Lines for scripts)",choices:["ui","jsonl","new-ui"],hidden:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:process.env.TERMINAL_EMULATOR?.includes("JetBrains")??!1,description:(A)=>`${A?"Enable":"Disable"} JetBrains integration. Requires the JetBrains MCP plugin to be installed and you must start Amp in the same directory as your JetBrains project. When enabled, Amp CLI automatically includes your open JetBrains file and text selection with every message, just like it does in VS Code.`,hidden:!0}];function d12(A,Q){let B=Q.args[0],J=Q.commands.map((z)=>z.name());if(B&&!B.includes(" ")&&B.length<30&&!/[./\\]/.test(B)){let z=J.filter((X)=>B.includes(X)||X.includes(B)),Z="Run amp --help for a list of available commands.";if(z.length>0)Z=`Did you mean: ${z.join(", ")}? Or run amp --help for all commands.`;throw new eZ(Qq.unknownCommand(B),1,Z)}}class SQA{async environment(){let A=process.cwd(),Q=j8.file(A),B=tK1(null),J=await mn1(Q,B,{workingDirectory:Q});return{workspacePaths:[A],workingDirectory:A,rootDirectoryListing:J}}}async function B_(A,Q){Cd({logLevel:Q.logLevel||process.env.AMP_LOG_LEVEL,logFile:Q.logFile||process.env.AMP_LOG_FILE}),sc1("0.0.1751599640-ge1e427");let B=Q.settingsFile??process.env.AMP_SETTINGS_FILE;k1.info("Using settings file",{settingsFile:B});let J=tl(),D=pv1({settingsFile:B}),z=process.env.AMP_API_KEY;if(z)await J.set("apiKey",z,A.ampURL);let Z=gX1({storage:D,secretStorage:J,workspaceRoots:UA.of([j8.file(process.cwd())]),defaultAmpURL:A.ampURL}),X=new SQA,K=yq(),G=ua1({configService:Z,toolService:K});try{await G.initialized}catch(_){k1.warn("Failed to wait for MCP servers, continuing anyway:",_)}let q=await l6(r8);if(Q.dangerouslyAllowAll)q.settings.dangerouslyAllowAll=!0;if(Q.jetbrains)q.settings["jetbrains.enabled"]=!0;let Y=q.settings["experimental.reviewTool"]??!1,F=q.settings["experimental.tools"]??[];mP1(K,!1,Y,F);let E,w;if(A.isInteractiveMode){E=new S51,await E.start();try{await u9A(E,process.cwd())}catch(_){k1.error("Failed to index files for fuzzy completion",_)}w=p9A(E,process.cwd())}else E=new class extends S51{async start(){}async query(){return[]}dispose(){}},w={[Symbol.dispose]:()=>{}};if(!await J.get("apiKey",A.ampURL)){if(K7.write(`No API key found. Starting login flow...
|
7544
7542
|
`),!await i12(A,J))process.exit(1)}let H=oa1(),M=new _G1(H),W=new LG1(H),I=new dF1(M),N=new ef1({configService:Z,threadService:M,toolService:K,systemPromptService:X,threadSummaryService:I,threadHistoryService:W,mcpService:G}),V=void 0;return k1.info("Starting Amp background services"),V=dn1({threadService:M,threadHistoryService:W,isExtensionDevelopment:!1}),{configService:Z,systemPromptService:X,toolService:K,mcpService:G,threadService:M,threadHistoryService:W,summaryService:I,threadSyncService:V,threadStorage:H,secretStorage:J,settingsStorage:D,fileWatcher:w,fuzzyServer:E,subthreadTracker:N}}async function i12(A,Q){if(A.isInteractiveMode){if(await fE("Would you like to log in to Amp?",["(y)es","(n)o"])!="y")return K7.write(`Login cancelled. Run the command again to retry.
|
7545
7543
|
`),!1}return await vQA(A,Q)}async function vQA(A,Q){let B=m12(32).toString("hex"),J=await q4A(A.ampURL,B);K7.write(`If your browser doesn't open automatically, visit:
|
7546
7544
|
|
@@ -7555,8 +7553,8 @@ ${A.printer.print(J,{foreground:"blue",style:"bold"})}
|
|
7555
7553
|
Login successful! You can now use the Amp CLI.
|
7556
7554
|
`),!0}catch(D){return L8.write(`
|
7557
7555
|
Login failed: ${D instanceof Error?D.message:String(D)}
|
7558
|
-
`),!1}}var a12=new Set(["fuzzy-server"]);function n12(A){let Q=new s41().name("amp").description("AI-powered coding assistant").option("--thread-id [THREAD_ID]","ID of the thread to continue running",void 0);Q.exitOverride((Z)=>{if(Z.code==="commander.help"||Z.code==="commander.version"||Z.exitCode===0)fC(),process.exit(0);let X=Z.originalError??Z;Cf(A,X)}),Q.option("-V, --version","output the version number",()=>{if(A.isTTY)K7.write(`0.0.
|
7559
|
-
`);else K7.write(`0.0.
|
7556
|
+
`),!1}}var a12=new Set(["fuzzy-server"]);function n12(A){let Q=new s41().name("amp").description("AI-powered coding assistant").option("--thread-id [THREAD_ID]","ID of the thread to continue running",void 0);Q.exitOverride((Z)=>{if(Z.code==="commander.help"||Z.code==="commander.version"||Z.exitCode===0)fC(),process.exit(0);let X=Z.originalError??Z;Cf(A,X)}),Q.option("-V, --version","output the version number",()=>{if(A.isTTY)K7.write(`0.0.1751599640-ge1e427 ${A.printer.print("(released 2025-07-04T03:35:00.922Z)",{foreground:"gray"})}
|
7557
|
+
`);else K7.write(`0.0.1751599640-ge1e427 (released 2025-07-04T03:35:00.922Z)
|
7560
7558
|
`);process.exit(0)}),Q.addHelpText("after",(()=>{let Z="";Z+=A.printer.print("Environment variables:",{style:"bold"})+`
|
7561
7559
|
|
7562
7560
|
`,Z+=" "+A.printer.print("AMP_API_KEY",{foreground:"green"})+` API key for Amp (see https://ampcode.com/settings)
|
package/package.json
CHANGED