@sourcegraph/amp 0.0.1760636252-gda486e → 0.0.1760644904-g1cafaa

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 +9 -9
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -6122,12 +6122,12 @@ See https://ampcode.com/manual#toolboxes`);return Q[0]||hR}function SZ6(J,Q){let
6122
6122
  `;async function bZ6(J,Q,Z,X){let Y=performance.now(),K=[...h_(fM1(J)),{role:"user",parts:[{text:O59.replace("{USER_GOAL}",Q)}]}],q=await P$(Tr,K,[],J,Z,X,{responseMimeType:"application/json",responseJsonSchema:M0.toJSONSchema(xZ6)}),G=xZ6.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}}qL();g6();function yZ6(J){let Q=J.trim();if(Q==="quit"||Q==="exit")return"/quit";return J}function fZ6(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();Z3();import j59 from"node:fs";import hZ6 from"node:path";function gZ6(J){let Q=J.trim().replace(/^["']|["']$/g,"");if(Q=Q.replace(/\\(.)/g,"$1"),!/\.(png|jpe?g|gif|webp)$/i.test(Q))return null;if(!hZ6.isAbsolute(Q))return null;return l.debug("Extracted image path",{original:J,extracted:Q}),Q}function mZ6(J){try{let Q=hZ6.extname(J).toLowerCase(),Z=Ne1(Q);if(!Z)return l.warn("Unsupported image file extension",{ext:Q}),null;try{let X=j59.readFileSync(J);return $59(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 $59(J,Q){if(J.length>aO)return l.warn(`Image file too large: ${J.length} bytes (max: ${aO})`),null;return{type:"image",source:{type:"base64",data:J.toString("base64"),mediaType:Q}}}import{execSync as FK6}from"node:child_process";import{rmdir as LY9}from"node:fs/promises";import{tmpdir as AY9}from"node:os";import HK6 from"node:path";iO();z0();import{spawn as E59}from"node:child_process";import{promises as I59}from"node:fs";function uZ6(J){return J.kind==="executable"}function pZ6(J){return J.kind==="markdown"}var gH=50000,dZ6=300000;async function Vy1(J,Q,Z,X={}){let{timeoutMs:Y=dZ6,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}),pZ6(q))return await P59(q,Q);else if(uZ6(q))return await T59(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 P59(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await I59.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>gH?Z.slice(0,gH)+`
6123
6123
  ... (output truncated at ${gH} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function T59(J,Q,Z=dZ6,X){return new Promise((Y)=>{let[K,q]=C59(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=E59(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<=gH)F.push(V);else{let N=gH-(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<=gH)H.push(V);else{let N=gH-(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?`
6124
6124
  ${L}`:L;if(B>gH)A+=`
6125
- ... (output truncated at ${gH} 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 C59(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return v59(Z,X?[...X]:null,Y,Q);else return S59(Z,X?[...X]:null,Y,Q)}function S59(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function v59(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();jj();$2();NB();CX();xW();g6();T0();import{mkdtemp as wY9,readFile as RY9,unlink as OY9,writeFile as ZR2}from"fs/promises";var s71={};A6(s71,{scrollUp:()=>o59,scrollDown:()=>t59,link:()=>YJ9,image:()=>KJ9,iTerm:()=>qJ9,exitAlternativeScreen:()=>ZJ9,eraseUp:()=>s59,eraseStartLine:()=>a59,eraseScreen:()=>Ny1,eraseLines:()=>i59,eraseLine:()=>nZ6,eraseEndLine:()=>n59,eraseDown:()=>r59,enterAlternativeScreen:()=>QJ9,cursorUp:()=>lZ6,cursorTo:()=>x59,cursorShow:()=>l59,cursorSavePosition:()=>g59,cursorRestorePosition:()=>m59,cursorPrevLine:()=>d59,cursorNextLine:()=>p59,cursorMove:()=>b59,cursorLeft:()=>iZ6,cursorHide:()=>c59,cursorGetPosition:()=>u59,cursorForward:()=>f59,cursorDown:()=>y59,cursorBackward:()=>h59,clearTerminal:()=>JJ9,clearScreen:()=>e59,beep:()=>XJ9});import Ly1 from"node:process";var r71=globalThis.window?.document!==void 0,ZA2=globalThis.process?.versions?.node!==void 0,XA2=globalThis.process?.versions?.bun!==void 0,YA2=globalThis.Deno?.version?.deno!==void 0,KA2=globalThis.process?.versions?.electron!==void 0,qA2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,GA2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,zA2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,UA2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,WA2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,Eu=globalThis.navigator?.userAgentData?.platform,FA2=Eu==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",HA2=Eu==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",BA2=Eu==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",DA2=Eu==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),MA2=Eu==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var F2="\x1B[",Pu="\x1B]",zC="\x07",Iu=";",cZ6=!r71&&Ly1.env.TERM_PROGRAM==="Apple_Terminal",k59=!r71&&Ly1.platform==="win32",_59=r71?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:Ly1.cwd,x59=(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)+Iu+(J+1)+"H"},b59=(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},lZ6=(J=1)=>F2+J+"A",y59=(J=1)=>F2+J+"B",f59=(J=1)=>F2+J+"C",h59=(J=1)=>F2+J+"D",iZ6=F2+"G",g59=cZ6?"\x1B7":F2+"s",m59=cZ6?"\x1B8":F2+"u",u59=F2+"6n",p59=F2+"E",d59=F2+"F",c59=F2+"?25l",l59=F2+"?25h",i59=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=nZ6+(Z<J-1?lZ6():"");if(J)Q+=iZ6;return Q},n59=F2+"K",a59=F2+"1K",nZ6=F2+"2K",r59=F2+"J",s59=F2+"1J",Ny1=F2+"2J",o59=F2+"S",t59=F2+"T",e59="\x1Bc",JJ9=k59?`${Ny1}${F2}0f`:`${Ny1}${F2}3J${F2}H`,QJ9=F2+"?1049h",ZJ9=F2+"?1049l",XJ9=zC,YJ9=(J,Q)=>[Pu,"8",Iu,Iu,Q,zC,J,Pu,"8",Iu,Iu,zC].join(""),KJ9=(J,Q={})=>{let Z=`${Pu}1337;File=inline=1`;if(Q.width)Z+=`;width=${Q.width}`;if(Q.height)Z+=`;height=${Q.height}`;if(Q.preserveAspectRatio===!1)Z+=";preserveAspectRatio=0";return Z+":"+Buffer.from(J).toString("base64")+zC},qJ9={setCwd:(J=_59())=>`${Pu}50;CurrentDir=${J}${zC}`,annotation(J,Q={}){let Z=`${Pu}1337;`,X=Q.x!==void 0,Y=Q.y!==void 0;if((X||Y)&&!(X&&Y&&Q.length!==void 0))throw Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");if(J=J.replaceAll("|",""),Z+=Q.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",Q.length>0)Z+=(X?[J,Q.length,Q.x,Q.y]:[Q.length,J]).join("|");else Z+=J;return Z+zC}};var o71=k6(JX6(),1);function pV(J,Q,{target:Z="stdout",...X}={}){if(!o71.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (​${Q}​)`}return s71.link(J,Q)}pV.isSupported=o71.default.stdout;pV.stderr=(J,Q,Z={})=>pV(J,Q,{target:"stderr",...Z});pV.stderr.isSupported=o71.default.stderr;z0();CX();class jy1{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.1760636252-gda486e"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await gn(Q,this.configService)}catch(Q){l.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}import{execFile as e71}from"node:child_process";import{platform as $y1}from"node:os";import{promisify as WJ9}from"node:util";var t71=WJ9(e71),FJ9=(J)=>`\x1B]52;c;${J}\x1B\\`,HJ9="\x1B]52;c;?\x1B\\",BJ9="\x1B]52;p;?\x1B\\";class QX6{capabilities=null;pendingReadPromise=null;readResolve=null;readTimeout=null;setCapabilities(J){this.capabilities=J}isOsc52Supported(){return this.capabilities?.osc52??!1}async commandExists(J){try{return await t71("which",[J]),!0}catch{return!1}}async writeToPbcopy(J){try{let Q=e71("pbcopy");return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`pbcopy exited with code ${Y}`))})}),!0}catch{return!1}}async writeToWlCopy(J){try{let Q=e71("wl-copy");return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`wl-copy exited with code ${Y}`))})}),!0}catch{return!1}}async writeToXclip(J){try{let Q=e71("xclip",["-selection","clipboard"]);return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`xclip exited with code ${Y}`))})}),!0}catch{return!1}}async readFromOSC52WithQuery(J){if(!this.isOsc52Supported())return null;if(this.pendingReadPromise)return this.pendingReadPromise;this.pendingReadPromise=new Promise((Z)=>{this.readResolve=Z,this.readTimeout=setTimeout(()=>{this.readResolve=null,this.pendingReadPromise=null,Z(null)},2000),process.stdout.write(J)});let Q=await this.pendingReadPromise;return this.pendingReadPromise=null,Q}async readFromOSC52(){return this.readFromOSC52WithQuery(HJ9)}handleOSC52Response(J){if(this.readResolve&&this.readTimeout){clearTimeout(this.readTimeout),this.readTimeout=null;try{let Q=Buffer.from(J,"base64").toString("utf8");this.readResolve(Q)}catch{this.readResolve(null)}this.readResolve=null,this.pendingReadPromise=null}}async readFromPbpaste(){try{let{stdout:J}=await t71("pbpaste");return J}catch{return null}}async readFromWlPaste(J){try{let Q=["--no-newline"];if(J==="primary")Q.push("--primary");let{stdout:Z}=await t71("wl-paste",Q);return Z}catch{return null}}async readFromXclip(J){try{let{stdout:Q}=await t71("xclip",["-selection",J,"-o"]);return Q}catch{return null}}async readFromOSC52Primary(){return this.readFromOSC52WithQuery(BJ9)}async readText(){if(this.isOsc52Supported()){let Q=await this.readFromOSC52();if(Q!==null)return Q}if($y1()==="darwin"){let Q=await this.readFromPbpaste();if(Q!==null)return Q}else{if(await this.commandExists("wl-paste")){let Q=await this.readFromWlPaste("clipboard");if(Q!==null)return Q}if(await this.commandExists("xclip")){let Q=await this.readFromXclip("clipboard");if(Q!==null)return Q}}return null}async readPrimarySelection(){if($y1()==="darwin")return this.readText();if(this.isOsc52Supported()){let Q=await this.readFromOSC52Primary();if(Q!==null)return Q}if(await this.commandExists("wl-paste")){let Q=await this.readFromWlPaste("primary");if(Q!==null)return Q}if(await this.commandExists("xclip")){let Q=await this.readFromXclip("primary");if(Q!==null)return Q}return null}async writeText(J){if(this.isOsc52Supported()){let Z=Buffer.from(J).toString("base64"),X=FJ9(Z);process.stdout.write(X);return}if($y1()==="darwin"){if(await this.writeToPbcopy(J))return}else{if(await this.commandExists("wl-copy")&&await this.writeToWlCopy(J))return;if(await this.commandExists("xclip")&&await this.writeToXclip(J))return}}}var zY=new QX6;z0();class J51 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}class o5{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function ZX6(J){if(J instanceof J51)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof o5)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 rV=null,jY9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(rV)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(),OJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{rV=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});rV=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{rV=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 o5(`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(!rV)return new o5("Not connected to Amp web interface");try{rV.disconnect();let Z=rV.clientID;return rV=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new o5(`Disconnected from Amp web interface
6125
+ ... (output truncated at ${gH} 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 C59(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return v59(Z,X?[...X]:null,Y,Q);else return S59(Z,X?[...X]:null,Y,Q)}function S59(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function v59(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();jj();$2();NB();CX();xW();g6();T0();import{mkdtemp as wY9,readFile as RY9,unlink as OY9,writeFile as ZR2}from"fs/promises";var s71={};A6(s71,{scrollUp:()=>o59,scrollDown:()=>t59,link:()=>YJ9,image:()=>KJ9,iTerm:()=>qJ9,exitAlternativeScreen:()=>ZJ9,eraseUp:()=>s59,eraseStartLine:()=>a59,eraseScreen:()=>Ny1,eraseLines:()=>i59,eraseLine:()=>nZ6,eraseEndLine:()=>n59,eraseDown:()=>r59,enterAlternativeScreen:()=>QJ9,cursorUp:()=>lZ6,cursorTo:()=>x59,cursorShow:()=>l59,cursorSavePosition:()=>g59,cursorRestorePosition:()=>m59,cursorPrevLine:()=>d59,cursorNextLine:()=>p59,cursorMove:()=>b59,cursorLeft:()=>iZ6,cursorHide:()=>c59,cursorGetPosition:()=>u59,cursorForward:()=>f59,cursorDown:()=>y59,cursorBackward:()=>h59,clearTerminal:()=>JJ9,clearScreen:()=>e59,beep:()=>XJ9});import Ly1 from"node:process";var r71=globalThis.window?.document!==void 0,ZA2=globalThis.process?.versions?.node!==void 0,XA2=globalThis.process?.versions?.bun!==void 0,YA2=globalThis.Deno?.version?.deno!==void 0,KA2=globalThis.process?.versions?.electron!==void 0,qA2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,GA2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,zA2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,UA2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,WA2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,Eu=globalThis.navigator?.userAgentData?.platform,FA2=Eu==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",HA2=Eu==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",BA2=Eu==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",DA2=Eu==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),MA2=Eu==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var F2="\x1B[",Pu="\x1B]",zC="\x07",Iu=";",cZ6=!r71&&Ly1.env.TERM_PROGRAM==="Apple_Terminal",k59=!r71&&Ly1.platform==="win32",_59=r71?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:Ly1.cwd,x59=(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)+Iu+(J+1)+"H"},b59=(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},lZ6=(J=1)=>F2+J+"A",y59=(J=1)=>F2+J+"B",f59=(J=1)=>F2+J+"C",h59=(J=1)=>F2+J+"D",iZ6=F2+"G",g59=cZ6?"\x1B7":F2+"s",m59=cZ6?"\x1B8":F2+"u",u59=F2+"6n",p59=F2+"E",d59=F2+"F",c59=F2+"?25l",l59=F2+"?25h",i59=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=nZ6+(Z<J-1?lZ6():"");if(J)Q+=iZ6;return Q},n59=F2+"K",a59=F2+"1K",nZ6=F2+"2K",r59=F2+"J",s59=F2+"1J",Ny1=F2+"2J",o59=F2+"S",t59=F2+"T",e59="\x1Bc",JJ9=k59?`${Ny1}${F2}0f`:`${Ny1}${F2}3J${F2}H`,QJ9=F2+"?1049h",ZJ9=F2+"?1049l",XJ9=zC,YJ9=(J,Q)=>[Pu,"8",Iu,Iu,Q,zC,J,Pu,"8",Iu,Iu,zC].join(""),KJ9=(J,Q={})=>{let Z=`${Pu}1337;File=inline=1`;if(Q.width)Z+=`;width=${Q.width}`;if(Q.height)Z+=`;height=${Q.height}`;if(Q.preserveAspectRatio===!1)Z+=";preserveAspectRatio=0";return Z+":"+Buffer.from(J).toString("base64")+zC},qJ9={setCwd:(J=_59())=>`${Pu}50;CurrentDir=${J}${zC}`,annotation(J,Q={}){let Z=`${Pu}1337;`,X=Q.x!==void 0,Y=Q.y!==void 0;if((X||Y)&&!(X&&Y&&Q.length!==void 0))throw Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");if(J=J.replaceAll("|",""),Z+=Q.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",Q.length>0)Z+=(X?[J,Q.length,Q.x,Q.y]:[Q.length,J]).join("|");else Z+=J;return Z+zC}};var o71=k6(JX6(),1);function pV(J,Q,{target:Z="stdout",...X}={}){if(!o71.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (​${Q}​)`}return s71.link(J,Q)}pV.isSupported=o71.default.stdout;pV.stderr=(J,Q,Z={})=>pV(J,Q,{target:"stderr",...Z});pV.stderr.isSupported=o71.default.stderr;z0();CX();class jy1{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.1760644904-g1cafaa"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await gn(Q,this.configService)}catch(Q){l.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}import{execFile as e71}from"node:child_process";import{platform as $y1}from"node:os";import{promisify as WJ9}from"node:util";var t71=WJ9(e71),FJ9=(J)=>`\x1B]52;c;${J}\x1B\\`,HJ9="\x1B]52;c;?\x1B\\",BJ9="\x1B]52;p;?\x1B\\";class QX6{capabilities=null;pendingReadPromise=null;readResolve=null;readTimeout=null;setCapabilities(J){this.capabilities=J}isOsc52Supported(){return this.capabilities?.osc52??!1}async commandExists(J){try{return await t71("which",[J]),!0}catch{return!1}}async writeToPbcopy(J){try{let Q=e71("pbcopy");return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`pbcopy exited with code ${Y}`))})}),!0}catch{return!1}}async writeToWlCopy(J){try{let Q=e71("wl-copy");return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`wl-copy exited with code ${Y}`))})}),!0}catch{return!1}}async writeToXclip(J){try{let Q=e71("xclip",["-selection","clipboard"]);return Q.stdin?.write(J),Q.stdin?.end(),await new Promise((Z,X)=>{Q.on("close",(Y)=>{if(Y===0)Z();else X(Error(`xclip exited with code ${Y}`))})}),!0}catch{return!1}}async readFromOSC52WithQuery(J){if(!this.isOsc52Supported())return null;if(this.pendingReadPromise)return this.pendingReadPromise;this.pendingReadPromise=new Promise((Z)=>{this.readResolve=Z,this.readTimeout=setTimeout(()=>{this.readResolve=null,this.pendingReadPromise=null,Z(null)},2000),process.stdout.write(J)});let Q=await this.pendingReadPromise;return this.pendingReadPromise=null,Q}async readFromOSC52(){return this.readFromOSC52WithQuery(HJ9)}handleOSC52Response(J){if(this.readResolve&&this.readTimeout){clearTimeout(this.readTimeout),this.readTimeout=null;try{let Q=Buffer.from(J,"base64").toString("utf8");this.readResolve(Q)}catch{this.readResolve(null)}this.readResolve=null,this.pendingReadPromise=null}}async readFromPbpaste(){try{let{stdout:J}=await t71("pbpaste");return J}catch{return null}}async readFromWlPaste(J){try{let Q=["--no-newline"];if(J==="primary")Q.push("--primary");let{stdout:Z}=await t71("wl-paste",Q);return Z}catch{return null}}async readFromXclip(J){try{let{stdout:Q}=await t71("xclip",["-selection",J,"-o"]);return Q}catch{return null}}async readFromOSC52Primary(){return this.readFromOSC52WithQuery(BJ9)}async readText(){if(this.isOsc52Supported()){let Q=await this.readFromOSC52();if(Q!==null)return Q}if($y1()==="darwin"){let Q=await this.readFromPbpaste();if(Q!==null)return Q}else{if(await this.commandExists("wl-paste")){let Q=await this.readFromWlPaste("clipboard");if(Q!==null)return Q}if(await this.commandExists("xclip")){let Q=await this.readFromXclip("clipboard");if(Q!==null)return Q}}return null}async readPrimarySelection(){if($y1()==="darwin")return this.readText();if(this.isOsc52Supported()){let Q=await this.readFromOSC52Primary();if(Q!==null)return Q}if(await this.commandExists("wl-paste")){let Q=await this.readFromWlPaste("primary");if(Q!==null)return Q}if(await this.commandExists("xclip")){let Q=await this.readFromXclip("primary");if(Q!==null)return Q}return null}async writeText(J){if(this.isOsc52Supported()){let Z=Buffer.from(J).toString("base64"),X=FJ9(Z);process.stdout.write(X);return}if($y1()==="darwin"){if(await this.writeToPbcopy(J))return}else{if(await this.commandExists("wl-copy")&&await this.writeToWlCopy(J))return;if(await this.commandExists("xclip")&&await this.writeToXclip(J))return}}}var zY=new QX6;z0();class J51 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}class o5{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function ZX6(J){if(J instanceof J51)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof o5)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 rV=null,jY9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(rV)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(),OJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{rV=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});rV=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{rV=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 o5(`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(!rV)return new o5("Not connected to Amp web interface");try{rV.disconnect();let Z=rV.clientID;return rV=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new o5(`Disconnected from Amp web interface
6126
6126
  Client ID: ${Z}
6127
6127
  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=nC(),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 jy1(async()=>{try{return(await this.configService.getLatest()).settings["experimental.cli.commandTelemetry.enabled"]===!0}catch{return!1}},this.configService),this.configService.config.pipe(P0((X)=>IB(this.freeTierStatus?.isFreeAvailable??!1,X.settings)),d6()).subscribe((X)=>{this._initBaseCommands(X.length>1)})}_initBaseCommands(J){if(this.commands={...$Y9},process.env.AMP_CONNECT==="1")Object.assign(this.commands,jY9);if(J)Object.assign(this.commands,EY9)}async execute(J,Q,Z=[],X){this.telemetrySubmitter.submit(J).catch((G)=>{l.debug("Failed to submit command telemetry",G)});let Y=this.commands[J];if(Y)return Y.execute(Q,Z);let K=this.latestCustom.find((G)=>G.name===J),q=await Vy1(J,Z,this.customRegistry,{signal:X});if(q.success)if(K?.kind==="markdown"){Q.editorDispatch({type:"set-input",input:q.output});return}else{Q.submitMessage(q.output);return}return Error(q.error??`Command '${J}' failed`)}query(J,Q,Z){let X=J.toLowerCase(),Y=Object.values(this.commands).filter((q)=>q.name.toLowerCase().includes(X)).filter((q)=>{if(!Q||!q.isVisible)return!0;return q.isVisible(Q,Z)}),K=this.latestCustom.filter((q)=>q.available&&q.name.toLowerCase().includes(X)).map((q)=>({name:q.name,description:"Custom command",requiresArgs:q.kind==="executable",execute:(G,z)=>this.execute(q.name,G,z??[])}));return[...Y,...K]}async cleanup(){await this.telemetrySubmitter.dispose()}get(J){let Q=this.commands[J];if(Q)return Q;let Z=this.latestCustom.find((X)=>X.name===J);return{name:J,description:"Custom command",requiresArgs:Z?.kind==="executable",execute:(X,Y)=>this.execute(J,X,Y??[])}}}var $Y9={"generate-agent-file":{name:"generate-agent-file",description:`Generate an ${Q5} file in the current workspace`,execute:async(J,Q)=>{let Z=await J.configService.getLatest(),X=Sq(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 J51;if(Q&&Q.length>0){let X=[{type:"text",text:Q.join(" ").trim()}],Y=J.takeImageAttachments?.()??[];if(Y.length>0)X.push(...Y);J.worker.handle({type:"user:message-queue:enqueue",message:{content:X}})}try{await J.worker.summarizeThread(new AbortController().signal)}catch(Z){return Z instanceof Error?Z:Error("Failed to compact thread")}},isVisible:(J)=>J.agentMode!=="free"},editor:{name:"editor",description:"Open $EDITOR to write a prompt",launchesWindow:!0,execute:async(J,Q)=>{try{let Z=process.env.EDITOR||process.env.VISUAL||"nano",X=await wY9(HK6.join(AY9(),"amp-edit-")),Y=HK6.join(X,"message.amp.md");FK6(`${Z} "${Y}"`,{stdio:"inherit"}),process.stdout.write("\x1B[?25l");try{let q=(await RY9(Y,"utf-8")).trim();if(q)J.editorDispatch({type:"set-input",input:q})}catch(K){if(K?.code==="ENOENT")return;return l.error("Failed to read temporary file",K),Error("Failed to read editor content")}try{await OY9(Y),await LY9(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 mG("dangerouslyAllowAll",!1),new o5("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 mG("dangerouslyAllowAll",!0),new o5("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 qC();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:qC};await i71(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&&J.agentMode!=="free"},continue:{name:"continue",description:"Continue an existing thread",requiresArgs:!1,requiresPicker:!0,execute:async(J,Q)=>{try{if(Q&&Q.length>0){let Z=Q[0]?.trim();if(!Z)return Error("Invalid thread ID provided");return await J.switchToThread(Z),new o5(`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(`
6128
6128
  `).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=$j(new URL(Y),Z.id).toString(),G=`Thread URL: ${pV(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 o5(`${G}
6129
6129
 
6130
- This thread's visibility has been updated to: ${z}`)}catch(W){let F=W instanceof Error?W.message:String(W);if(F.includes("no-workspace"))return Error("You are not a member of any workspace.");if(F.includes("groups-disabled"))return Error("The groups feature is not enabled for this workspace.");if(F.includes("no-groups"))return Error("You are not a member of any groups.");return l.error("Unexpected failure to update thread visibility",W),Error(`Failed to update thread visibility for ${Z.id}`)}}},browser:{name:"browser",description:"Open the current thread in your browser",requiresArgs:!1,execute:async(J,Q)=>{let{thread:Z,ampURL:X}=J,Y=$j(new URL(X),Z.id).toString();try{return await YZ(Y),new o5("Thread opened in browser")}catch(K){l.error("Failed to open browser",{error:K});let q=pV(Y,Y,{fallback:()=>Y});return new o5(`Could not open browser automatically. Thread URL: ${q}`)}},isVisible:(J)=>J.messages.length!==0},url:{name:"url",description:"Display thread URL and copy to clipboard",requiresArgs:!1,execute:async(J,Q)=>{let{thread:Z,ampURL:X}=J,Y=$j(new URL(X),Z.id).toString();try{return await zY.writeText(Y),new o5(`Thread URL: ${Y}
6130
+ This thread's visibility has been updated to: ${z}`)}catch(W){let F=W instanceof Error?W.message:String(W);if(F.includes("no-workspace"))return Error("You are not a member of any workspace.");if(F.includes("groups-disabled"))return Error("The groups feature is not enabled for this workspace.");if(F.includes("no-groups"))return Error("You are not a member of any groups.");return l.error("Unexpected failure to update thread visibility",W),Error(`Failed to update thread visibility for ${Z.id}`)}}},browser:{name:"browser",description:"Open the current thread in your browser",requiresArgs:!1,execute:async(J,Q)=>{let{thread:Z,ampURL:X}=J,Y=$j(new URL(X),Z.id).toString();try{return await YZ(Y),new o5("Thread opened in browser")}catch(K){l.error("Failed to open browser",{error:K});let q=pV(Y,Y,{fallback:()=>Y});return new o5(`Could not open browser automatically. Thread URL: ${q}`)}},isVisible:(J)=>J.messages.length!==0},url:{name:"url",description:"Display thread URL and copy to clipboard",requiresArgs:!1,execute:async(J,Q)=>{let{thread:Z,ampURL:X}=J,Y=$j(new URL(X),Z.id).toString();try{return await zY.writeText(Y),new o5(`Thread URL: ${Y}
6131
6131
 
6132
6132
  (Copied to clipboard)`)}catch(K){return l.error("Failed to copy URL to clipboard",{error:K}),new o5(`Thread URL: ${Y}
6133
6133
 
@@ -6159,7 +6159,7 @@ The context used was: `+J.widget.constructor.name);return Q}updateShouldNotify(J
6159
6159
  `}else Z.push({text:`
6160
6160
  `,style:X.style,hyperlink:X.hyperlink});Q.push({segments:Z,alignment:this._textAlign}),Z=[]}let q=Y[K];if(q!==void 0&&q.length>0)Z.push({text:q,style:X.style,hyperlink:X.hyperlink})}}if(Z.length>0)Q.push({segments:Z,alignment:this._textAlign});if(Q.length===0)Q.push({segments:[{text:"",style:new v1({color:k1.white})}],alignment:this._textAlign});return Q}stylesEqual(J,Q){return J.color===Q.color&&J.backgroundColor===Q.backgroundColor&&J.bold===Q.bold&&J.italic===Q.italic&&J.underline===Q.underline&&J.strikethrough===Q.strikethrough&&J.dim===Q.dim}segmentsEqual(J,Q){return this.stylesEqual(J.style,Q.style)&&(J.hyperlink?.uri===Q.hyperlink?.uri&&J.hyperlink?.id===Q.hyperlink?.id||J.hyperlink===void 0&&Q.hyperlink===void 0)}splitIntoWords(J){let Q=[],Z="",X=!1,Y=T2(J);for(let K of Y){let q=/\s/.test(K);if(q!==X){if(Z.length>0)Q.push(Z),Z="";X=q}Z+=K}if(Z.length>0)Q.push(Z);return Q}applyTextOverflow(J,Q){if(J.length===0)return J;let Z=J[J.length-1];if(!Z)return J;let X=[...J],Y=UY("…",this._emojiWidthSupported),K=Q-Y,q=[],G=0,z=[],U=Q;switch(this._overflow){case"ellipsis":{for(let H of Z.segments){let B=UY(H.text,this._emojiWidthSupported);if(G+B<=K)q.push(H),G+=B;else if(G<K){let M=K-G,V=jf1(H.text,M,this._emojiWidthSupported,"");if(V.length>0)q.push({text:V,style:H.style,hyperlink:H.hyperlink});break}else break}let W=Z.segments[Z.segments.length-1],F=Z.segments.length>0&&W?W.style:new v1({color:k1.white});q.push({text:"…",style:F}),X[X.length-1]={segments:q,alignment:Z.alignment};break}case"fade":case"clip":{for(let W of Z.segments){if(U<=0)break;let F=UY(W.text,this._emojiWidthSupported);if(F<=U)z.push(W),U-=F;else{let H=jf1(W.text,U,this._emojiWidthSupported,"");if(H.length>0)z.push({text:H,style:W.style,hyperlink:W.hyperlink});break}}X[X.length-1]={segments:z,alignment:Z.alignment};break}case"visible":default:break}return X}getStyledSegments(J,Q,Z){let X=[],Y=Q.merge(J.style),K=J.hyperlink??Z;if(J.text)X.push({text:J.text,style:Y,hyperlink:K});if(J.children)for(let q of J.children)X.push(...this.getStyledSegments(q,Y,K));return X}_addLineCharacterPositions(J,Q){let Z=0;if(J.alignment==="center"||J.alignment==="right"){let q=0;for(let G of J.segments)q+=UY(G.text,this._emojiWidthSupported);if(J.alignment==="center")Z=Math.max(0,Math.floor((this.size.width-q)/2));else Z=Math.max(0,this.size.width-q)}let X=this._characterPositions.length,Y=Z;for(let q of J.segments){let G=T2(q.text);for(let z of G){let U=u4(z,this._emojiWidthSupported);if(this._characterPositions.push({x:Y,y:Q,width:z===`
6161
6161
  `?0:U}),z!==`
6162
- `)Y+=U}}let K=this._characterPositions.length-1;if(K>=X)this._visualLines.push({y:Q,start:X,end:K})}applyCellOverflow(J,Q){if(J.length===0)return J;if(this._overflow==="visible")return J;let Z=[...J],X=Z[Z.length-1];if(!X)return Z;switch(this._overflow){case"ellipsis":{let Y=UY("…",this._emojiWidthSupported),K=Q-Y,q=[],G=0;for(let W of X)if(G+W.width<=K)q.push(W),G+=W.width;else break;let z=X[X.length-1],U=z?z.style:{};q.push(O9("…",U,Y)),Z[Z.length-1]=q;break}case"clip":{let Y=[],K=0;for(let q of X)if(K+q.width<=Q)Y.push(q),K+=q.width;else break;Z[Z.length-1]=Y;break}default:break}return Z}_isCharacterSelected(J){if(this._selectionStart===null||this._selectionEnd===null)return!1;let Q=Math.min(this._selectionStart,this._selectionEnd),Z=Math.max(this._selectionStart,this._selectionEnd);return J>=Q&&J<Z}attach(){super.attach()}setContext(J){if(!this._selectable)return;let Q=KR.of(J);if(Q&&!this.selectionArea){if(this.selectionArea=Q,Q.register(this),this.selectableId<=0)this.selectableId=Math.floor(Math.random()*1e6)+1}}detach(){if(this.selectionArea)this.selectionArea.unregister(this),this.selectionArea=void 0;super.detach()}onAttachToSelectionArea(J){}onDetachFromSelectionArea(J){}globalBounds(){if(this.size.width<=0||this.size.height<=0)return Qq6;let J=this.offset.x,Q=this.offset.y,Z=this.parent;while(Z){if(Z instanceof o6)J+=Z.offset.x,Q+=Z.offset.y;Z=Z.parent}return{left:J,top:Q,right:J+this.size.width,bottom:Q+this.size.height}}globalToLocal(J){let Q=this.offset.x,Z=this.offset.y,X=this.parent;while(X){if(X instanceof o6)Q+=X.offset.x,Z+=X.offset.y;X=X.parent}return{x:J.x-Q,y:J.y-Z}}hitTestSelection(J){if(J.x<0||J.y<0||J.x>=this.size.width||J.y>=this.size.height)return null;let Q=this.getOffsetForPosition(J.x,J.y);return Q!==null?{offset:Q}:null}nearestCaretPosition(J){let Q=Math.max(0,Math.min(J.x,this.size.width)),Z=Math.max(0,Math.min(J.y,this.size.height-1)),X=this.getOffsetForPosition(Q,Z);if(X===null){let Y=this.plainText.length;X=Q<this.size.width/2?0:Y}return{offset:X}}wordBoundary(J){let Q=this.plainText,Z=Math.max(0,Math.min(J.offset,Q.length)),X=Z,Y=Z;while(X>0){let K=Q[X-1];if(!K||!/\w/.test(K))break;X--}while(Y<Q.length){let K=Q[Y];if(!K||!/\w/.test(K))break;Y++}if(X===Y)Y=Math.min(Z+1,Q.length);return{start:X,end:Y}}lineBoundary(J){let Q=this.plainText,Z=Math.max(0,Math.min(J.offset,Q.length)),X=0,Y=Q.length;for(let K=Z-1;K>=0;K--)if(Q[K]===`
6162
+ `)Y+=U}}let K=this._characterPositions.length-1;if(K>=X)this._visualLines.push({y:Q,start:X,end:K})}applyCellOverflow(J,Q){if(J.length===0)return J;if(this._overflow==="visible")return J;let Z=[...J],X=Z[Z.length-1];if(!X)return Z;switch(this._overflow){case"ellipsis":{let Y=UY("…",this._emojiWidthSupported),K=Q-Y,q=[],G=0;for(let W of X)if(G+W.width<=K)q.push(W),G+=W.width;else break;let z=X[X.length-1],U=z?z.style:{};q.push(O9("…",U,Y)),Z[Z.length-1]=q;break}case"clip":{let Y=[],K=0;for(let q of X)if(K+q.width<=Q)Y.push(q),K+=q.width;else break;Z[Z.length-1]=Y;break}default:break}return Z}_isCharacterSelected(J){if(this._selectionStart===null||this._selectionEnd===null)return!1;let Q=Math.min(this._selectionStart,this._selectionEnd),Z=Math.max(this._selectionStart,this._selectionEnd);return J>=Q&&J<Z}attach(){super.attach()}setContext(J){if(!this._selectable)return;let Q=KR.of(J);if(Q&&!this.selectionArea){if(this.selectionArea=Q,Q.register(this),this.selectableId<=0)this.selectableId=Math.floor(Math.random()*1e6)+1}}detach(){if(this.selectionArea)this.selectionArea.unregister(this),this.selectionArea=void 0;super.detach()}onAttachToSelectionArea(J){}onDetachFromSelectionArea(J){}globalBounds(){if(this.size.width<=0||this.size.height<=0)return Qq6;let J=this.offset.x,Q=this.offset.y,Z=this.parent;while(Z){if(Z instanceof o6)J+=Z.offset.x,Q+=Z.offset.y;Z=Z.parent}return{left:J,top:Q,right:J+this.size.width,bottom:Q+this.size.height}}globalToLocal(J){let Q=this.offset.x,Z=this.offset.y,X=this.parent;while(X){if(X instanceof o6)Q+=X.offset.x,Z+=X.offset.y;X=X.parent}return{x:J.x-Q,y:J.y-Z}}hitTestSelection(J){if(J.x<0||J.y<0||J.x>=this.size.width||J.y>=this.size.height)return null;let Q=this.getOffsetForPosition(J.x,J.y);return Q!==null?{offset:Q}:null}nearestCaretPosition(J){let Q=Math.max(0,Math.min(J.x,this.size.width)),Z=Math.max(0,Math.min(J.y,this.size.height-1)),X=this.getOffsetForPosition(Q,Z);if(X===null){let Y=Math.floor(Z),K=this._visualLines.find((q)=>q.y===Y);if(K)X=K.end+1;else X=0}return{offset:X}}wordBoundary(J){let Q=this.plainText,Z=Math.max(0,Math.min(J.offset,Q.length)),X=Z,Y=Z;while(X>0){let K=Q[X-1];if(!K||!/\w/.test(K))break;X--}while(Y<Q.length){let K=Q[Y];if(!K||!/\w/.test(K))break;Y++}if(X===Y)Y=Math.min(Z+1,Q.length);return{start:X,end:Y}}lineBoundary(J){let Q=this.plainText,Z=Math.max(0,Math.min(J.offset,Q.length)),X=0,Y=Q.length;for(let K=Z-1;K>=0;K--)if(Q[K]===`
6163
6163
  `){X=K+1;break}for(let K=Z;K<Q.length;K++)if(Q[K]===`
6164
6164
  `){Y=K;break}return{start:X,end:Y}}paragraphBoundary(J){let Q=this.plainText,Z=Math.max(0,Math.min(J.offset,Q.length)),X=0,Y=Q.length;for(let K=Z-1;K>0;K--)if(Q[K]===`
6165
6165
  `&&Q[K-1]===`
@@ -6326,7 +6326,7 @@ ${Q}`),this.textController.clear(),this.textController.insertText(this.pendingTr
6326
6326
  `),J.stdout.write(`Thread: ${H}
6327
6327
  `),J.stdout.write(`Continue this thread with: amp threads continue ${W}
6328
6328
  `)}}function Yu1(J){return J==="smart"?k1.rgb(3,197,97):J==="fast"?k1.rgb(228,180,2):J==="free"?k1.rgb(0,184,255):DF9(J)}function DF9(J){let Q=0;for(let Y=0;Y<J.length;Y++){let K=J.charCodeAt(Y);Q=(Q<<5)-Q+K,Q=Q&Q}let Z=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],X=Math.abs(Q)%Z.length;return k1.index(Z[X])}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}
6329
- `)}var qu1=Ku1.join(xc1||Ku1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function AF9(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 QB(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")mG("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")mG("experimental.agentMode",Q.agentMode)}var wF9=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()]),RF9=M0.record(M0.string(),wF9);async function zu1(J){try{await VF9(Ku1.dirname(qu1),{recursive:!0}),await NF9(qu1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function OF9(){try{return(await jW6(qu1,"utf-8")).trim()}catch(J){return null}}async function jF9(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 RF9.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 $F9(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 wW6=[{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??O5,description:`Custom settings file path (overrides the default location ${O5})`},{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:yK(),description:(J)=>J?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration."},{name:"ide",long:"ide",type:"flag",default:!0,description:(J)=>J?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection."},{name:"interactive",long:"interactive",type:"flag",description:(J)=>J?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"tryGpt5",long:"try-gpt5",type:"switch",default:!1,description:"[DEPRECATED] Try GPT-5 as the primary agent model (see https://ampcode.com/news/gpt-5-oracle)",deprecated:!0},{name:"agentMode",long:"agent-mode",type:"option",description:"Set the experimental agent mode configuration",hidden:!0,choices:md}],RW6=(J)=>("deprecated"in J)&&J.deprecated===!0,EF9=(J)=>("hidden"in J)&&J.hidden===!0,IF9=(J)=>("default"in J),PF9=(J)=>("default"in J)?J.default:void 0;function TF9(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(bK.unknownCommand(Z),1,q)}}var $W6=null;function Vt2(){return $W6}function fJ1(J){return{...J,getThreadEnvironment:A71,vfs:_20({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Y_(J.fileSystem),generateThreadTitle:tq0,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var Uu1=$0.file(LF9.homedir()),EW6=process.env.XDG_CONFIG_HOME?$0.file(process.env.XDG_CONFIG_HOME):c0.joinPath(Uu1,".config");async function ZB(J,Q){Ci1("0.0.1760636252-gda486e");let Z=hZ1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:e1.of([$0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Uu1,userConfigDir:EW6}),{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=Za(KO({configService:Z})),q=U20({configService:Z,toolService:K}),G=NR0(K,E9,Ce).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)zO("JetBrains");else if(Q.ide&&TQ6())zO("VS Code");else if(Q.ide&&CQ6())zO("Neovim");if(J.executeMode)Si1(!0);w96(K,{configService:Z});let U,W=v5.status.pipe(P0((w)=>Boolean(w.connected&&w.authenticated)),d6()).subscribe((w)=>{if(w){if(!U)U=K.registerTool(or)}else U?.dispose(),U=void 0}),F;if(!J.executeMode)F=new _71(process.cwd(),{},!0);else F=new class extends _71{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...
6329
+ `)}var qu1=Ku1.join(xc1||Ku1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function AF9(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 QB(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")mG("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")mG("experimental.agentMode",Q.agentMode)}var wF9=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()]),RF9=M0.record(M0.string(),wF9);async function zu1(J){try{await VF9(Ku1.dirname(qu1),{recursive:!0}),await NF9(qu1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function OF9(){try{return(await jW6(qu1,"utf-8")).trim()}catch(J){return null}}async function jF9(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 RF9.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 $F9(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 wW6=[{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??O5,description:`Custom settings file path (overrides the default location ${O5})`},{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:yK(),description:(J)=>J?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration."},{name:"ide",long:"ide",type:"flag",default:!0,description:(J)=>J?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection."},{name:"interactive",long:"interactive",type:"flag",description:(J)=>J?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"tryGpt5",long:"try-gpt5",type:"switch",default:!1,description:"[DEPRECATED] Try GPT-5 as the primary agent model (see https://ampcode.com/news/gpt-5-oracle)",deprecated:!0},{name:"agentMode",long:"agent-mode",type:"option",description:"Set the experimental agent mode configuration",hidden:!0,choices:md}],RW6=(J)=>("deprecated"in J)&&J.deprecated===!0,EF9=(J)=>("hidden"in J)&&J.hidden===!0,IF9=(J)=>("default"in J),PF9=(J)=>("default"in J)?J.default:void 0;function TF9(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(bK.unknownCommand(Z),1,q)}}var $W6=null;function Vt2(){return $W6}function fJ1(J){return{...J,getThreadEnvironment:A71,vfs:_20({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Y_(J.fileSystem),generateThreadTitle:tq0,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var Uu1=$0.file(LF9.homedir()),EW6=process.env.XDG_CONFIG_HOME?$0.file(process.env.XDG_CONFIG_HOME):c0.joinPath(Uu1,".config");async function ZB(J,Q){Ci1("0.0.1760644904-g1cafaa");let Z=hZ1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:e1.of([$0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Uu1,userConfigDir:EW6}),{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=Za(KO({configService:Z})),q=U20({configService:Z,toolService:K}),G=NR0(K,E9,Ce).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)zO("JetBrains");else if(Q.ide&&TQ6())zO("VS Code");else if(Q.ide&&CQ6())zO("Neovim");if(J.executeMode)Si1(!0);w96(K,{configService:Z});let U,W=v5.status.pipe(P0((w)=>Boolean(w.connected&&w.authenticated)),d6()).subscribe((w)=>{if(w){if(!U)U=K.registerTool(or)}else U?.dispose(),U=void 0}),F;if(!J.executeMode)F=new _71(process.cwd(),{},!0);else F=new class extends _71{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...
6330
6330
  `),!await CF9(J))await rw(),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=O96({playNotificationSound:async(w)=>{if(V){R96(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 CF9(J){if(!J.executeMode){if(!await Wy1("Would you like to log in to Amp? [(y)es, (n)o]: "))return a2.write(`Login cancelled. Run the command again to retry.
6331
6331
  `),!1}return await IW6(J)}async function IW6(J){let Q=MF9(32).toString("hex"),Z=await Uy1(J.ampURL,Q);try{await YZ(Z)}catch(Y){l.error("Failed to open browser",{error:Y})}let X=await Uy1(J.ampURL,Q,!1);a2.write(`If your browser did not open automatically, visit:
6332
6332
 
@@ -6336,12 +6336,12 @@ ${W8.blue.bold(X)}
6336
6336
  Login successful! You can now use the Amp CLI.
6337
6337
  `),!0}catch(Y){return l.error("Login failed",{error:Y}),Y4.write(`
6338
6338
  Login failed: ${Y instanceof Error?Y.message:String(Y)}
6339
- `),!1}}function SF9(){let J=new xm().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)tw(),process.exit(0);let H=F.originalError??F;EJ6(H)}),J.option("-V, --version","output the version number",()=>{a2.write(`0.0.1760636252-gda486e (released 2025-10-16T17:43:03.701Z)
6340
- `),process.exit(0)}),J.addHelpText("after",EQ6()),J.configureHelp({formatHelp:IQ6}),J.command("logout").description("Log out by removing stored API key").action(async(F,H)=>{let B=H.optsWithGlobals(),M=await HY(B);await xF9(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 HY(B);await _F9(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:EW6});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 HY(B);await OW6(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 HY(B);await uF9(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 HY(M);if(H.pick)await Q(M,V,B);else await mF9(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 HY(M);await gF9(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 HY(B);await OW6(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 HY(M);await hF9(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 HY(M);await fF9(M,V,F,B)}),SZ6(J,async(F,H)=>{let B=await HY(H);QB(F,H);let M=await ZB(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,configService:M.configService,cleanupTerminal:tw,asyncDispose:M.asyncDispose.bind(M)}}),ZZ6(J),rQ6(J,async(F)=>{let H=await HY(F);return{settings:H.settings,getThreadDeps:async(B)=>{QB(B,F);let M=await ZB(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 HY(B);QB(H,B);let V=await ZB(M,B);try{await xb1(V,V.configService,{})}finally{await V.asyncDispose(),await tw()}});let X=new xm().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 Yy1(F.force||!1,F.verbose||!1,"0.0.1760636252-gda486e"),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 vV(H,V),L=PF9(F);if(L)N.default(L);if(N.hidden=EF9(F)||RW6(F),"choices"in F)N.choices([...F.choices]);return N}for(let F of wW6)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 vV("-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 vV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1);J.addOption(F)}let q=new vV("--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 vV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(G);let z=new vV("--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 vV("--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 HY(B);if(Object.keys(B).forEach((V)=>{let N=wW6.find((L)=>L.name===V);if(N&&RW6(N)&&!IF9(N))Y4.write(W8.yellow(`Warning: '--${V}' flag is deprecated
6339
+ `),!1}}function SF9(){let J=new xm().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)tw(),process.exit(0);let H=F.originalError??F;EJ6(H)}),J.option("-V, --version","output the version number",()=>{a2.write(`0.0.1760644904-g1cafaa (released 2025-10-16T20:07:01.998Z)
6340
+ `),process.exit(0)}),J.addHelpText("after",EQ6()),J.configureHelp({formatHelp:IQ6}),J.command("logout").description("Log out by removing stored API key").action(async(F,H)=>{let B=H.optsWithGlobals(),M=await HY(B);await xF9(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 HY(B);await _F9(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:EW6});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 HY(B);await OW6(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 HY(B);await uF9(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 HY(M);if(H.pick)await Q(M,V,B);else await mF9(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 HY(M);await gF9(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 HY(B);await OW6(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 HY(M);await hF9(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 HY(M);await fF9(M,V,F,B)}),SZ6(J,async(F,H)=>{let B=await HY(H);QB(F,H);let M=await ZB(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,configService:M.configService,cleanupTerminal:tw,asyncDispose:M.asyncDispose.bind(M)}}),ZZ6(J),rQ6(J,async(F)=>{let H=await HY(F);return{settings:H.settings,getThreadDeps:async(B)=>{QB(B,F);let M=await ZB(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 HY(B);QB(H,B);let V=await ZB(M,B);try{await xb1(V,V.configService,{})}finally{await V.asyncDispose(),await tw()}});let X=new xm().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 Yy1(F.force||!1,F.verbose||!1,"0.0.1760644904-g1cafaa"),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 vV(H,V),L=PF9(F);if(L)N.default(L);if(N.hidden=EF9(F)||RW6(F),"choices"in F)N.choices([...F.choices]);return N}for(let F of wW6)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 vV("-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 vV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1);J.addOption(F)}let q=new vV("--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 vV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(G);let z=new vV("--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 vV("--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 HY(B);if(Object.keys(B).forEach((V)=>{let N=wW6.find((L)=>L.name===V);if(N&&RW6(N)&&!IF9(N))Y4.write(W8.yellow(`Warning: '--${V}' flag is deprecated
6341
6341
  `))}),H.args.length>0)TF9(M,H);await Gu1(M,B,H)});let U=new xm("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 yF9(F.outputDir,F.includeFullLogs)});J.addCommand(U);let W=new xm("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 bF9(F.version)});return J.addCommand(W),J}async function yJ1(J,Q){let{thread:Z,visibility:X}=Q,Y=Z?.id??tK(),K=fJ1(J);if(Z)await J.threadStorage.set(Y,Z);let q=await gJ.getOrCreateForThread(K,Y);if(X)await J.threadSyncService.updateThreadMeta(Y,c71(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=d71(Q);if(X instanceof Error)FX(X.message);let Y,K=null;if(Q.streamJsonInput)Y="";else if(typeof Q.execute==="string"){Y=Q.execute;let R=(await Fy1()).trimEnd();if(R)K=R}else Y=(await Fy1()).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"
6342
6342
  Or pipe via stdin: echo "your message" | amp --execute`);QB(Z,Q);let q=await ZB(J,Q);$W6=q;let G=fJ1(q),z=async(R)=>{let O=await jW6(R,"utf-8"),j=JSON.parse(O);if(!qW(j.id))throw new f9(bK.invalidThreadId);return yJ1(q,{visibility:X,thread:j})},U=async(R)=>{if(!qW(R))throw new f9(bK.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}`),mG("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 E71(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.
6343
- `),await rw(),process.exit(1);if(J.executeMode&&Q.remote)await XZ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await W();if(J.executeMode)await hJ6(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 jO({jetbrainsOnly:Q.jetbrains});if(R.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(R.length===1){let O=R[0];if(O)v5.selectConfig(O)}else B=!0}let V=Gy1("0.0.1760636252-gda486e",q.settingsStorage),N=e1.of([$0.file(process.cwd())]),L=nC(void 0,N);if(Y)H.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let A=await Z5.getUserFreeTierStatus({},{config:q.configService});l.info("User free tier status:",A);let w=await GZ6();l.info("Loaded session state:",w),await AW6({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:Z5,ampURL:J.ampURL,startNewThread:F,pickAndContinueThread:async()=>{l.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:v5,connectedClientsService:new cd,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 HY(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.
6344
- `);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 UZ6(Y),await WZ6(Y),J.mcpConfig){let G=await jF9(J.mcpConfig);Y=$F9(Y,G)}let K=await Y.get("url","global");if(!K)K=WZ;if(!UB(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:YZ6(await ob1(J,Y))}}function vF9(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 kF9(){let J=vF9(process.argv);if(qJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),AF9(l),l.info("Starting Amp CLI.",{version:"0.0.1760636252-gda486e",buildTimestamp:"2025-10-16T17:43:03.701Z",buildType:"'release'"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new f9(bK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await SF9().parseAsync(process.argv)}kF9().catch(E71);async function _F9(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}
6343
+ `),await rw(),process.exit(1);if(J.executeMode&&Q.remote)await XZ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await W();if(J.executeMode)await hJ6(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 jO({jetbrainsOnly:Q.jetbrains});if(R.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(R.length===1){let O=R[0];if(O)v5.selectConfig(O)}else B=!0}let V=Gy1("0.0.1760644904-g1cafaa",q.settingsStorage),N=e1.of([$0.file(process.cwd())]),L=nC(void 0,N);if(Y)H.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let A=await Z5.getUserFreeTierStatus({},{config:q.configService});l.info("User free tier status:",A);let w=await GZ6();l.info("Loaded session state:",w),await AW6({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:Z5,ampURL:J.ampURL,startNewThread:F,pickAndContinueThread:async()=>{l.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:v5,connectedClientsService:new cd,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 HY(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.
6344
+ `);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 UZ6(Y),await WZ6(Y),J.mcpConfig){let G=await jF9(J.mcpConfig);Y=$F9(Y,G)}let K=await Y.get("url","global");if(!K)K=WZ;if(!UB(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:YZ6(await ob1(J,Y))}}function vF9(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 kF9(){let J=vF9(process.argv);if(qJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),AF9(l),l.info("Starting Amp CLI.",{version:"0.0.1760644904-g1cafaa",buildTimestamp:"2025-10-16T20:07:01.998Z",buildType:"'release'"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new f9(bK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await SF9().parseAsync(process.argv)}kF9().catch(E71);async function _F9(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}
6345
6345
  `);else if(!UB(J.ampURL))a2.write(`Logging in to ${new URL(J.ampURL).hostname}
6346
6346
  `);let Z=process.env.AMP_API_KEY;if(Z)a2.write(`API key found in environment variable, storing...
6347
6347
  `),await Q.set("apiKey",Z,J.ampURL),a2.write(`API key successfully stored.
@@ -6357,7 +6357,7 @@ Or pipe via stdin: echo "your message" | amp --execute`);QB(Z,Q);let q=await ZB(
6357
6357
  `));try{let Q;if(J)Q=J,Y4.write(W8.blue(`Updating to version ${J}...
6358
6358
  `)),await YC(J),Y4.write(W8.green(`✓ Successfully updated to version ${J}
6359
6359
  `));else{Y4.write(W8.blue(`Checking for updates...
6360
- `));let{hasUpdate:X,latestVersion:Y}=await _j("0.0.1760636252-gda486e");if(!X)Y4.write(W8.green(`✓ Amp CLI is already up to date.
6360
+ `));let{hasUpdate:X,latestVersion:Y}=await _j("0.0.1760644904-g1cafaa");if(!X)Y4.write(W8.green(`✓ Amp CLI is already up to date.
6361
6361
  `)),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}...
6362
6362
  `)),await YC(Y),Y4.write(W8.green(`✓ Successfully updated to version ${Y}
6363
6363
  `))}let Z=await ZR(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.1760636252-gda486e",
3
+ "version": "0.0.1760644904-g1cafaa",
4
4
  "description": "CLI for Amp, an agentic coding tool built by Sourcegraph.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {