@sourcegraph/amp 0.0.1759219286-g0d79d3 → 0.0.1759233723-gf92434
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 +7 -7
- package/package.json +1 -1
package/dist/main.js
CHANGED
@@ -5440,7 +5440,7 @@ See https://ampcode.com/manual#toolboxes`);return Q[0]||oj}function mJ6(J,Q){let
|
|
5440
5440
|
`);J.command("use").argument("<tool-name>","The tool to invoke").summary("Invoke a tool with arguments or JSON input from stdin").description(Z).option("--only <field>","Extract only the specified field from the result").allowUnknownOption(!0).allowExcessArguments(!0).action(async function(X,Y,K){let q=K.optsWithGlobals(),G=await Q(K,q),z=0;await G.mcpService.initialized;let U=K.args.slice(1),F;if(fJ6()){let W=[];for await(let H of process.stdin)W.push(H);F=Buffer.concat(W).toString("utf-8").trim()}await xJ6({toolName:X,rawArgs:U,stdinInput:F,only:Y.only,threadDeps:G,stdout:process.stdout,stderr:process.stderr,exit:(W)=>{z=W}}),await G.asyncDispose(),G.cleanupTerminal(),process.exit(z)})}var uJ6=p(()=>{vS();FV();AJ6();IJ6();$J6();hJ6()});function pJ6(J){let Q=J.trim();if(Q==="quit"||Q==="exit")return"/quit";return J}import H29 from"node:fs";import dJ6 from"node:path";function cJ6(J){let Q=J.trim().replace(/^["']|["']$/g,"");if(Q=Q.replace(/\\(.)/g,"$1"),!/\.(png|jpe?g|gif|webp)$/i.test(Q))return null;if(!dJ6.isAbsolute(Q))return null;return a.debug("Extracted image path",{original:J,extracted:Q}),Q}function lJ6(J){try{let Q=dJ6.extname(J).toLowerCase(),Z=Oo1(Q);if(!Z)return a.warn("Unsupported image file extension",{ext:Q}),null;try{let X=H29.readFileSync(J);return B29(X,Z)}catch(X){a.error(`Failed to read image file ${J}:`,X)}}catch(Q){a.error("Error handling image file path",{imagePath:J,error:Q})}return null}function B29(J,Q){if(J.length>BR)return a.warn(`Image file too large: ${J.length} bytes (max: ${BR})`),null;return{type:"image",source:{type:"base64",data:J.toString("base64"),mediaType:Q}}}var iJ6=p(()=>{D0();$N()});function nJ6(J){return J.kind==="executable"}function aJ6(J){return J.kind==="markdown"}import{spawn as D29}from"node:child_process";import{promises as M29}from"node:fs";async function nb1(J,Q,Z,X={}){let{timeoutMs:Y=rJ6,signal:K}=X;try{let q=await Z.getCommand(J);if(!q)return{success:!1,output:"",error:`Command '${J}' not found`};if(!await Z.isCommandAvailable(J))return{success:!1,output:"",error:`Command '${J}' is not available for execution`};if(a.debug("Executing command",{commandName:J,filePath:q.filePath,args:Q}),aJ6(q))return await V29(q,Q);else if(nJ6(q))return await N29(q,Q,Y,K);else return{success:!1,output:"",error:"Unsupported command type"}}catch(q){return a.error("Failed to execute command",{commandName:J,error:q}),{success:!1,output:"",error:q instanceof Error?q.message:"Unknown error occurred"}}}async function V29(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await M29.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>OH?Z.slice(0,OH)+`
|
5441
5441
|
... (output truncated at ${OH} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function N29(J,Q,Z=rJ6,X){return new Promise((Y)=>{let[K,q]=L29(J,Q);a.debug("Spawning command",{spawnCommand:K,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Z});let G=Mo1(X),z=!1,U=setTimeout(()=>{z=!0,G.abort(),a.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),F=D29(K,q,{stdio:["pipe","pipe","pipe"],signal:G.signal,detached:!0}),W=[],H=[],D=0;F.stdout?.on("data",(M)=>{let V=M.toString();if(D+=V.length,D<=OH)W.push(V);else{let N=OH-(D-V.length);if(N>0)W.push(V.slice(0,N))}}),F.stderr?.on("data",(M)=>{let V=M.toString();if(D+=V.length,D<=OH)H.push(V);else{let N=OH-(D-V.length);if(N>0)H.push(V.slice(0,N))}}),F.on("close",(M)=>{if(clearTimeout(U),z){Y({success:!1,output:W.join(""),error:`Command timed out after ${Z}ms`,exitCode:void 0});return}if(G.signal.aborted){Y({success:!1,output:W.join(""),error:"The command was aborted",exitCode:M??void 0});return}let V=M===0||M===1,N=W.join(""),L=H.join(""),O=N;if(!V&&!N.trim()&&L.trim())O=L;else if(L.trim())O+=N?`
|
5442
5442
|
${L}`:L;if(D>OH)O+=`
|
5443
|
-
... (output truncated at ${OH} characters)`;Y({success:V,output:O.trim(),error:!V?L.trim()||"Command failed":void 0,exitCode:M??void 0})}),F.on("error",(M)=>{clearTimeout(U);let V=M.message;if(z)V=`Command timed out after ${Z}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")V="The command was aborted";Y({success:!1,output:W.join(""),error:V})})})}function L29(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return A29(Z,X?[...X]:null,Y,Q);else return O29(Z,X?[...X]:null,Y,Q)}function O29(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function A29(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}var OH=50000,rJ6=300000;var sJ6=p(()=>{WR();D0()});var oJ6=p(()=>{sJ6();mJ1()});var C41,Sz2,vz2,kz2,_z2,bz2,xz2,yz2,fz2,hz2,hm,gz2,mz2,uz2,pz2,dz2;var tJ6=p(()=>{C41=globalThis.window?.document!==void 0,Sz2=globalThis.process?.versions?.node!==void 0,vz2=globalThis.process?.versions?.bun!==void 0,kz2=globalThis.Deno?.version?.deno!==void 0,_z2=globalThis.process?.versions?.electron!==void 0,bz2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,xz2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,yz2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,fz2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,hz2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,hm=globalThis.navigator?.userAgentData?.platform,gz2=hm==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",mz2=hm==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",uz2=hm==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",pz2=hm==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),dz2=hm==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android"});var S41={};N6(S41,{scrollUp:()=>m29,scrollDown:()=>u29,link:()=>n29,image:()=>a29,iTerm:()=>r29,exitAlternativeScreen:()=>l29,eraseUp:()=>g29,eraseStartLine:()=>f29,eraseScreen:()=>ab1,eraseLines:()=>x29,eraseLine:()=>ZQ6,eraseEndLine:()=>y29,eraseDown:()=>h29,enterAlternativeScreen:()=>c29,cursorUp:()=>JQ6,cursorTo:()=>w29,cursorShow:()=>b29,cursorSavePosition:()=>T29,cursorRestorePosition:()=>C29,cursorPrevLine:()=>k29,cursorNextLine:()=>v29,cursorMove:()=>I29,cursorLeft:()=>QQ6,cursorHide:()=>_29,cursorGetPosition:()=>S29,cursorForward:()=>$29,cursorDown:()=>E29,cursorBackward:()=>P29,clearTerminal:()=>d29,clearScreen:()=>p29,beep:()=>i29});import rb1 from"node:process";var U2="\x1B[",mm="\x1B]",$T="\x07",gm=";",eJ6,j29,R29,w29=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return U2+(J+1)+"G";return U2+(Q+1)+gm+(J+1)+"H"},I29=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=U2+-J+"D";else if(J>0)Z+=U2+J+"C";if(Q<0)Z+=U2+-Q+"A";else if(Q>0)Z+=U2+Q+"B";return Z},JQ6=(J=1)=>U2+J+"A",E29=(J=1)=>U2+J+"B",$29=(J=1)=>U2+J+"C",P29=(J=1)=>U2+J+"D",QQ6,T29,C29,S29,v29,k29,_29,b29,x29=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=ZQ6+(Z<J-1?JQ6():"");if(J)Q+=QQ6;return Q},y29,f29,ZQ6,h29,g29,ab1,m29,u29,p29="\x1Bc",d29,c29,l29,i29,n29=(J,Q)=>[mm,"8",gm,gm,Q,$T,J,mm,"8",gm,gm,$T].join(""),a29=(J,Q={})=>{let Z=`${mm}1337;File=inline=1`;if(Q.width)Z+=`;width=${Q.width}`;if(Q.height)Z+=`;height=${Q.height}`;if(Q.preserveAspectRatio===!1)Z+=";preserveAspectRatio=0";return Z+":"+Buffer.from(J).toString("base64")+$T},r29;var sb1=p(()=>{tJ6();eJ6=!C41&&rb1.env.TERM_PROGRAM==="Apple_Terminal",j29=!C41&&rb1.platform==="win32",R29=C41?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:rb1.cwd,QQ6=U2+"G",T29=eJ6?"\x1B7":U2+"s",C29=eJ6?"\x1B8":U2+"u",S29=U2+"6n",v29=U2+"E",k29=U2+"F",_29=U2+"?25l",b29=U2+"?25h",y29=U2+"K",f29=U2+"1K",ZQ6=U2+"2K",h29=U2+"J",g29=U2+"1J",ab1=U2+"2J",m29=U2+"S",u29=U2+"T",d29=j29?`${ab1}${U2}0f`:`${ab1}${U2}3J${U2}H`,c29=U2+"?1049h",l29=U2+"?1049l",i29=$T,r29={setCwd:(J=R29())=>`${mm}50;CurrentDir=${J}${$T}`,annotation(J,Q={}){let Z=`${mm}1337;`,X=Q.x!==void 0,Y=Q.y!==void 0;if((X||Y)&&!(X&&Y&&Q.length!==void 0))throw Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");if(J=J.replaceAll("|",""),Z+=Q.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",Q.length>0)Z+=(X?[J,Q.length,Q.x,Q.y]:[Q.length,J]).join("|");else Z+=J;return Z+$T}}});var XQ6=p(()=>{sb1();sb1()});var ob1=e((rz2,YQ6)=>{YQ6.exports=(J,Q=process.argv)=>{let Z=J.startsWith("-")?"":J.length===1?"-":"--",X=Q.indexOf(Z+J),Y=Q.indexOf("--");return X!==-1&&(Y===-1||X<Y)}});var GQ6=e((sz2,qQ6)=>{var s29=o1("os"),KQ6=o1("tty"),kK=ob1(),{env:s5}=process,AV;if(kK("no-color")||kK("no-colors")||kK("color=false")||kK("color=never"))AV=0;else if(kK("color")||kK("colors")||kK("color=true")||kK("color=always"))AV=1;if("FORCE_COLOR"in s5)if(s5.FORCE_COLOR==="true")AV=1;else if(s5.FORCE_COLOR==="false")AV=0;else AV=s5.FORCE_COLOR.length===0?1:Math.min(parseInt(s5.FORCE_COLOR,10),3);function tb1(J){if(J===0)return!1;return{level:J,hasBasic:!0,has256:J>=2,has16m:J>=3}}function eb1(J,Q){if(AV===0)return 0;if(kK("color=16m")||kK("color=full")||kK("color=truecolor"))return 3;if(kK("color=256"))return 2;if(J&&!Q&&AV===void 0)return 0;let Z=AV||0;if(s5.TERM==="dumb")return Z;if(process.platform==="win32"){let X=s29.release().split(".");if(Number(X[0])>=10&&Number(X[2])>=10586)return Number(X[2])>=14931?3:2;return 1}if("CI"in s5){if(["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some((X)=>(X in s5))||s5.CI_NAME==="codeship")return 1;return Z}if("TEAMCITY_VERSION"in s5)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(s5.TEAMCITY_VERSION)?1:0;if(s5.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in s5){let X=parseInt((s5.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(s5.TERM_PROGRAM){case"iTerm.app":return X>=3?3:2;case"Apple_Terminal":return 2}}if(/-256(color)?$/i.test(s5.TERM))return 2;if(/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(s5.TERM))return 1;if("COLORTERM"in s5)return 1;return Z}function o29(J){let Q=eb1(J,J&&J.isTTY);return tb1(Q)}qQ6.exports={supportsColor:o29,stdout:tb1(eb1(!0,KQ6.isatty(1))),stderr:tb1(eb1(!0,KQ6.isatty(2)))}});var FQ6=e((oz2,UQ6)=>{var t29=GQ6(),PT=ob1();function zQ6(J){if(/^\d{3,4}$/.test(J)){let Z=/(\d{1,2})(\d{2})/.exec(J)||[];return{major:0,minor:parseInt(Z[1],10),patch:parseInt(Z[2],10)}}let Q=(J||"").split(".").map((Z)=>parseInt(Z,10));return{major:Q[0],minor:Q[1],patch:Q[2]}}function Jx1(J){let{CI:Q,FORCE_HYPERLINK:Z,NETLIFY:X,TEAMCITY_VERSION:Y,TERM_PROGRAM:K,TERM_PROGRAM_VERSION:q,VTE_VERSION:G,TERM:z}=process.env;if(Z)return!(Z.length>0&&parseInt(Z,10)===0);if(PT("no-hyperlink")||PT("no-hyperlinks")||PT("hyperlink=false")||PT("hyperlink=never"))return!1;if(PT("hyperlink=true")||PT("hyperlink=always"))return!0;if(X)return!0;if(!t29.supportsColor(J))return!1;if(J&&!J.isTTY)return!1;if("WT_SESSION"in process.env)return!0;if(process.platform==="win32")return!1;if(Q)return!1;if(Y)return!1;if(K){let U=zQ6(q||"");switch(K){case"iTerm.app":if(U.major===3)return U.minor>=1;return U.major>3;case"WezTerm":return U.major>=20200620;case"vscode":return U.major>1||U.major===1&&U.minor>=72;case"ghostty":return!0}}if(G){if(G==="0.50.0")return!1;let U=zQ6(G);return U.major>0||U.minor>=50}switch(z){case"alacritty":return!0}return!1}UQ6.exports={supportsHyperlink:Jx1,stdout:Jx1(process.stdout),stderr:Jx1(process.stderr)}});function jV(J,Q,{target:Z="stdout",...X}={}){if(!v41.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (${Q})`}return S41.link(J,Q)}var v41;var WQ6=p(()=>{XQ6();v41=m6(FQ6(),1);jV.isSupported=v41.default.stdout;jV.stderr=(J,Q,Z={})=>jV(J,Q,{target:"stderr",...Z});jV.stderr.isSupported=v41.default.stderr});class Qx1{enabled;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J){this.enabled=J;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Z])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1759219286-g0d79d3"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await U10(Q)}catch(Q){a.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}var HQ6=p(()=>{D0();$B()});class GY{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function BQ6(J){if(J instanceof k41)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof GY)return{title:"Info",description:J.message,type:"info"};return a.warn("Unknown error type encountered",{name:J.name,message:J.message,stack:J.stack}),{title:"Error",description:J.message||"An unexpected error occurred.",type:"error"}}var k41;var Zx1=p(()=>{D0();k41=class k41 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}});import{execSync as DQ6}from"node:child_process";import{rmdir as e29}from"node:fs/promises";import{tmpdir as J49}from"node:os";import MQ6 from"node:path";import{mkdtemp as Q49,readFile as Z49,unlink as X49,writeFile as wU2}from"fs/promises";class Xx1{commands;customRegistry;latestCustom=[];telemetrySubmitter;constructor(J=zC()){this.customRegistry=J,this._initBaseCommands(!1),this.customRegistry.commands.subscribe((Q)=>this.latestCustom=Q),this.telemetrySubmitter=new Qx1(async()=>{try{return(await A9()).settings["experimental.cli.commandTelemetry.enabled"]===!0}catch{return!1}}),Z2.pipe(g0((Q)=>Q.settings["internal.modes"]),d8()).subscribe((Q)=>{this._initBaseCommands(Q??!1)})}_initBaseCommands(J){if(this.commands={...Y49},J)Object.assign(this.commands,K49)}async execute(J,Q,Z=[],X){this.telemetrySubmitter.submit(J).catch((G)=>{a.debug("Failed to submit command telemetry",G)});let Y=this.commands[J];if(Y)return Y.execute(Q,Z);let K=this.latestCustom.find((G)=>G.name===J),q=await nb1(J,Z,this.customRegistry,{signal:X});if(q.success)if(K?.kind==="markdown"){Q.editorDispatch({type:"set-input",input:q.output});return}else{Q.worker.handle({type:"user:message",message:{content:[{type:"text",text:q.output}]}});return}return Error(q.error??`Command '${J}' failed`)}query(J,Q,Z){let X=J.toLowerCase(),Y=Object.values(this.commands).filter((q)=>q.name.toLowerCase().includes(X)).filter((q)=>{if(!Q||!q.isVisible)return!0;return q.isVisible(Q,Z)}),K=this.latestCustom.filter((q)=>q.available&&q.name.toLowerCase().includes(X)).map((q)=>({name:q.name,description:"Custom command",requiresArgs:q.kind==="executable",execute:(G,z)=>this.execute(q.name,G,z??[])}));return[...Y,...K]}async cleanup(){await this.telemetrySubmitter.dispose()}get(J){let Q=this.commands[J];if(Q)return Q;let Z=this.latestCustom.find((X)=>X.name===J);return{name:J,description:"Custom command",requiresArgs:Z?.kind==="executable",execute:(X,Y)=>this.execute(J,X,Y??[])}}}var Y49,K49;var VQ6=p(()=>{oJ6();D0();D4();UC();gw();u4();dU();pb1();$B();KD();X8();n0();WQ6();w41();db1();HQ6();Zx1();Y49={"generate-agent-file":{name:"generate-agent-file",description:`Generate an ${f5} file in the current workspace`,execute:async(J,Q)=>{J.worker.handle({type:"user:message",message:{content:[{type:"text",text:CY0}]}});return}},compact:{name:"compact",description:"Compact the thread. Optional: /compact [message] to queue a message after compaction",execute:async(J,Q)=>{if(J.thread.messages.length===0)return new k41;if(Q&&Q.length>0){let X=[{type:"text",text:Q.join(" ").trim()}],Y=J.takeImageAttachments?.()??[];if(Y.length>0)X.push(...Y);J.worker.handle({type:"user:message-queue:enqueue",message:{content:X}})}try{await J.worker.summarizeThread()}catch(Z){return Z instanceof Error?Z:Error("Failed to compact thread")}}},editor:{name:"editor",description:"Open $EDITOR to write a prompt",launchesWindow:!0,execute:async(J,Q)=>{try{let Z=process.env.EDITOR||process.env.VISUAL||"nano",X=await Q49(MQ6.join(J49(),"amp-edit-")),Y=MQ6.join(X,"message.amp.md");DQ6(`${Z} "${Y}"`,{stdio:"inherit"}),process.stdout.write("\x1B[?25l");try{let q=(await Z49(Y,"utf-8")).trim();if(q)J.editorDispatch({type:"set-input",input:q})}catch(K){if(K?.code==="ENOENT")return;return a.error("Failed to read temporary file",K),Error("Failed to read editor content")}try{await X49(Y),await e29(X)}catch(K){a.warn("Failed to clean up temporary file",K)}return}catch(Z){return a.error("Failed to open editor",Z),Error("Failed to open editor")}}},help:{name:"help",description:"Show help and hotkeys",execute:async(J,Q)=>{J.openHelp();return}},permissions:{name:"permissions",description:"Edit permission rules in $EDITOR, or `/permissions off|on` to toggle for this session",launchesWindow:!0,execute:async(J,Q)=>{if(Q&&Q.length>0){let Y=Q[0]?.trim().toLowerCase();switch(Y){case"on":try{return gU("dangerouslyAllowAll",!1),new GY("Amp is now following permissions rules for this session")}catch(K){return a.error("Failed to set dangerously allow all setting",K),Error("Failed to enable permissions for this session")}case"off":try{return gU("dangerouslyAllowAll",!0),new GY("Permissions disabled for this session - you will NOT be asked for confirmation before Amp runs a command.")}catch(K){return a.error("Failed to set dangerously allow all setting",K),Error("Failed to disable permissions for this session")}case"edit":break;default:return Error(`Invalid option: ${Y}. Use: on, off, or edit (or no argument for edit)`)}}let Z=await IT();if(Z===null)return Error("No editor found, please set $EDITOR to edit permissions");let X="";try{let Y={stdin:process.stdin,stdout:process.stdout,stderr:{write:(K)=>{return X=K.toString(),!0}},exit:(K)=>{if(K!==0)throw a.error("editPermissions exited with status",K),Error(X)},settingsFile:J.settingsFilePath,resolveEditor:IT};await P41(Y);return}catch(Y){a.error("failed to open permissions editor:",Y);let K=Y instanceof Error?`: ${Y.message}`:"";return Error(`Failed to open ${Z}${K}`)}finally{process.stdout.write("\x1B[?25l")}}},new:{name:"new",description:"Start a new thread",execute:async(J,Q)=>{try{await J.startNewThread();return}catch(Z){return a.error("Failed to start new thread",Z),Error("Failed to start new thread")}},isVisible:(J)=>J.messages.length!==0},continue:{name:"continue",description:"Continue an existing thread",requiresArgs:!1,requiresPicker:!0,execute:async(J,Q)=>{try{if(Q&&Q.length>0){let Z=Q[0]?.trim();if(!Z)return Error("Invalid thread ID provided");return await J.switchToThread(Z),new GY(`Switched to existing thread: ${Z}`)}await J.pickAndContinueThread();return}catch(Z){return a.error("Failed to continue thread",Z),Error("Failed to continue thread")}}},queue:{name:"queue",description:"Queue a message to send when inference completes. If no inference running, sends immediately.",requiresArgs:!0,execute:async(J,Q)=>{if(!Q||Q.length===0)return Error("Queue command requires a message argument. Usage: /queue <message>");let X=[{type:"text",text:Q.join(" ").trim()}],Y=J.takeImageAttachments?.()??[];if(Y.length>0)X.push(...Y);J.worker.handle({type:"user:message-queue:enqueue",message:{content:X}})}},dequeue:{name:"dequeue",description:"Dequeue all messages and restore them to the prompt editor",execute:async(J,Q)=>{let Z=J.thread.queuedMessages??[];if(Z.length===0)return;let Y=Z.map((K)=>{return K.queuedMessage.content.filter((G)=>G.type==="text").map((G)=>G.text).join("").trim()}).filter(Boolean).join(`
|
5443
|
+
... (output truncated at ${OH} characters)`;Y({success:V,output:O.trim(),error:!V?L.trim()||"Command failed":void 0,exitCode:M??void 0})}),F.on("error",(M)=>{clearTimeout(U);let V=M.message;if(z)V=`Command timed out after ${Z}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")V="The command was aborted";Y({success:!1,output:W.join(""),error:V})})})}function L29(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return A29(Z,X?[...X]:null,Y,Q);else return O29(Z,X?[...X]:null,Y,Q)}function O29(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function A29(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}var OH=50000,rJ6=300000;var sJ6=p(()=>{WR();D0()});var oJ6=p(()=>{sJ6();mJ1()});var C41,Sz2,vz2,kz2,_z2,bz2,xz2,yz2,fz2,hz2,hm,gz2,mz2,uz2,pz2,dz2;var tJ6=p(()=>{C41=globalThis.window?.document!==void 0,Sz2=globalThis.process?.versions?.node!==void 0,vz2=globalThis.process?.versions?.bun!==void 0,kz2=globalThis.Deno?.version?.deno!==void 0,_z2=globalThis.process?.versions?.electron!==void 0,bz2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,xz2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,yz2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,fz2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,hz2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,hm=globalThis.navigator?.userAgentData?.platform,gz2=hm==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",mz2=hm==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",uz2=hm==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",pz2=hm==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),dz2=hm==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android"});var S41={};N6(S41,{scrollUp:()=>m29,scrollDown:()=>u29,link:()=>n29,image:()=>a29,iTerm:()=>r29,exitAlternativeScreen:()=>l29,eraseUp:()=>g29,eraseStartLine:()=>f29,eraseScreen:()=>ab1,eraseLines:()=>x29,eraseLine:()=>ZQ6,eraseEndLine:()=>y29,eraseDown:()=>h29,enterAlternativeScreen:()=>c29,cursorUp:()=>JQ6,cursorTo:()=>w29,cursorShow:()=>b29,cursorSavePosition:()=>T29,cursorRestorePosition:()=>C29,cursorPrevLine:()=>k29,cursorNextLine:()=>v29,cursorMove:()=>I29,cursorLeft:()=>QQ6,cursorHide:()=>_29,cursorGetPosition:()=>S29,cursorForward:()=>$29,cursorDown:()=>E29,cursorBackward:()=>P29,clearTerminal:()=>d29,clearScreen:()=>p29,beep:()=>i29});import rb1 from"node:process";var U2="\x1B[",mm="\x1B]",$T="\x07",gm=";",eJ6,j29,R29,w29=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return U2+(J+1)+"G";return U2+(Q+1)+gm+(J+1)+"H"},I29=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=U2+-J+"D";else if(J>0)Z+=U2+J+"C";if(Q<0)Z+=U2+-Q+"A";else if(Q>0)Z+=U2+Q+"B";return Z},JQ6=(J=1)=>U2+J+"A",E29=(J=1)=>U2+J+"B",$29=(J=1)=>U2+J+"C",P29=(J=1)=>U2+J+"D",QQ6,T29,C29,S29,v29,k29,_29,b29,x29=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=ZQ6+(Z<J-1?JQ6():"");if(J)Q+=QQ6;return Q},y29,f29,ZQ6,h29,g29,ab1,m29,u29,p29="\x1Bc",d29,c29,l29,i29,n29=(J,Q)=>[mm,"8",gm,gm,Q,$T,J,mm,"8",gm,gm,$T].join(""),a29=(J,Q={})=>{let Z=`${mm}1337;File=inline=1`;if(Q.width)Z+=`;width=${Q.width}`;if(Q.height)Z+=`;height=${Q.height}`;if(Q.preserveAspectRatio===!1)Z+=";preserveAspectRatio=0";return Z+":"+Buffer.from(J).toString("base64")+$T},r29;var sb1=p(()=>{tJ6();eJ6=!C41&&rb1.env.TERM_PROGRAM==="Apple_Terminal",j29=!C41&&rb1.platform==="win32",R29=C41?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:rb1.cwd,QQ6=U2+"G",T29=eJ6?"\x1B7":U2+"s",C29=eJ6?"\x1B8":U2+"u",S29=U2+"6n",v29=U2+"E",k29=U2+"F",_29=U2+"?25l",b29=U2+"?25h",y29=U2+"K",f29=U2+"1K",ZQ6=U2+"2K",h29=U2+"J",g29=U2+"1J",ab1=U2+"2J",m29=U2+"S",u29=U2+"T",d29=j29?`${ab1}${U2}0f`:`${ab1}${U2}3J${U2}H`,c29=U2+"?1049h",l29=U2+"?1049l",i29=$T,r29={setCwd:(J=R29())=>`${mm}50;CurrentDir=${J}${$T}`,annotation(J,Q={}){let Z=`${mm}1337;`,X=Q.x!==void 0,Y=Q.y!==void 0;if((X||Y)&&!(X&&Y&&Q.length!==void 0))throw Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");if(J=J.replaceAll("|",""),Z+=Q.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",Q.length>0)Z+=(X?[J,Q.length,Q.x,Q.y]:[Q.length,J]).join("|");else Z+=J;return Z+$T}}});var XQ6=p(()=>{sb1();sb1()});var ob1=e((rz2,YQ6)=>{YQ6.exports=(J,Q=process.argv)=>{let Z=J.startsWith("-")?"":J.length===1?"-":"--",X=Q.indexOf(Z+J),Y=Q.indexOf("--");return X!==-1&&(Y===-1||X<Y)}});var GQ6=e((sz2,qQ6)=>{var s29=o1("os"),KQ6=o1("tty"),kK=ob1(),{env:s5}=process,AV;if(kK("no-color")||kK("no-colors")||kK("color=false")||kK("color=never"))AV=0;else if(kK("color")||kK("colors")||kK("color=true")||kK("color=always"))AV=1;if("FORCE_COLOR"in s5)if(s5.FORCE_COLOR==="true")AV=1;else if(s5.FORCE_COLOR==="false")AV=0;else AV=s5.FORCE_COLOR.length===0?1:Math.min(parseInt(s5.FORCE_COLOR,10),3);function tb1(J){if(J===0)return!1;return{level:J,hasBasic:!0,has256:J>=2,has16m:J>=3}}function eb1(J,Q){if(AV===0)return 0;if(kK("color=16m")||kK("color=full")||kK("color=truecolor"))return 3;if(kK("color=256"))return 2;if(J&&!Q&&AV===void 0)return 0;let Z=AV||0;if(s5.TERM==="dumb")return Z;if(process.platform==="win32"){let X=s29.release().split(".");if(Number(X[0])>=10&&Number(X[2])>=10586)return Number(X[2])>=14931?3:2;return 1}if("CI"in s5){if(["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some((X)=>(X in s5))||s5.CI_NAME==="codeship")return 1;return Z}if("TEAMCITY_VERSION"in s5)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(s5.TEAMCITY_VERSION)?1:0;if(s5.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in s5){let X=parseInt((s5.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(s5.TERM_PROGRAM){case"iTerm.app":return X>=3?3:2;case"Apple_Terminal":return 2}}if(/-256(color)?$/i.test(s5.TERM))return 2;if(/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(s5.TERM))return 1;if("COLORTERM"in s5)return 1;return Z}function o29(J){let Q=eb1(J,J&&J.isTTY);return tb1(Q)}qQ6.exports={supportsColor:o29,stdout:tb1(eb1(!0,KQ6.isatty(1))),stderr:tb1(eb1(!0,KQ6.isatty(2)))}});var FQ6=e((oz2,UQ6)=>{var t29=GQ6(),PT=ob1();function zQ6(J){if(/^\d{3,4}$/.test(J)){let Z=/(\d{1,2})(\d{2})/.exec(J)||[];return{major:0,minor:parseInt(Z[1],10),patch:parseInt(Z[2],10)}}let Q=(J||"").split(".").map((Z)=>parseInt(Z,10));return{major:Q[0],minor:Q[1],patch:Q[2]}}function Jx1(J){let{CI:Q,FORCE_HYPERLINK:Z,NETLIFY:X,TEAMCITY_VERSION:Y,TERM_PROGRAM:K,TERM_PROGRAM_VERSION:q,VTE_VERSION:G,TERM:z}=process.env;if(Z)return!(Z.length>0&&parseInt(Z,10)===0);if(PT("no-hyperlink")||PT("no-hyperlinks")||PT("hyperlink=false")||PT("hyperlink=never"))return!1;if(PT("hyperlink=true")||PT("hyperlink=always"))return!0;if(X)return!0;if(!t29.supportsColor(J))return!1;if(J&&!J.isTTY)return!1;if("WT_SESSION"in process.env)return!0;if(process.platform==="win32")return!1;if(Q)return!1;if(Y)return!1;if(K){let U=zQ6(q||"");switch(K){case"iTerm.app":if(U.major===3)return U.minor>=1;return U.major>3;case"WezTerm":return U.major>=20200620;case"vscode":return U.major>1||U.major===1&&U.minor>=72;case"ghostty":return!0}}if(G){if(G==="0.50.0")return!1;let U=zQ6(G);return U.major>0||U.minor>=50}switch(z){case"alacritty":return!0}return!1}UQ6.exports={supportsHyperlink:Jx1,stdout:Jx1(process.stdout),stderr:Jx1(process.stderr)}});function jV(J,Q,{target:Z="stdout",...X}={}){if(!v41.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (${Q})`}return S41.link(J,Q)}var v41;var WQ6=p(()=>{XQ6();v41=m6(FQ6(),1);jV.isSupported=v41.default.stdout;jV.stderr=(J,Q,Z={})=>jV(J,Q,{target:"stderr",...Z});jV.stderr.isSupported=v41.default.stderr});class Qx1{enabled;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J){this.enabled=J;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Z])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1759233723-gf92434"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await U10(Q)}catch(Q){a.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}var HQ6=p(()=>{D0();$B()});class GY{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function BQ6(J){if(J instanceof k41)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof GY)return{title:"Info",description:J.message,type:"info"};return a.warn("Unknown error type encountered",{name:J.name,message:J.message,stack:J.stack}),{title:"Error",description:J.message||"An unexpected error occurred.",type:"error"}}var k41;var Zx1=p(()=>{D0();k41=class k41 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}});import{execSync as DQ6}from"node:child_process";import{rmdir as e29}from"node:fs/promises";import{tmpdir as J49}from"node:os";import MQ6 from"node:path";import{mkdtemp as Q49,readFile as Z49,unlink as X49,writeFile as wU2}from"fs/promises";class Xx1{commands;customRegistry;latestCustom=[];telemetrySubmitter;constructor(J=zC()){this.customRegistry=J,this._initBaseCommands(!1),this.customRegistry.commands.subscribe((Q)=>this.latestCustom=Q),this.telemetrySubmitter=new Qx1(async()=>{try{return(await A9()).settings["experimental.cli.commandTelemetry.enabled"]===!0}catch{return!1}}),Z2.pipe(g0((Q)=>Q.settings["internal.modes"]),d8()).subscribe((Q)=>{this._initBaseCommands(Q??!1)})}_initBaseCommands(J){if(this.commands={...Y49},J)Object.assign(this.commands,K49)}async execute(J,Q,Z=[],X){this.telemetrySubmitter.submit(J).catch((G)=>{a.debug("Failed to submit command telemetry",G)});let Y=this.commands[J];if(Y)return Y.execute(Q,Z);let K=this.latestCustom.find((G)=>G.name===J),q=await nb1(J,Z,this.customRegistry,{signal:X});if(q.success)if(K?.kind==="markdown"){Q.editorDispatch({type:"set-input",input:q.output});return}else{Q.worker.handle({type:"user:message",message:{content:[{type:"text",text:q.output}]}});return}return Error(q.error??`Command '${J}' failed`)}query(J,Q,Z){let X=J.toLowerCase(),Y=Object.values(this.commands).filter((q)=>q.name.toLowerCase().includes(X)).filter((q)=>{if(!Q||!q.isVisible)return!0;return q.isVisible(Q,Z)}),K=this.latestCustom.filter((q)=>q.available&&q.name.toLowerCase().includes(X)).map((q)=>({name:q.name,description:"Custom command",requiresArgs:q.kind==="executable",execute:(G,z)=>this.execute(q.name,G,z??[])}));return[...Y,...K]}async cleanup(){await this.telemetrySubmitter.dispose()}get(J){let Q=this.commands[J];if(Q)return Q;let Z=this.latestCustom.find((X)=>X.name===J);return{name:J,description:"Custom command",requiresArgs:Z?.kind==="executable",execute:(X,Y)=>this.execute(J,X,Y??[])}}}var Y49,K49;var VQ6=p(()=>{oJ6();D0();D4();UC();gw();u4();dU();pb1();$B();KD();X8();n0();WQ6();w41();db1();HQ6();Zx1();Y49={"generate-agent-file":{name:"generate-agent-file",description:`Generate an ${f5} file in the current workspace`,execute:async(J,Q)=>{J.worker.handle({type:"user:message",message:{content:[{type:"text",text:CY0}]}});return}},compact:{name:"compact",description:"Compact the thread. Optional: /compact [message] to queue a message after compaction",execute:async(J,Q)=>{if(J.thread.messages.length===0)return new k41;if(Q&&Q.length>0){let X=[{type:"text",text:Q.join(" ").trim()}],Y=J.takeImageAttachments?.()??[];if(Y.length>0)X.push(...Y);J.worker.handle({type:"user:message-queue:enqueue",message:{content:X}})}try{await J.worker.summarizeThread()}catch(Z){return Z instanceof Error?Z:Error("Failed to compact thread")}}},editor:{name:"editor",description:"Open $EDITOR to write a prompt",launchesWindow:!0,execute:async(J,Q)=>{try{let Z=process.env.EDITOR||process.env.VISUAL||"nano",X=await Q49(MQ6.join(J49(),"amp-edit-")),Y=MQ6.join(X,"message.amp.md");DQ6(`${Z} "${Y}"`,{stdio:"inherit"}),process.stdout.write("\x1B[?25l");try{let q=(await Z49(Y,"utf-8")).trim();if(q)J.editorDispatch({type:"set-input",input:q})}catch(K){if(K?.code==="ENOENT")return;return a.error("Failed to read temporary file",K),Error("Failed to read editor content")}try{await X49(Y),await e29(X)}catch(K){a.warn("Failed to clean up temporary file",K)}return}catch(Z){return a.error("Failed to open editor",Z),Error("Failed to open editor")}}},help:{name:"help",description:"Show help and hotkeys",execute:async(J,Q)=>{J.openHelp();return}},permissions:{name:"permissions",description:"Edit permission rules in $EDITOR, or `/permissions off|on` to toggle for this session",launchesWindow:!0,execute:async(J,Q)=>{if(Q&&Q.length>0){let Y=Q[0]?.trim().toLowerCase();switch(Y){case"on":try{return gU("dangerouslyAllowAll",!1),new GY("Amp is now following permissions rules for this session")}catch(K){return a.error("Failed to set dangerously allow all setting",K),Error("Failed to enable permissions for this session")}case"off":try{return gU("dangerouslyAllowAll",!0),new GY("Permissions disabled for this session - you will NOT be asked for confirmation before Amp runs a command.")}catch(K){return a.error("Failed to set dangerously allow all setting",K),Error("Failed to disable permissions for this session")}case"edit":break;default:return Error(`Invalid option: ${Y}. Use: on, off, or edit (or no argument for edit)`)}}let Z=await IT();if(Z===null)return Error("No editor found, please set $EDITOR to edit permissions");let X="";try{let Y={stdin:process.stdin,stdout:process.stdout,stderr:{write:(K)=>{return X=K.toString(),!0}},exit:(K)=>{if(K!==0)throw a.error("editPermissions exited with status",K),Error(X)},settingsFile:J.settingsFilePath,resolveEditor:IT};await P41(Y);return}catch(Y){a.error("failed to open permissions editor:",Y);let K=Y instanceof Error?`: ${Y.message}`:"";return Error(`Failed to open ${Z}${K}`)}finally{process.stdout.write("\x1B[?25l")}}},new:{name:"new",description:"Start a new thread",execute:async(J,Q)=>{try{await J.startNewThread();return}catch(Z){return a.error("Failed to start new thread",Z),Error("Failed to start new thread")}},isVisible:(J)=>J.messages.length!==0},continue:{name:"continue",description:"Continue an existing thread",requiresArgs:!1,requiresPicker:!0,execute:async(J,Q)=>{try{if(Q&&Q.length>0){let Z=Q[0]?.trim();if(!Z)return Error("Invalid thread ID provided");return await J.switchToThread(Z),new GY(`Switched to existing thread: ${Z}`)}await J.pickAndContinueThread();return}catch(Z){return a.error("Failed to continue thread",Z),Error("Failed to continue thread")}}},queue:{name:"queue",description:"Queue a message to send when inference completes. If no inference running, sends immediately.",requiresArgs:!0,execute:async(J,Q)=>{if(!Q||Q.length===0)return Error("Queue command requires a message argument. Usage: /queue <message>");let X=[{type:"text",text:Q.join(" ").trim()}],Y=J.takeImageAttachments?.()??[];if(Y.length>0)X.push(...Y);J.worker.handle({type:"user:message-queue:enqueue",message:{content:X}})}},dequeue:{name:"dequeue",description:"Dequeue all messages and restore them to the prompt editor",execute:async(J,Q)=>{let Z=J.thread.queuedMessages??[];if(Z.length===0)return;let Y=Z.map((K)=>{return K.queuedMessage.content.filter((G)=>G.type==="text").map((G)=>G.text).join("").trim()}).filter(Boolean).join(`
|
5444
5444
|
`).trim();await J.worker.handle({type:"user:message-queue:discard"}),J.editorDispatch({type:"set-input",input:Y})},isVisible:(J)=>(J.queuedMessages?.length??0)>0},share:{name:"share",description:"Set thread visibility - `/share private|workspace|group|public`",execute:async(J,Q)=>{let{thread:Z,threadSyncService:X,ampURL:Y}=J;if(!Q||Q.length===0)return Error("Please specify a visibility option: private, workspace, group, or public");let K=dv(new URL(Y),Z.id).toString(),G=`Thread URL: ${jV(K,K,{fallback:()=>K})}`,z=Q[0]?.trim().toLowerCase(),U;switch(z){case"private":U={visibility:"private",sharedGroupIDs:[]};break;case"workspace":U={visibility:"thread_workspace_shared"};break;case"group":U={visibility:"private",sharedGroupIDs:[],shareWithAllCreatorGroups:!0};break;case"public":U={visibility:"public"};break;default:return Error(`Invalid visibility option: ${z}. Use: private, workspace, group, or public`)}try{return await X.updateThreadMeta(Z.id,U),new GY(`${G}
|
5445
5445
|
|
5446
5446
|
This thread's visibility has been updated to: ${z}`)}catch(F){let W=F instanceof Error?F.message:String(F);if(W.includes("no-workspace"))return Error("You are not a member of any workspace.");if(W.includes("groups-disabled"))return Error("The groups feature is not enabled for this workspace.");if(W.includes("no-groups"))return Error("You are not a member of any groups.");return a.error("Unexpected failure to update thread visibility",F),Error(`Failed to update thread visibility for ${Z.id}`)}}},browser:{name:"browser",description:"Open the current thread in your browser",requiresArgs:!1,execute:async(J,Q)=>{let{thread:Z,ampURL:X}=J,Y=dv(new URL(X),Z.id).toString();try{return await wT(Y),new GY("Thread opened in browser")}catch(K){a.error("Failed to open browser",{error:K});let q=jV(Y,Y,{fallback:()=>Y});return new GY(`Could not open browser automatically. Thread URL: ${q}`)}},isVisible:(J)=>J.messages.length!==0},settings:{name:"settings",description:"Open CLI settings file in $EDITOR",launchesWindow:!0,execute:async(J)=>{let Q=await IT();if(Q===null)return Error("No editor found, please set $EDITOR to edit settings");try{DQ6(`${Q} "${J.settingsFilePath}"`,{stdio:"inherit"}),process.stdout.write("\x1B[?25l");return}catch(Z){return a.error("Failed to open settings in editor",Z),Error(`Failed to open ${Q}`)}}},"agent-files":{name:"agent-files",description:"List AGENTS.md guidance files in use for the current thread",execute:async(J)=>{try{let Q=await J.getGuidanceFiles();if(Q.length===0)return new GY("No guidance files are currently in use for this thread.");let Z=Q.length,X=`Agent ${VX(Z,"File")} (${Z}):`,Y=Q.map((K)=>` • ${QJ(DX(K.uri))} (${K.type})`).join(`
|
@@ -5618,7 +5618,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
|
|
5618
5618
|
`),J.stdout.write(`Continue this thread with: amp threads continue ${q}
|
5619
5619
|
`)}}function dX9(J){let Q=0;for(let Y=0;Y<J.length;Y++){let K=J.charCodeAt(Y);Q=(Q<<5)-Q+K,Q=Q&Q}let Z=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],X=Math.abs(Q)%Z.length;return d1.index(Z[X])}var eU6,JF6;var ZF6=p(()=>{D0();D4();UC();gw();u4();$N();Q4();I3();X8();n0();iJ6();VQ6();d7();t41();AA();pZ6();om();CU();bx1();EJ();EA();lZ6();a9();e41();j2();GX6();zX();m9();zy1();p7();im();z9();yz6();hz6();DQ();yX6();cz6();lz6();oz6();QU6();gT();ZU6();Cy1();XU6();GU6();bU6();xU6();Cz6();fU6();Mh1();mU6();pU6();w71();xz6();aU6();tU6();eU6=class eU6 extends $6{dependencies;constructor(J){super();this.dependencies=J}createState(){return new JF6}};JF6=class JF6 extends E6{themeColors=null;themeApp=null;selectionListener=null;ideStatus=null;isConfirmingExit=!1;isConfirmingClearInput=!1;copyMessageTimer=null;isShowingHelp=!1;isShowingConsoleOverlay=!1;isShowingConfirmationOverlay=!1;isShowingFileChangesOverlay=!1;confirmationOverlayContent="";exitConfirmTimeout=null;clearInputConfirmTimeout=null;historyIndex=-1;historyDraft=null;bashInvocations=[];dismissedEphemeralErrorKey=null;currentTitle=void 0;currentShellModeStatus=void 0;imageAttachments=[];displayMessage=null;executingCommand=null;isShowingJetBrainsInstaller=!1;isShowingIdePicker=!1;currentProgressBarState="off";progressReportTimer=null;showingSelectionCopiedHint=!1;isShowingThreadPicker=!1;submitDisabledHint=null;submitDisabledHintTimer=null;isShowingTrainingModeDialog=!1;pendingTrainingMode=null;currentAgentMode=void 0;agentModeSubscription=null;updateState=null;updateServiceSubscription=null;isFreeTierEnabled=!1;isProcessing(){let{threadState:J}=this.widget.dependencies;if(!J.mainThread)return!1;return Boolean(J.viewState.state==="active"&&(J.viewState.interactionState==="tool-running"||J.viewState.inferenceState==="running"))}isSummarizing(J){return J.state==="active"&&J.summaryState!=="idle"}parseShellModeInput(J){if(J.startsWith("$$")){let Q=J.slice(2).trim();return Q?{cmd:Q,hidden:!0}:null}if(J.startsWith("$")){let Q=J.slice(1).trim();return Q?{cmd:Q,hidden:!1}:null}return null}isSlashCommand(J){if(!J.startsWith("/"))return!1;if((J.split(" ")[0]?.slice(1)||"").includes("/"))return!1;return!0}showSubmitDisabledHint(J){if(this.submitDisabledHintTimer)clearTimeout(this.submitDisabledHintTimer);this.setState(()=>{this.submitDisabledHint=J}),this.submitDisabledHintTimer=setTimeout(()=>{this.setState(()=>{this.submitDisabledHint=null}),this.submitDisabledHintTimer=null},3000)}getUIHint(){let J=this.themeColors?.colorScheme;if(!J)return null;let Q=this.themeApp;if(!Q)return null;if(this.submitDisabledHint)return new I1(this.submitDisabledHint,new v1({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new I1("",void 0,[new I1("Ctrl+C",new v1({color:Q.keybind})),new I1(" again to exit",new v1({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new I1("",void 0,[new I1("Esc",new v1({color:Q.keybind})),new I1(" again to clear input",new v1({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new I1("",void 0,[new I1("Escape",new v1({color:Q.keybind})),new I1(" to close help",new v1({color:J.foreground,dim:!0}))]);if(this.isProcessing()||this.bashInvocations.length>0)return new I1("",void 0,[new I1("Esc",new v1({color:Q.keybind})),new I1(" to cancel",new v1({color:J.foreground,dim:!0}))]);if(this.showingSelectionCopiedHint)return new I1("Selection copied to clipboard",new v1({color:J.foreground,dim:!0}));return null}isTranscriptEmpty(){let{threadState:J}=this.widget.dependencies;return J.items.length===0}textController=new U71;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new PV);return this.messageScrollControllers.get(J)}scrollMessageViewToBottom(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.id;if(!Q)return;this.getMessageScrollController(Q).scrollToBottom()}findElementByKey(J){return this.searchElementTreeByKey(this.context.element,J)}searchElementTreeByKey(J,Q){if(!J)return null;if(J?.widget?.key?.value===Q)return J;if(J?.child){let X=this.searchElementTreeByKey(J.child,Q);if(X)return X}if(J?.children)for(let X of J.children){let Y=this.searchElementTreeByKey(X,Q);if(Y)return Y}return null}clearActiveSelection(){let J=this.findElementByKey("message-view-selection-area");if(J?.state){let Q=J.state;if(Q?.controller?.hasSelection)return Q.controller.clearSelection(),this.setState(()=>{}),!0}return!1}setupSelectionListener(){let J=this.findElementByKey("message-view-selection-area");if(J?.state){let Q=J.state;if(Q?.controller&&!this.selectionListener)this.selectionListener=()=>{this.setState(()=>{})},Q.controller.addListener(this.selectionListener),Q.controller.onSelectionCopied=()=>{if(this.copyMessageTimer)clearTimeout(this.copyMessageTimer);this.setState(()=>{this.showingSelectionCopiedHint=!0}),this.copyMessageTimer=setTimeout(()=>{this.setState(()=>{this.showingSelectionCopiedHint=!1}),this.copyMessageTimer=null},2000)}}}updateTerminalTitle(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.title;if(Q!==this.currentTitle){this.currentTitle=Q;let Z=process.cwd().replace(process.env.HOME||"","~"),X=Q?`amp - ${Q} - ${Z}`:"";process.stdout.write(Hx1(X))}}_handleTextCopy(J){if(J&&J.length>0){if(this.setState(()=>{this.showingSelectionCopiedHint=!0}),this.copyMessageTimer)clearTimeout(this.copyMessageTimer);this.copyMessageTimer=setTimeout(()=>{this.setState(()=>{this.showingSelectionCopiedHint=!1}),this.copyMessageTimer=null},2000)}}textFieldKey=new o5("text-field");ideStatusSubscription=null;ideMessageSubscription=null;ideAppendToPromptSubscription=null;commands=null;completionBuilder=null;textChangeListener=()=>{let J=this.textController.text,Q=J.startsWith("$$")?"hidden":J.startsWith("$")?"normal":void 0;if(Q!==this.currentShellModeStatus)this.currentShellModeStatus=Q,this.setState(()=>{})};getCommands(){if(!this.commands)this.commands=new Xx1(this.widget.dependencies.commandRegistry);return this.commands}getCompletionBuilder(){if(!this.completionBuilder)this.completionBuilder=new Ih1(this.getCommands(),this.widget.dependencies.fuzzyServer,new $51);return this.completionBuilder}navigateHistoryPrevious=()=>{let J=this.widget.dependencies.history.previous();if(J!==null){if(this.historyIndex===-1)this.historyDraft=this.textController.text;this.historyIndex++,this.textController.text=J,this.textController.moveCursorToStart()}};navigateHistoryNext=()=>{let J=this.widget.dependencies.history.next();if(J!==null)this.historyIndex--,this.textController.text=J,this.textController.moveCursorToEnd();else if(this.historyIndex>-1)this.historyIndex=-1,this.textController.text=this.historyDraft||"",this.textController.moveCursorToEnd(),this.historyDraft=null};resetHistory=()=>{this.widget.dependencies.history.reset(),this.historyIndex=-1,this.historyDraft=null};openJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!0})};dismissJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!1})};openIdePicker=()=>{this.setState(()=>{this.isShowingIdePicker=!0})};dismissIdePicker=()=>{this.widget.dependencies.ideClient.sendStatus({enabled:!1}),this.setState(()=>{this.isShowingIdePicker=!1})};handleIdeSelection=async(J)=>{try{await this.connectToSelectedIde(J)}catch(Q){let Z=Q instanceof Error?Q.message:String(Q);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Z}`)})}this.widget.dependencies.lockfileManager.selectConfig(J),this.setState(()=>{this.isShowingIdePicker=!1})};async connectToSelectedIde(J){await this.widget.dependencies.ideClient.start(J)}removeBashInvocation=(J)=>{this.setState(()=>{this.bashInvocations=this.bashInvocations.filter((Q)=>Q.id!==J)})};invokeBashCommand=(J,{hidden:Q})=>{let Z=Date.now(),X=`bash-${Z}-${Math.random().toString(36).substring(7)}`,Y={cmd:J},K=new AbortController;this.widget.dependencies.worker.invokeBashTool(Y,K.signal,Q).subscribe({next:(q)=>{this.setState(()=>{if(this.bashInvocations.find((z)=>z.id===X))this.bashInvocations=this.bashInvocations.map((z)=>z.id===X?{...z,toolRun:q}:z);else{let z={id:X,args:Y,toolRun:q,startTime:Z,abortController:K,hidden:Q};this.bashInvocations=[...this.bashInvocations,z]}})},error:()=>this.removeBashInvocation(X),complete:()=>this.removeBashInvocation(X)})};cancelBashInvocations=()=>{let J=this.bashInvocations.find((Q)=>Q.toolRun.status==="in-progress");if(J)J.abortController.abort()};handleHistoryNavigation=(J)=>{if(J.key==="p"&&J.ctrlKey)return this.navigateHistoryPrevious(),"handled";if(J.key==="n"&&J.ctrlKey)return this.navigateHistoryNext(),"handled";return"ignored"};onTextSubmitted=async(J)=>{let{threadState:Q}=this.widget.dependencies;if(this.isSummarizing(Q.viewState)){this.showSubmitDisabledHint("Unable to submit while compacting.");return}if(!J.trim())return;let Z=this.parseShellModeInput(J);if(Z){if(Z.cmd&&!this.isProcessing())this.invokeBashCommand(Z.cmd,{hidden:Z.hidden}),this.widget.dependencies.history.add(J),this.textController.clear(),this.resetHistory();else this.showSubmitDisabledHint("Unable to use shell mode while agent is active");return}let X=pJ6(J);if(this.isSlashCommand(X)&&Q.mainThread){let Y=X.slice(1).split(" "),K=Y[0],q=Y.slice(1).filter((G)=>G.trim()!=="");if(K){let G=Q.viewState,z=this.getCommands().query(K,Q.mainThread,G).filter((U)=>U.name===K).pop();if(z){if((z.requiresArgs||z.requiresPicker)&&q.length===0){this.textController.clear(),this.textController.insertText(`/${K} `);return}this.textController.clear(),this.resetHistory(),await this.executeCommand(z,q)}return}}this.textController.clear(),this.resetHistory(),await this.sendUserMessage(X)};onOptionSelected=(J)=>{switch(J.type){case"command":{let Q=`/${J.name} `;this.onTextSubmitted(Q);break}case"file":{let Q=this.textController.text,Z=this.textController.cursorPosition,Y=Q.slice(0,Z).lastIndexOf("@");if(Y!==-1){let K=Q.slice(0,Y),q=Q.slice(Z),G=K+`@${J.path} `+q;this.textController.clear(),this.textController.insertText(G),this.textController.cursorPosition=Y+1+J.path.length+1}break}case"thread":{let Z=this.textController.text.split(" ");if(Z.length>=1&&Z[0]==="/continue"){let X=`/continue ${J.threadId} `;this.onTextSubmitted(X)}break}case"argument":{let Z=this.textController.text.split(" ");if(Z.length>=1&&Z[0]?.startsWith("/")){let Y=`${Z[0]} ${J.value} `;this.onTextSubmitted(Y)}break}}};executeCommand=async(J,Q)=>{let{threadState:Z}=this.widget.dependencies;if(!Z.mainThread||!J)return;let X=new AbortController,Y=Date.now(),q={id:`command-${Y}-${Math.random().toString(36).substring(7)}`,name:J.name,startTime:Y,abortController:X};this.setState(()=>{this.executingCommand=q});try{if(J.name==="new"){let z=await this.widget.dependencies.startNewThread();R71(z);return}if(J.launchesWindow)EG.instance.tuiInstance.suspend();let G=await this.getCommands().execute(J.name,{worker:this.widget.dependencies.worker,thread:Z.mainThread,ampURL:this.widget.dependencies.ampURL,threadSyncService:this.widget.dependencies.threadSyncService,takeImageAttachments:()=>{let z=this.imageAttachments;return this.setState(()=>{this.imageAttachments=[]}),z},editorDispatch:(z)=>{if(z.type==="set-input")this.textController.clear(),this.textController.insertText(z.input);else if(z.type==="clear")this.textController.clear()},exitApp:()=>{process.exit(0)},openHelp:()=>{this.setState(()=>{this.isShowingHelp=!0})},showCommandOverlay:(z)=>{this.setState(()=>{this.isShowingConfirmationOverlay=!0,this.confirmationOverlayContent=z})},settingsFilePath:this.widget.dependencies.settingsStorage.getSettingsFilePath(),settingsStorage:this.widget.dependencies.settingsStorage,startNewThread:async()=>{await this.widget.dependencies.startNewThread()},pickAndContinueThread:this.widget.dependencies.pickAndContinueThread,switchToThread:async(z)=>{await this.switchToExistingThread(z)},getGuidanceFiles:async()=>{if(!Z.mainThread)return[];return(await qa({filesystem:this.widget.dependencies.worker.fs.fileSystemReader(),configService:this.widget.dependencies.configService,threadService:this.widget.dependencies.threadService},Z.mainThread,X.signal)).map((U)=>({uri:U.uri,type:U.type}))}},Q,X.signal);if(J.launchesWindow)EG.instance.tuiInstance.resume();if(G)this.setState(()=>{this.displayMessage=G})}catch(G){a.error("Error executing command:",G)}finally{this.setState(()=>{this.executingCommand=null})}};buildOptions=async(J)=>{let Q=this.textController.text,Z=this.textController.cursorPosition,Y=th1().detect(Q,Z);if(Y){let{threadState:K}=this.widget.dependencies;return await this.getCompletionBuilder().buildOptions(Y,K.mainThread,K.viewState)}return[]};initState(){if(PG.getInstance().interceptConsole(),this.widget.dependencies.startWithPicker)this.isShowingThreadPicker=!0;this.checkFreeTierStatus(),R71(this.widget.dependencies.worker),this.ideStatusSubscription=this.widget.dependencies.ideClient.status.subscribe((Q)=>{this.setState(()=>{this.ideStatus=Q})}),this.ideMessageSubscription=this.widget.dependencies.ideClient.messages.subscribe(async(Q)=>{let Z=mT();if(!Z){a.warn("No active thread worker found to handle IDE message");return}await new Promise((X)=>setTimeout(X,50)),await Z.handle({type:"user:message",message:{content:[{type:"text",text:Q}]}}),a.debug("Message sent from IDE to agent",{message:Q.slice(0,100)})}),this.ideAppendToPromptSubscription=this.widget.dependencies.ideClient.appendToPrompt.subscribe((Q)=>{this.textController.insertText(Q),a.debug("Appended text to CLI prompt from IDE",{text:Q.slice(0,100)})}),this.updateServiceSubscription=this.widget.dependencies.updateService.state.subscribe((Q)=>{this.setState(()=>{this.updateState=Q})}),this.agentModeSubscription=Z2.pipe(g0((Q)=>Q.settings["experimental.agentMode"]),d8()).subscribe((Q)=>{this.setState(()=>{this.currentAgentMode=Q})}),this.textController.addListener(this.textChangeListener),this.getCommands(),this.textController.onInsertText=(Q,Z)=>{if(Q.length<=3)return!0;let X=cJ6(Q);if(!X)return!0;if(this.imageAttachments.length>=Ao1)return!1;let Y=lJ6(X);if(Y)return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Y]}),!1;return!0},this.updateTerminalTitle();let J=this.widget.dependencies.lockfileManager.getSelectedConfig();if(J)this.connectToSelectedIde(J).catch((Q)=>{let Z=Q instanceof Error?Q.message:String(Q);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Z}`)})});else if(this.widget.dependencies.showIdePicker)this.openIdePicker();else if(this.widget.dependencies.showJetBrainsInstaller)this.openJetBrainsInstaller()}didUpdateWidget(J){super.didUpdateWidget(J),this.setupSelectionListener()}dispose(){if(this.ideStatusSubscription)this.ideStatusSubscription.unsubscribe();if(this.ideMessageSubscription)this.ideMessageSubscription.unsubscribe();if(this.ideAppendToPromptSubscription)this.ideAppendToPromptSubscription.unsubscribe();if(this.updateServiceSubscription)this.updateServiceSubscription.unsubscribe();if(this.agentModeSubscription)this.agentModeSubscription.unsubscribe();if(this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout),this.exitConfirmTimeout=null;if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;if(this.textController.removeListener(this.textChangeListener),this.commands)this.commands.cleanup().catch((J)=>{a.debug("Failed to cleanup commands during disposal",J)});for(let J of this.messageScrollControllers.values())J.dispose();if(this.messageScrollControllers.clear(),process.stdout.write(Hx1("")),this.shouldUseProgressBar())process.stdout.write(Bx1());if(this.progressReportTimer)clearTimeout(this.progressReportTimer),this.progressReportTimer=null}getCurrentConfirmation(){let{threadState:J}=this.widget.dependencies,Z=[...J.activeTools,...J.subagentActiveTools].filter((q)=>q.toolRun.status==="blocked-on-user");if(Z.length===0)return null;let X=Z[0],Y=X.toolRun.status==="blocked-on-user"?X.toolRun.toAllow??[]:[],K=X.toolRun.status==="blocked-on-user"?X.toolRun.reason:void 0;return{type:"tool-use",tools:[{useBlock:X.toolUse,toAllow:Y}],subthreadID:X.subthreadID,reason:K}}shouldUseProgressBar(){return m8.of(this.context).capabilities.xtversion?.toLowerCase().startsWith("ghostty")??!1}updateProgressBar(){if(!this.shouldUseProgressBar())return;let{threadState:J}=this.widget.dependencies,Q=this.getCurrentConfirmation(),Z="off";if(Q)Z="paused";else if(this.isProcessing())Z="indeterminate";if(Z!==this.currentProgressBarState)this.currentProgressBarState=Z,this.sendProgressReport(Z);this.scheduleProgressReportTimer()}sendProgressReport(J){switch(J){case"indeterminate":process.stdout.write(mQ6());break;case"paused":process.stdout.write(uQ6());break;case"off":process.stdout.write(Bx1());break}}scheduleProgressReportTimer(){if(this.progressReportTimer)clearTimeout(this.progressReportTimer),this.progressReportTimer=null;if(this.currentProgressBarState!=="off")this.progressReportTimer=setTimeout(()=>{if(this.currentProgressBarState!=="off")this.sendProgressReport(this.currentProgressBarState),this.scheduleProgressReportTimer()},1e4)}onConfirmationResponse=async(J)=>{let Q=this.getCurrentConfirmation();if(!Q||Q.type!=="tool-use"){a.error("No current tool confirmation found");return}let Z=Q.tools[0]?.useBlock;if(!Z){a.error("No tool use block found in confirmation");return}if(J==="allow-all-session")gU("dangerouslyAllowAll",!0);if(J==="allow-all-persistent")try{await this.widget.dependencies.settingsStorage.set("dangerouslyAllowAll",!0)}catch(Y){if(Y&&Y instanceof Error)this.setState(()=>{this.displayMessage=Y});else a.error("Failed to write dangerouslyAllowAll setting:",Y);return}if(J==="always-guarded"){let Y=Q.tools[0]?.toAllow??[],K=await this.widget.dependencies.settingsStorage.get("guardedFiles.allowlist")||[],q=[...Y,...K];await this.widget.dependencies.settingsStorage.set("guardedFiles.allowlist",q)}let X=J!==null&&["yes","allow-all-session","allow-all-persistent","always-guarded"].includes(J);try{let Y={type:"user:tool-input",toolUse:Z.id,value:{accepted:X}};if(Q.subthreadID)await(await pJ.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(Y);else await this.widget.dependencies.worker.handle(Y)}catch(Y){a.error("Failed to send tool confirmation:",Y)}};showConfirmationOverlay=(J)=>{this.setState(()=>{this.isShowingConfirmationOverlay=!0,this.confirmationOverlayContent=J})};getErrorKey(J){return`${J.constructor.name}:${J.message}`}getCurrentEphemeralError(){let{threadState:J}=this.widget.dependencies,Q=J.viewState;if(Q.state!=="active"||!Q.ephemeralError)return null;let Z=this.getErrorKey(Q.ephemeralError);if(this.dismissedEphemeralErrorKey===Z)return null;return Q.ephemeralError}handleEphemeralErrorResponse=async(J)=>{let Q=this.getCurrentEphemeralError(),Z=this.widget.dependencies.worker;switch(J){case"retry":this.dismissedEphemeralErrorKey=null,await Z.retry();break;case"compact":this.dismissedEphemeralErrorKey=null,await Z.summarizeThread();break;case"dismiss":if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);break}this.setState(()=>{})};handleDisplayMessageDismiss=()=>{this.setState(()=>{this.displayMessage=null})};cancelStreamingMessage=async()=>{await pJ.cancel(this.widget.dependencies.threadID)};switchToExistingThread=async(J)=>{try{let Q=await this.widget.dependencies.switchToThread(J);this.widget.dependencies.worker=Q,this.widget.dependencies.threadID=Q.thread.id,R71(Q),j71()?.switchWorker(this.widget.dependencies.worker),this.setState(()=>{})}catch(Q){throw a.error("Failed to switch to thread:",J,Q),Error(`Failed to switch to thread: ${J}`)}};sendUserMessage=async(J)=>{await this.proceedWithUserMessage(J)};proceedWithUserMessage=async(J)=>{this.cancelBashInvocations(),this.widget.dependencies.history.add(J);let Q=mT()||this.widget.dependencies.worker,Z=[{type:"text",text:J}];if(this.imageAttachments.length>0)Z.push(...this.imageAttachments);await Q.handle({type:"user:message",message:{content:Z}}),this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})};onTrainingModeDialogResponse=async(J)=>{if(this.setState(()=>{this.isShowingTrainingModeDialog=!1}),J&&this.pendingTrainingMode)try{let Q=await this.widget.dependencies.internalAPIClient.updateUserTrainingMode({enabled:!0});if(!Q.ok){let Z=Q.error.message||"Failed to enable training mode";await this.showErrorMessage(Z),this.textController.clear(),this.textController.insertText(this.pendingTrainingMode)}else await this.proceedWithUserMessage(this.pendingTrainingMode)}catch(Q){await this.showErrorMessage(`Failed to enable training mode:
|
5620
5620
|
|
5621
|
-
${Q}`),this.textController.clear(),this.textController.insertText(this.pendingTrainingMode)}else if(!J&&this.pendingTrainingMode)this.textController.clear(),this.textController.insertText(this.pendingTrainingMode);this.setState(()=>{this.pendingTrainingMode=null})};async showErrorMessage(J){this.setState(()=>{this.displayMessage=Error(J)})}async checkFreeTierStatus(){try{let J=await this.widget.dependencies.internalAPIClient.getUserFreeTierStatus({});if(J.ok)this.setState(()=>{this.isFreeTierEnabled=J.result.enabled})}catch(J){a.debug("Failed to check free tier status:",J)}}onExitPressed=()=>{if(this.isConfirmingExit){if(this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout),this.exitConfirmTimeout=null;EG.instance.stop()}else{if(this.setState(()=>{this.isConfirmingExit=!0}),this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout);this.exitConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingExit=!1}),this.exitConfirmTimeout=null},1000)}};toHomeRelative(J){let Q=uX9();if(J===Q)return"~";if(J.startsWith(Q+bu.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(bu.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(bu.sep),"…",Q.slice(-2).join(bu.sep)].join(bu.sep)}build(J){let Q=m8.of(J),Z=I8.of(J),X=Z.base;this.themeColors=X;let{colors:Y,app:K}=Z;this.themeApp=K;let{threadState:q}=this.widget.dependencies;if(this.isShowingThreadPicker)return new kH({child:new ah1({onSelect:async(b)=>{if(b)this.isShowingThreadPicker=!1,this.setState(),await this.switchToExistingThread(b);else process.exit(0)},pageSize:50,threadFetcher:new $51})});this.updateTerminalTitle(),this.updateProgressBar();let G=this.getCurrentConfirmation(),z=q.todosList,U=q.mainThread?.id,W=this.isTranscriptEmpty()?new U51({useGpt5:this.widget.dependencies.useGpt5,updateState:this.updateState??void 0}):new Ah1({key:U?new o5(`message-view-${U}`):void 0,items:q.items,activeTools:q.activeTools,controller:U?this.getMessageScrollController(U):new PV,autofocus:!1,onCopy:this._handleTextCopy.bind(this)}),H=Math.max(Math.floor(Q.size.height*0.4),10),D=this.getCurrentEphemeralError(),M=this.buildBottomWidget(D,G,Y,Z,q,z,H),V=Q.size.width<40,N=q.mainThread?Wc1(q.mainThread):void 0,L=new I71({threadViewState:q.viewState,threadTokenUsage:N,threadID:U??null,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},ideStatus:this.ideStatus,isNarrow:V,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!G,showingEphemeralError:Boolean(q.viewState.state==="active"&&q.viewState.ephemeralError),runningBashInvocations:this.bashInvocations.length>0,executingCommand:this.executingCommand?.name??null}),O=new Rh1({activeTools:[...q.activeTools,...q.subagentActiveTools],subagents:q.subagents}),A=new A71({bashInvocations:this.bashInvocations}),j=[];if(this.isFreeTierEnabled)j.push(new s6({decoration:new h2(Y.secondary),child:new S8({padding:B6.horizontal(1),child:new q0({text:new I1("Thank you for trying the ad-supported Amp Free experiment — AD",new v1({color:d1.black})),textAlign:"center"})})}));j.push(new $2({child:W}),O,A,new s6({constraints:new p6(0,Q.size.width,0,H),child:M}),new i0({height:1,child:new S8({padding:B6.horizontal(1),child:L})}));let R=new O6({crossAxisAlignment:"stretch",mainAxisSize:"max",children:j}),I=new E5(()=>{if(this.getCurrentEphemeralError())return this.handleEphemeralErrorResponse("dismiss"),"handled";if(this.displayMessage)return this.handleDisplayMessageDismiss(),"handled";if(this.isShowingHelp)return this.setState(()=>{this.isShowingHelp=!1}),"handled";if(this.isShowingFileChangesOverlay)return this.setState(()=>{this.isShowingFileChangesOverlay=!1}),"handled";if(this.isShowingIdePicker)return this.dismissIdePicker(),"handled";if(this.isShowingJetBrainsInstaller)return this.dismissJetBrainsInstaller(),"handled";if(this.isShowingConfirmationOverlay)return this.setState(()=>{this.isShowingConfirmationOverlay=!1,this.confirmationOverlayContent=""}),"handled";if(this.isShowingConsoleOverlay)return this.setState(()=>{this.isShowingConsoleOverlay=!1}),"handled";if(this.clearActiveSelection())return"handled";if(this.isConfirmingClearInput){if(this.textController.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.bashInvocations.length>0)return this.cancelBashInvocations(),"handled";if(this.executingCommand)return a.info("Canceling executing command:",this.executingCommand.name),this.executingCommand.abortController.abort(),"handled";if(this.isProcessing())return this.cancelStreamingMessage().catch((m)=>{a.error("Failed to cancel streaming message:",m)}),"handled";if(this.textController.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return"ignored"}),w=new E5(()=>{return this.onExitPressed(),"handled"}),E=new E5(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),$=new E5(()=>{return bV.instance.toggleAll(),"handled"}),P=new E5(()=>{return EG.instance.toggleFrameStatsOverlay(),"handled"}),C=new E5(()=>{return EG.instance.tuiInstance.getScreen().markForRefresh(),XZ.instance.requestFrame(),"handled"}),k=new E5(()=>{let b=this.findElementByKey("message-view-selection-area");if(b?.state){let m=b.state,n=m.controller?.copySelection();if(n&&n.length>0)return this.setState(()=>{this.showingSelectionCopiedHint=!0}),setTimeout(()=>{this.setState(()=>{this.showingSelectionCopiedHint=!1})},2000),setTimeout(()=>{m.controller.endCopyHighlight(),m.controller.clear()},350),"handled"}return this.onExitPressed(),"handled"}),g=new E5(()=>{let{threadState:b}=this.widget.dependencies,m=b.mainThread?.id;if(m){let n=this.getMessageScrollController(m),u=Math.max(Math.floor(Q.size.height*0.4),10),Q1=Q.size.height-u;n.animatePageUp(Q1,100)}return"handled"}),T=new E5(()=>{let{threadState:b}=this.widget.dependencies,m=b.mainThread?.id;if(m){let n=this.getMessageScrollController(m),u=Math.max(Math.floor(Q.size.height*0.4),10),Q1=Q.size.height-u;n.animatePageDown(Q1,100)}return"handled"}),v=new E5(()=>{let{threadState:b}=this.widget.dependencies,m=b.mainThread?.id;if(m)this.getMessageScrollController(m).animateTo(0,100);return"handled"}),f=new E5(()=>{let{threadState:b}=this.widget.dependencies,m=b.mainThread?.id;if(m)this.getMessageScrollController(m).animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),h=new Map([[g2.key("Escape"),new Ku],[g2.ctrl("c"),new yT],[g2.ctrl("l"),new Uu],[g2.alt("c"),new qu],[g2.alt("p"),new zu],[g2.ctrl("r"),new Gu],[g2.key("PageUp"),new Q71],[g2.key("PageDown"),new Z71],[g2.key("Home"),new X71],[g2.key("End"),new Y71]]);if(process.platform==="darwin")h.set(g2.meta("c"),new yT);let S=new Map([[Ku,I],[s41,w],[Uu,C],[qu,E],[Gu,$],[zu,P],[yT,k],[Q71,g],[Z71,T],[X71,v],[Y71,f]]),x=R;if(this.isShowingConsoleOverlay)x=new _K({children:[x,new Th1]});if(this.isShowingHelp)x=new _K({children:[x,new Sh1]});if(this.isShowingFileChangesOverlay)x=new _K({children:[x,new Ty1]});if(this.isShowingConfirmationOverlay)x=new _K({children:[x,new Eh1({details:this.confirmationOverlayContent})]});if(this.isShowingIdePicker)return new kH({child:new bK({actions:S,child:new $V({shortcuts:h,debugLabel:"ide-picker-shortcuts",child:new kh1({lockfileManager:this.widget.dependencies.lockfileManager,onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection})})})});if(this.isShowingJetBrainsInstaller)return new kH({child:new bK({actions:S,child:new $V({shortcuts:h,debugLabel:"jetbrains-installer-shortcuts",child:new lh1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new kH({child:new bK({actions:S,child:new $V({shortcuts:h,debugLabel:"main-app-shortcuts",child:x})})})}buildBottomWidget(J,Q,Z,X,Y,K,q){if(J)return new Ch1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(this.isShowingTrainingModeDialog)return new rh1({onResponse:this.onTrainingModeDialogResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new Ph1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new ih1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let G=X.app,z=pX9(X),U=new W71({key:this.textFieldKey,controller:this.textController,triggers:[th1()],optionsBuilder:this.buildOptions,onSelected:this.onOptionSelected,displayStringForOption:(P)=>wh1(P),overlayBorderColor:Z.border,textFieldProps:{placeholder:"Type your message... (use / for commands, @ for files)",wrap:!0,minLines:3,maxLines:null,expands:!0,autofocus:!0,onSubmitted:this.onTextSubmitted,submitKey:{character:"Enter"},prompts:z,style:{border:null},clipboard:EG.instance.tuiInstance.clipboard},optionViewBuilder:(P,C,k)=>{let g=k?Z.selection:void 0,T=C.type==="command"?Z.warning:Z.secondary,v=Z.foreground,f=Z.foreground,h,S;switch(C.type){case"command":h="/",S=C.name;break;case"file":h="@",S=C.path;break;case"thread":h="",S=C.title;break;default:h="",S=wh1(C);break}let x=dz6(C),b=new I1(h,new v1({color:T})),m=new I1(S,new v1({color:v})),n=[b,m];if(x){let u=new I1(" - ",new v1({color:f,dim:!0})),Q1=new I1(x,new v1({color:f,dim:!0}));n.push(u,Q1)}return new s6({decoration:new h2(g),child:new q0({text:new I1("",void 0,n),maxLines:1,overflow:"ellipsis"})})}}),F=Y.mainThread?.queuedMessages??[],W=new Q2({onKey:this.handleHistoryNavigation,child:U}),H=this.currentShellModeStatus,D=this.imageAttachments.length>0?new s6({padding:B6.only({bottom:1,left:1}),child:new q0({text:new I1("",void 0,[new I1("Images: ",new v1({color:Z.foreground,dim:!0})),...this.imageAttachments.flatMap((P,C)=>[new I1(`[image ${C+1}]`,new v1({color:Z.success})),...C<this.imageAttachments.length-1?[new I1(" ")]:[]])])})}):null,M=Array.isArray(K)&&K.length>0,V=Array.isArray(F)&&F.length>0,N=D?new O6({crossAxisAlignment:"start",children:[D,W]}):W,L=V?new nh1({queuedMessages:F}):void 0,O=M?new _x1(new jh1({todos:K}),{clipBehavior:"antiAlias"}):void 0,A=[],j=Y.viewState;if(!this.isSummarizing(j))A.push({text:new I1("",void 0,[new I1("Enter",new v1({color:G.keybind})),new I1(" to send",new v1({color:Z.foreground,dim:!0}))]),position:"bottom-left"});if(H)A.push({text:new I1(H==="hidden"?"shell mode (incognito)":"shell mode",new v1({color:H==="hidden"?X.app.shellModeHidden:X.app.shellMode})),position:"top-left",offsetY:D?1:0});let R=this.currentAgentMode;if(R&&!["default",aU[0]].includes(R)&&!H){let P=dX9(R);A.push({text:new I1("",void 0,[new I1("agent-mode: ",new v1({color:Z.foreground,dim:!0})),new I1(R,new v1({color:P}))]),position:"top-left",offsetY:0})}let I=Y.mainThread?.metadata?.treeInfo?.uri,w;if(I)w=S0.isUri(I)?I.fsPath:I;else w=process.cwd();let E=this.toHomeRelative(w),$=this.shorten(E);return A.push({text:new I1($,new v1({color:Z.foreground,dim:!0})),position:"bottom-right"}),new Ay1({leftChild:N,rightChild1:L,rightChild2:O,maxHeight:q,overlayTexts:A,borderColor:Z.border})}}});import{randomBytes as cX9}from"node:crypto";import{mkdir as lX9,readFile as qF6,writeFile as iX9}from"node:fs/promises";import nX9 from"node:os";import eh1 from"node:path";import{stderr as s2,stdout as m2}from"node:process";function aX9(J){process.emitWarning=function(Q,Z,X,Y){let K=typeof Q==="string"?Q:Q.message||String(Q),q=Z||"Warning",G=!1;J.warn(K,{name:q,code:X})}}function pA(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")gU("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")gU("gpt5",Q.tryGpt5);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")gU("experimental.agentMode",Q.agentMode)}async function Zg1(J){try{await lX9(eh1.dirname(Jg1),{recursive:!0}),await iX9(Jg1,J,"utf-8")}catch(Q){a.debug("Failed to save last thread ID",Q)}}async function oX9(){try{return(await qF6(Jg1,"utf-8")).trim()}catch(J){return null}}async function tX9(J){let Q;try{Q=JSON.parse(J)}catch(Z){throw Error(`Failed to parse --mcp-config as JSON: ${Z instanceof Error?Z.message:String(Z)}`)}try{return sX9.parse(Q)}catch(Z){if(Z instanceof T0.ZodError){let X=Z.issues.map((Y)=>`${Y.path.join(".")}: ${Y.message}`).join(", ");throw Error(`Invalid MCP server configuration: ${X}`)}throw Error(`Failed to validate MCP server configuration: ${String(Z)}`)}}function eX9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z)||{},Y={};if(typeof X==="object")for(let[K,q]of Object.entries(X))Y[K]={...q,_target:"global"};for(let[K,q]of Object.entries(Q))Y[K]={...q,_target:"workspace"};return Y}return J.get(Z)},async keys(){let Z=await J.keys();if(!Z.includes("mcpServers"))Z.push("mcpServers");return Z},[Symbol.dispose](){J[Symbol.dispose]()}}}function XY9(J,Q){let Z=Q.args[0],X=Q.commands.map((K)=>K.name());if(Z&&!Z.includes(" ")&&Z.length<30&&!/[./\\]/.test(Z)){let K=X.filter((G)=>Z.includes(G)||G.includes(Z)),q="Run amp --help for a list of available commands.";if(K.length>0)q=`Did you mean: ${K.join(", ")}? Or run amp --help for all commands.`;throw new E2(SK.unknownCommand(Z),1,q)}}function Ay2(){return GF6}function T51(J){return{...J,getThreadEnvironment:Q41,vfs:q10({os:J.fileSystem}),fileChangeTrackerStorage:new lv(J.fileSystem),generateThreadTitle:Ua,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}async function dA(J,Q){wc1("0.0.1759219286-g0d79d3");let Z=SQ1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:K0.of([S0.file(process.cwd())]),defaultAmpURL:J.ampURL,defaultCacheDirectory:Qb1,homeDir:Xg1,userConfigDir:zF6}),X=await A9();a.debug("Global configuration initialized",{hasCacheDirectory:!!X.settings.cacheDirectory,settingsKeys:Object.keys(X.settings)});let Y=hl(Ep()),K=ge1({configService:Z,toolService:Y}),q=mL0(Y,R8,Wt).catch((L)=>{a.warn("Toolbox registration failed, continuing anyway:",L)}),G=K.initialized.catch((L)=>{a.warn("MCP service initialization failed, continuing anyway:",L)});if(J.executeMode)await Promise.all([G,q]);if(Q.jetbrains)Ic1(!0);if(Q.ide&&kb1())Ec1(!0);if(t06(Y,X.settings),Q.jetbrains)Y.registerTool(ba);else if(Q.ide)Y.registerTool(kK0);let z;if(!J.executeMode)z=new W41(process.cwd(),{},!0);else z=new class extends W41{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(m2.write(`No API key found. Starting login flow...
|
5621
|
+
${Q}`),this.textController.clear(),this.textController.insertText(this.pendingTrainingMode)}else if(!J&&this.pendingTrainingMode)this.textController.clear(),this.textController.insertText(this.pendingTrainingMode);this.setState(()=>{this.pendingTrainingMode=null})};async showErrorMessage(J){this.setState(()=>{this.displayMessage=Error(J)})}async checkFreeTierStatus(){try{let J=await this.widget.dependencies.internalAPIClient.getUserFreeTierStatus({});if(J.ok)this.setState(()=>{this.isFreeTierEnabled=J.result.enabled})}catch(J){a.debug("Failed to check free tier status:",J)}}onExitPressed=()=>{if(this.isConfirmingExit){if(this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout),this.exitConfirmTimeout=null;EG.instance.stop()}else{if(this.setState(()=>{this.isConfirmingExit=!0}),this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout);this.exitConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingExit=!1}),this.exitConfirmTimeout=null},1000)}};toHomeRelative(J){let Q=uX9();if(J===Q)return"~";if(J.startsWith(Q+bu.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(bu.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(bu.sep),"…",Q.slice(-2).join(bu.sep)].join(bu.sep)}build(J){let Q=m8.of(J),Z=I8.of(J),X=Z.base;this.themeColors=X;let{colors:Y,app:K}=Z;this.themeApp=K;let{threadState:q}=this.widget.dependencies;if(this.isShowingThreadPicker)return new kH({child:new ah1({onSelect:async(b)=>{if(b)this.isShowingThreadPicker=!1,this.setState(),await this.switchToExistingThread(b);else process.exit(0)},pageSize:50,threadFetcher:new $51})});this.updateTerminalTitle(),this.updateProgressBar();let G=this.getCurrentConfirmation(),z=q.todosList,U=q.mainThread?.id,W=this.isTranscriptEmpty()?new U51({useGpt5:this.widget.dependencies.useGpt5,updateState:this.updateState??void 0}):new Ah1({key:U?new o5(`message-view-${U}`):void 0,items:q.items,activeTools:q.activeTools,controller:U?this.getMessageScrollController(U):new PV,autofocus:!1,onCopy:this._handleTextCopy.bind(this)}),H=Math.max(Math.floor(Q.size.height*0.4),10),D=this.getCurrentEphemeralError(),M=this.buildBottomWidget(D,G,Y,Z,q,z,H),V=Q.size.width<40,N=q.mainThread?Wc1(q.mainThread):void 0,L=new I71({threadViewState:q.viewState,threadTokenUsage:N,threadID:U??null,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},ideStatus:this.ideStatus,isNarrow:V,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!G,showingEphemeralError:Boolean(q.viewState.state==="active"&&q.viewState.ephemeralError),runningBashInvocations:this.bashInvocations.length>0,executingCommand:this.executingCommand?.name??null}),O=new Rh1({activeTools:[...q.activeTools,...q.subagentActiveTools],subagents:q.subagents}),A=new A71({bashInvocations:this.bashInvocations}),j=[];if(this.isFreeTierEnabled)j.push(new s6({decoration:new h2(Y.secondary),child:new S8({padding:B6.horizontal(1),child:new q0({text:new I1("Thank you for trying the ad-supported Amp Free experiment — AD",new v1({color:d1.black})),textAlign:"center"})})}));j.push(new $2({child:W}),O,A,new s6({constraints:new p6(0,Q.size.width,0,H),child:M}),new i0({height:1,child:new S8({padding:B6.horizontal(1),child:L})}));let R=new O6({crossAxisAlignment:"stretch",mainAxisSize:"max",children:j}),I=new E5(()=>{if(this.getCurrentEphemeralError())return this.handleEphemeralErrorResponse("dismiss"),"handled";if(this.displayMessage)return this.handleDisplayMessageDismiss(),"handled";if(this.isShowingHelp)return this.setState(()=>{this.isShowingHelp=!1}),"handled";if(this.isShowingFileChangesOverlay)return this.setState(()=>{this.isShowingFileChangesOverlay=!1}),"handled";if(this.isShowingIdePicker)return this.dismissIdePicker(),"handled";if(this.isShowingJetBrainsInstaller)return this.dismissJetBrainsInstaller(),"handled";if(this.isShowingConfirmationOverlay)return this.setState(()=>{this.isShowingConfirmationOverlay=!1,this.confirmationOverlayContent=""}),"handled";if(this.isShowingConsoleOverlay)return this.setState(()=>{this.isShowingConsoleOverlay=!1}),"handled";if(this.clearActiveSelection())return"handled";if(this.isConfirmingClearInput){if(this.textController.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.bashInvocations.length>0)return this.cancelBashInvocations(),"handled";if(this.executingCommand)return a.info("Canceling executing command:",this.executingCommand.name),this.executingCommand.abortController.abort(),"handled";if(this.isProcessing())return this.cancelStreamingMessage().catch((m)=>{a.error("Failed to cancel streaming message:",m)}),"handled";if(this.textController.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return"ignored"}),w=new E5(()=>{return this.onExitPressed(),"handled"}),E=new E5(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),$=new E5(()=>{return bV.instance.toggleAll(),"handled"}),P=new E5(()=>{return EG.instance.toggleFrameStatsOverlay(),"handled"}),C=new E5(()=>{return EG.instance.tuiInstance.getScreen().markForRefresh(),XZ.instance.requestFrame(),"handled"}),k=new E5(()=>{let b=this.findElementByKey("message-view-selection-area");if(b?.state){let m=b.state,n=m.controller?.copySelection();if(n&&n.length>0)return this.setState(()=>{this.showingSelectionCopiedHint=!0}),setTimeout(()=>{this.setState(()=>{this.showingSelectionCopiedHint=!1})},2000),setTimeout(()=>{m.controller.endCopyHighlight(),m.controller.clear()},350),"handled"}return this.onExitPressed(),"handled"}),g=new E5(()=>{let{threadState:b}=this.widget.dependencies,m=b.mainThread?.id;if(m){let n=this.getMessageScrollController(m),u=Math.max(Math.floor(Q.size.height*0.4),10),Q1=Q.size.height-u;n.animatePageUp(Q1,100)}return"handled"}),T=new E5(()=>{let{threadState:b}=this.widget.dependencies,m=b.mainThread?.id;if(m){let n=this.getMessageScrollController(m),u=Math.max(Math.floor(Q.size.height*0.4),10),Q1=Q.size.height-u;n.animatePageDown(Q1,100)}return"handled"}),v=new E5(()=>{let{threadState:b}=this.widget.dependencies,m=b.mainThread?.id;if(m)this.getMessageScrollController(m).animateTo(0,100);return"handled"}),f=new E5(()=>{let{threadState:b}=this.widget.dependencies,m=b.mainThread?.id;if(m)this.getMessageScrollController(m).animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),h=new Map([[g2.key("Escape"),new Ku],[g2.ctrl("c"),new yT],[g2.ctrl("l"),new Uu],[g2.alt("c"),new qu],[g2.alt("p"),new zu],[g2.ctrl("r"),new Gu],[g2.key("PageUp"),new Q71],[g2.key("PageDown"),new Z71],[g2.key("Home"),new X71],[g2.key("End"),new Y71]]);if(process.platform==="darwin")h.set(g2.meta("c"),new yT);let S=new Map([[Ku,I],[s41,w],[Uu,C],[qu,E],[Gu,$],[zu,P],[yT,k],[Q71,g],[Z71,T],[X71,v],[Y71,f]]),x=R;if(this.isShowingConsoleOverlay)x=new _K({children:[x,new Th1]});if(this.isShowingHelp)x=new _K({children:[x,new Sh1]});if(this.isShowingFileChangesOverlay)x=new _K({children:[x,new Ty1]});if(this.isShowingConfirmationOverlay)x=new _K({children:[x,new Eh1({details:this.confirmationOverlayContent})]});if(this.isShowingIdePicker)return new kH({child:new bK({actions:S,child:new $V({shortcuts:h,debugLabel:"ide-picker-shortcuts",child:new kh1({lockfileManager:this.widget.dependencies.lockfileManager,onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection})})})});if(this.isShowingJetBrainsInstaller)return new kH({child:new bK({actions:S,child:new $V({shortcuts:h,debugLabel:"jetbrains-installer-shortcuts",child:new lh1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new kH({child:new bK({actions:S,child:new $V({shortcuts:h,debugLabel:"main-app-shortcuts",child:x})})})}buildBottomWidget(J,Q,Z,X,Y,K,q){if(J)return new Ch1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(this.isShowingTrainingModeDialog)return new rh1({onResponse:this.onTrainingModeDialogResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new Ph1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new ih1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let G=X.app,z=pX9(X),U=new W71({key:this.textFieldKey,controller:this.textController,triggers:[th1()],optionsBuilder:this.buildOptions,onSelected:this.onOptionSelected,displayStringForOption:(P)=>wh1(P),overlayBorderColor:Z.border,textFieldProps:{placeholder:"Type your message... (use / for commands, @ for files)",wrap:!0,minLines:3,maxLines:null,expands:!0,autofocus:!0,onSubmitted:this.onTextSubmitted,submitKey:{character:"Enter"},prompts:z,style:{border:null},clipboard:EG.instance.tuiInstance.clipboard},optionViewBuilder:(P,C,k)=>{let g=k?Z.selection:void 0,T=C.type==="command"?Z.warning:Z.secondary,v=Z.foreground,f=Z.foreground,h,S;switch(C.type){case"command":h="/",S=C.name;break;case"file":h="@",S=C.path;break;case"thread":h="",S=C.title;break;default:h="",S=wh1(C);break}let x=dz6(C),b=new I1(h,new v1({color:T})),m=new I1(S,new v1({color:v})),n=[b,m];if(x){let u=new I1(" - ",new v1({color:f,dim:!0})),Q1=new I1(x,new v1({color:f,dim:!0}));n.push(u,Q1)}return new s6({decoration:new h2(g),child:new q0({text:new I1("",void 0,n),maxLines:1,overflow:"ellipsis"})})}}),F=Y.mainThread?.queuedMessages??[],W=new Q2({onKey:this.handleHistoryNavigation,child:U}),H=this.currentShellModeStatus,D=this.imageAttachments.length>0?new s6({padding:B6.only({bottom:1,left:1}),child:new q0({text:new I1("",void 0,[new I1("Images: ",new v1({color:Z.foreground,dim:!0})),...this.imageAttachments.flatMap((P,C)=>[new I1(`[image ${C+1}]`,new v1({color:Z.success})),...C<this.imageAttachments.length-1?[new I1(" ")]:[]])])})}):null,M=Array.isArray(K)&&K.length>0,V=Array.isArray(F)&&F.length>0,N=D?new O6({crossAxisAlignment:"start",children:[D,W]}):W,L=V?new nh1({queuedMessages:F}):void 0,O=M?new _x1(new jh1({todos:K}),{clipBehavior:"antiAlias"}):void 0,A=[],j=Y.viewState;if(!this.isSummarizing(j))A.push({text:new I1("",void 0,[new I1("Enter",new v1({color:G.keybind})),new I1(" to send",new v1({color:Z.foreground,dim:!0}))]),position:"bottom-left"});if(H)A.push({text:new I1(H==="hidden"?"shell mode (incognito)":"shell mode",new v1({color:H==="hidden"?X.app.shellModeHidden:X.app.shellMode})),position:"top-left",offsetY:D?1:0});let R=this.currentAgentMode;if(R&&!["default",aU[0]].includes(R)&&!H){let P=dX9(R);A.push({text:new I1("",void 0,[new I1("agent-mode: ",new v1({color:Z.foreground,dim:!0})),new I1(R,new v1({color:P}))]),position:"top-left",offsetY:0})}let I=Y.mainThread?.metadata?.treeInfo?.uri,w;if(I)w=S0.isUri(I)?I.fsPath:I;else w=process.cwd();let E=this.toHomeRelative(w),$=this.shorten(E);return A.push({text:new I1($,new v1({color:Z.foreground,dim:!0})),position:"bottom-right"}),new Ay1({leftChild:N,rightChild1:L,rightChild2:O,maxHeight:q,overlayTexts:A,borderColor:Z.border})}}});import{randomBytes as cX9}from"node:crypto";import{mkdir as lX9,readFile as qF6,writeFile as iX9}from"node:fs/promises";import nX9 from"node:os";import eh1 from"node:path";import{stderr as s2,stdout as m2}from"node:process";function aX9(J){process.emitWarning=function(Q,Z,X,Y){let K=typeof Q==="string"?Q:Q.message||String(Q),q=Z||"Warning",G=!1;J.warn(K,{name:q,code:X})}}function pA(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")gU("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")gU("gpt5",Q.tryGpt5);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")gU("experimental.agentMode",Q.agentMode)}async function Zg1(J){try{await lX9(eh1.dirname(Jg1),{recursive:!0}),await iX9(Jg1,J,"utf-8")}catch(Q){a.debug("Failed to save last thread ID",Q)}}async function oX9(){try{return(await qF6(Jg1,"utf-8")).trim()}catch(J){return null}}async function tX9(J){let Q;try{Q=JSON.parse(J)}catch(Z){throw Error(`Failed to parse --mcp-config as JSON: ${Z instanceof Error?Z.message:String(Z)}`)}try{return sX9.parse(Q)}catch(Z){if(Z instanceof T0.ZodError){let X=Z.issues.map((Y)=>`${Y.path.join(".")}: ${Y.message}`).join(", ");throw Error(`Invalid MCP server configuration: ${X}`)}throw Error(`Failed to validate MCP server configuration: ${String(Z)}`)}}function eX9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z)||{},Y={};if(typeof X==="object")for(let[K,q]of Object.entries(X))Y[K]={...q,_target:"global"};for(let[K,q]of Object.entries(Q))Y[K]={...q,_target:"workspace"};return Y}return J.get(Z)},async keys(){let Z=await J.keys();if(!Z.includes("mcpServers"))Z.push("mcpServers");return Z},[Symbol.dispose](){J[Symbol.dispose]()}}}function XY9(J,Q){let Z=Q.args[0],X=Q.commands.map((K)=>K.name());if(Z&&!Z.includes(" ")&&Z.length<30&&!/[./\\]/.test(Z)){let K=X.filter((G)=>Z.includes(G)||G.includes(Z)),q="Run amp --help for a list of available commands.";if(K.length>0)q=`Did you mean: ${K.join(", ")}? Or run amp --help for all commands.`;throw new E2(SK.unknownCommand(Z),1,q)}}function Ay2(){return GF6}function T51(J){return{...J,getThreadEnvironment:Q41,vfs:q10({os:J.fileSystem}),fileChangeTrackerStorage:new lv(J.fileSystem),generateThreadTitle:Ua,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}async function dA(J,Q){wc1("0.0.1759233723-gf92434");let Z=SQ1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:K0.of([S0.file(process.cwd())]),defaultAmpURL:J.ampURL,defaultCacheDirectory:Qb1,homeDir:Xg1,userConfigDir:zF6}),X=await A9();a.debug("Global configuration initialized",{hasCacheDirectory:!!X.settings.cacheDirectory,settingsKeys:Object.keys(X.settings)});let Y=hl(Ep()),K=ge1({configService:Z,toolService:Y}),q=mL0(Y,R8,Wt).catch((L)=>{a.warn("Toolbox registration failed, continuing anyway:",L)}),G=K.initialized.catch((L)=>{a.warn("MCP service initialization failed, continuing anyway:",L)});if(J.executeMode)await Promise.all([G,q]);if(Q.jetbrains)Ic1(!0);if(Q.ide&&kb1())Ec1(!0);if(t06(Y,X.settings),Q.jetbrains)Y.registerTool(ba);else if(Q.ide)Y.registerTool(kK0);let z;if(!J.executeMode)z=new W41(process.cwd(),{},!0);else z=new class extends W41{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(m2.write(`No API key found. Starting login flow...
|
5622
5622
|
`),!await YY9(J))await BA(),process.exit(1)}let U=await A10({isDevelopment:!1}),F=new yU1(U),W=new bU1(U,{lazy:!0}),H=new ED1(F),D=Q.notifications!==void 0?Q.notifications:!J.executeMode,M=Z66({playNotificationSound:async(L)=>{if(D){J66(L);let O=Tx1(),A=Cx1();if((!O||A)&&X.settings["notifications.system.enabled"]!==!1){if(L==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(L==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:F});a.info("Starting Amp background services");let V=fY0({threadService:F,threadHistoryService:W,isExtensionDevelopment:!1}),N={configService:Z,toolService:Y,mcpService:K,threadService:F,threadHistoryService:W,threadSummaryService:H,threadSyncService:V,threadStorage:U,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:z,notificationService:M,fileSystem:Q.jetbrains||Q.ide?Z10:R8};return{...N,async asyncDispose(){await N.mcpService.dispose(),await N.threadService.asyncDispose(),N.configService.unsubscribe(),N.toolService.dispose(),N.fuzzyServer.dispose(),N.threadSyncService.dispose(),N.settingsStorage[Symbol.dispose]()}}}async function YY9(J){if(!J.executeMode){if(!await ub1("Would you like to log in to Amp? [(y)es, (n)o]: "))return m2.write(`Login cancelled. Run the command again to retry.
|
5623
5623
|
`),!1}return await UF6(J)}async function UF6(J){let Q=cX9(32).toString("hex"),Z=await mb1(J.ampURL,Q);try{await wT(Z)}catch(Y){a.error("Failed to open browser",{error:Y})}let X=await mb1(J.ampURL,Q,!1);m2.write(`If your browser did not open automatically, visit:
|
5624
5624
|
|
@@ -5628,12 +5628,12 @@ ${J8.blue.bold(X)}
|
|
5628
5628
|
Login successful! You can now use the Amp CLI.
|
5629
5629
|
`),!0}catch(Y){return a.error("Login failed",{error:Y}),s2.write(`
|
5630
5630
|
Login failed: ${Y instanceof Error?Y.message:String(Y)}
|
5631
|
-
`),!1}}function KY9(){let J=new ng().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((W)=>{if(W.code==="commander.help"||W.code==="commander.version"||W.exitCode===0)zT(),process.exit(0);let H=W.originalError??W;J76(H)}),J.option("-V, --version","output the version number",()=>{m2.write(`0.0.
|
5632
|
-
`),process.exit(0)}),J.addHelpText("after",w56()),J.configureHelp({formatHelp:I56}),J.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let D=H.optsWithGlobals(),M=await yK(D);await UY9(M)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(W,H)=>{let D=H.optsWithGlobals(),M=await yK(D);await zY9(M,await $b1(D,M.settings))});let Q=async(W,H,D)=>{SQ1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:K0.of([S0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:Xg1,userConfigDir:zF6});let M={...H,executeMode:!1};await Qg1(M,{...W,startWithPicker:!0},D)},Z=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(W,H)=>{let D=H.optsWithGlobals(),M=await yK(D);await KF6(D,M,H)});Z.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(W,H)=>{let D=H.optsWithGlobals(),M=await yK(D);await VY9(D,M,H)}),Z.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. If no thread ID is provided, the most recently used thread will be continued.").option("--pick","Pick a thread interactively from a list").action(async(W,H,D)=>{let M=D.optsWithGlobals(),V=await yK(M);if(H.pick)await Q(M,V,D);else await MY9(M,V,W,D)}),Z.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(W,H,D)=>{let M=D.optsWithGlobals(),V=await yK(M);await DY9(M,V,W,D)}),Z.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(W,H)=>{let D=H.optsWithGlobals(),M=await yK(D);await KF6(D,M,H)}),Z.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, workspace, group) or share with Amp support for debugging. Use --visibility to change who can access the thread, or --support to share with the Amp team for troubleshooting.").alias("s").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").option("--support","Share thread with Amp support for debugging").action(async(W,H,D)=>{let M=D.optsWithGlobals(),V=await yK(M);await BY9(M,V,W,D,H.support)}),Z.command("compact <threadId>").alias("co").summary("Compact a thread").description("Compact a thread by creating a summary of the conversation history. This reduces the thread size while preserving the key information and context, making it more token efficient for future use.").action(async(W,H,D)=>{let M=D.optsWithGlobals(),V=await yK(M);await HY9(M,V,W,D)}),mJ6(J,async(W,H)=>{let D=await yK(H);pA(W,H);let M=await dA(D,H);return{context:D,mcpService:M.mcpService,toolService:M.toolService,cleanupTerminal:zT,asyncDispose:M.asyncDispose.bind(M)}}),KJ6(J),n56(J,async(W)=>{return(await yK(W)).settings});let X=new ng().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(W)=>{await bb1(W.force||!1,W.verbose||!1,"0.0.
|
5631
|
+
`),!1}}function KY9(){let J=new ng().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((W)=>{if(W.code==="commander.help"||W.code==="commander.version"||W.exitCode===0)zT(),process.exit(0);let H=W.originalError??W;J76(H)}),J.option("-V, --version","output the version number",()=>{m2.write(`0.0.1759233723-gf92434 (released 2025-09-30T12:07:58.474Z)
|
5632
|
+
`),process.exit(0)}),J.addHelpText("after",w56()),J.configureHelp({formatHelp:I56}),J.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let D=H.optsWithGlobals(),M=await yK(D);await UY9(M)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(W,H)=>{let D=H.optsWithGlobals(),M=await yK(D);await zY9(M,await $b1(D,M.settings))});let Q=async(W,H,D)=>{SQ1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:K0.of([S0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:Xg1,userConfigDir:zF6});let M={...H,executeMode:!1};await Qg1(M,{...W,startWithPicker:!0},D)},Z=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(W,H)=>{let D=H.optsWithGlobals(),M=await yK(D);await KF6(D,M,H)});Z.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(W,H)=>{let D=H.optsWithGlobals(),M=await yK(D);await VY9(D,M,H)}),Z.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. If no thread ID is provided, the most recently used thread will be continued.").option("--pick","Pick a thread interactively from a list").action(async(W,H,D)=>{let M=D.optsWithGlobals(),V=await yK(M);if(H.pick)await Q(M,V,D);else await MY9(M,V,W,D)}),Z.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(W,H,D)=>{let M=D.optsWithGlobals(),V=await yK(M);await DY9(M,V,W,D)}),Z.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(W,H)=>{let D=H.optsWithGlobals(),M=await yK(D);await KF6(D,M,H)}),Z.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, workspace, group) or share with Amp support for debugging. Use --visibility to change who can access the thread, or --support to share with the Amp team for troubleshooting.").alias("s").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").option("--support","Share thread with Amp support for debugging").action(async(W,H,D)=>{let M=D.optsWithGlobals(),V=await yK(M);await BY9(M,V,W,D,H.support)}),Z.command("compact <threadId>").alias("co").summary("Compact a thread").description("Compact a thread by creating a summary of the conversation history. This reduces the thread size while preserving the key information and context, making it more token efficient for future use.").action(async(W,H,D)=>{let M=D.optsWithGlobals(),V=await yK(M);await HY9(M,V,W,D)}),mJ6(J,async(W,H)=>{let D=await yK(H);pA(W,H);let M=await dA(D,H);return{context:D,mcpService:M.mcpService,toolService:M.toolService,cleanupTerminal:zT,asyncDispose:M.asyncDispose.bind(M)}}),KJ6(J),n56(J,async(W)=>{return(await yK(W)).settings});let X=new ng().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(W)=>{await bb1(W.force||!1,W.verbose||!1,"0.0.1759233723-gf92434"),process.exit()});J.addCommand(X,{hidden:!0});function Y(W,H,D){let V=typeof W.description==="string"?W.description:D===void 0?W.description(!0):W.description(D),N=new ZA(H,V),L=ZY9(W);if(L)N.default(L);if(N.hidden=JY9(W)||YF6(W),"choices"in W)N.choices([...W.choices]);return N}for(let W of XF6)switch(W.type){case"flag":{J.addOption(Y(W,`--${W.long}`)),J.addOption(Y(W,`--no-${W.long}`,!1));break}case"switch":{J.addOption(Y(W,`--${W.long}`,!0));break}default:{J.addOption(Y(W,`--${W.long} <value>`));break}}let K=new ZA("-x, --execute [message]","Use execute mode, optionally with user message. In execute mode, agent will execute provided prompt (either as argument, or via stdin). Only last assistant message is printed. Enabled automatically when redirecting stdout.").default(!1);if(J.addOption(K),process.env.AMP_CLI_REMOTE){let W=new ZA("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1);J.addOption(W)}let q=new ZA("--stream-json","When used with --execute, output in Claude Code compatible stream JSON format instead of plain text.").default(!1).hideHelp(!0);J.addOption(q);let G=new ZA("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1).hideHelp(!0);J.addOption(G);let z=new ZA("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);J.addOption(z),J.action(async(W,H)=>{let D=W,M=await yK(D);if(Object.keys(D).forEach((V)=>{let N=XF6.find((L)=>L.name===V);if(N&&YF6(N)&&!QY9(N))s2.write(J8.yellow(`Warning: '--${V}' flag is deprecated
|
5633
5633
|
`))}),H.args.length>0)XY9(M,H);await Qg1(M,D,H)});let U=new ng("doctor").summary("Generate support bundle").description("Generate a support bundle for troubleshooting issues. This collects logs, configuration, and system information into a file that can be shared with Amp support for debugging.").option("--output-dir <path>","Directory to save the support bundle",process.cwd()).option("--include-full-logs","Include full log history",!1).allowUnknownOption(!1).action(async(W)=>{await WY9(W.outputDir,W.includeFullLogs)});J.addCommand(U);let F=new ng("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--version <version>","Update to a specific version").allowUnknownOption(!1).action(async(W)=>{await FY9(W.version)});return J.addCommand(F),J}async function P51(J,Q){let{thread:Z,visibility:X}=Q,Y=Z?.id??aK(),K=T51(J);if(Z)await J.threadStorage.set(Y,Z);let q=await pJ.getOrCreateForThread(K,Y);if(X)await J.threadSyncService.updateThreadMeta(Y,E41(X));let G=J.threadService.observe(Y).subscribe(async(z)=>{if(q7(z,"assistant"))await Zg1(Y),G.unsubscribe()});return await q.resume(),q}async function Qg1(J,Q,Z){let X=process.stdin,Y=I41(Q);if(Y instanceof Error)UX(Y.message);let K,q=null;if(Q.streamJsonInput)K="";else if(typeof Q.execute==="string"){K=Q.execute;let R=(await cb1()).trimEnd();if(R)q=R}else K=(await cb1()).trimEnd();if(Q.remote&&!J.executeMode)throw new E2("The -r/--remote flag currently only works with --execute mode",1,'Use: amp --remote --execute "your message"');if(Q.streamJson&&!J.executeMode)throw new E2("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(Q.streamJsonInput&&!J.executeMode)throw new E2("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(Q.streamJsonInput&&!Q.streamJson)throw new E2("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(Q.stats&&!J.executeMode)throw new E2("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(Q.streamJsonInput&&typeof Q.execute==="string"&&Q.execute.trim()!=="")throw new E2("Do not provide a message argument when using --stream-json-input",1,`Supply messages via stdin JSONL instead: echo '{"type":"user","message":{"role":"user","content":[{"type":"text","text":"your message"}]}}' | amp --execute --stream-json --stream-json-input`);if(J.executeMode&&K===""&&!Q.streamJsonInput)throw new E2("User message must be provided through stdin or as argument when using execute mode",1,`Either pass a message as an argument: amp --execute "your message"
|
5634
5634
|
Or pipe via stdin: echo "your message" | amp --execute`);if(K!==""&&!J.executeMode&&!J.streamJsonMode&&typeof Q.execute!=="string")X=await MJ6();pA(Z,Q);let G=await dA(J,Q);GF6=G;let z=T51(G),U=async(R)=>{let I=await qF6(R,"utf-8"),w=JSON.parse(I);if(!iU(w.id))throw new E2(SK.invalidThreadId);return P51(G,{visibility:Y,thread:w})},F=async(R)=>{if(!iU(R))throw new E2(SK.invalidThreadId);let I=await G.threadService.get(R)??void 0;return P51(G,{visibility:Y,thread:I})},W=async()=>{try{if(Q.threadId)return F(Q.threadId);else return P51(G,{visibility:Y})}catch(R){if(R instanceof E2)throw R;throw await Z41(R,Q.threadId),Error("handleError should have called process.exit()")}},H=async()=>{return P51(G,{visibility:Y})};if(Q.format==="jsonl")s2.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
5635
|
-
`),await BA(),process.exit(1);if(J.executeMode&&Q.remote)await GJ6(K,q),await G.asyncDispose(),process.exit(0);let D=await W();if(J.executeMode)await B76(D,D.threadID,K,q,G,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await G.asyncDispose(),process.exit(0);let M=!1,V=!1,N=new dq1;if(Q.jetbrains||Q.ide){await N.cleanUpLockfiles();let R=await N.getConfigs();if(R.length===0){if(Q.jetbrains)V=!await G.configService.get("jetbrains.skipInstall")}else if(R.length===1){let I=R[0];if(I)N.selectConfig(I)}else M=!0}let L=hb1("0.0.
|
5636
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=!1,X=process.stdout.isTTY&&process.stderr.isTTY,Y=EU({...J,getHook:process.env.AMP_URL?(q,G)=>{if(q==="url")return Promise.resolve(process.env.AMP_URL);return G()}:void 0});if(await WJ6(Y),await HJ6(Y),J.mcpConfig){let q=await tX9(J.mcpConfig);Y=eX9(Y,q)}let K=await Y.get("url","global");if(!K)K=qZ;if(!iH(K))a.info("Targeting custom Amp server",{ampURL:K});return Y=cp1(Y),{executeMode:Q,streamJsonMode:Z,isTTY:X,ampURL:K,settings:Y,secrets:UJ6(await $b1(J,Y))}}function qY9(J){let Q={};for(let Z=0;Z<J.length;Z++){let X=J[Z];if(X?.startsWith("--")){let K=X.slice(2).replace(/-([a-z])/g,(G,z)=>z.toUpperCase()),q=J[Z+1];if(q&&!q.startsWith("--"))Q[K]=q,Z++}}return Q}async function GY9(){let J=qY9(process.argv);if(d46({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),aX9(a),a.info("Starting Amp CLI.",{version:"0.0.
|
5635
|
+
`),await BA(),process.exit(1);if(J.executeMode&&Q.remote)await GJ6(K,q),await G.asyncDispose(),process.exit(0);let D=await W();if(J.executeMode)await B76(D,D.threadID,K,q,G,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await G.asyncDispose(),process.exit(0);let M=!1,V=!1,N=new dq1;if(Q.jetbrains||Q.ide){await N.cleanUpLockfiles();let R=await N.getConfigs();if(R.length===0){if(Q.jetbrains)V=!await G.configService.get("jetbrains.skipInstall")}else if(R.length===1){let I=R[0];if(I)N.selectConfig(I)}else M=!0}let L=hb1("0.0.1759233723-gf92434",G.settingsStorage),O=K0.of([S0.file(process.cwd())]),A=zC(void 0,O);if(K)D.handle({type:"user:message",message:{content:[{type:"text",text:K}]}});let j=await A9();await QF6({stdin:X,stdout:process.stdout,history:new zb1,fuzzyServer:G.fuzzyServer,settingsStorage:G.settingsStorage,threadService:G.threadService,threadSyncService:G.threadSyncService,threadID:D.threadID,worker:D,workerDeps:z,configService:G.configService,internalAPIClient:VZ,ampURL:J.ampURL,useGpt5:j.settings.gpt5??!1,startNewThread:H,pickAndContinueThread:async()=>{a.info("Thread picker requested - not yet implemented in TUI")},switchToThread:F,ideClient:jQ,commandRegistry:A,showJetBrainsInstaller:V,showIdePicker:M,lockfileManager:N,startWithPicker:Q.startWithPicker,updateService:L}),await G.asyncDispose(),process.exit(0)}async function yK(J){if(J.interactive)s2.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
5636
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=!1,X=process.stdout.isTTY&&process.stderr.isTTY,Y=EU({...J,getHook:process.env.AMP_URL?(q,G)=>{if(q==="url")return Promise.resolve(process.env.AMP_URL);return G()}:void 0});if(await WJ6(Y),await HJ6(Y),J.mcpConfig){let q=await tX9(J.mcpConfig);Y=eX9(Y,q)}let K=await Y.get("url","global");if(!K)K=qZ;if(!iH(K))a.info("Targeting custom Amp server",{ampURL:K});return Y=cp1(Y),{executeMode:Q,streamJsonMode:Z,isTTY:X,ampURL:K,settings:Y,secrets:UJ6(await $b1(J,Y))}}function qY9(J){let Q={};for(let Z=0;Z<J.length;Z++){let X=J[Z];if(X?.startsWith("--")){let K=X.slice(2).replace(/-([a-z])/g,(G,z)=>z.toUpperCase()),q=J[Z+1];if(q&&!q.startsWith("--"))Q[K]=q,Z++}}return Q}async function GY9(){let J=qY9(process.argv);if(d46({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),aX9(a),a.info("Starting Amp CLI.",{version:"0.0.1759233723-gf92434",buildTimestamp:"2025-09-30T12:07:58.474Z",buildType:"'release'"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new E2(SK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await KY9().parseAsync(process.argv)}async function zY9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),m2.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
5637
5637
|
`);else if(!iH(J.ampURL))m2.write(`Logging in to ${new URL(J.ampURL).hostname}
|
5638
5638
|
`);let Z=process.env.AMP_API_KEY;if(Z)m2.write(`API key found in environment variable, storing...
|
5639
5639
|
`),await Q.set("apiKey",Z,J.ampURL),m2.write(`API key successfully stored.
|
@@ -5649,7 +5649,7 @@ Or pipe via stdin: echo "your message" | amp --execute`);if(K!==""&&!J.executeMo
|
|
5649
5649
|
`));try{let Q;if(J)Q=J,s2.write(J8.blue(`Updating to version ${J}...
|
5650
5650
|
`)),await jT(J),s2.write(J8.green(`✓ Successfully updated to version ${J}
|
5651
5651
|
`));else{s2.write(J8.blue(`Checking for updates...
|
5652
|
-
`));let{hasUpdate:X,latestVersion:Y}=await bR("0.0.
|
5652
|
+
`));let{hasUpdate:X,latestVersion:Y}=await bR("0.0.1759233723-gf92434");if(!X)s2.write(J8.green(`✓ Amp CLI is already up to date.
|
5653
5653
|
`)),process.exit(0);if(!Y)s2.write(J8.yellow("[WARN] could not find latest version")),process.exit(0);Q=Y,s2.write(J8.blue(`Updating to version ${Y}...
|
5654
5654
|
`)),await jT(Y),s2.write(J8.green(`✓ Successfully updated to version ${Y}
|
5655
5655
|
`))}let Z=await OA(Q);if(Z.warning)s2.write(`
|
package/package.json
CHANGED