@sourcegraph/amp 0.0.1760745707-g3750ff → 0.0.1760760095-g8b384e

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
@@ -6137,7 +6137,7 @@ See https://ampcode.com/manual#toolboxes`);return Q[0]||dR}function JX6(J,Q){let
6137
6137
  `;async function qX6(J,Q,Z,X){let Y=performance.now(),K=[...a_(rM1(J)),{role:"user",parts:[{text:KJ9.replace("{USER_GOAL}",Q)}]}],q=await b$(hr,K,[],J,Z,X,{responseMimeType:"application/json",responseJsonSchema:M0.toJSONSchema(KX6)}),G=KX6.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();x6();function GX6(J){let Q=J.trim();if(Q==="quit"||Q==="exit")return"/quit";return J}function zX6(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"}G0();lB();import qJ9 from"node:fs";import UX6 from"node:path";function WX6(J){let Q=J.trim().replace(/^["']|["']$/g,"");if(Q=Q.replace(/\\(.)/g,"$1"),!/\.(png|jpe?g|gif|webp)$/i.test(Q))return null;if(!UX6.isAbsolute(Q))return null;return l.debug("Extracted image path",{original:J,extracted:Q}),Q}function FX6(J){try{let Q=UX6.extname(J).toLowerCase(),Z=de1(Q);if(!Z)return l.warn("Unsupported image file extension",{ext:Q}),null;try{let X=qJ9.readFileSync(J);return GJ9(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 GJ9(J,Q){if(J.length>jW)return l.warn(`Image file too large: ${J.length} bytes (max: ${jW})`),null;return{type:"image",source:{type:"base64",data:J.toString("base64"),mediaType:Q}}}import{execSync as yK6}from"node:child_process";import{rmdir as QK9}from"node:fs/promises";import{tmpdir as ZK9}from"node:os";import fK6 from"node:path";oO();G0();import{spawn as zJ9}from"node:child_process";import{promises as UJ9}from"node:fs";function HX6(J){return J.kind==="executable"}function BX6(J){return J.kind==="markdown"}var pH=50000,DX6=300000;async function vy1(J,Q,Z,X={}){let{timeoutMs:Y=DX6,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}),BX6(q))return await WJ9(q,Q);else if(HX6(q))return await FJ9(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 WJ9(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await UJ9.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>pH?Z.slice(0,pH)+`
6138
6138
  ... (output truncated at ${pH} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function FJ9(J,Q,Z=DX6,X){return new Promise((Y)=>{let[K,q]=HJ9(J,Q);l.debug("Spawning command",{spawnCommand:K,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Z});let G=ge1(X),z=!1,U=setTimeout(()=>{z=!0,G.abort(),l.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),W=zJ9(K,q,{stdio:["pipe","pipe","pipe"],signal:G.signal,detached:!0}),F=[],H=[],B=0;W.stdout?.on("data",(M)=>{let V=M.toString();if(B+=V.length,B<=pH)F.push(V);else{let N=pH-(B-V.length);if(N>0)F.push(V.slice(0,N))}}),W.stderr?.on("data",(M)=>{let V=M.toString();if(B+=V.length,B<=pH)H.push(V);else{let N=pH-(B-V.length);if(N>0)H.push(V.slice(0,N))}}),W.on("close",(M)=>{if(clearTimeout(U),z){Y({success:!1,output:F.join(""),error:`Command timed out after ${Z}ms`,exitCode:void 0});return}if(G.signal.aborted){Y({success:!1,output:F.join(""),error:"The command was aborted",exitCode:M??void 0});return}let V=M===0||M===1,N=F.join(""),L=H.join(""),A=N;if(!V&&!N.trim()&&L.trim())A=L;else if(L.trim())A+=N?`
6139
6139
  ${L}`:L;if(B>pH)A+=`
6140
- ... (output truncated at ${pH} characters)`;Y({success:V,output:A.trim(),error:!V?L.trim()||"Command failed":void 0,exitCode:M??void 0})}),W.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:F.join(""),error:V})})})}function HJ9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return DJ9(Z,X?[...X]:null,Y,Q);else return BJ9(Z,X?[...X]:null,Y,Q)}function BJ9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function DJ9(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]}}G0();vj();U2();IB();kX();fW();x6();I0();import{mkdtemp as XK9,readFile as YK9,unlink as KK9,writeFile as qO2}from"fs/promises";var q51={};R6(q51,{scrollUp:()=>xJ9,scrollDown:()=>bJ9,link:()=>uJ9,image:()=>pJ9,iTerm:()=>dJ9,exitAlternativeScreen:()=>gJ9,eraseUp:()=>_J9,eraseStartLine:()=>vJ9,eraseScreen:()=>ky1,eraseLines:()=>CJ9,eraseLine:()=>LX6,eraseEndLine:()=>SJ9,eraseDown:()=>kJ9,enterAlternativeScreen:()=>hJ9,cursorUp:()=>VX6,cursorTo:()=>NJ9,cursorShow:()=>TJ9,cursorSavePosition:()=>OJ9,cursorRestorePosition:()=>jJ9,cursorPrevLine:()=>IJ9,cursorNextLine:()=>EJ9,cursorMove:()=>LJ9,cursorLeft:()=>NX6,cursorHide:()=>PJ9,cursorGetPosition:()=>$J9,cursorForward:()=>wJ9,cursorDown:()=>AJ9,cursorBackward:()=>RJ9,clearTerminal:()=>fJ9,clearScreen:()=>yJ9,beep:()=>mJ9});import _y1 from"node:process";var K51=globalThis.window?.document!==void 0,qw2=globalThis.process?.versions?.node!==void 0,Gw2=globalThis.process?.versions?.bun!==void 0,zw2=globalThis.Deno?.version?.deno!==void 0,Uw2=globalThis.process?.versions?.electron!==void 0,Ww2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,Fw2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,Hw2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,Bw2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,Dw2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,xu=globalThis.navigator?.userAgentData?.platform,Mw2=xu==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",Vw2=xu==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",Nw2=xu==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",Lw2=xu==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),Aw2=xu==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var N2="\x1B[",yu="\x1B]",VC="\x07",bu=";",MX6=!K51&&_y1.env.TERM_PROGRAM==="Apple_Terminal",MJ9=!K51&&_y1.platform==="win32",VJ9=K51?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:_y1.cwd,NJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return N2+(J+1)+"G";return N2+(Q+1)+bu+(J+1)+"H"},LJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=N2+-J+"D";else if(J>0)Z+=N2+J+"C";if(Q<0)Z+=N2+-Q+"A";else if(Q>0)Z+=N2+Q+"B";return Z},VX6=(J=1)=>N2+J+"A",AJ9=(J=1)=>N2+J+"B",wJ9=(J=1)=>N2+J+"C",RJ9=(J=1)=>N2+J+"D",NX6=N2+"G",OJ9=MX6?"\x1B7":N2+"s",jJ9=MX6?"\x1B8":N2+"u",$J9=N2+"6n",EJ9=N2+"E",IJ9=N2+"F",PJ9=N2+"?25l",TJ9=N2+"?25h",CJ9=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=LX6+(Z<J-1?VX6():"");if(J)Q+=NX6;return Q},SJ9=N2+"K",vJ9=N2+"1K",LX6=N2+"2K",kJ9=N2+"J",_J9=N2+"1J",ky1=N2+"2J",xJ9=N2+"S",bJ9=N2+"T",yJ9="\x1Bc",fJ9=MJ9?`${ky1}${N2}0f`:`${ky1}${N2}3J${N2}H`,hJ9=N2+"?1049h",gJ9=N2+"?1049l",mJ9=VC,uJ9=(J,Q)=>[yu,"8",bu,bu,Q,VC,J,yu,"8",bu,bu,VC].join(""),pJ9=(J,Q={})=>{let Z=`${yu}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")+VC},dJ9={setCwd:(J=VJ9())=>`${yu}50;CurrentDir=${J}${VC}`,annotation(J,Q={}){let Z=`${yu}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+VC}};var G51=_6(EX6(),1);function nV(J,Q,{target:Z="stdout",...X}={}){if(!G51.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (​${Q}​)`}return q51.link(J,Q)}nV.isSupported=G51.default.stdout;nV.stderr=(J,Q,Z={})=>nV(J,Q,{target:"stderr",...Z});nV.stderr.isSupported=G51.default.stderr;G0();kX();class hy1{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.1760745707-g3750ff"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await sn(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 U51}from"node:child_process";import{platform as gy1}from"node:os";import{promisify as nJ9}from"node:util";var z51=nJ9(U51),aJ9=(J)=>`\x1B]52;c;${J}\x1B\\`,rJ9="\x1B]52;c;?\x1B\\",sJ9="\x1B]52;p;?\x1B\\";class IX6{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 z51("which",[J]),!0}catch{return!1}}async writeToPbcopy(J){try{let Q=U51("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=U51("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=U51("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(rJ9)}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 z51("pbpaste");return J}catch{return null}}async readFromWlPaste(J){try{let Q=["--no-newline"];if(J==="primary")Q.push("--primary");let{stdout:Z}=await z51("wl-paste",Q);return Z}catch{return null}}async readFromXclip(J){try{let{stdout:Q}=await z51("xclip",["-selection",J,"-o"]);return Q}catch{return null}}async readFromOSC52Primary(){return this.readFromOSC52WithQuery(sJ9)}async readText(){if(this.isOsc52Supported()){let Q=await this.readFromOSC52();if(Q!==null)return Q}if(gy1()==="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(gy1()==="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=aJ9(Z);process.stdout.write(X);return}if(gy1()==="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 IX6;G0();class W51 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}class c7{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function PX6(J){if(J instanceof W51)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof c7)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 JN=null,qK9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(JN)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(() => (nb1(),iJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{JN=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});JN=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{JN=null,Z.sendStatus({connected:!1,errorMessage:M.message})});let z=(await J.configService.getLatest()).settings.url,U=J.worker.thread.id,W=new URL(`/clients/${Y}/${U}`,z).toString(),F=new URL("/clients",z).toString(),H="";try{H=await(await Promise.resolve().then(() => _6(_f1(),1))).toString(W,{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:F,qrCode:H});else return new c7(`Continue at ${F}`)}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(!JN)return new c7("Not connected to Amp web interface");try{JN.disconnect();let Z=JN.clientID;return JN=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new c7(`Disconnected from Amp web interface
6140
+ ... (output truncated at ${pH} characters)`;Y({success:V,output:A.trim(),error:!V?L.trim()||"Command failed":void 0,exitCode:M??void 0})}),W.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:F.join(""),error:V})})})}function HJ9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return DJ9(Z,X?[...X]:null,Y,Q);else return BJ9(Z,X?[...X]:null,Y,Q)}function BJ9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function DJ9(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]}}G0();vj();U2();IB();kX();fW();x6();I0();import{mkdtemp as XK9,readFile as YK9,unlink as KK9,writeFile as qO2}from"fs/promises";var q51={};R6(q51,{scrollUp:()=>xJ9,scrollDown:()=>bJ9,link:()=>uJ9,image:()=>pJ9,iTerm:()=>dJ9,exitAlternativeScreen:()=>gJ9,eraseUp:()=>_J9,eraseStartLine:()=>vJ9,eraseScreen:()=>ky1,eraseLines:()=>CJ9,eraseLine:()=>LX6,eraseEndLine:()=>SJ9,eraseDown:()=>kJ9,enterAlternativeScreen:()=>hJ9,cursorUp:()=>VX6,cursorTo:()=>NJ9,cursorShow:()=>TJ9,cursorSavePosition:()=>OJ9,cursorRestorePosition:()=>jJ9,cursorPrevLine:()=>IJ9,cursorNextLine:()=>EJ9,cursorMove:()=>LJ9,cursorLeft:()=>NX6,cursorHide:()=>PJ9,cursorGetPosition:()=>$J9,cursorForward:()=>wJ9,cursorDown:()=>AJ9,cursorBackward:()=>RJ9,clearTerminal:()=>fJ9,clearScreen:()=>yJ9,beep:()=>mJ9});import _y1 from"node:process";var K51=globalThis.window?.document!==void 0,qw2=globalThis.process?.versions?.node!==void 0,Gw2=globalThis.process?.versions?.bun!==void 0,zw2=globalThis.Deno?.version?.deno!==void 0,Uw2=globalThis.process?.versions?.electron!==void 0,Ww2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,Fw2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,Hw2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,Bw2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,Dw2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,xu=globalThis.navigator?.userAgentData?.platform,Mw2=xu==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",Vw2=xu==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",Nw2=xu==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",Lw2=xu==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),Aw2=xu==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var N2="\x1B[",yu="\x1B]",VC="\x07",bu=";",MX6=!K51&&_y1.env.TERM_PROGRAM==="Apple_Terminal",MJ9=!K51&&_y1.platform==="win32",VJ9=K51?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:_y1.cwd,NJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return N2+(J+1)+"G";return N2+(Q+1)+bu+(J+1)+"H"},LJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=N2+-J+"D";else if(J>0)Z+=N2+J+"C";if(Q<0)Z+=N2+-Q+"A";else if(Q>0)Z+=N2+Q+"B";return Z},VX6=(J=1)=>N2+J+"A",AJ9=(J=1)=>N2+J+"B",wJ9=(J=1)=>N2+J+"C",RJ9=(J=1)=>N2+J+"D",NX6=N2+"G",OJ9=MX6?"\x1B7":N2+"s",jJ9=MX6?"\x1B8":N2+"u",$J9=N2+"6n",EJ9=N2+"E",IJ9=N2+"F",PJ9=N2+"?25l",TJ9=N2+"?25h",CJ9=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=LX6+(Z<J-1?VX6():"");if(J)Q+=NX6;return Q},SJ9=N2+"K",vJ9=N2+"1K",LX6=N2+"2K",kJ9=N2+"J",_J9=N2+"1J",ky1=N2+"2J",xJ9=N2+"S",bJ9=N2+"T",yJ9="\x1Bc",fJ9=MJ9?`${ky1}${N2}0f`:`${ky1}${N2}3J${N2}H`,hJ9=N2+"?1049h",gJ9=N2+"?1049l",mJ9=VC,uJ9=(J,Q)=>[yu,"8",bu,bu,Q,VC,J,yu,"8",bu,bu,VC].join(""),pJ9=(J,Q={})=>{let Z=`${yu}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")+VC},dJ9={setCwd:(J=VJ9())=>`${yu}50;CurrentDir=${J}${VC}`,annotation(J,Q={}){let Z=`${yu}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+VC}};var G51=_6(EX6(),1);function nV(J,Q,{target:Z="stdout",...X}={}){if(!G51.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (​${Q}​)`}return q51.link(J,Q)}nV.isSupported=G51.default.stdout;nV.stderr=(J,Q,Z={})=>nV(J,Q,{target:"stderr",...Z});nV.stderr.isSupported=G51.default.stderr;G0();kX();class hy1{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.1760760095-g8b384e"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await sn(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 U51}from"node:child_process";import{platform as gy1}from"node:os";import{promisify as nJ9}from"node:util";var z51=nJ9(U51),aJ9=(J)=>`\x1B]52;c;${J}\x1B\\`,rJ9="\x1B]52;c;?\x1B\\",sJ9="\x1B]52;p;?\x1B\\";class IX6{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 z51("which",[J]),!0}catch{return!1}}async writeToPbcopy(J){try{let Q=U51("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=U51("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=U51("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(rJ9)}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 z51("pbpaste");return J}catch{return null}}async readFromWlPaste(J){try{let Q=["--no-newline"];if(J==="primary")Q.push("--primary");let{stdout:Z}=await z51("wl-paste",Q);return Z}catch{return null}}async readFromXclip(J){try{let{stdout:Q}=await z51("xclip",["-selection",J,"-o"]);return Q}catch{return null}}async readFromOSC52Primary(){return this.readFromOSC52WithQuery(sJ9)}async readText(){if(this.isOsc52Supported()){let Q=await this.readFromOSC52();if(Q!==null)return Q}if(gy1()==="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(gy1()==="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=aJ9(Z);process.stdout.write(X);return}if(gy1()==="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 IX6;G0();class W51 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}class c7{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function PX6(J){if(J instanceof W51)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof c7)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 JN=null,qK9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(JN)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(() => (nb1(),iJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{JN=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});JN=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{JN=null,Z.sendStatus({connected:!1,errorMessage:M.message})});let z=(await J.configService.getLatest()).settings.url,U=J.worker.thread.id,W=new URL(`/clients/${Y}/${U}`,z).toString(),F=new URL("/clients",z).toString(),H="";try{H=await(await Promise.resolve().then(() => _6(_f1(),1))).toString(W,{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:F,qrCode:H});else return new c7(`Continue at ${F}`)}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(!JN)return new c7("Not connected to Amp web interface");try{JN.disconnect();let Z=JN.clientID;return JN=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new c7(`Disconnected from Amp web interface
6141
6141
  Client ID: ${Z}
6142
6142
  Server will clean up automatically within 60 seconds`)}catch(Z){return Error(`Failed to disconnect: ${Z.message}`)}}}};class xf1{configService;commands;customRegistry;latestCustom=[];telemetrySubmitter;constructor(J=XS(),Q){this.configService=Q;this.customRegistry=J,this._initBaseCommands(!1),this.customRegistry.commands.subscribe((Z)=>this.latestCustom=Z),this.telemetrySubmitter=new hy1(async()=>{try{return(await this.configService.getLatest()).settings["experimental.cli.commandTelemetry.enabled"]===!0}catch{return!1}},this.configService),this.configService.config.pipe(C0((Z)=>NB(Z.settings)),c6()).subscribe((Z)=>{this._initBaseCommands(Z.length>1)})}_initBaseCommands(J){if(this.commands={...GK9},process.env.AMP_CONNECT==="1")Object.assign(this.commands,qK9);if(J)Object.assign(this.commands,zK9)}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 vy1(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=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 GK9={"generate-agent-file":{name:"generate-agent-file",description:`Generate an ${Z5} file in the current workspace`,execute:async(J,Q)=>{let Z=await J.configService.getLatest(),X=_q(Z.settings),K=J.getInMemoryAgentModeOverride()??X;J.worker.handle({type:"user:message",message:{content:[{type:"text",text:w90}],agentMode:K}});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 W51;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(new AbortController().signal)}catch(Z){return Z instanceof Error?Z:Error("Failed to compact thread")}},isVisible:(J)=>J.agentMode!=="free"},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 XK9(fK6.join(ZK9(),"amp-edit-")),Y=fK6.join(X,"message.amp.md");yK6(`${Z} "${Y}"`,{stdio:"inherit"}),process.stdout.write("\x1B[?25l");try{let q=(await YK9(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 KK9(Y),await QK9(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 aG("dangerouslyAllowAll",!1),new c7("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 aG("dangerouslyAllowAll",!0),new c7("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 DC();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:DC};await Z51(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&&J.agentMode!=="free"},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 c7(`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(`
6143
6143
  `).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=kj(new URL(Y),Z.id).toString(),G=`Thread URL: ${nV(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 c7(`${G}
@@ -6342,7 +6342,7 @@ ${Q}`),this.textController.clear(),this.textController.insertText(this.pendingTr
6342
6342
  `),J.stdout.write(`Thread: ${H}
6343
6343
  `),J.stdout.write(`Continue this thread with: amp threads continue ${W}
6344
6344
  `)}}function Pu1(J){return J==="smart"?v1.rgb(3,197,97):J==="fast"?v1.rgb(228,180,2):J==="free"?v1.rgb(0,184,255):sF9(J)}function sF9(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 v1.index(Z[X])}Jh1();if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){q4.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
6345
- `)}var Cu1=Tu1.join(Xl1||Tu1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function QH9(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 KB(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")aG("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: ${H8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")aG("experimental.agentMode",Q.agentMode)}async function vu1(J){try{await tF9(Tu1.dirname(Cu1),{recursive:!0}),await eF9(Cu1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function ZH9(){try{return(await JF6(Cu1,"utf-8")).trim()}catch(J){return null}}function XH9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z);return Xi1("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 oW6=[{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??FY,description:`Custom settings file path (overrides the default location ${FY})`},{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 ${yb1})`},{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:gK(),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:Td}],tW6=(J)=>("deprecated"in J)&&J.deprecated===!0,YH9=(J)=>("hidden"in J)&&J.hidden===!0,KH9=(J)=>("default"in J),qH9=(J)=>("default"in J)?J.default:void 0;function GH9(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(hK.unknownCommand(Z),1,q)}}var QF6=null;function F14(){return QF6}function rJ1(J){return{...J,getThreadEnvironment:C71,vfs:Y40({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new D_(J.fileSystem),generateThreadTitle:jG0,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var ku1=j0.file(JH9.homedir()),ZF6=process.env.XDG_CONFIG_HOME?j0.file(process.env.XDG_CONFIG_HOME):f0.joinPath(ku1,".config");async function qB(J,Q){Gn1("0.0.1760745707-g3750ff");let Z=oZ1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:e1.of([j0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:ku1,userConfigDir:ZF6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (nJ1(),iJ1));X(Z);let Y=await Z.getLatest();l.debug("Global configuration initialized",{settingsKeys:Object.keys(Y.settings)});let K=Ha(FO({configService:Z})),q=x20({configService:Z,toolService:K}),G=hR0(K,C9,ge).catch((w)=>{l.warn("Toolbox registration failed, continuing anyway:",w)}),z=q.initialized.catch((w)=>{l.warn("MCP service initialization failed, continuing anyway:",w)});if(J.executeMode)await Promise.all([z,G]);if(Q.jetbrains)DO("JetBrains");else if(Q.ide&&tQ6())DO("VS Code");else if(Q.ide&&eQ6())DO("Neovim");if(J.executeMode)zn1(!0);c96(K,{configService:Z});let U,W=_5.status.pipe(C0((w)=>Boolean(w.connected&&w.authenticated)),c6()).subscribe((w)=>{if(w){if(!U)U=K.registerTool(Gs)}else U?.dispose(),U=void 0}),F;if(!J.executeMode)F=new d71(process.cwd(),{},!0);else F=new class extends d71{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...
6345
+ `)}var Cu1=Tu1.join(Xl1||Tu1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function QH9(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 KB(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")aG("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: ${H8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")aG("experimental.agentMode",Q.agentMode)}async function vu1(J){try{await tF9(Tu1.dirname(Cu1),{recursive:!0}),await eF9(Cu1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function ZH9(){try{return(await JF6(Cu1,"utf-8")).trim()}catch(J){return null}}function XH9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z);return Xi1("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 oW6=[{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??FY,description:`Custom settings file path (overrides the default location ${FY})`},{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 ${yb1})`},{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:gK(),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:Td}],tW6=(J)=>("deprecated"in J)&&J.deprecated===!0,YH9=(J)=>("hidden"in J)&&J.hidden===!0,KH9=(J)=>("default"in J),qH9=(J)=>("default"in J)?J.default:void 0;function GH9(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(hK.unknownCommand(Z),1,q)}}var QF6=null;function F14(){return QF6}function rJ1(J){return{...J,getThreadEnvironment:C71,vfs:Y40({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new D_(J.fileSystem),generateThreadTitle:jG0,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var ku1=j0.file(JH9.homedir()),ZF6=process.env.XDG_CONFIG_HOME?j0.file(process.env.XDG_CONFIG_HOME):f0.joinPath(ku1,".config");async function qB(J,Q){Gn1("0.0.1760760095-g8b384e");let Z=oZ1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:e1.of([j0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:ku1,userConfigDir:ZF6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (nJ1(),iJ1));X(Z);let Y=await Z.getLatest();l.debug("Global configuration initialized",{settingsKeys:Object.keys(Y.settings)});let K=Ha(FO({configService:Z})),q=x20({configService:Z,toolService:K}),G=hR0(K,C9,ge).catch((w)=>{l.warn("Toolbox registration failed, continuing anyway:",w)}),z=q.initialized.catch((w)=>{l.warn("MCP service initialization failed, continuing anyway:",w)});if(J.executeMode)await Promise.all([z,G]);if(Q.jetbrains)DO("JetBrains");else if(Q.ide&&tQ6())DO("VS Code");else if(Q.ide&&eQ6())DO("Neovim");if(J.executeMode)zn1(!0);c96(K,{configService:Z});let U,W=_5.status.pipe(C0((w)=>Boolean(w.connected&&w.authenticated)),c6()).subscribe((w)=>{if(w){if(!U)U=K.registerTool(Gs)}else U?.dispose(),U=void 0}),F;if(!J.executeMode)F=new d71(process.cwd(),{},!0);else F=new class extends d71{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...
6346
6346
  `),!await zH9(J))await ew(),process.exit(1)}let H=await U40({isDevelopment:!1}),B=new xH1(H),M=new kH1(H,Z,{lazy:!0}),V=Q.notifications!==void 0?Q.notifications:!J.executeMode,N=i96({playNotificationSound:async(w)=>{if(V){l96(w);let R=tf1(),O=ef1();if((!R||O)&&Y.settings["notifications.system.enabled"]!==!1){if(w==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(w==="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=N40({threadService:B,threadHistoryService:M,configService:Z,isExtensionDevelopment:!1}),A={configService:Z,toolService:K,mcpService:q,threadService:B,threadHistoryService:M,threadSyncService:L,threadStorage:H,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:F,notificationService:N,fileSystem:Q.jetbrains||Q.ide?Q40:C9};return{...A,async asyncDispose(){await A.mcpService.dispose(),await A.threadService.asyncDispose(),A.configService.unsubscribe(),A.toolService.dispose(),A.fuzzyServer.dispose(),A.threadSyncService.dispose(),A.settingsStorage[Symbol.dispose](),W.unsubscribe(),U?.dispose()}}}async function zH9(J){if(!J.executeMode){if(!await jy1("Would you like to log in to Amp? [(y)es, (n)o]: "))return s2.write(`Login cancelled. Run the command again to retry.
6347
6347
  `),!1}return await XF6(J)}async function XF6(J){let Q=oF9(32).toString("hex"),Z=await Oy1(J.ampURL,Q);try{await KZ(Z)}catch(Y){l.error("Failed to open browser",{error:Y})}let X=await Oy1(J.ampURL,Q,!1);s2.write(`If your browser did not open automatically, visit:
6348
6348
 
@@ -6352,12 +6352,12 @@ ${H8.blue.bold(X)}
6352
6352
  Login successful! You can now use the Amp CLI.
6353
6353
  `),!0}catch(Y){return l.error("Login failed",{error:Y}),q4.write(`
6354
6354
  Login failed: ${Y instanceof Error?Y.message:String(Y)}
6355
- `),!1}}function UH9(){let J=new cm().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((F)=>{if(F.code==="commander.help"||F.code==="commander.version"||F.exitCode===0)XR(),process.exit(0);let H=F.originalError??F;rJ6(H)}),J.option("-V, --version","output the version number",()=>{s2.write(`0.0.1760745707-g3750ff (released 2025-10-18T00:06:47.460Z)
6356
- `),process.exit(0)}),J.addHelpText("after",rQ6()),J.configureHelp({formatHelp:sQ6}),J.command("logout").description("Log out by removing stored API key").action(async(F,H)=>{let B=H.optsWithGlobals(),M=await NY(B);await BH9(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(F,H)=>{let B=H.optsWithGlobals(),M=await NY(B);await HH9(M,await Wy1(B,M.settings))});let Q=async(F,H,B)=>{oZ1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:e1.of([j0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:ku1,userConfigDir:ZF6});let M={...H,executeMode:!1};await Su1(M,{...F,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(F,H)=>{let B=H.optsWithGlobals(),M=await NY(B);await eW6(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(F,H)=>{let B=H.optsWithGlobals(),M=await NY(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(F,H,B)=>{let M=B.optsWithGlobals(),V=await NY(M);if(H.pick)await Q(M,V,B);else await AH9(M,V,F,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(F,H,B)=>{let M=B.optsWithGlobals(),V=await NY(M);await LH9(M,V,F,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(F,H)=>{let B=H.optsWithGlobals(),M=await NY(B);await eW6(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(F,H,B)=>{let M=B.optsWithGlobals(),V=await NY(M);await NH9(M,V,F,B,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(F,H,B)=>{let M=B.optsWithGlobals(),V=await NY(M);await VH9(M,V,F,B)}),JX6(J,async(F,H)=>{let B=await NY(H);KB(F,H);let M=await qB(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,configService:M.configService,cleanupTerminal:XR,asyncDispose:M.asyncDispose.bind(M)}}),PZ6(J),AZ6(J,async(F)=>{let H=await NY(F);return{settings:H.settings,getThreadDeps:async(B)=>{KB(B,F);let M=await qB(H,F);return{mcpService:M.mcpService,asyncDispose:M.asyncDispose.bind(M)}}}}),J.command("connect").description("Connect CLI to web interface for multi-thread management").action(async(F,H)=>{let B=H.optsWithGlobals(),M=await NY(B);KB(H,B);let V=await qB(M,B);try{await ib1(V,V.configService,{})}finally{await V.asyncDispose(),await XR()}});let X=new cm().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(F)=>{await Ny1(F.force||!1,F.verbose||!1,"0.0.1760745707-g3750ff"),process.exit()});J.addCommand(X,{hidden:!0});function Y(F,H,B){let V=typeof F.description==="string"?F.description:B===void 0?F.description(!0):F.description(B),N=new yV(H,V),L=qH9(F);if(L)N.default(L);if(N.hidden=YH9(F)||tW6(F),"choices"in F)N.choices([...F.choices]);return N}for(let F of oW6)switch(F.type){case"flag":{J.addOption(Y(F,`--${F.long}`)),J.addOption(Y(F,`--no-${F.long}`,!1));break}case"switch":{J.addOption(Y(F,`--${F.long}`,!0));break}default:{J.addOption(Y(F,`--${F.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);if(J.addOption(K),process.env.AMP_CLI_REMOTE){let F=new yV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1);J.addOption(F)}let q=new yV("--stream-json","When used with --execute, output in Claude Code compatible stream JSON format instead of plain text.").default(!1);J.addOption(q);let G=new yV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(G);let z=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(z),process.env.AMP_CONNECT==="1"){let F=new yV("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(F)}J.action(async(F,H)=>{let B=F,M=await NY(B);if(Object.keys(B).forEach((V)=>{let N=oW6.find((L)=>L.name===V);if(N&&tW6(N)&&!KH9(N))q4.write(H8.yellow(`Warning: '--${V}' flag is deprecated
6355
+ `),!1}}function UH9(){let J=new cm().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((F)=>{if(F.code==="commander.help"||F.code==="commander.version"||F.exitCode===0)XR(),process.exit(0);let H=F.originalError??F;rJ6(H)}),J.option("-V, --version","output the version number",()=>{s2.write(`0.0.1760760095-g8b384e (released 2025-10-18T04:06:54.103Z)
6356
+ `),process.exit(0)}),J.addHelpText("after",rQ6()),J.configureHelp({formatHelp:sQ6}),J.command("logout").description("Log out by removing stored API key").action(async(F,H)=>{let B=H.optsWithGlobals(),M=await NY(B);await BH9(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(F,H)=>{let B=H.optsWithGlobals(),M=await NY(B);await HH9(M,await Wy1(B,M.settings))});let Q=async(F,H,B)=>{oZ1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:e1.of([j0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:ku1,userConfigDir:ZF6});let M={...H,executeMode:!1};await Su1(M,{...F,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(F,H)=>{let B=H.optsWithGlobals(),M=await NY(B);await eW6(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(F,H)=>{let B=H.optsWithGlobals(),M=await NY(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(F,H,B)=>{let M=B.optsWithGlobals(),V=await NY(M);if(H.pick)await Q(M,V,B);else await AH9(M,V,F,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(F,H,B)=>{let M=B.optsWithGlobals(),V=await NY(M);await LH9(M,V,F,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(F,H)=>{let B=H.optsWithGlobals(),M=await NY(B);await eW6(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(F,H,B)=>{let M=B.optsWithGlobals(),V=await NY(M);await NH9(M,V,F,B,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(F,H,B)=>{let M=B.optsWithGlobals(),V=await NY(M);await VH9(M,V,F,B)}),JX6(J,async(F,H)=>{let B=await NY(H);KB(F,H);let M=await qB(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,configService:M.configService,cleanupTerminal:XR,asyncDispose:M.asyncDispose.bind(M)}}),PZ6(J),AZ6(J,async(F)=>{let H=await NY(F);return{settings:H.settings,getThreadDeps:async(B)=>{KB(B,F);let M=await qB(H,F);return{mcpService:M.mcpService,asyncDispose:M.asyncDispose.bind(M)}}}}),J.command("connect").description("Connect CLI to web interface for multi-thread management").action(async(F,H)=>{let B=H.optsWithGlobals(),M=await NY(B);KB(H,B);let V=await qB(M,B);try{await ib1(V,V.configService,{})}finally{await V.asyncDispose(),await XR()}});let X=new cm().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(F)=>{await Ny1(F.force||!1,F.verbose||!1,"0.0.1760760095-g8b384e"),process.exit()});J.addCommand(X,{hidden:!0});function Y(F,H,B){let V=typeof F.description==="string"?F.description:B===void 0?F.description(!0):F.description(B),N=new yV(H,V),L=qH9(F);if(L)N.default(L);if(N.hidden=YH9(F)||tW6(F),"choices"in F)N.choices([...F.choices]);return N}for(let F of oW6)switch(F.type){case"flag":{J.addOption(Y(F,`--${F.long}`)),J.addOption(Y(F,`--no-${F.long}`,!1));break}case"switch":{J.addOption(Y(F,`--${F.long}`,!0));break}default:{J.addOption(Y(F,`--${F.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);if(J.addOption(K),process.env.AMP_CLI_REMOTE){let F=new yV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1);J.addOption(F)}let q=new yV("--stream-json","When used with --execute, output in Claude Code compatible stream JSON format instead of plain text.").default(!1);J.addOption(q);let G=new yV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(G);let z=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(z),process.env.AMP_CONNECT==="1"){let F=new yV("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(F)}J.action(async(F,H)=>{let B=F,M=await NY(B);if(Object.keys(B).forEach((V)=>{let N=oW6.find((L)=>L.name===V);if(N&&tW6(N)&&!KH9(N))q4.write(H8.yellow(`Warning: '--${V}' flag is deprecated
6357
6357
  `))}),H.args.length>0)GH9(M,H);await Su1(M,B,H)});let U=new cm("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(F)=>{await MH9(F.outputDir,F.includeFullLogs)});J.addCommand(U);let W=new cm("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(F)=>{await DH9(F.version)});return J.addCommand(W),J}async function aJ1(J,Q){let{thread:Z,visibility:X}=Q,Y=Z?.id??Qq(),K=rJ1(J);if(Z)await J.threadStorage.set(Y,Z);let q=await uJ.getOrCreateForThread(K,Y);if(X)await J.threadSyncService.updateThreadMeta(Y,J51(X));let G=J.threadService.observe(Y).subscribe(async(z)=>{if(a7(z,"assistant"))await vu1(Y),G.unsubscribe()});return await q.resume(),q}async function Su1(J,Q,Z){let X=e71(Q);if(X instanceof Error)HX(X.message);let Y,K=null;if(Q.streamJsonInput)Y="";else if(typeof Q.execute==="string"){Y=Q.execute;let R=(await Ey1()).trimEnd();if(R)K=R}else Y=(await Ey1()).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"
6358
6358
  Or pipe via stdin: echo "your message" | amp --execute`);KB(Z,Q);let q=await qB(J,Q);QF6=q;let G=rJ1(q),z=async(R)=>{let O=await JF6(R,"utf-8"),j=JSON.parse(O);if(!UW(j.id))throw new m9(hK.invalidThreadId);return aJ1(q,{visibility:X,thread:j})},U=async(R)=>{if(!UW(R))throw new m9(hK.invalidThreadId);let O=await q.threadService.get(R)??void 0;if(l.info(`[fetchAndStartThread] Loaded thread ${R}, agentMode: ${O?.agentMode??"undefined"}`),O?.agentMode)l.info(`[fetchAndStartThread] Setting runtime override for agentMode to: ${O.agentMode}`),aG("experimental.agentMode",O.agentMode);else l.info("[fetchAndStartThread] No agentMode on thread, not setting override");return aJ1(q,{visibility:X,thread:O})},W=async()=>{try{if(Q.threadId)return U(Q.threadId);else return aJ1(q,{visibility:X})}catch(R){if(R instanceof m9)throw R;throw await b71(R,Q.threadId),Error("handleError should have called process.exit()")}},F=async()=>{return aJ1(q,{visibility:X})};if(Q.format==="jsonl")q4.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
6359
- `),await ew(),process.exit(1);if(J.executeMode&&Q.remote)await TZ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await W();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 $r1();let R=await TO({jetbrainsOnly:Q.jetbrains});if(R.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(R.length===1){let O=R[0];if(O)_5.selectConfig(O)}else B=!0}let V=wy1("0.0.1760745707-g3750ff",q.settingsStorage),N=e1.of([j0.file(process.cwd())]),L=XS(void 0,N);if(Y)H.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let A=await X5.getUserFreeTierStatus({},{config:q.configService});l.info("User free tier status:",A);let w=await kZ6();l.info("Loaded session state:",w),await sW6({stdout:process.stdout,history:new ob1,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadSyncService:q.threadSyncService,threadID:H.threadID,worker:H,workerDeps:G,configService:q.configService,internalAPIClient:X5,ampURL:J.ampURL,startNewThread:F,pickAndContinueThread:async()=>{l.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:_5,connectedClientsService:new Qc,commandRegistry:L,showJetBrainsInstaller:M,showIdePicker:B,startWithPicker:Q.startWithPicker,updateService:V,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:w,freeTierStatus:A.ok?A.result:void 0}),await q.asyncDispose(),process.exit(0)}async function NY(J){if(J.interactive)q4.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
6360
- `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await pU(J.settingsFile),Y=dU({...J,settingsFile:X,getHook:process.env.AMP_URL?(G,z)=>{if(G==="url")return Promise.resolve(process.env.AMP_URL);return z()}:void 0});if(await _Z6(Y),await xZ6(Y),J.mcpConfig){let G=await wZ6(J.mcpConfig);Y=XH9(Y,G)}let K=await Y.get("url","global");if(!K)K=WZ;if(!LB(K))l.info("Targeting custom Amp server",{ampURL:K});if(Y=jl1(Y),await Y.get("debug.httpLogging"))wl1();return{executeMode:Q,isTTY:Z,ampURL:K,settings:Y,secrets:CZ6(await Wy1(J,Y))}}function WH9(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 FH9(){let J=WH9(process.argv);if(SJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),QH9(l),l.info("Starting Amp CLI.",{version:"0.0.1760745707-g3750ff",buildTimestamp:"2025-10-18T00:06:47.460Z",buildType:"'release'"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new m9(hK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await UH9().parseAsync(process.argv)}FH9().catch(b71);async function HH9(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}
6359
+ `),await ew(),process.exit(1);if(J.executeMode&&Q.remote)await TZ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await W();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 $r1();let R=await TO({jetbrainsOnly:Q.jetbrains});if(R.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(R.length===1){let O=R[0];if(O)_5.selectConfig(O)}else B=!0}let V=wy1("0.0.1760760095-g8b384e",q.settingsStorage),N=e1.of([j0.file(process.cwd())]),L=XS(void 0,N);if(Y)H.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let A=await X5.getUserFreeTierStatus({},{config:q.configService});l.info("User free tier status:",A);let w=await kZ6();l.info("Loaded session state:",w),await sW6({stdout:process.stdout,history:new ob1,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadSyncService:q.threadSyncService,threadID:H.threadID,worker:H,workerDeps:G,configService:q.configService,internalAPIClient:X5,ampURL:J.ampURL,startNewThread:F,pickAndContinueThread:async()=>{l.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:_5,connectedClientsService:new Qc,commandRegistry:L,showJetBrainsInstaller:M,showIdePicker:B,startWithPicker:Q.startWithPicker,updateService:V,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:w,freeTierStatus:A.ok?A.result:void 0}),await q.asyncDispose(),process.exit(0)}async function NY(J){if(J.interactive)q4.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
6360
+ `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await pU(J.settingsFile),Y=dU({...J,settingsFile:X,getHook:process.env.AMP_URL?(G,z)=>{if(G==="url")return Promise.resolve(process.env.AMP_URL);return z()}:void 0});if(await _Z6(Y),await xZ6(Y),J.mcpConfig){let G=await wZ6(J.mcpConfig);Y=XH9(Y,G)}let K=await Y.get("url","global");if(!K)K=WZ;if(!LB(K))l.info("Targeting custom Amp server",{ampURL:K});if(Y=jl1(Y),await Y.get("debug.httpLogging"))wl1();return{executeMode:Q,isTTY:Z,ampURL:K,settings:Y,secrets:CZ6(await Wy1(J,Y))}}function WH9(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 FH9(){let J=WH9(process.argv);if(SJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),QH9(l),l.info("Starting Amp CLI.",{version:"0.0.1760760095-g8b384e",buildTimestamp:"2025-10-18T04:06:54.103Z",buildType:"'release'"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new m9(hK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await UH9().parseAsync(process.argv)}FH9().catch(b71);async function HH9(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}
6361
6361
  `);else if(!LB(J.ampURL))s2.write(`Logging in to ${new URL(J.ampURL).hostname}
6362
6362
  `);let Z=process.env.AMP_API_KEY;if(Z)s2.write(`API key found in environment variable, storing...
6363
6363
  `),await Q.set("apiKey",Z,J.ampURL),s2.write(`API key successfully stored.
@@ -6373,7 +6373,7 @@ Or pipe via stdin: echo "your message" | amp --execute`);KB(Z,Q);let q=await qB(
6373
6373
  `));try{let Q;if(J)Q=J,q4.write(H8.blue(`Updating to version ${J}...
6374
6374
  `)),await HC(J),q4.write(H8.green(`✓ Successfully updated to version ${J}
6375
6375
  `));else{q4.write(H8.blue(`Checking for updates...
6376
- `));let{hasUpdate:X,latestVersion:Y}=await uj("0.0.1760745707-g3750ff");if(!X)q4.write(H8.green(`✓ Amp CLI is already up to date.
6376
+ `));let{hasUpdate:X,latestVersion:Y}=await uj("0.0.1760760095-g8b384e");if(!X)q4.write(H8.green(`✓ Amp CLI is already up to date.
6377
6377
  `)),process.exit(0);if(!Y)q4.write(H8.yellow("[WARN] could not find latest version")),process.exit(0);Q=Y,q4.write(H8.blue(`Updating to version ${Y}...
6378
6378
  `)),await HC(Y),q4.write(H8.green(`✓ Successfully updated to version ${Y}
6379
6379
  `))}let Z=await GR(Q);if(Z.warning)q4.write(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1760745707-g3750ff",
3
+ "version": "0.0.1760760095-g8b384e",
4
4
  "description": "CLI for Amp, an agentic coding tool built by Sourcegraph.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {