@sourcegraph/amp 0.0.1761144174-geabda4 → 0.0.1761148890-geabda4
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.
- package/dist/main.js +7 -7
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -6210,7 +6210,7 @@ See https://ampcode.com/manual#toolboxes`);return Q[0]||cw}function XX6(J,Q){let
|
|
|
6210
6210
|
`;async function GX6(J,Q,Z,X){let Y=performance.now(),K=[...e_(tM1(J)),{role:"user",parts:[{text:qJ9.replace("{USER_GOAL}",Q)}]}],q=await v$(pr,K,[],J,Z,X,{responseMimeType:"application/json",responseJsonSchema:M0.toJSONSchema(qX6)}),G=qX6.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}}HL();H8();k6();function zX6(J){let Q=J.trim();if(Q==="quit"||Q==="exit")return"/quit";return J}function UX6(J,Q,Z){if(J.agentMode)return J.agentMode;if(Q?.agentMode){let X=Q.agentMode;if(X==="free"){if(Z?.canUseAmpFree??!1)return"free";return"smart"}return X}return"smart"}z0();nB();import GJ9 from"node:fs";import FX6 from"node:path";function WX6(J){let Q=J.trim().replace(/^["']|["']$/g,"");if(Q=Q.replace(/\\(.)/g,"$1"),!/\.(png|jpe?g|gif|webp)$/i.test(Q))return null;if(!FX6.isAbsolute(Q))return null;return l.debug("Extracted image path",{original:J,extracted:Q}),Q}function HX6(J){try{let Q=FX6.extname(J).toLowerCase(),Z=me1(Q);if(!Z)return l.warn("Unsupported image file extension",{ext:Q}),null;try{let X=GJ9.readFileSync(J);return zJ9(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 zJ9(J,Q){if(J.length>IF)return l.warn(`Image file too large: ${J.length} bytes (max: ${IF})`),null;return{type:"image",source:{type:"base64",data:J.toString("base64"),mediaType:Q}}}import{execSync as fK6}from"node:child_process";import{rmdir as ZK9}from"node:fs/promises";import{tmpdir as XK9}from"node:os";import hK6 from"node:path";sO();z0();import{spawn as UJ9}from"node:child_process";import{promises as FJ9}from"node:fs";function BX6(J){return J.kind==="executable"}function DX6(J){return J.kind==="markdown"}var iH=50000,MX6=300000;async function _y1(J,Q,Z,X={}){let{timeoutMs:Y=MX6,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}),DX6(q))return await WJ9(q,Q);else if(BX6(q))return await HJ9(q,Q,Y,K);else return{success:!1,output:"",error:"Unsupported command type"}}catch(q){return l.error("Failed to execute command",{commandName:J,error:q}),{success:!1,output:"",error:q instanceof Error?q.message:"Unknown error occurred"}}}async function WJ9(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await FJ9.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>iH?Z.slice(0,iH)+`
|
|
6211
6211
|
... (output truncated at ${iH} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function HJ9(J,Q,Z=MX6,X){return new Promise((Y)=>{let[K,q]=BJ9(J,Q);l.debug("Spawning command",{spawnCommand:K,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Z});let G=ye1(X),z=!1,U=setTimeout(()=>{z=!0,G.abort(),l.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),F=UJ9(K,q,{stdio:["pipe","pipe","pipe"],signal:G.signal,detached:!0}),W=[],H=[],B=0;F.stdout?.on("data",(M)=>{let V=M.toString();if(B+=V.length,B<=iH)W.push(V);else{let N=iH-(B-V.length);if(N>0)W.push(V.slice(0,N))}}),F.stderr?.on("data",(M)=>{let V=M.toString();if(B+=V.length,B<=iH)H.push(V);else{let N=iH-(B-V.length);if(N>0)H.push(V.slice(0,N))}}),F.on("close",(M)=>{if(clearTimeout(U),z){Y({success:!1,output:W.join(""),error:`Command timed out after ${Z}ms`,exitCode:void 0});return}if(G.signal.aborted){Y({success:!1,output:W.join(""),error:"The command was aborted",exitCode:M??void 0});return}let V=M===0||M===1,N=W.join(""),L=H.join(""),A=N;if(!V&&!N.trim()&&L.trim())A=L;else if(L.trim())A+=N?`
|
|
6212
6212
|
${L}`:L;if(B>iH)A+=`
|
|
6213
|
-
... (output truncated at ${iH} characters)`;Y({success:V,output:A.trim(),error:!V?L.trim()||"Command failed":void 0,exitCode:M??void 0})}),F.on("error",(M)=>{clearTimeout(U);let V=M.message;if(z)V=`Command timed out after ${Z}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")V="The command was aborted";Y({success:!1,output:W.join(""),error:V})})})}function BJ9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return MJ9(Z,X?[...X]:null,Y,Q);else return DJ9(Z,X?[...X]:null,Y,Q)}function DJ9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function MJ9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}z0();Sj();W2();PB();kY();gF();k6();I0();import{mkdtemp as YK9,readFile as KK9,unlink as qK9,writeFile as dw2}from"fs/promises";var L51={};w6(L51,{scrollUp:()=>bJ9,scrollDown:()=>yJ9,link:()=>pJ9,image:()=>dJ9,iTerm:()=>cJ9,exitAlternativeScreen:()=>mJ9,eraseUp:()=>xJ9,eraseStartLine:()=>kJ9,eraseScreen:()=>xy1,eraseLines:()=>SJ9,eraseLine:()=>AX6,eraseEndLine:()=>vJ9,eraseDown:()=>_J9,enterAlternativeScreen:()=>gJ9,cursorUp:()=>NX6,cursorTo:()=>LJ9,cursorShow:()=>CJ9,cursorSavePosition:()=>jJ9,cursorRestorePosition:()=>$J9,cursorPrevLine:()=>PJ9,cursorNextLine:()=>IJ9,cursorMove:()=>AJ9,cursorLeft:()=>LX6,cursorHide:()=>TJ9,cursorGetPosition:()=>EJ9,cursorForward:()=>wJ9,cursorDown:()=>RJ9,cursorBackward:()=>OJ9,clearTerminal:()=>hJ9,clearScreen:()=>fJ9,beep:()=>uJ9});import by1 from"node:process";var N51=globalThis.window?.document!==void 0,dA2=globalThis.process?.versions?.node!==void 0,cA2=globalThis.process?.versions?.bun!==void 0,lA2=globalThis.Deno?.version?.deno!==void 0,iA2=globalThis.process?.versions?.electron!==void 0,nA2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,aA2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,rA2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,sA2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,oA2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,hu=globalThis.navigator?.userAgentData?.platform,tA2=hu==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",eA2=hu==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",JR2=hu==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",QR2=hu==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),ZR2=hu==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var A2="\x1B[",mu="\x1B]",BC="\x07",gu=";",VX6=!N51&&by1.env.TERM_PROGRAM==="Apple_Terminal",VJ9=!N51&&by1.platform==="win32",NJ9=N51?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:by1.cwd,LJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return A2+(J+1)+"G";return A2+(Q+1)+gu+(J+1)+"H"},AJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=A2+-J+"D";else if(J>0)Z+=A2+J+"C";if(Q<0)Z+=A2+-Q+"A";else if(Q>0)Z+=A2+Q+"B";return Z},NX6=(J=1)=>A2+J+"A",RJ9=(J=1)=>A2+J+"B",wJ9=(J=1)=>A2+J+"C",OJ9=(J=1)=>A2+J+"D",LX6=A2+"G",jJ9=VX6?"\x1B7":A2+"s",$J9=VX6?"\x1B8":A2+"u",EJ9=A2+"6n",IJ9=A2+"E",PJ9=A2+"F",TJ9=A2+"?25l",CJ9=A2+"?25h",SJ9=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=AX6+(Z<J-1?NX6():"");if(J)Q+=LX6;return Q},vJ9=A2+"K",kJ9=A2+"1K",AX6=A2+"2K",_J9=A2+"J",xJ9=A2+"1J",xy1=A2+"2J",bJ9=A2+"S",yJ9=A2+"T",fJ9="\x1Bc",hJ9=VJ9?`${xy1}${A2}0f`:`${xy1}${A2}3J${A2}H`,gJ9=A2+"?1049h",mJ9=A2+"?1049l",uJ9=BC,pJ9=(J,Q)=>[mu,"8",gu,gu,Q,BC,J,mu,"8",gu,gu,BC].join(""),dJ9=(J,Q={})=>{let Z=`${mu}1337;File=inline=1`;if(Q.width)Z+=`;width=${Q.width}`;if(Q.height)Z+=`;height=${Q.height}`;if(Q.preserveAspectRatio===!1)Z+=";preserveAspectRatio=0";return Z+":"+Buffer.from(J).toString("base64")+BC},cJ9={setCwd:(J=NJ9())=>`${mu}50;CurrentDir=${J}${BC}`,annotation(J,Q={}){let Z=`${mu}1337;`,X=Q.x!==void 0,Y=Q.y!==void 0;if((X||Y)&&!(X&&Y&&Q.length!==void 0))throw Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");if(J=J.replaceAll("|",""),Z+=Q.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",Q.length>0)Z+=(X?[J,Q.length,Q.x,Q.y]:[Q.length,J]).join("|");else Z+=J;return Z+BC}};var A51=x6(IX6(),1);function sV(J,Q,{target:Z="stdout",...X}={}){if(!A51.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (${Q})`}return L51.link(J,Q)}sV.isSupported=A51.default.stdout;sV.stderr=(J,Q,Z={})=>sV(J,Q,{target:"stderr",...Z});sV.stderr.isSupported=A51.default.stderr;z0();kY();class my1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Z])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1761144174-geabda4"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Xa(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 w51}from"node:child_process";import{platform as uy1}from"node:os";import{promisify as aJ9}from"node:util";var R51=aJ9(w51),rJ9=(J)=>`\x1B]52;c;${J}\x1B\\`,sJ9="\x1B]52;c;?\x1B\\",oJ9="\x1B]52;p;?\x1B\\";class PX6{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 R51("which",[J]),!0}catch{return!1}}async writeToPbcopy(J){try{let Q=w51("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=w51("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=w51("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(sJ9)}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 R51("pbpaste");return J}catch{return null}}async readFromWlPaste(J){try{let Q=["--no-newline"];if(J==="primary")Q.push("--primary");let{stdout:Z}=await R51("wl-paste",Q);return Z}catch{return null}}async readFromXclip(J){try{let{stdout:Q}=await R51("xclip",["-selection",J,"-o"]);return Q}catch{return null}}async readFromOSC52Primary(){return this.readFromOSC52WithQuery(oJ9)}async readText(){if(this.isOsc52Supported()){let Q=await this.readFromOSC52();if(Q!==null)return Q}if(uy1()==="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(uy1()==="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=rJ9(Z);process.stdout.write(X);return}if(uy1()==="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 BY=new PX6;z0();class O51 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}class l7{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function TX6(J){if(J instanceof O51)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof l7)return{title:"Info",description:J.message,type:"info"};return l.warn("Unknown error type encountered",{name:J.name,message:J.message,stack:J.stack}),{title:"Error",description:J.message||"An unexpected error occurred.",type:"error"}}var XN=null,GK9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(XN)return Error("Already connected. Use /disconnect first to reconnect.");let{connectedClientsService:Z}=J;await Z.start({clientId:J.clientId,currentThreadID:J.worker.thread.id});let Y=Z.getCurrentStatus().clientID||"unknown",{connectBackground:K}=await Promise.resolve().then(() => (sb1(),oJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{XN=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});XN=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{XN=null,Z.sendStatus({connected:!1,errorMessage:M.message})});let z=(await J.configService.getLatest()).settings.url,U=J.worker.thread.id,F=new URL(`/threads/${U}`,z).toString(),W=new URL("/clients",z).toString(),H="";try{H=await(await Promise.resolve().then(() => x6(bf1(),1))).toString(F,{type:"utf8",margin:2,color:{dark:"#000000",light:"#FFFFFF"}})}catch(M){l.error("Failed to generate QR code:",M)}if((process.stdout.rows||24)>=30&&H&&J.onShowQRCodeOverlay)J.onShowQRCodeOverlay({url:W,qrCode:H});else return new l7(`Continue at ${W}`)}catch(Z){return J.connectedClientsService.sendStatus({connected:!1,errorMessage:Z.message}),Error(`Failed to start connection: ${Z.message}`)}}},disconnect:{name:"disconnect",description:"Disconnect from web interface",execute:async(J,Q)=>{if(!XN)return new l7("Not connected to Amp web interface");try{XN.disconnect();let Z=XN.clientID;return XN=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new l7(`Disconnected from Amp web interface
|
|
6213
|
+
... (output truncated at ${iH} characters)`;Y({success:V,output:A.trim(),error:!V?L.trim()||"Command failed":void 0,exitCode:M??void 0})}),F.on("error",(M)=>{clearTimeout(U);let V=M.message;if(z)V=`Command timed out after ${Z}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")V="The command was aborted";Y({success:!1,output:W.join(""),error:V})})})}function BJ9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return MJ9(Z,X?[...X]:null,Y,Q);else return DJ9(Z,X?[...X]:null,Y,Q)}function DJ9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function MJ9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}z0();Sj();W2();PB();kY();gF();k6();I0();import{mkdtemp as YK9,readFile as KK9,unlink as qK9,writeFile as dw2}from"fs/promises";var L51={};w6(L51,{scrollUp:()=>bJ9,scrollDown:()=>yJ9,link:()=>pJ9,image:()=>dJ9,iTerm:()=>cJ9,exitAlternativeScreen:()=>mJ9,eraseUp:()=>xJ9,eraseStartLine:()=>kJ9,eraseScreen:()=>xy1,eraseLines:()=>SJ9,eraseLine:()=>AX6,eraseEndLine:()=>vJ9,eraseDown:()=>_J9,enterAlternativeScreen:()=>gJ9,cursorUp:()=>NX6,cursorTo:()=>LJ9,cursorShow:()=>CJ9,cursorSavePosition:()=>jJ9,cursorRestorePosition:()=>$J9,cursorPrevLine:()=>PJ9,cursorNextLine:()=>IJ9,cursorMove:()=>AJ9,cursorLeft:()=>LX6,cursorHide:()=>TJ9,cursorGetPosition:()=>EJ9,cursorForward:()=>wJ9,cursorDown:()=>RJ9,cursorBackward:()=>OJ9,clearTerminal:()=>hJ9,clearScreen:()=>fJ9,beep:()=>uJ9});import by1 from"node:process";var N51=globalThis.window?.document!==void 0,dA2=globalThis.process?.versions?.node!==void 0,cA2=globalThis.process?.versions?.bun!==void 0,lA2=globalThis.Deno?.version?.deno!==void 0,iA2=globalThis.process?.versions?.electron!==void 0,nA2=globalThis.navigator?.userAgent?.includes("jsdom")===!0,aA2=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,rA2=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,sA2=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,oA2=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,hu=globalThis.navigator?.userAgentData?.platform,tA2=hu==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",eA2=hu==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",JR2=hu==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",QR2=hu==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),ZR2=hu==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var A2="\x1B[",mu="\x1B]",BC="\x07",gu=";",VX6=!N51&&by1.env.TERM_PROGRAM==="Apple_Terminal",VJ9=!N51&&by1.platform==="win32",NJ9=N51?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:by1.cwd,LJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");if(typeof Q!=="number")return A2+(J+1)+"G";return A2+(Q+1)+gu+(J+1)+"H"},AJ9=(J,Q)=>{if(typeof J!=="number")throw TypeError("The `x` argument is required");let Z="";if(J<0)Z+=A2+-J+"D";else if(J>0)Z+=A2+J+"C";if(Q<0)Z+=A2+-Q+"A";else if(Q>0)Z+=A2+Q+"B";return Z},NX6=(J=1)=>A2+J+"A",RJ9=(J=1)=>A2+J+"B",wJ9=(J=1)=>A2+J+"C",OJ9=(J=1)=>A2+J+"D",LX6=A2+"G",jJ9=VX6?"\x1B7":A2+"s",$J9=VX6?"\x1B8":A2+"u",EJ9=A2+"6n",IJ9=A2+"E",PJ9=A2+"F",TJ9=A2+"?25l",CJ9=A2+"?25h",SJ9=(J)=>{let Q="";for(let Z=0;Z<J;Z++)Q+=AX6+(Z<J-1?NX6():"");if(J)Q+=LX6;return Q},vJ9=A2+"K",kJ9=A2+"1K",AX6=A2+"2K",_J9=A2+"J",xJ9=A2+"1J",xy1=A2+"2J",bJ9=A2+"S",yJ9=A2+"T",fJ9="\x1Bc",hJ9=VJ9?`${xy1}${A2}0f`:`${xy1}${A2}3J${A2}H`,gJ9=A2+"?1049h",mJ9=A2+"?1049l",uJ9=BC,pJ9=(J,Q)=>[mu,"8",gu,gu,Q,BC,J,mu,"8",gu,gu,BC].join(""),dJ9=(J,Q={})=>{let Z=`${mu}1337;File=inline=1`;if(Q.width)Z+=`;width=${Q.width}`;if(Q.height)Z+=`;height=${Q.height}`;if(Q.preserveAspectRatio===!1)Z+=";preserveAspectRatio=0";return Z+":"+Buffer.from(J).toString("base64")+BC},cJ9={setCwd:(J=NJ9())=>`${mu}50;CurrentDir=${J}${BC}`,annotation(J,Q={}){let Z=`${mu}1337;`,X=Q.x!==void 0,Y=Q.y!==void 0;if((X||Y)&&!(X&&Y&&Q.length!==void 0))throw Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");if(J=J.replaceAll("|",""),Z+=Q.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",Q.length>0)Z+=(X?[J,Q.length,Q.x,Q.y]:[Q.length,J]).join("|");else Z+=J;return Z+BC}};var A51=x6(IX6(),1);function sV(J,Q,{target:Z="stdout",...X}={}){if(!A51.default[Z]){if(X.fallback===!1)return J;return typeof X.fallback==="function"?X.fallback(J,Q):`${J} (${Q})`}return L51.link(J,Q)}sV.isSupported=A51.default.stdout;sV.stderr=(J,Q,Z={})=>sV(J,Q,{target:"stderr",...Z});sV.stderr.isSupported=A51.default.stderr;z0();kY();class my1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Z])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1761148890-geabda4"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Xa(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 w51}from"node:child_process";import{platform as uy1}from"node:os";import{promisify as aJ9}from"node:util";var R51=aJ9(w51),rJ9=(J)=>`\x1B]52;c;${J}\x1B\\`,sJ9="\x1B]52;c;?\x1B\\",oJ9="\x1B]52;p;?\x1B\\";class PX6{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 R51("which",[J]),!0}catch{return!1}}async writeToPbcopy(J){try{let Q=w51("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=w51("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=w51("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(sJ9)}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 R51("pbpaste");return J}catch{return null}}async readFromWlPaste(J){try{let Q=["--no-newline"];if(J==="primary")Q.push("--primary");let{stdout:Z}=await R51("wl-paste",Q);return Z}catch{return null}}async readFromXclip(J){try{let{stdout:Q}=await R51("xclip",["-selection",J,"-o"]);return Q}catch{return null}}async readFromOSC52Primary(){return this.readFromOSC52WithQuery(oJ9)}async readText(){if(this.isOsc52Supported()){let Q=await this.readFromOSC52();if(Q!==null)return Q}if(uy1()==="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(uy1()==="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=rJ9(Z);process.stdout.write(X);return}if(uy1()==="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 BY=new PX6;z0();class O51 extends Error{constructor(J="Thread has no messages to compact"){super(J);this.name="NoMessagesToCompactError"}}class l7{message;name;constructor(J){this.message=J;this.name="InformationMessage"}}function TX6(J){if(J instanceof O51)return{title:"Cannot compact thread",description:"Thread has no messages to compact.",type:"error"};if(J instanceof l7)return{title:"Info",description:J.message,type:"info"};return l.warn("Unknown error type encountered",{name:J.name,message:J.message,stack:J.stack}),{title:"Error",description:J.message||"An unexpected error occurred.",type:"error"}}var XN=null,GK9={connect:{name:"connect",description:"Connect CLI to web interface for current thread access",execute:async(J,Q)=>{try{if(XN)return Error("Already connected. Use /disconnect first to reconnect.");let{connectedClientsService:Z}=J;await Z.start({clientId:J.clientId,currentThreadID:J.worker.thread.id});let Y=Z.getCurrentStatus().clientID||"unknown",{connectBackground:K}=await Promise.resolve().then(() => (sb1(),oJ6)),q=await K({worker:J.worker},J.configService,{clientId:J.clientId,onUserDisconnect:()=>{XN=null,Z.sendStatus({connected:!1,enabled:!1,errorMessage:"Disconnected by user via web interface"})}});XN=q,q.promise.then(()=>{Z.sendStatus({connected:!0,errorMessage:void 0})}).catch((M)=>{XN=null,Z.sendStatus({connected:!1,errorMessage:M.message})});let z=(await J.configService.getLatest()).settings.url,U=J.worker.thread.id,F=new URL(`/threads/${U}`,z).toString(),W=new URL("/clients",z).toString(),H="";try{H=await(await Promise.resolve().then(() => x6(bf1(),1))).toString(F,{type:"utf8",margin:2,color:{dark:"#000000",light:"#FFFFFF"}})}catch(M){l.error("Failed to generate QR code:",M)}if((process.stdout.rows||24)>=30&&H&&J.onShowQRCodeOverlay)J.onShowQRCodeOverlay({url:W,qrCode:H});else return new l7(`Continue at ${W}`)}catch(Z){return J.connectedClientsService.sendStatus({connected:!1,errorMessage:Z.message}),Error(`Failed to start connection: ${Z.message}`)}}},disconnect:{name:"disconnect",description:"Disconnect from web interface",execute:async(J,Q)=>{if(!XN)return new l7("Not connected to Amp web interface");try{XN.disconnect();let Z=XN.clientID;return XN=null,J.connectedClientsService.sendStatus({connected:!1,enabled:!1,errorMessage:void 0}),new l7(`Disconnected from Amp web interface
|
|
6214
6214
|
Client ID: ${Z}
|
|
6215
6215
|
Server will clean up automatically within 60 seconds`)}catch(Z){return Error(`Failed to disconnect: ${Z.message}`)}}}};class yf1{configService;commands;customRegistry;latestCustom=[];telemetrySubmitter;constructor(J=YS(),Q){this.configService=Q;this.customRegistry=J,this._initBaseCommands(!1),this.customRegistry.commands.subscribe((Z)=>this.latestCustom=Z),this.telemetrySubmitter=new my1(async()=>{try{return(await this.configService.getLatest()).settings["experimental.cli.commandTelemetry.enabled"]===!0}catch{return!1}},this.configService),this.configService.config.pipe(v0((Z)=>LB(Z.settings)),e6()).subscribe((Z)=>{this._initBaseCommands(Z.length>1)})}_initBaseCommands(J){if(this.commands={...zK9},process.env.AMP_CONNECT==="1")Object.assign(this.commands,GK9);if(J)Object.assign(this.commands,UK9)}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 _y1(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 zK9={"generate-agent-file":{name:"generate-agent-file",description:`Generate an ${Y5} file in the current workspace`,execute:async(J,Q)=>{let Z=await J.configService.getLatest(),X=mq(Z.settings),K=J.getInMemoryAgentModeOverride()??X;J.worker.handle({type:"user:message",message:{content:[{type:"text",text:L90}],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 O51;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 YK9(hK6.join(XK9(),"amp-edit-")),Y=hK6.join(X,"message.amp.md");fK6(`${Z} "${Y}"`,{stdio:"inherit"}),process.stdout.write("\x1B[?25l");try{let q=(await KK9(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 qK9(Y),await ZK9(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 eG("dangerouslyAllowAll",!1),new l7("Amp is now following permissions rules for this session")}catch(K){return l.error("Failed to set dangerously allow all setting",K),Error("Failed to enable permissions for this session")}case"off":try{return eG("dangerouslyAllowAll",!0),new l7("Permissions disabled for this session - you will NOT be asked for confirmation before Amp runs a command.")}catch(K){return l.error("Failed to set dangerously allow all setting",K),Error("Failed to disable permissions for this session")}case"edit":break;default:return Error(`Invalid option: ${Y}. Use: on, off, or edit (or no argument for edit)`)}}let Z=await WC();if(Z===null)return Error("No editor found, please set $EDITOR to edit permissions");let X="";try{let Y={stdin:process.stdin,stdout:process.stdout,stderr:{write:(K)=>{return X=K.toString(),!0}},exit:(K)=>{if(K!==0)throw l.error("editPermissions exited with status",K),Error(X)},settingsFile:J.settingsFilePath,resolveEditor:WC};await D51(Y);return}catch(Y){l.error("failed to open permissions editor:",Y);let K=Y instanceof Error?`: ${Y.message}`:"";return Error(`Failed to open ${Z}${K}`)}finally{process.stdout.write("\x1B[?25l")}}},new:{name:"new",description:"Start a new thread",execute:async(J,Q)=>{try{await J.startNewThread();return}catch(Z){return l.error("Failed to start new thread",Z),Error("Failed to start new thread")}},isVisible:(J)=>J.messages.length!==0},handoff:{name:"handoff",description:"Start new focused thread with relevant files and prompt: /handoff <your goal>",statusMessage:"Handing off...",requiresArgs:!0,execute:async()=>{return},isVisible:(J)=>J.messages.length!==0&&J.agentMode!=="free"},continue:{name:"continue",description:"Continue an existing thread",requiresArgs:!1,requiresPicker:!0,execute:async(J,Q)=>{try{if(Q&&Q.length>0){let Z=Q[0]?.trim();if(!Z)return Error("Invalid thread ID provided");return await J.switchToThread(Z),new l7(`Switched to existing thread: ${Z}`)}await J.pickAndContinueThread();return}catch(Z){return l.error("Failed to continue thread",Z),Error("Failed to continue thread")}}},queue:{name:"queue",description:"Queue a message to send when inference completes. If no inference running, sends immediately.",requiresArgs:!0,execute:async(J,Q)=>{if(!Q||Q.length===0)return Error("Queue command requires a message argument. Usage: /queue <message>");let X=[{type:"text",text:Q.join(" ").trim()}],Y=J.takeImageAttachments?.()??[];if(Y.length>0)X.push(...Y);J.worker.handle({type:"user:message-queue:enqueue",message:{content:X}})}},dequeue:{name:"dequeue",description:"Dequeue all messages and restore them to the prompt editor",execute:async(J,Q)=>{let Z=J.thread.queuedMessages??[];if(Z.length===0)return;let Y=Z.map((K)=>{return K.queuedMessage.content.filter((G)=>G.type==="text").map((G)=>G.text).join("").trim()}).filter(Boolean).join(`
|
|
6216
6216
|
`).trim();await J.worker.handle({type:"user:message-queue:discard"}),J.editorDispatch({type:"set-input",input:Y})},isVisible:(J)=>(J.queuedMessages?.length??0)>0},share:{name:"share",description:"Set thread visibility - `/share private|workspace|group|public`",execute:async(J,Q)=>{let{thread:Z,threadSyncService:X,ampURL:Y}=J;if(!Q||Q.length===0)return Error("Please specify a visibility option: private, workspace, group, or public");let K=vj(new URL(Y),Z.id).toString(),G=`Thread URL: ${sV(K,K,{fallback:()=>K})}`,z=Q[0]?.trim().toLowerCase(),U;switch(z){case"private":U={visibility:"private",sharedGroupIDs:[]};break;case"workspace":U={visibility:"thread_workspace_shared"};break;case"group":U={visibility:"private",sharedGroupIDs:[],shareWithAllCreatorGroups:!0};break;case"public":U={visibility:"public"};break;default:return Error(`Invalid visibility option: ${z}. Use: private, workspace, group, or public`)}try{return await X.updateThreadMeta(Z.id,U),new l7(`${G}
|
|
@@ -6411,7 +6411,7 @@ ${Q}`),this.textController.clear(),this.textController.insertText(this.pendingTr
|
|
|
6411
6411
|
`),J.stdout.write(`Thread: ${H}
|
|
6412
6412
|
`),J.stdout.write(`Continue this thread with: amp threads continue ${F}
|
|
6413
6413
|
`)}}function Iu1(J){return J==="smart"?k1.rgb(3,197,97):J==="fast"?k1.rgb(228,180,2):J==="free"?k1.rgb(0,184,255):rW9(J)}function rW9(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])}Zh1();if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){a7.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
|
|
6414
|
-
`)}var Tu1=Pu1.join(Jl1||Pu1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function JH9(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 sK(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")eG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new p9("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${D8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")eG("experimental.agentMode",Q.agentMode)}async function Su1(J){try{await oW9(Pu1.dirname(Tu1),{recursive:!0}),await tW9(Tu1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function QH9(){try{return(await tF6(Tu1,"utf-8")).trim()}catch(J){return null}}function ZH9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z);return Ji1("mcpServers",{global:X,workspace:Q})}return J.get(Z)},async keys(){let Z=await J.keys();if(!Z.includes("mcpServers"))Z.push("mcpServers");return Z},[Symbol.dispose](){J[Symbol.dispose]()}}}var rF6=[{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??pK,description:`Custom settings file path (overrides the default location ${pK})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(l).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${gb1})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","jsonl","new-ui"],hidden:!0,deprecated:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:dK(),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:yd}],sF6=(J)=>("deprecated"in J)&&J.deprecated===!0,XH9=(J)=>("hidden"in J)&&J.hidden===!0,YH9=(J)=>("default"in J),KH9=(J)=>("default"in J)?J.default:void 0;function qH9(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 p9(uK.unknownCommand(Z),1,q)}}var eF6=null;function Oe2(){return eF6}function lp(J){return{...J,getThreadEnvironment:m71,vfs:q40({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new A_(J.fileSystem),generateThreadTitle:wG0,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var vu1=w0.file(eW9.homedir()),JW6=process.env.XDG_CONFIG_HOME?w0.file(process.env.XDG_CONFIG_HOME):x0.joinPath(vu1,".config");async function oK(J,Q){Yn1("0.0.
|
|
6414
|
+
`)}var Tu1=Pu1.join(Jl1||Pu1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function JH9(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 sK(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")eG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new p9("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${D8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")eG("experimental.agentMode",Q.agentMode)}async function Su1(J){try{await oW9(Pu1.dirname(Tu1),{recursive:!0}),await tW9(Tu1,J,"utf-8")}catch(Q){l.debug("Failed to save last thread ID",Q)}}async function QH9(){try{return(await tF6(Tu1,"utf-8")).trim()}catch(J){return null}}function ZH9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z);return Ji1("mcpServers",{global:X,workspace:Q})}return J.get(Z)},async keys(){let Z=await J.keys();if(!Z.includes("mcpServers"))Z.push("mcpServers");return Z},[Symbol.dispose](){J[Symbol.dispose]()}}}var rF6=[{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??pK,description:`Custom settings file path (overrides the default location ${pK})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(l).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${gb1})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","jsonl","new-ui"],hidden:!0,deprecated:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:dK(),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:yd}],sF6=(J)=>("deprecated"in J)&&J.deprecated===!0,XH9=(J)=>("hidden"in J)&&J.hidden===!0,YH9=(J)=>("default"in J),KH9=(J)=>("default"in J)?J.default:void 0;function qH9(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 p9(uK.unknownCommand(Z),1,q)}}var eF6=null;function Oe2(){return eF6}function lp(J){return{...J,getThreadEnvironment:m71,vfs:q40({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new A_(J.fileSystem),generateThreadTitle:wG0,deleteThread:(Q)=>J.threadHistoryService.delete(Q)}}var vu1=w0.file(eW9.homedir()),JW6=process.env.XDG_CONFIG_HOME?w0.file(process.env.XDG_CONFIG_HOME):x0.joinPath(vu1,".config");async function oK(J,Q){Yn1("0.0.1761148890-geabda4");let Z=GX1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:t1.of([w0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:vu1,userConfigDir:JW6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (YQ1(),XQ1));X(Z);let Y=await Z.getLatest();l.debug("Global configuration initialized",{settingsKeys:Object.keys(Y.settings)});let K=Ra(WO({configService:Z})),q=y20({configService:Z,toolService:K}),G=dw0(K,S9,ae).catch((R)=>{l.warn("Toolbox registration failed, continuing anyway:",R)}),z=q.initialized.catch((R)=>{l.warn("MCP service initialization failed, continuing anyway:",R)});if(J.executeMode)await Promise.all([z,G]);if(Q.jetbrains)DO("JetBrains");else if(Q.ide&&XZ6())DO("VS Code");else if(Q.ide&&YZ6())DO("Neovim");if(J.executeMode)Kn1(!0);r96(K,{configService:Z});let U,F=T7.status.pipe(v0((R)=>Boolean(R.connected&&R.authenticated)),e6()).subscribe((R)=>{if(R){if(!U)U=K.registerTool(Bs)}else U?.dispose(),U=void 0}),W;if(!J.executeMode)W=new J51(process.cwd(),{},!0);else W=new class extends J51{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(x2.write(`No API key found. Starting login flow...
|
|
6415
6415
|
`),!await GH9(J))await Qw(),process.exit(1)}let H=await W40({isDevelopment:!1}),B=new fH1(H),M=new bH1(H,Z,{lazy:!0}),V=Q.notifications!==void 0?Q.notifications:!J.executeMode,N=o96({playNotificationSound:async(R)=>{if(V){s96(R);let w=Jh1(),O=Qh1();if((!w||O)&&Y.settings["notifications.system.enabled"]!==!1){if(R==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(R==="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=M40({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:W,notificationService:N,fileSystem:Q.jetbrains||Q.ide?X40:S9};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](),F.unsubscribe(),U?.dispose()}}}async function GH9(J){if(!J.executeMode){if(!await Iy1("Would you like to log in to Amp? [(y)es, (n)o]: "))return x2.write(`Login cancelled. Run the command again to retry.
|
|
6416
6416
|
`),!1}return await QW6(J)}async function QW6(J){let Q=sW9(32).toString("hex"),Z=await Ey1(J.ampURL,Q);try{await lK(Z)}catch(Y){l.error("Failed to open browser",{error:Y})}let X=await Ey1(J.ampURL,Q,!1);x2.write(`If your browser did not open automatically, visit:
|
|
6417
6417
|
|
|
@@ -6421,12 +6421,12 @@ ${D8.blue.bold(X)}
|
|
|
6421
6421
|
Login successful! You can now use the Amp CLI.
|
|
6422
6422
|
`),!0}catch(Y){return l.error("Login failed",{error:Y}),a7.write(`
|
|
6423
6423
|
Login failed: ${Y instanceof Error?Y.message:String(Y)}
|
|
6424
|
-
`),!1}}function zH9(){let J=new W71().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((W)=>{if(W.code==="commander.help"||W.code==="commander.version"||W.exitCode===0)Yw(),process.exit(0);let H=W.originalError??W;JQ6(H)}),J.option("-V, --version","output the version number",()=>{x2.write(`0.0.
|
|
6425
|
-
`),process.exit(0)}),J.addHelpText("after",JZ6()),J.configureHelp({formatHelp:QZ6}),J.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);await HH9(M)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);await WH9(M,await By1(B,M.settings))});let Q=async(W,H,B)=>{GX1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:t1.of([w0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:vu1,userConfigDir:JW6});let M={...H,executeMode:!1};await Cu1(M,{...W,startWithPicker:!0},B)},Z=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);await oF6(B,M,H)});Z.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);await RH9(B,M,H)}),Z.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. If no thread ID is provided, the most recently used thread will be continued.").option("--pick","Pick a thread interactively from a list").action(async(W,H,B)=>{let M=B.optsWithGlobals(),V=await HZ(M);if(H.pick)await Q(M,V,B);else await AH9(M,V,W,B)}),Z.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(W,H,B)=>{let M=B.optsWithGlobals(),V=await HZ(M);await LH9(M,V,W,B)}),Z.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);await oF6(B,M,H)}),Z.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, workspace, group) or share with Amp support for debugging. Use --visibility to change who can access the thread, or --support to share with the Amp team for troubleshooting.").alias("s").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").option("--support","Share thread with Amp support for debugging").action(async(W,H,B)=>{let M=B.optsWithGlobals(),V=await HZ(M);await NH9(M,V,W,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(W,H,B)=>{let M=B.optsWithGlobals(),V=await HZ(M);await DH9(M,V,W,B)}),Z.command("rename <threadId> <newName>").alias("r").summary("Rename a thread").description('Change the title of a thread. Quote names with spaces: amp threads rename T-123 "New thread name"').action(async(W,H,B,M)=>{let V=M.optsWithGlobals(),N=await HZ(V);await MH9(V,N,W,H,M)}),Z.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(W,H,B)=>{let M=B.optsWithGlobals(),V=await HZ(M);await VH9(M,V,W,B)}),XX6(J,async(W,H)=>{let B=await HZ(H);sK(W,H);let M=await oK(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,configService:M.configService,cleanupTerminal:Yw,asyncDispose:M.asyncDispose.bind(M)}}),kZ6(J),$Z6(J,async(W)=>{let H=await HZ(W);return{settings:H.settings,getThreadDeps:async(B)=>{sK(B,W);let M=await oK(H,W);return{mcpService:M.mcpService,asyncDispose:M.asyncDispose.bind(M)}}}}),J.command("connect").description("Connect CLI to web interface for multi-thread management").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);sK(H,B);let V=await oK(M,B);try{await rb1(V,V.configService,{})}finally{await V.asyncDispose(),await Yw()}});let X=new W71().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(W)=>{await Ry1(W.force||!1,W.verbose||!1,"0.0.
|
|
6424
|
+
`),!1}}function zH9(){let J=new W71().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((W)=>{if(W.code==="commander.help"||W.code==="commander.version"||W.exitCode===0)Yw(),process.exit(0);let H=W.originalError??W;JQ6(H)}),J.option("-V, --version","output the version number",()=>{x2.write(`0.0.1761148890-geabda4 (released 2025-10-22T16:08:06.003Z)
|
|
6425
|
+
`),process.exit(0)}),J.addHelpText("after",JZ6()),J.configureHelp({formatHelp:QZ6}),J.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);await HH9(M)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);await WH9(M,await By1(B,M.settings))});let Q=async(W,H,B)=>{GX1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:t1.of([w0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:vu1,userConfigDir:JW6});let M={...H,executeMode:!1};await Cu1(M,{...W,startWithPicker:!0},B)},Z=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);await oF6(B,M,H)});Z.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);await RH9(B,M,H)}),Z.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. If no thread ID is provided, the most recently used thread will be continued.").option("--pick","Pick a thread interactively from a list").action(async(W,H,B)=>{let M=B.optsWithGlobals(),V=await HZ(M);if(H.pick)await Q(M,V,B);else await AH9(M,V,W,B)}),Z.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(W,H,B)=>{let M=B.optsWithGlobals(),V=await HZ(M);await LH9(M,V,W,B)}),Z.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);await oF6(B,M,H)}),Z.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, workspace, group) or share with Amp support for debugging. Use --visibility to change who can access the thread, or --support to share with the Amp team for troubleshooting.").alias("s").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").option("--support","Share thread with Amp support for debugging").action(async(W,H,B)=>{let M=B.optsWithGlobals(),V=await HZ(M);await NH9(M,V,W,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(W,H,B)=>{let M=B.optsWithGlobals(),V=await HZ(M);await DH9(M,V,W,B)}),Z.command("rename <threadId> <newName>").alias("r").summary("Rename a thread").description('Change the title of a thread. Quote names with spaces: amp threads rename T-123 "New thread name"').action(async(W,H,B,M)=>{let V=M.optsWithGlobals(),N=await HZ(V);await MH9(V,N,W,H,M)}),Z.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(W,H,B)=>{let M=B.optsWithGlobals(),V=await HZ(M);await VH9(M,V,W,B)}),XX6(J,async(W,H)=>{let B=await HZ(H);sK(W,H);let M=await oK(B,H);return{context:B,mcpService:M.mcpService,toolService:M.toolService,configService:M.configService,cleanupTerminal:Yw,asyncDispose:M.asyncDispose.bind(M)}}),kZ6(J),$Z6(J,async(W)=>{let H=await HZ(W);return{settings:H.settings,getThreadDeps:async(B)=>{sK(B,W);let M=await oK(H,W);return{mcpService:M.mcpService,asyncDispose:M.asyncDispose.bind(M)}}}}),J.command("connect").description("Connect CLI to web interface for multi-thread management").action(async(W,H)=>{let B=H.optsWithGlobals(),M=await HZ(B);sK(H,B);let V=await oK(M,B);try{await rb1(V,V.configService,{})}finally{await V.asyncDispose(),await Yw()}});let X=new W71().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(W)=>{await Ry1(W.force||!1,W.verbose||!1,"0.0.1761148890-geabda4"),process.exit()});J.addCommand(X,{hidden:!0});function Y(W,H,B){let V=typeof W.description==="string"?W.description:B===void 0?W.description(!0):W.description(B),N=new hV(H,V),L=KH9(W);if(L)N.default(L);if(N.hidden=XH9(W)||sF6(W),"choices"in W)N.choices([...W.choices]);return N}for(let W of rF6)switch(W.type){case"flag":{J.addOption(Y(W,`--${W.long}`)),J.addOption(Y(W,`--no-${W.long}`,!1));break}case"switch":{J.addOption(Y(W,`--${W.long}`,!0));break}default:{J.addOption(Y(W,`--${W.long} <value>`));break}}let K=new hV("-x, --execute [message]","Use execute mode, optionally with user message. In execute mode, agent will execute provided prompt (either as argument, or via stdin). Only last assistant message is printed. Enabled automatically when redirecting stdout.").default(!1);J.addOption(K);let q=new hV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp();J.addOption(q);let G=new hV("--stream-json","When used with --execute, output in Claude Code compatible stream JSON format instead of plain text.").default(!1);J.addOption(G);let z=new hV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(z);let U=new hV("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);if(J.addOption(U),process.env.AMP_CONNECT==="1"){let W=new hV("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(W)}J.action(async(W,H)=>{let B=W,M=await HZ(B);if(Object.keys(B).forEach((V)=>{let N=rF6.find((L)=>L.name===V);if(N&&sF6(N)&&!YH9(N))a7.write(D8.yellow(`Warning: '--${V}' flag is deprecated
|
|
6426
6426
|
`))}),H.args.length>0)qH9(M,H);await Cu1(M,B,H)});let F=new W71("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--version <version>","Update to a specific version").allowUnknownOption(!1).action(async(W)=>{await BH9(W.version)});return J.addCommand(F),J}async function KQ1(J,Q){let{thread:Z,visibility:X}=Q,Y=Z?.id??zq(),K=lp(J);if(Z)await J.threadStorage.set(Y,Z);let q=await m5.getOrCreateForThread(K,Y);if(X)await J.threadSyncService.updateThreadMeta(Y,H51(X));let G=J.threadService.observe(Y).subscribe(async(z)=>{if(s7(z,"assistant"))await Su1(Y),G.unsubscribe()});return await q.resume(),q}async function Cu1(J,Q,Z){let X=W51(Q);if(X instanceof Error)LQ(X.message);let Y,K=null;if(Q.streamJsonInput)Y="";else if(typeof Q.execute==="string"){Y=Q.execute;let w=(await Ty1()).trimEnd();if(w)K=w}else Y=(await Ty1()).trimEnd();if(Q.remote&&!J.executeMode)throw new p9("The -r/--remote flag currently only works with --execute mode",1,'Use: amp --remote --execute "your message"');if(Q.streamJson&&!J.executeMode)throw new p9("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(Q.streamJsonInput&&!J.executeMode)throw new p9("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(Q.streamJsonInput&&!Q.streamJson)throw new p9("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 p9(`Execute mode is not permitted with --agent-mode '${Q.agentMode}'`,1);if(Q.stats&&!J.executeMode)throw new p9("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 p9("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 p9("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"
|
|
6427
6427
|
Or pipe via stdin: echo "your message" | amp --execute`);sK(Z,Q);let q=await oK(J,Q);eF6=q;let G=lp(q),z=async(w)=>{let O=await tF6(w,"utf-8"),$=JSON.parse(O);if(!HF($.id))throw new p9(uK.invalidThreadId);return KQ1(q,{visibility:X,thread:$})},U=async(w)=>{if(!HF(w))throw new p9(uK.invalidThreadId);let O=await q.threadService.get(w)??void 0;if(l.info(`[fetchAndStartThread] Loaded thread ${w}, agentMode: ${O?.agentMode??"undefined"}`),O?.agentMode)l.info(`[fetchAndStartThread] Setting runtime override for agentMode to: ${O.agentMode}`),eG("experimental.agentMode",O.agentMode);else l.info("[fetchAndStartThread] No agentMode on thread, not setting override");return KQ1(q,{visibility:X,thread:O})},F=async()=>{try{if(Q.threadId)return U(Q.threadId);else return KQ1(q,{visibility:X})}catch(w){if(w instanceof p9)throw w;throw await i71(w,Q.threadId),Error("handleError should have called process.exit()")}},W=async()=>{return KQ1(q,{visibility:X})};if(Q.format==="jsonl")a7.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
|
6428
|
-
`),await Qw(),process.exit(1);if(J.executeMode&&Q.remote)await _Z6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await F();if(J.executeMode)await BQ6(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 wr1();let w=await xB({jetbrainsOnly:Q.jetbrains});if(w.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(w.length===1){let O=w[0];if(O)T7.selectConfig(O)}else B=!0}let V=jy1("0.0.
|
|
6429
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await iU({...J,getHook:process.env.AMP_URL?(q,G)=>{if(q==="url")return Promise.resolve(process.env.AMP_URL);return G()}:void 0});if(J.mcpConfig){let q=await EZ6(J.mcpConfig);X=ZH9(X,q)}let Y=await X.get("url","global");if(!Y)Y=DZ;if(!AB(Y))l.info("Targeting custom Amp server",{ampURL:Y});if(X=Rl1(X),await X.get("debug.httpLogging"))Nl1();return{executeMode:Q,isTTY:Z,ampURL:Y,settings:X,secrets:xZ6(await By1(J,X))}}function UH9(J){let Q={};for(let Z=0;Z<J.length;Z++){let X=J[Z];if(X?.startsWith("--")){let K=X.slice(2).replace(/-([a-z])/g,(G,z)=>z.toUpperCase()),q=J[Z+1];if(q&&!q.startsWith("--"))Q[K]=q,Z++}}return Q}async function FH9(){let J=UH9(process.argv);if(bJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),JH9(l),l.info("Starting Amp CLI.",{version:"0.0.
|
|
6428
|
+
`),await Qw(),process.exit(1);if(J.executeMode&&Q.remote)await _Z6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let H=await F();if(J.executeMode)await BQ6(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 wr1();let w=await xB({jetbrainsOnly:Q.jetbrains});if(w.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(w.length===1){let O=w[0];if(O)T7.selectConfig(O)}else B=!0}let V=jy1("0.0.1761148890-geabda4",q.settingsStorage),N=t1.of([w0.file(process.cwd())]),L=YS(void 0,N);if(Y)H.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let A;try{A=await KJ.getUserFreeTierStatus({},{config:q.configService})}catch(w){A={ok:!1,error:w}}l.info("User free tier status:",A);let R=await fZ6();l.info("Loaded session state:",R),await aF6({stdout:process.stdout,history:new Jy1,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadSyncService:q.threadSyncService,threadID:H.threadID,worker:H,workerDeps:G,configService:q.configService,internalAPIClient:KJ,ampURL:J.ampURL,startNewThread:W,pickAndContinueThread:async()=>{l.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:T7,connectedClientsService:new Uc,commandRegistry:L,showJetBrainsInstaller:M,showIdePicker:B,startWithPicker:Q.startWithPicker,updateService:V,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:R,freeTierStatus:A.ok?A.result:void 0}),await q.asyncDispose(),process.exit(0)}async function HZ(J){if(J.interactive)a7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
6429
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await iU({...J,getHook:process.env.AMP_URL?(q,G)=>{if(q==="url")return Promise.resolve(process.env.AMP_URL);return G()}:void 0});if(J.mcpConfig){let q=await EZ6(J.mcpConfig);X=ZH9(X,q)}let Y=await X.get("url","global");if(!Y)Y=DZ;if(!AB(Y))l.info("Targeting custom Amp server",{ampURL:Y});if(X=Rl1(X),await X.get("debug.httpLogging"))Nl1();return{executeMode:Q,isTTY:Z,ampURL:Y,settings:X,secrets:xZ6(await By1(J,X))}}function UH9(J){let Q={};for(let Z=0;Z<J.length;Z++){let X=J[Z];if(X?.startsWith("--")){let K=X.slice(2).replace(/-([a-z])/g,(G,z)=>z.toUpperCase()),q=J[Z+1];if(q&&!q.startsWith("--"))Q[K]=q,Z++}}return Q}async function FH9(){let J=UH9(process.argv);if(bJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),JH9(l),l.info("Starting Amp CLI.",{version:"0.0.1761148890-geabda4",buildTimestamp:"2025-10-22T16:08:06.003Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new p9(uK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await zH9().parseAsync(process.argv)}FH9().catch(i71);async function WH9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),x2.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
6430
6430
|
`);else if(!AB(J.ampURL))x2.write(`Logging in to ${new URL(J.ampURL).hostname}
|
|
6431
6431
|
`);let Z=process.env.AMP_API_KEY;if(Z)x2.write(`API key found in environment variable, storing...
|
|
6432
6432
|
`),await Q.set("apiKey",Z,J.ampURL),x2.write(`API key successfully stored.
|
|
@@ -6442,7 +6442,7 @@ Or pipe via stdin: echo "your message" | amp --execute`);sK(Z,Q);let q=await oK(
|
|
|
6442
6442
|
`));try{let Q;if(J)Q=J,a7.write(D8.blue(`Updating to version ${J}...
|
|
6443
6443
|
`)),await UC(J),a7.write(D8.green(`✓ Successfully updated to version ${J}
|
|
6444
6444
|
`));else{a7.write(D8.blue(`Checking for updates...
|
|
6445
|
-
`));let{hasUpdate:X,latestVersion:Y}=await G71("0.0.
|
|
6445
|
+
`));let{hasUpdate:X,latestVersion:Y}=await G71("0.0.1761148890-geabda4");if(!X)a7.write(D8.green(`✓ Amp CLI is already up to date.
|
|
6446
6446
|
`)),process.exit(0);if(!Y)a7.write(D8.yellow("[WARN] could not find latest version")),process.exit(0);Q=Y,a7.write(D8.blue(`Updating to version ${Y}...
|
|
6447
6447
|
`)),await UC(Y),a7.write(D8.green(`✓ Successfully updated to version ${Y}
|
|
6448
6448
|
`))}let Z=await zw(Q);if(Z.warning)a7.write(`
|
package/package.json
CHANGED