@sourcegraph/amp 0.0.1760556967-g000ad7 → 0.0.1760558494-g2235e3

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
@@ -6077,7 +6077,7 @@ See https://ampcode.com/manual#toolboxes`);return Q[0]||bR}function IZ6(J,Q){let
6077
6077
  `;async function vZ6(J,Q,Z,X){let Y=performance.now(),K=[...y_(hM1(J)),{role:"user",parts:[{text:N59.replace("{USER_GOAL}",Q)}]}],q=await $$(Ir,K,[],J,Z,X,{responseMimeType:"application/json",responseJsonSchema:M0.toJSONSchema(SZ6)}),G=SZ6.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}}XL();g6();function kZ6(J){let Q=J.trim();if(Q==="quit"||Q==="exit")return"/quit";return J}function _Z6(J,Q,Z){if(J.agentMode)return J.agentMode;if(Q?.agentMode){let X=Q.agentMode;if(X==="free"){if(Z?.canUseAmpFree??!1)return"free";return"smart"}return X}return"smart"}z0();Q3();import L59 from"node:fs";import xZ6 from"node:path";function bZ6(J){let Q=J.trim().replace(/^["']|["']$/g,"");if(Q=Q.replace(/\\(.)/g,"$1"),!/\.(png|jpe?g|gif|webp)$/i.test(Q))return null;if(!xZ6.isAbsolute(Q))return null;return l.debug("Extracted image path",{original:J,extracted:Q}),Q}function yZ6(J){try{let Q=xZ6.extname(J).toLowerCase(),Z=Ne1(Q);if(!Z)return l.warn("Unsupported image file extension",{ext:Q}),null;try{let X=L59.readFileSync(J);return A59(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 A59(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 qK6}from"node:child_process";import{rmdir as UY9}from"node:fs/promises";import{tmpdir as WY9}from"node:os";import GK6 from"node:path";dO();z0();import{spawn as w59}from"node:child_process";import{promises as R59}from"node:fs";function fZ6(J){return J.kind==="executable"}function hZ6(J){return J.kind==="markdown"}var hH=50000,gZ6=300000;async function Ny1(J,Q,Z,X={}){let{timeoutMs:Y=gZ6,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}),hZ6(q))return await O59(q,Q);else if(fZ6(q))return await j59(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 O59(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await R59.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>hH?Z.slice(0,hH)+`
6078
6078
  ... (output truncated at ${hH} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function j59(J,Q,Z=gZ6,X){return new Promise((Y)=>{let[K,q]=$59(J,Q);l.debug("Spawning command",{spawnCommand:K,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Z});let G=Be1(X),z=!1,U=setTimeout(()=>{z=!0,G.abort(),l.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),W=w59(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<=hH)F.push(V);else{let N=hH-(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<=hH)H.push(V);else{let N=hH-(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?`
6079
6079
  ${L}`:L;if(B>hH)A+=`
6080
- ... (output truncated at ${hH} 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 $59(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return I59(Z,X?[...X]:null,Y,Q);else return E59(Z,X?[...X]:null,Y,Q)}function E59(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function I59(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}z0();Rj();$2();VB();TX();xW();g6();S0();import{mkdtemp as FY9,readFile as HY9,unlink as BY9,writeFile as cw2}from"fs/promises";var a71={};A6(a71,{scrollUp:()=>i59,scrollDown:()=>n59,link:()=>e59,image:()=>JJ9,iTerm:()=>QJ9,exitAlternativeScreen:()=>o59,eraseUp:()=>l59,eraseStartLine:()=>d59,eraseScreen:()=>Ly1,eraseLines:()=>u59,eraseLine:()=>dZ6,eraseEndLine:()=>p59,eraseDown:()=>c59,enterAlternativeScreen:()=>s59,cursorUp:()=>uZ6,cursorTo:()=>C59,cursorShow:()=>m59,cursorSavePosition:()=>x59,cursorRestorePosition:()=>b59,cursorPrevLine:()=>h59,cursorNextLine:()=>f59,cursorMove:()=>S59,cursorLeft:()=>pZ6,cursorHide:()=>g59,cursorGetPosition:()=>y59,cursorForward:()=>k59,cursorDown:()=>v59,cursorBackward:()=>_59,clearTerminal:()=>r59,clearScreen:()=>a59,beep:()=>t59});import Ay1 from"node:process";var n71=globalThis.window?.document!==void 0,aL2=globalThis.process?.versions?.node!==void 0,rL2=globalThis.process?.versions?.bun!==void 0,sL2=globalThis.Deno?.version?.deno!==void 0,oL2=globalThis.process?.versions?.electron!==void 0,tL2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,eL2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,JA2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,QA2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,ZA2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,$u=globalThis.navigator?.userAgentData?.platform,XA2=$u==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",YA2=$u==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",KA2=$u==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",qA2=$u==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),GA2=$u==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var F2="\x1B[",Iu="\x1B]",KC="\x07",Eu=";",mZ6=!n71&&Ay1.env.TERM_PROGRAM==="Apple_Terminal",P59=!n71&&Ay1.platform==="win32",T59=n71?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:Ay1.cwd,C59=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return F2+(J+1)+"G";return F2+(Q+1)+Eu+(J+1)+"H"},S59=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=F2+-J+"D";else if(J>0)Z+=F2+J+"C";if(Q<0)Z+=F2+-Q+"A";else if(Q>0)Z+=F2+Q+"B";return Z},uZ6=(J=1)=>F2+J+"A",v59=(J=1)=>F2+J+"B",k59=(J=1)=>F2+J+"C",_59=(J=1)=>F2+J+"D",pZ6=F2+"G",x59=mZ6?"\x1B7":F2+"s",b59=mZ6?"\x1B8":F2+"u",y59=F2+"6n",f59=F2+"E",h59=F2+"F",g59=F2+"?25l",m59=F2+"?25h",u59=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=dZ6+(Z<J-1?uZ6():"");if(J)Q+=pZ6;return Q},p59=F2+"K",d59=F2+"1K",dZ6=F2+"2K",c59=F2+"J",l59=F2+"1J",Ly1=F2+"2J",i59=F2+"S",n59=F2+"T",a59="\x1Bc",r59=P59?`${Ly1}${F2}0f`:`${Ly1}${F2}3J${F2}H`,s59=F2+"?1049h",o59=F2+"?1049l",t59=KC,e59=(J,Q)=>[Iu,"8",Eu,Eu,Q,KC,J,Iu,"8",Eu,Eu,KC].join(""),JJ9=(J,Q={})=>{let Z=`${Iu}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")+KC},QJ9={setCwd:(J=T59())=>`${Iu}50;CurrentDir=${J}${KC}`,annotation(J,Q={}){let Z=`${Iu}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+KC}};var r71=k6(sZ6(),1);function uV(J,Q,{target:Z="stdout",...X}={}){if(!r71.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (​${Q}​)`}return a71.link(J,Q)}uV.isSupported=r71.default.stdout;uV.stderr=(J,Q,Z={})=>uV(J,Q,{target:"stderr",...Z});uV.stderr.isSupported=r71.default.stderr;z0();TX();class $y1{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.1760556967-g000ad7"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await fn(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}}z0();class s71 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}class UQ{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function oZ6(J){if(J instanceof s71)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof UQ)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 aV=null,DY9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(aV)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(() => (bb1(),AJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{aV=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});aV=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{aV=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(() => k6(Lf1(),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 UQ(`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(!aV)return new UQ("Not connected to Amp web interface");try{aV.disconnect();let Z=aV.clientID;return aV=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new UQ(`Disconnected from Amp web interface
6080
+ ... (output truncated at ${hH} 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 $59(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return I59(Z,X?[...X]:null,Y,Q);else return E59(Z,X?[...X]:null,Y,Q)}function E59(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function I59(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}z0();Rj();$2();VB();TX();xW();g6();S0();import{mkdtemp as FY9,readFile as HY9,unlink as BY9,writeFile as cw2}from"fs/promises";var a71={};A6(a71,{scrollUp:()=>i59,scrollDown:()=>n59,link:()=>e59,image:()=>JJ9,iTerm:()=>QJ9,exitAlternativeScreen:()=>o59,eraseUp:()=>l59,eraseStartLine:()=>d59,eraseScreen:()=>Ly1,eraseLines:()=>u59,eraseLine:()=>dZ6,eraseEndLine:()=>p59,eraseDown:()=>c59,enterAlternativeScreen:()=>s59,cursorUp:()=>uZ6,cursorTo:()=>C59,cursorShow:()=>m59,cursorSavePosition:()=>x59,cursorRestorePosition:()=>b59,cursorPrevLine:()=>h59,cursorNextLine:()=>f59,cursorMove:()=>S59,cursorLeft:()=>pZ6,cursorHide:()=>g59,cursorGetPosition:()=>y59,cursorForward:()=>k59,cursorDown:()=>v59,cursorBackward:()=>_59,clearTerminal:()=>r59,clearScreen:()=>a59,beep:()=>t59});import Ay1 from"node:process";var n71=globalThis.window?.document!==void 0,aL2=globalThis.process?.versions?.node!==void 0,rL2=globalThis.process?.versions?.bun!==void 0,sL2=globalThis.Deno?.version?.deno!==void 0,oL2=globalThis.process?.versions?.electron!==void 0,tL2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,eL2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,JA2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,QA2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,ZA2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,$u=globalThis.navigator?.userAgentData?.platform,XA2=$u==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",YA2=$u==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",KA2=$u==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",qA2=$u==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),GA2=$u==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var F2="\x1B[",Iu="\x1B]",KC="\x07",Eu=";",mZ6=!n71&&Ay1.env.TERM_PROGRAM==="Apple_Terminal",P59=!n71&&Ay1.platform==="win32",T59=n71?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:Ay1.cwd,C59=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return F2+(J+1)+"G";return F2+(Q+1)+Eu+(J+1)+"H"},S59=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=F2+-J+"D";else if(J>0)Z+=F2+J+"C";if(Q<0)Z+=F2+-Q+"A";else if(Q>0)Z+=F2+Q+"B";return Z},uZ6=(J=1)=>F2+J+"A",v59=(J=1)=>F2+J+"B",k59=(J=1)=>F2+J+"C",_59=(J=1)=>F2+J+"D",pZ6=F2+"G",x59=mZ6?"\x1B7":F2+"s",b59=mZ6?"\x1B8":F2+"u",y59=F2+"6n",f59=F2+"E",h59=F2+"F",g59=F2+"?25l",m59=F2+"?25h",u59=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=dZ6+(Z<J-1?uZ6():"");if(J)Q+=pZ6;return Q},p59=F2+"K",d59=F2+"1K",dZ6=F2+"2K",c59=F2+"J",l59=F2+"1J",Ly1=F2+"2J",i59=F2+"S",n59=F2+"T",a59="\x1Bc",r59=P59?`${Ly1}${F2}0f`:`${Ly1}${F2}3J${F2}H`,s59=F2+"?1049h",o59=F2+"?1049l",t59=KC,e59=(J,Q)=>[Iu,"8",Eu,Eu,Q,KC,J,Iu,"8",Eu,Eu,KC].join(""),JJ9=(J,Q={})=>{let Z=`${Iu}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")+KC},QJ9={setCwd:(J=T59())=>`${Iu}50;CurrentDir=${J}${KC}`,annotation(J,Q={}){let Z=`${Iu}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+KC}};var r71=k6(sZ6(),1);function uV(J,Q,{target:Z="stdout",...X}={}){if(!r71.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (​${Q}​)`}return a71.link(J,Q)}uV.isSupported=r71.default.stdout;uV.stderr=(J,Q,Z={})=>uV(J,Q,{target:"stderr",...Z});uV.stderr.isSupported=r71.default.stderr;z0();TX();class $y1{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.1760558494-g2235e3"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await fn(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}}z0();class s71 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}class UQ{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function oZ6(J){if(J instanceof s71)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof UQ)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 aV=null,DY9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(aV)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(() => (bb1(),AJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{aV=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});aV=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{aV=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(() => k6(Lf1(),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 UQ(`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(!aV)return new UQ("Not connected to Amp web interface");try{aV.disconnect();let Z=aV.clientID;return aV=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new UQ(`Disconnected from Amp web interface
6081
6081
  Client ID: ${Z}
6082
6082
  Server will clean up automatically within 60 seconds`)}catch(Z){return Error(`Failed to disconnect: ${Z.message}`)}}}};class Af1{configService;freeTierStatus;commands;customRegistry;latestCustom=[];telemetrySubmitter;constructor(J=dC(),Q,Z){this.configService=Q;this.freeTierStatus=Z;this.customRegistry=J,this._initBaseCommands(!1),this.customRegistry.commands.subscribe((X)=>this.latestCustom=X),this.telemetrySubmitter=new $y1(async()=>{try{return(await this.configService.getLatest()).settings["experimental.cli.commandTelemetry.enabled"]===!0}catch{return!1}},this.configService),this.configService.config.pipe(k0((X)=>EB(this.freeTierStatus?.isFreeAvailable??!1,X.settings)),o6()).subscribe((X)=>{this._initBaseCommands(X.length>1)})}_initBaseCommands(J){if(this.commands={...MY9},process.env.AMP_CONNECT==="1")Object.assign(this.commands,DY9);if(J)Object.assign(this.commands,VY9)}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 Ny1(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 MY9={"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=Tq(Z.settings),K=J.getInMemoryAgentModeOverride()??X;J.worker.handle({type:"user:message",message:{content:[{type:"text",text:r80}],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 s71;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 FY9(GK6.join(WY9(),"amp-edit-")),Y=GK6.join(X,"message.amp.md");qK6(`${Z} "${Y}"`,{stdio:"inherit"}),process.stdout.write("\x1B[?25l");try{let q=(await HY9(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 BY9(Y),await UY9(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 gG("dangerouslyAllowAll",!1),new UQ("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 gG("dangerouslyAllowAll",!0),new UQ("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 XC();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:XC};await c71(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 a new thread with AI-prepared context: /handoff <your goal>",statusMessage:"Handing off...",requiresArgs:!0,execute:async()=>{return},isVisible:(J)=>J.messages.length!==0},continue:{name:"continue",description:"Continue an existing thread",requiresArgs:!1,requiresPicker:!0,execute:async(J,Q)=>{try{if(Q&&Q.length>0){let Z=Q[0]?.trim();if(!Z)return Error("Invalid thread ID provided");return await J.switchToThread(Z),new UQ(`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(`
6083
6083
  `).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: ${uV(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 UQ(`${G}
@@ -6278,7 +6278,7 @@ ${Q}`),this.textController.clear(),this.textController.insertText(this.pendingTr
6278
6278
  `),J.stdout.write(`Thread: ${H}
6279
6279
  `),J.stdout.write(`Continue this thread with: amp threads continue ${W}
6280
6280
  `)}}function Yu1(J){return J==="smart"?v1.rgb(3,197,97):J==="fast"?v1.rgb(228,180,2):J==="free"?v1.rgb(0,184,255):HF9(J)}function HF9(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])}gf1();if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){Y4.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
6281
- `)}var qu1=Ku1.join(xc1||Ku1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function NF9(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 JB(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")gG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new f9("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${W8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")gG("experimental.agentMode",Q.agentMode)}var LF9=M0.union([M0.object({command:M0.string(),args:M0.array(M0.string()).optional(),env:M0.record(M0.string(),M0.string()).optional()}).strict(),M0.object({url:M0.string()}).strict()]),AF9=M0.record(M0.string(),LF9);async function zu1(J){try{await DF9(Ku1.dirname(qu1),{recursive:!0}),await MF9(qu1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function wF9(){try{return(await wW6(qu1,"utf-8")).trim()}catch(J){return null}}async function RF9(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 AF9.parse(Q)}catch(Z){if(Z instanceof M0.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 OF9(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 NW6=[{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??j5,description:`Custom settings file path (overrides the default location ${j5})`},{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 ${$b1})`},{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:xK(),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:Xy1(),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:hd}],LW6=(J)=>("deprecated"in J)&&J.deprecated===!0,jF9=(J)=>("hidden"in J)&&J.hidden===!0,$F9=(J)=>("default"in J),EF9=(J)=>("default"in J)?J.default:void 0;function IF9(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 f9(_K.unknownCommand(Z),1,q)}}var RW6=null;function zt2(){return RW6}function fJ1(J){return{...J,getThreadEnvironment:N71,vfs:_20({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Q_(J.fileSystem),generateThreadTitle:tq0,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var Uu1=$0.file(VF9.homedir()),OW6=process.env.XDG_CONFIG_HOME?$0.file(process.env.XDG_CONFIG_HOME):c0.joinPath(Uu1,".config");async function QB(J,Q){Ci1("0.0.1760556967-g000ad7");let Z=hZ1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:e1.of([$0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Uu1,userConfigDir:OW6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (bJ1(),xJ1));X(Z);let Y=await Z.getLatest();l.debug("Global configuration initialized",{settingsKeys:Object.keys(Y.settings)});let K=Ja(ZO({configService:Z})),q=U20({configService:Z,toolService:K}),G=NR0(K,E9,Pe).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)KO("JetBrains");else if(Q.ide&&Xy1())KO("VS Code");else if(Q.ide&&EQ6())KO("Neovim");if(J.executeMode)Si1(!0);N96(K,{configService:Z});let U,W=r7.status.pipe(k0((w)=>Boolean(w.connected&&w.authenticated)),o6()).subscribe((w)=>{if(w){if(!U)U=K.registerTool(rr)}else U?.dispose(),U=void 0}),F;if(!J.executeMode)F=new v71(process.cwd(),{},!0);else F=new class extends v71{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(a2.write(`No API key found. Starting login flow...
6281
+ `)}var qu1=Ku1.join(xc1||Ku1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function NF9(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 JB(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")gG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new f9("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${W8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")gG("experimental.agentMode",Q.agentMode)}var LF9=M0.union([M0.object({command:M0.string(),args:M0.array(M0.string()).optional(),env:M0.record(M0.string(),M0.string()).optional()}).strict(),M0.object({url:M0.string()}).strict()]),AF9=M0.record(M0.string(),LF9);async function zu1(J){try{await DF9(Ku1.dirname(qu1),{recursive:!0}),await MF9(qu1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function wF9(){try{return(await wW6(qu1,"utf-8")).trim()}catch(J){return null}}async function RF9(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 AF9.parse(Q)}catch(Z){if(Z instanceof M0.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 OF9(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 NW6=[{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??j5,description:`Custom settings file path (overrides the default location ${j5})`},{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 ${$b1})`},{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:xK(),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:Xy1(),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:hd}],LW6=(J)=>("deprecated"in J)&&J.deprecated===!0,jF9=(J)=>("hidden"in J)&&J.hidden===!0,$F9=(J)=>("default"in J),EF9=(J)=>("default"in J)?J.default:void 0;function IF9(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 f9(_K.unknownCommand(Z),1,q)}}var RW6=null;function zt2(){return RW6}function fJ1(J){return{...J,getThreadEnvironment:N71,vfs:_20({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Q_(J.fileSystem),generateThreadTitle:tq0,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var Uu1=$0.file(VF9.homedir()),OW6=process.env.XDG_CONFIG_HOME?$0.file(process.env.XDG_CONFIG_HOME):c0.joinPath(Uu1,".config");async function QB(J,Q){Ci1("0.0.1760558494-g2235e3");let Z=hZ1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:e1.of([$0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Uu1,userConfigDir:OW6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (bJ1(),xJ1));X(Z);let Y=await Z.getLatest();l.debug("Global configuration initialized",{settingsKeys:Object.keys(Y.settings)});let K=Ja(ZO({configService:Z})),q=U20({configService:Z,toolService:K}),G=NR0(K,E9,Pe).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)KO("JetBrains");else if(Q.ide&&Xy1())KO("VS Code");else if(Q.ide&&EQ6())KO("Neovim");if(J.executeMode)Si1(!0);N96(K,{configService:Z});let U,W=r7.status.pipe(k0((w)=>Boolean(w.connected&&w.authenticated)),o6()).subscribe((w)=>{if(w){if(!U)U=K.registerTool(rr)}else U?.dispose(),U=void 0}),F;if(!J.executeMode)F=new v71(process.cwd(),{},!0);else F=new class extends v71{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(a2.write(`No API key found. Starting login flow...
6282
6282
  `),!await PF9(J))await iw(),process.exit(1)}let H=await h20({isDevelopment:!1}),B=new OH1(H),M=new wH1(H,Z,{lazy:!0}),V=Q.notifications!==void 0?Q.notifications:!J.executeMode,N=A96({playNotificationSound:async(w)=>{if(V){L96(w);let R=ff1(),O=hf1();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=i20({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?S20:E9};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 PF9(J){if(!J.executeMode){if(!await Fy1("Would you like to log in to Amp? [(y)es, (n)o]: "))return a2.write(`Login cancelled. Run the command again to retry.
6283
6283
  `),!1}return await jW6(J)}async function jW6(J){let Q=BF9(32).toString("hex"),Z=await Wy1(J.ampURL,Q);try{await XZ(Z)}catch(Y){l.error("Failed to open browser",{error:Y})}let X=await Wy1(J.ampURL,Q,!1);a2.write(`If your browser did not open automatically, visit:
6284
6284
 
@@ -6288,12 +6288,12 @@ ${W8.blue.bold(X)}
6288
6288
  Login successful! You can now use the Amp CLI.
6289
6289
  `),!0}catch(Y){return l.error("Login failed",{error:Y}),Y4.write(`
6290
6290
  Login failed: ${Y instanceof Error?Y.message:String(Y)}
6291
- `),!1}}function TF9(){let J=new _m().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)rw(),process.exit(0);let H=F.originalError??F;OJ6(H)}),J.option("-V, --version","output the version number",()=>{a2.write(`0.0.1760556967-g000ad7 (released 2025-10-15T19:41:38.823Z)
6292
- `),process.exit(0)}),J.addHelpText("after",OQ6()),J.configureHelp({formatHelp:jQ6}),J.command("logout").description("Log out by removing stored API key").action(async(F,H)=>{let B=H.optsWithGlobals(),M=await FY(B);await kF9(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 FY(B);await vF9(M,await ob1(B,M.settings))});let Q=async(F,H,B)=>{hZ1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:e1.of([$0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:Uu1,userConfigDir:OW6});let M={...H,executeMode:!1};await Gu1(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 FY(B);await AW6(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 FY(B);await gF9(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 FY(M);if(H.pick)await Q(M,V,B);else await hF9(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 FY(M);await fF9(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 FY(B);await AW6(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 FY(M);await yF9(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 FY(M);await bF9(M,V,F,B)}),IZ6(J,async(F,H)=>{let B=await FY(H);JB(F,H);let M=await QB(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,configService:M.configService,cleanupTerminal:rw,asyncDispose:M.asyncDispose.bind(M)}}),tQ6(J),lQ6(J,async(F)=>{let H=await FY(F);return{settings:H.settings,getThreadDeps:async(B)=>{JB(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 FY(B);JB(H,B);let V=await QB(M,B);try{await xb1(V,V.configService,{})}finally{await V.asyncDispose(),await rw()}});let X=new _m().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 Ky1(F.force||!1,F.verbose||!1,"0.0.1760556967-g000ad7"),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 SV(H,V),L=EF9(F);if(L)N.default(L);if(N.hidden=jF9(F)||LW6(F),"choices"in F)N.choices([...F.choices]);return N}for(let F of NW6)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 SV("-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 SV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1);J.addOption(F)}let q=new SV("--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 SV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(G);let z=new SV("--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 SV("--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 FY(B);if(Object.keys(B).forEach((V)=>{let N=NW6.find((L)=>L.name===V);if(N&&LW6(N)&&!$F9(N))Y4.write(W8.yellow(`Warning: '--${V}' flag is deprecated
6291
+ `),!1}}function TF9(){let J=new _m().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)rw(),process.exit(0);let H=F.originalError??F;OJ6(H)}),J.option("-V, --version","output the version number",()=>{a2.write(`0.0.1760558494-g2235e3 (released 2025-10-15T20:06:55.138Z)
6292
+ `),process.exit(0)}),J.addHelpText("after",OQ6()),J.configureHelp({formatHelp:jQ6}),J.command("logout").description("Log out by removing stored API key").action(async(F,H)=>{let B=H.optsWithGlobals(),M=await FY(B);await kF9(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 FY(B);await vF9(M,await ob1(B,M.settings))});let Q=async(F,H,B)=>{hZ1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:e1.of([$0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:Uu1,userConfigDir:OW6});let M={...H,executeMode:!1};await Gu1(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 FY(B);await AW6(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 FY(B);await gF9(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 FY(M);if(H.pick)await Q(M,V,B);else await hF9(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 FY(M);await fF9(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 FY(B);await AW6(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 FY(M);await yF9(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 FY(M);await bF9(M,V,F,B)}),IZ6(J,async(F,H)=>{let B=await FY(H);JB(F,H);let M=await QB(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,configService:M.configService,cleanupTerminal:rw,asyncDispose:M.asyncDispose.bind(M)}}),tQ6(J),lQ6(J,async(F)=>{let H=await FY(F);return{settings:H.settings,getThreadDeps:async(B)=>{JB(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 FY(B);JB(H,B);let V=await QB(M,B);try{await xb1(V,V.configService,{})}finally{await V.asyncDispose(),await rw()}});let X=new _m().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 Ky1(F.force||!1,F.verbose||!1,"0.0.1760558494-g2235e3"),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 SV(H,V),L=EF9(F);if(L)N.default(L);if(N.hidden=jF9(F)||LW6(F),"choices"in F)N.choices([...F.choices]);return N}for(let F of NW6)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 SV("-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 SV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1);J.addOption(F)}let q=new SV("--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 SV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(G);let z=new SV("--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 SV("--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 FY(B);if(Object.keys(B).forEach((V)=>{let N=NW6.find((L)=>L.name===V);if(N&&LW6(N)&&!$F9(N))Y4.write(W8.yellow(`Warning: '--${V}' flag is deprecated
6293
6293
  `))}),H.args.length>0)IF9(M,H);await Gu1(M,B,H)});let U=new _m("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 xF9(F.outputDir,F.includeFullLogs)});J.addCommand(U);let W=new _m("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 _F9(F.version)});return J.addCommand(W),J}async function yJ1(J,Q){let{thread:Z,visibility:X}=Q,Y=Z?.id??sK(),K=fJ1(J);if(Z)await J.threadStorage.set(Y,Z);let q=await hJ.getOrCreateForThread(K,Y);if(X)await J.threadSyncService.updateThreadMeta(Y,p71(X));let G=J.threadService.observe(Y).subscribe(async(z)=>{if(n7(z,"assistant"))await zu1(Y),G.unsubscribe()});return await q.resume(),q}async function Gu1(J,Q,Z){let X=u71(Q);if(X instanceof Error)WX(X.message);let Y,K=null;if(Q.streamJsonInput)Y="";else if(typeof Q.execute==="string"){Y=Q.execute;let R=(await Hy1()).trimEnd();if(R)K=R}else Y=(await Hy1()).trimEnd();if(Q.remote&&!J.executeMode)throw new f9("The -r/--remote flag currently only works with --execute mode",1,'Use: amp --remote --execute "your message"');if(Q.streamJson&&!J.executeMode)throw new f9("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(Q.streamJsonInput&&!J.executeMode)throw new f9("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(Q.streamJsonInput&&!Q.streamJson)throw new f9("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 f9(`Execute mode is not permitted with --agent-mode '${Q.agentMode}'`,1);if(Q.stats&&!J.executeMode)throw new f9("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 f9("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 f9("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"
6294
6294
  Or pipe via stdin: echo "your message" | amp --execute`);JB(Z,Q);let q=await QB(J,Q);RW6=q;let G=fJ1(q),z=async(R)=>{let O=await wW6(R,"utf-8"),j=JSON.parse(O);if(!qW(j.id))throw new f9(_K.invalidThreadId);return yJ1(q,{visibility:X,thread:j})},U=async(R)=>{if(!qW(R))throw new f9(_K.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}`),gG("experimental.agentMode",O.agentMode);else l.info("[fetchAndStartThread] No agentMode on thread, not setting override");return yJ1(q,{visibility:X,thread:O})},W=async()=>{try{if(Q.threadId)return U(Q.threadId);else return yJ1(q,{visibility:X})}catch(R){if(R instanceof f9)throw R;throw await j71(R,Q.threadId),Error("handleError should have called process.exit()")}},F=async()=>{return yJ1(q,{visibility:X})};if(Q.format==="jsonl")Y4.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
6295
- `),await iw(),process.exit(1);if(J.executeMode&&Q.remote)await eQ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await W();if(J.executeMode)await bJ6(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 ea1();let R=await wO({jetbrainsOnly:Q.jetbrains});if(R.length===0)if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall");else r7.sendStatus({enabled:!0,connected:!1,authenticated:!1});else if(R.length===1){let O=R[0];if(O)r7.selectConfig(O)}else B=!0}let V=zy1("0.0.1760556967-g000ad7",q.settingsStorage),N=e1.of([$0.file(process.cwd())]),L=dC(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 XZ6();l.info("Loaded session state:",w),await VW6({stdout:process.stdout,history:new hb1,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:r7,connectedClientsService:new pd,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 FY(J){if(J.interactive)Y4.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
6296
- `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await gU(J.settingsFile),Y=mU({...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 KZ6(Y),await qZ6(Y),J.mcpConfig){let G=await RF9(J.mcpConfig);Y=OF9(Y,G)}let K=await Y.get("url","global");if(!K)K=UZ;if(!zB(K))l.info("Targeting custom Amp server",{ampURL:K});if(Y=Jl1(Y),await Y.get("debug.httpLogging"))oc1();return{executeMode:Q,isTTY:Z,ampURL:K,settings:Y,secrets:JZ6(await ob1(J,Y))}}function CF9(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 SF9(){let J=CF9(process.argv);if(XJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),NF9(l),l.info("Starting Amp CLI.",{version:"0.0.1760556967-g000ad7",buildTimestamp:"2025-10-15T19:41:38.823Z",buildType:"'release'"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new f9(_K.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await TF9().parseAsync(process.argv)}SF9().catch(j71);async function vF9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),a2.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
6295
+ `),await iw(),process.exit(1);if(J.executeMode&&Q.remote)await eQ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await W();if(J.executeMode)await bJ6(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 ea1();let R=await wO({jetbrainsOnly:Q.jetbrains});if(R.length===0)if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall");else r7.sendStatus({enabled:!0,connected:!1,authenticated:!1});else if(R.length===1){let O=R[0];if(O)r7.selectConfig(O)}else B=!0}let V=zy1("0.0.1760558494-g2235e3",q.settingsStorage),N=e1.of([$0.file(process.cwd())]),L=dC(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 XZ6();l.info("Loaded session state:",w),await VW6({stdout:process.stdout,history:new hb1,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:r7,connectedClientsService:new pd,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 FY(J){if(J.interactive)Y4.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
6296
+ `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await gU(J.settingsFile),Y=mU({...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 KZ6(Y),await qZ6(Y),J.mcpConfig){let G=await RF9(J.mcpConfig);Y=OF9(Y,G)}let K=await Y.get("url","global");if(!K)K=UZ;if(!zB(K))l.info("Targeting custom Amp server",{ampURL:K});if(Y=Jl1(Y),await Y.get("debug.httpLogging"))oc1();return{executeMode:Q,isTTY:Z,ampURL:K,settings:Y,secrets:JZ6(await ob1(J,Y))}}function CF9(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 SF9(){let J=CF9(process.argv);if(XJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),NF9(l),l.info("Starting Amp CLI.",{version:"0.0.1760558494-g2235e3",buildTimestamp:"2025-10-15T20:06:55.138Z",buildType:"'release'"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new f9(_K.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await TF9().parseAsync(process.argv)}SF9().catch(j71);async function vF9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),a2.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
6297
6297
  `);else if(!zB(J.ampURL))a2.write(`Logging in to ${new URL(J.ampURL).hostname}
6298
6298
  `);let Z=process.env.AMP_API_KEY;if(Z)a2.write(`API key found in environment variable, storing...
6299
6299
  `),await Q.set("apiKey",Z,J.ampURL),a2.write(`API key successfully stored.
@@ -6309,7 +6309,7 @@ Or pipe via stdin: echo "your message" | amp --execute`);JB(Z,Q);let q=await QB(
6309
6309
  `));try{let Q;if(J)Q=J,Y4.write(W8.blue(`Updating to version ${J}...
6310
6310
  `)),await QC(J),Y4.write(W8.green(`✓ Successfully updated to version ${J}
6311
6311
  `));else{Y4.write(W8.blue(`Checking for updates...
6312
- `));let{hasUpdate:X,latestVersion:Y}=await Sj("0.0.1760556967-g000ad7");if(!X)Y4.write(W8.green(`✓ Amp CLI is already up to date.
6312
+ `));let{hasUpdate:X,latestVersion:Y}=await Sj("0.0.1760558494-g2235e3");if(!X)Y4.write(W8.green(`✓ Amp CLI is already up to date.
6313
6313
  `)),process.exit(0);if(!Y)Y4.write(W8.yellow("[WARN] could not find latest version")),process.exit(0);Q=Y,Y4.write(W8.blue(`Updating to version ${Y}...
6314
6314
  `)),await QC(Y),Y4.write(W8.green(`✓ Successfully updated to version ${Y}
6315
6315
  `))}let Z=await ew(Q);if(Z.warning)Y4.write(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1760556967-g000ad7",
3
+ "version": "0.0.1760558494-g2235e3",
4
4
  "description": "CLI for Amp, an agentic coding tool built by Sourcegraph.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {