@sourcegraph/amp 0.0.1761252490-gff453e → 0.0.1761278489-gf101e8

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.
Files changed (2) hide show
  1. package/dist/main.js +7 -7
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -6261,7 +6261,7 @@ See https://ampcode.com/manual#toolboxes`);return Q[0]||dw}function eZ6(J,Q){let
6261
6261
  `;async function XX6(J,Q,Z,X){let Y=performance.now(),K=[...NN1(M40(J)),{role:"user",parts:[{text:o59.replace("{USER_GOAL}",Q)}]}],q=await Qo(uW0,K,[],J,Z,X,{responseMimeType:"application/json",responseJsonSchema:R0.toJSONSchema(ZX6)}),G=ZX6.parse(JSON.parse(q.message.text??"")),z=performance.now()-Y;return l.debug("Thread handoff prepared",{threadId:J.id,goalLength:Q.length,instructionsLength:G.instructions.length,fileCount:G.relevantFiles.length,durationMs:Math.round(z)}),{instructions:G.instructions,relevantFiles:G.relevantFiles}}WL();D8();k6();function YX6(J){let Q=J.trim();if(Q==="quit"||Q==="exit")return"/quit";return J}function KX6(J,Q,Z){if(J.agentMode)return J.agentMode;if(Q?.agentMode){let X=Q.agentMode;if(X==="free"){if(Z?.canUseAmpFree??!1)return"free";return"smart"}return X}return"smart"}z0();nB();import t59 from"node:fs";import qX6 from"node:path";function GX6(J){let Q=J.trim().replace(/^["']|["']$/g,"");if(Q=Q.replace(/\\(.)/g,"$1"),!/\.(png|jpe?g|gif|webp)$/i.test(Q))return null;if(!qX6.isAbsolute(Q))return null;return l.debug("Extracted image path",{original:J,extracted:Q}),Q}function zX6(J){try{let Q=qX6.extname(J).toLowerCase(),Z=ge1(Q);if(!Z)return l.warn("Unsupported image file extension",{ext:Q}),null;try{let X=t59.readFileSync(J);return e59(X,Z)}catch(X){l.error(`Failed to read image file ${J}:`,X)}}catch(Q){l.error("Error handling image file path",{imagePath:J,error:Q})}return null}function e59(J,Q){if(J.length>jF)return l.warn(`Image file too large: ${J.length} bytes (max: ${jF})`),null;return{type:"image",source:{type:"base64",data:J.toString("base64"),mediaType:Q}}}import{execSync as _K6}from"node:child_process";import{rmdir as nY9}from"node:fs/promises";import{tmpdir as aY9}from"node:os";import xK6 from"node:path";sO();z0();import{spawn as JJ9}from"node:child_process";import{promises as QJ9}from"node:fs";function UX6(J){return J.kind==="executable"}function FX6(J){return J.kind==="markdown"}var cH=50000,WX6=300000;async function xy1(J,Q,Z,X={}){let{timeoutMs:Y=WX6,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(l.debug("Executing command",{commandName:J,filePath:q.filePath,args:Q}),FX6(q))return await ZJ9(q,Q);else if(UX6(q))return await XJ9(q,Q,Y,K);else return{success:!1,output:"",error:"Unsupported command type"}}catch(q){return l.error("Failed to execute command",{commandName:J,error:q}),{success:!1,output:"",error:q instanceof Error?q.message:"Unknown error occurred"}}}async function ZJ9(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await QJ9.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>cH?Z.slice(0,cH)+`
6262
6262
  ... (output truncated at ${cH} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function XJ9(J,Q,Z=WX6,X){return new Promise((Y)=>{let[K,q]=YJ9(J,Q);l.debug("Spawning command",{spawnCommand:K,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Z});let G=be1(X),z=!1,U=setTimeout(()=>{z=!0,G.abort(),l.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),F=JJ9(K,q,{stdio:["pipe","pipe","pipe"],signal:G.signal,detached:!0}),W=[],H=[],B=0;F.stdout?.on("data",(M)=>{let V=M.toString();if(B+=V.length,B<=cH)W.push(V);else{let N=cH-(B-V.length);if(N>0)W.push(V.slice(0,N))}}),F.stderr?.on("data",(M)=>{let V=M.toString();if(B+=V.length,B<=cH)H.push(V);else{let N=cH-(B-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(""),A=N;if(!V&&!N.trim()&&L.trim())A=L;else if(L.trim())A+=N?`
6263
6263
  ${L}`:L;if(B>cH)A+=`
6264
- ... (output truncated at ${cH} characters)`;Y({success:V,output:A.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 YJ9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return qJ9(Z,X?[...X]:null,Y,Q);else return KJ9(Z,X?[...X]:null,Y,Q)}function KJ9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function qJ9(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]}}z0();Sj();W2();TB();kY();fF();k6();I0();import{mkdtemp as rY9,readFile as sY9,unlink as oY9,writeFile as _w2}from"fs/promises";var w51={};R6(w51,{scrollUp:()=>IJ9,scrollDown:()=>PJ9,link:()=>_J9,image:()=>xJ9,iTerm:()=>bJ9,exitAlternativeScreen:()=>vJ9,eraseUp:()=>EJ9,eraseStartLine:()=>jJ9,eraseScreen:()=>by1,eraseLines:()=>wJ9,eraseLine:()=>MX6,eraseEndLine:()=>OJ9,eraseDown:()=>$J9,enterAlternativeScreen:()=>SJ9,cursorUp:()=>BX6,cursorTo:()=>UJ9,cursorShow:()=>RJ9,cursorSavePosition:()=>DJ9,cursorRestorePosition:()=>MJ9,cursorPrevLine:()=>LJ9,cursorNextLine:()=>NJ9,cursorMove:()=>FJ9,cursorLeft:()=>DX6,cursorHide:()=>AJ9,cursorGetPosition:()=>VJ9,cursorForward:()=>HJ9,cursorDown:()=>WJ9,cursorBackward:()=>BJ9,clearTerminal:()=>CJ9,clearScreen:()=>TJ9,beep:()=>kJ9});import yy1 from"node:process";var R51=globalThis.window?.document!==void 0,_A2=globalThis.process?.versions?.node!==void 0,xA2=globalThis.process?.versions?.bun!==void 0,bA2=globalThis.Deno?.version?.deno!==void 0,yA2=globalThis.process?.versions?.electron!==void 0,fA2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,hA2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,gA2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,mA2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,uA2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,mu=globalThis.navigator?.userAgentData?.platform,pA2=mu==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",dA2=mu==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",cA2=mu==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",lA2=mu==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),iA2=mu==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var A2="\x1B[",pu="\x1B]",BC="\x07",uu=";",HX6=!R51&&yy1.env.TERM_PROGRAM==="Apple_Terminal",GJ9=!R51&&yy1.platform==="win32",zJ9=R51?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:yy1.cwd,UJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return A2+(J+1)+"G";return A2+(Q+1)+uu+(J+1)+"H"},FJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=A2+-J+"D";else if(J>0)Z+=A2+J+"C";if(Q<0)Z+=A2+-Q+"A";else if(Q>0)Z+=A2+Q+"B";return Z},BX6=(J=1)=>A2+J+"A",WJ9=(J=1)=>A2+J+"B",HJ9=(J=1)=>A2+J+"C",BJ9=(J=1)=>A2+J+"D",DX6=A2+"G",DJ9=HX6?"\x1B7":A2+"s",MJ9=HX6?"\x1B8":A2+"u",VJ9=A2+"6n",NJ9=A2+"E",LJ9=A2+"F",AJ9=A2+"?25l",RJ9=A2+"?25h",wJ9=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=MX6+(Z<J-1?BX6():"");if(J)Q+=DX6;return Q},OJ9=A2+"K",jJ9=A2+"1K",MX6=A2+"2K",$J9=A2+"J",EJ9=A2+"1J",by1=A2+"2J",IJ9=A2+"S",PJ9=A2+"T",TJ9="\x1Bc",CJ9=GJ9?`${by1}${A2}0f`:`${by1}${A2}3J${A2}H`,SJ9=A2+"?1049h",vJ9=A2+"?1049l",kJ9=BC,_J9=(J,Q)=>[pu,"8",uu,uu,Q,BC,J,pu,"8",uu,uu,BC].join(""),xJ9=(J,Q={})=>{let Z=`${pu}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")+BC},bJ9={setCwd:(J=zJ9())=>`${pu}50;CurrentDir=${J}${BC}`,annotation(J,Q={}){let Z=`${pu}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+BC}};var O51=x6(OX6(),1);function aV(J,Q,{target:Z="stdout",...X}={}){if(!O51.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (​${Q}​)`}return w51.link(J,Q)}aV.isSupported=O51.default.stdout;aV.stderr=(J,Q,Z={})=>aV(J,Q,{target:"stderr",...Z});aV.stderr.isSupported=O51.default.stderr;z0();kY();class uy1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;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.1761252490-gff453e"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Ya(Q,this.configService)}catch(Q){l.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}}import{execFile as $51}from"node:child_process";import{platform as py1}from"node:os";import{promisify as gJ9}from"node:util";var j51=gJ9($51),mJ9=(J)=>`\x1B]52;c;${J}\x1B\\`,uJ9="\x1B]52;c;?\x1B\\",pJ9="\x1B]52;p;?\x1B\\";class jX6{capabilities=null;pendingReadPromise=null;readResolve=null;readTimeout=null;setCapabilities(J){this.capabilities=J}isOsc52Supported(){return this.capabilities?.osc52??!1}async commandExists(J){try{return await j51("which",[J]),!0}catch{return!1}}async writeToPbcopy(J){try{let Q=$51("pbcopy");return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`pbcopy exited with code ${Y}`))})}),!0}catch{return!1}}async writeToWlCopy(J){try{let Q=$51("wl-copy");return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`wl-copy exited with code ${Y}`))})}),!0}catch{return!1}}async writeToXclip(J){try{let Q=$51("xclip",["-selection","clipboard"]);return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`xclip exited with code ${Y}`))})}),!0}catch{return!1}}async readFromOSC52WithQuery(J){if(!this.isOsc52Supported())return null;if(this.pendingReadPromise)return this.pendingReadPromise;this.pendingReadPromise=new Promise((Z)=>{this.readResolve=Z,this.readTimeout=setTimeout(()=>{this.readResolve=null,this.pendingReadPromise=null,Z(null)},2000),process.stdout.write(J)});let Q=await this.pendingReadPromise;return this.pendingReadPromise=null,Q}async readFromOSC52(){return this.readFromOSC52WithQuery(uJ9)}handleOSC52Response(J){if(this.readResolve&&this.readTimeout){clearTimeout(this.readTimeout),this.readTimeout=null;try{let Q=Buffer.from(J,"base64").toString("utf8");this.readResolve(Q)}catch{this.readResolve(null)}this.readResolve=null,this.pendingReadPromise=null}}async readFromPbpaste(){try{let{stdout:J}=await j51("pbpaste");return J}catch{return null}}async readFromWlPaste(J){try{let Q=["--no-newline"];if(J==="primary")Q.push("--primary");let{stdout:Z}=await j51("wl-paste",Q);return Z}catch{return null}}async readFromXclip(J){try{let{stdout:Q}=await j51("xclip",["-selection",J,"-o"]);return Q}catch{return null}}async readFromOSC52Primary(){return this.readFromOSC52WithQuery(pJ9)}async readText(){if(this.isOsc52Supported()){let Q=await this.readFromOSC52();if(Q!==null)return Q}if(py1()==="darwin"){let Q=await this.readFromPbpaste();if(Q!==null)return Q}else{if(await this.commandExists("wl-paste")){let Q=await this.readFromWlPaste("clipboard");if(Q!==null)return Q}if(await this.commandExists("xclip")){let Q=await this.readFromXclip("clipboard");if(Q!==null)return Q}}return null}async readPrimarySelection(){if(py1()==="darwin")return this.readText();if(this.isOsc52Supported()){let Q=await this.readFromOSC52Primary();if(Q!==null)return Q}if(await this.commandExists("wl-paste")){let Q=await this.readFromWlPaste("primary");if(Q!==null)return Q}if(await this.commandExists("xclip")){let Q=await this.readFromXclip("primary");if(Q!==null)return Q}return null}async writeText(J){if(this.isOsc52Supported()){let Z=Buffer.from(J).toString("base64"),X=mJ9(Z);process.stdout.write(X);return}if(py1()==="darwin"){if(await this.writeToPbcopy(J))return}else{if(await this.commandExists("wl-copy")&&await this.writeToWlCopy(J))return;if(await this.commandExists("xclip")&&await this.writeToXclip(J))return}}}var HY=new jX6;z0();class l7{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function $X6(J){if(J instanceof l7)return{title:"Info",description:J.message,type:"info"};return l.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 QN=null,tY9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(QN)return Error("Already connected. Use /disconnect first to reconnect.");let{connectedClientsService:Z}=J;await Z.start({clientId:J.clientId,currentThreadID:J.worker.thread.id});let Y=Z.getCurrentStatus().clientID||"unknown",{connectBackground:K}=await Promise.resolve().then(() => (sb1(),iJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{QN=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});QN=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{QN=null,Z.sendStatus({connected:!1,errorMessage:M.message})});let z=(await J.configService.getLatest()).settings.url,U=J.worker.thread.id,F=new URL(`/threads/${U}`,z).toString(),W=new URL("/clients",z).toString(),H="";try{H=await(await Promise.resolve().then(() => x6(yf1(),1))).toString(F,{type:"utf8",margin:2,color:{dark:"#000000",light:"#FFFFFF"}})}catch(M){l.error("Failed to generate QR code:",M)}if((process.stdout.rows||24)>=30&&H&&J.onShowQRCodeOverlay)J.onShowQRCodeOverlay({url:W,qrCode:H});else return new l7(`Continue at ${W}`)}catch(Z){return J.connectedClientsService.sendStatus({connected:!1,errorMessage:Z.message}),Error(`Failed to start connection: ${Z.message}`)}}},disconnect:{name:"disconnect",description:"Disconnect from web interface",execute:async(J,Q)=>{if(!QN)return new l7("Not connected to Amp web interface");try{QN.disconnect();let Z=QN.clientID;return QN=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new l7(`Disconnected from Amp web interface
6264
+ ... (output truncated at ${cH} characters)`;Y({success:V,output:A.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 YJ9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return qJ9(Z,X?[...X]:null,Y,Q);else return KJ9(Z,X?[...X]:null,Y,Q)}function KJ9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function qJ9(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]}}z0();Sj();W2();TB();kY();fF();k6();I0();import{mkdtemp as rY9,readFile as sY9,unlink as oY9,writeFile as _w2}from"fs/promises";var w51={};R6(w51,{scrollUp:()=>IJ9,scrollDown:()=>PJ9,link:()=>_J9,image:()=>xJ9,iTerm:()=>bJ9,exitAlternativeScreen:()=>vJ9,eraseUp:()=>EJ9,eraseStartLine:()=>jJ9,eraseScreen:()=>by1,eraseLines:()=>wJ9,eraseLine:()=>MX6,eraseEndLine:()=>OJ9,eraseDown:()=>$J9,enterAlternativeScreen:()=>SJ9,cursorUp:()=>BX6,cursorTo:()=>UJ9,cursorShow:()=>RJ9,cursorSavePosition:()=>DJ9,cursorRestorePosition:()=>MJ9,cursorPrevLine:()=>LJ9,cursorNextLine:()=>NJ9,cursorMove:()=>FJ9,cursorLeft:()=>DX6,cursorHide:()=>AJ9,cursorGetPosition:()=>VJ9,cursorForward:()=>HJ9,cursorDown:()=>WJ9,cursorBackward:()=>BJ9,clearTerminal:()=>CJ9,clearScreen:()=>TJ9,beep:()=>kJ9});import yy1 from"node:process";var R51=globalThis.window?.document!==void 0,_A2=globalThis.process?.versions?.node!==void 0,xA2=globalThis.process?.versions?.bun!==void 0,bA2=globalThis.Deno?.version?.deno!==void 0,yA2=globalThis.process?.versions?.electron!==void 0,fA2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,hA2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,gA2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,mA2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,uA2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,mu=globalThis.navigator?.userAgentData?.platform,pA2=mu==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",dA2=mu==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",cA2=mu==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",lA2=mu==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),iA2=mu==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var A2="\x1B[",pu="\x1B]",BC="\x07",uu=";",HX6=!R51&&yy1.env.TERM_PROGRAM==="Apple_Terminal",GJ9=!R51&&yy1.platform==="win32",zJ9=R51?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:yy1.cwd,UJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return A2+(J+1)+"G";return A2+(Q+1)+uu+(J+1)+"H"},FJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=A2+-J+"D";else if(J>0)Z+=A2+J+"C";if(Q<0)Z+=A2+-Q+"A";else if(Q>0)Z+=A2+Q+"B";return Z},BX6=(J=1)=>A2+J+"A",WJ9=(J=1)=>A2+J+"B",HJ9=(J=1)=>A2+J+"C",BJ9=(J=1)=>A2+J+"D",DX6=A2+"G",DJ9=HX6?"\x1B7":A2+"s",MJ9=HX6?"\x1B8":A2+"u",VJ9=A2+"6n",NJ9=A2+"E",LJ9=A2+"F",AJ9=A2+"?25l",RJ9=A2+"?25h",wJ9=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=MX6+(Z<J-1?BX6():"");if(J)Q+=DX6;return Q},OJ9=A2+"K",jJ9=A2+"1K",MX6=A2+"2K",$J9=A2+"J",EJ9=A2+"1J",by1=A2+"2J",IJ9=A2+"S",PJ9=A2+"T",TJ9="\x1Bc",CJ9=GJ9?`${by1}${A2}0f`:`${by1}${A2}3J${A2}H`,SJ9=A2+"?1049h",vJ9=A2+"?1049l",kJ9=BC,_J9=(J,Q)=>[pu,"8",uu,uu,Q,BC,J,pu,"8",uu,uu,BC].join(""),xJ9=(J,Q={})=>{let Z=`${pu}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")+BC},bJ9={setCwd:(J=zJ9())=>`${pu}50;CurrentDir=${J}${BC}`,annotation(J,Q={}){let Z=`${pu}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+BC}};var O51=x6(OX6(),1);function aV(J,Q,{target:Z="stdout",...X}={}){if(!O51.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (​${Q}​)`}return w51.link(J,Q)}aV.isSupported=O51.default.stdout;aV.stderr=(J,Q,Z={})=>aV(J,Q,{target:"stderr",...Z});aV.stderr.isSupported=O51.default.stderr;z0();kY();class uy1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;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.1761278489-gf101e8"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Ya(Q,this.configService)}catch(Q){l.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}}import{execFile as $51}from"node:child_process";import{platform as py1}from"node:os";import{promisify as gJ9}from"node:util";var j51=gJ9($51),mJ9=(J)=>`\x1B]52;c;${J}\x1B\\`,uJ9="\x1B]52;c;?\x1B\\",pJ9="\x1B]52;p;?\x1B\\";class jX6{capabilities=null;pendingReadPromise=null;readResolve=null;readTimeout=null;setCapabilities(J){this.capabilities=J}isOsc52Supported(){return this.capabilities?.osc52??!1}async commandExists(J){try{return await j51("which",[J]),!0}catch{return!1}}async writeToPbcopy(J){try{let Q=$51("pbcopy");return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`pbcopy exited with code ${Y}`))})}),!0}catch{return!1}}async writeToWlCopy(J){try{let Q=$51("wl-copy");return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`wl-copy exited with code ${Y}`))})}),!0}catch{return!1}}async writeToXclip(J){try{let Q=$51("xclip",["-selection","clipboard"]);return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`xclip exited with code ${Y}`))})}),!0}catch{return!1}}async readFromOSC52WithQuery(J){if(!this.isOsc52Supported())return null;if(this.pendingReadPromise)return this.pendingReadPromise;this.pendingReadPromise=new Promise((Z)=>{this.readResolve=Z,this.readTimeout=setTimeout(()=>{this.readResolve=null,this.pendingReadPromise=null,Z(null)},2000),process.stdout.write(J)});let Q=await this.pendingReadPromise;return this.pendingReadPromise=null,Q}async readFromOSC52(){return this.readFromOSC52WithQuery(uJ9)}handleOSC52Response(J){if(this.readResolve&&this.readTimeout){clearTimeout(this.readTimeout),this.readTimeout=null;try{let Q=Buffer.from(J,"base64").toString("utf8");this.readResolve(Q)}catch{this.readResolve(null)}this.readResolve=null,this.pendingReadPromise=null}}async readFromPbpaste(){try{let{stdout:J}=await j51("pbpaste");return J}catch{return null}}async readFromWlPaste(J){try{let Q=["--no-newline"];if(J==="primary")Q.push("--primary");let{stdout:Z}=await j51("wl-paste",Q);return Z}catch{return null}}async readFromXclip(J){try{let{stdout:Q}=await j51("xclip",["-selection",J,"-o"]);return Q}catch{return null}}async readFromOSC52Primary(){return this.readFromOSC52WithQuery(pJ9)}async readText(){if(this.isOsc52Supported()){let Q=await this.readFromOSC52();if(Q!==null)return Q}if(py1()==="darwin"){let Q=await this.readFromPbpaste();if(Q!==null)return Q}else{if(await this.commandExists("wl-paste")){let Q=await this.readFromWlPaste("clipboard");if(Q!==null)return Q}if(await this.commandExists("xclip")){let Q=await this.readFromXclip("clipboard");if(Q!==null)return Q}}return null}async readPrimarySelection(){if(py1()==="darwin")return this.readText();if(this.isOsc52Supported()){let Q=await this.readFromOSC52Primary();if(Q!==null)return Q}if(await this.commandExists("wl-paste")){let Q=await this.readFromWlPaste("primary");if(Q!==null)return Q}if(await this.commandExists("xclip")){let Q=await this.readFromXclip("primary");if(Q!==null)return Q}return null}async writeText(J){if(this.isOsc52Supported()){let Z=Buffer.from(J).toString("base64"),X=mJ9(Z);process.stdout.write(X);return}if(py1()==="darwin"){if(await this.writeToPbcopy(J))return}else{if(await this.commandExists("wl-copy")&&await this.writeToWlCopy(J))return;if(await this.commandExists("xclip")&&await this.writeToXclip(J))return}}}var HY=new jX6;z0();class l7{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function $X6(J){if(J instanceof l7)return{title:"Info",description:J.message,type:"info"};return l.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 QN=null,tY9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(QN)return Error("Already connected. Use /disconnect first to reconnect.");let{connectedClientsService:Z}=J;await Z.start({clientId:J.clientId,currentThreadID:J.worker.thread.id});let Y=Z.getCurrentStatus().clientID||"unknown",{connectBackground:K}=await Promise.resolve().then(() => (sb1(),iJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{QN=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});QN=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{QN=null,Z.sendStatus({connected:!1,errorMessage:M.message})});let z=(await J.configService.getLatest()).settings.url,U=J.worker.thread.id,F=new URL(`/threads/${U}`,z).toString(),W=new URL("/clients",z).toString(),H="";try{H=await(await Promise.resolve().then(() => x6(yf1(),1))).toString(F,{type:"utf8",margin:2,color:{dark:"#000000",light:"#FFFFFF"}})}catch(M){l.error("Failed to generate QR code:",M)}if((process.stdout.rows||24)>=30&&H&&J.onShowQRCodeOverlay)J.onShowQRCodeOverlay({url:W,qrCode:H});else return new l7(`Continue at ${W}`)}catch(Z){return J.connectedClientsService.sendStatus({connected:!1,errorMessage:Z.message}),Error(`Failed to start connection: ${Z.message}`)}}},disconnect:{name:"disconnect",description:"Disconnect from web interface",execute:async(J,Q)=>{if(!QN)return new l7("Not connected to Amp web interface");try{QN.disconnect();let Z=QN.clientID;return QN=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new l7(`Disconnected from Amp web interface
6265
6265
  Client ID: ${Z}
6266
6266
  Server will clean up automatically within 60 seconds`)}catch(Z){return Error(`Failed to disconnect: ${Z.message}`)}}}};class ff1{configService;commands;customRegistry;latestCustom=[];telemetrySubmitter;constructor(J=YS(),Q){this.configService=Q;this.customRegistry=J,this._initBaseCommands(!1),this.customRegistry.commands.subscribe((Z)=>this.latestCustom=Z),this.telemetrySubmitter=new uy1(async()=>{try{return(await this.configService.getLatest()).settings["experimental.cli.commandTelemetry.enabled"]===!0}catch{return!1}},this.configService),this.configService.config.pipe(v0((Z)=>AB(Z.settings)),e6()).subscribe((Z)=>{this._initBaseCommands(Z.length>1)})}_initBaseCommands(J){if(this.commands={...eY9},process.env.AMP_CONNECT==="1")Object.assign(this.commands,tY9);if(J)Object.assign(this.commands,JK9)}async execute(J,Q,Z=[],X){this.telemetrySubmitter.submit(J).catch((G)=>{l.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 xy1(J,Z,this.customRegistry,{signal:X});if(q.success)if(K?.kind==="markdown"){Q.editorDispatch({type:"set-input",input:q.output});return}else{Q.submitMessage(q.output);return}return Error(q.error??`Command '${J}' failed`)}query(J,Q,Z){let X=Object.values(this.commands).filter((K)=>{if(!Q||!K.isVisible)return!0;return K.isVisible(Q,Z)}),Y=this.latestCustom.filter((K)=>K.available).map((K)=>({name:K.name,description:"Custom command",requiresArgs:K.kind==="executable",execute:(q,G)=>this.execute(K.name,q,G??[])}));return[...X,...Y]}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 eY9={"generate-agent-file":{name:"generate-agent-file",description:`Generate an ${x5} file in the current workspace`,execute:async(J,Q)=>{let Z=await J.configService.getLatest(),X=bq(Z.settings),K=J.getInMemoryAgentModeOverride()??X;J.worker.handle({type:"user:message",message:{content:[{type:"text",text:M90}],agentMode:K}});return}},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 rY9(xK6.join(aY9(),"amp-edit-")),Y=xK6.join(X,"message.amp.md");_K6(`${Z} "${Y}"`,{stdio:"inherit"}),process.stdout.write("\x1B[?25l");try{let q=(await sY9(Y,"utf-8")).trim();if(q)J.editorDispatch({type:"set-input",input:q})}catch(K){if(K?.code==="ENOENT")return;return l.error("Failed to read temporary file",K),Error("Failed to read editor content")}try{await oY9(Y),await nY9(X)}catch(K){l.warn("Failed to clean up temporary file",K)}return}catch(Z){return l.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 sG("dangerouslyAllowAll",!1),new l7("Amp is now following permissions rules for this session")}catch(K){return l.error("Failed to set dangerously allow all setting",K),Error("Failed to enable permissions for this session")}case"off":try{return sG("dangerouslyAllowAll",!0),new l7("Permissions disabled for this session - you will NOT be asked for confirmation before Amp runs a command.")}catch(K){return l.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 WC();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 l.error("editPermissions exited with status",K),Error(X)},settingsFile:J.settingsFilePath,resolveEditor:WC};await N51(Y);return}catch(Y){l.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 l.error("Failed to start new thread",Z),Error("Failed to start new thread")}},isVisible:(J)=>J.messages.length!==0},handoff:{name:"handoff",description:"Start new focused thread with relevant files and prompt: /handoff <your goal>",statusMessage:"Handing off...",requiresArgs:!0,execute:async()=>{return},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 l7(`Switched to existing thread: ${Z}`)}await J.pickAndContinueThread();return}catch(Z){return l.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(`
6267
6267
  `).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=vj(new URL(Y),Z.id).toString(),G=`Thread URL: ${aV(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 l7(`${G}
@@ -6460,7 +6460,7 @@ ${K}
6460
6460
  `),J.stdout.write(`Thread: ${H}
6461
6461
  `),J.stdout.write(`Continue this thread with: amp threads continue ${F}
6462
6462
  `)}}function Eu1(J){return J==="smart"?k1.rgb(3,197,97):J==="free"?k1.rgb(0,184,255):uW9(J)}function uW9(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 k1.index(Z[X])}Xh1();if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){a7.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
6463
- `)}var Pu1=Iu1.join(ec1||Iu1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function iW9(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 hG(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")sG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new m9("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${V8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")sG("experimental.agentMode",Q.agentMode)}async function Cu1(J){try{await dW9(Iu1.dirname(Pu1),{recursive:!0}),await cW9(Pu1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function nW9(){try{return(await dF6(Pu1,"utf-8")).trim()}catch(J){return null}}function aW9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z);return HS("mcpServers",{global:X,workspace:Q})}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]()}}}var mF6=[{name:"notifications",long:"notifications",type:"flag",description:(J)=>`${J?"Enable":"Disable"} sound notifications (enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(J)=>`${J?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`,deprecated:!0},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??UX,description:`Custom settings file path (overrides the default location ${UX})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(l).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${gb1})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","jsonl","new-ui"],hidden:!0,deprecated:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:pK(),description:(J)=>J?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration."},{name:"ide",long:"ide",type:"flag",default:!0,description:(J)=>J?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection."},{name:"interactive",long:"interactive",type:"flag",description:(J)=>J?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"tryGpt5",long:"try-gpt5",type:"switch",default:!1,description:"[DEPRECATED] Try GPT-5 as the primary agent model (see https://ampcode.com/news/gpt-5-oracle)",deprecated:!0},{name:"agentMode",long:"agent-mode",type:"option",description:"Set the experimental agent mode configuration",hidden:!0,choices:fd}],uF6=(J)=>("deprecated"in J)&&J.deprecated===!0,rW9=(J)=>("hidden"in J)&&J.hidden===!0,sW9=(J)=>("default"in J),oW9=(J)=>("default"in J)?J.default:void 0;function tW9(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 m9(uK.unknownCommand(Z),1,q)}}var cF6=null;function it2(){return cF6}function zQ1(J){return{...J,getThreadEnvironment:d71,vfs:X40({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new w_(J.fileSystem),generateThreadTitle:N40,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var Su1=N0.file(lW9.homedir()),lF6=process.env.XDG_CONFIG_HOME?N0.file(process.env.XDG_CONFIG_HOME):_0.joinPath(Su1,".config");async function gG(J,Q){Xn1("0.0.1761252490-gff453e");let Z=HX1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:e1.of([N0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Su1,userConfigDir:lF6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (qQ1(),KQ1));X(Z);let Y=await Z.getLatest();l.debug("Global configuration initialized",{settingsKeys:Object.keys(Y.settings)});let K=wa(WO({configService:Z})),q=_20({configService:Z,toolService:K}),G=hw0(K,C9,oe).catch((O)=>{l.warn("Toolbox registration failed, continuing anyway:",O)}),z=q.initialized.catch((O)=>{l.warn("MCP service initialization failed, continuing anyway:",O)});if(J.executeMode)await Promise.all([z,G]);if(Q.jetbrains)DO("JetBrains");else if(Q.ide&&eQ6())DO("VS Code");else if(Q.ide&&JZ6())DO("Neovim");if(J.executeMode)Yn1(!0);c96(K,{configService:Z});let U,F=U7.status.pipe(v0((O)=>Boolean(O.connected&&O.authenticated)),e6()).subscribe((O)=>{if(O){if(!U)U=K.registerTool(Yr)}else U?.dispose(),U=void 0}),W;if(!J.executeMode)W=new X51(process.cwd(),{},!0);else W=new class extends X51{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(s2.write(`No API key found. Starting login flow...
6463
+ `)}var Pu1=Iu1.join(ec1||Iu1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function iW9(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 hG(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")sG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new m9("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${V8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")sG("experimental.agentMode",Q.agentMode)}async function Cu1(J){try{await dW9(Iu1.dirname(Pu1),{recursive:!0}),await cW9(Pu1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function nW9(){try{return(await dF6(Pu1,"utf-8")).trim()}catch(J){return null}}function aW9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z);return HS("mcpServers",{global:X,workspace:Q})}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]()}}}var mF6=[{name:"notifications",long:"notifications",type:"flag",description:(J)=>`${J?"Enable":"Disable"} sound notifications (enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(J)=>`${J?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`,deprecated:!0},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??UX,description:`Custom settings file path (overrides the default location ${UX})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(l).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${gb1})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","jsonl","new-ui"],hidden:!0,deprecated:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:pK(),description:(J)=>J?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration."},{name:"ide",long:"ide",type:"flag",default:!0,description:(J)=>J?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection."},{name:"interactive",long:"interactive",type:"flag",description:(J)=>J?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"tryGpt5",long:"try-gpt5",type:"switch",default:!1,description:"[DEPRECATED] Try GPT-5 as the primary agent model (see https://ampcode.com/news/gpt-5-oracle)",deprecated:!0},{name:"agentMode",long:"agent-mode",type:"option",description:"Set the experimental agent mode configuration",hidden:!0,choices:fd}],uF6=(J)=>("deprecated"in J)&&J.deprecated===!0,rW9=(J)=>("hidden"in J)&&J.hidden===!0,sW9=(J)=>("default"in J),oW9=(J)=>("default"in J)?J.default:void 0;function tW9(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 m9(uK.unknownCommand(Z),1,q)}}var cF6=null;function it2(){return cF6}function zQ1(J){return{...J,getThreadEnvironment:d71,vfs:X40({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new w_(J.fileSystem),generateThreadTitle:N40,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var Su1=N0.file(lW9.homedir()),lF6=process.env.XDG_CONFIG_HOME?N0.file(process.env.XDG_CONFIG_HOME):_0.joinPath(Su1,".config");async function gG(J,Q){Xn1("0.0.1761278489-gf101e8");let Z=HX1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:e1.of([N0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Su1,userConfigDir:lF6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (qQ1(),KQ1));X(Z);let Y=await Z.getLatest();l.debug("Global configuration initialized",{settingsKeys:Object.keys(Y.settings)});let K=wa(WO({configService:Z})),q=_20({configService:Z,toolService:K}),G=hw0(K,C9,oe).catch((O)=>{l.warn("Toolbox registration failed, continuing anyway:",O)}),z=q.initialized.catch((O)=>{l.warn("MCP service initialization failed, continuing anyway:",O)});if(J.executeMode)await Promise.all([z,G]);if(Q.jetbrains)DO("JetBrains");else if(Q.ide&&eQ6())DO("VS Code");else if(Q.ide&&JZ6())DO("Neovim");if(J.executeMode)Yn1(!0);c96(K,{configService:Z});let U,F=U7.status.pipe(v0((O)=>Boolean(O.connected&&O.authenticated)),e6()).subscribe((O)=>{if(O){if(!U)U=K.registerTool(Yr)}else U?.dispose(),U=void 0}),W;if(!J.executeMode)W=new X51(process.cwd(),{},!0);else W=new class extends X51{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(s2.write(`No API key found. Starting login flow...
6464
6464
  `),!await eW9(J))await Jw(),process.exit(1)}let H=await z40({isDevelopment:!1}),B=new uH1(H),M=new gH1(H,Z,{lazy:!0}),V=Q.notifications!==void 0?Q.notifications:!J.executeMode,N=i96({playNotificationSound:async(O)=>{if(V){l96(O);let j=Qh1(),$=Zh1();if((!j||$)&&Y.settings["notifications.system.enabled"]!==!1){if(O==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(O==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:B,configService:Z});l.info("Starting Amp background services");let L=H40({threadService:B,threadHistoryService:M,configService:Z,isExtensionDevelopment:!1}),A;U7.status.subscribe((O)=>{A=O});let w={codebaseContextService:new UZ1({workspaceRoots:[N0.file(process.cwd())],getCurrentFile:()=>{if(!A?.openFile)return;try{return N0.parse(A.openFile)}catch(O){l.warn("Failed to parse current file URI",{uri:A.openFile,error:O});return}},getOpenFiles:()=>{if(!A?.visibleFiles?.length)return[];let O=A.openFile;return A.visibleFiles.filter((j)=>j!==O).map((j)=>{try{return N0.parse(j)}catch($){return l.warn("Failed to parse visible file URI",{uri:j,error:$}),null}}).filter((j)=>j!==null)}}),configService:Z,toolService:K,mcpService:q,threadService:B,threadHistoryService:M,threadSyncService:L,threadStorage:H,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:W,notificationService:N,fileSystem:Q.jetbrains||Q.ide?J40:C9};return{...w,async asyncDispose(){await w.mcpService.dispose(),await w.threadService.asyncDispose(),w.configService.unsubscribe(),w.toolService.dispose(),w.fuzzyServer.dispose(),w.threadSyncService.dispose(),w.settingsStorage[Symbol.dispose](),F.unsubscribe(),U?.dispose()}}}async function eW9(J){if(!J.executeMode){if(!await Py1("Would you like to log in to Amp? [(y)es, (n)o]: "))return s2.write(`Login cancelled. Run the command again to retry.
6465
6465
  `),!1}return await iF6(J)}async function iF6(J){let Q=pW9(32).toString("hex"),Z=await Iy1(J.ampURL,Q);try{await SG(Z)}catch(Y){l.error("Failed to open browser",{error:Y})}let X=await Iy1(J.ampURL,Q,!1);s2.write(`If your browser did not open automatically, visit:
6466
6466
 
@@ -6470,12 +6470,12 @@ ${V8.blue.bold(X)}
6470
6470
  Login successful! You can now use the Amp CLI.
6471
6471
  `),!0}catch(Y){return l.error("Login failed",{error:Y}),a7.write(`
6472
6472
  Login failed: ${Y instanceof Error?Y.message:String(Y)}
6473
- `),!1}}function JH9(){let J=new D71().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)Xw(),process.exit(0);let H=W.originalError??W;rJ6(H)}),J.option("-V, --version","output the version number",()=>{s2.write(`0.0.1761252490-gff453e (released 2025-10-23T20:53:28.555Z)
6474
- `),process.exit(0)}),J.addHelpText("after",sQ6()),J.configureHelp({formatHelp:oQ6}),J.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await BX(B);await YH9(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 B=H.optsWithGlobals(),M=await BX(B);await XH9(M,await Dy1(B,M.settings))});let Q=async(W,H,B)=>{HX1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:e1.of([N0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:Su1,userConfigDir:lF6});let M={...H,executeMode:!1};await Tu1(M,{...W,startWithPicker:!0},B)},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 B=H.optsWithGlobals(),M=await BX(B);await pF6(B,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 B=H.optsWithGlobals(),M=await BX(B);await WH9(B,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,B)=>{let M=B.optsWithGlobals(),V=await BX(M);if(H.pick)await Q(M,V,B);else await FH9(M,V,W,B)}),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,B)=>{let M=B.optsWithGlobals(),V=await BX(M);await UH9(M,V,W,B)}),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 B=H.optsWithGlobals(),M=await BX(B);await pF6(B,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,B)=>{let M=B.optsWithGlobals(),V=await BX(M);await zH9(M,V,W,B,H.support)}),Z.command("rename <threadId> <newName>").alias("r").summary("Rename a thread").description('Change the title of a thread. Quote names with spaces: amp threads rename T-123 "New thread name"').action(async(W,H,B,M)=>{let V=M.optsWithGlobals(),N=await BX(V);await qH9(V,N,W,H,M)}),Z.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(W,H,B)=>{let M=B.optsWithGlobals(),V=await BX(M);await GH9(M,V,W,B)}),eZ6(J,async(W,H)=>{let B=await BX(H);hG(W,H);let M=await gG(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,configService:M.configService,cleanupTerminal:Xw,asyncDispose:M.asyncDispose.bind(M)}}),TZ6(J),RZ6(J,async(W)=>{let H=await BX(W);return{settings:H.settings,getThreadDeps:async(B)=>{hG(B,W);let M=await gG(H,W);return{mcpService:M.mcpService,asyncDispose:M.asyncDispose.bind(M)}}}}),J.command("connect").description("Connect CLI to web interface for multi-thread management").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await BX(B);hG(H,B);let V=await gG(M,B);try{await rb1(V,V.configService,{})}finally{await V.asyncDispose(),await Xw()}});let X=new D71().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 wy1(W.force||!1,W.verbose||!1,"0.0.1761252490-gff453e"),process.exit()});J.addCommand(X,{hidden:!0});function Y(W,H,B){let V=typeof W.description==="string"?W.description:B===void 0?W.description(!0):W.description(B),N=new yV(H,V),L=oW9(W);if(L)N.default(L);if(N.hidden=rW9(W)||uF6(W),"choices"in W)N.choices([...W.choices]);return N}for(let W of mF6)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 yV("-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);J.addOption(K);let q=new yV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp();J.addOption(q);let G=new yV("--stream-json","When used with --execute, output in Claude Code compatible stream JSON format instead of plain text.").default(!1);J.addOption(G);let z=new yV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(z);let U=new yV("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);if(J.addOption(U),process.env.AMP_CONNECT==="1"){let W=new yV("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(W)}J.action(async(W,H)=>{let B=W,M=await BX(B);if(Object.keys(B).forEach((V)=>{let N=mF6.find((L)=>L.name===V);if(N&&uF6(N)&&!sW9(N))a7.write(V8.yellow(`Warning: '--${V}' flag is deprecated
6473
+ `),!1}}function JH9(){let J=new D71().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)Xw(),process.exit(0);let H=W.originalError??W;rJ6(H)}),J.option("-V, --version","output the version number",()=>{s2.write(`0.0.1761278489-gf101e8 (released 2025-10-24T04:06:48.885Z)
6474
+ `),process.exit(0)}),J.addHelpText("after",sQ6()),J.configureHelp({formatHelp:oQ6}),J.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await BX(B);await YH9(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 B=H.optsWithGlobals(),M=await BX(B);await XH9(M,await Dy1(B,M.settings))});let Q=async(W,H,B)=>{HX1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:e1.of([N0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:Su1,userConfigDir:lF6});let M={...H,executeMode:!1};await Tu1(M,{...W,startWithPicker:!0},B)},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 B=H.optsWithGlobals(),M=await BX(B);await pF6(B,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 B=H.optsWithGlobals(),M=await BX(B);await WH9(B,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,B)=>{let M=B.optsWithGlobals(),V=await BX(M);if(H.pick)await Q(M,V,B);else await FH9(M,V,W,B)}),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,B)=>{let M=B.optsWithGlobals(),V=await BX(M);await UH9(M,V,W,B)}),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 B=H.optsWithGlobals(),M=await BX(B);await pF6(B,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,B)=>{let M=B.optsWithGlobals(),V=await BX(M);await zH9(M,V,W,B,H.support)}),Z.command("rename <threadId> <newName>").alias("r").summary("Rename a thread").description('Change the title of a thread. Quote names with spaces: amp threads rename T-123 "New thread name"').action(async(W,H,B,M)=>{let V=M.optsWithGlobals(),N=await BX(V);await qH9(V,N,W,H,M)}),Z.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(W,H,B)=>{let M=B.optsWithGlobals(),V=await BX(M);await GH9(M,V,W,B)}),eZ6(J,async(W,H)=>{let B=await BX(H);hG(W,H);let M=await gG(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,configService:M.configService,cleanupTerminal:Xw,asyncDispose:M.asyncDispose.bind(M)}}),TZ6(J),RZ6(J,async(W)=>{let H=await BX(W);return{settings:H.settings,getThreadDeps:async(B)=>{hG(B,W);let M=await gG(H,W);return{mcpService:M.mcpService,asyncDispose:M.asyncDispose.bind(M)}}}}),J.command("connect").description("Connect CLI to web interface for multi-thread management").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await BX(B);hG(H,B);let V=await gG(M,B);try{await rb1(V,V.configService,{})}finally{await V.asyncDispose(),await Xw()}});let X=new D71().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 wy1(W.force||!1,W.verbose||!1,"0.0.1761278489-gf101e8"),process.exit()});J.addCommand(X,{hidden:!0});function Y(W,H,B){let V=typeof W.description==="string"?W.description:B===void 0?W.description(!0):W.description(B),N=new yV(H,V),L=oW9(W);if(L)N.default(L);if(N.hidden=rW9(W)||uF6(W),"choices"in W)N.choices([...W.choices]);return N}for(let W of mF6)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 yV("-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);J.addOption(K);let q=new yV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp();J.addOption(q);let G=new yV("--stream-json","When used with --execute, output in Claude Code compatible stream JSON format instead of plain text.").default(!1);J.addOption(G);let z=new yV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(z);let U=new yV("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);if(J.addOption(U),process.env.AMP_CONNECT==="1"){let W=new yV("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(W)}J.action(async(W,H)=>{let B=W,M=await BX(B);if(Object.keys(B).forEach((V)=>{let N=mF6.find((L)=>L.name===V);if(N&&uF6(N)&&!sW9(N))a7.write(V8.yellow(`Warning: '--${V}' flag is deprecated
6475
6475
  `))}),H.args.length>0)tW9(M,H);await Tu1(M,B,H)});let F=new D71("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 KH9(W.version)});return J.addCommand(F),J}async function GQ1(J,Q){let{thread:Z,visibility:X}=Q,Y=Z?.id??zF(),K=zQ1(J);if(Z)await J.threadStorage.set(Y,Z);let q=await WJ.getOrCreateForThread(K,Y);if(X)await J.threadSyncService.updateThreadMeta(Y,M51(X));let G=J.threadService.observe(Y).subscribe(async(z)=>{if(s7(z,"assistant"))await Cu1(Y),G.unsubscribe()});return await q.resume(),q}async function Tu1(J,Q,Z){let X=D51(Q);if(X instanceof Error)NY(X.message);let Y,K=null;if(Q.streamJsonInput)Y="";else if(typeof Q.execute==="string"){Y=Q.execute;let w=(await Cy1()).trimEnd();if(w)K=w}else Y=(await Cy1()).trimEnd();if(Q.remote&&!J.executeMode)throw new m9("The -r/--remote flag currently only works with --execute mode",1,'Use: amp --remote --execute "your message"');if(Q.streamJson&&!J.executeMode)throw new m9("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(Q.streamJsonInput&&!J.executeMode)throw new m9("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(Q.streamJsonInput&&!Q.streamJson)throw new m9("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if((J.executeMode||Q.streamJson)&&Q.agentMode&&Q.agentMode!=="smart")throw new m9(`Execute mode is not permitted with --agent-mode '${Q.agentMode}'`,1);if(Q.stats&&!J.executeMode)throw new m9("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 m9("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&&Y===""&&!Q.streamJsonInput)throw new m9("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"
6476
6476
  Or pipe via stdin: echo "your message" | amp --execute`);hG(Z,Q);let q=await gG(J,Q);cF6=q;let G=zQ1(q),z=async(w)=>{let O=await dF6(w,"utf-8"),j=JSON.parse(O);if(!UF(j.id))throw new m9(uK.invalidThreadId);return GQ1(q,{visibility:X,thread:j})},U=async(w)=>{if(!UF(w))throw new m9(uK.invalidThreadId);let O=await q.threadService.get(w)??void 0;if(l.info(`[fetchAndStartThread] Loaded thread ${w}, agentMode: ${O?.agentMode??"undefined"}`),O?.agentMode)l.info(`[fetchAndStartThread] Setting runtime override for agentMode to: ${O.agentMode}`),sG("experimental.agentMode",O.agentMode);else l.info("[fetchAndStartThread] No agentMode on thread, not setting override");return GQ1(q,{visibility:X,thread:O})},F=async()=>{try{if(Q.threadId)return U(Q.threadId);else return GQ1(q,{visibility:X})}catch(w){if(w instanceof m9)throw w;throw await r71(w,Q.threadId),Error("handleError should have called process.exit()")}},W=async()=>{return GQ1(q,{visibility:X})};if(Q.format==="jsonl")a7.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
6477
- `),await Jw(),process.exit(1);if(J.executeMode&&Q.remote)await CZ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await F();if(J.executeMode)await zQ6(H,H.threadID,Y,K,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let B=!1,M=!1;if(Q.jetbrains||Q.ide){await Rr1();let w=await xB({jetbrainsOnly:Q.jetbrains});if(w.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(w.length===1){let O=w[0];if(O)U7.selectConfig(O)}else B=!0}let V=$y1("0.0.1761252490-gff453e",q.settingsStorage),N=e1.of([N0.file(process.cwd())]),L=YS(void 0,N);if(Y)H.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let A;try{A=await KJ.getUserFreeTierStatus({},{config:q.configService})}catch(w){A={ok:!1,error:w}}l.info("User free tier status:",A);let R=await _Z6();l.info("Loaded session state:",R),await gF6({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new Jy1,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadSyncService:q.threadSyncService,threadID:H.threadID,worker:H,workerDeps:G,configService:q.configService,internalAPIClient:KJ,ampURL:J.ampURL,startNewThread:W,pickAndContinueThread:async()=>{l.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:U7,connectedClientsService:new Fc,commandRegistry:L,showJetBrainsInstaller:M,showIdePicker:B,startWithPicker:Q.startWithPicker,updateService:V,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:R,freeTierStatus:A.ok?A.result:void 0}),await q.asyncDispose(),process.exit(0)}async function BX(J){if(J.interactive)a7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
6478
- `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await xQ6({...J,getHook:process.env.AMP_URL?(q,G)=>{if(q==="url")return Promise.resolve(process.env.AMP_URL);return G()}:void 0});if(J.mcpConfig){let q=await wZ6(J.mcpConfig);X=aW9(X,q)}let Y=await X.get("url","global");if(!Y)Y=UZ;if(!RB(Y))l.info("Targeting custom Amp server",{ampURL:Y});if(X=Al1(X),await X.get("debug.httpLogging"))Vl1();return{executeMode:Q,isTTY:Z,ampURL:Y,settings:X,secrets:SZ6(await Dy1(J,X))}}function QH9(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 ZH9(){let J=QH9(process.argv);if(SJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),iW9(l),l.info("Starting Amp CLI.",{version:"0.0.1761252490-gff453e",buildTimestamp:"2025-10-23T20:53:28.555Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new m9(uK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await JH9().parseAsync(process.argv)}ZH9().catch(r71);async function XH9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),s2.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
6477
+ `),await Jw(),process.exit(1);if(J.executeMode&&Q.remote)await CZ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await F();if(J.executeMode)await zQ6(H,H.threadID,Y,K,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let B=!1,M=!1;if(Q.jetbrains||Q.ide){await Rr1();let w=await xB({jetbrainsOnly:Q.jetbrains});if(w.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(w.length===1){let O=w[0];if(O)U7.selectConfig(O)}else B=!0}let V=$y1("0.0.1761278489-gf101e8",q.settingsStorage),N=e1.of([N0.file(process.cwd())]),L=YS(void 0,N);if(Y)H.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let A;try{A=await KJ.getUserFreeTierStatus({},{config:q.configService})}catch(w){A={ok:!1,error:w}}l.info("User free tier status:",A);let R=await _Z6();l.info("Loaded session state:",R),await gF6({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new Jy1,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadSyncService:q.threadSyncService,threadID:H.threadID,worker:H,workerDeps:G,configService:q.configService,internalAPIClient:KJ,ampURL:J.ampURL,startNewThread:W,pickAndContinueThread:async()=>{l.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:U7,connectedClientsService:new Fc,commandRegistry:L,showJetBrainsInstaller:M,showIdePicker:B,startWithPicker:Q.startWithPicker,updateService:V,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:R,freeTierStatus:A.ok?A.result:void 0}),await q.asyncDispose(),process.exit(0)}async function BX(J){if(J.interactive)a7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
6478
+ `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await xQ6({...J,getHook:process.env.AMP_URL?(q,G)=>{if(q==="url")return Promise.resolve(process.env.AMP_URL);return G()}:void 0});if(J.mcpConfig){let q=await wZ6(J.mcpConfig);X=aW9(X,q)}let Y=await X.get("url","global");if(!Y)Y=UZ;if(!RB(Y))l.info("Targeting custom Amp server",{ampURL:Y});if(X=Al1(X),await X.get("debug.httpLogging"))Vl1();return{executeMode:Q,isTTY:Z,ampURL:Y,settings:X,secrets:SZ6(await Dy1(J,X))}}function QH9(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 ZH9(){let J=QH9(process.argv);if(SJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),iW9(l),l.info("Starting Amp CLI.",{version:"0.0.1761278489-gf101e8",buildTimestamp:"2025-10-24T04:06:48.885Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new m9(uK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await JH9().parseAsync(process.argv)}ZH9().catch(r71);async function XH9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),s2.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
6479
6479
  `);else if(!RB(J.ampURL))s2.write(`Logging in to ${new URL(J.ampURL).hostname}
6480
6480
  `);let Z=process.env.AMP_API_KEY;if(Z)s2.write(`API key found in environment variable, storing...
6481
6481
  `),await Q.set("apiKey",Z,J.ampURL),s2.write(`API key successfully stored.
@@ -6491,7 +6491,7 @@ Or pipe via stdin: echo "your message" | amp --execute`);hG(Z,Q);let q=await gG(
6491
6491
  `));try{let Q;if(J)Q=J,a7.write(V8.blue(`Updating to version ${J}...
6492
6492
  `)),await UC(J),a7.write(V8.green(`✓ Successfully updated to version ${J}
6493
6493
  `));else{a7.write(V8.blue(`Checking for updates...
6494
- `));let{hasUpdate:X,latestVersion:Y}=await F71("0.0.1761252490-gff453e");if(!X)a7.write(V8.green(`✓ Amp CLI is already up to date.
6494
+ `));let{hasUpdate:X,latestVersion:Y}=await F71("0.0.1761278489-gf101e8");if(!X)a7.write(V8.green(`✓ Amp CLI is already up to date.
6495
6495
  `)),process.exit(0);if(!Y)a7.write(V8.yellow("[WARN] could not find latest version")),process.exit(0);Q=Y,a7.write(V8.blue(`Updating to version ${Y}...
6496
6496
  `)),await UC(Y),a7.write(V8.green(`✓ Successfully updated to version ${Y}
6497
6497
  `))}let Z=await Gw(Q);if(Z.warning)a7.write(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1761252490-gff453e",
3
+ "version": "0.0.1761278489-gf101e8",
4
4
  "description": "CLI for Amp, an agentic coding tool built by Sourcegraph.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {