@sourcegraph/amp 0.0.1760086165-g317e3a → 0.0.1760086382-g317e3a

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
@@ -5869,7 +5869,7 @@ See https://ampcode.com/manual#toolboxes`);return Q[0]||Sw}function FZ6(J,Q){let
5869
5869
  `);J.command("use").argument("<tool-name>","The tool to invoke").summary("Invoke a tool with arguments or JSON input from stdin").description(Z).option("--only <field>","Extract only the specified field from the result").allowUnknownOption(!0).allowExcessArguments(!0).action(async function(X,Y,K){let q=K.optsWithGlobals(),G=await Q(K,q),z=0;await G.mcpService.initialized;let U=K.args.slice(1),W;if(UZ6()){let F=[];for await(let H of process.stdin)F.push(H);W=Buffer.concat(F).toString("utf-8").trim()}await GZ6({toolName:X,rawArgs:U,stdinInput:W,only:Y.only,threadDeps:G,stdout:process.stdout,stderr:process.stderr,exit:(F)=>{z=F}}),await G.asyncDispose(),G.cleanupTerminal(),process.exit(z)})}W0();xE();import{homedir as SW9}from"node:os";import Ip from"node:path";wj();i2();eN();I2();QL();g6();S0();function HZ6(J){let Q=J.trim();if(Q==="quit"||Q==="exit")return"/quit";return J}W0();eN();import p79 from"node:fs";import BZ6 from"node:path";function DZ6(J){let Q=J.trim().replace(/^["']|["']$/g,"");if(Q=Q.replace(/\\(.)/g,"$1"),!/\.(png|jpe?g|gif|webp)$/i.test(Q))return null;if(!BZ6.isAbsolute(Q))return null;return l.debug("Extracted image path",{original:J,extracted:Q}),Q}function MZ6(J){try{let Q=BZ6.extname(J).toLowerCase(),Z=st1(Q);if(!Z)return l.warn("Unsupported image file extension",{ext:Q}),null;try{let X=p79.readFileSync(J);return d79(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 d79(J,Q){if(J.length>lO)return l.warn(`Image file too large: ${J.length} bytes (max: ${lO})`),null;return{type:"image",source:{type:"base64",data:J.toString("base64"),mediaType:Q}}}import{execSync as gY6}from"node:child_process";import{rmdir as _X9}from"node:fs/promises";import{tmpdir as xX9}from"node:os";import mY6 from"node:path";dO();W0();import{spawn as c79}from"node:child_process";import{promises as l79}from"node:fs";function VZ6(J){return J.kind==="executable"}function NZ6(J){return J.kind==="markdown"}var bH=50000,LZ6=300000;async function zy1(J,Q,Z,X={}){let{timeoutMs:Y=LZ6,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}),NZ6(q))return await i79(q,Q);else if(VZ6(q))return await n79(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 i79(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await l79.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>bH?Z.slice(0,bH)+`
5870
5870
  ... (output truncated at ${bH} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function n79(J,Q,Z=LZ6,X){return new Promise((Y)=>{let[K,q]=a79(J,Q);l.debug("Spawning command",{spawnCommand:K,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Z});let G=it1(X),z=!1,U=setTimeout(()=>{z=!0,G.abort(),l.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),W=c79(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<=bH)F.push(V);else{let N=bH-(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<=bH)H.push(V);else{let N=bH-(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?`
5871
5871
  ${L}`:L;if(B>bH)A+=`
5872
- ... (output truncated at ${bH} 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 a79(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return s79(Z,X?[...X]:null,Y,Q);else return r79(Z,X?[...X]:null,Y,Q)}function r79(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function s79(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]}}W0();xE();wj();i2();EN();Xq();vW();g6();S0();import{mkdtemp as bX9,readFile as yX9,unlink as fX9,writeFile as cA2}from"fs/promises";var d71={};A6(d71,{scrollUp:()=>V59,scrollDown:()=>N59,link:()=>j59,image:()=>$59,iTerm:()=>E59,exitAlternativeScreen:()=>w59,eraseUp:()=>M59,eraseStartLine:()=>B59,eraseScreen:()=>Uy1,eraseLines:()=>F59,eraseLine:()=>OZ6,eraseEndLine:()=>H59,eraseDown:()=>D59,enterAlternativeScreen:()=>R59,cursorUp:()=>RZ6,cursorTo:()=>e79,cursorShow:()=>W59,cursorSavePosition:()=>Y59,cursorRestorePosition:()=>K59,cursorPrevLine:()=>z59,cursorNextLine:()=>G59,cursorMove:()=>J59,cursorLeft:()=>wZ6,cursorHide:()=>U59,cursorGetPosition:()=>q59,cursorForward:()=>Z59,cursorDown:()=>Q59,cursorBackward:()=>X59,clearTerminal:()=>A59,clearScreen:()=>L59,beep:()=>O59});import Wy1 from"node:process";var p71=globalThis.window?.document!==void 0,a32=globalThis.process?.versions?.node!==void 0,r32=globalThis.process?.versions?.bun!==void 0,s32=globalThis.Deno?.version?.deno!==void 0,o32=globalThis.process?.versions?.electron!==void 0,t32=globalThis.navigator?.userAgent?.includes("jsdom")===!0,e32=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,JL2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,QL2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,ZL2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,ju=globalThis.navigator?.userAgentData?.platform,XL2=ju==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",YL2=ju==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",KL2=ju==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",qL2=ju==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),GL2=ju==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var z2="\x1B[",Eu="\x1B]",qC="\x07",$u=";",AZ6=!p71&&Wy1.env.TERM_PROGRAM==="Apple_Terminal",o79=!p71&&Wy1.platform==="win32",t79=p71?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:Wy1.cwd,e79=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return z2+(J+1)+"G";return z2+(Q+1)+$u+(J+1)+"H"},J59=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=z2+-J+"D";else if(J>0)Z+=z2+J+"C";if(Q<0)Z+=z2+-Q+"A";else if(Q>0)Z+=z2+Q+"B";return Z},RZ6=(J=1)=>z2+J+"A",Q59=(J=1)=>z2+J+"B",Z59=(J=1)=>z2+J+"C",X59=(J=1)=>z2+J+"D",wZ6=z2+"G",Y59=AZ6?"\x1B7":z2+"s",K59=AZ6?"\x1B8":z2+"u",q59=z2+"6n",G59=z2+"E",z59=z2+"F",U59=z2+"?25l",W59=z2+"?25h",F59=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=OZ6+(Z<J-1?RZ6():"");if(J)Q+=wZ6;return Q},H59=z2+"K",B59=z2+"1K",OZ6=z2+"2K",D59=z2+"J",M59=z2+"1J",Uy1=z2+"2J",V59=z2+"S",N59=z2+"T",L59="\x1Bc",A59=o79?`${Uy1}${z2}0f`:`${Uy1}${z2}3J${z2}H`,R59=z2+"?1049h",w59=z2+"?1049l",O59=qC,j59=(J,Q)=>[Eu,"8",$u,$u,Q,qC,J,Eu,"8",$u,$u,qC].join(""),$59=(J,Q={})=>{let Z=`${Eu}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")+qC},E59={setCwd:(J=t79())=>`${Eu}50;CurrentDir=${J}${qC}`,annotation(J,Q={}){let Z=`${Eu}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+qC}};var c71=S6(CZ6(),1);function xV(J,Q,{target:Z="stdout",...X}={}){if(!c71.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (​${Q}​)`}return d71.link(J,Q)}xV.isSupported=c71.default.stdout;xV.stderr=(J,Q,Z={})=>xV(J,Q,{target:"stderr",...Z});xV.stderr.isSupported=c71.default.stderr;W0();Xq();class My1{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.1760086165-g317e3a"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await A80(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}}W0();class l71 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}class zQ{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function SZ6(J){if(J instanceof l71)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof zQ)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 uV=null,hX9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(uV)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(() => (Tb1(),FJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{uV=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});uV=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{uV=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(() => S6(Uf1(),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 zQ(`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(!uV)return new zQ("Not connected to Amp web interface");try{uV.disconnect();let Z=uV.clientID;return uV=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new zQ(`Disconnected from Amp web interface
5872
+ ... (output truncated at ${bH} 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 a79(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return s79(Z,X?[...X]:null,Y,Q);else return r79(Z,X?[...X]:null,Y,Q)}function r79(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function s79(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]}}W0();xE();wj();i2();EN();Xq();vW();g6();S0();import{mkdtemp as bX9,readFile as yX9,unlink as fX9,writeFile as cA2}from"fs/promises";var d71={};A6(d71,{scrollUp:()=>V59,scrollDown:()=>N59,link:()=>j59,image:()=>$59,iTerm:()=>E59,exitAlternativeScreen:()=>w59,eraseUp:()=>M59,eraseStartLine:()=>B59,eraseScreen:()=>Uy1,eraseLines:()=>F59,eraseLine:()=>OZ6,eraseEndLine:()=>H59,eraseDown:()=>D59,enterAlternativeScreen:()=>R59,cursorUp:()=>RZ6,cursorTo:()=>e79,cursorShow:()=>W59,cursorSavePosition:()=>Y59,cursorRestorePosition:()=>K59,cursorPrevLine:()=>z59,cursorNextLine:()=>G59,cursorMove:()=>J59,cursorLeft:()=>wZ6,cursorHide:()=>U59,cursorGetPosition:()=>q59,cursorForward:()=>Z59,cursorDown:()=>Q59,cursorBackward:()=>X59,clearTerminal:()=>A59,clearScreen:()=>L59,beep:()=>O59});import Wy1 from"node:process";var p71=globalThis.window?.document!==void 0,a32=globalThis.process?.versions?.node!==void 0,r32=globalThis.process?.versions?.bun!==void 0,s32=globalThis.Deno?.version?.deno!==void 0,o32=globalThis.process?.versions?.electron!==void 0,t32=globalThis.navigator?.userAgent?.includes("jsdom")===!0,e32=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,JL2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,QL2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,ZL2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,ju=globalThis.navigator?.userAgentData?.platform,XL2=ju==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",YL2=ju==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",KL2=ju==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",qL2=ju==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),GL2=ju==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var z2="\x1B[",Eu="\x1B]",qC="\x07",$u=";",AZ6=!p71&&Wy1.env.TERM_PROGRAM==="Apple_Terminal",o79=!p71&&Wy1.platform==="win32",t79=p71?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:Wy1.cwd,e79=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return z2+(J+1)+"G";return z2+(Q+1)+$u+(J+1)+"H"},J59=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=z2+-J+"D";else if(J>0)Z+=z2+J+"C";if(Q<0)Z+=z2+-Q+"A";else if(Q>0)Z+=z2+Q+"B";return Z},RZ6=(J=1)=>z2+J+"A",Q59=(J=1)=>z2+J+"B",Z59=(J=1)=>z2+J+"C",X59=(J=1)=>z2+J+"D",wZ6=z2+"G",Y59=AZ6?"\x1B7":z2+"s",K59=AZ6?"\x1B8":z2+"u",q59=z2+"6n",G59=z2+"E",z59=z2+"F",U59=z2+"?25l",W59=z2+"?25h",F59=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=OZ6+(Z<J-1?RZ6():"");if(J)Q+=wZ6;return Q},H59=z2+"K",B59=z2+"1K",OZ6=z2+"2K",D59=z2+"J",M59=z2+"1J",Uy1=z2+"2J",V59=z2+"S",N59=z2+"T",L59="\x1Bc",A59=o79?`${Uy1}${z2}0f`:`${Uy1}${z2}3J${z2}H`,R59=z2+"?1049h",w59=z2+"?1049l",O59=qC,j59=(J,Q)=>[Eu,"8",$u,$u,Q,qC,J,Eu,"8",$u,$u,qC].join(""),$59=(J,Q={})=>{let Z=`${Eu}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")+qC},E59={setCwd:(J=t79())=>`${Eu}50;CurrentDir=${J}${qC}`,annotation(J,Q={}){let Z=`${Eu}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+qC}};var c71=S6(CZ6(),1);function xV(J,Q,{target:Z="stdout",...X}={}){if(!c71.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (​${Q}​)`}return d71.link(J,Q)}xV.isSupported=c71.default.stdout;xV.stderr=(J,Q,Z={})=>xV(J,Q,{target:"stderr",...Z});xV.stderr.isSupported=c71.default.stderr;W0();Xq();class My1{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.1760086382-g317e3a"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await A80(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}}W0();class l71 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}class zQ{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function SZ6(J){if(J instanceof l71)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof zQ)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 uV=null,hX9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(uV)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(() => (Tb1(),FJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{uV=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});uV=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{uV=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(() => S6(Uf1(),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 zQ(`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(!uV)return new zQ("Not connected to Amp web interface");try{uV.disconnect();let Z=uV.clientID;return uV=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new zQ(`Disconnected from Amp web interface
5873
5873
  Client ID: ${Z}
5874
5874
  Server will clean up automatically within 60 seconds`)}catch(Z){return Error(`Failed to disconnect: ${Z.message}`)}}}};class Wf1{configService;commands;customRegistry;latestCustom=[];telemetrySubmitter;constructor(J=dC(),Q){this.configService=Q;this.customRegistry=J,this._initBaseCommands(!1),this.customRegistry.commands.subscribe((Z)=>this.latestCustom=Z),this.telemetrySubmitter=new My1(async()=>{try{return(await this.configService.getLatest()).settings["experimental.cli.commandTelemetry.enabled"]===!0}catch{return!1}},this.configService),this.configService.config.pipe(P0((Z)=>Z.settings["internal.modes"]),M8()).subscribe((Z)=>{this._initBaseCommands(Z??!1)})}_initBaseCommands(J){if(this.commands={...gX9},process.env.AMP_CONNECT==="1")Object.assign(this.commands,hX9);if(J)Object.assign(this.commands,mX9)}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 zy1(J,Z,this.customRegistry,{signal:X});if(q.success)if(K?.kind==="markdown"){Q.editorDispatch({type:"set-input",input:q.output});return}else{Q.worker.handle({type:"user:message",message:{content:[{type:"text",text:q.output}]}});return}return Error(q.error??`Command '${J}' failed`)}query(J,Q,Z){let X=J.toLowerCase(),Y=Object.values(this.commands).filter((q)=>q.name.toLowerCase().includes(X)).filter((q)=>{if(!Q||!q.isVisible)return!0;return q.isVisible(Q,Z)}),K=this.latestCustom.filter((q)=>q.available&&q.name.toLowerCase().includes(X)).map((q)=>({name:q.name,description:"Custom command",requiresArgs:q.kind==="executable",execute:(G,z)=>this.execute(q.name,G,z??[])}));return[...Y,...K]}async cleanup(){await this.telemetrySubmitter.dispose()}get(J){let Q=this.commands[J];if(Q)return Q;let Z=this.latestCustom.find((X)=>X.name===J);return{name:J,description:"Custom command",requiresArgs:Z?.kind==="executable",execute:(X,Y)=>this.execute(J,X,Y??[])}}}var gX9={"generate-agent-file":{name:"generate-agent-file",description:`Generate an ${T5} file in the current workspace`,execute:async(J,Q)=>{J.worker.handle({type:"user:message",message:{content:[{type:"text",text:v80}]}});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 l71;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")}}},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 bX9(mY6.join(xX9(),"amp-edit-")),Y=mY6.join(X,"message.amp.md");gY6(`${Z} "${Y}"`,{stdio:"inherit"}),process.stdout.write("\x1B[?25l");try{let q=(await yX9(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 fX9(Y),await _X9(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 sU("dangerouslyAllowAll",!1),new zQ("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 sU("dangerouslyAllowAll",!0),new zQ("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 YC();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:YC};await g71(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},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 zQ(`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(`
5875
5875
  `).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=dk(new URL(Y),Z.id).toString(),G=`Thread URL: ${xV(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 zQ(`${G}
@@ -6071,7 +6071,7 @@ ${Q}`),this.textController.clear(),this.textController.insertText(this.pendingTr
6071
6071
  `),J.stdout.write(`Thread: ${H}
6072
6072
  `),J.stdout.write(`Continue this thread with: amp threads continue ${W}
6073
6073
  `)}}function _U6(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 _1.index(Z[X])}vf1();if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){Z4.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
6074
- `)}var um1=mm1.join(Vc1||mm1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function yW9(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 sH(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")sU("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new O2("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${G8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")sU("experimental.agentMode",Q.agentMode)}var fW9=A0.union([A0.object({command:A0.string(),args:A0.array(A0.string()).optional(),env:A0.record(A0.string(),A0.string()).optional()}).strict(),A0.object({url:A0.string()}).strict()]),hW9=A0.record(A0.string(),fW9);async function dm1(J){try{await _W9(mm1.dirname(um1),{recursive:!0}),await xW9(um1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function gW9(){try{return(await mU6(um1,"utf-8")).trim()}catch(J){return null}}async function mW9(J){let Q;try{Q=JSON.parse(J)}catch(Z){throw Error(`Failed to parse --mcp-config as JSON: ${Z instanceof Error?Z.message:String(Z)}`)}try{return hW9.parse(Q)}catch(Z){if(Z instanceof A0.ZodError){let X=Z.issues.map((Y)=>`${Y.path.join(".")}: ${Y.message}`).join(", ");throw Error(`Invalid MCP server configuration: ${X}`)}throw Error(`Failed to validate MCP server configuration: ${String(Z)}`)}}function uW9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z)||{},Y={};if(typeof X==="object")for(let[K,q]of Object.entries(X))Y[K]={...q,_target:"global"};for(let[K,q]of Object.entries(Q))Y[K]={...q,_target:"workspace"};return Y}return J.get(Z)},async keys(){let Z=await J.keys();if(!Z.includes("mcpServers"))Z.push("mcpServers");return Z},[Symbol.dispose](){J[Symbol.dispose]()}}}var fU6=[{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??V5,description:`Custom settings file path (overrides the default location ${V5})`},{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 ${Nb1})`},{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:AG(),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:sb1(),hidden:!0,description:(J)=>J?"Enable IDE connection. 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:GO}],hU6=(J)=>("deprecated"in J)&&J.deprecated===!0,pW9=(J)=>("hidden"in J)&&J.hidden===!0,dW9=(J)=>("default"in J),cW9=(J)=>("default"in J)?J.default:void 0;function lW9(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 O2(vK.unknownCommand(Z),1,q)}}var uU6=null;function Wr2(){return uU6}function TJ1(J){return{...J,getThreadEnvironment:H71,vfs:D20({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new J_(J.fileSystem),generateThreadTitle:bq0,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var cm1=I0.file(bW9.homedir()),pU6=process.env.XDG_CONFIG_HOME?I0.file(process.env.XDG_CONFIG_HOME):d0.joinPath(cm1,".config");async function oH(J,Q){Fi1("0.0.1760086165-g317e3a");let Z=TZ1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:e1.of([I0.file(process.cwd())]),defaultAmpURL:J.ampURL,defaultCacheDirectory:Vb1,homeDir:cm1,userConfigDir:pU6}),X=await Z.getLatest();l.debug("Global configuration initialized",{hasCacheDirectory:!!X.settings.cacheDirectory,settingsKeys:Object.keys(X.settings)});let Y=ln(QO({configService:Z})),K=c90({configService:Z,toolService:Y}),q=Fw0(Y,y9,Oe).catch((N)=>{l.warn("Toolbox registration failed, continuing anyway:",N)}),G=K.initialized.catch((N)=>{l.warn("MCP service initialization failed, continuing anyway:",N)});if(J.executeMode)await Promise.all([G,q]);if(Q.jetbrains)YO("JetBrains");else if(Q.ide&&sb1())YO("VS Code");else if(Q.ide&&DQ6())YO("Neovim");if(W96(Y,{configService:Z}),Q.jetbrains||Q.ide)Y.registerTool(ur);let z;if(!J.executeMode)z=new I71(process.cwd(),{},!0);else z=new class extends I71{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(c2.write(`No API key found. Starting login flow...
6074
+ `)}var um1=mm1.join(Vc1||mm1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function yW9(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 sH(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")sU("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new O2("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${G8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")sU("experimental.agentMode",Q.agentMode)}var fW9=A0.union([A0.object({command:A0.string(),args:A0.array(A0.string()).optional(),env:A0.record(A0.string(),A0.string()).optional()}).strict(),A0.object({url:A0.string()}).strict()]),hW9=A0.record(A0.string(),fW9);async function dm1(J){try{await _W9(mm1.dirname(um1),{recursive:!0}),await xW9(um1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function gW9(){try{return(await mU6(um1,"utf-8")).trim()}catch(J){return null}}async function mW9(J){let Q;try{Q=JSON.parse(J)}catch(Z){throw Error(`Failed to parse --mcp-config as JSON: ${Z instanceof Error?Z.message:String(Z)}`)}try{return hW9.parse(Q)}catch(Z){if(Z instanceof A0.ZodError){let X=Z.issues.map((Y)=>`${Y.path.join(".")}: ${Y.message}`).join(", ");throw Error(`Invalid MCP server configuration: ${X}`)}throw Error(`Failed to validate MCP server configuration: ${String(Z)}`)}}function uW9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z)||{},Y={};if(typeof X==="object")for(let[K,q]of Object.entries(X))Y[K]={...q,_target:"global"};for(let[K,q]of Object.entries(Q))Y[K]={...q,_target:"workspace"};return Y}return J.get(Z)},async keys(){let Z=await J.keys();if(!Z.includes("mcpServers"))Z.push("mcpServers");return Z},[Symbol.dispose](){J[Symbol.dispose]()}}}var fU6=[{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??V5,description:`Custom settings file path (overrides the default location ${V5})`},{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 ${Nb1})`},{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:AG(),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:sb1(),hidden:!0,description:(J)=>J?"Enable IDE connection. 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:GO}],hU6=(J)=>("deprecated"in J)&&J.deprecated===!0,pW9=(J)=>("hidden"in J)&&J.hidden===!0,dW9=(J)=>("default"in J),cW9=(J)=>("default"in J)?J.default:void 0;function lW9(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 O2(vK.unknownCommand(Z),1,q)}}var uU6=null;function Wr2(){return uU6}function TJ1(J){return{...J,getThreadEnvironment:H71,vfs:D20({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new J_(J.fileSystem),generateThreadTitle:bq0,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var cm1=I0.file(bW9.homedir()),pU6=process.env.XDG_CONFIG_HOME?I0.file(process.env.XDG_CONFIG_HOME):d0.joinPath(cm1,".config");async function oH(J,Q){Fi1("0.0.1760086382-g317e3a");let Z=TZ1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:e1.of([I0.file(process.cwd())]),defaultAmpURL:J.ampURL,defaultCacheDirectory:Vb1,homeDir:cm1,userConfigDir:pU6}),X=await Z.getLatest();l.debug("Global configuration initialized",{hasCacheDirectory:!!X.settings.cacheDirectory,settingsKeys:Object.keys(X.settings)});let Y=ln(QO({configService:Z})),K=c90({configService:Z,toolService:Y}),q=Fw0(Y,y9,Oe).catch((N)=>{l.warn("Toolbox registration failed, continuing anyway:",N)}),G=K.initialized.catch((N)=>{l.warn("MCP service initialization failed, continuing anyway:",N)});if(J.executeMode)await Promise.all([G,q]);if(Q.jetbrains)YO("JetBrains");else if(Q.ide&&sb1())YO("VS Code");else if(Q.ide&&DQ6())YO("Neovim");if(W96(Y,{configService:Z}),Q.jetbrains||Q.ide)Y.registerTool(ur);let z;if(!J.executeMode)z=new I71(process.cwd(),{},!0);else z=new class extends I71{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(c2.write(`No API key found. Starting login flow...
6075
6075
  `),!await iW9(J))await cR(),process.exit(1)}let U=await A20({isDevelopment:!1}),W=new MH1(U),F=new BH1(U,Z,{lazy:!0}),H=Q.notifications!==void 0?Q.notifications:!J.executeMode,B=H96({playNotificationSound:async(N)=>{if(H){F96(N);let L=Cf1(),A=Sf1();if((!L||A)&&X.settings["notifications.system.enabled"]!==!1){if(N==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(N==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:W,configService:Z});l.info("Starting Amp background services");let M=P20({threadService:W,threadHistoryService:F,configService:Z,isExtensionDevelopment:!1}),V={configService:Z,toolService:Y,mcpService:K,threadService:W,threadHistoryService:F,threadSyncService:M,threadStorage:U,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:z,notificationService:B,fileSystem:Q.jetbrains||Q.ide?F20:y9};return{...V,async asyncDispose(){await V.mcpService.dispose(),await V.threadService.asyncDispose(),V.configService.unsubscribe(),V.toolService.dispose(),V.fuzzyServer.dispose(),V.threadSyncService.dispose(),V.settingsStorage[Symbol.dispose]()}}}async function iW9(J){if(!J.executeMode){if(!await Yy1("Would you like to log in to Amp? [(y)es, (n)o]: "))return c2.write(`Login cancelled. Run the command again to retry.
6076
6076
  `),!1}return await dU6(J)}async function dU6(J){let Q=kW9(32).toString("hex"),Z=await Xy1(J.ampURL,Q);try{await hU(Z)}catch(Y){l.error("Failed to open browser",{error:Y})}let X=await Xy1(J.ampURL,Q,!1);c2.write(`If your browser did not open automatically, visit:
6077
6077
 
@@ -6081,12 +6081,12 @@ ${G8.blue.bold(X)}
6081
6081
  Login successful! You can now use the Amp CLI.
6082
6082
  `),!0}catch(Y){return l.error("Login failed",{error:Y}),Z4.write(`
6083
6083
  Login failed: ${Y instanceof Error?Y.message:String(Y)}
6084
- `),!1}}function nW9(){let J=new km().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)iR(),process.exit(0);let H=F.originalError??F;DJ6(H)}),J.option("-V, --version","output the version number",()=>{c2.write(`0.0.1760086165-g317e3a (released 2025-10-10T08:54:42.433Z)
6085
- `),process.exit(0)}),J.addHelpText("after",FQ6()),J.configureHelp({formatHelp:HQ6}),J.command("logout").description("Log out by removing stored API key").action(async(F,H)=>{let B=H.optsWithGlobals(),M=await qY(B);await oW9(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 qY(B);await sW9(M,await cb1(B,M.settings))});let Q=async(F,H,B)=>{TZ1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:e1.of([I0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:cm1,userConfigDir:pU6});let M={...H,executeMode:!1};await pm1(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 qY(B);await gU6(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 qY(B);await YF9(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 qY(M);if(H.pick)await Q(M,V,B);else await XF9(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 qY(M);await ZF9(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 qY(B);await gU6(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 qY(M);await QF9(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 qY(M);await JF9(M,V,F,B)}),FZ6(J,async(F,H)=>{let B=await qY(H);sH(F,H);let M=await oH(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,cleanupTerminal:iR,asyncDispose:M.asyncDispose.bind(M)}}),uQ6(J),xQ6(J,async(F)=>{let H=await qY(F);return{settings:H.settings,getThreadDeps:async(B)=>{sH(B,F);let M=await oH(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 qY(B);sH(H,B);let V=await oH(M,B);try{await Pb1(V,V.configService,{})}finally{await V.asyncDispose(),await iR()}});let X=new km().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 tb1(F.force||!1,F.verbose||!1,"0.0.1760086165-g317e3a"),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 OV(H,V),L=cW9(F);if(L)N.default(L);if(N.hidden=pW9(F)||hU6(F),"choices"in F)N.choices([...F.choices]);return N}for(let F of fU6)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 OV("-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 OV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1);J.addOption(F)}let q=new OV("--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 OV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(G);let z=new OV("--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 OV("--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 qY(B);if(Object.keys(B).forEach((V)=>{let N=fU6.find((L)=>L.name===V);if(N&&hU6(N)&&!dW9(N))Z4.write(G8.yellow(`Warning: '--${V}' flag is deprecated
6084
+ `),!1}}function nW9(){let J=new km().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)iR(),process.exit(0);let H=F.originalError??F;DJ6(H)}),J.option("-V, --version","output the version number",()=>{c2.write(`0.0.1760086382-g317e3a (released 2025-10-10T08:58:55.074Z)
6085
+ `),process.exit(0)}),J.addHelpText("after",FQ6()),J.configureHelp({formatHelp:HQ6}),J.command("logout").description("Log out by removing stored API key").action(async(F,H)=>{let B=H.optsWithGlobals(),M=await qY(B);await oW9(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 qY(B);await sW9(M,await cb1(B,M.settings))});let Q=async(F,H,B)=>{TZ1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:e1.of([I0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:cm1,userConfigDir:pU6});let M={...H,executeMode:!1};await pm1(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 qY(B);await gU6(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 qY(B);await YF9(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 qY(M);if(H.pick)await Q(M,V,B);else await XF9(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 qY(M);await ZF9(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 qY(B);await gU6(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 qY(M);await QF9(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 qY(M);await JF9(M,V,F,B)}),FZ6(J,async(F,H)=>{let B=await qY(H);sH(F,H);let M=await oH(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,cleanupTerminal:iR,asyncDispose:M.asyncDispose.bind(M)}}),uQ6(J),xQ6(J,async(F)=>{let H=await qY(F);return{settings:H.settings,getThreadDeps:async(B)=>{sH(B,F);let M=await oH(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 qY(B);sH(H,B);let V=await oH(M,B);try{await Pb1(V,V.configService,{})}finally{await V.asyncDispose(),await iR()}});let X=new km().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 tb1(F.force||!1,F.verbose||!1,"0.0.1760086382-g317e3a"),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 OV(H,V),L=cW9(F);if(L)N.default(L);if(N.hidden=pW9(F)||hU6(F),"choices"in F)N.choices([...F.choices]);return N}for(let F of fU6)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 OV("-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 OV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1);J.addOption(F)}let q=new OV("--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 OV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(G);let z=new OV("--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 OV("--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 qY(B);if(Object.keys(B).forEach((V)=>{let N=fU6.find((L)=>L.name===V);if(N&&hU6(N)&&!dW9(N))Z4.write(G8.yellow(`Warning: '--${V}' flag is deprecated
6086
6086
  `))}),H.args.length>0)lW9(M,H);await pm1(M,B,H)});let U=new km("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 eW9(F.outputDir,F.includeFullLogs)});J.addCommand(U);let W=new km("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 tW9(F.version)});return J.addCommand(W),J}async function PJ1(J,Q){let{thread:Z,visibility:X}=Q,Y=Z?.id??iK(),K=TJ1(J);if(Z)await J.threadStorage.set(Y,Z);let q=await fJ.getOrCreateForThread(K,Y);if(X)await J.threadSyncService.updateThreadMeta(Y,f71(X));let G=J.threadService.observe(Y).subscribe(async(z)=>{if(d7(z,"assistant"))await dm1(Y),G.unsubscribe()});return await q.resume(),q}async function pm1(J,Q,Z){let X=y71(Q);if(X instanceof Error)GX(X.message);let Y,K=null;if(Q.streamJsonInput)Y="";else if(typeof Q.execute==="string"){Y=Q.execute;let R=(await Ky1()).trimEnd();if(R)K=R}else Y=(await Ky1()).trimEnd();if(Q.remote&&!J.executeMode)throw new O2("The -r/--remote flag currently only works with --execute mode",1,'Use: amp --remote --execute "your message"');if(Q.streamJson&&!J.executeMode)throw new O2("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(Q.streamJsonInput&&!J.executeMode)throw new O2("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(Q.streamJsonInput&&!Q.streamJson)throw new O2("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(Q.stats&&!J.executeMode)throw new O2("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 O2("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 O2("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"
6087
6087
  Or pipe via stdin: echo "your message" | amp --execute`);sH(Z,Q);let q=await oH(J,Q);uU6=q;let G=TJ1(q),z=async(R)=>{let w=await mU6(R,"utf-8"),O=JSON.parse(w);if(!ZW(O.id))throw new O2(vK.invalidThreadId);return PJ1(q,{visibility:X,thread:O})},U=async(R)=>{if(!ZW(R))throw new O2(vK.invalidThreadId);let w=await q.threadService.get(R)??void 0;return PJ1(q,{visibility:X,thread:w})},W=async()=>{try{if(Q.threadId)return U(Q.threadId);else return PJ1(q,{visibility:X})}catch(R){if(R instanceof O2)throw R;throw await L71(R,Q.threadId),Error("handleError should have called process.exit()")}},F=async()=>{return PJ1(q,{visibility:X})};if(Q.format==="jsonl")Z4.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
6088
- `),await cR(),process.exit(1);if(J.executeMode&&Q.remote)await pQ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await W();if(J.executeMode)await $J6(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 ka1();let R=await RO({jetbrainsOnly:Q.jetbrains});if(R.length===0)if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall");else $5.sendStatus({enabled:!0,connected:!1,authenticated:!1});else if(R.length===1){let w=R[0];if(w)$5.selectConfig(w)}else B=!0}let V=Qy1("0.0.1760086165-g317e3a",q.settingsStorage),N=e1.of([I0.file(process.cwd())]),L=dC(void 0,N);if(Y)H.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let A=await q.configService.getLatest();await yU6({stdout:process.stdout,history:new vb1,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadSyncService:q.threadSyncService,threadID:H.threadID,worker:H,workerDeps:G,configService:q.configService,internalAPIClient:_J,ampURL:J.ampURL,startNewThread:F,pickAndContinueThread:async()=>{l.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:$5,connectedClientsService:new _d,commandRegistry:L,showJetBrainsInstaller:M,showIdePicker:B,startWithPicker:Q.startWithPicker,updateService:V,debugWidgetTree:Q.debugWidgetTree,jetbrainsMode:Q.jetbrains,clientId:Q.clientId}),await q.asyncDispose(),process.exit(0)}async function qY(J){if(J.interactive)Z4.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
6089
- `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=!1,X=process.stdout.isTTY&&process.stderr.isTTY,Y=await bU(J.settingsFile),K=yU({...J,settingsFile:Y,getHook:process.env.AMP_URL?(z,U)=>{if(z==="url")return Promise.resolve(process.env.AMP_URL);return U()}:void 0});if(await cQ6(K),await lQ6(K),J.mcpConfig){let z=await mW9(J.mcpConfig);K=uW9(K,z)}let q=await K.get("url","global");if(!q)q=qZ;if(!XB(q))l.info("Targeting custom Amp server",{ampURL:q});if(K=hc1(K),await K.get("debug.httpLogging"))bc1();return{executeMode:Q,streamJsonMode:Z,isTTY:X,ampURL:q,settings:K,secrets:dQ6(await cb1(J,K))}}function aW9(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 rW9(){let J=aW9(process.argv);if(s56({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),yW9(l),l.info("Starting Amp CLI.",{version:"0.0.1760086165-g317e3a",buildTimestamp:"2025-10-10T08:54:42.433Z",buildType:"'release'"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new O2(vK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await nW9().parseAsync(process.argv)}rW9().catch(L71);async function sW9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),c2.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
6088
+ `),await cR(),process.exit(1);if(J.executeMode&&Q.remote)await pQ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await W();if(J.executeMode)await $J6(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 ka1();let R=await RO({jetbrainsOnly:Q.jetbrains});if(R.length===0)if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall");else $5.sendStatus({enabled:!0,connected:!1,authenticated:!1});else if(R.length===1){let w=R[0];if(w)$5.selectConfig(w)}else B=!0}let V=Qy1("0.0.1760086382-g317e3a",q.settingsStorage),N=e1.of([I0.file(process.cwd())]),L=dC(void 0,N);if(Y)H.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let A=await q.configService.getLatest();await yU6({stdout:process.stdout,history:new vb1,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadSyncService:q.threadSyncService,threadID:H.threadID,worker:H,workerDeps:G,configService:q.configService,internalAPIClient:_J,ampURL:J.ampURL,startNewThread:F,pickAndContinueThread:async()=>{l.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:$5,connectedClientsService:new _d,commandRegistry:L,showJetBrainsInstaller:M,showIdePicker:B,startWithPicker:Q.startWithPicker,updateService:V,debugWidgetTree:Q.debugWidgetTree,jetbrainsMode:Q.jetbrains,clientId:Q.clientId}),await q.asyncDispose(),process.exit(0)}async function qY(J){if(J.interactive)Z4.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
6089
+ `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=!1,X=process.stdout.isTTY&&process.stderr.isTTY,Y=await bU(J.settingsFile),K=yU({...J,settingsFile:Y,getHook:process.env.AMP_URL?(z,U)=>{if(z==="url")return Promise.resolve(process.env.AMP_URL);return U()}:void 0});if(await cQ6(K),await lQ6(K),J.mcpConfig){let z=await mW9(J.mcpConfig);K=uW9(K,z)}let q=await K.get("url","global");if(!q)q=qZ;if(!XB(q))l.info("Targeting custom Amp server",{ampURL:q});if(K=hc1(K),await K.get("debug.httpLogging"))bc1();return{executeMode:Q,streamJsonMode:Z,isTTY:X,ampURL:q,settings:K,secrets:dQ6(await cb1(J,K))}}function aW9(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 rW9(){let J=aW9(process.argv);if(s56({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),yW9(l),l.info("Starting Amp CLI.",{version:"0.0.1760086382-g317e3a",buildTimestamp:"2025-10-10T08:58:55.074Z",buildType:"'release'"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new O2(vK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await nW9().parseAsync(process.argv)}rW9().catch(L71);async function sW9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),c2.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
6090
6090
  `);else if(!XB(J.ampURL))c2.write(`Logging in to ${new URL(J.ampURL).hostname}
6091
6091
  `);let Z=process.env.AMP_API_KEY;if(Z)c2.write(`API key found in environment variable, storing...
6092
6092
  `),await Q.set("apiKey",Z,J.ampURL),c2.write(`API key successfully stored.
@@ -6102,7 +6102,7 @@ Or pipe via stdin: echo "your message" | amp --execute`);sH(Z,Q);let q=await oH(
6102
6102
  `));try{let Q;if(J)Q=J,Z4.write(G8.blue(`Updating to version ${J}...
6103
6103
  `)),await ZC(J),Z4.write(G8.green(`✓ Successfully updated to version ${J}
6104
6104
  `));else{Z4.write(G8.blue(`Checking for updates...
6105
- `));let{hasUpdate:X,latestVersion:Y}=await Sj("0.0.1760086165-g317e3a");if(!X)Z4.write(G8.green(`✓ Amp CLI is already up to date.
6105
+ `));let{hasUpdate:X,latestVersion:Y}=await Sj("0.0.1760086382-g317e3a");if(!X)Z4.write(G8.green(`✓ Amp CLI is already up to date.
6106
6106
  `)),process.exit(0);if(!Y)Z4.write(G8.yellow("[WARN] could not find latest version")),process.exit(0);Q=Y,Z4.write(G8.blue(`Updating to version ${Y}...
6107
6107
  `)),await ZC(Y),Z4.write(G8.green(`✓ Successfully updated to version ${Y}
6108
6108
  `))}let Z=await sR(Q);if(Z.warning)Z4.write(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1760086165-g317e3a",
3
+ "version": "0.0.1760086382-g317e3a",
4
4
  "description": "CLI for Amp, an agentic coding tool in research preview from Sourcegraph.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {