@sourcegraph/amp 0.0.1762041747-g37ad2e → 0.0.1762070483-g37ad2e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.js +8 -8
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -6092,11 +6092,11 @@ Actual: ${Y}`)}async function i99(J,Q,Z){let{execSync:X}=await import("node:ch
6092
6092
  ${B}`;if(Y==="pnpm"&&B.includes("Unable to find the global bin directory"))M+=`
6093
6093
 
6094
6094
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
6095
- 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 D51(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=o99(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 o99(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}P0();function gy1(J,Q){let Z=new A8,X=Z.pipe(V9({shouldCountRefs:!1}));return setImmediate(async()=>{let Y=new lG().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 rk(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 D51(J);if(!(z.latestVersion&&z.hasUpdate)){Y.debug("no update available");return}let U=await B51();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 ru(z.latestVersion,U);let W=await JN(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 rk(5000),Z.next("hidden"),K.unsubscribe(),Z.complete()}}),{state:X}}import{stderr as lU}from"node:process";function eQ6(J){let Q=new ow().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 yy1(X.force||!1,X.verbose||!1,"0.0.1762041747-g37ad2e"),process.exit()});J.addCommand(Q,{hidden:!0});let Z=new ow("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 t99(X.version)});J.addCommand(Z)}async function t99(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")lU.write(U8.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
6095
+ 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 D51(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=o99(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 o99(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}P0();function gy1(J,Q){let Z=new A8,X=Z.pipe(V9({shouldCountRefs:!1}));return setImmediate(async()=>{let Y=new lG().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 rk(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 D51(J);if(!(z.latestVersion&&z.hasUpdate)){Y.debug("no update available");return}let U=await B51();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 ru(z.latestVersion,U);let W=await JN(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 rk(5000),Z.next("hidden"),K.unsubscribe(),Z.complete()}}),{state:X}}import{stderr as lU}from"node:process";function eQ6(J){let Q=new ow().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 yy1(X.force||!1,X.verbose||!1,"0.0.1762070483-g37ad2e"),process.exit()});J.addCommand(Q,{hidden:!0});let Z=new ow("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 t99(X.version)});J.addCommand(Z)}async function t99(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")lU.write(U8.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
6096
6096
 
6097
6097
  `));try{if(!J){lU.write(U8.blue(`Checking for updates...
6098
- `));let{hasUpdate:Z,latestVersion:X}=await D51("0.0.1762041747-g37ad2e");if(!Z){lU.write(U8.green(`✓ Amp CLI is already up to date.
6099
- `));let Y=await JN("0.0.1762041747-g37ad2e");if(Y.warning)lU.write(`
6098
+ `));let{hasUpdate:Z,latestVersion:X}=await D51("0.0.1762070483-g37ad2e");if(!Z){lU.write(U8.green(`✓ Amp CLI is already up to date.
6099
+ `));let Y=await JN("0.0.1762070483-g37ad2e");if(Y.warning)lU.write(`
6100
6100
  `+U8.yellow(Y.warning)+`
6101
6101
  `);process.exit(0)}if(!X)lU.write(U8.yellow("[WARN] could not find latest version")),process.exit(0);J=X}lU.write(U8.blue(`Updating to version ${J}...
6102
6102
  `)),await ru(J,void 0,(Z)=>{lU.write(U8.dim(`Running: ${Z}
@@ -6656,7 +6656,7 @@ exit code: ${G}`,new j1({color:X.foreground,dim:!0,italic:!0})));if(z)U.push(new
6656
6656
  `,B),...M],N=new u0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new a1({text:new M1("",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 af1({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})]})}))}}l8();class ng1 extends l0{props;constructor(J){super({key:J.key});this.props=J;this.props.enabled??=!0}createState(){return new aq6}}class aq6 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 M1(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 M1(X,K)}),new H0({width:1}),new R8({child:new a1({text:new M1(J.content,q)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class rg1 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 h8(new k8(Z,1,"rounded"),new k8(Z,1,"rounded"),void 0,new k8(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 M1(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 Cf1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:V0.horizontal(1),color:Z,reverse:!0}),new H0({width:2}),new a1({text:new M1(this.ad.destinationUrlHostname,new j1({color:X,dim:!0}))})]})]})})})}}M9();l8();class sg1 extends l0{props;constructor(J){super();this.props=J}createState(){return new nq6(this.props.autofocus??!0)}}class nq6 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=y8.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 M1(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 M1(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 M1("Enter to copy",new j1({dim:!0}))}));return q.push(new a1({text:new M1("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 M1("•",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 h8(new k8(E1.blue,1,"rounded"),new k8(E1.blue,1,"rounded"),new k8(E1.blue,1,"rounded"),new k8(E1.blue,1,"rounded"))),padding:new V0(2,2,2,2),child:new s8({autofocus:this.autofocus,onKey:Q,child:new u0({children:K,mainAxisSize:"min"})})})})}}function og1(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})}RB();q0();import{spawn as zX9}from"node:child_process";import{promises as UX9}from"node:fs";function rq6(J){return J.kind==="executable"}function sq6(J){return J.kind==="markdown"}var QB=50000,oq6=300000;async function tg1(J,Q,Z,X={}){let{timeoutMs:Y=oq6,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}),sq6(q))return await WX9(q,Q);else if(rq6(q))return await HX9(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 WX9(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await UX9.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>QB?Z.slice(0,QB)+`
6657
6657
  ... (output truncated at ${QB} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function HX9(J,Q,Z=oq6,X){return new Promise((Y)=>{let[K,q]=FX9(J,Q);u.debug("Spawning command",{spawnCommand:K,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Z});let G=el1(X),z=!1,U=setTimeout(()=>{z=!0,G.abort(),u.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),W=zX9(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<=QB)H.push(V);else{let N=QB-(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<=QB)F.push(V);else{let N=QB-(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?`
6658
6658
  ${L}`:L;if(B>QB)A+=`
6659
- ... (output truncated at ${QB} 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 FX9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return DX9(Z,X?[...X]:null,Y,Q);else return BX9(Z,X?[...X]:null,Y,Q)}function BX9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function DX9(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();f2();DD();nY();mW();oC();import{execSync as tq6}from"child_process";import{writeFile as MX9}from"fs/promises";import VX9 from"path";q0();nY();class eg1{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.1762041747-g37ad2e"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await ya(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 NX9(J){return J.startsWith("custom-command-")}function eq6(J){return J.startsWith("agent-mode-")}function LX9(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 eg1(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=LX9(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 tg1(G,Z,this.registry,{signal:X.signal});if(this.onExecutionComplete(),U.success){let W=Q.editorState.text,F=W.trim()&&!W.endsWith(`
6659
+ ... (output truncated at ${QB} 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 FX9(J,Q){let{filePath:Z,interpreter:X,extension:Y}=J;if(process.platform==="win32")return DX9(Z,X?[...X]:null,Y,Q);else return BX9(Z,X?[...X]:null,Y,Q)}function BX9(J,Q,Z,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function DX9(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();f2();DD();nY();mW();oC();import{execSync as tq6}from"child_process";import{writeFile as MX9}from"fs/promises";import VX9 from"path";q0();nY();class eg1{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.1762070483-g37ad2e"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await ya(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 NX9(J){return J.startsWith("custom-command-")}function eq6(J){return J.startsWith("agent-mode-")}function LX9(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 eg1(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=LX9(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 tg1(G,Z,this.registry,{signal:X.signal});if(this.onExecutionComplete(),U.success){let W=Q.editorState.text,F=W.trim()&&!W.endsWith(`
6660
6660
 
6661
6661
  `)?`
6662
6662
  ${U.output}`:U.output;Q.editorDispatch({type:"insert-text",text:F});return}return Error(U.error??`Command '${J}' failed`)}getPriority(J,Q){if(NX9(J))return 4;if(Q.editorState.hasSelection)switch(J){case"copy-selection":return 60}if(this.isThreadEmpty(Q)){if(eq6(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(eq6(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 bU().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=ok(new URL(Y),X.id).toString();try{await EX(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=ok(new URL(X.ampURL),X.thread.id).toString();try{return await y9.instance.tuiInstance.clipboard.writeText(Y),new tK(`Thread URL: ${Y}
@@ -6712,7 +6712,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
6712
6712
  `),J.stdout.write(`Thread: ${F}
6713
6713
  `),J.stdout.write(`Continue this thread with: amp threads continue ${W}
6714
6714
  `)}}function lm1(J){return J==="smart"?E1.rgb(3,197,97):J==="free"?E1.rgb(0,184,255):hY9(J)}function hY9(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])}Mf1();if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){Jq.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
6715
- `)}var am1=im1.join(wc1||im1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function dY9(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 tU(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")jG("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")jG("experimental.agentMode",Q.agentMode)}async function rm1(J){try{await mY9(im1.dirname(am1),{recursive:!0}),await uY9(am1,J,"utf-8")}catch(Q){u.debug("Failed to save last thread ID",Q)}}async function cY9(){try{return(await Nz6(am1,"utf-8")).trim()}catch(J){return null}}function lY9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z);return v21("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 Dz6=[{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??qZ,description:`Custom settings file path (overrides the default location ${qZ})`},{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 ${My1})`},{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:a5(),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:bw}],Mz6=(J)=>("deprecated"in J)&&J.deprecated===!0,iY9=(J)=>("hidden"in J)&&J.hidden===!0,aY9=(J)=>("default"in J),nY9=(J)=>("default"in J)?J.default:void 0;function rY9(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(lK.unknownCommand(Z),1,q)}}var Lz6=null;function Br2(){return Lz6}function FQ1(J){return{...J,getThreadEnvironment:n71,vfs:nc1({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Om(J.fileSystem),generateThreadTitle:me0,deleteThread:(Q)=>J.threadService.delete(Q)}}var sm1=A0.file(pY9.homedir()),Az6=process.env.XDG_CONFIG_HOME?A0.file(process.env.XDG_CONFIG_HOME):y0.joinPath(sm1,".config");async function eU(J,Q){I50("0.0.1762041747-g37ad2e");let Z=_v1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:o1.of([A0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:sm1,userConfigDir:Az6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (UQ1(),zQ1));X(Z);let Y=await Z.getLatest();u.debug("Global configuration initialized",{settingsKeys:Object.keys(Y.settings)});let K=new yw({configService:Z}),q=new Map,G=()=>q.clear(),z=new G_1,U=Ne0({configService:Z,toolServices:K,trustStore:z,createOAuthProvider:async(I)=>{let T=q.get(I);if(T)return u.debug("Reusing existing OAuth provider for server",{serverName:I}),T;u.debug("Creating OAuth provider for server",{serverName:I});let S=(async()=>{let x=new pw(J.secrets),h=await x.getClientInfo(I),v=new ik1({storage:x,serverName:I,clientId:h?.clientId,clientSecret:h?.clientSecret,scopes:h?.scopes});return u.debug("OAuth provider created",{serverName:I,hasManualClientId:!!h?.clientId,willUseDCR:!h?.clientId}),v})();return q.set(I,S),S}}),W=c96(K,I2,V71).catch((I)=>{u.warn("Toolbox registration failed, continuing anyway:",{error:I})}),H=U.initialized.catch((I)=>{u.warn("MCP service initialization failed, continuing anyway:",{error:I})}),F=Promise.all([H,W]).then(()=>{});if(Q.jetbrains)mj("JetBrains");else if(Q.ide&&fQ6())mj("VS Code");else if(Q.ide&&hQ6())mj("Neovim");if(J.executeMode)P50(!0);let B,M=y7.status.pipe(k0((I)=>Boolean(I.connected&&I.authenticated)),q8()).subscribe((I)=>{if(I){if(!B)B=K.registerTool(GE)}else B?.dispose(),B=void 0}),V;if(!J.executeMode)V=new Y51(process.cwd(),{},!0);else V=new class extends Y51{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(o2.write(`No API key found. Starting login flow...
6715
+ `)}var am1=im1.join(wc1||im1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function dY9(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 tU(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")jG("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")jG("experimental.agentMode",Q.agentMode)}async function rm1(J){try{await mY9(im1.dirname(am1),{recursive:!0}),await uY9(am1,J,"utf-8")}catch(Q){u.debug("Failed to save last thread ID",Q)}}async function cY9(){try{return(await Nz6(am1,"utf-8")).trim()}catch(J){return null}}function lY9(J,Q){return{...J,async get(Z){if(Z==="mcpServers"){let X=await J.get(Z);return v21("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 Dz6=[{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??qZ,description:`Custom settings file path (overrides the default location ${qZ})`},{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 ${My1})`},{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:a5(),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:bw}],Mz6=(J)=>("deprecated"in J)&&J.deprecated===!0,iY9=(J)=>("hidden"in J)&&J.hidden===!0,aY9=(J)=>("default"in J),nY9=(J)=>("default"in J)?J.default:void 0;function rY9(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(lK.unknownCommand(Z),1,q)}}var Lz6=null;function Br2(){return Lz6}function FQ1(J){return{...J,getThreadEnvironment:n71,vfs:nc1({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Om(J.fileSystem),generateThreadTitle:me0,deleteThread:(Q)=>J.threadService.delete(Q)}}var sm1=A0.file(pY9.homedir()),Az6=process.env.XDG_CONFIG_HOME?A0.file(process.env.XDG_CONFIG_HOME):y0.joinPath(sm1,".config");async function eU(J,Q){I50("0.0.1762070483-g37ad2e");let Z=_v1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:o1.of([A0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:sm1,userConfigDir:Az6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (UQ1(),zQ1));X(Z);let Y=await Z.getLatest();u.debug("Global configuration initialized",{settingsKeys:Object.keys(Y.settings)});let K=new yw({configService:Z}),q=new Map,G=()=>q.clear(),z=new G_1,U=Ne0({configService:Z,toolServices:K,trustStore:z,createOAuthProvider:async(I)=>{let T=q.get(I);if(T)return u.debug("Reusing existing OAuth provider for server",{serverName:I}),T;u.debug("Creating OAuth provider for server",{serverName:I});let S=(async()=>{let x=new pw(J.secrets),h=await x.getClientInfo(I),v=new ik1({storage:x,serverName:I,clientId:h?.clientId,clientSecret:h?.clientSecret,scopes:h?.scopes});return u.debug("OAuth provider created",{serverName:I,hasManualClientId:!!h?.clientId,willUseDCR:!h?.clientId}),v})();return q.set(I,S),S}}),W=c96(K,I2,V71).catch((I)=>{u.warn("Toolbox registration failed, continuing anyway:",{error:I})}),H=U.initialized.catch((I)=>{u.warn("MCP service initialization failed, continuing anyway:",{error:I})}),F=Promise.all([H,W]).then(()=>{});if(Q.jetbrains)mj("JetBrains");else if(Q.ide&&fQ6())mj("VS Code");else if(Q.ide&&hQ6())mj("Neovim");if(J.executeMode)P50(!0);let B,M=y7.status.pipe(k0((I)=>Boolean(I.connected&&I.authenticated)),q8()).subscribe((I)=>{if(I){if(!B)B=K.registerTool(GE)}else B?.dispose(),B=void 0}),V;if(!J.executeMode)V=new Y51(process.cwd(),{},!0);else V=new class extends Y51{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(o2.write(`No API key found. Starting login flow...
6716
6716
  `),!await sY9(J))await zR(),process.exit(1)}let N=await _e0({isDevelopment:!1}),L=new D_1(N,Z),A=new F_1(N,{lazy:!0}),w=Q.notifications!==void 0?Q.notifications:!J.executeMode,R=i96({playNotificationSound:async(I)=>{if(w){l96(I);let T=Bf1(),S=Df1();if((!T||S)&&Y.settings["notifications.system.enabled"]!==!1){if(I==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(I==="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 O=ge0({threadService:L,threadHistoryService:A,configService:Z,isExtensionDevelopment:!1}),$;y7.status.subscribe((I)=>{$=I});let E={codebaseContextService:new DZ1({workspaceRoots:[A0.file(process.cwd())],getCurrentFile:()=>{if(!$?.openFile)return;try{return A0.parse($.openFile)}catch(I){u.warn("Failed to parse current file URI",{uri:$.openFile,error:I});return}},getOpenFiles:()=>{if(!$?.visibleFiles?.length)return[];let I=$.openFile;return $.visibleFiles.filter((T)=>T!==I).map((T)=>{try{return A0.parse(T)}catch(S){return u.warn("Failed to parse visible file URI",{uri:T,error:S}),null}}).filter((T)=>T!==null)}}),configService:Z,toolServices:K,mcpService:U,threadService:L,threadHistoryService:A,threadSyncService:O,threadStorage:N,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:V,notificationService:R,backgroundInit:F,fileSystem:Q.jetbrains||Q.ide?Pe0:I2};return{...E,async asyncDispose(){await E.mcpService.dispose(),G(),await E.threadService.asyncDispose(),E.configService.unsubscribe(),E.toolServices.dispose(),E.fuzzyServer.dispose(),E.threadSyncService.dispose(),E.settingsStorage[Symbol.dispose](),M.unsubscribe(),B?.dispose()}}}async function sY9(J){if(!J.executeMode){if(!await uy1("Would you like to log in to Amp? [(y)es, (n)o]: "))return o2.write(`Login cancelled. Run the command again to retry.
6717
6717
  `),!1}return await wz6(J)}async function wz6(J){let Q=gY9(32).toString("hex"),Z=await my1(J.ampURL,Q),X=new AbortController;try{await EX(Z,X.signal)}catch(K){u.error("Error opening browser",{error:K})}let Y=await my1(J.ampURL,Q,!1);o2.write(`If your browser does not open automatically, visit:
6718
6718
 
@@ -6722,13 +6722,13 @@ ${U8.blue.bold(Y)}
6722
6722
  Login successful! You can now use the Amp CLI.
6723
6723
  `),!0}catch(K){return u.error("Login failed",{error:K}),Jq.write(`
6724
6724
  Login failed: ${K instanceof Error?K.message:String(K)}
6725
- `),!1}}function oY9(){let J=new ow().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)VC(),process.exit(0);let H=W.originalError??W;hJ6(H)}),J.option("-V, --version","output the version number",()=>{o2.write(`0.0.1762041747-g37ad2e (released 2025-11-02T00:08:07.557Z)
6725
+ `),!1}}function oY9(){let J=new ow().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)VC(),process.exit(0);let H=W.originalError??W;hJ6(H)}),J.option("-V, --version","output the version number",()=>{o2.write(`0.0.1762070483-g37ad2e (released 2025-11-02T08:07:07.252Z)
6726
6726
  `),process.exit(0)}),J.addHelpText("after",xQ6()),J.configureHelp({formatHelp:bQ6}),J.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let F=H.optsWithGlobals(),B=await $Y(F);await QK9(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 JK9(B,await Cy1(F,B.settings))});let Q=async(W,H,F)=>{_v1({storage:H.settings,secretStorage:H.secrets,workspaceRoots:o1.of([A0.file(process.cwd())]),defaultAmpURL:H.ampURL,homeDir:sm1,userConfigDir:Az6});let B={...H,executeMode:!1};await nm1(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 Vz6(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 GK9(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)Jq.write(`${U8.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
6727
6727
  `);if(H.last||W||M.executeMode)await qK9(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 KK9(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 Vz6(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 YK9(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 ZK9(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 XK9(B,M,W,F)}),mZ6(J,async(W,H)=>{let F=await $Y(H);tU(W,H);let B=await eU(F,H);return{context:F,mcpService:B.mcpService,toolService:B.toolServices,toolServices:B.toolServices,configService:B.configService,cleanupTerminal:VC,asyncDispose:B.asyncDispose.bind(B)}}),DZ6(J),qZ6(J,async(W)=>{let H=await $Y(W);return{settings:H.settings,secretStorage:H.secrets,getThreadDeps:async(F)=>{tU(F,W);let B=await eU(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 iV(H,M),N=nY9(W);if(N)V.default(N);if(V.hidden=iY9(W)||Mz6(W),"choices"in W)V.choices([...W.choices]);return V}for(let W of Dz6)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 iV("-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 iV("-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 iV("--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 iV("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(z);let U=new iV("--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 iV("--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=Dz6.find((N)=>N.name===M);if(V&&Mz6(V)&&!aY9(V))Jq.write(U8.yellow(`Warning: '--${M}' flag is deprecated
6728
6728
  `))}),H.args.length>0)rY9(B,H);await nm1(B,F,H)}),eQ6(J),J}async function HQ1(J,Q){let{thread:Z,visibility:X}=Q,Y=Z?.id??Hz(),K=FQ1(J);if(Z)await J.threadStorage.set(Y,Z);let q=await jJ.getOrCreateForThread(K,Y);if(X)await J.threadSyncService.updateThreadMeta(Y,V51(X));let G=J.threadService.observe(Y).subscribe(async(z)=>{if(qJ(z,"assistant"))await rm1(Y),G.unsubscribe()});return await q.resume(),q}async function nm1(J,Q,Z){let X=M51(Q);if(X instanceof Error)eK(X.message);let Y,K=null;if(Q.streamJsonInput)Y="";else if(typeof Q.execute==="string"){Y=Q.execute;let O=(await dy1()).trimEnd();if(O)K=O}else Y=(await dy1()).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"
6729
6729
  Or pipe via stdin: echo "your message" | amp --execute`);tU(Z,Q);let q=await eU(J,Q);if(J.executeMode||Q.threadId)await q.backgroundInit;Lz6=q;let G=FQ1(q),z=async(O)=>{let $=await Nz6(O,"utf-8"),j=JSON.parse($);if(!Rq(j.id))throw new _9(lK.invalidThreadId);return HQ1(q,{visibility:X,thread:j})},U=async(O)=>{if(!Rq(O))throw new _9(lK.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}`),jG("experimental.agentMode",$.agentMode);else u.info("[fetchAndStartThread] No agentMode on thread, not setting override");return HQ1(q,{visibility:X,thread:$})},W=async()=>{try{if(Q.threadId)return U(Q.threadId);else return HQ1(q,{visibility:X})}catch(O){if(O instanceof _9)throw O;throw await r71(O,Q.threadId),Error("handleError should have called process.exit()")}},H=async()=>{return HQ1(q,{visibility:X})};if(Q.format==="jsonl")Jq.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
6730
- `),await zR(),process.exit(1);if(J.executeMode&&Q.remote)await MZ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let F=await W();if(J.executeMode)await oJ6(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 BK0();let O=qE({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($)y7.selectConfig($)}else B=!0}let V=gy1("0.0.1762041747-g37ad2e",q.settingsStorage),N=new H_1(q.threadStorage),L=o1.of([A0.file(process.cwd())]),A=kc1(void 0,L);if(Y)F.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let w;try{w=await zJ.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 AZ6();u.info("Loaded session state:",R),await Bz6({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new wy1,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:zJ,ampURL:J.ampURL,startNewThread:H,pickAndContinueThread:async()=>{u.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:y7,connectedClientsService:new yv1,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)Jq.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
6731
- `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await LQ6({...J,workspaceTrust:{current:!0,changes:KS},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 GZ6(J.mcpConfig);X=lY9(X,K)}let Y=await X.get("url","global");if(!Y)Y=jZ;if(!_D(Y))u.info("Targeting custom Amp server",{ampURL:Y});return X=uc1(X),{executeMode:Q,isTTY:Z,ampURL:Y,settings:X,secrets:VZ6(await Cy1(J,X))}}function tY9(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 eY9(){let J=tY9(process.argv);if(SJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),dY9(u),u.info("Starting Amp CLI.",{version:"0.0.1762041747-g37ad2e",buildTimestamp:"2025-11-02T00:08:07.557Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new _9(lK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await oY9().parseAsync(process.argv)}eY9().catch(r71);async function JK9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),o2.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
6730
+ `),await zR(),process.exit(1);if(J.executeMode&&Q.remote)await MZ6(Y,K,q.configService),await q.asyncDispose(),process.exit(0);let F=await W();if(J.executeMode)await oJ6(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 BK0();let O=qE({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($)y7.selectConfig($)}else B=!0}let V=gy1("0.0.1762070483-g37ad2e",q.settingsStorage),N=new H_1(q.threadStorage),L=o1.of([A0.file(process.cwd())]),A=kc1(void 0,L);if(Y)F.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}});let w;try{w=await zJ.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 AZ6();u.info("Loaded session state:",R),await Bz6({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new wy1,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:zJ,ampURL:J.ampURL,startNewThread:H,pickAndContinueThread:async()=>{u.info("Thread picker requested - not yet implemented in TUI")},switchToThread:U,ideClient:y7,connectedClientsService:new yv1,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)Jq.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
6731
+ `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,X=await LQ6({...J,workspaceTrust:{current:!0,changes:KS},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 GZ6(J.mcpConfig);X=lY9(X,K)}let Y=await X.get("url","global");if(!Y)Y=jZ;if(!_D(Y))u.info("Targeting custom Amp server",{ampURL:Y});return X=uc1(X),{executeMode:Q,isTTY:Z,ampURL:Y,settings:X,secrets:VZ6(await Cy1(J,X))}}function tY9(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 eY9(){let J=tY9(process.argv);if(SJ6({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),dY9(u),u.info("Starting Amp CLI.",{version:"0.0.1762070483-g37ad2e",buildTimestamp:"2025-11-02T08:07:07.252Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new _9(lK.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await oY9().parseAsync(process.argv)}eY9().catch(r71);async function JK9(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),o2.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
6732
6732
  `);else if(!_D(J.ampURL))o2.write(`Logging in to ${new URL(J.ampURL).hostname}
6733
6733
  `);let Z=process.env.AMP_API_KEY;if(Z)o2.write(`API key found in environment variable, storing...
6734
6734
  `),await Q.set("apiKey",Z,J.ampURL),o2.write(`API key successfully stored.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1762041747-g37ad2e",
3
+ "version": "0.0.1762070483-g37ad2e",
4
4
  "description": "CLI for Amp, the frontier coding agent from Sourcegraph.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {