@sourcegraph/amp 0.0.1761924759-g561fee → 0.0.1761926491-gb46bb9
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
|
@@ -6042,11 +6042,11 @@ Actual: ${Y}`)}async function G89(J,Q,Z){let{execSync:X}=await import("node:ch
|
|
|
6042
6042
|
${B}`;if(Y==="pnpm"&&B.includes("Unable to find the global bin directory"))M+=`
|
|
6043
6043
|
|
|
6044
6044
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
6045
|
-
npm install -g @sourcegraph/amp`;G(Error(M))}},error:(F)=>{if(!W)W=!0,G(Error(`Failed to spawn ${Y}: ${F.message}`))},complete:()=>{if(!W)W=!0,q()}})})}q0();q0();async function l71(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(),q=K["dist-tags"]?.latest;if(!q)return{hasUpdate:!1,currentVersion:J,source:"npm"};let G=F89(J,q),z=G<0,U,W;if(K.time){let H=K.time[J],F=K.time[q],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:q,compareResult:G,hasUpdate:z,currentVersionAge:U,latestVersionAge:W}),{hasUpdate:z,latestVersion:q,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 F89(J,Q){let Z=(q)=>{let[G,z]=q.split("-");return{parts:G?.split(".").map(Number)||[],label:z}},X=Z(J),Y=Z(Q),K=Math.max(X.parts.length,Y.parts.length);for(let q=0;q<K;q++){let G=X.parts[q]||0,z=Y.parts[q]||0;if(G<z)return-1;if(G>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 Yy1(J,Q){let Z=new A8,X=Z.pipe(M9({shouldCountRefs:!1}));return setImmediate(async()=>{let Y=new cG().scoped("update"),K=X.subscribe({next:(q)=>{Y.debug("emit new state",q)}});try{let q=process.env.AMP_TEST_UPDATE_STATUS;if(q){Y.debug("using fake update status for testing",{status:q}),await W_(500),Z.next(q);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){Y.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let G=await Q.get("updates.mode");if(G==="disabled"){Y.debug("checking disabled");return}Y.debug("checking",{currentVersion:J,mode:G});let z=await l71(J);if(!(z.latestVersion&&z.hasUpdate)){Y.debug("no update available");return}let U=await c71();if(!G)G=U==="pnpm"?"warn":"auto",Y.debug("no configured update mode; selected default based on package manager",{packageManager:U,mode:G});if(G==="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 yu(z.latestVersion,U);let W=await QN(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(q){Y.debug("check failed",{error:q})}finally{await W_(5000),Z.next("hidden"),K.unsubscribe(),Z.complete()}}),{state:X}}import{stderr as aU}from"node:process";function LJ6(J){let Q=new ew().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 Qy1(X.force||!1,X.verbose||!1,"0.0.
|
|
6045
|
+
npm install -g @sourcegraph/amp`;G(Error(M))}},error:(F)=>{if(!W)W=!0,G(Error(`Failed to spawn ${Y}: ${F.message}`))},complete:()=>{if(!W)W=!0,q()}})})}q0();q0();async function l71(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(),q=K["dist-tags"]?.latest;if(!q)return{hasUpdate:!1,currentVersion:J,source:"npm"};let G=F89(J,q),z=G<0,U,W;if(K.time){let H=K.time[J],F=K.time[q],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:q,compareResult:G,hasUpdate:z,currentVersionAge:U,latestVersionAge:W}),{hasUpdate:z,latestVersion:q,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 F89(J,Q){let Z=(q)=>{let[G,z]=q.split("-");return{parts:G?.split(".").map(Number)||[],label:z}},X=Z(J),Y=Z(Q),K=Math.max(X.parts.length,Y.parts.length);for(let q=0;q<K;q++){let G=X.parts[q]||0,z=Y.parts[q]||0;if(G<z)return-1;if(G>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 Yy1(J,Q){let Z=new A8,X=Z.pipe(M9({shouldCountRefs:!1}));return setImmediate(async()=>{let Y=new cG().scoped("update"),K=X.subscribe({next:(q)=>{Y.debug("emit new state",q)}});try{let q=process.env.AMP_TEST_UPDATE_STATUS;if(q){Y.debug("using fake update status for testing",{status:q}),await W_(500),Z.next(q);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){Y.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let G=await Q.get("updates.mode");if(G==="disabled"){Y.debug("checking disabled");return}Y.debug("checking",{currentVersion:J,mode:G});let z=await l71(J);if(!(z.latestVersion&&z.hasUpdate)){Y.debug("no update available");return}let U=await c71();if(!G)G=U==="pnpm"?"warn":"auto",Y.debug("no configured update mode; selected default based on package manager",{packageManager:U,mode:G});if(G==="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 yu(z.latestVersion,U);let W=await QN(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(q){Y.debug("check failed",{error:q})}finally{await W_(5000),Z.next("hidden"),K.unsubscribe(),Z.complete()}}),{state:X}}import{stderr as aU}from"node:process";function LJ6(J){let Q=new ew().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 Qy1(X.force||!1,X.verbose||!1,"0.0.1761926491-gb46bb9"),process.exit()});J.addCommand(Q,{hidden:!0});let Z=new ew("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 B89(X.version)});J.addCommand(Z)}async function B89(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")aU.write(U8.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
6046
6046
|
|
|
6047
6047
|
`));try{if(!J){aU.write(U8.blue(`Checking for updates...
|
|
6048
|
-
`));let{hasUpdate:Z,latestVersion:X}=await l71("0.0.
|
|
6049
|
-
`));let Y=await QN("0.0.
|
|
6048
|
+
`));let{hasUpdate:Z,latestVersion:X}=await l71("0.0.1761926491-gb46bb9");if(!Z){aU.write(U8.green(`✓ Amp CLI is already up to date.
|
|
6049
|
+
`));let Y=await QN("0.0.1761926491-gb46bb9");if(Y.warning)aU.write(`
|
|
6050
6050
|
`+U8.yellow(Y.warning)+`
|
|
6051
6051
|
`);process.exit(0)}if(!X)aU.write(U8.yellow("[WARN] could not find latest version")),process.exit(0);J=X}aU.write(U8.blue(`Updating to version ${J}...
|
|
6052
6052
|
`)),await yu(J,void 0,(Z)=>{aU.write(U8.dim(`Running: ${Z}
|
|
@@ -6606,7 +6606,7 @@ exit code: ${G}`,new j1({color:X.foreground,dim:!0,italic:!0})));if(z)U.push(new
|
|
|
6606
6606
|
`,B),...M],N=new u0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new a1({text:new D1("",void 0,V)})]}),L="high";if(this.agentMode==="fast")L="fast";else if(this.agentMode==="free")L="free";return J2.child(new g0({constraints:new j6(40,120,0,1/0),child:new Q8({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[new R8({flex:1,child:new Ff1({width:40,height:40,colorMode:L,fps:q==="fast"?60:q==="slow"?15:0,...q==="disabled"&&{seed:42,t:3}})}),new H0({width:1}),new R8({flex:2,child:N})]})}))}}a8();class Bg1 extends l0{props;constructor(J){super({key:J.key});this.props=J;this.props.enabled??=!0}createState(){return new FK6}}class FK6 extends c0{build(J){let Z=A6.of(J).colors,{todos:X,title:Y="TODOs",enabled:K=!0}=this.widget.props;if(!Array.isArray(X)||X.length===0)return new H0({width:0,height:0});let q=K?Z.foreground:Z.mutedForeground,G=X.map((z)=>this.buildTodoItem(z,Z,K));return new g0({child:new T6({padding:V0.symmetric(1,0),child:new u0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new a1({text:new D1(Y,new j1({bold:!0,color:q}))}),...G]})})})}buildTodoItem(J,Q,Z){let X=this.getStatusIcon(J.status),Y=Z?Q.foreground:Q.mutedForeground,K=new j1({bold:J.status==="in-progress",color:Y}),q=new j1({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Y});return new Q8({crossAxisAlignment:"start",children:[new a1({text:new D1(X,K)}),new H0({width:1}),new R8({child:new a1({text:new D1(J.content,q)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class Dg1 extends O6{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=A6.of(J),Z=Q.colors.primary,X=Q.colors.foreground;return new g0({decoration:new q9(void 0,new m8(new _8(Z,1,"rounded"),new _8(Z,1,"rounded"),void 0,new _8(Z,1,"rounded"))),child:new T6({padding:V0.horizontal(1),child:new u0({children:[new Q8({crossAxisAlignment:"start",children:[new R8({child:new a1({text:new D1(this.ad.content,new j1({color:X}))})}),new H0({width:4}),new DQ({uri:"https://ampcode.com/free",text:"Ad",style:new j1({color:X,dim:!0}),onError:(Y)=>{}})]}),new Q8({crossAxisAlignment:"start",children:[new ny1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:V0.horizontal(1),color:Z,reverse:!0}),new H0({width:2}),new a1({text:new D1(this.ad.destinationUrlHostname,new j1({color:X,dim:!0}))})]})]})})})}}D9();a8();class Mg1 extends l0{props;constructor(J){super();this.props=J}createState(){return new BK6(this.props.autofocus??!0)}}class BK6 extends c0{autofocus;constructor(J){super();this.autofocus=J}build(J){let Q=(G)=>{if(G.key==="Enter"&&this.widget.props.showCopyOption)return this.widget.props.onSelect("copy"),"handled";if(G.ctrlKey&&G.key==="c"||G.key==="Escape")return this.widget.props.onSelect(null),"handled";return"ignored"},Z=f8.sizeOf(J),X=Math.min(60,Z.width-4),Y=Z.height-4,K=[];if(this.widget.props.title)K.push(new a1({text:new D1(this.widget.props.title,new j1({bold:!0,color:E1.blue}))}),new H0({height:1}));if(this.widget.props.message)K.push(new a1({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 H0({height:1}));let q=[];if(this.widget.props.showCopyOption)q.push(new a1({text:new D1("Enter to copy",new j1({dim:!0}))}));return q.push(new a1({text:new D1("Escape to close",new j1({dim:!0}))})),K.push(new Q8({children:q.flatMap((G,z)=>z<q.length-1?[G,new H0({width:1}),new a1({text:new D1("•",new j1({dim:!0}))}),new H0({width:1})]:[G]),mainAxisSize:"min"})),new J2({child:new g0({constraints:new j6(X,X,0,Y),decoration:new q9(E1.default(),new m8(new _8(E1.blue,1,"rounded"),new _8(E1.blue,1,"rounded"),new _8(E1.blue,1,"rounded"),new _8(E1.blue,1,"rounded"))),padding:new V0(2,2,2,2),child:new t8({autofocus:this.autofocus,onKey:Q,child:new u0({children:K,mainAxisSize:"min"})})})})}}function Vg1(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})}eB();q0();import{spawn as jQ9}from"node:child_process";import{promises as $Q9}from"node:fs";function DK6(J){return J.kind==="executable"}function MK6(J){return J.kind==="markdown"}var ZB=50000,VK6=300000;async function Ng1(J,Q,Z,X={}){let{timeoutMs:Y=VK6,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(u.debug("Executing command",{commandName:J,filePath:q.filePath,args:Q}),MK6(q))return await EQ9(q,Q);else if(DK6(q))return await IQ9(q,Q,Y,K);else return{success:!1,output:"",error:"Unsupported command type"}}catch(q){return u.error("Failed to execute command",{commandName:J,error:q}),{success:!1,output:"",error:q instanceof Error?q.message:"Unknown error occurred"}}}async function EQ9(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await $Q9.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>ZB?Z.slice(0,ZB)+`
|
|
6607
6607
|
... (output truncated at ${ZB} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function IQ9(J,Q,Z=VK6,X){return new Promise((Y)=>{let[K,q]=PQ9(J,Q);u.debug("Spawning command",{spawnCommand:K,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Z});let G=vt1(X),z=!1,U=setTimeout(()=>{z=!0,G.abort(),u.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),W=jQ9(K,q,{stdio:["pipe","pipe","pipe"],signal:G.signal,detached:!0}),H=[],F=[],B=0;W.stdout?.on("data",(M)=>{let V=M.toString();if(B+=V.length,B<=ZB)H.push(V);else{let N=ZB-(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<=ZB)F.push(V);else{let N=ZB-(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(G.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?`
|
|
6608
6608
|
${L}`:L;if(B>ZB)A+=`
|
|
6609
|
-
... (output truncated at ${ZB} 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 PQ9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return CQ9(Z,X?[...X]:null,Y,Q);else return TQ9(Z,X?[...X]:null,Y,Q)}function TQ9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function CQ9(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]}}q0();H2();TB();gY();hW();cC();import{execSync as NK6}from"child_process";import{writeFile as SQ9}from"fs/promises";import vQ9 from"path";q0();gY();class Lg1{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.
|
|
6609
|
+
... (output truncated at ${ZB} 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 PQ9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return CQ9(Z,X?[...X]:null,Y,Q);else return TQ9(Z,X?[...X]:null,Y,Q)}function TQ9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function CQ9(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]}}q0();H2();TB();gY();hW();cC();import{execSync as NK6}from"child_process";import{writeFile as SQ9}from"fs/promises";import vQ9 from"path";q0();gY();class Lg1{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.1761926491-gb46bb9"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await ea(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}}function kQ9(J){return J.startsWith("custom-command-")}function LK6(J){return J.startsWith("agent-mode-")}function _Q9(J){return J.replace(/^custom-command-/,"")}class Ag1{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 Lg1(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)}`,q=this.commands.get(J);if(q){this.onExecute({id:K,name:q.id,startTime:Y,abortController:X});let W=await q.execute(Q,Z);return this.onExecutionComplete(),W}let G=_Q9(J),z=this.latestCustom.find((W)=>W.name===G);if(!z)return;this.onExecute({id:K,name:z.name,startTime:Y,abortController:X});let U=await Ng1(G,Z,this.registry,{signal:X.signal});if(this.onExecutionComplete(),U.success){let W=Q.editorState.text,F=W.trim()&&!W.endsWith(`
|
|
6610
6610
|
|
|
6611
6611
|
`)?`
|
|
6612
6612
|
${U.output}`:U.output;Q.editorDispatch({type:"insert-text",text:F});return}return Error(U.error??`Command '${J}' failed`)}getPriority(J,Q){if(kQ9(J))return 4;if(Q.editorState.hasSelection)switch(J){case"copy-selection":return 60}if(this.isThreadEmpty(Q)){if(LK6(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(LK6(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-enable":case"permissions-disable":case"ide":case"toggle-agent-mode":case"set-agent-mode":case"show-costs":case"refresh":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 qW().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(X)=>{await X.startNewThread()},isEnabled:(X)=>!this.isThreadEmpty(X)}),this.register({id:"continue",noun:"thread",verb:"switch",description:"Switch to existing thread",aliases:["continue"],gatherArguments:async(X,Y)=>{return await Y.launchThreadPicker()},execute:async(X,Y)=>{await X.switchToThread(Y)},isEnabled:()=>!0}),this.register({id:"handoff",noun:"thread",verb:"handoff",description:"Draft a new thread based on current thread",gatherArguments:async(X,Y)=>{if(this.hasPromptText(X))return{text:X.editorState.text,images:[]};return await Y.launchMultilinePrompt("handoff","Describe a prompt to hand off...")},execute:async(X,Y)=>{if(typeof Y==="string")return X.handleHandoff(Y,[]);return X.handleHandoff(Y.text,Y.images)},isEnabled:(X)=>!this.isThreadEmpty(X),getPromptText:(X)=>{if(this.hasPromptText(X))return this.truncatedPromptText(X)},nonBlocking:!0}),this.register({id:"browser",noun:"thread",verb:"open in browser",description:"Open thread in browser",execute:async({thread:X,ampURL:Y})=>{let K=z_(new URL(Y),X.id).toString();try{await $X(K)}catch(q){u.error("Failed to open browser",{error:q})}},isEnabled:(X)=>!this.isThreadEmpty(X)}),this.register({id:"url",noun:"thread",verb:"copy URL",description:"Copy thread URL",execute:async(X)=>{let Y=z_(new URL(X.ampURL),X.thread.id).toString();try{return await y9.instance.tuiInstance.clipboard.writeText(Y),new oK(`Thread URL: ${Y}
|
|
@@ -6662,7 +6662,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
|
|
|
6662
6662
|
`),J.stdout.write(`Thread: ${F}
|
|
6663
6663
|
`),J.stdout.write(`Continue this thread with: amp threads continue ${W}
|
|
6664
6664
|
`)}}function Wm1(J){return J==="smart"?E1.rgb(3,197,97):J==="free"?E1.rgb(0,184,255):eZ9(J)}function eZ9(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 E1.index(Z[X])}xy1();if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){eK.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
|
|
6665
|
-
`)}var Fm1=Hm1.join(gd1||Hm1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function YX9(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 JW(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")Xq("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new _9("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${U8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")Xq("experimental.agentMode",Q.agentMode)}async function Dm1(J){try{await QX9(Hm1.dirname(Fm1),{recursive:!0}),await ZX9(Fm1,J,"utf-8")}catch(Q){u.debug("Failed to save last thread ID",Q)}}async function KX9(){try{return(await yq6(Fm1,"utf-8")).trim()}catch(J){return null}}function qX9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z);return _d("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 _q6=[{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??$J,description:`Custom settings file path (overrides the default location ${$J})`},{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 ${bb1})`},{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:HQ(),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:bc1}],xq6=(J)=>("deprecated"in J)&&J.deprecated===!0,GX9=(J)=>("hidden"in J)&&J.hidden===!0,zX9=(J)=>("default"in J),UX9=(J)=>("default"in J)?J.default:void 0;function WX9(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 _9(cK.unknownCommand(Z),1,q)}}var fq6=null;function $a2(){return fq6}function dJ1(J){return{...J,getThreadEnvironment:$71,vfs:e90({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new R_(J.fileSystem),generateThreadTitle:Fq0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Mm1=L0.file(XX9.homedir()),hq6=process.env.XDG_CONFIG_HOME?L0.file(process.env.XDG_CONFIG_HOME):y0.joinPath(Mm1,".config");async function QW(J,Q){al1("0.0.
|
|
6665
|
+
`)}var Fm1=Hm1.join(gd1||Hm1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function YX9(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 JW(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")Xq("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("tryGpt5")==="cli")throw new _9("The --try-gpt5 flag has been removed.",1,`GPT-5 is now available as the oracle. Read why: ${U8.blue("https://ampcode.com/news/gpt-5-oracle")}`);if(J.getOptionValueSourceWithGlobals("agentMode")==="cli")Xq("experimental.agentMode",Q.agentMode)}async function Dm1(J){try{await QX9(Hm1.dirname(Fm1),{recursive:!0}),await ZX9(Fm1,J,"utf-8")}catch(Q){u.debug("Failed to save last thread ID",Q)}}async function KX9(){try{return(await yq6(Fm1,"utf-8")).trim()}catch(J){return null}}function qX9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z);return _d("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 _q6=[{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??$J,description:`Custom settings file path (overrides the default location ${$J})`},{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 ${bb1})`},{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:HQ(),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:bc1}],xq6=(J)=>("deprecated"in J)&&J.deprecated===!0,GX9=(J)=>("hidden"in J)&&J.hidden===!0,zX9=(J)=>("default"in J),UX9=(J)=>("default"in J)?J.default:void 0;function WX9(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 _9(cK.unknownCommand(Z),1,q)}}var fq6=null;function $a2(){return fq6}function dJ1(J){return{...J,getThreadEnvironment:$71,vfs:e90({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new R_(J.fileSystem),generateThreadTitle:Fq0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Mm1=L0.file(XX9.homedir()),hq6=process.env.XDG_CONFIG_HOME?L0.file(process.env.XDG_CONFIG_HOME):y0.joinPath(Mm1,".config");async function QW(J,Q){al1("0.0.1761926491-gb46bb9");let Z=tZ1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:o1.of([L0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Mm1,userConfigDir:hq6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (mJ1(),gJ1));X(Z);let Y=await Z.getLatest();u.debug("Global configuration initialized",{settingsKeys:Object.keys(Y.settings)});let K=_90(RO({configService:Z})),q=new Map,G=()=>q.clear(),z=T90({configService:Z,toolService:K,createOAuthProvider:async(E)=>{let I=q.get(E);if(I)return u.debug("Reusing existing OAuth provider for server",{serverName:E}),I;u.debug("Creating OAuth provider for server",{serverName:E});let T=(async()=>{let S=new M3(J.secrets),x=await S.getClientInfo(E),h=new OU1({storage:S,serverName:E,clientId:x?.clientId,clientSecret:x?.clientSecret,scopes:x?.scopes});return u.debug("OAuth provider created",{serverName:E,hasManualClientId:!!x?.clientId,willUseDCR:!x?.clientId}),h})();return q.set(E,T),T}}),U=Gw0(K,$2,_e).catch((E)=>{u.warn("Toolbox registration failed, continuing anyway:",E)}),W=z.initialized.catch((E)=>{u.warn("MCP service initialization failed, continuing anyway:",E)}),H=Promise.all([W,U]).then(()=>{});if(Q.jetbrains)jO("JetBrains");else if(Q.ide&&ZJ6())jO("VS Code");else if(Q.ide&&XJ6())jO("Neovim");if(J.executeMode)nl1(!0);z86(K,{configService:Z});let F,B=C7.status.pipe(k0((E)=>Boolean(E.connected&&E.authenticated)),q8()).subscribe((E)=>{if(E){if(!F)F=K.registerTool(l$)}else F?.dispose(),F=void 0}),M;if(!J.executeMode)M=new x71(process.cwd(),{},!0);else M=new class extends x71{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(t2.write(`No API key found. Starting login flow...
|
|
6666
6666
|
`),!await HX9(J))await WR(),process.exit(1)}let V=await K20({isDevelopment:!1}),N=new QV1(V,Z),L=new mF1(V,{lazy:!0}),A=Q.notifications!==void 0?Q.notifications:!J.executeMode,w=W86({playNotificationSound:async(E)=>{if(A){U86(E);let I=ky1(),T=_y1();if((!I||T)&&Y.settings["notifications.system.enabled"]!==!1){if(E==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(E==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:N,configService:Z});u.info("Starting Amp background services");let R=Hq0({threadService:N,threadHistoryService:L,configService:Z,isExtensionDevelopment:!1}),O;C7.status.subscribe((E)=>{O=E});let j={codebaseContextService:new lQ1({workspaceRoots:[L0.file(process.cwd())],getCurrentFile:()=>{if(!O?.openFile)return;try{return L0.parse(O.openFile)}catch(E){u.warn("Failed to parse current file URI",{uri:O.openFile,error:E});return}},getOpenFiles:()=>{if(!O?.visibleFiles?.length)return[];let E=O.openFile;return O.visibleFiles.filter((I)=>I!==E).map((I)=>{try{return L0.parse(I)}catch(T){return u.warn("Failed to parse visible file URI",{uri:I,error:T}),null}}).filter((I)=>I!==null)}}),configService:Z,toolService:K,mcpService:z,threadService:N,threadHistoryService:L,threadSyncService:R,threadStorage:V,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:M,notificationService:w,backgroundInit:H,fileSystem:Q.jetbrains||Q.ide?s90:$2};return{...j,async asyncDispose(){await j.mcpService.dispose(),G(),await j.threadService.asyncDispose(),j.configService.unsubscribe(),j.toolService.dispose(),j.fuzzyServer.dispose(),j.threadSyncService.dispose(),j.settingsStorage[Symbol.dispose](),B.unsubscribe(),F?.dispose()}}}async function HX9(J){if(!J.executeMode){if(!await qy1("Would you like to log in to Amp? [(y)es, (n)o]: "))return t2.write(`Login cancelled. Run the command again to retry.
|
|
6667
6667
|
`),!1}return await gq6(J)}async function gq6(J){let Q=JX9(32).toString("hex"),Z=await Ky1(J.ampURL,Q),X=new AbortController;try{await $X(Z,X.signal)}catch(K){u.error("Error opening browser",{error:K})}let Y=await Ky1(J.ampURL,Q,!1);t2.write(`If your browser does not open automatically, visit:
|
|
6668
6668
|
|
|
@@ -6672,13 +6672,13 @@ ${U8.blue.bold(Y)}
|
|
|
6672
6672
|
Login successful! You can now use the Amp CLI.
|
|
6673
6673
|
`),!0}catch(K){return u.error("Login failed",{error:K}),eK.write(`
|
|
6674
6674
|
Login failed: ${K instanceof Error?K.message:String(K)}
|
|
6675
|
-
`),!1}}function FX9(){let J=new ew().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)UC(),process.exit(0);let H=W.originalError??W;Z56(H)}),J.option("-V, --version","output the version number",()=>{t2.write(`0.0.
|
|
6675
|
+
`),!1}}function FX9(){let J=new ew().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)UC(),process.exit(0);let H=W.originalError??W;Z56(H)}),J.option("-V, --version","output the version number",()=>{t2.write(`0.0.1761926491-gb46bb9 (released 2025-10-31T16:06:40.836Z)
|
|
6676
6676
|
`),process.exit(0)}),J.addHelpText("after",e56()),J.configureHelp({formatHelp:JJ6}),J.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let F=H.optsWithGlobals(),B=await $Y(F);await VX9(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 $Y(F);await MX9(B,await nb1(F,B.settings))});let Q=async(W,H,F)=>{tZ1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:o1.of([L0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:Mm1,userConfigDir:hq6});let B={...H,executeMode:!1};await Bm1(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 $Y(F);await bq6(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 $Y(F);await OX9(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 $Y(B);if(H.pick)eK.write(`${U8.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
6677
6677
|
`);if(H.last||W||M.executeMode)await RX9(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 $Y(B);await wX9(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 $Y(F);await bq6(F,B,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,F)=>{let B=F.optsWithGlobals(),M=await $Y(B);await AX9(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 $Y(M);await NX9(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 $Y(B);await LX9(B,M,W,F)}),KQ6(J,async(W,H)=>{let F=await $Y(H);JW(W,H);let B=await QW(F,H);return{context:F,mcpService:B.mcpService,toolService:B.toolService,configService:B.configService,cleanupTerminal:UC,asyncDispose:B.asyncDispose.bind(B)}}),_J6(J),EJ6(J,async(W)=>{let H=await $Y(W);return{settings:H.settings,secretStorage:H.secrets,getThreadDeps:async(F)=>{JW(F,W);let B=await QW(H,W);return{mcpService:B.mcpService,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 aV(H,M),N=UX9(W);if(N)V.default(N);if(V.hidden=GX9(W)||xq6(W),"choices"in W)V.choices([...W.choices]);return V}for(let W of _q6)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 aV("-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 aV("-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 aV("--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 aV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(z);let U=new aV("--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 aV("--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 $Y(F);if(Object.keys(F).forEach((M)=>{let V=_q6.find((N)=>N.name===M);if(V&&xq6(V)&&!zX9(V))eK.write(U8.yellow(`Warning: '--${M}' flag is deprecated
|
|
6678
6678
|
`))}),H.args.length>0)WX9(B,H);await Bm1(B,F,H)}),LJ6(J),J}async function pJ1(J,Q){let{thread:Z,visibility:X}=Q,Y=Z?.id??Jz(),K=dJ1(J);if(Z)await J.threadStorage.set(Y,Z);let q=await zJ.getOrCreateForThread(K,Y);if(X)await J.threadSyncService.updateThreadMeta(Y,a71(X));let G=J.threadService.observe(Y).subscribe(async(z)=>{if(t7(z,"assistant"))await Dm1(Y),G.unsubscribe()});return await q.resume(),q}async function Bm1(J,Q,Z){let X=i71(Q);if(X instanceof Error)tK(X.message);let Y,K=null;if(Q.streamJsonInput)Y="";else if(typeof Q.execute==="string"){Y=Q.execute;let O=(await zy1()).trimEnd();if(O)K=O}else Y=(await zy1()).trimEnd();if(Q.remote&&!J.executeMode)throw new _9("The -r/--remote flag currently only works with --execute mode",1,'Use: amp --remote --execute "your message"');if(Q.streamJson&&!J.executeMode)throw new _9("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(Q.streamJsonInput&&!J.executeMode)throw new _9("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(Q.streamJsonInput&&!Q.streamJson)throw new _9("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 _9(`Execute mode is not permitted with --agent-mode '${Q.agentMode}'`,1);if(Q.stats&&!J.executeMode)throw new _9("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 _9("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 _9("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"
|
|
6679
6679
|
Or pipe via stdin: echo "your message" | amp --execute`);JW(Z,Q);let q=await QW(J,Q);if(J.executeMode||Q.threadId)await q.backgroundInit;fq6=q;let G=dJ1(q),z=async(O)=>{let $=await yq6(O,"utf-8"),j=JSON.parse($);if(!Uq(j.id))throw new _9(cK.invalidThreadId);return pJ1(q,{visibility:X,thread:j})},U=async(O)=>{if(!Uq(O))throw new _9(cK.invalidThreadId);let $=await q.threadService.get(O)??void 0;if(u.info(`[fetchAndStartThread] Loaded thread ${O}, agentMode: ${$?.agentMode??"undefined"}`),$?.agentMode)u.info(`[fetchAndStartThread] Setting runtime override for agentMode to: ${$.agentMode}`),Xq("experimental.agentMode",$.agentMode);else u.info("[fetchAndStartThread] No agentMode on thread, not setting override");return pJ1(q,{visibility:X,thread:$})},W=async()=>{try{if(Q.threadId)return U(Q.threadId);else return pJ1(q,{visibility:X})}catch(O){if(O instanceof _9)throw O;throw await E71(O,Q.threadId),Error("handleError should have called process.exit()")}},H=async()=>{return pJ1(q,{visibility:X})};if(Q.format==="jsonl")eK.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
|
6680
|
-
`),await WR(),process.exit(1);if(J.executeMode&&Q.remote)await xJ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let F=await W();if(J.executeMode)await M56(F,F.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 Wn1();let O=await mO({jetbrainsOnly:Q.jetbrains});if(O.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(O.length===1){let $=O[0];if($)C7.selectConfig($)}else B=!0}let V=Yy1("0.0.
|
|
6681
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await f56({...J,workspaceTrust:{current:!0,changes:tC},getHook:process.env.AMP_URL?(K,q)=>{if(K==="url")return Promise.resolve(process.env.AMP_URL);return q()}:void 0});if(J.mcpConfig){let K=await IJ6(J.mcpConfig);X=qX9(X,K)}let Y=await X.get("url","global");if(!Y)Y=FZ;if(!wB(Y))u.info("Targeting custom Amp server",{ampURL:Y});return X=qc1(X),{executeMode:Q,isTTY:Z,ampURL:Y,settings:X,secrets:bJ6(await nb1(J,X))}}function BX9(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 DX9(){let J=BX9(process.argv);if(n76({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),YX9(u),u.info("Starting Amp CLI.",{version:"0.0.
|
|
6680
|
+
`),await WR(),process.exit(1);if(J.executeMode&&Q.remote)await xJ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let F=await W();if(J.executeMode)await M56(F,F.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 Wn1();let O=await mO({jetbrainsOnly:Q.jetbrains});if(O.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(O.length===1){let $=O[0];if($)C7.selectConfig($)}else B=!0}let V=Yy1("0.0.1761926491-gb46bb9",q.settingsStorage),N=new gF1(q.threadStorage),L=o1.of([L0.file(process.cwd())]),A=od1(void 0,L);if(Y)F.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let w;try{w=await XJ.getUserFreeTierStatus({},{config:q.configService,signal:AbortSignal.timeout(5000)})}catch(O){w={ok:!1,error:O}}u.info("User free tier status:",w);let R=await hJ6();u.info("Loaded session state:",R),await kq6({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new mb1,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadSyncService:q.threadSyncService,threadID:F.threadID,threadFuzzyIndexer:N,worker:F,workerDeps:G,configService:q.configService,internalAPIClient:XJ,ampURL:J.ampURL,startNewThread:H,pickAndContinueThread:async()=>{u.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:C7,connectedClientsService:new QX1,commandRegistry:A,showJetBrainsInstaller:M,showIdePicker:B,startWithPicker:Q.startWithPicker,updateService:V,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:R,freeTierStatus:w.ok?w.result:void 0,threadDependencies:q}),await q.asyncDispose(),process.exit(0)}async function $Y(J){if(J.interactive)eK.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
6681
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await f56({...J,workspaceTrust:{current:!0,changes:tC},getHook:process.env.AMP_URL?(K,q)=>{if(K==="url")return Promise.resolve(process.env.AMP_URL);return q()}:void 0});if(J.mcpConfig){let K=await IJ6(J.mcpConfig);X=qX9(X,K)}let Y=await X.get("url","global");if(!Y)Y=FZ;if(!wB(Y))u.info("Targeting custom Amp server",{ampURL:Y});return X=qc1(X),{executeMode:Q,isTTY:Z,ampURL:Y,settings:X,secrets:bJ6(await nb1(J,X))}}function BX9(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 DX9(){let J=BX9(process.argv);if(n76({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),YX9(u),u.info("Starting Amp CLI.",{version:"0.0.1761926491-gb46bb9",buildTimestamp:"2025-10-31T16:06:40.836Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new _9(cK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await FX9().parseAsync(process.argv)}DX9().catch(E71);async function MX9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),t2.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
6682
6682
|
`);else if(!wB(J.ampURL))t2.write(`Logging in to ${new URL(J.ampURL).hostname}
|
|
6683
6683
|
`);let Z=process.env.AMP_API_KEY;if(Z)t2.write(`API key found in environment variable, storing...
|
|
6684
6684
|
`),await Q.set("apiKey",Z,J.ampURL),t2.write(`API key successfully stored.
|