@sourcegraph/amp 0.0.1762257501-gb575fc → 0.0.1762257694-gb575fc
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 +8 -8
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -6503,11 +6503,11 @@ Actual: ${Y}`)}async function o29(J,Q,Z){let{execSync:X}=await import("node:ch
|
|
|
6503
6503
|
${B}`;if(Y==="pnpm"&&B.includes("Unable to find the global bin directory"))M+=`
|
|
6504
6504
|
|
|
6505
6505
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
6506
|
-
npm install -g @sourcegraph/amp`;q(Error(M))}},error:(F)=>{if(!W)W=!0,q(Error(`Failed to spawn ${Y}: ${F.message}`))},complete:()=>{if(!W)W=!0,G()}})})}K0();K0();async function P51(J){try{let Z=new AbortController,X=setTimeout(()=>Z.abort(),5000),Y=await fetch("https://registry.npmjs.org/@sourcegraph/amp",{signal:Z.signal});if(clearTimeout(X),!Y.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let K=await Y.json(),G=K["dist-tags"]?.latest;if(!G)return{hasUpdate:!1,currentVersion:J,source:"npm"};let q=Z49(J,G),z=q<0,U,W;if(K.time){let H=K.time[J],F=K.time[G],B=Date.now();if(H)U=Math.floor((B-new Date(H).getTime())/3600000);if(F)W=Math.floor((B-new Date(F).getTime())/3600000)}return u.info("NPM version comparison",{currentVersion:J,latestVersion:G,compareResult:q,hasUpdate:z,currentVersionAge:U,latestVersionAge:W}),{hasUpdate:z,latestVersion:G,currentVersion:J,currentVersionAge:U,latestVersionAge:W,source:"npm"}}catch(Z){return u.debug("Error checking npm version",{error:Z}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function Z49(J,Q){let Z=(G)=>{let[q,z]=G.split("-");return{parts:q?.split(".").map(Number)||[],label:z}},X=Z(J),Y=Z(Q),K=Math.max(X.parts.length,Y.parts.length);for(let G=0;G<K;G++){let q=X.parts[G]||0,z=Y.parts[G]||0;if(q<z)return-1;if(q>z)return 1}if(X.label===Y.label)return 0;if(!X.label&&Y.label)return 1;if(X.label&&!Y.label)return-1;if(X.label&&Y.label)return X.label<Y.label?-1:1;return 0}I0();function qf1(J,Q){let Z=new w8,X=Z.pipe(M9({shouldCountRefs:!1}));return setImmediate(async()=>{let Y=new Xz().scoped("update"),K=X.subscribe({next:(G)=>{Y.debug("emit new state",G)}});try{let G=process.env.AMP_TEST_UPDATE_STATUS;if(G){Y.debug("using fake update status for testing",{status:G}),await vD(500),Z.next(G);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){Y.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let q=await Q.get("updates.mode");if(q==="disabled"){Y.debug("checking disabled");return}Y.debug("checking",{currentVersion:J,mode:q});let z=await P51(J);if(!(z.latestVersion&&z.hasUpdate)){Y.debug("no update available");return}let U=await I51();if(!q)q=U==="pnpm"?"warn":"auto",Y.debug("no configured update mode; selected default based on package manager",{packageManager:U,mode:q});if(q==="warn"){Z.next("update-available");return}if(!U){Y.debug("auto-update not supported, falling back to warn mode"),Z.next("update-available");return}try{await Gp(z.latestVersion,U);let W=await GN(z.latestVersion),H={from:z.currentVersion,to:z.latestVersion,...W};if(W.status==="same")Y.info("success",H),Z.next("updated");else Y.warn("success with warning",H),Z.next("updated-with-warning")}catch(W){Z.next("update-error")}}catch(G){Y.debug("check failed",{error:G})}finally{await vD(5000),Z.next("hidden"),K.unsubscribe(),Z.complete()}}),{state:X}}import{stderr as ZW}from"node:process";function dZ6(J){let Q=new KR().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(X)=>{await Yf1(X.force||!1,X.verbose||!1,"0.0.
|
|
6506
|
+
npm install -g @sourcegraph/amp`;q(Error(M))}},error:(F)=>{if(!W)W=!0,q(Error(`Failed to spawn ${Y}: ${F.message}`))},complete:()=>{if(!W)W=!0,G()}})})}K0();K0();async function P51(J){try{let Z=new AbortController,X=setTimeout(()=>Z.abort(),5000),Y=await fetch("https://registry.npmjs.org/@sourcegraph/amp",{signal:Z.signal});if(clearTimeout(X),!Y.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let K=await Y.json(),G=K["dist-tags"]?.latest;if(!G)return{hasUpdate:!1,currentVersion:J,source:"npm"};let q=Z49(J,G),z=q<0,U,W;if(K.time){let H=K.time[J],F=K.time[G],B=Date.now();if(H)U=Math.floor((B-new Date(H).getTime())/3600000);if(F)W=Math.floor((B-new Date(F).getTime())/3600000)}return u.info("NPM version comparison",{currentVersion:J,latestVersion:G,compareResult:q,hasUpdate:z,currentVersionAge:U,latestVersionAge:W}),{hasUpdate:z,latestVersion:G,currentVersion:J,currentVersionAge:U,latestVersionAge:W,source:"npm"}}catch(Z){return u.debug("Error checking npm version",{error:Z}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function Z49(J,Q){let Z=(G)=>{let[q,z]=G.split("-");return{parts:q?.split(".").map(Number)||[],label:z}},X=Z(J),Y=Z(Q),K=Math.max(X.parts.length,Y.parts.length);for(let G=0;G<K;G++){let q=X.parts[G]||0,z=Y.parts[G]||0;if(q<z)return-1;if(q>z)return 1}if(X.label===Y.label)return 0;if(!X.label&&Y.label)return 1;if(X.label&&!Y.label)return-1;if(X.label&&Y.label)return X.label<Y.label?-1:1;return 0}I0();function qf1(J,Q){let Z=new w8,X=Z.pipe(M9({shouldCountRefs:!1}));return setImmediate(async()=>{let Y=new Xz().scoped("update"),K=X.subscribe({next:(G)=>{Y.debug("emit new state",G)}});try{let G=process.env.AMP_TEST_UPDATE_STATUS;if(G){Y.debug("using fake update status for testing",{status:G}),await vD(500),Z.next(G);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){Y.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let q=await Q.get("updates.mode");if(q==="disabled"){Y.debug("checking disabled");return}Y.debug("checking",{currentVersion:J,mode:q});let z=await P51(J);if(!(z.latestVersion&&z.hasUpdate)){Y.debug("no update available");return}let U=await I51();if(!q)q=U==="pnpm"?"warn":"auto",Y.debug("no configured update mode; selected default based on package manager",{packageManager:U,mode:q});if(q==="warn"){Z.next("update-available");return}if(!U){Y.debug("auto-update not supported, falling back to warn mode"),Z.next("update-available");return}try{await Gp(z.latestVersion,U);let W=await GN(z.latestVersion),H={from:z.currentVersion,to:z.latestVersion,...W};if(W.status==="same")Y.info("success",H),Z.next("updated");else Y.warn("success with warning",H),Z.next("updated-with-warning")}catch(W){Z.next("update-error")}}catch(G){Y.debug("check failed",{error:G})}finally{await vD(5000),Z.next("hidden"),K.unsubscribe(),Z.complete()}}),{state:X}}import{stderr as ZW}from"node:process";function dZ6(J){let Q=new KR().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(X)=>{await Yf1(X.force||!1,X.verbose||!1,"0.0.1762257694-gb575fc"),process.exit()});J.addCommand(Q,{hidden:!0});let Z=new KR("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(X)=>{await X49(X.version)});J.addCommand(Z)}async function X49(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")ZW.write(Z8.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
6507
6507
|
|
|
6508
6508
|
`));try{if(!J){ZW.write(Z8.blue(`Checking for updates...
|
|
6509
|
-
`));let{hasUpdate:Z,latestVersion:X}=await P51("0.0.
|
|
6510
|
-
`));let Y=await GN("0.0.
|
|
6509
|
+
`));let{hasUpdate:Z,latestVersion:X}=await P51("0.0.1762257694-gb575fc");if(!Z){ZW.write(Z8.green(`✓ Amp CLI is already up to date.
|
|
6510
|
+
`));let Y=await GN("0.0.1762257694-gb575fc");if(Y.warning)ZW.write(`
|
|
6511
6511
|
`+Z8.yellow(Y.warning)+`
|
|
6512
6512
|
`);process.exit(0)}if(!X)ZW.write(Z8.yellow("[WARN] could not find latest version")),process.exit(0);J=X}ZW.write(Z8.blue(`Updating to version ${J}...
|
|
6513
6513
|
`)),await Gp(J,void 0,(Z)=>{ZW.write(Z8.dim(`Running: ${Z}
|
|
@@ -7078,7 +7078,7 @@ exit code: ${q}`,new R1({color:X.foreground,dim:!0,italic:!0})));if(z)U.push(new
|
|
|
7078
7078
|
`,B),...M],N=new f0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new p1({text:new D1("",void 0,V)})]}),L="high";if(this.agentMode==="fast")L="fast";else if(this.agentMode==="free")L="free";return k9.child(new h0({constraints:new R6(40,120,0,1/0),child:new s6({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[new V8({flex:1,child:new Vh1({width:40,height:40,colorMode:L,fps:G==="fast"?60:G==="slow"?15:0,...G==="disabled"&&{seed:42,t:3}})}),new q0({width:1}),new V8({flex:2,child:N})]})}))}}p8();class tJ1 extends p0{props;constructor(J){super({key:J.key});this.props=J;this.props.enabled??=!0}createState(){return new pq6}}class pq6 extends u0{build(J){let Z=M6.of(J).colors,{todos:X,title:Y="TODOs",enabled:K=!0}=this.widget.props;if(!Array.isArray(X)||X.length===0)return new q0({width:0,height:0});let G=K?Z.foreground:Z.mutedForeground,q=X.map((z)=>this.buildTodoItem(z,Z,K));return new h0({child:new C6({padding:V0.symmetric(1,0),child:new f0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new p1({text:new D1(Y,new R1({bold:!0,color:G}))}),...q]})})})}buildTodoItem(J,Q,Z){let X=this.getStatusIcon(J.status),Y=Z?Q.foreground:Q.mutedForeground,K=new R1({bold:J.status==="in-progress",color:Y}),G=new R1({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Y});return new s6({crossAxisAlignment:"start",children:[new p1({text:new D1(X,K)}),new q0({width:1}),new V8({child:new p1({text:new D1(J.content,G)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class Nm1 extends B6{ad;onDismiss;onButtonClick;constructor({key:J,ad:Q,onDismiss:Z,onButtonClick:X}){super({key:J});this.ad=Q,this.onDismiss=Z,this.onButtonClick=X}build(J){let Q=M6.of(J),Z=Q.colors.primary,X=Q.colors.foreground;return new h0({decoration:new G9(void 0,new b8(new j8(Z,1,"rounded"),new j8(Z,1,"rounded"),void 0,new j8(Z,1,"rounded"))),child:new C6({padding:V0.horizontal(1),child:new f0({children:[new s6({crossAxisAlignment:"start",children:[new V8({child:new p1({text:new D1(this.ad.content,new R1({color:X}))})}),new q0({width:4}),new VQ({uri:"https://ampcode.com/free",text:"Ad",style:new R1({color:X,dim:!0}),onError:(Y)=>{}})]}),new s6({crossAxisAlignment:"start",children:[new tf1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:V0.horizontal(1),color:Z,reverse:!0}),new q0({width:2}),new p1({text:new D1(this.ad.destinationUrlHostname,new R1({color:X,dim:!0}))})]})]})})})}}K9();p8();class Lm1 extends p0{props;constructor(J){super();this.props=J}createState(){return new dq6(this.props.autofocus??!0)}}class dq6 extends u0{autofocus;constructor(J){super();this.autofocus=J}build(J){let Q=(q)=>{if(q.key==="Enter"&&this.widget.props.showCopyOption)return this.widget.props.onSelect("copy"),"handled";if(q.ctrlKey&&q.key==="c"||q.key==="Escape")return this.widget.props.onSelect(null),"handled";return"ignored"},Z=_8.sizeOf(J),X=Math.min(60,Z.width-4),Y=Z.height-4,K=[];if(this.widget.props.title)K.push(new p1({text:new D1(this.widget.props.title,new R1({bold:!0,color:$1.blue}))}),new q0({height:1}));if(this.widget.props.message)K.push(new p1({text:new D1(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)K.push(new q0({height:1}));let G=[];if(this.widget.props.showCopyOption)G.push(new p1({text:new D1("Enter to copy",new R1({dim:!0}))}));return G.push(new p1({text:new D1("Escape to close",new R1({dim:!0}))})),K.push(new s6({children:G.flatMap((q,z)=>z<G.length-1?[q,new q0({width:1}),new p1({text:new D1("•",new R1({dim:!0}))}),new q0({width:1})]:[q]),mainAxisSize:"min"})),new k9({child:new h0({constraints:new R6(X,X,0,Y),decoration:new G9($1.default(),new b8(new j8($1.blue,1,"rounded"),new j8($1.blue,1,"rounded"),new j8($1.blue,1,"rounded"),new j8($1.blue,1,"rounded"))),padding:new V0(2,2,2,2),child:new o8({autofocus:this.autofocus,onKey:Q,child:new f0({children:K,mainAxisSize:"min"})})})})}}function Am1(J){let Q=J.match(/"([^"]*)"|'([^']*)'|([^\s"']+)/g);if(!Q)return[];return Q.map((Z)=>{if(Z.startsWith('"')&&Z.endsWith('"')||Z.startsWith("'")&&Z.endsWith("'"))return Z.slice(1,-1);return Z})}uB();K0();import{spawn as MY9}from"node:child_process";import{promises as VY9}from"node:fs";function cq6(J){return J.kind==="executable"}function lq6(J){return J.kind==="markdown"}var BB=50000,iq6=300000;async function wm1(J,Q,Z,X={}){let{timeoutMs:Y=iq6,signal:K}=X;try{let G=await Z.getCommand(J);if(!G)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(u.debug("Executing command",{commandName:J,filePath:G.filePath,args:Q}),lq6(G))return await NY9(G,Q);else if(cq6(G))return await LY9(G,Q,Y,K);else return{success:!1,output:"",error:"Unsupported command type"}}catch(G){return u.error("Failed to execute command",{commandName:J,error:G}),{success:!1,output:"",error:G instanceof Error?G.message:"Unknown error occurred"}}}async function NY9(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await VY9.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>BB?Z.slice(0,BB)+`
|
|
7079
7079
|
... (output truncated at ${BB} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function LY9(J,Q,Z=iq6,X){return new Promise((Y)=>{let[K,G]=AY9(J,Q);u.debug("Spawning command",{spawnCommand:K,spawnArgs:G.slice(0,10),filePath:J.filePath,timeoutMs:Z});let q=Zr1(X),z=!1,U=setTimeout(()=>{z=!0,q.abort(),u.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),W=MY9(K,G,{stdio:["pipe","pipe","pipe"],signal:q.signal,detached:!0}),H=[],F=[],B=0;W.stdout?.on("data",(M)=>{let V=M.toString();if(B+=V.length,B<=BB)H.push(V);else{let N=BB-(B-V.length);if(N>0)H.push(V.slice(0,N))}}),W.stderr?.on("data",(M)=>{let V=M.toString();if(B+=V.length,B<=BB)F.push(V);else{let N=BB-(B-V.length);if(N>0)F.push(V.slice(0,N))}}),W.on("close",(M)=>{if(clearTimeout(U),z){Y({success:!1,output:H.join(""),error:`Command timed out after ${Z}ms`,exitCode:void 0});return}if(q.signal.aborted){Y({success:!1,output:H.join(""),error:"The command was aborted",exitCode:M??void 0});return}let V=M===0||M===1,N=H.join(""),L=F.join(""),A=N;if(!V&&!N.trim()&&L.trim())A=L;else if(L.trim())A+=N?`
|
|
7080
7080
|
${L}`:L;if(B>BB)A+=`
|
|
7081
|
-
... (output truncated at ${BB} 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:H.join(""),error:V})})})}function AY9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return RY9(Z,X?[...X]:null,Y,Q);else return wY9(Z,X?[...X]:null,Y,Q)}function wY9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function RY9(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]}}K0();h2();AW();XK();Fz();FH();zS();import{writeFile as jY9}from"fs/promises";import OY9 from"path";K0();XK();class Rm1{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.
|
|
7081
|
+
... (output truncated at ${BB} 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:H.join(""),error:V})})})}function AY9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return RY9(Z,X?[...X]:null,Y,Q);else return wY9(Z,X?[...X]:null,Y,Q)}function wY9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function RY9(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]}}K0();h2();AW();XK();Fz();FH();zS();import{writeFile as jY9}from"fs/promises";import OY9 from"path";K0();XK();class Rm1{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.1762257694-gb575fc"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Hr(Q,this.configService)}catch(Q){u.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}}var $Y9={EMPTY_THREAD:"Thread is empty",THREAD_HAS_MESSAGES:"Can only change mode for new threads",NOT_PROCESSING:"Agent must be processing to queue prompts",NO_QUEUED_MESSAGES:"No queued messages",NO_TEXT_TO_CLEAR:"No prompt to clear",NO_TEXT_SELECTED:"No text selected",INSUFFICIENT_MODES:"Multiple agent modes required",ALREADY_IN_MODE:"Already in this mode",DEV_ONLY:"Only available in development"};function EY9(J){return J.startsWith("custom-command-")}function aq6(J){return J.startsWith("agent-mode-")}function IY9(J){return J.replace(/^custom-command-/,"")}class jm1{configService;registry;onExecute;onExecutionComplete;commands=new Map;latestCustom=[];telemetrySubmitter;constructor(J,Q,Z,X){this.configService=J;this.registry=Q;this.onExecute=Z;this.onExecutionComplete=X;this.configService.config.subscribe((Y)=>{this.commands.clear(),this.registerCommands(Y)}),this.registry.commands.subscribe((Y)=>this.latestCustom=Y),this.telemetrySubmitter=new Rm1(async()=>{try{return(await this.configService.getLatest()).settings["experimental.cli.commandTelemetry.enabled"]===!0}catch{return!1}},this.configService)}async execute(J,Q,Z=[]){this.telemetrySubmitter.submit(J).catch((W)=>{u.debug("Failed to submit command telemetry",W)});let X=new AbortController,Y=Date.now(),K=`command-${Y}-${Math.random().toString(36).substring(7)}`,G=this.commands.get(J);if(G){this.onExecute({id:K,name:G.id,startTime:Y,abortController:X});let W=await G.execute(Q,Z);return this.onExecutionComplete(),W}let q=IY9(J),z=this.latestCustom.find((W)=>W.name===q);if(!z)return;this.onExecute({id:K,name:z.name,startTime:Y,abortController:X});let U=await wm1(q,Z,this.registry,{signal:X.signal});if(this.onExecutionComplete(),U.success){let W=Q.editorState.text,F=W.trim()&&!W.endsWith(`
|
|
7082
7082
|
|
|
7083
7083
|
`)?`
|
|
7084
7084
|
${U.output}`:U.output;Q.editorDispatch({type:"insert-text",text:F});return}return Error(U.error??`Command '${J}' failed`)}getPriority(J,Q){if(EY9(J))return 4;if(Q.editorState.hasSelection)switch(J){case"copy-selection":return 60}if(this.isThreadEmpty(Q)){if(aq6(J))return 59;switch(J){case"set-agent-mode":return 58;case"toggle-agent-mode":return 57}}if(this.hasPromptText(Q)&&Q.isProcessing)switch(J){case"queue":return 39;case"dequeue":return 37}if(Q.isProcessing)switch(J){case"queue":return 29;case"dequeue":return 27}if(this.hasPromptText(Q))switch(J){case"handoff":return 19;case"editor":return 18;case"clear":return 17}if(aq6(J))return 0;switch(J){case"help":return 10;case"continue":return 9;case"new":return 8;case"handoff":return 7;case"editor":return 6;case"browser":case"url":case"visibility":case"toggle-thinking-blocks":case"queue":case"clear":case"copy-selection":case"dequeue":case"generate-agent-file":case"agent-files":case"connect":case"disconnect":case"settings":case"permissions":case"permissions-workspace":case"permissions-enable":case"permissions-disable":case"ide":case"toggle-agent-mode":case"set-agent-mode":case"show-costs":case"refresh":case"execute-plan":case"edit-plan":case"debug-thread-json":return 1;case"quit":return 0}}getCommandFollows(J){switch(J){case"handoff":return["new"];case"quit":return["queue","dequeue"];case"set-agent-mode":case"toggle-agent-mode":return cF().map(({mode:Q})=>`agent-mode-${Q}`);default:return[]}}registerCommands(J){this.register({id:"new",noun:"thread",verb:"new",description:"Start new thread",aliases:["start"],execute:async(Z)=>{await Z.startNewThread()},isEnabled:(Z)=>this.isThreadEmpty(Z)?"Cannot use thread: new from an empty thread":!0}),this.register({id:"continue",noun:"thread",verb:"switch",description:"Switch to existing thread",aliases:["continue"],gatherArguments:async(Z,X)=>{return await X.launchThreadPicker()},execute:async(Z,X)=>{await Z.switchToThread(X)},isEnabled:()=>!0}),this.register({id:"handoff",noun:"thread",verb:"handoff",description:"Draft a new thread based on current thread",gatherArguments:async(Z,X)=>{if(this.hasPromptText(Z))return{text:Z.editorState.text,images:Z.takeImageAttachments()};return await X.launchMultilinePrompt("handoff","Describe a prompt to hand off...")},execute:async(Z,X)=>{return Z.handleHandoff(X.text,X.images)},isEnabled:(Z)=>this.isThreadEmpty(Z)?"Cannot use thread: handoff from an empty thread":!0,getPromptText:(Z)=>{if(this.hasPromptText(Z))return this.truncatedPromptText(Z)},nonBlocking:!0}),this.register({id:"execute-plan",noun:"plan",verb:"Execute plan",description:"Create execution thread from plan",execute:async(Z)=>{return Z.handleExecutePlan()},isVisible:(Z)=>Z.thread.agentMode==="plan",nonBlocking:!0}),this.register({id:"edit-plan",noun:"plan",verb:"Edit plan in editor",description:"Open plan in $EDITOR with live sync",execute:async(Z)=>{try{let X=process.env.EDITOR||process.env.VISUAL||"nano",{filePath:Y}=await Z.planFileManager.ensureSync(Z.thread.id);H2.instance.tuiInstance.suspend();let{execSync:K}=await import("child_process");return K(`${X} "${Y}"`,{stdio:"inherit"}),H2.instance.tuiInstance.resume(),new TY("Plan editing session closed")}catch(X){return u.error("Failed to edit plan",X),Error("Failed to edit plan")}},isVisible:(Z)=>Z.thread.agentMode==="plan"}),this.register({id:"browser",noun:"thread",verb:"open in browser",description:"Open thread in browser",execute:async({thread:Z,ampURL:X})=>{let Y=Zx(new URL(X),Z.id).toString();try{await CX(Y)}catch(K){u.error("Failed to open browser",{error:K})}},isEnabled:(Z)=>this.isThreadEmpty(Z)?"Cannot use thread: open in browser from an empty thread":!0}),this.register({id:"url",noun:"thread",verb:"copy URL",description:"Copy thread URL",execute:async(Z)=>{let X=Zx(new URL(Z.ampURL),Z.thread.id).toString();try{return await H2.instance.tuiInstance.clipboard.writeText(X),new TY(`Thread URL: ${X}
|
|
@@ -7134,7 +7134,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
|
|
|
7134
7134
|
`),J.stdout.write(`Thread: ${F}
|
|
7135
7135
|
`),J.stdout.write(`Continue this thread with: amp threads continue ${W}
|
|
7136
7136
|
`)}}function Bu1(J){return J==="smart"?$1.rgb(3,197,97):J==="free"?$1.rgb(0,184,255):nK9(J)}function nK9(J){let Q=0;for(let Y=0;Y<J.length;Y++){let K=J.charCodeAt(Y);Q=(Q<<5)-Q+K,Q=Q&Q}let Z=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],X=Math.abs(Q)%Z.length;return $1.index(Z[X])}hf1();if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){UG.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
|
|
7137
|
-
`)}var Mu1=Du1.join(mc1||Du1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function eK9(J){process.emitWarning=function(Q,Z,X,Y){let K=typeof Q==="string"?Q:Q.message||String(Q),G=Z||"Warning",q=!1;J.warn(K,{name:G,code:X})}}function UW(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")BG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new b9("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${Z8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")BG("experimental.agentMode",Q.agentMode)}async function Nu1(J){try{await sK9(Du1.dirname(Mu1),{recursive:!0}),await oK9(Mu1,J,"utf-8")}catch(Q){u.debug("Failed to save last thread ID",Q)}}async function JG9(){try{return(await FU6(Mu1,"utf-8")).trim()}catch(J){return null}}var UU6=[{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??JG,description:`Custom settings file path (overrides the default location ${JG})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(u).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${by1})`},{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:r5(),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:dw}],WU6=(J)=>("deprecated"in J)&&J.deprecated===!0,QG9=(J)=>("hidden"in J)&&J.hidden===!0,ZG9=(J)=>("default"in J),XG9=(J)=>("default"in J)?J.default:void 0;function YG9(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((q)=>Z.includes(q)||q.includes(Z)),G="Run amp --help for a list of available commands.";if(K.length>0)G=`Did you mean: ${K.join(", ")}? Or run amp --help for all commands.`;throw new b9(eK.unknownCommand(Z),1,G)}}var BU6=null;function Zt2(){return BU6}function PQ1(J){return{...J,getThreadEnvironment:z51,vfs:Ir1({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new vm(J.fileSystem),generateThreadTitle:C16,deleteThread:(Q)=>J.threadService.delete(Q)}}var Lu1=L0.file(tK9.homedir()),DU6=process.env.XDG_CONFIG_HOME?L0.file(process.env.XDG_CONFIG_HOME):y0.joinPath(Lu1,".config");async function WW(J,Q){ui1("0.0.
|
|
7137
|
+
`)}var Mu1=Du1.join(mc1||Du1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function eK9(J){process.emitWarning=function(Q,Z,X,Y){let K=typeof Q==="string"?Q:Q.message||String(Q),G=Z||"Warning",q=!1;J.warn(K,{name:G,code:X})}}function UW(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")BG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new b9("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${Z8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")BG("experimental.agentMode",Q.agentMode)}async function Nu1(J){try{await sK9(Du1.dirname(Mu1),{recursive:!0}),await oK9(Mu1,J,"utf-8")}catch(Q){u.debug("Failed to save last thread ID",Q)}}async function JG9(){try{return(await FU6(Mu1,"utf-8")).trim()}catch(J){return null}}var UU6=[{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??JG,description:`Custom settings file path (overrides the default location ${JG})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(u).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${by1})`},{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:r5(),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:dw}],WU6=(J)=>("deprecated"in J)&&J.deprecated===!0,QG9=(J)=>("hidden"in J)&&J.hidden===!0,ZG9=(J)=>("default"in J),XG9=(J)=>("default"in J)?J.default:void 0;function YG9(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((q)=>Z.includes(q)||q.includes(Z)),G="Run amp --help for a list of available commands.";if(K.length>0)G=`Did you mean: ${K.join(", ")}? Or run amp --help for all commands.`;throw new b9(eK.unknownCommand(Z),1,G)}}var BU6=null;function Zt2(){return BU6}function PQ1(J){return{...J,getThreadEnvironment:z51,vfs:Ir1({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new vm(J.fileSystem),generateThreadTitle:C16,deleteThread:(Q)=>J.threadService.delete(Q)}}var Lu1=L0.file(tK9.homedir()),DU6=process.env.XDG_CONFIG_HOME?L0.file(process.env.XDG_CONFIG_HOME):y0.joinPath(Lu1,".config");async function WW(J,Q){ui1("0.0.1762257694-gb575fc");let Z=sv1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:t1.of([L0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Lu1,userConfigDir:DU6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => ($Q1(),OQ1));X(Z);let Y=await Z.getLatest();u.debug("Global configuration initialized",{settingsKeys:Object.keys(Y.settings)});let K=new cw({configService:Z}),G=new Map,q=()=>G.clear(),z=new E_1(Z,J.settings.getWorkspaceRootPath()),U=oe0({configService:Z,toolServices:K,trustStore:z,createOAuthProvider:async(T)=>{let S=G.get(T);if(S)return u.debug("Reusing existing OAuth provider for server",{serverName:T}),S;u.debug("Creating OAuth provider for server",{serverName:T});let _=(async()=>{let h=new sw(J.secrets),v=await h.getClientInfo(T),x=new U_1({storage:h,serverName:T,clientId:v?.clientId,clientSecret:v?.clientSecret,scopes:v?.scopes});return u.debug("OAuth provider created",{serverName:T,hasManualClientId:!!v?.clientId,willUseDCR:!v?.clientId}),x})();return G.set(T,_),_}}),W=_26(K,T2,S71).catch((T)=>{u.warn("Toolbox registration failed, continuing anyway:",{error:T})}),H=U.initialized.catch((T)=>{u.warn("MCP service initialization failed, continuing anyway:",{error:T})}),F=Promise.all([H,W]).then(()=>{});if(Q.jetbrains)vj("JetBrains");else if(Q.ide&&PZ6())vj("VS Code");else if(Q.ide&&TZ6())vj("Neovim");if(J.executeMode)pi1(!0);let B,M=g7.status.pipe(k0((T)=>Boolean(T.connected&&T.authenticated)),q8()).subscribe((T)=>{if(T){if(!B)B=K.registerTool(ME)}else B?.dispose(),B=void 0}),V;if(!J.executeMode)V=new L51(process.cwd(),{},!0);else V=new class extends L51{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(Q4.write(`No API key found. Starting login flow...
|
|
7138
7138
|
`),!await KG9(J))await VR(),process.exit(1)}let N=await L16({isDevelopment:!1}),L=new x_1(N,Z),A=new v_1(N,{lazy:!0}),w=new I_1(L,(T,S)=>{let _=a5.get(T);if(_)_.handle(S).catch((h)=>{u.error("Failed to apply artifact delta",h)})}),R=Q.notifications!==void 0?Q.notifications:!J.executeMode,j=b26({playNotificationSound:async(T)=>{if(R){x26(T);let S=yf1(),_=ff1();if((!S||_)&&Y.settings["notifications.system.enabled"]!==!1){if(T==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(T==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:L,configService:Z});u.info("Starting Amp background services");let $=P16({threadService:L,threadHistoryService:A,configService:Z,isExtensionDevelopment:!1}),O;g7.status.subscribe((T)=>{O=T});let I={codebaseContextService:new CZ1({workspaceRoots:[L0.file(process.cwd())],getCurrentFile:()=>{if(!O?.openFile)return;try{return L0.parse(O.openFile)}catch(T){u.warn("Failed to parse current file URI",{uri:O.openFile,error:T});return}},getOpenFiles:()=>{if(!O?.visibleFiles?.length)return[];let T=O.openFile;return O.visibleFiles.filter((S)=>S!==T).map((S)=>{try{return L0.parse(S)}catch(_){return u.warn("Failed to parse visible file URI",{uri:S,error:_}),null}}).filter((S)=>S!==null)}}),configService:Z,toolServices:K,mcpService:U,trustStore:z,threadService:L,threadHistoryService:A,threadSyncService:$,planFileManager:w,threadStorage:N,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:V,notificationService:j,backgroundInit:F,fileSystem:Q.jetbrains||Q.ide?F16:T2};return{...I,async asyncDispose(){await I.mcpService.dispose(),q(),await I.threadService.asyncDispose(),I.configService.unsubscribe(),I.toolServices.dispose(),I.fuzzyServer.dispose(),I.threadSyncService.dispose(),I.settingsStorage[Symbol.dispose](),M.unsubscribe(),B?.dispose()}}}async function KG9(J){if(!J.executeMode){if(!await Uf1("Would you like to log in to Amp? [(y)es, (n)o]: "))return Q4.write(`Login cancelled. Run the command again to retry.
|
|
7139
7139
|
`),!1}return await MU6(J)}async function MU6(J){let Q=rK9(32).toString("hex"),Z=await zf1(J.ampURL,Q),X=new AbortController;try{await CX(Z,X.signal)}catch(K){u.error("Error opening browser",{error:K})}let Y=await zf1(J.ampURL,Q,!1);Q4.write(`If your browser does not open automatically, visit:
|
|
7140
7140
|
|
|
@@ -7144,13 +7144,13 @@ ${Z8.blue.bold(Y)}
|
|
|
7144
7144
|
Login successful! You can now use the Amp CLI.
|
|
7145
7145
|
`),!0}catch(K){return u.error("Login failed",{error:K}),UG.write(`
|
|
7146
7146
|
Login failed: ${K instanceof Error?K.message:String(K)}
|
|
7147
|
-
`),!1}}function GG9(){let J=new KR().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)EC(),process.exit(0);let H=W.originalError??W;PQ6(H)}),J.option("-V, --version","output the version number",()=>{Q4.write(`0.0.
|
|
7147
|
+
`),!1}}function GG9(){let J=new KR().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)EC(),process.exit(0);let H=W.originalError??W;PQ6(H)}),J.option("-V, --version","output the version number",()=>{Q4.write(`0.0.1762257694-gb575fc (released 2025-11-04T12:06:38.589Z)
|
|
7148
7148
|
`),process.exit(0)}),J.addHelpText("after",$Z6()),J.configureHelp({formatHelp:EZ6}),J.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let F=H.optsWithGlobals(),B=await jX(F);await WG9(B)}),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 F=H.optsWithGlobals(),B=await jX(F);await UG9(B,await oy1(F,B.settings))});let Q=async(W,H,F)=>{sv1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:t1.of([L0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:Lu1,userConfigDir:DU6});let B={...H,executeMode:!1};await Vu1(B,{...W,startWithPicker:!0},F)},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 F=H.optsWithGlobals(),B=await jX(F);await HU6(F,B,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 F=H.optsWithGlobals(),B=await jX(F);await VG9(F,B,H)}),Z.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, shows an interactive picker with the most recently used thread at the top. Use --last to continue the last thread directly without the picker.").option("--last","Continue the last thread directly without showing the picker").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(W,H,F)=>{let B=F.optsWithGlobals(),M=await jX(B);if(H.pick)UG.write(`${Z8.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
7149
7149
|
`);if(H.last||W||M.executeMode)await MG9(B,M,W,F);else await Q(B,M,F)}),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,F)=>{let B=F.optsWithGlobals(),M=await jX(B);await DG9(B,M,W,F)}),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 F=H.optsWithGlobals(),B=await jX(F);await HU6(F,B,H)}),Z.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, unlisted, 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, unlisted, workspace, group)").option("--support","Share thread with Amp support for debugging").action(async(W,H,F)=>{let B=F.optsWithGlobals(),M=await jX(B);await BG9(B,M,W,F,H.support)}),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,F,B)=>{let M=B.optsWithGlobals(),V=await jX(M);await HG9(M,V,W,H,B)}),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,F)=>{let B=F.optsWithGlobals(),M=await jX(B);await FG9(B,M,W,F)}),_X6(J,async(W,H)=>{let F=await jX(H);UW(W,H);let B=await WW(F,H);return{context:F,mcpService:B.mcpService,toolService:B.toolServices,toolServices:B.toolServices,configService:B.configService,cleanupTerminal:EC,asyncDispose:B.asyncDispose.bind(B)}}),qX6(J,async(W)=>{let H=W.optsWithGlobals();return await jX(H)}),oZ6(J,async(W)=>{let H=await jX(W);return{settings:H.settings,secretStorage:H.secrets,getThreadDeps:async(F)=>{UW(F,W);let B=await WW(H,W);return{mcpService:B.mcpService,settings:H.settings,asyncDispose:B.asyncDispose.bind(B)}}}});function Y(W,H,F){let M=typeof W.description==="string"?W.description:F===void 0?W.description(!0):W.description(F),V=new oV(H,M),N=XG9(W);if(N)V.default(N);if(V.hidden=QG9(W)||WU6(W),"choices"in W)V.choices([...W.choices]);return V}for(let W of UU6)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 oV("-x, --execute [message]","Use execute mode, optionally with user message. In execute mode, agent will execute provided prompt (either as argument, or via stdin). Only last assistant message is printed. Enabled automatically when redirecting stdout.").default(!1);J.addOption(K);let G=new oV("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp();J.addOption(G);let q=new oV("--stream-json","When used with --execute, output in Claude Code compatible stream JSON format instead of plain text.").default(!1);J.addOption(q);let z=new oV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(z);let U=new oV("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);if(J.addOption(U),process.env.AMP_CONNECT==="1"){let W=new oV("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(W)}return J.action(async(W,H)=>{let F=W,B=await jX(F);if(Object.keys(F).forEach((M)=>{let V=UU6.find((N)=>N.name===M);if(V&&WU6(V)&&!ZG9(V))UG.write(Z8.yellow(`Warning: '--${M}' flag is deprecated
|
|
7150
7150
|
`))}),H.args.length>0)YG9(B,H);await Vu1(B,F,H)}),dZ6(J),J}async function IQ1(J,Q){let{thread:Z,visibility:X}=Q,Y=Z?.id??wG(),K=PQ1(J);if(Z)await J.threadStorage.set(Y,Z);let G=await a5.getOrCreateForThread(K,Y);if(X)await J.threadSyncService.updateThreadMeta(Y,C51(X));let q=J.threadService.observe(Y).subscribe(async(z)=>{if(KJ(z,"assistant"))await Nu1(Y),q.unsubscribe()});return await G.resume(),G}async function Vu1(J,Q,Z){let X=T51(Q);if(X instanceof Error)zG(X.message);let Y,K=null;if(Q.streamJsonInput)Y="";else if(typeof Q.execute==="string"){Y=Q.execute;let O=(await Ff1()).trimEnd();if(O)K=O}else Y=(await Ff1()).trimEnd();if(Q.remote&&!J.executeMode)throw new b9("The -r/--remote flag currently only works with --execute mode",1,'Use: amp --remote --execute "your message"');if(Q.streamJson&&!J.executeMode)throw new b9("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(Q.streamJsonInput&&!J.executeMode)throw new b9("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(Q.streamJsonInput&&!Q.streamJson)throw new b9("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 b9(`Execute mode is not permitted with --agent-mode '${Q.agentMode}'`,1);if(Q.stats&&!J.executeMode)throw new b9("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 b9("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 b9("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"
|
|
7151
7151
|
Or pipe via stdin: echo "your message" | amp --execute`);UW(Z,Q);let G=await WW(J,Q);if(J.executeMode||Q.threadId)await G.backgroundInit;BU6=G;let q=PQ1(G),z=async(O)=>{let E=await FU6(O,"utf-8"),I=JSON.parse(E);if(!RG(I.id))throw new b9(eK.invalidThreadId);return IQ1(G,{visibility:X,thread:I})},U=async(O)=>{if(!RG(O))throw new b9(eK.invalidThreadId);let E=await G.threadService.get(O)??void 0;if(u.info(`[fetchAndStartThread] Loaded thread ${O}, agentMode: ${E?.agentMode??"undefined"}`),E?.agentMode)u.info(`[fetchAndStartThread] Setting runtime override for agentMode to: ${E.agentMode}`),BG("experimental.agentMode",E.agentMode);else u.info("[fetchAndStartThread] No agentMode on thread, not setting override");return IQ1(G,{visibility:X,thread:E})},W=async()=>{try{if(Q.threadId)return U(Q.threadId);else return IQ1(G,{visibility:X})}catch(O){if(O instanceof b9)throw O;throw await U51(O,Q.threadId),Error("handleError should have called process.exit()")}},H=async()=>{return IQ1(G,{visibility:X})};if(Q.format==="jsonl")UG.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
|
7152
|
-
`),await VR(),process.exit(1);if(J.executeMode&&Q.remote)await zX6(Y,K,G.configService),await G.asyncDispose(),process.exit(0);let F=await W();if(J.executeMode)JX6(G.mcpService,J.settings),await mQ6(F,F.threadID,Y,K,G,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await G.asyncDispose(),process.exit(0);let B=!1,M=!1;if(Q.jetbrains||Q.ide){await nK0();let O=DE({jetbrainsOnly:Q.jetbrains});if(O.length===0){if(Q.jetbrains)M=!await G.configService.get("jetbrains.skipInstall")}else if(O.length===1){let E=O[0];if(E)g7.selectConfig(E)}else B=!0}let V=qf1("0.0.
|
|
7153
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await zZ6({...J,workspaceTrust:{current:!0,changes:VS},getHook:process.env.AMP_URL?(K,G)=>{if(K==="url")return Promise.resolve(process.env.AMP_URL);return G()}:void 0});if(J.mcpConfig){let K=await tZ6(J.mcpConfig);X=eZ6(X,K)}let Y=await X.get("url","global");if(!Y)Y=FZ;if(!$B(Y))u.info("Targeting custom Amp server",{ampURL:Y});return X=ql1(X),{executeMode:Q,isTTY:Z,ampURL:Y,settings:X,secrets:UX6(await oy1(J,X))}}function qG9(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,(q,z)=>z.toUpperCase()),G=J[Z+1];if(G&&!G.startsWith("--"))Q[K]=G,Z++}}return Q}async function zG9(){let J=qG9(process.argv);if(AQ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),eK9(u),u.info("Starting Amp CLI.",{version:"0.0.
|
|
7152
|
+
`),await VR(),process.exit(1);if(J.executeMode&&Q.remote)await zX6(Y,K,G.configService),await G.asyncDispose(),process.exit(0);let F=await W();if(J.executeMode)JX6(G.mcpService,J.settings),await mQ6(F,F.threadID,Y,K,G,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await G.asyncDispose(),process.exit(0);let B=!1,M=!1;if(Q.jetbrains||Q.ide){await nK0();let O=DE({jetbrainsOnly:Q.jetbrains});if(O.length===0){if(Q.jetbrains)M=!await G.configService.get("jetbrains.skipInstall")}else if(O.length===1){let E=O[0];if(E)g7.selectConfig(E)}else B=!0}let V=qf1("0.0.1762257694-gb575fc",G.settingsStorage),N=new S_1(G.threadStorage),L=t1.of([L0.file(process.cwd())]),A=tc1(void 0,L),w=new Wf1(G.mcpService,J.settings.getWorkspaceRootPath());if(Y)F.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let R;try{R=await y7.getUserFreeTierStatus({},{config:G.configService,signal:AbortSignal.timeout(5000)})}catch(O){R={ok:!1,error:O}}u.info("User free tier status:",R);let j=null;try{let O=await y7.getUserInfo({},{config:G.configService});if(O.ok&&O.result.team)j=O.result.team}catch(O){u.debug("Failed to fetch user workspace info:",O)}let $=await FX6();u.info("Loaded session state:",$),await zU6({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new my1,fuzzyServer:G.fuzzyServer,settingsStorage:G.settingsStorage,threadService:G.threadService,threadSyncService:G.threadSyncService,planFileManager:G.planFileManager,threadID:F.threadID,threadFuzzyIndexer:N,worker:F,workerDeps:q,configService:G.configService,internalAPIClient:y7,ampURL:J.ampURL,startNewThread:H,pickAndContinueThread:async()=>{u.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:g7,connectedClientsService:new ev1,commandRegistry:A,mcpTrustHandler:w,showJetBrainsInstaller:M,showIdePicker:B,startWithPicker:Q.startWithPicker,updateService:V,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:$,freeTierStatus:R.ok?R.result:void 0,workspace:j,threadDependencies:G}),await G.asyncDispose(),process.exit(0)}async function jX(J){if(J.interactive)UG.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
7153
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await zZ6({...J,workspaceTrust:{current:!0,changes:VS},getHook:process.env.AMP_URL?(K,G)=>{if(K==="url")return Promise.resolve(process.env.AMP_URL);return G()}:void 0});if(J.mcpConfig){let K=await tZ6(J.mcpConfig);X=eZ6(X,K)}let Y=await X.get("url","global");if(!Y)Y=FZ;if(!$B(Y))u.info("Targeting custom Amp server",{ampURL:Y});return X=ql1(X),{executeMode:Q,isTTY:Z,ampURL:Y,settings:X,secrets:UX6(await oy1(J,X))}}function qG9(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,(q,z)=>z.toUpperCase()),G=J[Z+1];if(G&&!G.startsWith("--"))Q[K]=G,Z++}}return Q}async function zG9(){let J=qG9(process.argv);if(AQ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),eK9(u),u.info("Starting Amp CLI.",{version:"0.0.1762257694-gb575fc",buildTimestamp:"2025-11-04T12:06:38.589Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new b9(eK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await GG9().parseAsync(process.argv)}zG9().catch(U51);async function UG9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),Q4.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
7154
7154
|
`);else if(!$B(J.ampURL))Q4.write(`Logging in to ${new URL(J.ampURL).hostname}
|
|
7155
7155
|
`);let Z=process.env.AMP_API_KEY;if(Z)Q4.write(`API key found in environment variable, storing...
|
|
7156
7156
|
`),await Q.set("apiKey",Z,J.ampURL),Q4.write(`API key successfully stored.
|