@sourcegraph/amp 0.0.1779872458-g7b0532 → 0.0.1779886645-g59fcb2

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 +10 -10
  2. package/package.json +2 -2
package/dist/main.js CHANGED
@@ -4787,13 +4787,13 @@ ${z}`))}},error:(K)=>{if(!V)V=!0,Z(Error(`Failed to spawn brew: ${K.message}`))}
4787
4787
  ${z}`;if(E==="pnpm"&&z.includes("Unable to find the global bin directory"))W+=`
4788
4788
 
4789
4789
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
4790
- npm install -g ${J}`;Z(Error(W))}},error:(K)=>{if(!G)G=!0,Z(Error(`Failed to spawn ${E}: ${K.message}`))},complete:()=>{if(!G)G=!0,Y()}})})}c0();c0();Cz();var lM3="@ampcode/cli";async function SU0(A,Q,$=lM3){let D=`${Q||"https://registry.npmjs.org"}/${$}/latest`,J=new AbortController,E=setTimeout(()=>J.abort(),5000);try{let F=await fetch(D,{signal:J.signal});if(!F.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let Y=await F.json(),Z=Y.version??Y["dist-tags"]?.latest;if(!Z)return{hasUpdate:!1,currentVersion:A,source:"npm"};let U=Ct(A,Z),X=U<0,G,V;if(Y.time){let K=Y.time[A],z=Y.time[Z],W=Date.now();if(K)G=Math.floor((W-new Date(K).getTime())/3600000);if(z)V=Math.floor((W-new Date(z).getTime())/3600000)}return u.info("NPM version comparison",{currentVersion:A,latestVersion:Z,compareResult:U,hasUpdate:X,currentVersionAge:G,latestVersionAge:V}),{hasUpdate:X,latestVersion:Z,currentVersion:A,currentVersionAge:G,latestVersionAge:V,source:"npm"}}catch(F){return u.debug("Error checking npm version",{error:F}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(E)}}var iM3="https://static.ampcode.com/cli/cli-version.txt";async function fU0(A){let Q=new AbortController,$=setTimeout(()=>Q.abort(),5000);try{let B=await fetch(`${iM3}?t=${Date.now()}`,{signal:Q.signal,cache:"no-store"});if(!B.ok)return{hasUpdate:!1,currentVersion:A,source:"bin"};let D=(await B.text()).trim();if(!D||!/^\d+\.\d+\.\d+/.test(D))return{hasUpdate:!1,currentVersion:A,source:"bin"};let J=Ct(A,D),E=J<0;return u.info("Bin version comparison",{currentVersion:A,latestVersion:D,compareResult:J,hasUpdate:E}),{hasUpdate:E,latestVersion:D,currentVersion:A,source:"bin"}}catch(B){return u.debug("Error checking bin version",{error:B}),{hasUpdate:!1,currentVersion:A,source:"bin"}}finally{clearTimeout($)}}var nM3=604800000;function _b4(A){if(!A)return null;let Q=typeof A==="number"?A:new Date(A).getTime();if(isNaN(Q))return null;let $=Date.now()-Q;if($>nM3)return{ageMs:$};return null}function Ct(A,Q){let $=(E)=>{let[F,Y]=E.split("-");return{parts:F?.split(".").map(Number)||[],label:Y}},B=$(A),D=$(Q),J=Math.max(B.parts.length,D.parts.length);for(let E=0;E<J;E++){let F=B.parts[E]||0,Y=D.parts[E]||0;if(F<Y)return-1;if(F>Y)return 1}if(B.label===D.label)return 0;if(!B.label&&D.label)return 1;if(B.label&&!D.label)return-1;if(B.label&&D.label)return B.label<D.label?-1:1;return 0}function wt(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-(.+))?/);if(!Q)return null;let $=parseInt(Q[1],10),B=$!==0?$*1000:void 0,J=Q[2]?.match(/^g?([a-f0-9]+)$/)?.[1],E=B!==void 0?fF(B):void 0;return{sha:J,timestamp:B,age:E}}catch{return null}}u1();c0();import{readFile as aM3,realpath as oM3}from"node:fs/promises";import{dirname as Tb4,join as rM3}from"node:path";async function vb4(A){switch(A){case"binary":case"brew":return sM3(qt());case"npm":case"pnpm":case"yarn":case"bun":return tM3()}}async function sM3(A){let Q=await hN(A,["--version"],5000);if(Q.reason!=="success")return u.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function tM3(){try{let A=process.argv[1];if(!A)return null;let Q=await oM3(A),$=Tb4(Tb4(Q));return await eM3(rM3($,"package.json"))}catch(A){return u.debug("failed to read installed version from package.json",{error:A}),null}}async function eM3(A){let Q=await aM3(A,"utf8"),$=JSON.parse(Q);if(!$.name||!he0($.name))return u.debug("package.json name mismatch",{pkgJsonPath:A,name:$.name}),null;return $.version||null}c0();import{spawn as AL3}from"node:child_process";function ie0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return u.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var yU0=null,Mt=null;function kb4(A){return new Promise((Q)=>{let $=AL3("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),B="";$.stdout.on("data",(D)=>{B+=D.toString()}),$.on("close",(D,J)=>{if(D!==0||J==="SIGTERM"){Q(null);return}let E=B.trim();Q(E&&E!=="undefined"?E:null)}),$.on("error",()=>{Q(null)})})}async function xU0(){if(yU0)return yU0;if(Mt)return Mt;Mt=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return ie0(A);let Q=await kb4("@sourcegraph:registry");if(Q)return ie0(Q);let $=await kb4("registry");if($)return ie0($);return"https://registry.npmjs.org"})();try{return yU0=await Mt,yU0}finally{Mt=null}}var QL3=3600000,$L3=5000;function bU0(A,Q,$={}){let B=new d4,D=B.pipe(e6({shouldCountRefs:!1})),J=$.startDelayMs??0,E=$.checkIntervalMs??QL3,F=!1,Y=()=>{F=!0};return setImmediate(async()=>{let Z=u.getChild("update");if(J>0){if(await YG(J),F)return}let U=D.subscribe({next:(G)=>{Z.debug("emit new state",G)}}),X=A;try{while(!F){let G=await BL3(X,Q,Z,B);if(G.stop)return;if(G.updatedTo)X=G.updatedTo;if(G.emittedVisibleState){if(await YG($L3),F)return;B.next("hidden")}if(E<=0)return;let V=1000,K=E;while(K>0&&!F){let z=Math.min(V,K);await YG(z),K-=z}}}finally{U.unsubscribe(),B.complete()}}),{state:D,dispose:Y}}async function BL3(A,Q,$,B){let D={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return $.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),D.stop=!0,D;let J=await Q.get("updates.mode");if(J==="disabled")return $.debug("checking disabled"),D.stop=!0,D;let E=await xG(),F=E==="binary"||E==="brew",Y=F?void 0:await gN();$.debug("checking",{currentVersion:A,mode:J,packageManager:E,isBinaryDistribution:F,npmPackageName:Y});let Z;if(F)Z=await fU0(A);else{let G=await xU0();Z=await SU0(A,G,Y)}if(!(Z.latestVersion&&Z.hasUpdate))return $.debug("no update available"),D;let U=(G)=>{B.next(G),D.emittedVisibleState=!0};if(E){let G=await vb4(E);if(G&&Ct(G,Z.latestVersion)>=0){if($.debug("on-disk version already up to date",{currentVersion:A,installedVersion:G,latestVersion:Z.latestVersion}),D.updatedTo=G,Ct(A,G)<0){let V=await pz(G),K={from:A,to:G,externallyUpdated:!0,...V};if(V.status==="same")$.info("on-disk already updated by another instance",K),U("updated");else $.warn("on-disk already updated by another instance, with PATH warning",K),U("updated-with-warning")}return D}}let X=()=>{if(Z.currentVersionAge!==void 0&&Z.latestVersionAge!==void 0){let G=Z.currentVersionAge-Z.latestVersionAge,V=0.5;if(Math.abs(G)<0.5)return $.debug("versions too close together, suppressing update warning",{currentVersionAge:Z.currentVersionAge,latestVersionAge:Z.latestVersionAge,ageDifferenceHours:G}),!0}return!1};if(!J)J=E==="pnpm"?"warn":"auto",$.debug("no configured update mode; selected default based on package manager",{packageManager:E,mode:J});if(E==="brew"){if(!X())U("update-available-brew");return D}if(E==="binary"&&process.execPath!==qt()){if($.debug("non-standard binary path, showing warning"),!X())U("update-available-unrecognized-path");return D}if(J==="warn"){if(!X())U("update-available");return D}if(!E){if($.debug("auto-update not supported, falling back to warn mode"),!X())U("update-available");return D}try{await Nt(Z.latestVersion,E),D.updatedTo=Z.latestVersion;let G=await pz(Z.latestVersion),V={from:Z.currentVersion,to:Z.latestVersion,...G};if(G.status==="same")$.info("success",V),U("updated");else $.warn("success with warning",V),U("updated-with-warning")}catch(G){U("update-error")}return D}catch(J){return $.debug("check failed",{error:J}),D}}Cz();import{stderr as tF}from"node:process";function Sb4(A){let Q=new NN().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(B)=>{await xe0(B.force||!1,B.verbose||!1,"0.0.1779872458-g7b0532"),process.exit()});A.addCommand(Q,{hidden:!0});let $=new NN("update").alias("up").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("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(B)=>{await EL3(B.targetVersion)});A.addCommand($)}function DL3(A){let Q=Boolean(A.isTTY),$=0,B=!1;function D(){if(!Q||!B)return;A.write(`
4790
+ npm install -g ${J}`;Z(Error(W))}},error:(K)=>{if(!G)G=!0,Z(Error(`Failed to spawn ${E}: ${K.message}`))},complete:()=>{if(!G)G=!0,Y()}})})}c0();c0();Cz();var lM3="@ampcode/cli";async function SU0(A,Q,$=lM3){let D=`${Q||"https://registry.npmjs.org"}/${$}/latest`,J=new AbortController,E=setTimeout(()=>J.abort(),5000);try{let F=await fetch(D,{signal:J.signal});if(!F.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let Y=await F.json(),Z=Y.version??Y["dist-tags"]?.latest;if(!Z)return{hasUpdate:!1,currentVersion:A,source:"npm"};let U=Ct(A,Z),X=U<0,G,V;if(Y.time){let K=Y.time[A],z=Y.time[Z],W=Date.now();if(K)G=Math.floor((W-new Date(K).getTime())/3600000);if(z)V=Math.floor((W-new Date(z).getTime())/3600000)}return u.info("NPM version comparison",{currentVersion:A,latestVersion:Z,compareResult:U,hasUpdate:X,currentVersionAge:G,latestVersionAge:V}),{hasUpdate:X,latestVersion:Z,currentVersion:A,currentVersionAge:G,latestVersionAge:V,source:"npm"}}catch(F){return u.debug("Error checking npm version",{error:F}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(E)}}var iM3="https://static.ampcode.com/cli/cli-version.txt";async function fU0(A){let Q=new AbortController,$=setTimeout(()=>Q.abort(),5000);try{let B=await fetch(`${iM3}?t=${Date.now()}`,{signal:Q.signal,cache:"no-store"});if(!B.ok)return{hasUpdate:!1,currentVersion:A,source:"bin"};let D=(await B.text()).trim();if(!D||!/^\d+\.\d+\.\d+/.test(D))return{hasUpdate:!1,currentVersion:A,source:"bin"};let J=Ct(A,D),E=J<0;return u.info("Bin version comparison",{currentVersion:A,latestVersion:D,compareResult:J,hasUpdate:E}),{hasUpdate:E,latestVersion:D,currentVersion:A,source:"bin"}}catch(B){return u.debug("Error checking bin version",{error:B}),{hasUpdate:!1,currentVersion:A,source:"bin"}}finally{clearTimeout($)}}var nM3=604800000;function _b4(A){if(!A)return null;let Q=typeof A==="number"?A:new Date(A).getTime();if(isNaN(Q))return null;let $=Date.now()-Q;if($>nM3)return{ageMs:$};return null}function Ct(A,Q){let $=(E)=>{let[F,Y]=E.split("-");return{parts:F?.split(".").map(Number)||[],label:Y}},B=$(A),D=$(Q),J=Math.max(B.parts.length,D.parts.length);for(let E=0;E<J;E++){let F=B.parts[E]||0,Y=D.parts[E]||0;if(F<Y)return-1;if(F>Y)return 1}if(B.label===D.label)return 0;if(!B.label&&D.label)return 1;if(B.label&&!D.label)return-1;if(B.label&&D.label)return B.label<D.label?-1:1;return 0}function wt(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-(.+))?/);if(!Q)return null;let $=parseInt(Q[1],10),B=$!==0?$*1000:void 0,J=Q[2]?.match(/^g?([a-f0-9]+)$/)?.[1],E=B!==void 0?fF(B):void 0;return{sha:J,timestamp:B,age:E}}catch{return null}}u1();c0();import{readFile as aM3,realpath as oM3}from"node:fs/promises";import{dirname as Tb4,join as rM3}from"node:path";async function vb4(A){switch(A){case"binary":case"brew":return sM3(qt());case"npm":case"pnpm":case"yarn":case"bun":return tM3()}}async function sM3(A){let Q=await hN(A,["--version"],5000);if(Q.reason!=="success")return u.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function tM3(){try{let A=process.argv[1];if(!A)return null;let Q=await oM3(A),$=Tb4(Tb4(Q));return await eM3(rM3($,"package.json"))}catch(A){return u.debug("failed to read installed version from package.json",{error:A}),null}}async function eM3(A){let Q=await aM3(A,"utf8"),$=JSON.parse(Q);if(!$.name||!he0($.name))return u.debug("package.json name mismatch",{pkgJsonPath:A,name:$.name}),null;return $.version||null}c0();import{spawn as AL3}from"node:child_process";function ie0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return u.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var yU0=null,Mt=null;function kb4(A){return new Promise((Q)=>{let $=AL3("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),B="";$.stdout.on("data",(D)=>{B+=D.toString()}),$.on("close",(D,J)=>{if(D!==0||J==="SIGTERM"){Q(null);return}let E=B.trim();Q(E&&E!=="undefined"?E:null)}),$.on("error",()=>{Q(null)})})}async function xU0(){if(yU0)return yU0;if(Mt)return Mt;Mt=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return ie0(A);let Q=await kb4("@sourcegraph:registry");if(Q)return ie0(Q);let $=await kb4("registry");if($)return ie0($);return"https://registry.npmjs.org"})();try{return yU0=await Mt,yU0}finally{Mt=null}}var QL3=3600000,$L3=5000;function bU0(A,Q,$={}){let B=new d4,D=B.pipe(e6({shouldCountRefs:!1})),J=$.startDelayMs??0,E=$.checkIntervalMs??QL3,F=!1,Y=()=>{F=!0};return setImmediate(async()=>{let Z=u.getChild("update");if(J>0){if(await YG(J),F)return}let U=D.subscribe({next:(G)=>{Z.debug("emit new state",G)}}),X=A;try{while(!F){let G=await BL3(X,Q,Z,B);if(G.stop)return;if(G.updatedTo)X=G.updatedTo;if(G.emittedVisibleState){if(await YG($L3),F)return;B.next("hidden")}if(E<=0)return;let V=1000,K=E;while(K>0&&!F){let z=Math.min(V,K);await YG(z),K-=z}}}finally{U.unsubscribe(),B.complete()}}),{state:D,dispose:Y}}async function BL3(A,Q,$,B){let D={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return $.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),D.stop=!0,D;let J=await Q.get("updates.mode");if(J==="disabled")return $.debug("checking disabled"),D.stop=!0,D;let E=await xG(),F=E==="binary"||E==="brew",Y=F?void 0:await gN();$.debug("checking",{currentVersion:A,mode:J,packageManager:E,isBinaryDistribution:F,npmPackageName:Y});let Z;if(F)Z=await fU0(A);else{let G=await xU0();Z=await SU0(A,G,Y)}if(!(Z.latestVersion&&Z.hasUpdate))return $.debug("no update available"),D;let U=(G)=>{B.next(G),D.emittedVisibleState=!0};if(E){let G=await vb4(E);if(G&&Ct(G,Z.latestVersion)>=0){if($.debug("on-disk version already up to date",{currentVersion:A,installedVersion:G,latestVersion:Z.latestVersion}),D.updatedTo=G,Ct(A,G)<0){let V=await pz(G),K={from:A,to:G,externallyUpdated:!0,...V};if(V.status==="same")$.info("on-disk already updated by another instance",K),U("updated");else $.warn("on-disk already updated by another instance, with PATH warning",K),U("updated-with-warning")}return D}}let X=()=>{if(Z.currentVersionAge!==void 0&&Z.latestVersionAge!==void 0){let G=Z.currentVersionAge-Z.latestVersionAge,V=0.5;if(Math.abs(G)<0.5)return $.debug("versions too close together, suppressing update warning",{currentVersionAge:Z.currentVersionAge,latestVersionAge:Z.latestVersionAge,ageDifferenceHours:G}),!0}return!1};if(!J)J=E==="pnpm"?"warn":"auto",$.debug("no configured update mode; selected default based on package manager",{packageManager:E,mode:J});if(E==="brew"){if(!X())U("update-available-brew");return D}if(E==="binary"&&process.execPath!==qt()){if($.debug("non-standard binary path, showing warning"),!X())U("update-available-unrecognized-path");return D}if(J==="warn"){if(!X())U("update-available");return D}if(!E){if($.debug("auto-update not supported, falling back to warn mode"),!X())U("update-available");return D}try{await Nt(Z.latestVersion,E),D.updatedTo=Z.latestVersion;let G=await pz(Z.latestVersion),V={from:Z.currentVersion,to:Z.latestVersion,...G};if(G.status==="same")$.info("success",V),U("updated");else $.warn("success with warning",V),U("updated-with-warning")}catch(G){U("update-error")}return D}catch(J){return $.debug("check failed",{error:J}),D}}Cz();import{stderr as tF}from"node:process";function Sb4(A){let Q=new NN().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(B)=>{await xe0(B.force||!1,B.verbose||!1,"0.0.1779886645-g59fcb2"),process.exit()});A.addCommand(Q,{hidden:!0});let $=new NN("update").alias("up").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("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(B)=>{await EL3(B.targetVersion)});A.addCommand($)}function DL3(A){let Q=Boolean(A.isTTY),$=0,B=!1;function D(){if(!Q||!B)return;A.write(`
4791
4791
  `),B=!1,$=0}function J(E){if(!Q)return;let F=E.padEnd($," ");A.write(`\r${F}`),B=!0,$=F.length}return{flushProgressLine:D,renderProgress:J}}function JL3(A){if(A.source==="npm"&&A.latestVersionAge!==void 0&&A.latestVersionAge>36)tF.write(e0.yellow(`The latest Amp CLI version reported by npm is older than expected. Be aware that you may be using an npm proxy with a corporate policy to delay package updates.
4792
4792
  `))}async function EL3(A){let $=process.platform==="win32"&&BR()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:B,renderProgress:D}=DL3(tF);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")tF.write(e0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
4793
4793
 
4794
4794
  `));try{if(!A){tF.write(e0.blue(`Checking for updates...
4795
- `));let F=!1,Y;if(BR()){let Z=await fU0("0.0.1779872458-g7b0532");F=Z.hasUpdate,Y=Z.latestVersion}else{let Z=await xU0(),U=await gN(),X=await SU0("0.0.1779872458-g7b0532",Z,U);JL3(X),F=X.hasUpdate,Y=X.latestVersion}if(!F){let Z=wt("0.0.1779872458-g7b0532"),U=Z?.age?`released ${Z.age} ago`:`built ${fF(new Date("2026-05-27T09:05:52.208Z"))} ago`;tF.write(e0.green(`✓ Amp is already up to date on version ${"0.0.1779872458-g7b0532"} (${U})
4796
- `));let X=await pz("0.0.1779872458-g7b0532",$);if(X.warning)tF.write(`
4795
+ `));let F=!1,Y;if(BR()){let Z=await fU0("0.0.1779886645-g59fcb2");F=Z.hasUpdate,Y=Z.latestVersion}else{let Z=await xU0(),U=await gN(),X=await SU0("0.0.1779886645-g59fcb2",Z,U);JL3(X),F=X.hasUpdate,Y=X.latestVersion}if(!F){let Z=wt("0.0.1779886645-g59fcb2"),U=Z?.age?`released ${Z.age} ago`:`built ${fF(new Date("2026-05-27T13:02:21.391Z"))} ago`;tF.write(e0.green(`✓ Amp is already up to date on version ${"0.0.1779886645-g59fcb2"} (${U})
4796
+ `));let X=await pz("0.0.1779886645-g59fcb2",$);if(X.warning)tF.write(`
4797
4797
  `+e0.yellow(X.warning)+`
4798
4798
  `);process.exit(0)}if(!Y)tF.write(e0.yellow("[WARN] could not find latest version")),process.exit(0);A=Y}tF.write(e0.blue(`Updating to version ${A}...
4799
4799
  `)),await Nt(A,void 0,(F)=>{B(),tF.write(e0.dim(`Running: ${F}
@@ -5222,7 +5222,7 @@ ${B}`).join(`
5222
5222
  `).length,D=new d({text:new w(A,new T({color:$}))});if(B<=GV0)return D;return new X0({width:1/0,height:GV0,child:new a8({autofocus:!1,controller:Q,child:D})})}function Ch3(){return new Map([[G1.key("PageUp"),new VV0],[G1.key("PageDown"),new m61],[G1.ctrl("u"),new VV0],[G1.shift("Home"),new d61],[G1.shift("End"),new p61]])}function wh3(A,Q,$){return Math.max(Q,Math.min(A,$))}var c61=8,ja4=1,Ra4=c61-1;class l61 extends V4{}class i61 extends V4{}class KV0 extends V4{}class zV0 extends V4{}class n61 extends V4{}class a61 extends V4{}class o61 extends u0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new ua4}}class ua4 extends R0{messageScroll=new v6;initState(){super.initState(),this.messageScroll.followMode=!1,this.messageScroll.jumpTo(0)}dispose(){this.messageScroll.dispose(),super.dispose()}build(A){let Q=this.widget.props,$=Mh3(Q,this.messageScroll),B=Lh3(Q.options.message),D=B?new b4({actions:this.buildScrollActions(),child:new kA({debugLabel:"NeoSelectDialogScrollShortcuts",shortcuts:jh3(),child:$})}):$,J=[{keys:["↑/↓","j/k"],label:"move"},{keys:["Enter"],label:"select"}];if(B)J.push({keys:["Ctrl+E","Ctrl+Y"],label:"scroll"});return J.push({keys:["Esc"],label:"cancel"}),new C6({header:Q.options.title,minWidth:64,maxWidth:80,footer:J,autofocus:!1,onDismiss:Q.onCancel,child:D})}buildScrollActions(){let A=(Q)=>{let $=Rh3(this.messageScroll.offset+Q,0,this.messageScroll.maxScrollExtent);this.messageScroll.jumpTo($)};return new Map([[l61,new T1(()=>A(-ja4))],[i61,new T1(()=>A(ja4))],[KV0,new T1(()=>A(-Ra4))],[zV0,new T1(()=>A(Ra4))],[n61,new T1(()=>this.messageScroll.jumpTo(0))],[a61,new T1(()=>this.messageScroll.jumpTo(this.messageScroll.maxScrollExtent))]])}}function Mh3(A,Q){let $=A.options.options.map((D)=>({value:D,label:D})),B=Math.max(0,$.findIndex((D)=>D.value===A.options.initialValue));return new W8({options:$,selectedIndex:B,body:Oh3(A.options.message,Q),onSelect:(D)=>{if(D===null){A.onCancel();return}A.onSelect(D)},padding:K0.all(0),showBorder:!1,showDismissalMessage:!1,enableMouseInteraction:!0,wrapOptions:!0})}function Lh3(A){if(A===void 0)return!1;return A.split(`
5223
5223
  `).length>c61}function Oh3(A,Q){if(A===void 0)return;let $=A.split(`
5224
5224
  `).length,B=Math.min($,c61);return new X0({width:1/0,height:B,child:new a8({autofocus:!1,controller:Q,child:new d({text:new w(A)})})})}function jh3(){return new Map([[G1.key("PageUp"),new KV0],[G1.key("PageDown"),new zV0],[G1.ctrl("u"),new KV0],[G1.ctrl("d"),new zV0],[G1.ctrl("y"),new l61],[G1.ctrl("e"),new i61],[G1.shift("Home"),new n61],[G1.shift("End"),new a61]])}function Rh3(A,Q,$){return Math.max(Q,Math.min(A,$))}var uh3=3,Ph3=new y6("NeoPluginDialogOverlay");function Pa4(A,Q,$){if($!==void 0)return{type:"response",id:A,error:$};if(Q===void 0)return{type:"response",id:A};return{type:"response",id:A,result:Q}}class r61{options;unregisterPluginCommands=null;pluginCommandSubscriptions=[];pluginErrorToastKeys=new Set;activeDialog=null;queuedDialogs=[];resolvingDialog=null;pendingOwnerUIRequests=new Map;pendingActorUIRequests=new Map;stateBackedRequestIDs=new Set;pluginUIRespondRequestCounter=0;statusItems=new Map;blockingConfirmDialog=!1;disposed=!1;constructor(A){this.options=A}init(){this.disposed=!1,this.configurePluginPlatform(),this.subscribePluginCommands()}dispose(){this.disposed=!0,this.unregisterPluginCommands?.(),this.unregisterPluginCommands=null;for(let A of this.pluginCommandSubscriptions)A.unsubscribe();this.pluginCommandSubscriptions=[],this.cancelOwnerUIRequests(),this.cancelPendingDialogs(),this.statusItems.clear(),this.clearPluginPlatformStatusHandlers()}handlePluginMessage(A,Q){let $=A.message;if($.type==="response"){this.cancelOwnerUIRequest($.id),this.cancelActorUIRequest($.id);return}if($.type==="event"){if(this.handlePluginUIStateEvent($,Q))return;this.handlePluginEvent($);return}if(this.stateBackedRequestIDs.has($.id))return;if(!yZ0($.method))return;this.handleOwnerUIRequest($,Q)}cancelOwnerUIRequests(){let A=[...this.pendingOwnerUIRequests.values(),...this.pendingActorUIRequests.values()];this.pendingOwnerUIRequests.clear(),this.pendingActorUIRequests.clear(),this.stateBackedRequestIDs.clear();for(let Q of A)Q.abort()}hasBlockingDialog(){return this.activeDialog!==null}hasBlockingConfirmDialog(){return this.activeDialog?.kind==="confirm"}buildDialogLayers(){let A=this.activeDialog;if(!A)return[];return[new k4({key:Ph3,debugLabel:"PluginDialogOverlay",autofocus:!1,canRequestFocus:!0,child:this.buildActiveDialog(A)})]}buildActiveDialog(A){switch(A.kind){case"input":return new X00({key:new nz(A),header:A.options.title??"Input",helpText:A.options.helpText,initialValue:A.options.initialValue,isRequired:!1,onSubmit:(Q)=>this.resolveInputDialog(A,Q),onDismiss:()=>this.resolveInputDialog(A,void 0)});case"confirm":return new g61({key:new nz(A),options:A.options,onConfirm:()=>this.resolveConfirmDialog(A,!0),onCancel:()=>this.resolveConfirmDialog(A,!1)});case"select":return new o61({key:new nz(A),options:A.options,onSelect:(Q)=>this.resolveSelectDialog(A,Q),onCancel:()=>this.resolveSelectDialog(A,void 0)})}}getStatusItems(){return[...this.statusItems.values()].flatMap((A)=>A.value===void 0?[]:[{pluginURI:A.pluginURI,id:A.id,value:A.value}])}configurePluginPlatform(){let A=this.options.neoContext.pluginPlatform;if(!A)return;A.showToast=(Q)=>this.options.toastController.show(Q,"success"),A.showOpenedURLToast=(Q)=>{this.options.toastController.show(`Opened URL: ${Q}`,"success",8000)},A.appendToThreadHandler=this.options.neoContext.observerOnly?async()=>{throw Error("thread.append is only available from an executor-owned plugin runtime")}:this.options.appendToThread,A.showInputDialog=this.showInputDialog,A.showConfirmDialog=this.showConfirmDialog,A.showSelectDialog=this.showSelectDialog,A.createStatusItemHandler=this.createStatusItem,A.updateStatusItemHandler=this.updateStatusItem,A.removeStatusItemHandler=this.removeStatusItem}handlePluginEvent(A){if(A.event!=="ui.notify")return;let Q=A.data;if(typeof Q.message==="string")this.options.toastController.show(Q.message,"success")}async handleOwnerUIRequest(A,Q){let $=new AbortController;this.pendingOwnerUIRequests.set(A.id,$);try{let B=await this.dispatchOwnerUIRequest(A,$.signal);if(this.pendingOwnerUIRequests.get(A.id)!==$)return;this.pendingOwnerUIRequests.delete(A.id),Q(Pa4(A.id,B))}catch(B){if(this.pendingOwnerUIRequests.get(A.id)!==$)return;this.pendingOwnerUIRequests.delete(A.id),Q(Pa4(A.id,void 0,B instanceof Error?B.message:String(B)))}}dispatchOwnerUIRequest(A,Q){switch(A.method){case"ui.input":return this.showInputDialog(A.params.options,Q);case"ui.confirm":return this.showConfirmDialog(A.params.options,Q);case"ui.select":return this.showSelectDialog(A.params.options,Q);default:throw Error(`Unknown owner UI request method: ${A.method}`)}}cancelOwnerUIRequest(A){let Q=this.pendingOwnerUIRequests.get(A);if(!Q)return;this.pendingOwnerUIRequests.delete(A),Q.abort()}cancelActorUIRequest(A){let Q=this.pendingActorUIRequests.get(A);if(!Q)return;this.pendingActorUIRequests.delete(A),Q.abort()}buildPluginUIRespondRequest(A,Q,$){this.pluginUIRespondRequestCounter+=1;let B={requestId:A};if($!==void 0)B.error=$;else if(Q!==void 0)B.result=Q;return{type:"request",id:`plugin-ui-respond-${A}-${this.pluginUIRespondRequestCounter}`,method:"plugin.ui.respond",params:B}}async handleActorUIRequest(A,Q){let $=new AbortController;this.pendingActorUIRequests.set(A.requestId,$);let B={type:"request",id:A.requestId,method:A.method,params:A.params};try{let D=await this.dispatchOwnerUIRequest(B,$.signal);if(this.pendingActorUIRequests.get(A.requestId)!==$)return;this.pendingActorUIRequests.delete(A.requestId),Q(this.buildPluginUIRespondRequest(A.requestId,D))}catch(D){if(this.pendingActorUIRequests.get(A.requestId)!==$)return;this.pendingActorUIRequests.delete(A.requestId),Q(this.buildPluginUIRespondRequest(A.requestId,void 0,D instanceof Error?D.message:String(D)))}}upsertActorUIState(A,Q){if(this.stateBackedRequestIDs.add(A.requestId),A.status!=="pending"){this.cancelActorUIRequest(A.requestId);return}if(this.pendingActorUIRequests.has(A.requestId))return;this.handleActorUIRequest(A,Q)}handlePluginUISnapshot(A,Q){let $=new Set(A.requests.map((B)=>B.requestId));for(let B of this.pendingActorUIRequests.keys())if(!$.has(B))this.cancelActorUIRequest(B);for(let B of this.stateBackedRequestIDs)if(!$.has(B))this.stateBackedRequestIDs.delete(B);for(let B of A.requests)this.upsertActorUIState(B,Q)}handlePluginUIRequestAdded(A,Q){this.upsertActorUIState(A.request,Q)}handlePluginUIRequestSettled(A,Q){this.upsertActorUIState(A.request,Q)}handlePluginUIRequestRemoved(A){this.cancelActorUIRequest(A.requestId),this.stateBackedRequestIDs.delete(A.requestId)}handlePluginUIStateEvent(A,Q){if(A.event==="plugin.ui.snapshot"){let $=Gk4.safeParse(A.data);if($.success)this.handlePluginUISnapshot($.data,Q);return!0}if(A.event==="plugin.ui.request_added"){let $=Vk4.safeParse(A.data);if($.success)this.handlePluginUIRequestAdded($.data,Q);return!0}if(A.event==="plugin.ui.request_settled"){let $=Kk4.safeParse(A.data);if($.success)this.handlePluginUIRequestSettled($.data,Q);return!0}if(A.event==="plugin.ui.request_removed"){let $=zk4.safeParse(A.data);if($.success)this.handlePluginUIRequestRemoved($.data);return!0}return!1}clearPluginPlatformStatusHandlers(){let A=this.options.neoContext.pluginPlatform;if(!A)return;if(A.createStatusItemHandler===this.createStatusItem)A.createStatusItemHandler=null;if(A.updateStatusItemHandler===this.updateStatusItem)A.updateStatusItemHandler=null;if(A.removeStatusItemHandler===this.removeStatusItem)A.removeStatusItemHandler=null}subscribePluginCommands(){let A=this.options.neoContext.pluginService;if(!A)return;this.refreshPluginCommands(A.commands.list()),this.pluginCommandSubscriptions=[A.plugins.subscribe((Q)=>{this.removeInactivePluginStatusItems(Q),this.showNewPluginErrorToasts(Q),this.refreshPluginCommands(A.commands.list())}),A.commands.changed.subscribe(()=>{this.refreshPluginCommands(A.commands.list())})]}refreshPluginCommands(A){this.unregisterPluginCommands?.();let $=A.map((B)=>this.createPluginCommand(B)).map((B)=>this.options.commandRegistry.register(B));this.unregisterPluginCommands=()=>{for(let B of $)B()}}showNewPluginErrorToasts(A){let Q=new Set;for(let $ of A){if($.status!=="error")continue;if(ai($.errorMessage))continue;let B=`${$.uri.toString()}
5225
- ${$.errorMessage??""}`;if(Q.add(B),this.pluginErrorToastKeys.has(B))continue;this.options.toastController.show(this.formatPluginErrorToast($),"error",8000)}this.pluginErrorToastKeys=Q}removeInactivePluginStatusItems(A){let Q=new Set(A.filter((B)=>B.status==="active").map((B)=>B.uri.toString())),$=[];for(let[B,D]of this.statusItems){if(Q.has(D.pluginURI))continue;$.push(B)}if($.length===0)return;this.updateStatusItemState(()=>{for(let B of $)this.statusItems.delete(B)})}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.neoContext.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,status:A.availability,run:async(Q,$,B)=>{B();try{await this.options.neoContext.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(D){u.error("Neo plugin command failed",{error:D,command:A}),this.options.toastController.show(D instanceof Error?D.message:String(D),"error",5000)}}}}showInputDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"input",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=FF(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showConfirmDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(!1);return}let B={kind:"confirm",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=FF(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showSelectDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"select",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=FF(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};createStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let B=this.statusItemKey(A,Q),D={pluginURI:A,id:Q};if($!==void 0)D.value=$;this.statusItems.set(B,D)})};updateStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.set(this.statusItemKey(A,Q),{pluginURI:A,id:Q,value:$})})};removeStatusItem=(A,Q)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.delete(this.statusItemKey(A,Q))})};updateStatusItemState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}statusItemKey(A,Q){return`${A}\x00${Q}`}cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[],this.resolvingDialog=null,this.emitBlockingConfirmDialogChange();for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.abortUnsubscribe(),A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}abortDialog(A){if(this.activeDialog===A){this.advanceDialog(),this.cancelDialog(A);return}let Q=this.queuedDialogs.indexOf(A);if(Q===-1)return;this.updateDialogState(()=>{this.queuedDialogs.splice(Q,1)}),this.cancelDialog(A)}enqueueDialog(A){if(this.activeDialog){if(this.queuedDialogs.push(A),this.resolvingDialog===this.activeDialog)this.advanceResolvingDialog(this.activeDialog);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A}),this.emitBlockingConfirmDialogChange()}resolveInputDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveConfirmDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveSelectDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveDialog(A,Q){if(this.activeDialog!==A||this.resolvingDialog===A)return;this.resolvingDialog=A,A.abortUnsubscribe(),Q(),this.scheduleResolvingDialogAdvance(A,uh3)}scheduleResolvingDialogAdvance(A,Q){a6.instance.addPostFrameCallback(()=>{if(this.activeDialog!==A)return;if(this.queuedDialogs.length>0||Q<=1){this.advanceResolvingDialog(A);return}this.scheduleResolvingDialogAdvance(A,Q-1)},"NeoPluginIntegration.advanceDialog")}advanceResolvingDialog(A){if(this.resolvingDialog===A)this.resolvingDialog=null;if(this.activeDialog!==A)return;this.advanceDialog()}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A();this.emitBlockingConfirmDialogChange()}emitBlockingConfirmDialogChange(){let A=this.hasBlockingConfirmDialog();if(A===this.blockingConfirmDialog)return;this.blockingConfirmDialog=A,this.options.onBlockingConfirmDialogChange?.(A)}}var _h3=48;class s61{visible=!1;onClick=void 0;listeners=new Set;show(A){this.visible=!0,this.onClick=A,this.notifyListeners()}activate(){this.onClick?.()}get isVisible(){return this.visible}dismiss(){this.visible=!1,this.onClick=void 0,this.notifyListeners()}addListener(A){this.listeners.add(A)}removeListener(A){this.listeners.delete(A)}buildComplexToast(){if(!this.visible||!this.onClick)return null;return new Y00({width:_h3,title:"Relaunch to Update Amp",message:"Your threads will resume.",variant:"success",mouseBehavior:"click-anywhere",action:{keyboardShortcut:"Ctrl+O",command:"amp: relaunch",confirmShortcut:"Enter",label:"relaunch",onAction:()=>this.activate()}})}notifyListeners(){for(let A of this.listeners)A()}}c0();import{spawnSync as Th3}from"node:child_process";import yD from"node:process";var _a4={options:new Set(["settings-file","log-level","log-file","mcp-config"]),booleans:new Set(["color","dangerously-allow-all","ide","jetbrains","neo-orb","notifications"])};function G00(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else z4.instance.stop()}function Ta4(A){return{noun:"amp",verb:"Relaunch (Quit & Reopen)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update"],shortcut:yD.env.NODE_ENV==="development"&&yD.platform==="darwin"?G1.meta("r"):void 0,status:{type:"enabled"},sortBoost:90,run:(Q,$,B)=>{B(),G00(A)}}}function vh3(A,Q){let{command:$,args:B}=kh3(A),D=yD.execve,J=yD.platform==="win32"||!D,E=J?"spawnSync":"execve";if(u.info("Relaunching Amp; threads will be resumed",{threadIDs:A,relaunchMethod:E}),J){let F=Th3($,B,{cwd:Q,env:yD.env,stdio:"inherit"});if(F.error)return u.error("Failed to relaunch Amp",{error:F.error}),1;return F.status??1}try{if(yD.chdir(Q),$.includes("/"))return D($,[$,...B],yD.env);return D("/usr/bin/env",["env",$,...B],yD.env)}catch(F){return u.error("Failed to relaunch Amp",{error:F}),1}}class t61{relaunchRequested=!1;requestedThreadIDs=[];request=(A)=>{u.info("Relaunch requested; threads will be resumed",{threadIDs:A}),this.relaunchRequested=!0,this.requestedThreadIDs=A};get shouldShowExitSummary(){return!this.relaunchRequested}relaunchIfRequested(A){if(!this.relaunchRequested)return;return vh3(this.requestedThreadIDs,A)}}function kh3(A){let Q=A.length>0?["threads","continue",...A]:[],$=Sh3(yD.argv),B=yh3();if(B)return{command:B.command,args:[...B.args,...$,...Q]};let D=yD.argv[1],J=D&&fh3(D)?[D]:[];return{command:yD.execPath,args:[...J,...$,...Q]}}function Sh3(A){let Q=[],$=A.slice(2);for(let B=0;B<$.length;B+=1){let D=$[B];if(!D?.startsWith("--"))continue;let[J,E]=D.split("=",2);if(!J)continue;let F=J.slice(2),Y=F.startsWith("no-")?F.slice(3):F;if(_a4.booleans.has(Y)){Q.push(D);continue}if(!_a4.options.has(F))continue;if(E!==void 0){Q.push(D);continue}let Z=$[B+1];if(Z===void 0||Z.startsWith("--"))continue;Q.push(D,Z),B+=1}return Q}function fh3(A){return A!==yD.execPath&&!A.startsWith("/$bunfs/")}function yh3(){if(yD.env.NODE_ENV!=="development")return null;let A=yD.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=xh3(A),$=Q[0];if(!$)return null;return{command:$,args:Q.slice(1)}}function xh3(A){if(A.startsWith("["))try{let Q=JSON.parse(A);if(Array.isArray(Q)&&Q.every(($)=>typeof $==="string"))return Q}catch{return[]}return A.split(/\s+/).filter(Boolean)}var bh3=18000000;class e61{options;subscription=null;relaunchNotificationShown=!1;relaunchNotificationPending=!1;relaunchNotificationTimer=null;openedAt=Date.now();constructor(A){this.options=A}init(){if(this.subscription=this.options.updateService?.state.subscribe((A)=>{this.handleUpdateState(A)})??null,process.env.DEV_SHOW_RELAUNCH_NOTIF_ON_STARTUP==="1")this.showUpdateRelaunchNotification(!0)}dispose(){if(this.subscription?.unsubscribe(),this.subscription=null,this.relaunchNotificationTimer)clearTimeout(this.relaunchNotificationTimer),this.relaunchNotificationTimer=null}handleUpdateState(A){if(A!=="updated")return;this.showUpdateRelaunchNotification()}showUpdateRelaunchNotification(A=!1){if(this.relaunchNotificationShown)return;let $=(this.options.minimumOpenDurationMs??bh3)-(Date.now()-this.openedAt);if($>0&&!A){if(this.relaunchNotificationPending=!0,!this.relaunchNotificationTimer)this.relaunchNotificationTimer=setTimeout(()=>{if(this.relaunchNotificationTimer=null,!this.relaunchNotificationPending)return;this.relaunchNotificationPending=!1,this.showUpdateRelaunchNotification()},$),this.relaunchNotificationTimer.unref();return}this.relaunchNotificationPending=!1,this.relaunchNotificationShown=!0,this.options.relaunchNotificationController.show(()=>G00(this.options))}}wa();g2();import{readFile as hh3}from"node:fs/promises";import AA1 from"node:os";function gh3(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function va4(A,Q){try{return{path:Q,contents:Om0(await hh3(A,"utf8"))}}catch{return null}}async function WV0(A,Q){let $=[],B=gh3(),D=await o4.getThread({thread:Q},{config:A.configService}),J=D.ok?D.result.thread.data:null;$.push({path:`${B}/thread.json`,contents:JSON.stringify(WD(J),null,2)});let E=await va4(Ay(Q),`${B}/logs/${Q}.log`);if(E)$.push(E);let F=await va4(A.settingsFilePath,`${B}/settings/global.json`);if(F)$.push(F);let Y=await xG()??"unknown",Z=await o4.sendReport({threadID:Q,files:$,metadata:{clientVersion:"0.0.1779872458-g7b0532",clientOS:`${AA1.platform()} ${AA1.release()} ${AA1.arch()}`,installMethod:Y}},{config:A.configService});if(!Z.ok)throw Error(`Failed to submit report: ${Z.error.message}`);return Z.result.reportID}class QA1{backStack=[];forwardStack=[];canNavigateBack(){return this.backStack.length>0}canNavigateForward(){return this.forwardStack.length>0}recordNavigation(A){if(!A)return;this.backStack.push(A),this.forwardStack.length=0}startBackNavigation(A){let Q=this.backStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.backStack.pop();this.forwardStack.push(Q)}}}}class IV0 extends g3{offstage;constructor({key:A,offstage:Q=!0,child:$}){super({key:A,child:$});this.offstage=Q}createRenderObject(){return new $A1(this.offstage)}updateRenderObject(A){if(A instanceof $A1)A.offstage=this.offstage}}class $A1 extends i1{_offstage;constructor(A){super();this._offstage=A}get offstage(){return this._offstage}set offstage(A){if(A===this._offstage)return;this._offstage=A,this.markNeedsLayout()}getMinIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicWidth(A)??0}getMaxIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicWidth(A)??0}getMinIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicHeight(A)??0}getMaxIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicHeight(A)??0}performLayout(){let A=this._lastConstraints;q4(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let $=A.constrain(Q.size.width,Q.size.height);this.setSize($.width,$.height),Q.setOffset(0,0)}else{let $=A.smallest;this.setSize($.width,$.height)}super.performLayout()}paint(A,Q,$){if(this._offstage)return;super.paint(A,Q,$)}hitTest(A,Q,$,B){if(this._offstage)return!1;return super.hitTest(A,Q,$,B)}}class V00{_state=null;_attach(A){this._state=A}_detach(){this._state=null}push(A){this._state?.push(A)}pushWithDismiss(A){this._state?.pushWithDismiss(A)}pop(){return this._state?.pop()??!1}get canPop(){return this._state?.canPop??!1}}class BA1 extends u0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new ka4}}class ka4 extends R0{entries=[];initState(){this.widget.controller._attach(this)}didUpdateWidget(A){if(A.controller!==this.widget.controller)A.controller._detach(),this.widget.controller._attach(this)}dispose(){this.widget.controller._detach(),super.dispose()}push(A){let Q=new ZR,$=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:$})})}pushWithDismiss(A){let Q=new ZR,$=this.makeScopedDismiss(Q),B=A($);this.setState(()=>{this.entries.push({key:Q,widget:B,dismiss:$})})}pop(){if(this.entries.length===0)return!1;return this.setState(()=>{this.entries.pop()}),!0}get canPop(){return this.entries.length>0}makeScopedDismiss(A){return()=>{if(!this.mounted)return;let Q=this.entries[this.entries.length-1];if(!Q||Q.key!==A)return;this.setState(()=>{this.entries.pop()})}}build(A){let Q=[];Q.push(new IV0({offstage:this.entries.length>0,child:this.widget.root}));for(let $=0;$<this.entries.length;$++){let B=this.entries[$],D=$===this.entries.length-1,J=D?new k4({autofocus:!0,debugLabel:`ModalStackEntry[${$}]`,onKey:(E)=>{if(E.key!=="Escape")return"ignored";return B.dismiss(),"handled"},child:B.widget}):B.widget;Q.push(new IV0({key:B.key,offstage:!D,child:J}))}return new i4({fit:"expand",children:Q})}}class JA1 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter((D)=>D.status.type!=="hidden"),$=dh3(Q),B="";return new C6({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:K0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new cA({items:Q,showBorder:!1,getLabel:(D)=>{let J=DA1(D);return D.keywords&&D.keywords.length>0?`${J} ${D.keywords.join(" ").toLowerCase()}`:J},onQueryChange:(D)=>{B=D},sortItems:(D,J,E)=>{B=E;let F=E.trim().toLowerCase();if(F===""){let K=D.item.status.type==="disabled"?1:0,z=J.item.status.type==="disabled"?1:0;if(K!==z)return K-z;let W=D.item.sortBoost??0,I=J.item.sortBoost??0;if(W!==I)return I-W;let H=D.item.noun?.toLowerCase()??"",q=J.item.noun?.toLowerCase()??"";if(H!==q)return H<q?-1:1;return 0}let Y=Sa4(D.item,F),Z=Sa4(J.item,F);if(Y!==Z)return Y?-1:1;let U=uR(D.item.verb.toLowerCase(),E),X=uR(J.item.verb.toLowerCase(),E);if(U!==X)return X-U;let G=uR(DA1(D.item),E),V=uR(DA1(J.item),E);if(G!==V)return V-G;return J.score-D.score},isItemDisabled:(D)=>D.status.type==="disabled",buildDisabledReasonWidget:(D,J)=>{if(D.status.type!=="disabled")return;let{colors:E}=O0.of(J);return new d({text:new w(D.status.reason,new T({color:E.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:(D,J,E,F)=>new fa4({command:D,isSelected:J,isDisabled:E,categoryWidth:$,query:B,buildContext:F}),onAccept:(D)=>{this.props.onAccept(D)},onDismiss:this.props.onDismiss})})}}class fa4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:$,isDisabled:B,categoryWidth:D,query:J,buildContext:E}=this.props,F=O0.of(E),{colors:Y,app:Z}=F,U=$?Z.selectionBackground:void 0,X=$?Z.selectionForeground:Y.foreground,G=$?X:Y.mutedForeground,V=new d({text:new w(Q.noun?.toLowerCase()??"",new T({color:G,dim:B||!$})),textAlign:"right"}),K=[new w(Q.verb.toLowerCase(),new T({color:X,bold:!0,dim:B}))];if(B)K.push(new w(" (unavailable)",new T({color:X,dim:!0})));let z=mh3(Q,J);if(z)K.push(new w(" (alias: ",new T({color:X,dim:B}))),K.push(new w(z,new T({color:X,dim:B}))),K.push(new w(")",new T({color:X,dim:B})));let W=d.spans(K),I=[{child:V,fixedWidth:D},{child:W,expanded:!0}];if(Q.shortcut)I.push({child:ph3(Q.shortcut,F,B)});return new ya4({columns:I,padding:K0.horizontal(1),backgroundColor:U})}}function DA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function Sa4(A,Q){return A.keywords?.some(($)=>$.trim().toLowerCase()===Q)??!1}function mh3(A,Q){let $=Q.trim().toLowerCase();if($==="")return;return A.keywords?.find((B)=>B.trim().toLowerCase()===$)}function dh3(A){return A.reduce((Q,$)=>{return $.noun?Math.max(Q,E4($.noun)):Q},0)}function ph3(A,Q,$){let{app:B}=Q,D=new T({color:B.keybind,bold:!0,dim:$}),J=[],E=EE(A.toString()).split("+");for(let F=0;F<E.length;F++){if(F>0)J.push(new w("+",D));J.push(new w(E[F],D))}return d.spans(J)}class ya4 extends H1{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:$=2,padding:B,backgroundColor:D}=this.props,J=[];for(let F=0;F<Q.length;F++){let Y=Q[F];if(F>0&&$>0)J.push(new X0({width:$}));if(Y.fixedWidth!==void 0)J.push(new X0({width:Y.fixedWidth,child:Y.child}));else if(Y.expanded)J.push(new R1({child:Y.child}));else J.push(Y.child)}let E=new s0({crossAxisAlignment:"start",children:J});if(!B&&!D)return E;return new b0({decoration:D?{color:D}:void 0,padding:B,child:E})}}class EA1{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#$(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#$()}}findByID(A){return this.#A.find((Q)=>Q.id===A)}runByID(A,Q){let $=this.findByID(A);if(!$||$.status.type!=="enabled")return!1;return $.run(new V00,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#$(){for(let A of this.#Q)A()}}class R9 extends GA{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=R9.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(R9)?.commandRegistry??null}}class FA1 extends u0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new xa4}}class xa4 extends R0{modalStack=new V00;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=R9.of(this.context);this.commandRegistry=A,A.addListener(this.onCommandsChanged)})}dispose(){this.commandRegistry?.removeListener(this.onCommandsChanged),this.commandRegistry=null,super.dispose()}onCommandsChanged=()=>{this.setState()};build(A){let Q=R9.of(A).commands,$=new JA1({commands:Q,onAccept:(B)=>{B.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new BA1({root:$,controller:this.modalStack})}}var YA1=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],ZA1=[{description:"Page scroll",methods:[{keys:["Pg Up"]},{keys:["Pg Down"]}]},{description:"Half-page scroll",methods:[{input:"K",keys:["Alt"]},{input:"J",keys:["Alt"]}]},{description:"Mouse wheel scroll",methods:[{keys:["Mouse Wheel"]}]},{description:"Jump to first message",methods:[{keys:["Home"]}]},{description:"Jump to bottom of screen",methods:[{keys:["End"]}]},{description:"Navigate to previous messages",methods:[{keys:["Tab"]},{keys:["Shift","Tab"]}]}];class HV0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let $=g1.of(A).size.width,B=50,D=$<50,J=[];for(let E of this.items){let[F,Y]=this.renderRow(E),Z;if(D)Z=new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new y0({padding:K0.only({left:4}),child:Y})]});else Z=new s0({crossAxisAlignment:"start",children:[new R1({flex:1,child:F}),new X0({width:1}),new R1({flex:1,child:Y})]});J.push(new y0({padding:K0.horizontal(6),child:Z}))}return new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:J})}}class UA1 extends u0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:$}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=$??!0}createState(){return new ba4}}class ba4 extends R0{scrollController;initState(){this.scrollController=new v6,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let $=L1.of(A).colorScheme,D=O0.of(A).app,J=g1.of(A),E=new T({color:$.primary,bold:!0}),F=new T({color:$.secondary,bold:!0}),Y=new T({color:D.keybind}),Z=new T({color:D.command}),U=new T({color:$.foreground}),X=new T({color:$.foreground}),G=J.size.width,V=J.size.height,K=G-4,z=V-4,W=Math.max(40,Math.min(80,K)),I=new Set(["permissions-disable"]),q=[...this.widget.commands.filter((O)=>{let R=O.noun?.toLowerCase();return R!=="dev"&&R!=="debug"&&!O.id.startsWith("debug-")&&!I.has(O.id)})].sort((O,R)=>{let k=(O.noun??"").toLowerCase(),_=(R.noun??"").toLowerCase(),f=k.localeCompare(_);if(f!==0)return f;let g=O.verb.toLowerCase(),b=R.verb.toLowerCase(),v=g.localeCompare(b);if(v!==0)return v;return O.id.localeCompare(R.id)}),N=new k6({autofocus:!0,controller:this.scrollController,child:new b0({constraints:new w1(W,W,0,Number.POSITIVE_INFINITY),child:new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new D4({child:new d({text:new w(`Amp CLI - Help & Keyboard Shortcuts
5225
+ ${$.errorMessage??""}`;if(Q.add(B),this.pluginErrorToastKeys.has(B))continue;this.options.toastController.show(this.formatPluginErrorToast($),"error",8000)}this.pluginErrorToastKeys=Q}removeInactivePluginStatusItems(A){let Q=new Set(A.filter((B)=>B.status==="active").map((B)=>B.uri.toString())),$=[];for(let[B,D]of this.statusItems){if(Q.has(D.pluginURI))continue;$.push(B)}if($.length===0)return;this.updateStatusItemState(()=>{for(let B of $)this.statusItems.delete(B)})}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.neoContext.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,status:A.availability,run:async(Q,$,B)=>{B();try{await this.options.neoContext.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(D){u.error("Neo plugin command failed",{error:D,command:A}),this.options.toastController.show(D instanceof Error?D.message:String(D),"error",5000)}}}}showInputDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"input",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=FF(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showConfirmDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(!1);return}let B={kind:"confirm",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=FF(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showSelectDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"select",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=FF(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};createStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let B=this.statusItemKey(A,Q),D={pluginURI:A,id:Q};if($!==void 0)D.value=$;this.statusItems.set(B,D)})};updateStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.set(this.statusItemKey(A,Q),{pluginURI:A,id:Q,value:$})})};removeStatusItem=(A,Q)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.delete(this.statusItemKey(A,Q))})};updateStatusItemState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}statusItemKey(A,Q){return`${A}\x00${Q}`}cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[],this.resolvingDialog=null,this.emitBlockingConfirmDialogChange();for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.abortUnsubscribe(),A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}abortDialog(A){if(this.activeDialog===A){this.advanceDialog(),this.cancelDialog(A);return}let Q=this.queuedDialogs.indexOf(A);if(Q===-1)return;this.updateDialogState(()=>{this.queuedDialogs.splice(Q,1)}),this.cancelDialog(A)}enqueueDialog(A){if(this.activeDialog){if(this.queuedDialogs.push(A),this.resolvingDialog===this.activeDialog)this.advanceResolvingDialog(this.activeDialog);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A}),this.emitBlockingConfirmDialogChange()}resolveInputDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveConfirmDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveSelectDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveDialog(A,Q){if(this.activeDialog!==A||this.resolvingDialog===A)return;this.resolvingDialog=A,A.abortUnsubscribe(),Q(),this.scheduleResolvingDialogAdvance(A,uh3)}scheduleResolvingDialogAdvance(A,Q){a6.instance.addPostFrameCallback(()=>{if(this.activeDialog!==A)return;if(this.queuedDialogs.length>0||Q<=1){this.advanceResolvingDialog(A);return}this.scheduleResolvingDialogAdvance(A,Q-1)},"NeoPluginIntegration.advanceDialog")}advanceResolvingDialog(A){if(this.resolvingDialog===A)this.resolvingDialog=null;if(this.activeDialog!==A)return;this.advanceDialog()}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A();this.emitBlockingConfirmDialogChange()}emitBlockingConfirmDialogChange(){let A=this.hasBlockingConfirmDialog();if(A===this.blockingConfirmDialog)return;this.blockingConfirmDialog=A,this.options.onBlockingConfirmDialogChange?.(A)}}var _h3=48;class s61{visible=!1;onClick=void 0;listeners=new Set;show(A){this.visible=!0,this.onClick=A,this.notifyListeners()}activate(){this.onClick?.()}get isVisible(){return this.visible}dismiss(){this.visible=!1,this.onClick=void 0,this.notifyListeners()}addListener(A){this.listeners.add(A)}removeListener(A){this.listeners.delete(A)}buildComplexToast(){if(!this.visible||!this.onClick)return null;return new Y00({width:_h3,title:"Relaunch to Update Amp",message:"Your threads will resume.",variant:"success",mouseBehavior:"click-anywhere",action:{keyboardShortcut:"Ctrl+O",command:"amp: relaunch",confirmShortcut:"Enter",label:"relaunch",onAction:()=>this.activate()}})}notifyListeners(){for(let A of this.listeners)A()}}c0();import{spawnSync as Th3}from"node:child_process";import yD from"node:process";var _a4={options:new Set(["settings-file","log-level","log-file","mcp-config"]),booleans:new Set(["color","dangerously-allow-all","ide","jetbrains","neo-orb","notifications"])};function G00(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else z4.instance.stop()}function Ta4(A){return{noun:"amp",verb:"Relaunch (Quit & Reopen)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update"],shortcut:yD.env.NODE_ENV==="development"&&yD.platform==="darwin"?G1.meta("r"):void 0,status:{type:"enabled"},sortBoost:90,run:(Q,$,B)=>{B(),G00(A)}}}function vh3(A,Q){let{command:$,args:B}=kh3(A),D=yD.execve,J=yD.platform==="win32"||!D,E=J?"spawnSync":"execve";if(u.info("Relaunching Amp; threads will be resumed",{threadIDs:A,relaunchMethod:E}),J){let F=Th3($,B,{cwd:Q,env:yD.env,stdio:"inherit"});if(F.error)return u.error("Failed to relaunch Amp",{error:F.error}),1;return F.status??1}try{if(yD.chdir(Q),$.includes("/"))return D($,[$,...B],yD.env);return D("/usr/bin/env",["env",$,...B],yD.env)}catch(F){return u.error("Failed to relaunch Amp",{error:F}),1}}class t61{relaunchRequested=!1;requestedThreadIDs=[];request=(A)=>{u.info("Relaunch requested; threads will be resumed",{threadIDs:A}),this.relaunchRequested=!0,this.requestedThreadIDs=A};get shouldShowExitSummary(){return!this.relaunchRequested}relaunchIfRequested(A){if(!this.relaunchRequested)return;return vh3(this.requestedThreadIDs,A)}}function kh3(A){let Q=A.length>0?["threads","continue",...A]:[],$=Sh3(yD.argv),B=yh3();if(B)return{command:B.command,args:[...B.args,...$,...Q]};let D=yD.argv[1],J=D&&fh3(D)?[D]:[];return{command:yD.execPath,args:[...J,...$,...Q]}}function Sh3(A){let Q=[],$=A.slice(2);for(let B=0;B<$.length;B+=1){let D=$[B];if(!D?.startsWith("--"))continue;let[J,E]=D.split("=",2);if(!J)continue;let F=J.slice(2),Y=F.startsWith("no-")?F.slice(3):F;if(_a4.booleans.has(Y)){Q.push(D);continue}if(!_a4.options.has(F))continue;if(E!==void 0){Q.push(D);continue}let Z=$[B+1];if(Z===void 0||Z.startsWith("--"))continue;Q.push(D,Z),B+=1}return Q}function fh3(A){return A!==yD.execPath&&!A.startsWith("/$bunfs/")}function yh3(){if(yD.env.NODE_ENV!=="development")return null;let A=yD.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=xh3(A),$=Q[0];if(!$)return null;return{command:$,args:Q.slice(1)}}function xh3(A){if(A.startsWith("["))try{let Q=JSON.parse(A);if(Array.isArray(Q)&&Q.every(($)=>typeof $==="string"))return Q}catch{return[]}return A.split(/\s+/).filter(Boolean)}var bh3=18000000;class e61{options;subscription=null;relaunchNotificationShown=!1;relaunchNotificationPending=!1;relaunchNotificationTimer=null;openedAt=Date.now();constructor(A){this.options=A}init(){if(this.subscription=this.options.updateService?.state.subscribe((A)=>{this.handleUpdateState(A)})??null,process.env.DEV_SHOW_RELAUNCH_NOTIF_ON_STARTUP==="1")this.showUpdateRelaunchNotification(!0)}dispose(){if(this.subscription?.unsubscribe(),this.subscription=null,this.relaunchNotificationTimer)clearTimeout(this.relaunchNotificationTimer),this.relaunchNotificationTimer=null}handleUpdateState(A){if(A!=="updated")return;this.showUpdateRelaunchNotification()}showUpdateRelaunchNotification(A=!1){if(this.relaunchNotificationShown)return;let $=(this.options.minimumOpenDurationMs??bh3)-(Date.now()-this.openedAt);if($>0&&!A){if(this.relaunchNotificationPending=!0,!this.relaunchNotificationTimer)this.relaunchNotificationTimer=setTimeout(()=>{if(this.relaunchNotificationTimer=null,!this.relaunchNotificationPending)return;this.relaunchNotificationPending=!1,this.showUpdateRelaunchNotification()},$),this.relaunchNotificationTimer.unref();return}this.relaunchNotificationPending=!1,this.relaunchNotificationShown=!0,this.options.relaunchNotificationController.show(()=>G00(this.options))}}wa();g2();import{readFile as hh3}from"node:fs/promises";import AA1 from"node:os";function gh3(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function va4(A,Q){try{return{path:Q,contents:Om0(await hh3(A,"utf8"))}}catch{return null}}async function WV0(A,Q){let $=[],B=gh3(),D=await o4.getThread({thread:Q},{config:A.configService}),J=D.ok?D.result.thread.data:null;$.push({path:`${B}/thread.json`,contents:JSON.stringify(WD(J),null,2)});let E=await va4(Ay(Q),`${B}/logs/${Q}.log`);if(E)$.push(E);let F=await va4(A.settingsFilePath,`${B}/settings/global.json`);if(F)$.push(F);let Y=await xG()??"unknown",Z=await o4.sendReport({threadID:Q,files:$,metadata:{clientVersion:"0.0.1779886645-g59fcb2",clientOS:`${AA1.platform()} ${AA1.release()} ${AA1.arch()}`,installMethod:Y}},{config:A.configService});if(!Z.ok)throw Error(`Failed to submit report: ${Z.error.message}`);return Z.result.reportID}class QA1{backStack=[];forwardStack=[];canNavigateBack(){return this.backStack.length>0}canNavigateForward(){return this.forwardStack.length>0}recordNavigation(A){if(!A)return;this.backStack.push(A),this.forwardStack.length=0}startBackNavigation(A){let Q=this.backStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.backStack.pop();this.forwardStack.push(Q)}}}}class IV0 extends g3{offstage;constructor({key:A,offstage:Q=!0,child:$}){super({key:A,child:$});this.offstage=Q}createRenderObject(){return new $A1(this.offstage)}updateRenderObject(A){if(A instanceof $A1)A.offstage=this.offstage}}class $A1 extends i1{_offstage;constructor(A){super();this._offstage=A}get offstage(){return this._offstage}set offstage(A){if(A===this._offstage)return;this._offstage=A,this.markNeedsLayout()}getMinIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicWidth(A)??0}getMaxIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicWidth(A)??0}getMinIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicHeight(A)??0}getMaxIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicHeight(A)??0}performLayout(){let A=this._lastConstraints;q4(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let $=A.constrain(Q.size.width,Q.size.height);this.setSize($.width,$.height),Q.setOffset(0,0)}else{let $=A.smallest;this.setSize($.width,$.height)}super.performLayout()}paint(A,Q,$){if(this._offstage)return;super.paint(A,Q,$)}hitTest(A,Q,$,B){if(this._offstage)return!1;return super.hitTest(A,Q,$,B)}}class V00{_state=null;_attach(A){this._state=A}_detach(){this._state=null}push(A){this._state?.push(A)}pushWithDismiss(A){this._state?.pushWithDismiss(A)}pop(){return this._state?.pop()??!1}get canPop(){return this._state?.canPop??!1}}class BA1 extends u0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new ka4}}class ka4 extends R0{entries=[];initState(){this.widget.controller._attach(this)}didUpdateWidget(A){if(A.controller!==this.widget.controller)A.controller._detach(),this.widget.controller._attach(this)}dispose(){this.widget.controller._detach(),super.dispose()}push(A){let Q=new ZR,$=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:$})})}pushWithDismiss(A){let Q=new ZR,$=this.makeScopedDismiss(Q),B=A($);this.setState(()=>{this.entries.push({key:Q,widget:B,dismiss:$})})}pop(){if(this.entries.length===0)return!1;return this.setState(()=>{this.entries.pop()}),!0}get canPop(){return this.entries.length>0}makeScopedDismiss(A){return()=>{if(!this.mounted)return;let Q=this.entries[this.entries.length-1];if(!Q||Q.key!==A)return;this.setState(()=>{this.entries.pop()})}}build(A){let Q=[];Q.push(new IV0({offstage:this.entries.length>0,child:this.widget.root}));for(let $=0;$<this.entries.length;$++){let B=this.entries[$],D=$===this.entries.length-1,J=D?new k4({autofocus:!0,debugLabel:`ModalStackEntry[${$}]`,onKey:(E)=>{if(E.key!=="Escape")return"ignored";return B.dismiss(),"handled"},child:B.widget}):B.widget;Q.push(new IV0({key:B.key,offstage:!D,child:J}))}return new i4({fit:"expand",children:Q})}}class JA1 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter((D)=>D.status.type!=="hidden"),$=dh3(Q),B="";return new C6({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:K0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new cA({items:Q,showBorder:!1,getLabel:(D)=>{let J=DA1(D);return D.keywords&&D.keywords.length>0?`${J} ${D.keywords.join(" ").toLowerCase()}`:J},onQueryChange:(D)=>{B=D},sortItems:(D,J,E)=>{B=E;let F=E.trim().toLowerCase();if(F===""){let K=D.item.status.type==="disabled"?1:0,z=J.item.status.type==="disabled"?1:0;if(K!==z)return K-z;let W=D.item.sortBoost??0,I=J.item.sortBoost??0;if(W!==I)return I-W;let H=D.item.noun?.toLowerCase()??"",q=J.item.noun?.toLowerCase()??"";if(H!==q)return H<q?-1:1;return 0}let Y=Sa4(D.item,F),Z=Sa4(J.item,F);if(Y!==Z)return Y?-1:1;let U=uR(D.item.verb.toLowerCase(),E),X=uR(J.item.verb.toLowerCase(),E);if(U!==X)return X-U;let G=uR(DA1(D.item),E),V=uR(DA1(J.item),E);if(G!==V)return V-G;return J.score-D.score},isItemDisabled:(D)=>D.status.type==="disabled",buildDisabledReasonWidget:(D,J)=>{if(D.status.type!=="disabled")return;let{colors:E}=O0.of(J);return new d({text:new w(D.status.reason,new T({color:E.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:(D,J,E,F)=>new fa4({command:D,isSelected:J,isDisabled:E,categoryWidth:$,query:B,buildContext:F}),onAccept:(D)=>{this.props.onAccept(D)},onDismiss:this.props.onDismiss})})}}class fa4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:$,isDisabled:B,categoryWidth:D,query:J,buildContext:E}=this.props,F=O0.of(E),{colors:Y,app:Z}=F,U=$?Z.selectionBackground:void 0,X=$?Z.selectionForeground:Y.foreground,G=$?X:Y.mutedForeground,V=new d({text:new w(Q.noun?.toLowerCase()??"",new T({color:G,dim:B||!$})),textAlign:"right"}),K=[new w(Q.verb.toLowerCase(),new T({color:X,bold:!0,dim:B}))];if(B)K.push(new w(" (unavailable)",new T({color:X,dim:!0})));let z=mh3(Q,J);if(z)K.push(new w(" (alias: ",new T({color:X,dim:B}))),K.push(new w(z,new T({color:X,dim:B}))),K.push(new w(")",new T({color:X,dim:B})));let W=d.spans(K),I=[{child:V,fixedWidth:D},{child:W,expanded:!0}];if(Q.shortcut)I.push({child:ph3(Q.shortcut,F,B)});return new ya4({columns:I,padding:K0.horizontal(1),backgroundColor:U})}}function DA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function Sa4(A,Q){return A.keywords?.some(($)=>$.trim().toLowerCase()===Q)??!1}function mh3(A,Q){let $=Q.trim().toLowerCase();if($==="")return;return A.keywords?.find((B)=>B.trim().toLowerCase()===$)}function dh3(A){return A.reduce((Q,$)=>{return $.noun?Math.max(Q,E4($.noun)):Q},0)}function ph3(A,Q,$){let{app:B}=Q,D=new T({color:B.keybind,bold:!0,dim:$}),J=[],E=EE(A.toString()).split("+");for(let F=0;F<E.length;F++){if(F>0)J.push(new w("+",D));J.push(new w(E[F],D))}return d.spans(J)}class ya4 extends H1{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:$=2,padding:B,backgroundColor:D}=this.props,J=[];for(let F=0;F<Q.length;F++){let Y=Q[F];if(F>0&&$>0)J.push(new X0({width:$}));if(Y.fixedWidth!==void 0)J.push(new X0({width:Y.fixedWidth,child:Y.child}));else if(Y.expanded)J.push(new R1({child:Y.child}));else J.push(Y.child)}let E=new s0({crossAxisAlignment:"start",children:J});if(!B&&!D)return E;return new b0({decoration:D?{color:D}:void 0,padding:B,child:E})}}class EA1{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#$(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#$()}}findByID(A){return this.#A.find((Q)=>Q.id===A)}runByID(A,Q){let $=this.findByID(A);if(!$||$.status.type!=="enabled")return!1;return $.run(new V00,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#$(){for(let A of this.#Q)A()}}class R9 extends GA{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=R9.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(R9)?.commandRegistry??null}}class FA1 extends u0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new xa4}}class xa4 extends R0{modalStack=new V00;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=R9.of(this.context);this.commandRegistry=A,A.addListener(this.onCommandsChanged)})}dispose(){this.commandRegistry?.removeListener(this.onCommandsChanged),this.commandRegistry=null,super.dispose()}onCommandsChanged=()=>{this.setState()};build(A){let Q=R9.of(A).commands,$=new JA1({commands:Q,onAccept:(B)=>{B.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new BA1({root:$,controller:this.modalStack})}}var YA1=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],ZA1=[{description:"Page scroll",methods:[{keys:["Pg Up"]},{keys:["Pg Down"]}]},{description:"Half-page scroll",methods:[{input:"K",keys:["Alt"]},{input:"J",keys:["Alt"]}]},{description:"Mouse wheel scroll",methods:[{keys:["Mouse Wheel"]}]},{description:"Jump to first message",methods:[{keys:["Home"]}]},{description:"Jump to bottom of screen",methods:[{keys:["End"]}]},{description:"Navigate to previous messages",methods:[{keys:["Tab"]},{keys:["Shift","Tab"]}]}];class HV0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let $=g1.of(A).size.width,B=50,D=$<50,J=[];for(let E of this.items){let[F,Y]=this.renderRow(E),Z;if(D)Z=new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new y0({padding:K0.only({left:4}),child:Y})]});else Z=new s0({crossAxisAlignment:"start",children:[new R1({flex:1,child:F}),new X0({width:1}),new R1({flex:1,child:Y})]});J.push(new y0({padding:K0.horizontal(6),child:Z}))}return new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:J})}}class UA1 extends u0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:$}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=$??!0}createState(){return new ba4}}class ba4 extends R0{scrollController;initState(){this.scrollController=new v6,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let $=L1.of(A).colorScheme,D=O0.of(A).app,J=g1.of(A),E=new T({color:$.primary,bold:!0}),F=new T({color:$.secondary,bold:!0}),Y=new T({color:D.keybind}),Z=new T({color:D.command}),U=new T({color:$.foreground}),X=new T({color:$.foreground}),G=J.size.width,V=J.size.height,K=G-4,z=V-4,W=Math.max(40,Math.min(80,K)),I=new Set(["permissions-disable"]),q=[...this.widget.commands.filter((O)=>{let R=O.noun?.toLowerCase();return R!=="dev"&&R!=="debug"&&!O.id.startsWith("debug-")&&!I.has(O.id)})].sort((O,R)=>{let k=(O.noun??"").toLowerCase(),_=(R.noun??"").toLowerCase(),f=k.localeCompare(_);if(f!==0)return f;let g=O.verb.toLowerCase(),b=R.verb.toLowerCase(),v=g.localeCompare(b);if(v!==0)return v;return O.id.localeCompare(R.id)}),N=new k6({autofocus:!0,controller:this.scrollController,child:new b0({constraints:new w1(W,W,0,Number.POSITIVE_INFINITY),child:new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new D4({child:new d({text:new w(`Amp CLI - Help & Keyboard Shortcuts
5226
5226
  `,E)})}),new X0({height:1}),new y0({padding:K0.horizontal(2),child:new d({text:new w(`Editor Shortcuts
5227
5227
  `,F)})}),new HV0({items:YA1.filter((O)=>O.submitOnEnterOnly===void 0||O.submitOnEnterOnly===this.widget.submitOnEnter),renderRow:(O)=>{let R=[];for(let _ of O.methods){let f=this.buildCleanKeyCombination(_);R.push(f)}let k=R.join(", ");return[new d({text:new w(k,Y)}),new d({text:new w(O.description,U)})]}}),new X0({height:1}),new y0({padding:K0.horizontal(2),child:new d({text:new w(`Scrolling & Navigation
5228
5228
  `,F)})}),new HV0({items:ZA1,renderRow:(O)=>{let R=[];for(let _ of O.methods){let f=this.buildCleanKeyCombination(_);R.push(f)}let k=R.join(", ");return[new d({text:new w(k,Y)}),new d({text:new w(O.description,U)})]}}),new X0({height:1}),new y0({padding:K0.horizontal(2),child:new d({text:new w(`Command Palette Commands
@@ -5313,7 +5313,7 @@ Ctrl-X, Y, Z to unlock`;if(this.widget.centerContent)g=this.widget.centerContent
5313
5313
  `))}return E}function Dn3(A,Q,$){let{colors:B,app:D}=$,J=Jn3(Q.status,$);if(A.push(new w(` ${J.icon} `,new T({color:J.color}))),A.push(new w(Q.name,new T({color:Q.status==="pending"?B.warning:D.command}))),Q.status==="pending")A.push(new w(" discovering...",new T({color:B.foreground,dim:!0})));else if(Q.description)A.push(new w(` ${Ie4(Q.description,50)}`,new T({color:B.foreground,dim:!0})));if(Q.error)A.push(new w(` ${Ie4(Q.error,40)}`,new T({color:D.toolError})));A.push(new w(`
5314
5314
  `))}function Jn3(A,Q){let{colors:$,app:B}=Q;switch(A){case"pending":return{icon:"◌",color:$.warning};case"registered":return{icon:"•",color:$.mutedForeground};case"failed":return{icon:"✗",color:B.toolError};case"duplicate":return{icon:"◇",color:$.warning};default:return{icon:"?",color:$.foreground}}}function Ie4(A,Q){let $=A.replace(/\s+/g," ").trim();if(E4($)<=Q)return $;let B="...",D=E4(B);if(Q<=D)return IQ(B,Q);return`${IQ($,Q-D,!0,"")}${B}`}var C51="https://ampcode.com/news/neo",w51=[{title:"Meet the new Amp CLI",body:[]},{title:"Rebuilt From The Ground Up",body:["Same close-up terminal workflow. Completely different underneath."]},{title:"Just Keep Typing",body:["Context is summarized automatically at ~90%.","No handoff flow. No context percentage to babysit."]},{title:"Queueing and Steering",body:["Sending a message now queues by default instead of cancelling tools.","Use steering when you want the agent to see something sooner."]},{title:"Remote Control",body:["Start a thread in the CLI, then keep going from ampcode.com.","Watch live updates and queue follow-ups from any device."]},{title:"Customize Amp with Amp",body:[{text:"Amp now has a ",linkText:"complete plugin API",href:"https://ampcode.com/manual/plugin-api",textAfter:"."},"Add tools, commands, control UI, and hook into events."]},{title:"Permissions",body:[{text:"By default (when no ",highlightText:"amp.permissions",textAfterHighlight:" setting is present), Amp no longer asks for confirmation before running any tools and commands. And you can now implement your own custom permission logic with ",linkText:"plugins",href:"https://ampcode.com/manual/plugin-api",textAfter:"."}]},{title:null,body:["Check out the full news post for more:",{text:C51,href:C51},"","",{text:"Need old Amp for a bit? Use ",keybind:"amp --take-me-back"}]}];function En3(A){return[{title:"Upgrade your Amp CLI",body:[{text:"This npm-based distribution of Amp CLI has been deprecated. To use the ",linkText:"new Amp CLI",href:C51,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function Fn3(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var px=50,sR=40,q51=1000,Yn3=420,Zn3=760,Un3=-250,Xn3=1100,VK0=33,Ce4=0.999,Gn3=2.1,Vn3=720,Kn3=420,Pe4="Meet the new",_e4="Amp",Te4="CLI",M51=G4(Pe4).length,zn3=G4(_e4).length,Wn3=G4(Te4).length,KK0={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},we4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},Me4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},Le4=[KK0,we4,Me4,KK0,we4,Me4,KK0],In3=KK0;class L51 extends u0{onDismiss;onQuit;animationProgress;animationsEnabled;variant;binaryInstallCommand;introStages;dismissible;constructor(A){super();this.onDismiss=A.onDismiss,this.onQuit=A.onQuit,this.animationProgress=A.animationProgress,this.animationsEnabled=A.animationsEnabled??!0,this.variant=A.variant??"intro",this.binaryInstallCommand=A.binaryInstallCommand??Fn3(),this.introStages=this.variant==="npm-migration"?En3(this.binaryInstallCommand):w51,this.dismissible=this.variant!=="npm-migration"}createState(){return new ve4}}class ve4 extends R0{startedAt=performance.now();animationTimer=null;stageTransitionTimer=null;firstStageTitleTimer=null;firstStageHintTimer=null;firstStageRevealTimer=null;firstStageTitleRevealStartedAt=null;firstStageHintRevealStartedAt=null;stageTransitionStartedAt=performance.now();animationStartProgress=0;animationTargetProgress=1;animationDurationMs=q51;onAnimationComplete=null;animationProgress=0;introStage=0;previousIntroStage=null;stageTransitionProgress=1;stageTransitionDirection=1;firstStageTitleVisible=!1;firstStageHintVisible=!1;firstStageTitleRevealProgress=0;firstStageHintRevealProgress=0;dismissTimer=null;dismissStartedAt=performance.now();dismissProgress=0;isDismissing=!1;splashOrbGlow=new A7(42);initState(){super.initState(),this.startAnimationIfNeeded()}didUpdateWidget(A){if(super.didUpdateWidget(A),A.animationProgress!==this.widget.animationProgress||A.animationsEnabled!==this.widget.animationsEnabled)this.startAnimationIfNeeded()}dispose(){this.stopAnimation(),this.stopStageTransitionTimer(),this.stopFirstStageRevealTimers(),this.stopDismissAnimation(),super.dispose()}startAnimationIfNeeded(){if(this.stopAnimation(),this.stopFirstStageRevealTimers(),this.widget.animationProgress!==void 0){this.animationProgress=XE(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=Ce4,this.firstStageHintVisible=this.animationProgress>=Ce4,this.firstStageTitleRevealProgress=this.firstStageTitleVisible?1:0,this.firstStageHintRevealProgress=this.firstStageHintVisible?1:0;return}if(!this.widget.animationsEnabled){this.stopStageTransitionTimer(),this.stopDismissAnimation(),this.animationProgress=1,this.isDismissing=!1,this.dismissProgress=0,this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1,this.previousIntroStage=null,this.stageTransitionProgress=1;return}if(this.firstStageTitleVisible=!1,this.firstStageHintVisible=!1,this.firstStageTitleRevealProgress=0,this.firstStageHintRevealProgress=0,this.startProgressAnimation({from:0,to:1,durationMs:q51,onComplete:()=>{if(!this.widget.dismissible)this.setState(()=>{this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1})}}),this.widget.dismissible)this.startFirstStageRevealSequence()}startDismissAnimation(){if(this.isDismissing)return;if(!this.widget.animationsEnabled){this.widget.onDismiss();return}this.stopFirstStageRevealTimers(),this.stopStageTransitionTimer(),this.dismissStartedAt=performance.now(),this.setState(()=>{this.isDismissing=!0,this.dismissProgress=0}),this.dismissTimer=setInterval(()=>{let A=performance.now()-this.dismissStartedAt,Q=XE(A/Zn3);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},VK0)}canNavigateIntroStage(){if(this.isDismissing)return!1;if(!this.firstStageHintVisible)return!1;if(this.introStage===0&&this.firstStageHintRevealProgress<1)return!1;return!0}advanceIntroStage(){if(!this.canNavigateIntroStage())return;if(this.isFinalIntroStage()){if(this.widget.dismissible)this.startDismissAnimation();return}this.moveIntroStage(1)}dismissFromFinalIntroStage(){if(!this.widget.dismissible||!this.canNavigateIntroStage()||!this.isFinalIntroStage())return!1;return this.startDismissAnimation(),!0}nextIntroStage(){if(!this.canNavigateIntroStage()||this.isFinalIntroStage())return;this.moveIntroStage(1)}goToPreviousIntroStage(){if(!this.canNavigateIntroStage()||this.introStage<=0)return;this.moveIntroStage(-1)}isFinalIntroStage(){return this.introStage>=this.widget.introStages.length-1}moveIntroStage(A){let Q=this.introStage+A;if(this.stopStageTransitionTimer(),this.stageTransitionStartedAt=performance.now(),this.setState(()=>{this.previousIntroStage=this.introStage,this.introStage=Q,this.stageTransitionDirection=A}),this.widget.animationProgress!==void 0||!this.widget.animationsEnabled){this.setState(()=>{this.previousIntroStage=null,this.stageTransitionProgress=1});return}this.setState(()=>{this.stageTransitionProgress=0}),this.stageTransitionTimer=setInterval(()=>{let $=performance.now()-this.stageTransitionStartedAt,B=XE($/Yn3);if(this.setState(()=>{if(this.stageTransitionProgress=B,B>=1)this.previousIntroStage=null}),B>=1)this.stopStageTransitionTimer()},VK0)}startProgressAnimation({from:A,to:Q,durationMs:$,onComplete:B}){this.stopAnimation(),this.startedAt=performance.now(),this.animationStartProgress=A,this.animationTargetProgress=Q,this.animationDurationMs=$,this.onAnimationComplete=B,this.animationProgress=A,this.animationTimer=setInterval(()=>{let D=performance.now()-this.startedAt,J=XE(D/this.animationDurationMs),E=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*cx(J);if(this.setState(()=>{this.animationProgress=E}),J>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},VK0)}stopAnimation(){if(this.animationTimer)clearInterval(this.animationTimer),this.animationTimer=null}stopStageTransitionTimer(){if(this.stageTransitionTimer)clearInterval(this.stageTransitionTimer),this.stageTransitionTimer=null}startFirstStageRevealSequence(){if(this.stopFirstStageRevealTimers(),!this.widget.animationsEnabled){this.setState(()=>{this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1});return}this.setState(()=>{this.firstStageTitleVisible=!1,this.firstStageHintVisible=!1,this.firstStageTitleRevealProgress=0,this.firstStageHintRevealProgress=0});let A=Math.max(0,q51+Un3),Q=A+Xn3;this.firstStageTitleTimer=setTimeout(()=>{this.firstStageTitleRevealStartedAt=performance.now(),this.setState(()=>{this.firstStageTitleVisible=!0,this.firstStageTitleRevealProgress=0}),this.startFirstStageRevealTimer()},A),this.firstStageHintTimer=setTimeout(()=>{this.firstStageHintRevealStartedAt=performance.now(),this.setState(()=>{this.firstStageHintVisible=!0,this.firstStageHintRevealProgress=0}),this.startFirstStageRevealTimer()},Q)}startFirstStageRevealTimer(){if(this.firstStageRevealTimer)return;this.firstStageRevealTimer=setInterval(()=>{let A=performance.now(),Q=this.firstStageTitleRevealStartedAt?XE((A-this.firstStageTitleRevealStartedAt)/Vn3):this.firstStageTitleRevealProgress,$=this.firstStageHintRevealStartedAt?XE((A-this.firstStageHintRevealStartedAt)/Kn3):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=$}),Q>=1&&$>=1)this.stopFirstStageRevealTimer()},VK0)}stopFirstStageRevealTimers(){if(this.stopFirstStageRevealTimer(),this.firstStageTitleRevealStartedAt=null,this.firstStageHintRevealStartedAt=null,this.firstStageTitleTimer)clearTimeout(this.firstStageTitleTimer),this.firstStageTitleTimer=null;if(this.firstStageHintTimer)clearTimeout(this.firstStageHintTimer),this.firstStageHintTimer=null}stopFirstStageRevealTimer(){if(this.firstStageRevealTimer)clearInterval(this.firstStageRevealTimer),this.firstStageRevealTimer=null}stopDismissAnimation(){if(this.dismissTimer)clearInterval(this.dismissTimer),this.dismissTimer=null}currentOrbPalette(){let A=Oe4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:je4(Oe4(this.previousIntroStage),A,cx(this.stageTransitionProgress));return this.dismissProgress>0?je4(Q,In3,cx(this.dismissProgress)):Q}build(A){let Q=L1.of(A).colorScheme,$=O0.of(A),B=this.currentOrbPalette(),D=G$(1,"frontier",B),J=g1.of(A).size,F=this.widget.animationProgress??this.animationProgress,Y=Math.max(J.width/px,J.height/sR)*Gn3,Z=Y+(1-Y)*F,U=cx(this.dismissProgress),X=Math.max(px,Math.round(px*Z)),G=Math.max(sR,Math.round(sR*Z)),V=Math.round((J.width-X)/2),K=Math.round((J.height-G)/2),z=Math.max(0,Math.floor((J.width-px)/2)),W=-Math.floor(sR/2),I=Math.round(V+(z-V)*F),H=Math.round(K+(W-K)*F),q=I+X/2,N=H+G/2,C=Hn3({dismissProgress:this.dismissProgress,easedDismissProgress:U,introOrbScale:Z,normalOrbCenterX:q,normalOrbCenterY:N,size:J}),M=Math.max(px,Math.round(px*C.orbScale)),O=Math.max(sR,Math.round(sR*C.orbScale)),R=C.orbCenterX,k=C.orbCenterY,_=Math.round(R-M/2),f=Math.round(k-O/2),g=Math.max(3,Math.min(J.height-5,Math.floor(sR/2)+2)),b=Math.max(g+3,J.height-3),v=C.textDissolveProgress,x=this.isFinalIntroStage()?C.backdropDissolveProgress:0,c=this.firstStageTitleVisible&&v<1,p=c&&this.firstStageHintVisible,h=p&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),i=this.introStage===0?this.firstStageTitleRevealProgress:1,r=this.introStage===0?this.firstStageHintRevealProgress:1,A0=Math.max(24,Math.min(74,J.width-4)),V0=Math.min(12,Math.max(8,J.height-g-6)),Y0=Math.max(0,Math.floor((J.width-A0)/2)),I0=Math.max(0,Math.min(J.height-V0,Math.floor(J.height*0.55-V0/2))),j0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new lN({width:M,height:O,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new lN({width:M,height:O,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new k4({autofocus:!0,canRequestFocus:!0,debugLabel:"NeoWelcomeTakeover",onKey:(Q0)=>{if(Q0.key==="Enter")return this.advanceIntroStage(),"handled";if(!this.widget.dismissible&&Q0.key==="c"&&Q0.ctrlKey)return this.widget.onQuit?.(),"handled";if(!this.widget.dismissible&&Q0.key==="q")return this.widget.onQuit?.(),"handled";if((Q0.key===" "||Q0.key==="Space")&&!this.isFinalIntroStage())return this.advanceIntroStage(),"handled";if(Q0.key==="Escape"||Q0.key==="Esc"){if(!this.widget.dismissible)return this.widget.onQuit?.(),"handled";return this.dismissFromFinalIntroStage()?"handled":"ignored"}if(Q0.key==="ArrowRight")return this.nextIntroStage(),"handled";if(Q0.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new i4({fit:"expand",children:[new ke4({color:Q.background,dissolveProgress:x}),new i4({fit:"expand",children:[new O1({onClick:()=>{},child:X0.expand()}),new r4({left:_,top:f,width:M,height:O,child:j0}),...c?[new r4({left:Y0,top:I0,width:A0,height:V0,child:Nn3({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:A0,height:V0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:D,link:$.app.link,keybind:$.app.keybind,titleRevealProgress:i,dissolveProgress:v,context:A})})]:[],...p?[...h?[new r4({left:Y0,top:Math.max(0,b-1),width:A0,height:1,child:new d({text:jn3({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:v}),textAlign:"center"})})]:[],new r4({left:Y0,top:b,width:A0,height:1,child:un3({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:$.app.keybind,revealProgress:r,dissolveProgress:v,context:A})})]:[]]})]})})}}class ke4 extends u5{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new Se4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class Se4 extends i1{color;dissolveProgress;constructor(A,Q){super();this.color=A,this.dissolveProgress=Q}update(A,Q){this.color=A,this.dissolveProgress=Q,this.markNeedsPaint()}performLayout(){let A=this._lastConstraints;q4(!!A,"performLayout called without constraints");let Q=A.constrain(A.biggest.width,A.biggest.height);this.setSize(Q.width,Q.height),super.performLayout()}paint(A,Q=0,$=0){let B=Math.floor(Q+this.offset.x),D=Math.floor($+this.offset.y),J=Math.floor(this.size.width),E=Math.floor(this.size.height),F={bg:this.color},Y=XE(this.dissolveProgress);if(Y<=0){A.fill(B,D,J,E," ",F);return}if(Y>=1)return;for(let Z=0;Z<E;Z++)for(let U=0;U<J;U++)if(!qn3(U,Z,J,E,Y))A.fill(B+U,D+Z,1,1," ",F)}}function XE(A){return Math.min(1,Math.max(0,A))}function cx(A){return 1-(1-A)**3}function Oe4(A){return Le4[A]??Le4[0]}function je4(A,Q,$){return{primary:XR(A.primary,Q.primary,$),secondary:XR(A.secondary,Q.secondary,$)}}function Hn3({dismissProgress:A,easedDismissProgress:Q,introOrbScale:$,normalOrbCenterX:B,normalOrbCenterY:D,size:J}){return{orbScale:$+($*0.86-$)*Q,orbCenterX:B+(J.width*0.54-B)*Q,orbCenterY:D-J.height*0.44*Q,textDissolveProgress:XE(A/0.52),backdropDissolveProgress:cx(XE((A-0.12)/0.88))}}function qn3(A,Q,$,B,D){let J=B<=1?0:Q/(B-1),E=fe4(A+Q*Math.max(1,$));return(1-J)*0.72+E*0.28<D}function Nn3({introStages:A,stage:Q,previousStage:$,progress:B,direction:D,width:J,height:E,foreground:F,mutedForeground:Y,accent:Z,link:U,keybind:X,titleRevealProgress:G,dissolveProgress:V,context:K}){if($===null||B>=1)return N51({introStages:A,stage:Q,foreground:F,mutedForeground:Y,accent:Z,link:U,keybind:X,titleRevealProgress:G,dissolveProgress:V,context:K});let z=cx(B),W=D*Math.round((1-z)*J),I=-D*Math.round(z*J);return new tz(new i4({fit:"expand",children:[new r4({left:I,top:0,width:J,height:E,child:N51({introStages:A,stage:$,foreground:F,mutedForeground:Y,accent:Z,link:U,keybind:X,titleRevealProgress:$===0?1:G,dissolveProgress:V,context:K})}),new r4({left:W,top:0,width:J,height:E,child:N51({introStages:A,stage:Q,foreground:F,mutedForeground:Y,accent:Z,link:U,keybind:X,titleRevealProgress:G,dissolveProgress:V,context:K})})]}))}function N51({introStages:A,stage:Q,foreground:$,mutedForeground:B,accent:D,link:J,keybind:E,titleRevealProgress:F,dissolveProgress:Y,context:Z}){let U=A[Q]??A[0]??w51[0],X=new T({color:D,bold:!0}),G=new T({color:$}),V=A===w51&&Q===0,K=[...U.title===null?[]:[new d({text:V?zK0(Mn3({progress:F,foreground:D,pulseColor:D}),Y):new w(IB(U.title,Y),X),textAlign:"center"})],...U.body.length>0?[Cn3()]:[],...U.body.map((z)=>wn3(z,G,B,J,E,Y,Z))];return new D4({child:new y0({padding:K0.horizontal(1),child:new S0({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:K})})})}function Cn3(){return X0.height(1)}function wn3(A,Q,$,B,D,J,E){if(typeof A==="string")return new d({text:new w(IB(A,J),Q),textAlign:"center"});if("codeBlock"in A)return new K5({onCopy:(F,Y)=>{if(Y)M3.success(E,"Copied to clipboard",2000)},child:new S0({mainAxisSize:"min",children:A.codeBlock.map((F)=>new d({text:new w(IB(F,J),new T({color:D})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let F=new d({text:new w("",void 0,[new w(IB(A.text,J),new T({color:$,dim:!0})),new w(IB(A.keybind,J,G4(A.text).length),new T({color:D}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new D4({child:new K5({child:F})});return F}if("highlightText"in A){let F=P6.createSpan(A.href,A.linkText,new T({color:B,underline:!0})),Y=YU.of(E),Z=new w("",void 0,[new w(A.text,Q),new w(A.highlightText,new T({color:D})),new w(A.textAfterHighlight,Q),new w(F.text,F.style,F.children,F.hyperlink,()=>{o6(E,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new w(A.textAfter,Q)]);return new d({text:zK0(Z,J),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new S0({mainAxisSize:"min",children:[new d({text:new w(IB(A.text,J),Q),textAlign:"center"}),new D4({child:new s0({mainAxisSize:"min",children:[P6.createWidget(E,A.href,IB(A.linkText,J),new T({color:B,underline:!0})),new d({text:new w(IB(A.textAfter,J),Q)})]})})]});let F=P6.createSpan(A.href,A.linkText,new T({color:B,underline:!0})),Y=YU.of(E),Z=new w("",void 0,[new w(A.text,Q),new w(F.text,F.style,F.children,F.hyperlink,()=>{o6(E,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new w(A.textAfter,Q)]);return new d({text:zK0(Z,J),textAlign:"center"})}if(J>0)return new d({text:new w(IB(A.text,J),new T({color:B,underline:!0})),textAlign:"center"});return new D4({child:P6.createWidget(E,A.href,A.text,new T({color:B,underline:!0}))})}function Mn3({progress:A,foreground:Q,pulseColor:$}){let B=new T({color:Q,bold:!0}),D=new T({color:On3({progress:A,foreground:Q,pulseColor:$}),bold:!0});return new w("",void 0,[new w(Ln3(A).padEnd(M51," "),B),new w(" ",B),new w(Re4(_e4,zn3,A,0.72),B),new w(" ",B),new w(Re4(Te4,Wn3,A,0.88),D)])}function Ln3(A){let Q=G4(Pe4),$=Math.min(M51,Math.ceil(XE(A/0.62)*M51));return Q.slice(0,$).join("")}function Re4(A,Q,$,B){return $>=B?A:"".padEnd(Q," ")}function On3({progress:A,foreground:Q,pulseColor:$}){if(A<0.88||A>=1)return Q;let B=XE((A-0.88)/0.12);return Math.cos(B*Math.PI*4)*(1-B)>0.12?$:Q}function jn3({stage:A,featureStageCount:Q,foreground:$,dissolveProgress:B}){return new w(IB(`${A}/${Q}`,B),new T({color:$,dim:!0}))}function Rn3({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:D,dissolveProgress:J}){let E=new T({color:B}),F=new T({color:$,dim:!0}),Y=Q?A?"Enter":"Space":"Esc",Z=Q?A?" to get started":" to continue":" to quit, or use ",U=Q?"":"amp --take-me-back",X=Q?"":" to use the old version",G=`${Z}${U}${X}`;if(!Q)return new w("",void 0,[new w(Y,E),new w(Z,F),new w(U,E),new w(X,F)]);let V=ue4(Y,D),K=ue4(G,XE((D*(G4(Y).length+G4(G).length)-G4(Y).length)/G4(G).length));return new w("",void 0,[new w(IB(V,J),E),new w(IB(K.slice(0,Z.length),J),F),new w(IB(K.slice(Z.length,Z.length+U.length),J),E),new w(IB(K.slice(Z.length+U.length),J),F)])}function un3({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:D,dissolveProgress:J,context:E}){if(Q)return new d({text:Rn3({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:D,dissolveProgress:J}),textAlign:"center"});let F=new T({color:B}),Y=new T({color:$,dim:!0});return new K5({onCopy:(Z,U)=>{if(U)M3.success(E,"Copied to clipboard",2000)},child:new d({text:new w("",void 0,[new w("q",F),new w(" to quit, or use ",Y),new w("amp --take-me-back",F),new w(" to use the old version",Y)]),textAlign:"center",selectable:!0})})}function ue4(A,Q){let $=G4(A),B=Math.min($.length,Math.ceil(XE(Q)*$.length));return $.slice(0,B).join("").padEnd($.length," ")}function zK0(A,Q,$=0){if(Q<=0)return A;let B=$+G4(A.text??"").length,D=A.children?.map((J)=>{let E=zK0(J,Q,B);return B+=G4(J.toPlainText()).length,E});return new w(A.text?IB(A.text,Q,$):A.text,A.style,D,A.hyperlink,A.onClick)}function IB(A,Q,$=0){if(Q<=0)return A;return G4(A).map((D,J)=>{if(D.trim()==="")return D;return fe4($+J)<Q?" ":D}).join("")}function fe4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}c0();g2();function uC(A,Q){let{colors:$,dim:B}=Q,D=[];if(A.totalCostUSD===null)return D;let J=A.costBreakdown,E=J?.freeUSD??0,F=J?.paidUSD??0;if(E===0&&F===0)return D;let Z={decimalPlaces:"more-if-tiny",intent:"cost"};if(F===0)D.push(new w(BV(E,Z),new T({color:$.foreground,dim:B}))),D.push(new w(" (free)",new T({color:$.foreground,dim:B})));else if(E>0)D.push(new w(BV(E,Z),new T({color:$.foreground,dim:B}))),D.push(new w(" (free)",new T({color:$.foreground,dim:B}))),D.push(new w(" + ",new T({color:$.foreground,dim:B}))),D.push(new w(BV(F,Z),new T({color:$.foreground,dim:B,bold:!B})));else D.push(new w(BV(F,Z),new T({color:$.foreground,dim:B,bold:!B})));return D}class O51 extends V4{}class j51 extends V4{}function Pn3(A,Q){if(Q.code==="auth-required")return"You must be logged in to view thread usage. Run `amp login` first.";if(Q.code==="thread-not-found")return`Thread ${A} not found.`;return`Failed to load thread usage: ${Q.message??Q.code}`}function _n3(A,Q){let $=O0.of(Q),{colors:B}=$,D=uC(A,{colors:{foreground:B.foreground}}),J=[];if(D.length>0)J.push(new w("Total: ",new T({color:B.mutedForeground}))),J.push(...D);else if(A.totalCostUSD===null)J.push(new w("Usage information is currently unavailable."));else J.push(new w("No usage recorded for this thread yet."));if(A.costBreakdownURL)J.push(new w(`
5315
5315
 
5316
- `)),J.push(new w("Details: ",new T({color:B.mutedForeground}))),J.push(new w(A.costBreakdownURL,new T({color:$.app.link})));return new d({text:new w("",void 0,J)})}function Tn3(A,Q,$){let B=_n3(A,Q);if(!A.costBreakdownURL)return new C6({header:"Thread Cost",minWidth:80,maxWidth:100,onDismiss:$,child:B});let D=A.costBreakdownURL,J=new T1(()=>{return b4.maybeInvoke(Q,new H8(D,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),E=new T1(()=>{return o6(Q,D),"handled"});return new C6({header:"Thread Cost",minWidth:80,maxWidth:100,autofocus:!1,footer:[{keys:["Esc"],label:"close"},{keys:["o"],label:"open in browser"},{keys:["y"],label:"copy url"}],onDismiss:$,child:new b4({actions:new Map([[O51,J],[j51,E]]),child:new kA({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[G1.key("o"),new j51],[G1.key("y"),new O51]]),child:new v4({autofocus:!0,debugLabel:"ThreadCostBody",child:B})})})})}function ye4(A){return{noun:"thread",verb:"show cost",description:"Show usage cost for the active thread",keywords:["billing","spend"],get status(){return A.getActiveThreadID()?{type:"enabled"}:{type:"disabled",reason:"No active thread"}},run:async(Q,$,B)=>{let D=A.getActiveThreadID();if(!D)return;try{let J=await o4.threadDisplayCostInfo({threadID:D},{config:A.configService});if(!J.ok){A.toastController.show(Pn3(D,J.error),"error",5000),B();return}Q.push(Tn3(J.result,$,B))}catch(J){u.error("Failed to load Neo thread cost",{error:J,threadID:D}),A.toastController.show(`Failed to show thread cost: ${J instanceof Error?J.message:String(J)}`,"error",5000),B()}}}}c0();f9();B4();class XW extends V4{direction;constructor(A){super();this.direction=A}}class WK0 extends V4{}class b00 extends V4{}class IK0 extends V4{index;constructor(A){super();this.index=A}}function R51(A){return A.length+2}class u51 extends u0{props;constructor(A){super();this.props=A}createState(){return new xe4}}class xe4 extends R0{selectedIndex=0;initState(){super.initState(),this.selectedIndex=this.findSelectableIndex(this.widget.props.initialSelectedIndex??0)}didUpdateWidget(A){this.selectedIndex=this.findSelectableIndex(this.selectedIndex)}isSelectable(A){let Q=this.widget.props.entries[A];return Q?.type==="item"&&(Q.enabled??!0)}findSelectableIndex(A){let{entries:Q}=this.widget.props;if(Q.length===0)return 0;let $=Math.max(0,Math.min(A,Q.length-1));if(this.isSelectable($))return $;for(let B=1;B<Q.length;B++){let D=$+B;if(D<Q.length&&this.isSelectable(D))return D;let J=$-B;if(J>=0&&this.isSelectable(J))return J}return 0}moveSelection(A){let Q=this.findNextSelectableIndex(A);if(Q===this.selectedIndex)return;this.setState(()=>{this.selectedIndex=Q})}findNextSelectableIndex(A){let{entries:Q}=this.widget.props;for(let $=this.selectedIndex+A;$>=0&&$<Q.length;$+=A)if(this.isSelectable($))return $;return this.selectedIndex}acceptIndex(A){let Q=this.widget.props.entries[A];if(Q?.type!=="item"||!(Q.enabled??!0))return;this.setState(()=>{this.selectedIndex=A}),this.widget.props.onAccept(Q.value)}invoke=(A)=>{if(A instanceof XW)return this.moveSelection(A.direction),"handled";if(A instanceof WK0)return this.acceptIndex(this.selectedIndex),"handled";if(A instanceof b00)return this.widget.props.onDismiss(),"handled";if(A instanceof IK0)return this.acceptIndex(A.index),"handled";return"ignored"};buildShortcuts(){let A=new Map([[G1.key("ArrowDown"),new XW(1)],[G1.key("j"),new XW(1)],[G1.ctrl("n"),new XW(1)],[G1.key("ArrowUp"),new XW(-1)],[G1.key("k"),new XW(-1)],[G1.ctrl("p"),new XW(-1)],[G1.key("Enter"),new WK0],[G1.key("Escape"),new b00],[G1.ctrl("."),new b00]]);return this.widget.props.entries.forEach((Q,$)=>{if(Q.type==="item"&&Q.shortcut)A.set(Q.shortcut,new IK0($))}),A}buildActions(){return new Map([[XW,new T1(this.invoke)],[WK0,new T1(this.invoke)],[b00,new T1(this.invoke)],[IK0,new T1(this.invoke)]])}build(A){let Q=O0.of(A),$=vn3(this.widget.props.entries,g1.of(A).supportsEmojiWidth);return new b0({width:this.widget.props.width,height:R51(this.widget.props.entries),decoration:new R4(Q.colors.background,c1.all(new l1(Q.colors.border,1,"solid"))),child:new b4({actions:this.buildActions(),child:new kA({debugLabel:"NeoContextPickerShortcuts",shortcuts:this.buildShortcuts(),child:new v4({autofocus:!0,debugLabel:"NeoContextPicker",child:new S0({mainAxisSize:"min",crossAxisAlignment:"stretch",children:this.widget.props.entries.map((B,D)=>this.buildEntry(B,D,$,Q))})})})})})}buildEntry(A,Q,$,B){if(A.type==="separator")return new b0({height:1,decoration:{border:new c1(new l1(B.colors.border,1,"solid"))}});let D=Q===this.selectedIndex,J=A.enabled??!0,E=new T({color:D?B.app.selectionForeground:B.colors.foreground,dim:!J}),F=new T({color:D?B.app.selectionForeground:B.app.keybind,bold:!0,dim:!J});return new O1({onClick:()=>this.acceptIndex(Q),child:new b0({padding:K0.symmetric(1,0),decoration:D?new R4(B.app.selectionBackground):void 0,child:new s0({crossAxisAlignment:"start",children:[new R1({child:new d({text:new w(A.label,E),maxLines:1,overflow:"ellipsis"})}),new X0({width:1}),new X0({width:$,child:new d({text:new w(be4(A),F),textAlign:"right",maxLines:1,overflow:"ellipsis"})})]})})})}}function vn3(A,Q){return A.reduce(($,B)=>{return B.type==="item"?Math.max($,E4(be4(B),Q)):$},0)}function be4(A){return A.shortcutLabel??A.shortcut?.toString().toLowerCase()??""}var kn3=36,Sn3=24,fn3=72;class he4 extends u0{child;onContext;constructor(A,Q){super();this.child=A;this.onContext=Q}createState(){return new ge4}}class ge4 extends R0{build(A){return this.widget.onContext(A),this.widget.child}}function me4(A){return A.replace(/ ago$/,"")}function HK0(A){return A.reduce((Q,$)=>Math.max(Q,E4(me4($.description.timeAgo))),0)}function de4(A){return Math.max(Sn3,Math.min(A,fn3))}class P51 extends V4{}class _51 extends V4{}class T51{options;visibility;width=kn3;constructor(A){this.options=A;this.visibility=new Ee(A.state)}isVisible(){return this.visibility.isEnabled()}buildBody(A){return new s0({crossAxisAlignment:"stretch",children:[this.buildSlot(),new R1({child:A})]})}buildSlot(){if(!this.options.isAvailable()||this.visibility.isDisabled())return new X0({width:0});return new X0({width:this.width,child:new k4({debugLabel:"ThreadListSidebar",child:new pe4({activeThreadID:this.options.getActiveThreadID(),currentWorkspaceURI:A4(n0.file(this.options.getWorkspaceRoot())),width:this.width,loadThreads:this.options.loadThreads,onSelectThread:this.options.onSelectThread,onDismiss:this.close,onResizeWidth:this.resize})})})}commands(){if(!this.options.isAvailable())return[];return[{noun:"thread",verb:"toggle sidebar",description:"Show or hide the thread sidebar",shortcut:G1.alt("s"),status:{type:"enabled"},run:(A,Q,$)=>{$(),this.toggle()}}]}shortcutEntries(){return this.options.isAvailable()?[[G1.alt("s"),new BV0]]:[]}actionEntries(){if(!this.options.isAvailable())return[];return[[BV0,new T1(()=>this.toggle())]]}toggle=()=>{if(!this.options.isAvailable())return"ignored";if(this.visibility.isDisabled()&&this.options.isBlocked())return"ignored";return this.visibility.toggle(),"handled"};close=()=>{this.visibility.disable()};resize=(A)=>{let Q=de4(A);if(Q===this.width)return;this.options.state.setState(()=>{this.width=Q})}}class pe4 extends u0{props;constructor(A){super();this.props=A}createState(){return new ce4}}class ce4 extends R0{threads=[];isLoading=!0;isSwitchingThread=!1;hasError=!1;filterByWorkspace=!0;timeColWidth=0;contextMenu=null;pendingThreadMutations=new Map;resizeSession=null;isResizeHandleHovered=!1;pickerController=new Le;threadItemContexts=new Map;shortcuts=new Map([[G1.alt("w"),new P51],[G1.ctrl("."),new _51]]);actions=new Map([[P51,new T1(()=>{return this.setState(()=>{this.filterByWorkspace=!this.filterByWorkspace,this.contextMenu=null}),"handled"})],[_51,new T1(()=>this.openContextMenu())]]);get isBusy(){return this.isLoading||this.isSwitchingThread}get isResizeActive(){return this.resizeSession!==null||this.isResizeHandleHovered}didUpdateWidget(A){if(this.contextMenu&&(A.props.width!==this.widget.props.width||A.props.currentWorkspaceURI!==this.widget.props.currentWorkspaceURI))this.contextMenu=null}initState(){super.initState(),this.loadThreadSummaries()}async loadThreadSummaries(){try{let A=await this.widget.props.loadThreads(),Q=q31(A);if(!this.mounted)return;this.setState(()=>{this.pickerController.selectedItem=Q.find(($)=>$.id===this.widget.props.activeThreadID)??null,this.threads=Q,this.timeColWidth=HK0(Q),this.isLoading=!1,this.hasError=!1})}catch(A){if(u.error("Failed to load threads for Neo sidebar",{error:A}),!this.mounted)return;this.setState(()=>{this.isLoading=!1,this.hasError=!0})}}handleSelectThread=async(A)=>{if(this.isSwitchingThread)return;this.setState(()=>{this.isSwitchingThread=!0});try{await this.widget.props.onSelectThread(A),this.widget.props.onDismiss()}catch(Q){u.error("Failed to switch thread from Neo sidebar",{error:Q,threadID:A})}finally{if(this.mounted)this.setState(()=>{this.isSwitchingThread=!1})}};getOptimisticThreads(){return this.threads.flatMap((A)=>{if(this.pendingThreadMutations.get(A.id)?.kind==="archive")return[];return[A]})}getThreadsForDisplay(){let A=this.getOptimisticThreads();return this.filterByWorkspace?A.filter((Q)=>!Q.workspaceURI||Q.workspaceURI===this.widget.props.currentWorkspaceURI):A}buildContextMenuEntries(){return[{type:"item",value:"archive",label:"Archive Thread",shortcut:G1.key("a"),shortcutLabel:"a"},{type:"separator"},{type:"item",value:"copy-id",label:"Copy ID",shortcut:G1.ctrl("c"),shortcutLabel:"ctrl+c"},{type:"item",value:"copy-url",label:"Copy URL",shortcut:new G1("c",{shift:!0,ctrl:!0}),shortcutLabel:"shift+ctrl+c"}]}openContextMenu(){let A=this.pickerController.selectedItem;if(!A||this.isBusy||this.hasError)return"ignored";let Q=this.buildContextMenuEntries(),$=R51(Q),B=this.getContextMenuWidth(),D=this.getContextMenuPosition(A.id,$,B);return this.setState(()=>{this.contextMenu={threadID:A.id,left:D.left,top:D.top,width:B,height:$}}),"handled"}getContextMenuWidth(){let A=Math.max(24,this.widget.props.width-3);return Math.max(1,Math.min(A,this.widget.props.width-2))}getContextMenuPosition(A,Q,$){let B=Math.max(0,Math.min(2,this.widget.props.width-$)),D=1,J=this.threadItemContexts.get(A)?.findRenderObject(),E=this.context.findRenderObject();if(!(J instanceof i1)||!(E instanceof i1))return{left:B,top:1};let F=J.localToGlobal({x:0,y:0}),Y=E.localToGlobal({x:0,y:0}),Z=F.y-Y.y,U=Z+J.size.height,X=g1.sizeOf(this.context).height,G=Math.max(1,Math.min(E.size.height,X-Y.y)),z=G-U>=Q||Z<G/2?U:Z-Q,W=Math.max(0,G-Q);return{left:B,top:Math.max(0,Math.min(z,W))}}closeContextMenu=()=>{if(!this.contextMenu)return;this.setState(()=>{this.contextMenu=null})};handleContextMenuAccept=(A)=>{let Q=this.contextMenu?.threadID;if(!Q)return;if(this.closeContextMenu(),A==="archive"){this.archiveContextMenuThread(Q);return}if(A==="copy-id"){b4.maybeInvoke(this.context,new H8(Q,"Thread ID copied to clipboard","Failed to copy thread ID"));return}b4.maybeInvoke(this.context,new H8(this.getThreadURL(Q),"Thread URL copied to clipboard","Failed to copy thread URL"))};beginOptimisticArchive(A){if(this.pendingThreadMutations.has(A))return!1;if(!this.threads.some(($)=>$.id===A))return!1;let Q={kind:"archive",fallbackSelectedThreadID:null};return this.setState(()=>{this.pendingThreadMutations.set(A,Q),this.timeColWidth=HK0(this.getOptimisticThreads())}),a6.instance.addPostFrameCallback(()=>{if(!this.mounted)return;let $=this.pendingThreadMutations.get(A);if($?.kind!=="archive")return;$.fallbackSelectedThreadID=this.pickerController.selectedItem?.id??null}),!0}commitOptimisticArchive(A){if(this.pendingThreadMutations.get(A)?.kind!=="archive")return;this.pendingThreadMutations.delete(A),this.threads=this.threads.filter(($)=>$.id!==A),this.timeColWidth=HK0(this.getOptimisticThreads())}rollbackOptimisticArchive(A){let Q=this.pendingThreadMutations.get(A);if(Q?.kind!=="archive")return;let $=this.threads.find((B)=>B.id===A);if(!$){this.pendingThreadMutations.delete(A);return}this.setState(()=>{this.pendingThreadMutations.delete(A),this.timeColWidth=HK0(this.getOptimisticThreads());let B=this.pickerController.selectedItem?.id??null;if(B===null||B===Q.fallbackSelectedThreadID)this.pickerController.selectedItem=$})}async archiveContextMenuThread(A){let Q=M3.maybeOf(this.context),{configService:$}=W5.of(this.context);if(!this.beginOptimisticArchive(A))return;try{let B=await FG0({configService:$},A);if(!this.mounted)return;if(B){this.rollbackOptimisticArchive(A),Q?.show(B.message,"error");return}this.commitOptimisticArchive(A)}catch(B){if(u.error("Failed to archive thread from Neo sidebar context menu",{error:B,threadID:A}),!this.mounted)return;this.rollbackOptimisticArchive(A),Q?.show("Failed to archive thread","error")}}getThreadURL(A){return h$(new URL(W5.of(this.context).ampURL),A).toString()}buildContextMenuOverlay(){let A=this.contextMenu;if(!A||!this.getThreadsForDisplay().some((Q)=>Q.id===A.threadID))return null;return new r4({left:A.left,top:A.top,width:A.width,height:A.height,child:new k4({debugLabel:"ThreadListSidebarContextMenu",onFocusChange:(Q)=>{if(!Q)this.closeContextMenu()},child:new u51({entries:this.buildContextMenuEntries(),width:A.width,onAccept:this.handleContextMenuAccept,onDismiss:this.closeContextMenu})})})}buildContextMenuBackdrop(){return new r4({left:0,top:0,right:0,bottom:0,child:new O1({onClick:()=>this.closeContextMenu(),child:X0.expand()})})}buildThreadItem(A,Q,$,B){let D=O0.of(B),{app:J,colors:E}=D,F=!Q,Y=Q?J.selectionForeground:E.foreground,Z=Q?J.selectionForeground:E.mutedForeground,X=A.id===this.widget.props.activeThreadID?new d({text:new w("*",new T({color:Q?J.selectionForeground:E.success,dim:F}))}):void 0,G=me4(A.description.timeAgo);return new he4(new b0({padding:K0.symmetric(1,0),child:new s0({children:[new X0({width:2,child:X}),new R1({child:new d({text:new w(A.title,new T({color:Y,dim:F})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),new X0({width:$,child:s0.end([new d({text:new w(G,new T({color:Z,dim:F}))})])})]})}),(V)=>{this.threadItemContexts.set(A.id,V)})}handleResizeHandlePress=(A)=>{if(A.button!=="left")return;this.setState(()=>{this.resizeSession={baseWidthColumns:this.widget.props.width,startColumn:Math.floor(A.position.x)}})};handleResizeHandleDrag=(A)=>{if(A.button!=="left"||this.resizeSession===null)return;let Q=Math.floor(A.position.x)-this.resizeSession.startColumn,$=de4(this.resizeSession.baseWidthColumns+Q);if($!==this.widget.props.width)this.widget.props.onResizeWidth($)};handleResizeHandleRelease=(A)=>{if(A.button!=="left"||this.resizeSession===null)return;this.setState(()=>{this.resizeSession=null})};handleResizeHandleEnter=()=>{if(this.isResizeHandleHovered)return;this.setState(()=>{this.isResizeHandleHovered=!0})};handleResizeHandleExit=()=>{if(!this.isResizeHandleHovered)return;this.setState(()=>{this.isResizeHandleHovered=!1})};buildResizeHandle(){return new r4({top:0,right:0,bottom:0,width:1,child:new O1({cursor:YA.EW_RESIZE,onClick:this.handleResizeHandlePress,onDrag:this.handleResizeHandleDrag,onRelease:this.handleResizeHandleRelease,onEnter:this.handleResizeHandleEnter,onExit:this.handleResizeHandleExit,child:new X0({width:1})})})}build(A){let Q=O0.of(A),$=this.getThreadsForDisplay(),B=this.hasError?[]:$;this.threadItemContexts.clear();let D=this.isSwitchingThread?"Switching thread...":"Loading threads...",J=this.hasError?"Failed to load threads":"No threads match your filter",E=this.isResizeActive?2:1,F=new c1(void 0,new l1(Q.colors.border,E),void 0,void 0),Y=this.buildContextMenuOverlay(),Z=[new b0({decoration:new R4(Q.colors.background,F),child:new b4({actions:this.actions,child:new kA({shortcuts:this.shortcuts,debugLabel:"ThreadListSidebarFilter",child:new cA({items:B,getLabel:(U)=>`${U.title} ${U.id}`,controller:this.pickerController,onAccept:(U)=>void this.handleSelectThread(U.id),onDismiss:this.widget.props.onDismiss,renderItem:(U,X,G,V)=>this.buildThreadItem(U,X,this.timeColWidth,V),enabled:!this.isBusy,isLoading:this.isBusy,hidePromptWhenLoading:!0,loadingText:D,emptyStateText:J,maxRenderItems:200,showBorder:!1})})})}),this.buildResizeHandle()];if(Y)Z.push(this.buildContextMenuBackdrop()),Z.push(Y);return new b0({width:this.widget.props.width,child:new i4({fit:"expand",children:Z})})}}class v51 extends u0{listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;updateService;initialThreadIDs;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;onRelaunchRequested;onFirstFrame;initialUserInput;getDefaultNewThreadVisibility;openThreadPickerOnStart;workspaceSettingsFilePath;neoContext;constructor(A){super();this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.updateService=A.updateService,this.initialThreadIDs=A.initialThreadIDs??[],this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.mcpTrustHandler=A.mcpTrustHandler,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.onRelaunchRequested=A.onRelaunchRequested,this.onFirstFrame=A.onFirstFrame,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.neoContext=A.neoContext}createState(){return new ie4}}class ie4 extends R0{editorController=new k2;commandPalette=new Ee(this);commandRegistry=new EA1;toastController=new C11;relaunchNotificationController=new s61;exitHintTimer=new Je(this,1000);ideStatus=new z8(this,{});threadNavigationHistory=new QA1;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;activePluginMessageSubscription=null;activePluginUIRequestsSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;neoWelcomeVisible=!1;endCreditsVisible=!1;neoInvadersHighScore=0;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;emptyThreadTerminalTitleController=new q00;pluginIntegration=null;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};analyzeContextForThread=async(A,Q)=>{return Fd4({ampURL:this.widget.neoContext.ampURL,configService:this.widget.configService,threadID:A,signal:Q})};onSwitchThread=(A)=>{return this.connectToExistingThread(A,{recordNavigation:!0,rethrowError:!0})};threadListSidebar=new T51({state:this,isAvailable:()=>this.widget.neoContext.isInternalUser,isBlocked:()=>this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal(),getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,getWorkspaceRoot:()=>this.widget.neoContext.workspaceRoot,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread});sendFeedbackReport=async(A)=>WV0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await FG0({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let $=await zl4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};removeThreadLabel=async(A,Q)=>{let $=await Wl4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};initState(){if(ZB.getInstance().interceptConsole(),this.neoInvadersHighScore=this.widget.neoContext.neoInvadersHighScore??0,this.notices=new y61(this.widget.configService,($)=>this.setState($)),a6.instance.addPostFrameCallback(()=>{setTimeout(()=>this.widget.onFirstFrame?.(),0),this.noticesPollingTimeout=setTimeout(()=>{this.noticesPollingTimeout=null,this.notices.startPolling()},500)},"Neo notices polling"),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:$,error:B})=>{if(u.error("Neo failed to connect to thread",{threadID:$,error:B}),!$)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe(($)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(C90($.settings)))}),this.updateRelaunchIntegration=new e61({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested,relaunchNotificationController:this.relaunchNotificationController,updateService:this.widget.updateService}),this.updateRelaunchIntegration.init(),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput,Q=this.widget.initialThreadIDs[0];if(Q){let $={};if(A)$.initialUserInput=A;this.connectToInitialThreads(Q,$)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new r61({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,neoContext:this.widget.neoContext,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread,onBlockingConfirmDialogChange:this.syncEmptyThreadPluginConfirmationTitle}),this.pluginIntegration.init(),this.mcpTrustIntegration=new f61({state:this,mcpTrustHandler:this.widget.mcpTrustHandler,toastController:this.toastController,workspaceSettingsFilePath:this.widget.workspaceSettingsFilePath}),this.mcpTrustIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=z4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?wa4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],B=[Ta4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["resume"],status:{type:"enabled"},sortBoost:100,run:(D,J,E)=>{D.pushWithDismiss((F)=>N31({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:F,onThreadSelected:E}))}},...this.threadListSidebar.commands(),{noun:"thread",verb:"switch to previous",description:"Switch to previous thread",keywords:["back"],get status(){return A.threadNavigationHistory.canNavigateBack()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to previous with no previous thread"}},run:(D,J,E)=>{A.navigateBack(),E()}},ye4({configService:this.widget.configService,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??void 0,toastController:this.toastController}),{noun:"thread",verb:"switch to next",description:"Switch to next thread",keywords:["forward"],get status(){return A.threadNavigationHistory.canNavigateForward()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to next with no next thread"}},run:(D,J,E)=>{A.navigateForward(),E()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",status:{type:"enabled"},run:(D,J,E)=>{D.push(new pA1({mcpServers:this.widget.neoContext.mcpServers,onDismiss:E}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",status:{type:"enabled"},run:(D)=>{D.pushWithDismiss((J)=>new H51({toolboxes:this.widget.neoContext.toolboxes,onDismiss:J}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","blog","announcements"],status:{type:"enabled"},run:async(D,J,E)=>{try{await o6(J,"https://ampcode.com/chronicle")}finally{E()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config"],status:{type:"enabled"},run:()=>{V$(this.widget.neoContext.settingsFilePath).catch((D)=>{u.error("Failed to open settings file in editor",{error:D})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains"],status:{type:"enabled"},run:(D,J,E)=>{D.pushWithDismiss((F)=>new mA1({onCancel:F,onSelect:(Y)=>{this.handleIdeSelection(Y),E()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["manual","?"],status:{type:"enabled"},run:(D,J,E)=>{D.push(new XA1({commands:R9.of(J).commands,onDismiss:E}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",status:{type:"enabled"},run:(D,J,E)=>{E(),A.showNeoWelcome()}},{noun:"amp",verb:"end credits",description:"Roll the full-screen Amp credits",status:{type:"enabled"},run:(D,J,E)=>{E(),A.showEndCredits()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["v"],status:{type:"enabled"},run:(D,J,E)=>{D.push(new C6({header:"Amp Version",maxWidth:72,onDismiss:E,child:new d({text:new w(SX0({version:"0.0.1779872458-g7b0532",buildTimestamp:"2026-05-27T09:05:52.208Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","bye"],shortcut:G1.ctrl("c"),status:{type:"enabled"},run:(D,J)=>{b4.maybeInvoke(J,new Mx)}},...Q,...Da4(this.widget.neoContext.logFilePath)].map((D)=>this.commandRegistry.register(D));return()=>{for(let D of B)D()}}build(A){let Q=this.buildHints(),$=this.ideStatus.getValue(),B=this.notices.current,D=new I51({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:$,statusItems:this.pluginIntegration?.getStatusItems()??[],pluginConfirmationBlocked:this.pluginIntegration?.hasBlockingConfirmDialog()??!1,notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.neoWelcomeVisible?null:B,onDismissNotice:(U)=>this.notices.dismiss(U)}),J=g1.of(A),E=J.capabilities.animationSupport!=="disabled",Y=[new b0({constraints:w1.tight(J.size.width,J.size.height),child:this.threadListSidebar.buildBody(D)})];if(this.commandPalette.isEnabled())Y.push(new k4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new FA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)Y.push(N31({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)Y.push(new k4({debugLabel:"NeoWelcomeDialogOverlay",child:new L51({onDismiss:this.dismissNeoWelcome,onQuit:()=>z4.instance.stop(),animationsEnabled:E,variant:this.widget.neoWelcomeVariant})}));let Z=this.executorAlreadyConnectedDialog;if(Z)Y.push(new k4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new hA1({existingExecutorPid:Z.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(Y.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),Y.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)Y.push(new VA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:qK0.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)Y.push(new gA1);if(this.endCreditsVisible)Y.push(new kA1({onComplete:this.completeEndCredits,highScore:this.neoInvadersHighScore,onHighScoreChange:this.updateNeoInvadersHighScore}));return new W5({neoContext:this.widget.neoContext,child:new R9({commandRegistry:this.commandRegistry,child:new Ox({completionBuilder:this.widget.completionBuilder,child:new M3({controller:this.toastController,child:new b4({actions:this.buildActions(),child:new kA({debugLabel:"NeoAppShortcuts",shortcuts:this.buildShortcuts(),child:new v4({debugLabel:"AppShellFocus",child:new w11({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...B&&this.activeThreadContext&&!this.neoWelcomeVisible?[this.notices]:[]],child:new GA1({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new i4({children:Y})})})})})})})})})})}buildShortcuts(){let A=new Map([[G1.ctrl("c"),new tG0],[G1.ctrl("o"),new AV0],[G1.alt("i"),new $V0],[G1.alt("p"),new tN],[G1.ctrl("."),new JV0],[G1.ctrl("t"),new YV0],...this.threadListSidebar.shortcutEntries()]);if(qK0.env.NODE_ENV==="development"&&qK0.platform==="darwin")A.set(G1.meta("r"),new eG0);return A}buildActions(){let A=new T1(()=>{if(TD.hasAnyCopyableSelection())return TD.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new T1(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),$=new T1(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),B=new T1(()=>{return this.startNewDraftThread(),"handled"}),D=new T1(()=>{return z4.instance.stop(),"handled"}),J=new T1(()=>{return G00({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),E=new T1((G)=>{if(!G.text)return"ignored";return z4.instance.tuiInstance.clipboard.writeText(G.text).then((V)=>{if(V.ok)this.toastController.show(G.successMessage,"success",2000);else this.toastController.show(`${G.failureMessage}: ${V.userFacingErrorMessage}`,"error",4000)}).catch((V)=>{u.error("Failed to copy Neo text to clipboard",{error:V}),this.toastController.show(G.failureMessage,"error",2000)}),"handled"}),F=new T1(()=>{return z4.instance.toggleFrameStatsOverlay(),"handled"}),Y=new T1(()=>this.notices.dismissCurrent()?"handled":"ignored"),Z=new T1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),U=da4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,neoContext:this.widget.neoContext,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),X=new T1(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[tG0,A],[B00,B],[Mx,D],[eG0,J],[H8,E],[F00,$],[AV0,Q],[$V0,Z],...this.threadListSidebar.actionEntries(),[JV0,Y],...U,[tN,F],[YV0,X]])}startNewDraftThread(A={}){let Q=this.activeThreadContext?.client.getThreadId();if(this.commandPalette.disable(),this.threadNavigationHistory.recordNavigation(Q),this.setState(()=>{if(this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.cancelOwnerUIRequests(),this.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),this.widget.onActiveThreadChange?.(null),this.syncEmptyThreadPluginConfirmationTitle(),A.prompt!==void 0)this.editorController.text=A.prompt}syncEmptyThreadPluginConfirmationTitle=()=>{this.emptyThreadTerminalTitleController.setPluginConfirmationBlocked(this.activeThreadContext===null&&(this.pluginIntegration?.hasBlockingConfirmDialog()??!1))};closeCommandPaletteOnFocusLoss=(A)=>{if(A||!this.commandPalette.isEnabled())return;this.commandPalette.disable()};ensureDraftThreadSettingsInitialized(){if(this.hasDraftThreadSettingsSeed)return Promise.resolve();if(!this.draftThreadSettingsInitPromise)this.draftThreadSettingsInitPromise=this.initDraftThreadSettings();return this.draftThreadSettingsInitPromise}async initDraftThreadSettings(){try{let A=this.applySessionDefaultsToThreadSettings(await gy(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){u.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.neoContext.sessionAgentMode,$=A,B=UB(Q),D=qX0(this.widget.neoContext,Q);if(B!==void 0&&D!==void 0)$={...$,[B]:D};return HX0($,{agentMode:Q,explicitEffort:this.widget.neoContext.explicitReasoningEffort,sessionState:this.widget.neoContext})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=le4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(tE(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=le4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(WC);if(this.exitHintTimer.isActive())A.add(Hx);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),z4.instance.stop();else this.exitHintTimer.activate()};dismissNeoWelcome=()=>{if(!this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!1}),this.widget.onNeoWelcomeDismissed?.()};updateNeoInvadersHighScore=(A)=>{if(A<=this.neoInvadersHighScore)return;this.setState(()=>{this.neoInvadersHighScore=A}),qQ((Q)=>({...Q,neoInvadersHighScore:Math.max(Q.neoInvadersHighScore,A)})).catch((Q)=>{u.warn("Failed to save Neo Invaders high score",{error:Q instanceof Error?Q.message:String(Q)})})};showNeoWelcome=()=>{if(this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!0})};showEndCredits=()=>{if(this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!0})};completeEndCredits=()=>{if(!this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!1})};promptExecutorAlreadyConnected(A){return new Promise((Q)=>{this.setState(()=>{this.executorAlreadyConnectedDialog={existingExecutorPid:A.existingExecutorPid,resolve:($)=>{Q($==="watch"?"observe":"disconnect")}}})})}handleExecutorAlreadyConnectedChoice=(A)=>{if(this.resolveExecutorAlreadyConnectedDialog(A),A==="exit")z4.instance.stop()};resolveExecutorAlreadyConnectedDialog(A){let Q=this.executorAlreadyConnectedDialog;if(!Q)return;this.setState(()=>{this.executorAlreadyConnectedDialog=null}),Q.resolve(A)}closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1})};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,$=null,B)=>{await this.ensureDraftThreadSettingsInitialized();let D=this.activeThreadContext?.client.getThreadId(),J=A.find(X90);if(J)this.widget.history.add(J.text,qK0.cwd()),this.widget.history.reset();let E=$?void 0:await this.widget.getDefaultNewThreadVisibility?.(),F=$??E??null,Y=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,F??void 0);this.sendUserMessage(Y,A,Q,B),this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings),this.threadNavigationHistory.recordNavigation(D),this.setActiveClient(Y)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.neoContext.sessionAgentMode=A;let $=Q["reasoning.effort"];if($!==void 0)this.widget.neoContext.lastReasoningEffortByMode={...this.widget.neoContext.lastReasoningEffortByMode??{},[A]:$};let B=UB(A),D=B?Q[B]:void 0;if(D!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:D};qQ((J)=>{let E={...J,agentMode:A};if($!==void 0)E={...E,lastReasoningEffortByMode:{...E.lastReasoningEffortByMode??{},[A]:$}};if(D!==void 0)E={...E,lastSpeedByMode:{...E.lastSpeedByMode??{},[A]:D}};return E}).catch((J)=>{u.warn("Failed to persist Neo session defaults for new message",{error:J instanceof Error?J.message:String(J)})})}sendUserMessage(A,Q,$,B){let D=FY0(this.ideStatus.getValue());if(B===void 0){A.client.sendUserMessage(Q,$,{userState:D});return}A.client.sendUserMessage(Q,$,{reasoningEffort:B,userState:D})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};getRelaunchThreadIDs=()=>{let A=new Set,Q=this.getActiveThreadID();if(Q)A.add(Q);for(let $ of this.widget.clientPool.activeThreadIDs)A.add($);return[...A]};appendPluginMessagesToThread=async(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("appendToThread is not available - no active thread");let B=$.client.getThreadId();if(Q&&B!==Q)throw Error("thread.append is only available for the active executor thread");for(let D of A)this.sendUserMessage($,[{type:"text",text:D.content}])};async connectToExistingThread(A,Q={}){let $=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let B=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:(D)=>this.promptExecutorAlreadyConnected(D)});if(this.setActiveClient(B),Q.recordNavigation&&$!==A)this.threadNavigationHistory.recordNavigation($);if(Q.initialUserInput)this.sendUserMessage(B,[{type:"text",text:Q.initialUserInput}])}catch(B){if(u.error("Failed to load thread",{error:B,threadID:A}),this.toastController.show(`Failed to load ${A}: ${B instanceof Error?B.message:String(B)}`,"error",4000),Q.rethrowError)throw B}finally{this.setState(()=>{this.connectingToThreadID=null})}}async connectToInitialThreads(A,Q={}){await this.connectToExistingThread(A,Q);let $=this.widget.initialThreadIDs.filter((B)=>B!==A);await Promise.all($.map((B)=>this.resumeBackgroundThread(B)))}async resumeBackgroundThread(A){try{await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:async()=>"observe"})}catch(Q){u.error("Failed to resume background thread",{error:Q,threadID:A}),this.toastController.show(`Failed to resume ${A}: ${Q instanceof Error?Q.message:String(Q)}`,"error",4000)}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q}}),this.syncEmptyThreadPluginConfirmationTitle(),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe(($)=>{this.widget.onActiveThreadChange?.($)}),this.activePluginMessageSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription?.unsubscribe(),this.pluginIntegration?.cancelOwnerUIRequests(),this.activePluginMessageSubscription=Q.pluginMessages().subscribe(($)=>{this.pluginIntegration?.handlePluginMessage($,(B)=>{A.sendPluginMessage(B)})}),this.activePluginUIRequestsSubscription=Q.pluginUIRequests().subscribe(($)=>{this.pluginIntegration?.handlePluginMessage({type:"plugin_message",message:{type:"event",event:"plugin.ui.snapshot",data:{requests:[...$]}}},(B)=>{A.sendPluginMessage(B)})})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){u.error("Failed to connect to IDE",{error:Q});let $=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${$}`,"error",4000)}};dispose(){if(this.unregisterCommands?.(),this.unregisterCommands=null,this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.emptyThreadTerminalTitleController.dispose(),this.mcpTrustIntegration?.dispose(),this.mcpTrustIntegration=null,this.updateRelaunchIntegration?.dispose(),this.updateRelaunchIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.noticesPollingTimeout)clearTimeout(this.noticesPollingTimeout),this.noticesPollingTimeout=null;this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.neoWelcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||this.endCreditsVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function le4(A,Q,$){let B={...A};for(let D of yn3(Q,$)){if(!tE(A[D],Q[D]))continue;let J=$[D];if(J===void 0)delete B[D];else B[D]=J}return B}function yn3(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}a4();function ne4(A,Q,$,B){let D=Dv(A),J="\x1B[0m",E="\x1B[34m",F="\x1B[90m",Y="\x1B[2m",Z=[];if(A.archived)Z.push("\x1B[90m\x1B[2mArchived\x1B[0m");Z.push(`${D}`),Z.push(`\x1B[34m${Q}\x1B[0m`),Z.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let U=14,X=7,G=new QE(U,X),V=new A7(42),K=new iN(U,X,U,X,U,X,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,z0.default(),V);K.layout(w1.tight(U,X)),K.paint(G,0,0);let z=G.getBuffer().getCells(),W=0;for(let R=0;R<X;R++)if(z[R].some((k)=>k.char!==" ")){W=R;break}let I=X-1;for(let R=X-1;R>=0;R--)if(z[R].some((k)=>k.char!==" ")){I=R;break}function H(R,k){if(!R)return"";if(R.type==="rgb"){let{r:_,g:f,b:g}=R.value;if($.getColorDepth()>=24)return`\x1B[${k?38:48};2;${_};${f};${g}m`;let b=FR(_,f,g);return`\x1B[${k?38:48};5;${b}m`}return""}let q=[];if(I>=W)for(let R=W;R<=I;R++){let k="";for(let _=0;_<U;_++){let f=z[R][_],g=f.char,b=H(f.style.fg,!0);k+=b+g+"\x1B[0m"}q.push(k)}let N=q.length,C=Math.max(N,Z.length),M=Math.floor((C-N)/2),O=Math.floor((C-Z.length)/2);for(let R=0;R<C;R++){let k=" ".repeat(U);if(R>=M&&R<M+N)k=q[R-M];let _=" ",f="";if(R>=O&&R<O+Z.length)f=Z[R-O];$.write(k+_+f+`
5316
+ `)),J.push(new w("Details: ",new T({color:B.mutedForeground}))),J.push(new w(A.costBreakdownURL,new T({color:$.app.link})));return new d({text:new w("",void 0,J)})}function Tn3(A,Q,$){let B=_n3(A,Q);if(!A.costBreakdownURL)return new C6({header:"Thread Cost",minWidth:80,maxWidth:100,onDismiss:$,child:B});let D=A.costBreakdownURL,J=new T1(()=>{return b4.maybeInvoke(Q,new H8(D,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),E=new T1(()=>{return o6(Q,D),"handled"});return new C6({header:"Thread Cost",minWidth:80,maxWidth:100,autofocus:!1,footer:[{keys:["Esc"],label:"close"},{keys:["o"],label:"open in browser"},{keys:["y"],label:"copy url"}],onDismiss:$,child:new b4({actions:new Map([[O51,J],[j51,E]]),child:new kA({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[G1.key("o"),new j51],[G1.key("y"),new O51]]),child:new v4({autofocus:!0,debugLabel:"ThreadCostBody",child:B})})})})}function ye4(A){return{noun:"thread",verb:"show cost",description:"Show usage cost for the active thread",keywords:["billing","spend"],get status(){return A.getActiveThreadID()?{type:"enabled"}:{type:"disabled",reason:"No active thread"}},run:async(Q,$,B)=>{let D=A.getActiveThreadID();if(!D)return;try{let J=await o4.threadDisplayCostInfo({threadID:D},{config:A.configService});if(!J.ok){A.toastController.show(Pn3(D,J.error),"error",5000),B();return}Q.push(Tn3(J.result,$,B))}catch(J){u.error("Failed to load Neo thread cost",{error:J,threadID:D}),A.toastController.show(`Failed to show thread cost: ${J instanceof Error?J.message:String(J)}`,"error",5000),B()}}}}c0();f9();B4();class XW extends V4{direction;constructor(A){super();this.direction=A}}class WK0 extends V4{}class b00 extends V4{}class IK0 extends V4{index;constructor(A){super();this.index=A}}function R51(A){return A.length+2}class u51 extends u0{props;constructor(A){super();this.props=A}createState(){return new xe4}}class xe4 extends R0{selectedIndex=0;initState(){super.initState(),this.selectedIndex=this.findSelectableIndex(this.widget.props.initialSelectedIndex??0)}didUpdateWidget(A){this.selectedIndex=this.findSelectableIndex(this.selectedIndex)}isSelectable(A){let Q=this.widget.props.entries[A];return Q?.type==="item"&&(Q.enabled??!0)}findSelectableIndex(A){let{entries:Q}=this.widget.props;if(Q.length===0)return 0;let $=Math.max(0,Math.min(A,Q.length-1));if(this.isSelectable($))return $;for(let B=1;B<Q.length;B++){let D=$+B;if(D<Q.length&&this.isSelectable(D))return D;let J=$-B;if(J>=0&&this.isSelectable(J))return J}return 0}moveSelection(A){let Q=this.findNextSelectableIndex(A);if(Q===this.selectedIndex)return;this.setState(()=>{this.selectedIndex=Q})}findNextSelectableIndex(A){let{entries:Q}=this.widget.props;for(let $=this.selectedIndex+A;$>=0&&$<Q.length;$+=A)if(this.isSelectable($))return $;return this.selectedIndex}acceptIndex(A){let Q=this.widget.props.entries[A];if(Q?.type!=="item"||!(Q.enabled??!0))return;this.setState(()=>{this.selectedIndex=A}),this.widget.props.onAccept(Q.value)}invoke=(A)=>{if(A instanceof XW)return this.moveSelection(A.direction),"handled";if(A instanceof WK0)return this.acceptIndex(this.selectedIndex),"handled";if(A instanceof b00)return this.widget.props.onDismiss(),"handled";if(A instanceof IK0)return this.acceptIndex(A.index),"handled";return"ignored"};buildShortcuts(){let A=new Map([[G1.key("ArrowDown"),new XW(1)],[G1.key("j"),new XW(1)],[G1.ctrl("n"),new XW(1)],[G1.key("ArrowUp"),new XW(-1)],[G1.key("k"),new XW(-1)],[G1.ctrl("p"),new XW(-1)],[G1.key("Enter"),new WK0],[G1.key("Escape"),new b00],[G1.ctrl("."),new b00]]);return this.widget.props.entries.forEach((Q,$)=>{if(Q.type==="item"&&Q.shortcut)A.set(Q.shortcut,new IK0($))}),A}buildActions(){return new Map([[XW,new T1(this.invoke)],[WK0,new T1(this.invoke)],[b00,new T1(this.invoke)],[IK0,new T1(this.invoke)]])}build(A){let Q=O0.of(A),$=vn3(this.widget.props.entries,g1.of(A).supportsEmojiWidth);return new b0({width:this.widget.props.width,height:R51(this.widget.props.entries),decoration:new R4(Q.colors.background,c1.all(new l1(Q.colors.border,1,"solid"))),child:new b4({actions:this.buildActions(),child:new kA({debugLabel:"NeoContextPickerShortcuts",shortcuts:this.buildShortcuts(),child:new v4({autofocus:!0,debugLabel:"NeoContextPicker",child:new S0({mainAxisSize:"min",crossAxisAlignment:"stretch",children:this.widget.props.entries.map((B,D)=>this.buildEntry(B,D,$,Q))})})})})})}buildEntry(A,Q,$,B){if(A.type==="separator")return new b0({height:1,decoration:{border:new c1(new l1(B.colors.border,1,"solid"))}});let D=Q===this.selectedIndex,J=A.enabled??!0,E=new T({color:D?B.app.selectionForeground:B.colors.foreground,dim:!J}),F=new T({color:D?B.app.selectionForeground:B.app.keybind,bold:!0,dim:!J});return new O1({onClick:()=>this.acceptIndex(Q),child:new b0({padding:K0.symmetric(1,0),decoration:D?new R4(B.app.selectionBackground):void 0,child:new s0({crossAxisAlignment:"start",children:[new R1({child:new d({text:new w(A.label,E),maxLines:1,overflow:"ellipsis"})}),new X0({width:1}),new X0({width:$,child:new d({text:new w(be4(A),F),textAlign:"right",maxLines:1,overflow:"ellipsis"})})]})})})}}function vn3(A,Q){return A.reduce(($,B)=>{return B.type==="item"?Math.max($,E4(be4(B),Q)):$},0)}function be4(A){return A.shortcutLabel??A.shortcut?.toString().toLowerCase()??""}var kn3=36,Sn3=24,fn3=72;class he4 extends u0{child;onContext;constructor(A,Q){super();this.child=A;this.onContext=Q}createState(){return new ge4}}class ge4 extends R0{build(A){return this.widget.onContext(A),this.widget.child}}function me4(A){return A.replace(/ ago$/,"")}function HK0(A){return A.reduce((Q,$)=>Math.max(Q,E4(me4($.description.timeAgo))),0)}function de4(A){return Math.max(Sn3,Math.min(A,fn3))}class P51 extends V4{}class _51 extends V4{}class T51{options;visibility;width=kn3;constructor(A){this.options=A;this.visibility=new Ee(A.state)}isVisible(){return this.visibility.isEnabled()}buildBody(A){return new s0({crossAxisAlignment:"stretch",children:[this.buildSlot(),new R1({child:A})]})}buildSlot(){if(!this.options.isAvailable()||this.visibility.isDisabled())return new X0({width:0});return new X0({width:this.width,child:new k4({debugLabel:"ThreadListSidebar",child:new pe4({activeThreadID:this.options.getActiveThreadID(),currentWorkspaceURI:A4(n0.file(this.options.getWorkspaceRoot())),width:this.width,loadThreads:this.options.loadThreads,onSelectThread:this.options.onSelectThread,onDismiss:this.close,onResizeWidth:this.resize})})})}commands(){if(!this.options.isAvailable())return[];return[{noun:"thread",verb:"toggle sidebar",description:"Show or hide the thread sidebar",shortcut:G1.alt("s"),status:{type:"enabled"},run:(A,Q,$)=>{$(),this.toggle()}}]}shortcutEntries(){return this.options.isAvailable()?[[G1.alt("s"),new BV0]]:[]}actionEntries(){if(!this.options.isAvailable())return[];return[[BV0,new T1(()=>this.toggle())]]}toggle=()=>{if(!this.options.isAvailable())return"ignored";if(this.visibility.isDisabled()&&this.options.isBlocked())return"ignored";return this.visibility.toggle(),"handled"};close=()=>{this.visibility.disable()};resize=(A)=>{let Q=de4(A);if(Q===this.width)return;this.options.state.setState(()=>{this.width=Q})}}class pe4 extends u0{props;constructor(A){super();this.props=A}createState(){return new ce4}}class ce4 extends R0{threads=[];isLoading=!0;isSwitchingThread=!1;hasError=!1;filterByWorkspace=!0;timeColWidth=0;contextMenu=null;pendingThreadMutations=new Map;resizeSession=null;isResizeHandleHovered=!1;pickerController=new Le;threadItemContexts=new Map;shortcuts=new Map([[G1.alt("w"),new P51],[G1.ctrl("."),new _51]]);actions=new Map([[P51,new T1(()=>{return this.setState(()=>{this.filterByWorkspace=!this.filterByWorkspace,this.contextMenu=null}),"handled"})],[_51,new T1(()=>this.openContextMenu())]]);get isBusy(){return this.isLoading||this.isSwitchingThread}get isResizeActive(){return this.resizeSession!==null||this.isResizeHandleHovered}didUpdateWidget(A){if(this.contextMenu&&(A.props.width!==this.widget.props.width||A.props.currentWorkspaceURI!==this.widget.props.currentWorkspaceURI))this.contextMenu=null}initState(){super.initState(),this.loadThreadSummaries()}async loadThreadSummaries(){try{let A=await this.widget.props.loadThreads(),Q=q31(A);if(!this.mounted)return;this.setState(()=>{this.pickerController.selectedItem=Q.find(($)=>$.id===this.widget.props.activeThreadID)??null,this.threads=Q,this.timeColWidth=HK0(Q),this.isLoading=!1,this.hasError=!1})}catch(A){if(u.error("Failed to load threads for Neo sidebar",{error:A}),!this.mounted)return;this.setState(()=>{this.isLoading=!1,this.hasError=!0})}}handleSelectThread=async(A)=>{if(this.isSwitchingThread)return;this.setState(()=>{this.isSwitchingThread=!0});try{await this.widget.props.onSelectThread(A),this.widget.props.onDismiss()}catch(Q){u.error("Failed to switch thread from Neo sidebar",{error:Q,threadID:A})}finally{if(this.mounted)this.setState(()=>{this.isSwitchingThread=!1})}};getOptimisticThreads(){return this.threads.flatMap((A)=>{if(this.pendingThreadMutations.get(A.id)?.kind==="archive")return[];return[A]})}getThreadsForDisplay(){let A=this.getOptimisticThreads();return this.filterByWorkspace?A.filter((Q)=>!Q.workspaceURI||Q.workspaceURI===this.widget.props.currentWorkspaceURI):A}buildContextMenuEntries(){return[{type:"item",value:"archive",label:"Archive Thread",shortcut:G1.key("a"),shortcutLabel:"a"},{type:"separator"},{type:"item",value:"copy-id",label:"Copy ID",shortcut:G1.ctrl("c"),shortcutLabel:"ctrl+c"},{type:"item",value:"copy-url",label:"Copy URL",shortcut:new G1("c",{shift:!0,ctrl:!0}),shortcutLabel:"shift+ctrl+c"}]}openContextMenu(){let A=this.pickerController.selectedItem;if(!A||this.isBusy||this.hasError)return"ignored";let Q=this.buildContextMenuEntries(),$=R51(Q),B=this.getContextMenuWidth(),D=this.getContextMenuPosition(A.id,$,B);return this.setState(()=>{this.contextMenu={threadID:A.id,left:D.left,top:D.top,width:B,height:$}}),"handled"}getContextMenuWidth(){let A=Math.max(24,this.widget.props.width-3);return Math.max(1,Math.min(A,this.widget.props.width-2))}getContextMenuPosition(A,Q,$){let B=Math.max(0,Math.min(2,this.widget.props.width-$)),D=1,J=this.threadItemContexts.get(A)?.findRenderObject(),E=this.context.findRenderObject();if(!(J instanceof i1)||!(E instanceof i1))return{left:B,top:1};let F=J.localToGlobal({x:0,y:0}),Y=E.localToGlobal({x:0,y:0}),Z=F.y-Y.y,U=Z+J.size.height,X=g1.sizeOf(this.context).height,G=Math.max(1,Math.min(E.size.height,X-Y.y)),z=G-U>=Q||Z<G/2?U:Z-Q,W=Math.max(0,G-Q);return{left:B,top:Math.max(0,Math.min(z,W))}}closeContextMenu=()=>{if(!this.contextMenu)return;this.setState(()=>{this.contextMenu=null})};handleContextMenuAccept=(A)=>{let Q=this.contextMenu?.threadID;if(!Q)return;if(this.closeContextMenu(),A==="archive"){this.archiveContextMenuThread(Q);return}if(A==="copy-id"){b4.maybeInvoke(this.context,new H8(Q,"Thread ID copied to clipboard","Failed to copy thread ID"));return}b4.maybeInvoke(this.context,new H8(this.getThreadURL(Q),"Thread URL copied to clipboard","Failed to copy thread URL"))};beginOptimisticArchive(A){if(this.pendingThreadMutations.has(A))return!1;if(!this.threads.some(($)=>$.id===A))return!1;let Q={kind:"archive",fallbackSelectedThreadID:null};return this.setState(()=>{this.pendingThreadMutations.set(A,Q),this.timeColWidth=HK0(this.getOptimisticThreads())}),a6.instance.addPostFrameCallback(()=>{if(!this.mounted)return;let $=this.pendingThreadMutations.get(A);if($?.kind!=="archive")return;$.fallbackSelectedThreadID=this.pickerController.selectedItem?.id??null}),!0}commitOptimisticArchive(A){if(this.pendingThreadMutations.get(A)?.kind!=="archive")return;this.pendingThreadMutations.delete(A),this.threads=this.threads.filter(($)=>$.id!==A),this.timeColWidth=HK0(this.getOptimisticThreads())}rollbackOptimisticArchive(A){let Q=this.pendingThreadMutations.get(A);if(Q?.kind!=="archive")return;let $=this.threads.find((B)=>B.id===A);if(!$){this.pendingThreadMutations.delete(A);return}this.setState(()=>{this.pendingThreadMutations.delete(A),this.timeColWidth=HK0(this.getOptimisticThreads());let B=this.pickerController.selectedItem?.id??null;if(B===null||B===Q.fallbackSelectedThreadID)this.pickerController.selectedItem=$})}async archiveContextMenuThread(A){let Q=M3.maybeOf(this.context),{configService:$}=W5.of(this.context);if(!this.beginOptimisticArchive(A))return;try{let B=await FG0({configService:$},A);if(!this.mounted)return;if(B){this.rollbackOptimisticArchive(A),Q?.show(B.message,"error");return}this.commitOptimisticArchive(A)}catch(B){if(u.error("Failed to archive thread from Neo sidebar context menu",{error:B,threadID:A}),!this.mounted)return;this.rollbackOptimisticArchive(A),Q?.show("Failed to archive thread","error")}}getThreadURL(A){return h$(new URL(W5.of(this.context).ampURL),A).toString()}buildContextMenuOverlay(){let A=this.contextMenu;if(!A||!this.getThreadsForDisplay().some((Q)=>Q.id===A.threadID))return null;return new r4({left:A.left,top:A.top,width:A.width,height:A.height,child:new k4({debugLabel:"ThreadListSidebarContextMenu",onFocusChange:(Q)=>{if(!Q)this.closeContextMenu()},child:new u51({entries:this.buildContextMenuEntries(),width:A.width,onAccept:this.handleContextMenuAccept,onDismiss:this.closeContextMenu})})})}buildContextMenuBackdrop(){return new r4({left:0,top:0,right:0,bottom:0,child:new O1({onClick:()=>this.closeContextMenu(),child:X0.expand()})})}buildThreadItem(A,Q,$,B){let D=O0.of(B),{app:J,colors:E}=D,F=!Q,Y=Q?J.selectionForeground:E.foreground,Z=Q?J.selectionForeground:E.mutedForeground,X=A.id===this.widget.props.activeThreadID?new d({text:new w("*",new T({color:Q?J.selectionForeground:E.success,dim:F}))}):void 0,G=me4(A.description.timeAgo);return new he4(new b0({padding:K0.symmetric(1,0),child:new s0({children:[new X0({width:2,child:X}),new R1({child:new d({text:new w(A.title,new T({color:Y,dim:F})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),new X0({width:$,child:s0.end([new d({text:new w(G,new T({color:Z,dim:F}))})])})]})}),(V)=>{this.threadItemContexts.set(A.id,V)})}handleResizeHandlePress=(A)=>{if(A.button!=="left")return;this.setState(()=>{this.resizeSession={baseWidthColumns:this.widget.props.width,startColumn:Math.floor(A.position.x)}})};handleResizeHandleDrag=(A)=>{if(A.button!=="left"||this.resizeSession===null)return;let Q=Math.floor(A.position.x)-this.resizeSession.startColumn,$=de4(this.resizeSession.baseWidthColumns+Q);if($!==this.widget.props.width)this.widget.props.onResizeWidth($)};handleResizeHandleRelease=(A)=>{if(A.button!=="left"||this.resizeSession===null)return;this.setState(()=>{this.resizeSession=null})};handleResizeHandleEnter=()=>{if(this.isResizeHandleHovered)return;this.setState(()=>{this.isResizeHandleHovered=!0})};handleResizeHandleExit=()=>{if(!this.isResizeHandleHovered)return;this.setState(()=>{this.isResizeHandleHovered=!1})};buildResizeHandle(){return new r4({top:0,right:0,bottom:0,width:1,child:new O1({cursor:YA.EW_RESIZE,onClick:this.handleResizeHandlePress,onDrag:this.handleResizeHandleDrag,onRelease:this.handleResizeHandleRelease,onEnter:this.handleResizeHandleEnter,onExit:this.handleResizeHandleExit,child:new X0({width:1})})})}build(A){let Q=O0.of(A),$=this.getThreadsForDisplay(),B=this.hasError?[]:$;this.threadItemContexts.clear();let D=this.isSwitchingThread?"Switching thread...":"Loading threads...",J=this.hasError?"Failed to load threads":"No threads match your filter",E=this.isResizeActive?2:1,F=new c1(void 0,new l1(Q.colors.border,E),void 0,void 0),Y=this.buildContextMenuOverlay(),Z=[new b0({decoration:new R4(Q.colors.background,F),child:new b4({actions:this.actions,child:new kA({shortcuts:this.shortcuts,debugLabel:"ThreadListSidebarFilter",child:new cA({items:B,getLabel:(U)=>`${U.title} ${U.id}`,controller:this.pickerController,onAccept:(U)=>void this.handleSelectThread(U.id),onDismiss:this.widget.props.onDismiss,renderItem:(U,X,G,V)=>this.buildThreadItem(U,X,this.timeColWidth,V),enabled:!this.isBusy,isLoading:this.isBusy,hidePromptWhenLoading:!0,loadingText:D,emptyStateText:J,maxRenderItems:200,showBorder:!1})})})}),this.buildResizeHandle()];if(Y)Z.push(this.buildContextMenuBackdrop()),Z.push(Y);return new b0({width:this.widget.props.width,child:new i4({fit:"expand",children:Z})})}}class v51 extends u0{listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;updateService;initialThreadIDs;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;onRelaunchRequested;onFirstFrame;initialUserInput;getDefaultNewThreadVisibility;openThreadPickerOnStart;workspaceSettingsFilePath;neoContext;constructor(A){super();this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.updateService=A.updateService,this.initialThreadIDs=A.initialThreadIDs??[],this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.mcpTrustHandler=A.mcpTrustHandler,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.onRelaunchRequested=A.onRelaunchRequested,this.onFirstFrame=A.onFirstFrame,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.neoContext=A.neoContext}createState(){return new ie4}}class ie4 extends R0{editorController=new k2;commandPalette=new Ee(this);commandRegistry=new EA1;toastController=new C11;relaunchNotificationController=new s61;exitHintTimer=new Je(this,1000);ideStatus=new z8(this,{});threadNavigationHistory=new QA1;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;activePluginMessageSubscription=null;activePluginUIRequestsSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;neoWelcomeVisible=!1;endCreditsVisible=!1;neoInvadersHighScore=0;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;emptyThreadTerminalTitleController=new q00;pluginIntegration=null;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};analyzeContextForThread=async(A,Q)=>{return Fd4({ampURL:this.widget.neoContext.ampURL,configService:this.widget.configService,threadID:A,signal:Q})};onSwitchThread=(A)=>{return this.connectToExistingThread(A,{recordNavigation:!0,rethrowError:!0})};threadListSidebar=new T51({state:this,isAvailable:()=>this.widget.neoContext.isInternalUser,isBlocked:()=>this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal(),getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,getWorkspaceRoot:()=>this.widget.neoContext.workspaceRoot,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread});sendFeedbackReport=async(A)=>WV0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await FG0({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let $=await zl4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};removeThreadLabel=async(A,Q)=>{let $=await Wl4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};initState(){if(ZB.getInstance().interceptConsole(),this.neoInvadersHighScore=this.widget.neoContext.neoInvadersHighScore??0,this.notices=new y61(this.widget.configService,($)=>this.setState($)),a6.instance.addPostFrameCallback(()=>{setTimeout(()=>this.widget.onFirstFrame?.(),0),this.noticesPollingTimeout=setTimeout(()=>{this.noticesPollingTimeout=null,this.notices.startPolling()},500)},"Neo notices polling"),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:$,error:B})=>{if(u.error("Neo failed to connect to thread",{threadID:$,error:B}),!$)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe(($)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(C90($.settings)))}),this.updateRelaunchIntegration=new e61({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested,relaunchNotificationController:this.relaunchNotificationController,updateService:this.widget.updateService}),this.updateRelaunchIntegration.init(),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput,Q=this.widget.initialThreadIDs[0];if(Q){let $={};if(A)$.initialUserInput=A;this.connectToInitialThreads(Q,$)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new r61({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,neoContext:this.widget.neoContext,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread,onBlockingConfirmDialogChange:this.syncEmptyThreadPluginConfirmationTitle}),this.pluginIntegration.init(),this.mcpTrustIntegration=new f61({state:this,mcpTrustHandler:this.widget.mcpTrustHandler,toastController:this.toastController,workspaceSettingsFilePath:this.widget.workspaceSettingsFilePath}),this.mcpTrustIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=z4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?wa4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],B=[Ta4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["resume"],status:{type:"enabled"},sortBoost:100,run:(D,J,E)=>{D.pushWithDismiss((F)=>N31({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:F,onThreadSelected:E}))}},...this.threadListSidebar.commands(),{noun:"thread",verb:"switch to previous",description:"Switch to previous thread",keywords:["back"],get status(){return A.threadNavigationHistory.canNavigateBack()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to previous with no previous thread"}},run:(D,J,E)=>{A.navigateBack(),E()}},ye4({configService:this.widget.configService,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??void 0,toastController:this.toastController}),{noun:"thread",verb:"switch to next",description:"Switch to next thread",keywords:["forward"],get status(){return A.threadNavigationHistory.canNavigateForward()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to next with no next thread"}},run:(D,J,E)=>{A.navigateForward(),E()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",status:{type:"enabled"},run:(D,J,E)=>{D.push(new pA1({mcpServers:this.widget.neoContext.mcpServers,onDismiss:E}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",status:{type:"enabled"},run:(D)=>{D.pushWithDismiss((J)=>new H51({toolboxes:this.widget.neoContext.toolboxes,onDismiss:J}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","blog","announcements"],status:{type:"enabled"},run:async(D,J,E)=>{try{await o6(J,"https://ampcode.com/chronicle")}finally{E()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config"],status:{type:"enabled"},run:()=>{V$(this.widget.neoContext.settingsFilePath).catch((D)=>{u.error("Failed to open settings file in editor",{error:D})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains"],status:{type:"enabled"},run:(D,J,E)=>{D.pushWithDismiss((F)=>new mA1({onCancel:F,onSelect:(Y)=>{this.handleIdeSelection(Y),E()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["manual","?"],status:{type:"enabled"},run:(D,J,E)=>{D.push(new XA1({commands:R9.of(J).commands,onDismiss:E}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",status:{type:"enabled"},run:(D,J,E)=>{E(),A.showNeoWelcome()}},{noun:"amp",verb:"end credits",description:"Roll the full-screen Amp credits",status:{type:"enabled"},run:(D,J,E)=>{E(),A.showEndCredits()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["v"],status:{type:"enabled"},run:(D,J,E)=>{D.push(new C6({header:"Amp Version",maxWidth:72,onDismiss:E,child:new d({text:new w(SX0({version:"0.0.1779886645-g59fcb2",buildTimestamp:"2026-05-27T13:02:21.391Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","bye"],shortcut:G1.ctrl("c"),status:{type:"enabled"},run:(D,J)=>{b4.maybeInvoke(J,new Mx)}},...Q,...Da4(this.widget.neoContext.logFilePath)].map((D)=>this.commandRegistry.register(D));return()=>{for(let D of B)D()}}build(A){let Q=this.buildHints(),$=this.ideStatus.getValue(),B=this.notices.current,D=new I51({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:$,statusItems:this.pluginIntegration?.getStatusItems()??[],pluginConfirmationBlocked:this.pluginIntegration?.hasBlockingConfirmDialog()??!1,notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.neoWelcomeVisible?null:B,onDismissNotice:(U)=>this.notices.dismiss(U)}),J=g1.of(A),E=J.capabilities.animationSupport!=="disabled",Y=[new b0({constraints:w1.tight(J.size.width,J.size.height),child:this.threadListSidebar.buildBody(D)})];if(this.commandPalette.isEnabled())Y.push(new k4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new FA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)Y.push(N31({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)Y.push(new k4({debugLabel:"NeoWelcomeDialogOverlay",child:new L51({onDismiss:this.dismissNeoWelcome,onQuit:()=>z4.instance.stop(),animationsEnabled:E,variant:this.widget.neoWelcomeVariant})}));let Z=this.executorAlreadyConnectedDialog;if(Z)Y.push(new k4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new hA1({existingExecutorPid:Z.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(Y.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),Y.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)Y.push(new VA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:qK0.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)Y.push(new gA1);if(this.endCreditsVisible)Y.push(new kA1({onComplete:this.completeEndCredits,highScore:this.neoInvadersHighScore,onHighScoreChange:this.updateNeoInvadersHighScore}));return new W5({neoContext:this.widget.neoContext,child:new R9({commandRegistry:this.commandRegistry,child:new Ox({completionBuilder:this.widget.completionBuilder,child:new M3({controller:this.toastController,child:new b4({actions:this.buildActions(),child:new kA({debugLabel:"NeoAppShortcuts",shortcuts:this.buildShortcuts(),child:new v4({debugLabel:"AppShellFocus",child:new w11({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...B&&this.activeThreadContext&&!this.neoWelcomeVisible?[this.notices]:[]],child:new GA1({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new i4({children:Y})})})})})})})})})})}buildShortcuts(){let A=new Map([[G1.ctrl("c"),new tG0],[G1.ctrl("o"),new AV0],[G1.alt("i"),new $V0],[G1.alt("p"),new tN],[G1.ctrl("."),new JV0],[G1.ctrl("t"),new YV0],...this.threadListSidebar.shortcutEntries()]);if(qK0.env.NODE_ENV==="development"&&qK0.platform==="darwin")A.set(G1.meta("r"),new eG0);return A}buildActions(){let A=new T1(()=>{if(TD.hasAnyCopyableSelection())return TD.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new T1(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),$=new T1(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),B=new T1(()=>{return this.startNewDraftThread(),"handled"}),D=new T1(()=>{return z4.instance.stop(),"handled"}),J=new T1(()=>{return G00({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),E=new T1((G)=>{if(!G.text)return"ignored";return z4.instance.tuiInstance.clipboard.writeText(G.text).then((V)=>{if(V.ok)this.toastController.show(G.successMessage,"success",2000);else this.toastController.show(`${G.failureMessage}: ${V.userFacingErrorMessage}`,"error",4000)}).catch((V)=>{u.error("Failed to copy Neo text to clipboard",{error:V}),this.toastController.show(G.failureMessage,"error",2000)}),"handled"}),F=new T1(()=>{return z4.instance.toggleFrameStatsOverlay(),"handled"}),Y=new T1(()=>this.notices.dismissCurrent()?"handled":"ignored"),Z=new T1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),U=da4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,neoContext:this.widget.neoContext,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),X=new T1(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[tG0,A],[B00,B],[Mx,D],[eG0,J],[H8,E],[F00,$],[AV0,Q],[$V0,Z],...this.threadListSidebar.actionEntries(),[JV0,Y],...U,[tN,F],[YV0,X]])}startNewDraftThread(A={}){let Q=this.activeThreadContext?.client.getThreadId();if(this.commandPalette.disable(),this.threadNavigationHistory.recordNavigation(Q),this.setState(()=>{if(this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.cancelOwnerUIRequests(),this.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),this.widget.onActiveThreadChange?.(null),this.syncEmptyThreadPluginConfirmationTitle(),A.prompt!==void 0)this.editorController.text=A.prompt}syncEmptyThreadPluginConfirmationTitle=()=>{this.emptyThreadTerminalTitleController.setPluginConfirmationBlocked(this.activeThreadContext===null&&(this.pluginIntegration?.hasBlockingConfirmDialog()??!1))};closeCommandPaletteOnFocusLoss=(A)=>{if(A||!this.commandPalette.isEnabled())return;this.commandPalette.disable()};ensureDraftThreadSettingsInitialized(){if(this.hasDraftThreadSettingsSeed)return Promise.resolve();if(!this.draftThreadSettingsInitPromise)this.draftThreadSettingsInitPromise=this.initDraftThreadSettings();return this.draftThreadSettingsInitPromise}async initDraftThreadSettings(){try{let A=this.applySessionDefaultsToThreadSettings(await gy(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){u.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.neoContext.sessionAgentMode,$=A,B=UB(Q),D=qX0(this.widget.neoContext,Q);if(B!==void 0&&D!==void 0)$={...$,[B]:D};return HX0($,{agentMode:Q,explicitEffort:this.widget.neoContext.explicitReasoningEffort,sessionState:this.widget.neoContext})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=le4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(tE(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=le4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(WC);if(this.exitHintTimer.isActive())A.add(Hx);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),z4.instance.stop();else this.exitHintTimer.activate()};dismissNeoWelcome=()=>{if(!this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!1}),this.widget.onNeoWelcomeDismissed?.()};updateNeoInvadersHighScore=(A)=>{if(A<=this.neoInvadersHighScore)return;this.setState(()=>{this.neoInvadersHighScore=A}),qQ((Q)=>({...Q,neoInvadersHighScore:Math.max(Q.neoInvadersHighScore,A)})).catch((Q)=>{u.warn("Failed to save Neo Invaders high score",{error:Q instanceof Error?Q.message:String(Q)})})};showNeoWelcome=()=>{if(this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!0})};showEndCredits=()=>{if(this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!0})};completeEndCredits=()=>{if(!this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!1})};promptExecutorAlreadyConnected(A){return new Promise((Q)=>{this.setState(()=>{this.executorAlreadyConnectedDialog={existingExecutorPid:A.existingExecutorPid,resolve:($)=>{Q($==="watch"?"observe":"disconnect")}}})})}handleExecutorAlreadyConnectedChoice=(A)=>{if(this.resolveExecutorAlreadyConnectedDialog(A),A==="exit")z4.instance.stop()};resolveExecutorAlreadyConnectedDialog(A){let Q=this.executorAlreadyConnectedDialog;if(!Q)return;this.setState(()=>{this.executorAlreadyConnectedDialog=null}),Q.resolve(A)}closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1})};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,$=null,B)=>{await this.ensureDraftThreadSettingsInitialized();let D=this.activeThreadContext?.client.getThreadId(),J=A.find(X90);if(J)this.widget.history.add(J.text,qK0.cwd()),this.widget.history.reset();let E=$?void 0:await this.widget.getDefaultNewThreadVisibility?.(),F=$??E??null,Y=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,F??void 0);this.sendUserMessage(Y,A,Q,B),this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings),this.threadNavigationHistory.recordNavigation(D),this.setActiveClient(Y)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.neoContext.sessionAgentMode=A;let $=Q["reasoning.effort"];if($!==void 0)this.widget.neoContext.lastReasoningEffortByMode={...this.widget.neoContext.lastReasoningEffortByMode??{},[A]:$};let B=UB(A),D=B?Q[B]:void 0;if(D!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:D};qQ((J)=>{let E={...J,agentMode:A};if($!==void 0)E={...E,lastReasoningEffortByMode:{...E.lastReasoningEffortByMode??{},[A]:$}};if(D!==void 0)E={...E,lastSpeedByMode:{...E.lastSpeedByMode??{},[A]:D}};return E}).catch((J)=>{u.warn("Failed to persist Neo session defaults for new message",{error:J instanceof Error?J.message:String(J)})})}sendUserMessage(A,Q,$,B){let D=FY0(this.ideStatus.getValue());if(B===void 0){A.client.sendUserMessage(Q,$,{userState:D});return}A.client.sendUserMessage(Q,$,{reasoningEffort:B,userState:D})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};getRelaunchThreadIDs=()=>{let A=new Set,Q=this.getActiveThreadID();if(Q)A.add(Q);for(let $ of this.widget.clientPool.activeThreadIDs)A.add($);return[...A]};appendPluginMessagesToThread=async(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("appendToThread is not available - no active thread");let B=$.client.getThreadId();if(Q&&B!==Q)throw Error("thread.append is only available for the active executor thread");for(let D of A)this.sendUserMessage($,[{type:"text",text:D.content}])};async connectToExistingThread(A,Q={}){let $=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let B=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:(D)=>this.promptExecutorAlreadyConnected(D)});if(this.setActiveClient(B),Q.recordNavigation&&$!==A)this.threadNavigationHistory.recordNavigation($);if(Q.initialUserInput)this.sendUserMessage(B,[{type:"text",text:Q.initialUserInput}])}catch(B){if(u.error("Failed to load thread",{error:B,threadID:A}),this.toastController.show(`Failed to load ${A}: ${B instanceof Error?B.message:String(B)}`,"error",4000),Q.rethrowError)throw B}finally{this.setState(()=>{this.connectingToThreadID=null})}}async connectToInitialThreads(A,Q={}){await this.connectToExistingThread(A,Q);let $=this.widget.initialThreadIDs.filter((B)=>B!==A);await Promise.all($.map((B)=>this.resumeBackgroundThread(B)))}async resumeBackgroundThread(A){try{await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:async()=>"observe"})}catch(Q){u.error("Failed to resume background thread",{error:Q,threadID:A}),this.toastController.show(`Failed to resume ${A}: ${Q instanceof Error?Q.message:String(Q)}`,"error",4000)}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q}}),this.syncEmptyThreadPluginConfirmationTitle(),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe(($)=>{this.widget.onActiveThreadChange?.($)}),this.activePluginMessageSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription?.unsubscribe(),this.pluginIntegration?.cancelOwnerUIRequests(),this.activePluginMessageSubscription=Q.pluginMessages().subscribe(($)=>{this.pluginIntegration?.handlePluginMessage($,(B)=>{A.sendPluginMessage(B)})}),this.activePluginUIRequestsSubscription=Q.pluginUIRequests().subscribe(($)=>{this.pluginIntegration?.handlePluginMessage({type:"plugin_message",message:{type:"event",event:"plugin.ui.snapshot",data:{requests:[...$]}}},(B)=>{A.sendPluginMessage(B)})})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){u.error("Failed to connect to IDE",{error:Q});let $=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${$}`,"error",4000)}};dispose(){if(this.unregisterCommands?.(),this.unregisterCommands=null,this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.emptyThreadTerminalTitleController.dispose(),this.mcpTrustIntegration?.dispose(),this.mcpTrustIntegration=null,this.updateRelaunchIntegration?.dispose(),this.updateRelaunchIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.noticesPollingTimeout)clearTimeout(this.noticesPollingTimeout),this.noticesPollingTimeout=null;this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.neoWelcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||this.endCreditsVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function le4(A,Q,$){let B={...A};for(let D of yn3(Q,$)){if(!tE(A[D],Q[D]))continue;let J=$[D];if(J===void 0)delete B[D];else B[D]=J}return B}function yn3(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}a4();function ne4(A,Q,$,B){let D=Dv(A),J="\x1B[0m",E="\x1B[34m",F="\x1B[90m",Y="\x1B[2m",Z=[];if(A.archived)Z.push("\x1B[90m\x1B[2mArchived\x1B[0m");Z.push(`${D}`),Z.push(`\x1B[34m${Q}\x1B[0m`),Z.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let U=14,X=7,G=new QE(U,X),V=new A7(42),K=new iN(U,X,U,X,U,X,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,z0.default(),V);K.layout(w1.tight(U,X)),K.paint(G,0,0);let z=G.getBuffer().getCells(),W=0;for(let R=0;R<X;R++)if(z[R].some((k)=>k.char!==" ")){W=R;break}let I=X-1;for(let R=X-1;R>=0;R--)if(z[R].some((k)=>k.char!==" ")){I=R;break}function H(R,k){if(!R)return"";if(R.type==="rgb"){let{r:_,g:f,b:g}=R.value;if($.getColorDepth()>=24)return`\x1B[${k?38:48};2;${_};${f};${g}m`;let b=FR(_,f,g);return`\x1B[${k?38:48};5;${b}m`}return""}let q=[];if(I>=W)for(let R=W;R<=I;R++){let k="";for(let _=0;_<U;_++){let f=z[R][_],g=f.char,b=H(f.style.fg,!0);k+=b+g+"\x1B[0m"}q.push(k)}let N=q.length,C=Math.max(N,Z.length),M=Math.floor((C-N)/2),O=Math.floor((C-Z.length)/2);for(let R=0;R<C;R++){let k=" ".repeat(U);if(R>=M&&R<M+N)k=q[R-M];let _=" ",f="";if(R>=O&&R<O+Z.length)f=Z[R-O];$.write(k+_+f+`
5317
5317
  `)}if(B)$.write(`
5318
5318
  \x1B[90m${B}\x1B[0m
5319
5319
  `)}c0();c0();import{exec as tR}from"node:child_process";function NK0(A="idle"){try{if(A==="idle"){if(process.platform==="darwin")tR("afplay /System/Library/Sounds/Submarine.aiff");else if(process.platform==="win32")tR("powershell [console]::beep(800,200)");else if(process.platform==="linux")tR("paplay /usr/share/sounds/freedesktop/stereo/message.oga || beep")}else if(A==="idle-review"){if(process.platform==="darwin")tR("afplay /System/Library/Sounds/Glass.aiff")}else if(A==="requires-user-input"){if(process.platform==="darwin")tR("afplay /System/Library/Sounds/Ping.aiff");else if(process.platform==="win32")tR("powershell [console]::beep(1000,300)");else if(process.platform==="linux")tR("paplay /usr/share/sounds/freedesktop/stereo/dialog-information.oga || beep -f 1000 -l 100")}}catch(Q){u.error(`Failed to play notification sound (${A}):`,Q)}}st();_X0();var xn3=2000,bn3="Agent is ready",hn3="Waiting for approval";function ae4(A){let Q=!0,$=!0,B=A.configService.config.subscribe((I)=>{Q=I.settings["notifications.enabled"]??!0,$=I.settings["notifications.system.enabled"]!==!1}),D=0,J=()=>{let I=V?.prepareTerminalTitleForNotification();if(I!==void 0)process.stdout.write(aU0(I))},E=(I)=>{if(!Q)return;let H=Date.now();if(H-D<xn3)return;if(D=H,sz())return;if(RU0())J(),setTimeout(uU0,vt);else NK0(I)},F=()=>{E("idle"),K(bn3)},Y=()=>{E("requires-user-input"),K(hn3)},Z=(I)=>I?.attempt===void 0||I.attempt===0,U=null,X=null,G=null,V,K=(I)=>{if(!Q||!$)return;if(sz()&&!tt()&&!Ty())return;J(),setTimeout(()=>{process.stdout.write(kt(I))},vt)},z=()=>{U?.unsubscribe(),X?.unsubscribe(),U=null,X=null,G=null,V=void 0};return{attach:(I,H,q)=>{if(z(),V=q,H)X=H.subscribe({next:(N)=>{if(N===null)return;if(!Z(N))return;F()},error:(N)=>{u.debug("Neo notification active error stream errored",{error:N})}});U=I.subscribe({next:(N)=>{try{let C=G!==null&&J$(G),M=G==="awaiting_approval",O=C||M;if(N==="awaiting_approval"&&!M)Y();else if(N==="idle"&&O)F()}catch(C){u.debug("Neo notification handling failed",{error:C})}finally{G=N}},error:(N)=>{u.debug("Neo notification agent state stream errored",{error:N})}})},detach:z,unsubscribe(){z(),B.unsubscribe()}}}function gn3({initialUserInput:A,showNeoWelcome:Q,hideNeoWelcome:$,neoWelcomeVariant:B,neoWelcomeDismissed:D}){if($)return{show:!1,markDismissedOnDismiss:!1};if(B==="npm-migration")return{show:!0,markDismissedOnDismiss:!1};if(Q)return{show:!0,markDismissedOnDismiss:!0};let J=!A&&!D;return{show:J,markDismissedOnDismiss:J}}async function mn3(A){await qQ((Q)=>py(Q,A,"interactive"))}async function oe4(A,Q={}){let{initialThreadIDs:$=[],initialUserInput:B,getDefaultNewThreadVisibility:D,openThreadPickerOnStart:J=!1,observerOnly:E=!1,initialAgentMode:F,initialReasoningEffort:Y,onFirstFrame:Z,showNeoWelcome:U=!1,hideNeoWelcome:X=!1,neoWelcomeVariant:G="intro"}=Q,V=G==="npm-migration";if($.length>1)u.info("Resuming multiple initial threads",{threadIDs:$});let K=async(_)=>{let f=await A.getThreadFromServer(_);if(!f)return null;return WU0(f)},z=async(_)=>{let f=await A.getThreadFromServer(_);if(!f)throw Error(`Thread ${_} not found`);let g=await s9(_,A.configService,A.apiKey,{usesThreadActors:!0}),b=fG({endpoint:A.rivetEndpoint,poolName:g.poolName}),v={wsToken:g.wsToken,transport:"json-rpc"},c=await b.threadActor.getOrCreate([_],{params:v,createWithInput:{threadId:g.threadId,threadVersion:g.threadVersion,ownerUserId:g.ownerUserId,...g.agentMode?{agentMode:g.agentMode}:{}}}).fetch("/import",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({thread:uy4(f)}),skipReadyWait:!0});if(!c.ok&&c.status!==409)throw Error(`Thread import failed (${c.status}): ${await c.text()}`);try{await Dx4(_,A.configService,A.apiKey,{executorType:"local-client"})}catch(p){u.warn("failed to mark thread as imported on server",{threadID:_,error:p instanceof Error?p.message:String(p)})}},W=new n01(A.rivetEndpoint,A.apiKey,A.configService,{clientID:ON.parse(`neo-${crypto.randomUUID()}`),toolService:A.toolService,skillService:A.skillService,requestPluginToolCall:(_)=>A.pluginService.event.toolCall(_),requestPluginToolResult:(_)=>A.pluginService.event.toolResult(_),pluginService:A.pluginService,pluginPlatform:A.pluginPlatform,invokeTool:async(_,f)=>{let g=typeof f.args==="object"&&f.args!==null?f.args:{},b=await xN({toolName:f.toolName,configService:A.configService,toolService:A.toolService,mcpService:A.mcpService,skillService:A.skillService,toolUseID:f.toolCallId,threadId:_});return A.toolService.invokeTool(f.toolName,{args:g},b)},persistLastThreadID:mn3,readFileSystemDirectory:A.readFileSystemDirectory},K,z),I=await rz(),H=gn3({initialUserInput:B,showNeoWelcome:U,hideNeoWelcome:X,neoWelcomeVariant:G,neoWelcomeDismissed:I.neoWelcomeDismissed}),q={ampURL:A.ampURL,configService:A.configService,getThreadMarkdown:async(_)=>{let f=await A.getThreadFromServer(_);return f?pX(f):null},isInternalUser:A.isInternalUser,listThreads:A.listThreads,logFilePath:Ms,mcpServers:A.mcpService.servers,pluginPlatform:A.pluginPlatform,pluginService:A.pluginService,toolboxes:A.toolboxes,observerOnly:V?!1:E,neoInvadersHighScore:I.neoInvadersHighScore,sessionAgentMode:F??I.agentMode,explicitReasoningEffort:Y,lastReasoningEffortByMode:I.lastReasoningEffortByMode,lastSpeedByMode:I.lastSpeedByMode,settingsFilePath:A.settingsFilePath,splashOrbVisualStyle:Q.splashOrbVisualStyle??"neo",workspaceRoot:A.workspaceRoot},N=(_,f)=>{return zm4({ampURL:A.ampURL,configService:A.configService,threadID:_,signal:f})},C=new z11,M=ae4({configService:A.configService}),O=await A.configService.getLatest();z4.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:O.settings["terminal.animation"]===!1}});let R=new Set,k=new t61;try{await et(new v51({clientPool:W,listSkillsForThread:N,completionBuilder:A.completionBuilder,history:new Ut,ideManager:C,configService:A.configService,updateService:A.updateService,initialThreadIDs:V?[]:$,notificationService:M,mcpTrustHandler:A.mcpTrustHandler,initialUserInput:V?void 0:B,getDefaultNewThreadVisibility:D,openThreadPickerOnStart:V?!1:J,workspaceSettingsFilePath:A.workspaceSettingsFilePath,neoContext:q,showNeoWelcome:H.show,neoWelcomeVariant:G,onActiveThreadChange:A.setActiveThreadID,onRelaunchRequested:k.request,onNeoWelcomeDismissed:H.markDismissedOnDismiss?()=>{qQ(Hm4).catch((f)=>{u.warn("Failed to mark Neo welcome as dismissed",{error:f})})}:void 0,onThreadArchived:(f)=>{R.add(f)},onFirstFrame:Z}));let _=W.lastActiveObservingClient;if(_&&k.shouldShowExitSummary){let{client:f,observer:g}=_,b=f.getThreadId();if(b){let v={id:b,title:g.title().getValue(),agentMode:g.agentMode,archived:R.has(b)},x=`${A.ampURL.replace(/\/$/,"")}/threads/${b}`;ne4(v,x,process.stdout)}}}finally{process.stdout.write(dN("")),M.unsubscribe(),W.dispose(),await A.dispose?.()}process.exit(k.relaunchIfRequested(A.workspaceRoot)??0)}G5();function lx(A){let Q=[],$={meta:{visibility:"private",sharedGroupIDs:[]}};if(A.workspace?.disablePrivateThreads)$.disabledReason="Disabled by workspace policy";if(Q.push($),A.workspace?.groups&&A.workspace.groups.length>0){let E={meta:{visibility:"private",shareWithAllCreatorGroups:!0}};if(A.creatorIsViewer===!1)E.disabledReason="Can only be set by thread creator";Q.push(E)}if(A.workspace)Q.push({meta:{visibility:"thread_workspace_shared"}});let B=A.workspace?.disablePublicSharing?"Disabled by workspace policy":void 0,D={meta:{visibility:"public_unlisted"}},J={meta:{visibility:"public_discoverable"}};if(B)D.disabledReason=B,J.disabledReason=B;return Q.push(D,J),Q}function re4(A){if(A.visibility==="thread_group_shared")return"sharedGroupIDs"in A&&A.sharedGroupIDs.length>0;if(A.visibility!=="private")return!0;if("shareWithAllCreatorGroups"in A&&A.shareWithAllCreatorGroups)return!0;return"sharedGroupIDs"in A&&A.sharedGroupIDs.length>0}function eR(A,Q={}){switch(A.visibility){case"thread_workspace_shared":return{text:"Workspace",description:"Visible to all members of the workspace"};case"public_discoverable":return{text:"Public",description:"Visible on public profile & publicly searchable"};case"public_unlisted":return{text:"Unlisted",description:"Visible to anyone on the Internet who has the link"};case"thread_group_shared":case"private":{let $=A.visibility==="private"&&"shareWithAllCreatorGroups"in A&&A.shareWithAllCreatorGroups,B=$?Q.workspace?.groups.map((J)=>J.id)??[]:("sharedGroupIDs"in A)?A.sharedGroupIDs:[],D=B.reduce((J,E)=>{let F=Q.workspace?.groups.find((Y)=>Y.id===E)?.name;if(F)J.push(`'${F}'`);return J},[]);if(D.length>0)return{text:"Group",description:`Shared with ${U4(D.length,"group")} ${D.join(", ")} and workspace admins`};if($)return{text:"Group",description:"Shared with creator groups and workspace admins"};if(B.length>0)return{text:"Group",description:`Shared with ${U4(B.length,"group")} and workspace admins`};return{text:"Private",description:Q.workspace?"Only visible to you and workspace admins":"Only you can see this thread"}}}}function CK0(A){if(A.visibility==="private")return"shareWithAllCreatorGroups"in A?"group":"private";if(A.visibility==="thread_workspace_shared")return"workspace";if(A.visibility==="public_unlisted")return"unlisted";return"public"}function ix(A,Q=null){let $=A!==null&&typeof A==="object"&&"visibility"in A?A.visibility:void 0;if(!$||typeof $!=="string")return;let D=lx({workspace:Q?.team??void 0}).filter((J)=>!J.disabledReason).map((J)=>CK0(J.meta));if(D.includes($))return dn3($);if($==="group"&&!D.includes("group")){if(Q?.team?.groups!==void 0)return Error(`Group visibility is not available. You are not a member of any group in this workspace.
@@ -7081,7 +7081,7 @@ ${D}`,Q);this.line=$,this.column=B,this.codeblock=D}}/*!
7081
7081
  `),J=[];for(let E=0;E<D.length;E++){let Z=D[E].replace(/\b(SELECT|FROM|WHERE|GROUP BY|ORDER BY|HAVING|LIMIT|JOIN|LEFT JOIN|RIGHT JOIN|INNER JOIN|ON|AND|OR|AS|IN|NOT|NULL|IS|BETWEEN|LIKE|EXISTS|UNION|DISTINCT|COUNT|SUM|AVG|MIN|MAX|DATE|TIMESTAMP_TRUNC|TIMESTAMP_SUB|CURRENT_TIMESTAMP|INTERVAL|CASE|WHEN|THEN|ELSE|END|WITH|INSERT|UPDATE|DELETE|SET|VALUES|INTO|CREATE|ALTER|DROP|TRUE|FALSE|ASC|DESC)\b/gi,"\x00$1\x01").split(/(\x00[^\x01]+\x01)/);for(let U of Z)if(U.startsWith("\x00")&&U.endsWith("\x01"))J.push(new w(U.slice(1,-1),new T({color:B.app.keybind,bold:!0})));else J.push(new w(U,new T({color:$.colorScheme.foreground})));if(E<D.length-1)J.push(new w(`
7082
7082
  `))}return new b0({decoration:{color:$.colorScheme.background,border:c1.all(new l1(B.app.keybind,1,"rounded"))},child:new y0({padding:K0.symmetric(0,1),child:new d({text:new w(void 0,void 0,J)})})})}}class d21 extends u5{chartData;highlightIndex;showAxes;colors;constructor({key:A,chartData:Q,highlightIndex:$=null,showAxes:B=!0,colors:D=xz0}){super(A?{key:A}:{});this.chartData=Q,this.highlightIndex=$,this.showAxes=B,this.colors=D}createRenderObject(){return new g21({chartData:this.chartData,highlightIndex:this.highlightIndex,showAxes:this.showAxes,colors:this.colors})}updateRenderObject(A){let Q=A;Q.chartData=this.chartData,Q.highlightIndex=this.highlightIndex,Q.showAxes=this.showAxes,Q.colors=this.colors,Q.markNeedsLayout()}}function P66(A,Q,$,B,D,J,E){if(J<=0)return null;switch(A){case"horizontal-bar":{let F=$;return F>=0&&F<J?F:null}case"bar":case"stacked-bar":{let F=E?r2:0,Y=B-F;if(Y<=0)return null;let Z=Q-F;if(Z<0||Z>=Y)return null;let U=Math.max(1,Math.floor(Y/J)),X=Math.floor(Z/U);return X>=0&&X<J?X:null}case"line":case"sparkline":case"stacked-area":{let F=E?r2:0,Y=B-F;if(Y<=0)return null;let Z=Math.max(0,Math.min(Y-1,Q-F));if(J===1)return 0;let U=Y/(J-1),X=Math.round(Z/U);return Math.max(0,Math.min(J-1,X))}default:return null}}function V05(A,Q,$,B,D,J,E,F){if(D<=0||Q<0||Q>=D)return null;let Y=2;switch(A){case"horizontal-bar":return{x:Math.floor($/2),y:Q};case"bar":case"stacked-bar":{let Z=J?r2:0,U=$-Z,X=B-(J?Y:0);if(U<=0||X<=0)return null;let G=Math.max(1,Math.floor(U/D)),V=Z+Q*G+Math.floor(G/2),K=F>0?E/F:0,z=Math.round((1-K)*(X-1));return{x:V,y:z}}case"line":case"sparkline":case"stacked-area":{let Z=J?r2:0,U=$-Z,X=B-(J?Y:0);if(U<=0||X<=0)return null;let G=D>1?Z+Math.round(Q/(D-1)*(U-1)):Z+Math.floor(U/2),V=F>0?E/F:0,K=Math.round((1-V)*(X-1));return{x:G,y:K}}default:return null}}function K05(A){let Q=0;for(let $ of A)for(let B of $.points)if(B.value>Q)Q=B.value;return Q||1}function z05(A,Q,$,B,D){if($.length<=1){let F=B(A.value),Y=A.meta?` (${A.meta})`:"";return A.label.length+2+F.length+Y.length}let J=A.label.length,E=0;for(let F of $){let Y=F.points[Q];if(!Y)continue;E+=Y.value;let Z=2+F.name.length+2+B(Y.value).length;J=Math.max(J,Z)}if(D){let F=9+B(E).length;J=Math.max(J,F)}return J}function W05(A,Q,$,B,D,J,E){let F;try{let K=L1.of(A),z=O0.of(A);F={foreground:K.colorScheme.foreground,background:K.colorScheme.background,border:z.app.keybind}}catch{F={foreground:{type:"index",value:15},background:{type:"index",value:0},border:{type:"index",value:7}}}let Y=new T({color:F.foreground,bold:!0}),Z=new T({color:F.foreground}),U=new T({color:F.foreground,dim:!0}),X=[],G=new T({color:F.foreground,underline:!0}),V=(K,z)=>new w(z,G,void 0,lz(K),()=>{o6(A,K)});if(B.length<=1){if(X.push(new w(`${Q.label}: `,Y)),Q.link)X.push(V(Q.link,J(Q.value)));else X.push(new w(J(Q.value),Z));if(Q.meta)X.push(new w(` (${Q.meta})`,U))}else{let K=E==="stacked-bar"||E==="stacked-area";X.push(new w(`${Q.label}
7083
7083
  `,Y));let z=0;for(let W=0;W<B.length;W++){let I=B[W],H=I.points[$];if(!H)continue;z+=H.value;let q=I.color??D[W%D.length]??F.foreground;if(X.push(new w("● ",new T({color:q}))),X.push(new w(`${I.name}: `,U)),H.link)X.push(V(H.link,J(H.value)));else X.push(new w(J(H.value),Z));if(W<B.length-1||K)X.push(new w(`
7084
- `))}if(K)X.push(new w(" ",U)),X.push(new w("Total: ",U)),X.push(new w(J(z),Z))}return new b0({decoration:{color:F.background,border:c1.all(new l1(F.border,1,"rounded"))},child:new d({text:new w(void 0,void 0,X)})})}c0();function _66(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}G5();r5();b5();d$();f9();g2();cQ();Hq();a4();sk();CT();u1();c0();f9();class p21{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(A,Q){this.enabled=A;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 A=Array.from(this.commandCounts.entries()).map(([Q,$])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1779872458-g7b0532"},parameters:{metadata:{count:$}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await z90(Q,this.configService)}catch(Q){u.error("Failed to export command telemetry events",Q)}}async submit(A){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(A)||0;this.commandCounts.set(A,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class mC extends u0{props;constructor(A){super();this.props=A}createState(){return new T66}}class T66 extends R0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(A){let Q=($)=>{this.setState(()=>{this._state=$(this._state)})};return this.widget.props.builder(A,Q,this._state)}}class v66 extends R0{controller=new k2;focusNode=new s6({debugLabel:"CommandArgumentPrompt",onKey:(A)=>{if(A.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(A){let Q=O0.of(A),{colors:$,app:B}=Q,D=this.widget.props.isRequiredArg??!0,J=this.controller.text.trim().length>0,E=!D||J,F=c1.all(new l1($.foreground,1,"solid")),Y=new GB({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(V)=>{let K=V.trim();if(D&&K.length===0)return;this.widget.props.onSubmit(K)},autofocus:!0,style:{textColor:$.foreground,border:null},maxLines:1}),Z=new s0({children:[new b0({decoration:{color:$.background},child:new d({text:new w(">",new T({color:$.foreground}))})}),new R1({child:Y})]}),U=new b0({padding:K0.symmetric(1,0),child:new d({text:this.widget.props.title?new w(this.widget.props.title,new T({color:B.command,bold:!0})):new w("",void 0,[new w("Command: ",new T({color:$.foreground})),new w(this.widget.props.commandName,new T({color:B.command,bold:!0}))])})}),X=[];if(E)X.push(new w("Enter",new T({color:B.keybind}))),X.push(new w(" to submit, ",new T({color:$.foreground,dim:!0})));X.push(new w("Esc",new T({color:B.keybind}))),X.push(new w(" to cancel",new T({color:$.foreground,dim:!0})));let G=new b0({padding:K0.symmetric(1,0),child:new d({text:new w("",void 0,X)})});return new b0({decoration:{border:F,color:$.background},padding:K0.all(1),child:new S0({children:[U,new X0({height:1}),Z,new U3,G]})})}}class B10 extends u0{props;constructor(A){super();this.props=A}createState(){return new v66}}cQ();class k66 extends R0{controller=new k2;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new s6({debugLabel:"CommandMultilinePrompt",onKey:(A)=>{if(A.key==="Escape"){if(this.isConfirmingClearInput){if(this.controller.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[],this.imagePaths=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.controller.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return this.widget.props.onDismiss(),"handled"}return"ignored"}});initState(){if(this.widget.props.initialText)this.controller.text=this.widget.props.initialText;if(this.widget.props.initialImages)this.imageAttachments=[...this.widget.props.initialImages];this.focusNode.requestFocus()}_handleInsertImage=async(A)=>{if(this.imageAttachments.length>=x9)return!1;let Q=await AV(A);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,A]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(A){let Q=O0.of(A),{colors:$,app:B}=Q,J=g1.of(A).size.height,E=Math.max(Math.floor(J*0.5),10),F=new ZW({controller:this.controller,triggers:[new XY],completionBuilder:this.widget.props.completionBuilder,onSubmitted:(V)=>{this.widget.props.onSubmit(V.trim(),this.imageAttachments)},theme:$,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:z4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),Y=new v4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),Z=new b0({constraints:new w1({maxHeight:E}),padding:K0.symmetric(1,0),child:Y}),U=new b0({padding:K0.symmetric(1,0),child:new d({text:new w("",void 0,[new w("Command: ",new T({color:$.foreground})),new w(this.widget.props.commandName,new T({color:B.command,bold:!0}))])})}),X=new b0({padding:K0.symmetric(1,0),child:new d({text:this.isConfirmingClearInput?new w("",void 0,[new w("Esc",new T({color:B.keybind})),new w(" again to clear input",new T({color:$.foreground,dim:!0}))]):new w("",void 0,[new w("Press ",new T({color:$.foreground,dim:!0})),new w("Enter",new T({color:B.keybind})),new w(" to submit, ",new T({color:$.foreground,dim:!0})),new w("Esc",new T({color:B.keybind})),new w(" to clear",new T({color:$.foreground,dim:!0}))])})}),G=[U,new X0({height:1}),new R1({child:Z}),new X0({height:1}),X];return new b0({decoration:{border:c1.all(new l1($.foreground,1,"solid")),color:$.background},padding:K0.all(1),child:new S0({children:G})})}}class c21 extends u0{props;constructor(A){super();this.props=A}createState(){return new k66}}function S66(A){let $=new Date().getTime()-A.getTime(),B=Math.floor($/60000),D=Math.floor($/3600000),J=Math.floor($/86400000);if(B<1)return"just now";if(B<60)return`${B}m ago`;if(D<24)return`${D}h ago`;if(J<7)return`${J}d ago`;return A.toLocaleDateString()}class l21 extends H1{props;debugLabel="NewsFeedPicker";constructor(A){super();this.props=A}build(A){let Q=[...this.props.entries].sort((D,J)=>J.pubDate.getTime()-D.pubDate.getTime()),$=Math.max(0,...Q.map((D)=>S66(D.pubDate).length));return new cA({items:Q,getLabel:(D)=>D.title,onAccept:(D)=>this.props.onSelect?.(D),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(D,J,E,F)=>{let Y=O0.of(F),{colors:Z}=Y,U=Y.app,X=J?U.selectionBackground:void 0,G=J?U.selectionForeground:Z.foreground,V=Z.mutedForeground,K=(z,W)=>new X0({width:W,child:s0.end([new d({text:new w(z,new T({color:V}))})])});return new b0({decoration:X?{color:X}:void 0,padding:K0.symmetric(2,0),child:new s0({children:[new R1({child:new d({text:new w(D.title,new T({color:G})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),K(S66(D.pubDate),$)]})})}})}}class L${static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!L$._instance)L$._instance=new L$;return L$._instance}get allExpanded(){return this._allExpanded}setAllExpanded(A){if(this._allExpanded===A)return;this._allExpanded=A,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(A){return this._listeners.add(A),()=>this.removeListener(A)}removeListener(A){this._listeners.delete(A)}_notifyListeners(){for(let A of this._listeners)A()}}c0();class f66 extends R0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let A=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!A.ok){u.error("Failed to load labels",A.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=A.result,this.isLoading=!1,this.setState()}catch(A){u.error("Failed to load labels",A),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(A){let Q=A.trim().toLowerCase();if(Q.length===0)return null;if(Q.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Q))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(A){return this.getValidationError(A)===null&&A.length>0}getAvailableLabels(){let A=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!A.includes(Q.name))}shouldShowCreateMarker(A){if(A.length===0||this.isLoading)return!1;let Q=A.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let $=this.widget.props.currentLabels||[],B=this.labels.some((J)=>J.name===Q),D=$.includes(Q);return!B&&!D}build(A){let Q=O0.of(A),{app:$,colors:B}=Q,D=this.currentQuery.trim().toLowerCase(),J=D.length>0?this.getValidationError(D):null,E=this.getAvailableLabels(),Y=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...E];return new cA({title:"Add Label",items:Y,getLabel:(Z)=>{if("__isCreateMarker"in Z)return this.currentQuery.trim().toLowerCase();return Z.name},onAccept:(Z)=>{if("__isCreateMarker"in Z)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(Z.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:J||"Type to create a new label",renderItem:(Z,U,X,G)=>{let V=U?$.selectionBackground:void 0,K=U?$.selectionForeground:B.foreground;if("__isCreateMarker"in Z&&Z.__isCreateMarker){let W=this.currentQuery.trim().toLowerCase();return new b0({decoration:V?{color:V}:void 0,padding:K0.symmetric(2,0),child:new d({text:new w("",void 0,[new w("Create new label: ",new T({color:K})),new w(W,new T({color:K,bold:!0}))])})})}return new b0({decoration:V?{color:V}:void 0,padding:K0.symmetric(2,0),child:new d({text:new w(Z.name,new T({color:K}))})})},filterItem:(Z,U)=>{if(this.currentQuery!==U)this.currentQuery=U,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in Z&&Z.__isCreateMarker)return this.shouldShowCreateMarker(U);let G=U.trim().toLowerCase();return G.length===0||Z.name.includes(G)},sortItems:(Z,U,X)=>{let G="__isCreateMarker"in Z.item&&Z.item.__isCreateMarker,V="__isCreateMarker"in U.item&&U.item.__isCreateMarker;if(G&&!V)return-1;if(!G&&V)return 1;return U.score-Z.score}})}}class i21 extends u0{props;constructor(A){super();this.props=A}createState(){return new f66}}class VU extends u0{props;constructor(A){super();this.props=A}createState(){return new y66}}class y66 extends R0{_spinner=new CA;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(A){let Q=O0.of(A),{colors:$,app:B}=Q,D=c1.all(new l1($.foreground,1,"solid")),J=this._spinner.toBraille(),E=new d({textAlign:"center",text:new w("",void 0,[new w(J,new T({color:B.processing})),new w(" ",void 0),new w(this.widget.props.message,new T({color:$.foreground}))])}),Y=[new R1({child:new S0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[E]})})];if(this.widget.props.onAbort)Y.push(new X0({height:2,child:new b0({padding:K0.symmetric(2,0),child:new d({text:new w("",new T({dim:!0}),[new w("Press ",new T({color:$.foreground})),new w("Esc",new T({color:$.info})),new w(" to cancel",new T({color:$.foreground}))])})})}));let Z=new b0({decoration:new R4($.background,D),child:new X0({width:60,height:7,child:new S0({mainAxisAlignment:"start",children:Y})})});if(this.widget.props.onAbort)return new k4({debugLabel:"LoadingDialog",child:new v4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(U)=>{if(U.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:Z})});return Z}}class EV extends u0{props;constructor(A){super();this.props=A}createState(){return new x66}}class x66 extends R0{scrollController=new v6;scrollAreaKey=new G8("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof n8}resolveFooterStyle(A){if(this.isWidgetMessage(A))return A.footerStyle;return"default"}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let $=Q.size;if(typeof $.height==="number"&&$.height>0)return this.viewportHeight=$.height,$.height}return this.viewportHeight}build(A){let Q=O0.of(A),$=this.widget.props.message,B=(()=>{if(this.isWidgetMessage($))return{title:$.title,type:$.type};if($ instanceof Error&&$.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:$.message};if($ instanceof Error&&$.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:$.message};let U=GG0($);return{title:U.title,type:U.type,description:U.description}})(),D=B.type==="error"?Q.app.toolError:Q.app.command,J=c1.all(new l1(Q.colors.border,1,"solid")),E=new b0({padding:K0.symmetric(1,0),child:new d({text:new w(B.title,new T({color:D,bold:!0}))})}),F=this.isWidgetMessage($)?$.widget:new d({text:new w(B.description,new T({color:Q.colors.foreground})),selectable:!0}),Y=new R1({child:new K5({child:new b0({padding:K0.symmetric(1,0),child:new s0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new R1({child:new k6({controller:this.scrollController,autofocus:!0,child:F})}),new q8({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let U=this.scrollController.maxScrollExtent,X=this.scrollController.offset,G=this.getViewportHeight(),V=U+G;return{totalContentHeight:Math.max(V,0),viewportHeight:Math.max(G,1),scrollOffset:Math.max(X,0)}}})]})})})}),Z=new b0({padding:K0.symmetric(1,0),child:new d({text:(()=>{if(this.widget.props.onRetry)return new w("",void 0,[new w("Press ",new T({color:Q.colors.foreground,dim:!0})),new w("R",new T({color:Q.app.keybind})),new w(" to retry, ",new T({color:Q.colors.foreground,dim:!0})),new w("Esc",new T({color:Q.app.keybind})),new w(" to cancel",new T({color:Q.colors.foreground,dim:!0}))]);let U=this.resolveFooterStyle(this.widget.props.message);if(U==="none")return new w("",new T({color:Q.colors.foreground,dim:!0}));if(U==="help"){let X=new T({color:Q.app.keybind}),G=new T({color:Q.colors.foreground,dim:!0});return new w("",G,[new w("Press ",G),new w("Escape",X),new w(" to close • Use ",G),new w("↑↓",X),new w(" or ",G),new w("j/k",X),new w(" to scroll",G)])}return new w("Press any key to close",new T({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new k4({debugLabel:"MessageDialog",child:new i4({fit:"expand",children:[new O1({onClick:()=>{},child:new X0}),new v4({onKey:(U)=>{if(this.widget.props.onRetry&&U.key==="r")return this.widget.props.onRetry(),"handled";if(U.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new b0({decoration:{border:J,color:Q.colors.background},padding:K0.all(1),child:new S0({mainAxisAlignment:"center",children:[E,new X0({height:1}),Y,Z]})})})]})})}}G5();B4();class b66 extends u0{props;constructor(A){super();this.props=A}createState(){return new h66}}class h66 extends R0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((A)=>{this.plugins=A,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(A){let Q=n0.file(this.widget.props.cwd),$=B1.relativePath(Q,XA(A));if($!==null&&$!==""&&$!==".."&&!$.startsWith("../"))return $;return l3(A)}statusIcon(A){let Q=n2.default(),{colors:$,app:B}=Q;switch(A){case"loading":return{icon:"◌",color:$.warning};case"active":return{icon:"✓",color:B.toolSuccess};case"error":return{icon:"✗",color:B.toolError}}}build(A){let Q=O0.of(A),{app:$}=Q;if(this.plugins.length===0)return new d({text:new w("No plugins found.",new T({dim:!0}))});let B=[],D=this.plugins.length,J=this.plugins.filter((Y)=>Y.status==="active").length,E=this.plugins.reduce((Y,Z)=>Y+Z.registeredCommands.length,0),F=this.plugins.reduce((Y,Z)=>Y+Z.registeredTools.length,0);if(B.push(new w(`${J}/${D} ${U4(D,"plugin")} active`,new T({bold:!0}))),E>0||F>0)B.push(new w(` (${E} ${U4(E,"command")}, ${F} ${U4(F,"tool")})`,new T({dim:!0})));B.push(new w(`
7084
+ `))}if(K)X.push(new w(" ",U)),X.push(new w("Total: ",U)),X.push(new w(J(z),Z))}return new b0({decoration:{color:F.background,border:c1.all(new l1(F.border,1,"rounded"))},child:new d({text:new w(void 0,void 0,X)})})}c0();function _66(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}G5();r5();b5();d$();f9();g2();cQ();Hq();a4();sk();CT();u1();c0();f9();class p21{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(A,Q){this.enabled=A;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 A=Array.from(this.commandCounts.entries()).map(([Q,$])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1779886645-g59fcb2"},parameters:{metadata:{count:$}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await z90(Q,this.configService)}catch(Q){u.error("Failed to export command telemetry events",Q)}}async submit(A){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(A)||0;this.commandCounts.set(A,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class mC extends u0{props;constructor(A){super();this.props=A}createState(){return new T66}}class T66 extends R0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(A){let Q=($)=>{this.setState(()=>{this._state=$(this._state)})};return this.widget.props.builder(A,Q,this._state)}}class v66 extends R0{controller=new k2;focusNode=new s6({debugLabel:"CommandArgumentPrompt",onKey:(A)=>{if(A.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(A){let Q=O0.of(A),{colors:$,app:B}=Q,D=this.widget.props.isRequiredArg??!0,J=this.controller.text.trim().length>0,E=!D||J,F=c1.all(new l1($.foreground,1,"solid")),Y=new GB({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(V)=>{let K=V.trim();if(D&&K.length===0)return;this.widget.props.onSubmit(K)},autofocus:!0,style:{textColor:$.foreground,border:null},maxLines:1}),Z=new s0({children:[new b0({decoration:{color:$.background},child:new d({text:new w(">",new T({color:$.foreground}))})}),new R1({child:Y})]}),U=new b0({padding:K0.symmetric(1,0),child:new d({text:this.widget.props.title?new w(this.widget.props.title,new T({color:B.command,bold:!0})):new w("",void 0,[new w("Command: ",new T({color:$.foreground})),new w(this.widget.props.commandName,new T({color:B.command,bold:!0}))])})}),X=[];if(E)X.push(new w("Enter",new T({color:B.keybind}))),X.push(new w(" to submit, ",new T({color:$.foreground,dim:!0})));X.push(new w("Esc",new T({color:B.keybind}))),X.push(new w(" to cancel",new T({color:$.foreground,dim:!0})));let G=new b0({padding:K0.symmetric(1,0),child:new d({text:new w("",void 0,X)})});return new b0({decoration:{border:F,color:$.background},padding:K0.all(1),child:new S0({children:[U,new X0({height:1}),Z,new U3,G]})})}}class B10 extends u0{props;constructor(A){super();this.props=A}createState(){return new v66}}cQ();class k66 extends R0{controller=new k2;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new s6({debugLabel:"CommandMultilinePrompt",onKey:(A)=>{if(A.key==="Escape"){if(this.isConfirmingClearInput){if(this.controller.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[],this.imagePaths=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.controller.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return this.widget.props.onDismiss(),"handled"}return"ignored"}});initState(){if(this.widget.props.initialText)this.controller.text=this.widget.props.initialText;if(this.widget.props.initialImages)this.imageAttachments=[...this.widget.props.initialImages];this.focusNode.requestFocus()}_handleInsertImage=async(A)=>{if(this.imageAttachments.length>=x9)return!1;let Q=await AV(A);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,A]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(A){let Q=O0.of(A),{colors:$,app:B}=Q,J=g1.of(A).size.height,E=Math.max(Math.floor(J*0.5),10),F=new ZW({controller:this.controller,triggers:[new XY],completionBuilder:this.widget.props.completionBuilder,onSubmitted:(V)=>{this.widget.props.onSubmit(V.trim(),this.imageAttachments)},theme:$,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:z4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),Y=new v4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),Z=new b0({constraints:new w1({maxHeight:E}),padding:K0.symmetric(1,0),child:Y}),U=new b0({padding:K0.symmetric(1,0),child:new d({text:new w("",void 0,[new w("Command: ",new T({color:$.foreground})),new w(this.widget.props.commandName,new T({color:B.command,bold:!0}))])})}),X=new b0({padding:K0.symmetric(1,0),child:new d({text:this.isConfirmingClearInput?new w("",void 0,[new w("Esc",new T({color:B.keybind})),new w(" again to clear input",new T({color:$.foreground,dim:!0}))]):new w("",void 0,[new w("Press ",new T({color:$.foreground,dim:!0})),new w("Enter",new T({color:B.keybind})),new w(" to submit, ",new T({color:$.foreground,dim:!0})),new w("Esc",new T({color:B.keybind})),new w(" to clear",new T({color:$.foreground,dim:!0}))])})}),G=[U,new X0({height:1}),new R1({child:Z}),new X0({height:1}),X];return new b0({decoration:{border:c1.all(new l1($.foreground,1,"solid")),color:$.background},padding:K0.all(1),child:new S0({children:G})})}}class c21 extends u0{props;constructor(A){super();this.props=A}createState(){return new k66}}function S66(A){let $=new Date().getTime()-A.getTime(),B=Math.floor($/60000),D=Math.floor($/3600000),J=Math.floor($/86400000);if(B<1)return"just now";if(B<60)return`${B}m ago`;if(D<24)return`${D}h ago`;if(J<7)return`${J}d ago`;return A.toLocaleDateString()}class l21 extends H1{props;debugLabel="NewsFeedPicker";constructor(A){super();this.props=A}build(A){let Q=[...this.props.entries].sort((D,J)=>J.pubDate.getTime()-D.pubDate.getTime()),$=Math.max(0,...Q.map((D)=>S66(D.pubDate).length));return new cA({items:Q,getLabel:(D)=>D.title,onAccept:(D)=>this.props.onSelect?.(D),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(D,J,E,F)=>{let Y=O0.of(F),{colors:Z}=Y,U=Y.app,X=J?U.selectionBackground:void 0,G=J?U.selectionForeground:Z.foreground,V=Z.mutedForeground,K=(z,W)=>new X0({width:W,child:s0.end([new d({text:new w(z,new T({color:V}))})])});return new b0({decoration:X?{color:X}:void 0,padding:K0.symmetric(2,0),child:new s0({children:[new R1({child:new d({text:new w(D.title,new T({color:G})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),K(S66(D.pubDate),$)]})})}})}}class L${static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!L$._instance)L$._instance=new L$;return L$._instance}get allExpanded(){return this._allExpanded}setAllExpanded(A){if(this._allExpanded===A)return;this._allExpanded=A,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(A){return this._listeners.add(A),()=>this.removeListener(A)}removeListener(A){this._listeners.delete(A)}_notifyListeners(){for(let A of this._listeners)A()}}c0();class f66 extends R0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let A=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!A.ok){u.error("Failed to load labels",A.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=A.result,this.isLoading=!1,this.setState()}catch(A){u.error("Failed to load labels",A),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(A){let Q=A.trim().toLowerCase();if(Q.length===0)return null;if(Q.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Q))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(A){return this.getValidationError(A)===null&&A.length>0}getAvailableLabels(){let A=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!A.includes(Q.name))}shouldShowCreateMarker(A){if(A.length===0||this.isLoading)return!1;let Q=A.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let $=this.widget.props.currentLabels||[],B=this.labels.some((J)=>J.name===Q),D=$.includes(Q);return!B&&!D}build(A){let Q=O0.of(A),{app:$,colors:B}=Q,D=this.currentQuery.trim().toLowerCase(),J=D.length>0?this.getValidationError(D):null,E=this.getAvailableLabels(),Y=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...E];return new cA({title:"Add Label",items:Y,getLabel:(Z)=>{if("__isCreateMarker"in Z)return this.currentQuery.trim().toLowerCase();return Z.name},onAccept:(Z)=>{if("__isCreateMarker"in Z)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(Z.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:J||"Type to create a new label",renderItem:(Z,U,X,G)=>{let V=U?$.selectionBackground:void 0,K=U?$.selectionForeground:B.foreground;if("__isCreateMarker"in Z&&Z.__isCreateMarker){let W=this.currentQuery.trim().toLowerCase();return new b0({decoration:V?{color:V}:void 0,padding:K0.symmetric(2,0),child:new d({text:new w("",void 0,[new w("Create new label: ",new T({color:K})),new w(W,new T({color:K,bold:!0}))])})})}return new b0({decoration:V?{color:V}:void 0,padding:K0.symmetric(2,0),child:new d({text:new w(Z.name,new T({color:K}))})})},filterItem:(Z,U)=>{if(this.currentQuery!==U)this.currentQuery=U,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in Z&&Z.__isCreateMarker)return this.shouldShowCreateMarker(U);let G=U.trim().toLowerCase();return G.length===0||Z.name.includes(G)},sortItems:(Z,U,X)=>{let G="__isCreateMarker"in Z.item&&Z.item.__isCreateMarker,V="__isCreateMarker"in U.item&&U.item.__isCreateMarker;if(G&&!V)return-1;if(!G&&V)return 1;return U.score-Z.score}})}}class i21 extends u0{props;constructor(A){super();this.props=A}createState(){return new f66}}class VU extends u0{props;constructor(A){super();this.props=A}createState(){return new y66}}class y66 extends R0{_spinner=new CA;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(A){let Q=O0.of(A),{colors:$,app:B}=Q,D=c1.all(new l1($.foreground,1,"solid")),J=this._spinner.toBraille(),E=new d({textAlign:"center",text:new w("",void 0,[new w(J,new T({color:B.processing})),new w(" ",void 0),new w(this.widget.props.message,new T({color:$.foreground}))])}),Y=[new R1({child:new S0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[E]})})];if(this.widget.props.onAbort)Y.push(new X0({height:2,child:new b0({padding:K0.symmetric(2,0),child:new d({text:new w("",new T({dim:!0}),[new w("Press ",new T({color:$.foreground})),new w("Esc",new T({color:$.info})),new w(" to cancel",new T({color:$.foreground}))])})})}));let Z=new b0({decoration:new R4($.background,D),child:new X0({width:60,height:7,child:new S0({mainAxisAlignment:"start",children:Y})})});if(this.widget.props.onAbort)return new k4({debugLabel:"LoadingDialog",child:new v4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(U)=>{if(U.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:Z})});return Z}}class EV extends u0{props;constructor(A){super();this.props=A}createState(){return new x66}}class x66 extends R0{scrollController=new v6;scrollAreaKey=new G8("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof n8}resolveFooterStyle(A){if(this.isWidgetMessage(A))return A.footerStyle;return"default"}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let $=Q.size;if(typeof $.height==="number"&&$.height>0)return this.viewportHeight=$.height,$.height}return this.viewportHeight}build(A){let Q=O0.of(A),$=this.widget.props.message,B=(()=>{if(this.isWidgetMessage($))return{title:$.title,type:$.type};if($ instanceof Error&&$.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:$.message};if($ instanceof Error&&$.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:$.message};let U=GG0($);return{title:U.title,type:U.type,description:U.description}})(),D=B.type==="error"?Q.app.toolError:Q.app.command,J=c1.all(new l1(Q.colors.border,1,"solid")),E=new b0({padding:K0.symmetric(1,0),child:new d({text:new w(B.title,new T({color:D,bold:!0}))})}),F=this.isWidgetMessage($)?$.widget:new d({text:new w(B.description,new T({color:Q.colors.foreground})),selectable:!0}),Y=new R1({child:new K5({child:new b0({padding:K0.symmetric(1,0),child:new s0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new R1({child:new k6({controller:this.scrollController,autofocus:!0,child:F})}),new q8({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let U=this.scrollController.maxScrollExtent,X=this.scrollController.offset,G=this.getViewportHeight(),V=U+G;return{totalContentHeight:Math.max(V,0),viewportHeight:Math.max(G,1),scrollOffset:Math.max(X,0)}}})]})})})}),Z=new b0({padding:K0.symmetric(1,0),child:new d({text:(()=>{if(this.widget.props.onRetry)return new w("",void 0,[new w("Press ",new T({color:Q.colors.foreground,dim:!0})),new w("R",new T({color:Q.app.keybind})),new w(" to retry, ",new T({color:Q.colors.foreground,dim:!0})),new w("Esc",new T({color:Q.app.keybind})),new w(" to cancel",new T({color:Q.colors.foreground,dim:!0}))]);let U=this.resolveFooterStyle(this.widget.props.message);if(U==="none")return new w("",new T({color:Q.colors.foreground,dim:!0}));if(U==="help"){let X=new T({color:Q.app.keybind}),G=new T({color:Q.colors.foreground,dim:!0});return new w("",G,[new w("Press ",G),new w("Escape",X),new w(" to close • Use ",G),new w("↑↓",X),new w(" or ",G),new w("j/k",X),new w(" to scroll",G)])}return new w("Press any key to close",new T({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new k4({debugLabel:"MessageDialog",child:new i4({fit:"expand",children:[new O1({onClick:()=>{},child:new X0}),new v4({onKey:(U)=>{if(this.widget.props.onRetry&&U.key==="r")return this.widget.props.onRetry(),"handled";if(U.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new b0({decoration:{border:J,color:Q.colors.background},padding:K0.all(1),child:new S0({mainAxisAlignment:"center",children:[E,new X0({height:1}),Y,Z]})})})]})})}}G5();B4();class b66 extends u0{props;constructor(A){super();this.props=A}createState(){return new h66}}class h66 extends R0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((A)=>{this.plugins=A,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(A){let Q=n0.file(this.widget.props.cwd),$=B1.relativePath(Q,XA(A));if($!==null&&$!==""&&$!==".."&&!$.startsWith("../"))return $;return l3(A)}statusIcon(A){let Q=n2.default(),{colors:$,app:B}=Q;switch(A){case"loading":return{icon:"◌",color:$.warning};case"active":return{icon:"✓",color:B.toolSuccess};case"error":return{icon:"✗",color:B.toolError}}}build(A){let Q=O0.of(A),{app:$}=Q;if(this.plugins.length===0)return new d({text:new w("No plugins found.",new T({dim:!0}))});let B=[],D=this.plugins.length,J=this.plugins.filter((Y)=>Y.status==="active").length,E=this.plugins.reduce((Y,Z)=>Y+Z.registeredCommands.length,0),F=this.plugins.reduce((Y,Z)=>Y+Z.registeredTools.length,0);if(B.push(new w(`${J}/${D} ${U4(D,"plugin")} active`,new T({bold:!0}))),E>0||F>0)B.push(new w(` (${E} ${U4(E,"command")}, ${F} ${U4(F,"tool")})`,new T({dim:!0})));B.push(new w(`
7085
7085
 
7086
7086
  `));for(let Y of this.plugins){let{icon:Z,color:U}=this.statusIcon(Y.status),X=this.getRelativePath(Y.uri);if(B.push(new w(`${Z} `,new T({color:U}))),B.push(new w(X,new T({bold:!0}))),B.push(new w(` ${Y.status}`,new T({dim:!0}))),B.push(new w(`
7087
7087
  `)),Y.status==="active"&&Y.registeredEvents.length>0)B.push(new w(" Events: ",new T({dim:!0}))),B.push(new w(Y.registeredEvents.join(", "),new T({color:$.link}))),B.push(new w(`
@@ -7260,7 +7260,7 @@ ${t.content||""}`:t.content||"",p0=[],h0=t.baseDir.startsWith("file://")?XW0(t.b
7260
7260
  `)}function N56(A,Q){A.command("usage").description("Show your current Amp usage and credit balance").action(async($,B)=>{let D=B.optsWithGlobals(),J=await Q(D),E=await J.settings.get("proxy"),F=X64({settings:{url:J.ampURL,proxy:E},secrets:{getToken:(Z,U)=>J.secrets.get(Z,U)}}),Y=await o4.userDisplayBalanceInfo({},{config:F});if(!Y.ok){if(Y.error.code==="auth-required")process.stderr.write(e0.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(e0.red("Error: ")+Y.error.message+`
7261
7261
  `),process.exit(1)}process.stdout.write(await f65(Y.result.displayText)+`
7262
7262
  `),process.exit(0)})}var B85=m10.join(aB,"logs","headless.log"),o71=m10.join(Hl,"device-id.json"),D85=`cli-tui-${a96(16).toString("hex")}`;Vv4();async function J85(){let A=await Promise.all(ML.map(async(Q)=>{try{return{query:Q,hasConfigs:(await Q.listConfigs()).length>0}}catch($){return u.debug("Failed to detect query-based IDE integration",{ideName:Q.ideName,error:$}),{query:Q,hasConfigs:!1}}}));for(let Q of A)if(Q.hasConfigs)return Q.query;return}function r96(){J85().then((A)=>{if(A){let Q=x90(A.ideName);if(Q)WL(Q)}})}try{if(process.platform==="win32")await Promise.resolve().then(() => h4(yb(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){O$.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
7263
- `)}function E85(A){process.emitWarning=(Q,$,B,D)=>{let J=typeof Q==="string"?Q:Q.message||String(Q),E=$||"Warning",F=!1;A.warn(J,{name:E,code:B})}}function t8(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")BD("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")BD("experimental.agentMode",Q.mode)}function F85(A,Q){if(!i6(Q))return;if(!E9(Q.user.email)){if(A.model)throw new h1("The --model flag is only available for Amp employees.",1);BD("internal.model",void 0);return}if(A.model)BD("internal.model",U85(A.model))}function m96(A){let Q=A.indexOf(":");if(Q===-1)throw new h1(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let $=A.slice(0,Q).trim(),B=A.slice(Q+1).trim();if(!$||!B)throw new h1(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function Y85(A){if(A===void 0)return;let Q=A.trim();if(I90(Q))return Q;throw new h1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function Z85(A,Q){if(o5(A,Q))return;let $=$D(A)?.levels,B=$?` Allowed for ${A}: ${$.join(", ")}.`:"";throw new h1(`Reasoning effort "${Q}" is not available for ${A} mode.${B}`,1)}function U85(A){if(!A.includes("="))return m96(A),A;let Q={};for(let $ of A.split(",")){let B=$.trim();if(!B)continue;let D=B.indexOf("=");if(D===-1)throw new h1(`Invalid mode-specific model entry "${B}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let J=B.slice(0,D).trim(),E=B.slice(D+1).trim();if(!J)throw new h1(`Missing mode name in "${B}". Expected "mode=provider:model".`,1);if(!E)throw new h1(`Missing model value for mode "${J}". Expected "${J}=provider:model".`,1);m96(E),Q[J]=E}if(Object.keys(Q).length===0)throw new h1("No valid model overrides found in --model flag value.",1);return Q}function AI0(A,Q,$){let B=Number(A);if(!Number.isInteger(B)||B<$.min)throw new lY0(`${Q} must be an integer >= ${$.min}`);if($.max!==void 0&&B>$.max)throw new lY0(`${Q} must be an integer <= ${$.max}`);return B}function X85(A,Q){if(A.getOptionValueSourceWithGlobals("sp")==="cli"&&Q.sp)return Q.sp;if(A.getOptionValueSourceWithGlobals("systemPrompt")==="cli"&&Q.systemPrompt)return Q.systemPrompt;return}async function G85(A){try{return await o96(A,"utf-8")}catch{return A}}async function r71(A,Q,$){let B=X85(A,Q);if(!B)return;let D=i6($)?$.features:[],J=i6($)?$.user.email:void 0;if(!c10(D,x$.HARNESS_SYSTEM_PROMPT)&&!(J&&E9(J)))throw new h1("You are not allowed to do this.",1);BD("systemPrompt",await G85(B))}function c10(A,Q){return A?.some(($)=>$.name===Q&&$.enabled)??!1}function V85(A){return A!=="pending"}function vW(A){if(!i6(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function K85(A){let Q=vW(A);if(Q)return Q.id;if(sY(A))throw Error(A.error.message);throw Error("unreachable")}function z85(A){try{let Q=new URL(A);return Q.hostname==="localhost"||Q.hostname==="127.0.0.1"}catch{return A.includes("localhost")||A.includes("127.0.0.1")}}function W85(A){let B=z85(A)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new h1(`Couldn't connect to the Amp server at ${A}.`,1,B)}function d10(A,Q){let $=Qs0(Error(A.error.message));if($.message===a9.networkOffline||$.message===a9.networkTimeout)return W85(Q);if($.message!==a9.internalBug)return new h1($.message,1,$.suggestion);return new h1(A.error.message.replace(/^Error: /,""),1)}async function I85(){if(process.versions.bun)return!1;try{return await xG()==="npm"}catch(A){return u.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var d96=[{name:"notifications",long:"notifications",type:"flag",description:(A)=>`${A?"Enable":"Disable"} notification alerts (audio locally, terminal bell over SSH or with AMP_FORCE_BEL; enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(A)=>`${A?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??eY,description:`Custom settings file path (overrides the default location ${eY})`},{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 ${Ms})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","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:O9(),description:(A)=>A?"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:(A)=>A?"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:(A)=>A?"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:"mode",long:"mode",short:"m",type:"option",default:NL.SMART.key,description:`Set the agent mode (${QD({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(QD().map((A)=>A.mode))),hiddenChoices:["frontier"]},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Disable thread-actors mode and use the legacy worker runtime",hidden:!0},{name:"neoOrb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"hideWelcome",long:"hide-welcome",type:"switch",description:"Skip the welcome experience on startup",hidden:!0},{name:"showWelcome",long:"show-welcome",type:"switch",description:"Show the welcome experience on startup",hidden:!0},{name:"observe",long:"observe",type:"option",description:"Open the Neo TUI as an observer of an existing thread (thread ID or URL)",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless thread-actor executor (no TUI). Optionally provide a thread ID to connect to existing thread, otherwise create one.",hidden:!0},{name:"sp",long:"sp",type:"option",description:"Custom system prompt text or file path",hidden:!0},{name:"systemPrompt",long:"system-prompt",type:"option",description:"Custom system prompt text",hidden:!0},{name:"model",long:"model",type:"option",description:'Override the model. Use "provider:model" for all modes, or "mode=provider:model,mode=provider:model" for mode-specific overrides',hidden:!0}],p96=(A)=>("deprecated"in A)&&A.deprecated===!0,H85=(A)=>("hidden"in A)&&A.hidden===!0,q85=(A)=>("default"in A),N85=(A)=>("default"in A)?A.default:void 0;function QI0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let $=Y85(Q.effort);if($!==void 0)Z85(Q.mode,$);return $}function C85(A,Q){let $=Q.args[0],B=Q.commands.map((J)=>J.name());if($&&!$.includes(" ")&&$.length<30&&!/[./\\]/.test($)){let J=B.filter((F)=>$.includes(F)||F.includes($)),E="Run amp --help for a list of available commands.";if(J.length>0)E=`Did you mean: ${J.join(", ")}? Or run amp --help for all commands.`;throw new h1(a9.unknownCommand($),1,E)}}async function DI0(A){return{...A,getThreadEnvironment:nZ,getEnvironmentData:(Q,$)=>$z(Q,$),skillService:A.skillService,fileChangeTrackerStorage:new FO,generateThreadTitle:dZ4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>BF(A.configService),pluginService:A.pluginService}}function s96(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:nZ,getEnvironmentData:(Q,$)=>$z(Q,$)}}var $I0=n0.file($85.homedir()),s71=process.env.XDG_CONFIG_HOME?n0.file(process.env.XDG_CONFIG_HOME):B1.joinPath($I0,".config");async function s2(A,Q,$){let B=$?.deferAuth??!1,D=$?.skipToolProviders??!1;x44("0.0.1779872458-g7b0532");let J=P90({storage:A.settings,secretStorage:A.secrets,workspaceRoot:g0.of(n0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:$I0,userConfigDir:s71}),E=A.secrets.get("apiKey",A.ampURL),F=BF(J),Y=null,Z=()=>{return},U=new Promise((Q0)=>{Z=Q0}),X=E.then(async(Q0)=>{if(!Q0&&!B)await U;return Y??=F.subscribe(()=>{}),S1(F.pipe(i3(V85)))});X.catch(()=>{return}),T06(J);let G=await J.getLatest();u.debug("Global configuration initialized",{settingsKeys:Object.keys(G.settings)});let V=!1;{let Q0=await E;if(V=Boolean(Q0),u.info("API key lookup before login",{found:Boolean(Q0),ampURL:A.ampURL,deferAuth:B}),!Q0)if(B)u.info("No API key found, continuing startup with deferred auth");else{Q3.write(`No API key found. Starting login flow...
7263
+ `)}function E85(A){process.emitWarning=(Q,$,B,D)=>{let J=typeof Q==="string"?Q:Q.message||String(Q),E=$||"Warning",F=!1;A.warn(J,{name:E,code:B})}}function t8(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")BD("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")BD("experimental.agentMode",Q.mode)}function F85(A,Q){if(!i6(Q))return;if(!E9(Q.user.email)){if(A.model)throw new h1("The --model flag is only available for Amp employees.",1);BD("internal.model",void 0);return}if(A.model)BD("internal.model",U85(A.model))}function m96(A){let Q=A.indexOf(":");if(Q===-1)throw new h1(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let $=A.slice(0,Q).trim(),B=A.slice(Q+1).trim();if(!$||!B)throw new h1(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function Y85(A){if(A===void 0)return;let Q=A.trim();if(I90(Q))return Q;throw new h1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function Z85(A,Q){if(o5(A,Q))return;let $=$D(A)?.levels,B=$?` Allowed for ${A}: ${$.join(", ")}.`:"";throw new h1(`Reasoning effort "${Q}" is not available for ${A} mode.${B}`,1)}function U85(A){if(!A.includes("="))return m96(A),A;let Q={};for(let $ of A.split(",")){let B=$.trim();if(!B)continue;let D=B.indexOf("=");if(D===-1)throw new h1(`Invalid mode-specific model entry "${B}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let J=B.slice(0,D).trim(),E=B.slice(D+1).trim();if(!J)throw new h1(`Missing mode name in "${B}". Expected "mode=provider:model".`,1);if(!E)throw new h1(`Missing model value for mode "${J}". Expected "${J}=provider:model".`,1);m96(E),Q[J]=E}if(Object.keys(Q).length===0)throw new h1("No valid model overrides found in --model flag value.",1);return Q}function AI0(A,Q,$){let B=Number(A);if(!Number.isInteger(B)||B<$.min)throw new lY0(`${Q} must be an integer >= ${$.min}`);if($.max!==void 0&&B>$.max)throw new lY0(`${Q} must be an integer <= ${$.max}`);return B}function X85(A,Q){if(A.getOptionValueSourceWithGlobals("sp")==="cli"&&Q.sp)return Q.sp;if(A.getOptionValueSourceWithGlobals("systemPrompt")==="cli"&&Q.systemPrompt)return Q.systemPrompt;return}async function G85(A){try{return await o96(A,"utf-8")}catch{return A}}async function r71(A,Q,$){let B=X85(A,Q);if(!B)return;let D=i6($)?$.features:[],J=i6($)?$.user.email:void 0;if(!c10(D,x$.HARNESS_SYSTEM_PROMPT)&&!(J&&E9(J)))throw new h1("You are not allowed to do this.",1);BD("systemPrompt",await G85(B))}function c10(A,Q){return A?.some(($)=>$.name===Q&&$.enabled)??!1}function V85(A){return A!=="pending"}function vW(A){if(!i6(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function K85(A){let Q=vW(A);if(Q)return Q.id;if(sY(A))throw Error(A.error.message);throw Error("unreachable")}function z85(A){try{let Q=new URL(A);return Q.hostname==="localhost"||Q.hostname==="127.0.0.1"}catch{return A.includes("localhost")||A.includes("127.0.0.1")}}function W85(A){let B=z85(A)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new h1(`Couldn't connect to the Amp server at ${A}.`,1,B)}function d10(A,Q){let $=Qs0(Error(A.error.message));if($.message===a9.networkOffline||$.message===a9.networkTimeout)return W85(Q);if($.message!==a9.internalBug)return new h1($.message,1,$.suggestion);return new h1(A.error.message.replace(/^Error: /,""),1)}async function I85(){if(process.versions.bun)return!1;try{return await xG()==="npm"}catch(A){return u.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var d96=[{name:"notifications",long:"notifications",type:"flag",description:(A)=>`${A?"Enable":"Disable"} notification alerts (audio locally, terminal bell over SSH or with AMP_FORCE_BEL; enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(A)=>`${A?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??eY,description:`Custom settings file path (overrides the default location ${eY})`},{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 ${Ms})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","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:O9(),description:(A)=>A?"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:(A)=>A?"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:(A)=>A?"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:"mode",long:"mode",short:"m",type:"option",default:NL.SMART.key,description:`Set the agent mode (${QD({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(QD().map((A)=>A.mode))),hiddenChoices:["frontier"]},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Disable thread-actors mode and use the legacy worker runtime",hidden:!0},{name:"neoOrb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"hideWelcome",long:"hide-welcome",type:"switch",description:"Skip the welcome experience on startup",hidden:!0},{name:"showWelcome",long:"show-welcome",type:"switch",description:"Show the welcome experience on startup",hidden:!0},{name:"observe",long:"observe",type:"option",description:"Open the Neo TUI as an observer of an existing thread (thread ID or URL)",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless thread-actor executor (no TUI). Optionally provide a thread ID to connect to existing thread, otherwise create one.",hidden:!0},{name:"sp",long:"sp",type:"option",description:"Custom system prompt text or file path",hidden:!0},{name:"systemPrompt",long:"system-prompt",type:"option",description:"Custom system prompt text",hidden:!0},{name:"model",long:"model",type:"option",description:'Override the model. Use "provider:model" for all modes, or "mode=provider:model,mode=provider:model" for mode-specific overrides',hidden:!0}],p96=(A)=>("deprecated"in A)&&A.deprecated===!0,H85=(A)=>("hidden"in A)&&A.hidden===!0,q85=(A)=>("default"in A),N85=(A)=>("default"in A)?A.default:void 0;function QI0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let $=Y85(Q.effort);if($!==void 0)Z85(Q.mode,$);return $}function C85(A,Q){let $=Q.args[0],B=Q.commands.map((J)=>J.name());if($&&!$.includes(" ")&&$.length<30&&!/[./\\]/.test($)){let J=B.filter((F)=>$.includes(F)||F.includes($)),E="Run amp --help for a list of available commands.";if(J.length>0)E=`Did you mean: ${J.join(", ")}? Or run amp --help for all commands.`;throw new h1(a9.unknownCommand($),1,E)}}async function DI0(A){return{...A,getThreadEnvironment:nZ,getEnvironmentData:(Q,$)=>$z(Q,$),skillService:A.skillService,fileChangeTrackerStorage:new FO,generateThreadTitle:dZ4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>BF(A.configService),pluginService:A.pluginService}}function s96(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:nZ,getEnvironmentData:(Q,$)=>$z(Q,$)}}var $I0=n0.file($85.homedir()),s71=process.env.XDG_CONFIG_HOME?n0.file(process.env.XDG_CONFIG_HOME):B1.joinPath($I0,".config");async function s2(A,Q,$){let B=$?.deferAuth??!1,D=$?.skipToolProviders??!1;x44("0.0.1779886645-g59fcb2");let J=P90({storage:A.settings,secretStorage:A.secrets,workspaceRoot:g0.of(n0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:$I0,userConfigDir:s71}),E=A.secrets.get("apiKey",A.ampURL),F=BF(J),Y=null,Z=()=>{return},U=new Promise((Q0)=>{Z=Q0}),X=E.then(async(Q0)=>{if(!Q0&&!B)await U;return Y??=F.subscribe(()=>{}),S1(F.pipe(i3(V85)))});X.catch(()=>{return}),T06(J);let G=await J.getLatest();u.debug("Global configuration initialized",{settingsKeys:Object.keys(G.settings)});let V=!1;{let Q0=await E;if(V=Boolean(Q0),u.info("API key lookup before login",{found:Boolean(Q0),ampURL:A.ampURL,deferAuth:B}),!Q0)if(B)u.info("No API key found, continuing startup with deferred auth");else{Q3.write(`No API key found. Starting login flow...
7264
7264
  `);let M0=await w85(A),n=await A.secrets.get("apiKey",A.ampURL);if(u.info("Login flow completed",{success:M0,storedKeyPresent:Boolean(n),ampURL:A.ampURL}),!M0)await MG(),process.exit(1);V=!0,Z()}}{let Q0=await J.getLatest(),M0=Q0.settings.url,n=Q0.secrets.isSet?.[M0];u.info("Config secrets state after login",{configURL:M0,apiKeySet:n?.apiKey??!1})}let K=B?"pending":await X;if(!B)u.info("Server status resolved",{status:"ready",isAuthenticated:i6(K),isError:sY(K),errorMessage:sY(K)?K.error.message:void 0});F85(Q,K);let z=X.then((Q0)=>K85(Q0));z.catch(()=>{return});let W=!Q.takeMeBack&&i6(K)&&c10(K.features,x$.THREAD_ACTORS_TUI),I=!1;if(process.env.AMP_DISABLE_PLUGINS==="1")u.warn("Ignoring AMP_DISABLE_PLUGINS outside development");let H=I?"off":W?"all":process.env.PLUGINS??"permissions",{toolService:q,dispose:N}=zP4({configService:J}),C=new Map,M=()=>C.clear(),O=new Rb0(J,A.settings.getWorkspaceRootPath()),R=IF4({configService:J}),k=AB4({configService:J,trustStore:O,skillMCPServers:R.skillMCPServers,uploadImageAttachments:W,createOAuthProvider:async(Q0,M0,n)=>{let a=`${Q0}:${M0}`,t=C.get(a);if(t)return u.debug("Reusing existing OAuth provider for server",{serverName:Q0,serverUrl:M0}),t;u.debug("Creating OAuth provider for server",{serverName:Q0,serverUrl:M0});let e=(async()=>{let E0=new PL(A.secrets),J0=await E0.getClientInfo(Q0,M0),C0=n?.scopes??J0?.scopes,w0=Sx4();u.info("OAuth headless mode check",{useHeadless:w0,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:Q3.isTTY});let _0;if(w0)_0=A.executeMode?kx4():vx4(Q0);let U0=new xS0({storage:E0,serverName:Q0,serverUrl:M0,clientId:n?.clientId??J0?.clientId,clientSecret:n?.clientSecret??J0?.clientSecret,authUrl:n?.authUrl??J0?.authUrl,tokenUrl:n?.tokenUrl??J0?.tokenUrl,scopes:C0,headlessAuthHandler:_0});return u.debug("OAuth provider created",{serverName:Q0,serverUrl:M0,hasManualClientId:!!(n?.clientId??J0?.clientId),willUseDCR:!(n?.clientId??J0?.clientId),scopes:C0,headlessMode:w0,executeMode:A.executeMode}),U0})();return C.set(a,e),e}}),_=na0({configService:J,spawn:GY0}),f=Q.headless?B06():void 0,g=f??new wK0({configService:J}),b=g instanceof wK0?g:void 0;if(b)b.pluginExecutorKind="local";let v=new o1(null),x=null,c=W&&!I?[...E06(G.settings)?[{name:"permissions",entryPoint:y51}]:[],{name:"thread-visibility",entryPoint:Z06(J,()=>X.then(vW),()=>x,(Q0)=>{x=Q0}),alwaysLoad:!0}]:[],p=db0({configService:J,platform:g,loadGlobalPlugins:qe0(J),pluginFilter:H,activeThread$:v,internalPlugins:c}),h=nB4(p),i=[k,_,h],r;if(D)r=new Map;else if(A.executeMode){let Q0=await QR4({toolService:q,providers:i,initialTimeout:15000});r=Q0.registrations;for(let[M0,n]of Q0.initErrors)u.warn(`${M0} provider initialization slow or failed:`,n)}else r=aa0({toolService:q,providers:i});if(Q.jetbrains)WL("JetBrains");else if(Q.ide&&Jb4())WL("VS Code");else if(Q.ide&&Eb4())WL("Neovim");else if(Q.ide&&(!W||A.executeMode||Q.takeMeBack))r96();if(A.executeMode)b44(!0);let A0,V0=s5.status.pipe(N1((Q0)=>Boolean(Q0.connected&&Q0.authenticated&&Q0.ideName&&g64(Q0.ideName))),T4()).subscribe((Q0)=>{if(Q0){if(!A0)A0=q.registerTool(AR4)}else A0?.dispose(),A0=void 0}),Y0;if(!A.executeMode){let Q0=await A.settings.get("fuzzy.alwaysIncludePaths")??[];Y0=new LU0(process.cwd(),{alwaysIncludePaths:Q0},!0)}else Y0=new class extends LU0{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let I0=new dm0(va(J,{usesThreadActors:!1}),{maxThreads:200});u.info("Starting Amp background services");let B0=new p51,j0={configService:J,toolService:q,mcpService:k,skillService:R,toolboxService:_,trustStore:O,threadService:I0,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:Y0,terminal:B0,pluginService:p,pluginPlatform:b,headlessPluginPlatform:f,activeThread$:v,serverStatus:K,serverStatusPromise:X,viewerUserIDPromise:z,hasAPIKeyAtStartup:V,consumeDraftNewThreadVisibility:()=>{let Q0=x;return x=null,Q0}};return{...j0,async asyncDispose(){if(j0.mcpService.hasAuthenticatingClients())u.info("Waiting for OAuth authentication to complete before exit..."),await j0.mcpService.waitForAuthentication();for(let Q0 of r.values())Q0.dispose();await j0.mcpService.dispose(),M(),await j0.threadService.asyncDispose(),j0.configService.unsubscribe(),Y?.unsubscribe(),N(),j0.fuzzyServer.dispose(),j0.settingsStorage[Symbol.dispose](),V0.unsubscribe(),A0?.dispose(),await j0.pluginService.dispose()}}}async function w85(A){if(!A.executeMode){if(!await zX0("Would you like to log in to Amp? [(y)es, (n)o]: "))return Q3.write(`Login cancelled. Run the command again to retry.
7265
7265
  `),!1}return await t96(A)}async function t96(A){let Q=a96(32).toString("hex"),$=await hy(A.ampURL,Q),B=new AbortController;try{await oY($,B.signal)}catch(J){u.error("Error opening browser",{error:J})}let D=await hy(A.ampURL,Q,!1);Q3.write(`If your browser does not open automatically, visit:
7266
7266
 
@@ -7268,7 +7268,7 @@ ${e0.blue.bold(D)}
7268
7268
 
7269
7269
  `);try{return await Cg4(A.ampURL,Q,A.secrets,B),Q3.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(J){return u.error("Login failed",{error:J}),O$.write(`
7270
7270
  Login failed: ${J instanceof Error?J.message:String(J)}
7271
- `),!1}}async function M85(A,Q,$){let B=await Q.get("apiKey",A);if(!B)throw new h1("No Amp API key found. Run `amp login` first.",1);let D=e25("curl",["-H",`Authorization: Bearer ${B}`,...$],{stdio:"inherit"});process.exitCode=await new Promise((J,E)=>{D.on("error",E),D.on("close",(F)=>J(F??1))})}function L85(A){let Q=new NN().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((I)=>{if(I.code==="commander.help"||I.code==="commander.version"||I.exitCode===0)kj(),process.exit(0);let H=I.originalError??I;fv4(H)}),Zd4(Q,{version:"0.0.1779872458-g7b0532",buildTimestamp:"2026-05-27T09:05:52.208Z",buildType:"release"}),Q.addHelpText("after",$b4()),Q.configureHelp({formatHelp:Bb4}),Q.command("logout").description("Log out by removing stored API key").action(async(I,H)=>{let q=H.optsWithGlobals(),N=await d3(q);await S85(N)}),Q.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(I,H)=>{let q=H.optsWithGlobals(),N=await d3(q);await k85(N,await h51(q,N.settings))}),vv4(Q,d3);let B=Q.command("internal",{hidden:!0}).description("Internal commands").command("curl [args...]").description("Internal: run curl with the current Amp API key as a bearer token").allowUnknownOption(!0).allowExcessArguments(!0).action(async(...I)=>{let H=I.find((M)=>typeof M==="object"&&M!==null&&typeof M.optsWithGlobals==="function")??B,q=I.filter((M)=>M!==H).flatMap((M)=>Array.isArray(M)?M:typeof M==="string"?[M]:[]),N=H.optsWithGlobals(),C=await d3(N);await M85(C.ampURL,C.secrets,q),process.exit(process.exitCode??0)});Q.command("git-credential-helper [action]",{hidden:!0}).summary("Git credential helper for GitHub").description("Internal: implements the git credential helper protocol. Used inside sandboxes to authenticate git operations with GitHub.").action(async(I,H,q)=>{let N=q.optsWithGlobals(),C=await d3(N);await Lx4(I??"get",C.ampURL,C.secrets),process.exit(process.exitCode??0)}),Q.command("sign-commit",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements the gpg signing interface for git commit signing. Used inside sandboxes as gpg.program.").allowUnknownOption().action(async(I,H)=>{let q=H.optsWithGlobals(),N=await d3(q);await Ox4(N.ampURL,N.secrets),process.exit(process.exitCode??0)}),Q.command("keyboard-tester",{hidden:!0}).summary("Keyboard input tester").description("Internal: stream parsed terminal input events as JSONL.").option("--raw","Log raw incoming terminal bytes before parsing").action(async(I)=>{await Nh4({raw:I.raw===!0}),process.exit(process.exitCode??0)}),Q.command("live-sync [threadIDOrURL]",{hidden:!0}).summary("Mirror live DTW thread changes into the current checkout").description("Experimental: watch a v2 thread URL or ID and mirror its live working-tree changes into your local checkout, or apply the current snapshot once and exit.").addHelpText("after",["","Examples:"," amp live-sync T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync --apply T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync https://ampcode.com/threads/T-5928a90d-d53b-488f-a829-4e36442142ee"].join(`
7271
+ `),!1}}async function M85(A,Q,$){let B=await Q.get("apiKey",A);if(!B)throw new h1("No Amp API key found. Run `amp login` first.",1);let D=e25("curl",["-H",`Authorization: Bearer ${B}`,...$],{stdio:"inherit"});process.exitCode=await new Promise((J,E)=>{D.on("error",E),D.on("close",(F)=>J(F??1))})}function L85(A){let Q=new NN().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((I)=>{if(I.code==="commander.help"||I.code==="commander.version"||I.exitCode===0)kj(),process.exit(0);let H=I.originalError??I;fv4(H)}),Zd4(Q,{version:"0.0.1779886645-g59fcb2",buildTimestamp:"2026-05-27T13:02:21.391Z",buildType:"release"}),Q.addHelpText("after",$b4()),Q.configureHelp({formatHelp:Bb4}),Q.command("logout").description("Log out by removing stored API key").action(async(I,H)=>{let q=H.optsWithGlobals(),N=await d3(q);await S85(N)}),Q.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(I,H)=>{let q=H.optsWithGlobals(),N=await d3(q);await k85(N,await h51(q,N.settings))}),vv4(Q,d3);let B=Q.command("internal",{hidden:!0}).description("Internal commands").command("curl [args...]").description("Internal: run curl with the current Amp API key as a bearer token").allowUnknownOption(!0).allowExcessArguments(!0).action(async(...I)=>{let H=I.find((M)=>typeof M==="object"&&M!==null&&typeof M.optsWithGlobals==="function")??B,q=I.filter((M)=>M!==H).flatMap((M)=>Array.isArray(M)?M:typeof M==="string"?[M]:[]),N=H.optsWithGlobals(),C=await d3(N);await M85(C.ampURL,C.secrets,q),process.exit(process.exitCode??0)});Q.command("git-credential-helper [action]",{hidden:!0}).summary("Git credential helper for GitHub").description("Internal: implements the git credential helper protocol. Used inside sandboxes to authenticate git operations with GitHub.").action(async(I,H,q)=>{let N=q.optsWithGlobals(),C=await d3(N);await Lx4(I??"get",C.ampURL,C.secrets),process.exit(process.exitCode??0)}),Q.command("sign-commit",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements the gpg signing interface for git commit signing. Used inside sandboxes as gpg.program.").allowUnknownOption().action(async(I,H)=>{let q=H.optsWithGlobals(),N=await d3(q);await Ox4(N.ampURL,N.secrets),process.exit(process.exitCode??0)}),Q.command("keyboard-tester",{hidden:!0}).summary("Keyboard input tester").description("Internal: stream parsed terminal input events as JSONL.").option("--raw","Log raw incoming terminal bytes before parsing").action(async(I)=>{await Nh4({raw:I.raw===!0}),process.exit(process.exitCode??0)}),Q.command("live-sync [threadIDOrURL]",{hidden:!0}).summary("Mirror live DTW thread changes into the current checkout").description("Experimental: watch a v2 thread URL or ID and mirror its live working-tree changes into your local checkout, or apply the current snapshot once and exit.").addHelpText("after",["","Examples:"," amp live-sync T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync --apply T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync https://ampcode.com/threads/T-5928a90d-d53b-488f-a829-4e36442142ee"].join(`
7272
7272
  `)).option("--apply <threadIDOrURL>","Apply the current DTW thread snapshot once and exit").option("--checkout","Automatically check out the thread commit when it differs").option("--skip-checkout","Skip the startup checkout prompt when commits differ").action(async(I,H,q)=>{if(I&&H.apply)throw new h1("Choose either a positional thread ID/URL or --apply <thread-id>, not both.",1);let N=H.apply??I;if(!N||N.trim().length===0)Q3.write(`live-sync watches a v2 thread and mirrors its live changes locally. Use --apply <thread-id> to materialize the current snapshot once and exit.
7273
7273
 
7274
7274
  `),q.outputHelp(),process.exit(0);let C=S8(N)??EB(N),M=q.optsWithGlobals(),O=await d3(M);t8(q,M);let R=await s2(O,M),k=!1;try{if(H.checkout&&H.skipCheckout)throw new h1("Choose either --checkout or --skip-checkout, not both.",1);if(sY(R.serverStatus))throw d10(R.serverStatus,O.ampURL);let _=i6(R.serverStatus)?R.serverStatus.features:void 0;if(!c10(_,x$.V2))throw new h1("live-sync is not enabled for your user",1);await Ug4({ampURL:O.ampURL,threadId:C,configService:R.configService,threadService:R.threadService,apiKey:process.env.AMP_API_KEY,applyOnce:typeof H.apply==="string",checkoutMode:H.checkout?"always":H.skipCheckout?"never":"prompt",promptForYesNo:zX0}),k=!0}finally{if(await R.asyncDispose(),k)process.exit(0)}});let D=async(I,H,q)=>{P90({storage:H.settings,secretStorage:H.secrets,workspaceRoot:g0.of(n0.file(process.cwd())),defaultAmpURL:H.ampURL,homeDir:$I0,userConfigDir:s71});let N={...H,executeMode:!1};await BI0(N,{...I,openThreadSwitcher:!0},q,A)},J=Q.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").option("--include-archived","Include archived threads in the list").option("--limit <number>","Maximum number of threads to return",(I)=>AI0(I,"--limit",{min:1,max:500})).option("--offset <number>","Number of threads to skip",(I)=>AI0(I,"--offset",{min:0})).action(async(I,H)=>{let q=H.optsWithGlobals(),N=await d3(q);await n96(q,N,H)});J.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(I,H)=>{let q=H.optsWithGlobals(),N=await d3(q);await n85(q,N,H)}),J.command("continue [threadIDOrURLs...]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, interactive mode shows a picker. Use --last to continue the last thread for the current mode directly. When multiple thread are given, all are resumed and the first is shown in the foreground.").option("--last","Continue the last thread for the current mode directly").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(I,H,q)=>{let N=q.optsWithGlobals(),C=await d3(N),M=Array.isArray(I)?I:[];if(H.pick)O$.write(`${e0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
@@ -7301,8 +7301,8 @@ ${O}
7301
7301
  `))}),H.args.length>0)C85(N,H);await BI0(N,q,H,A)}),Sb4(Q),Q}async function p10(A,Q){await qQ(($)=>py($,A,Q))}async function c96(A,Q,$){let B=Date.now(),[D,J]=await Promise.all([o4.getThreadLinkInfo({thread:A},{config:Q}),$]);if(u.getChild("fetchAndStartThread").info(`Ownership check in ${Date.now()-B}ms`),D.ok){let E=D.result.creatorUserID;if(E&&E!==J&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new h1(`Cannot resume thread created by another user.
7302
7302
 
7303
7303
  This thread belongs to a different user and cannot be continued for security reasons. Set AMP_RESUME_OTHER_USER_THREADS_INSECURE=1 to bypass this check.`)}}async function e96(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await RK0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await RK0()).trimEnd(),stdinInput:null}}function A76(A,Q,$){if(A.remote&&!Q)throw new h1("The -r/--remote flag requires --execute mode",1,'Use: amp --remote --execute "your message"');if(A.streamJson&&!Q)throw new h1("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(A.streamJsonInput&&!Q)throw new h1("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(A.streamJsonInput&&!A.streamJson)throw new h1("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(A.stats&&A.streamJson)throw new h1("The --stats and --stream-json flags are mutually exclusive output formats",1,'Use one or the other: amp --execute "your message" --stats OR amp --execute "your message" --stream-json');if(A.stats&&!Q)throw new h1("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(A.archive&&!Q)throw new h1("The --archive flag requires --execute mode",1,'Use: amp --execute "your message" --archive');if(A.streamJsonInput&&typeof A.execute==="string"&&A.execute.trim()!=="")throw new h1("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"},{"type":"image","source":{"type":"base64","media_type":"image/png","data":"..."}}]}}' | amp --execute --stream-json --stream-json-input`);if(Q&&$===""&&!A.streamJsonInput&&!A.headless)throw new h1("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"
7304
- Or pipe via stdin: echo "your message" | amp --execute`)}function O85(){G54([j90.parse({tool:"*",action:"allow"})]),b34({bypass:!0})}function j85(A){if(A.threadId&&!S9(A.threadId))delete A.threadId}async function BI0(A,Q,$,B){if(Q.headless)return R85(A,Q,$);let D=await s2(A,Q),J=await D.serverStatusPromise,E=i6(J)&&c10(J.features,x$.THREAD_ACTORS_TUI),F=E&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await D.asyncDispose(),new h1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!E)throw await D.asyncDispose(),new h1("--show-welcome is only available with the new Amp CLI feature flag",1);if(F){let Y=!A.executeMode&&await I85();return O85(),j85(Q),u85(A,Q,$,D,{showNpmMigrationWelcome:Y})}else{if(Q.threadId&&S9(Q.threadId)){let Y=await o4.getThreadLinkInfo({thread:Q.threadId},{config:D.configService}).catch(()=>null);if(Y?.ok&&Y.result.usesThreadActors)throw await D.asyncDispose(),new h1(`Thread ${Q.threadId} was created with the Neo TUI and cannot be continued in the legacy CLI.`,1,"Re-run without --take-me-back to continue this thread.")}return P85(A,Q,$,B,{dependencies:D})}}async function R85(A,Q,$){let B=(I,H)=>{let q=Number(process.hrtime.bigint()-H)/1e6,N=lr0();u.info("Startup phase",{phase:I,phaseMs:Math.round(q),sinceMainMs:N===null?void 0:Math.round(N)})};t8($,Q);let D=process.hrtime.bigint(),J=await s2(A,Q);B("runMainThread:createThreadDependencies",D);let{serverStatus:E}=J;if(sY(E))throw d10(E,A.ampURL);let F=i6(E)?E:null,Y=F?.user.email;await r71($,Q,E);let Z=vW(E),U=ix(Q,Z);if(U instanceof Error)R3(U.message);if(F&&!qL(Q.mode,Y))throw new h1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!Y||!E9(Y)))throw new h1("Headless executor mode is only available for Amp employees",1);LZ0();let G=await J.secretStorage.get("apiKey",A.ampURL);if(!G)throw new h1("API key required for headless mode. Please run `amp login` first.",1);let V=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(V&&!S9(V))throw new h1(`Invalid thread ID: ${V}`,1);let K=V?void 0:await l85({dependencies:J,apiKey:G,visibility:U??void 0}),z=V??K?.threadId;if(!z)throw new h1("Failed to resolve headless thread ID",1);let W=await bx4(z);if(W.status==="already-running")await J.asyncDispose(),await MG(),process.exit(0);try{await Px4({ampURL:A.ampURL,apiKey:G,workspaceRoot:process.cwd(),threadId:z,ownerUserId:K?.ownerUserId,threadVersion:K?.threadVersion,agentMode:K?.agentMode,initialToolDiscovery:Promise.all([J.mcpService.initialized,J.toolboxService.initialized,J.pluginService.initialized]).then(()=>{return}),configService:J.configService,mcpService:J.mcpService,toolService:J.toolService,skillService:J.skillService,pluginService:J.pluginService,pluginPlatform:J.headlessPluginPlatform})}finally{await W.release(),await J.asyncDispose()}await MG(),process.exit(0)}async function u85(A,Q,$,B,D){let{userInput:J,stdinInput:E}=await e96(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;A76({...Q,streamJson:F},A.executeMode,J),t8($,Q),qv4(),LZ0();let Y=Q.threadId,Z=Q.resumeThreadIDs??(Y?[Y]:[]),U=Q.observe?S8(Q.observe)??EB(Q.observe):void 0,X=await B.serverStatusPromise;if(sY(X))throw d10(X,A.ampURL);let G=vW(X),V=ix(Q,G);if(V instanceof Error)R3(V.message);if(A.executeMode&&Q.remote){if(!i6(X)||!E9(X.user.email))throw new h1("Remote execute mode is only available for Amp employees",1);await x51(J,E,B.configService,Q.mode),await B.asyncDispose(),await MG(),process.exit(0)}let K=null,z=async()=>{let H=B.consumeDraftNewThreadVisibility();if(H!==null)return H;return K??=(async()=>{let q=await Ls(A.settings,process.cwd(),G,V);if(q instanceof Error)R3(q.message);return q})(),K},W=await B.secretStorage.get("apiKey",A.ampURL);if(!W)throw new h1("API key required. Please run `amp login` first.",1);let I=i6(X)&&E9(X.user.email);if(A.executeMode){if(Z.length>1)throw new h1("Execute mode can only resume one thread.",1);j01(B.mcpService,A.settings);try{let H=QI0($,Q),q=await rz(),N=Y?H:IX0({agentMode:Q.mode,explicitEffort:H,sessionState:q}),C=Y?void 0:HX0(await gy(B.configService),{agentMode:Q.mode,explicitEffort:H,sessionState:q}),M=Y?void 0:await z(),O=await Xx4({apiKey:W,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:B,userInput:J,stdinInput:E,stats:!!Q.stats,streamJson:F,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:N,labels:Q.label,initialThreadID:Y,initialThreadMeta:M,initialSettings:C});if(await p10(O,"execute"),Q.archive)await B.threadService.archive(O,!0)}finally{await B.asyncDispose()}await MG(),process.exit(0)}else{let H=QI0($,Q),q=D.showNpmMigrationWelcome?"npm-migration":"intro",N=bU0("0.0.1779872458-g7b0532",B.settingsStorage,{startDelayMs:3000}),C=new WX0(B.mcpService,A.settings.getWorkspaceRootPath()),M=va(B.configService),O=new D10(B.fuzzyServer),R=process.cwd();await oe4({ampURL:A.ampURL,apiKey:W,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??eJ(A.ampURL),configService:B.configService,toolService:B.toolService,pluginPlatform:B.pluginPlatform,pluginService:B.pluginService,skillService:B.skillService,mcpService:B.mcpService,readFileSystemDirectory:({uri:k})=>wy({workspaceRoot:R},k),completionBuilder:O,updateService:N,workspaceRoot:R,listThreads:()=>M.listThreads(),getThreadFromServer:(k)=>M.getThread(k),toolboxes:B.toolboxService.toolboxes,isInternalUser:I,settingsFilePath:B.settingsStorage.getSettingsFilePath(),workspaceSettingsFilePath:B.settingsStorage.getWorkspaceSettingsPath(),mcpTrustHandler:C,setActiveThreadID:(k)=>B.activeThread$.next(k),dispose:()=>{return C.dispose(),N.dispose(),B.asyncDispose()}},{initialThreadIDs:U?[U]:Z,initialUserInput:J||void 0,getDefaultNewThreadVisibility:z,onFirstFrame:Q.ide?r96:void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!U,splashOrbVisualStyle:"neo",hideNeoWelcome:!!Q.hideWelcome,showNeoWelcome:Q.showWelcome,neoWelcomeVariant:q,initialAgentMode:$.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:H}),process.exit(0)}}async function P85(A,Q,$,B,D){let J=process.hrtime.bigint(),E=(B0,j0)=>{let Q0=Number(process.hrtime.bigint()-j0)/1e6,M0=lr0();u.info("Startup phase",{phase:B0,phaseMs:Math.round(Q0),sinceMainMs:M0===null?void 0:Math.round(M0)})},{userInput:F,stdinInput:Y}=await e96(Q),Z=!!Q.streamJson||!!Q.streamJsonThinking;A76({...Q,streamJson:Z},A.executeMode,F),t8($,Q);let U=process.hrtime.bigint(),X=D?.dependencies??await s2(A,Q),G=X.hasAPIKeyAtStartup,V=X.serverStatus==="pending";if(u.info("Interactive auth startup mode",{deferInteractiveAuth:V,hasAPIKeyAtStartup:G,executeMode:A.executeMode,headless:Boolean(Q.headless)}),!D)E("runMainThread:createThreadDependencies",U);let{serverStatus:K}=X;if(!V&&sY(K))throw d10(K,A.ampURL);let z=i6(K)?K:null,W=z?.user.email,I=!!(W&&E9(W));if(I)LZ0();if(!V)await r71($,Q,K);let H=vW(K),q=H?.features??[],N=H?.team??null,C=ix(Q,H);if(C instanceof Error)R3(C.message);if(z&&!qL(Q.mode,W))throw new h1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(A.executeMode&&Q.remote){if(!W||!E9(W))throw new h1("Remote execute mode is only available for Amp employees",1);await x51(F,Y,X.configService,Q.mode),await X.asyncDispose(),process.exit(0)}let M=Q.threadId&&S9(Q.threadId)?Q.threadId:void 0;U=process.hrtime.bigint();let O=await DI0(X);E("runMainThread:createWorkerDeps",U);let R=A.executeMode?void 0:async(B0)=>p10(B0,"interactive"),k={threadService:X.threadService,workerDeps:O,createThread:async(B0)=>{let j0=V?await X.serverStatusPromise:K,Q0=await Ls(A.settings,process.cwd(),vW(j0),C);if(Q0 instanceof Error)R3(Q0.message);return w91(O,{threadMeta:Q0,agentMode:B0??Q.mode,onFirstAssistantMessage:R})},validateThreadOwnership:async(B0,j0)=>{if(j0?.nonBlockingOwnershipCheck){c96(B0,X.configService,X.viewerUserIDPromise).catch((Q0)=>{if(Q0 instanceof h1){if(j0.onOwnershipError){j0.onOwnershipError(Q0,B0);return}fz(Q0,B0);return}u.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})});return}try{await c96(B0,X.configService,X.viewerUserIDPromise)}catch(Q0){if(Q0 instanceof h1)throw Q0;u.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})}},switchThreadVisibility:C,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:R,handleError:fz},_=async()=>{try{return W56(k,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(B0){if(B0 instanceof h1)throw B0;throw await fz(B0,Q.threadId),Error("handleError should have called process.exit()")}},f=(async()=>{if(V){u.info("Skipping initial free tier status fetch until auth is complete");return}try{let B0=await X.configService.getLatest(),j0=Rc(B0),Q0=await o4.getUserFreeTierStatus({},{config:X.configService,signal:AbortSignal.timeout(j0)});if(Q0.ok)return u.info("User free tier status:",Q0),Q0.result;return}catch(B0){u.error("Failed to fetch free tier status:",B0);return}})(),b=!A.executeMode?new n51:null,v,x=null;if(b)v=b,x=(async()=>{let B0=V?await X.serverStatusPromise:X.serverStatus;if(sY(B0))throw d10(B0,A.ampURL);await r71($,Q,B0);let j0=process.hrtime.bigint(),Q0=await _();if(E("runMainThread:createThreadPool",j0),b.attach(Q0),F){let M0=await S1(Q0.threadHandles$);if(!M0)throw new h1("No active thread is available yet.",1);await M0.sendMessage({content:[{type:"text",text:F}]})}})(),x.catch(async(B0)=>{let j0=B0 instanceof Error?B0:Error(String(B0));b.setInitError(j0),await fz(B0,Q.threadId)});else U=process.hrtime.bigint(),v=await _(),E("runMainThread:createThreadPool",U);let c=Q.notifications!==void 0?Q.notifications:!A.executeMode;U=process.hrtime.bigint();let p=await X.configService.getLatest();if(E("runMainThread:configService.getLatest",U),U=process.hrtime.bigint(),$16({configService:X.configService,threadService:X.threadService,threadPool:v,config:p,useNotifications:c}),E("runMainThread:createLegacyTuiNotificationService",U),A.executeMode){j01(X.mcpService,A.settings);let B0=QI0($,Q),j0=await rz(),Q0=M?B0:IX0({agentMode:Q.mode,explicitEffort:B0,sessionState:j0}),M0={userInput:F,stdinInput:Y,dependencies:X,streamJson:Z,streamJsonInput:!!Q.streamJsonInput,streamJsonThinking:!!Q.streamJsonThinking,stats:!!Q.stats,ampURL:A.ampURL,isInternalUser:I,agentMode:Q.mode,reasoningEffort:Q0,labels:Q.label},n=await $k4({threadPool:v,...M0});if(await p10(n,"execute"),Q.archive)await X.threadService.archive(n,!0);await X.asyncDispose(),process.exit(0)}let h=!1,i=!1;if(Q.jetbrains||Q.ide){await h90();let B0=await QZ({jetbrainsOnly:Q.jetbrains});if(B0.length===0){if(Q.jetbrains)h=!await X.configService.get("jetbrains.skipInstall")}else if(B0.length===1){let j0=B0[0];if(j0)s5.selectConfig(j0)}else i=!0}U=process.hrtime.bigint();let r=bU0("0.0.1779872458-g7b0532",X.settingsStorage,{startDelayMs:3000});E("runMainThread:createUpdateService",U),U=process.hrtime.bigint();let A0=new WX0(X.mcpService,A.settings.getWorkspaceRootPath());if(E("runMainThread:createMcpTrustHandler",U),F&&A.executeMode){let B0=await S1(v.threadHandles$);if(!B0)throw new h1("No active thread is available yet.",1);await B0.sendMessage({content:[{type:"text",text:F}]})}U=process.hrtime.bigint();let V0=await rz();E("runMainThread:loadSessionState",U),u.info("Loaded session state:",V0);let Y0=QI0($,Q),I0={...V0,launchCount:V0.launchCount+1,lastReasoningEffortByMode:Y0?{...V0.lastReasoningEffortByMode,[Q.mode]:Y0}:V0.lastReasoningEffortByMode};qQ((B0)=>({...B0,launchCount:B0.launchCount+1}));try{if(U=process.hrtime.bigint(),await P16({history:new Ut,fuzzyServer:X.fuzzyServer,settingsStorage:X.settingsStorage,threadService:X.threadService,skillService:X.skillService,configService:X.configService,secretStorage:X.secretStorage,internalAPIClient:o4,threadPool:v,createSystemPromptDeps:async()=>s96(X),ideClient:s5,mcpService:X.mcpService,toolboxService:X.toolboxService,mcpTrustHandler:A0,updateService:r,pluginPlatform:X.pluginPlatform,pluginService:X.pluginService},{initialServerStatus:X.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:X.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:M,showJetBrainsInstaller:h,showIdePickerHint:i,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:D85,logFile:{path:B},sessionState:I0,freeTierStatusPromise:f,workspace:N??null,features:q,isInternalUser:I,initialAgentMode:$.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-27T09:05:52.208Z"},(B0)=>new A21({...B0,threadPool:B0.threadPool},(j0)=>new N91({...j0,threadState:j0.threadState}))),E("runMainThread:mountApp-returned",U),x)await x}finally{await v.dispose().catch((B0)=>{u.error("Failed to dispose thread pool during shutdown",B0)})}await X.asyncDispose(),E("runMainThread:dependencies.asyncDispose",J),process.exit(0)}async function d3(A){if(u.info("Initializing CLI context",{argv:process.argv,nodeEnv:"production",hasAmpURL:Boolean(process.env.AMP_URL),hasAmpAPIKey:Boolean(process.env.AMP_API_KEY),hasSettingsFile:Boolean(process.env.AMP_SETTINGS_FILE)}),A.interactive)O$.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7305
- `);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,$=process.stdout.isTTY&&process.stderr.isTTY;u.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let B=await JB4({get:async(F)=>{if(F!==gi)return;try{let Y=await o96(o71,"utf-8");return JSON.parse(Y).installationID}catch{return}},set:async(F,Y)=>{if(F!==gi)return;await A85(m10.dirname(o71),{recursive:!0}),await Q85(o71,JSON.stringify({installationID:Y},null,2),{mode:384})}},{clientType:"cli",platform:D$0()});h44(B);let D=await R06({...A,workspaceTrust:{current:!0,changes:uc},getHook:process.env.AMP_URL?(F,Y)=>{if(F==="url")return Promise.resolve(process.env.AMP_URL);return Y()}:void 0});if(A.mcpConfig){let F=await Tg4(A.mcpConfig);D=vg4(D,F)}let J=m10.dirname(D.getSettingsFilePath());qP4(Hl,J),D=et1(D);let E=await D.get("url","admin")??await D.get("url","global");if(!E)E=e7;if(u.info("Resolved Amp URL",{ampURL:E,settingsFile:D.getSettingsFilePath(),workspaceRoot:D.getWorkspaceRootPath()}),!IH(E))u.info("Targeting custom Amp server",{ampURL:E});return{executeMode:Q,isTTY:$,ampURL:E,settings:D,secrets:C06(await h51(A,D))}}function _85(A){let Q={};for(let $=0;$<A.length;$++){let B=A[$];if(B?.startsWith("--")){let J=B.slice(2).replace(/-([a-z])/g,(F,Y)=>Y.toUpperCase()),E=A[$+1];if(E&&!E.startsWith("--"))Q[J]=E,$++}}return Q}function T85(A,Q){let $=A.includes("--headless")||A.some((D)=>D.startsWith("--headless=")),B=m10.resolve(Q.logFile??process.env.AMP_LOG_FILE??($?B85:Ms));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:B}}async function v85(){Gv4();let A=_85(process.argv),Q=T85(process.argv,A),$=Nv4(Q);zZ0("silent");let B=process.argv.includes("--no-color"),D=process.argv.includes("--color"),J=process.stdout.isTTY&&process.stderr.isTTY;if(B||!D&&!J)e0.level=0;if(E85(u),u.info("Starting Amp CLI.",{version:"0.0.1779872458-g7b0532",buildTimestamp:"2026-05-27T09:05:52.208Z"}),process.platform==="win32"&&BR())ub4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new h1(a9.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await L85($).parseAsync(process.argv)}IP4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await v85().catch(fz)});async function k85(A,Q){let $=A.ampURL.includes("localhost")||A.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!$)await A.settings.set("url",process.env.AMP_URL,"global"),Q3.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7304
+ Or pipe via stdin: echo "your message" | amp --execute`)}function O85(){G54([j90.parse({tool:"*",action:"allow"})]),b34({bypass:!0})}function j85(A){if(A.threadId&&!S9(A.threadId))delete A.threadId}async function BI0(A,Q,$,B){if(Q.headless)return R85(A,Q,$);let D=await s2(A,Q),J=await D.serverStatusPromise,E=i6(J)&&c10(J.features,x$.THREAD_ACTORS_TUI),F=E&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await D.asyncDispose(),new h1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!E)throw await D.asyncDispose(),new h1("--show-welcome is only available with the new Amp CLI feature flag",1);if(F){let Y=!A.executeMode&&await I85();return O85(),j85(Q),u85(A,Q,$,D,{showNpmMigrationWelcome:Y})}else{if(Q.threadId&&S9(Q.threadId)){let Y=await o4.getThreadLinkInfo({thread:Q.threadId},{config:D.configService}).catch(()=>null);if(Y?.ok&&Y.result.usesThreadActors)throw await D.asyncDispose(),new h1(`Thread ${Q.threadId} was created with the Neo TUI and cannot be continued in the legacy CLI.`,1,"Re-run without --take-me-back to continue this thread.")}return P85(A,Q,$,B,{dependencies:D})}}async function R85(A,Q,$){let B=(I,H)=>{let q=Number(process.hrtime.bigint()-H)/1e6,N=lr0();u.info("Startup phase",{phase:I,phaseMs:Math.round(q),sinceMainMs:N===null?void 0:Math.round(N)})};t8($,Q);let D=process.hrtime.bigint(),J=await s2(A,Q);B("runMainThread:createThreadDependencies",D);let{serverStatus:E}=J;if(sY(E))throw d10(E,A.ampURL);let F=i6(E)?E:null,Y=F?.user.email;await r71($,Q,E);let Z=vW(E),U=ix(Q,Z);if(U instanceof Error)R3(U.message);if(F&&!qL(Q.mode,Y))throw new h1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!Y||!E9(Y)))throw new h1("Headless executor mode is only available for Amp employees",1);LZ0();let G=await J.secretStorage.get("apiKey",A.ampURL);if(!G)throw new h1("API key required for headless mode. Please run `amp login` first.",1);let V=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(V&&!S9(V))throw new h1(`Invalid thread ID: ${V}`,1);let K=V?void 0:await l85({dependencies:J,apiKey:G,visibility:U??void 0}),z=V??K?.threadId;if(!z)throw new h1("Failed to resolve headless thread ID",1);let W=await bx4(z);if(W.status==="already-running")await J.asyncDispose(),await MG(),process.exit(0);try{await Px4({ampURL:A.ampURL,apiKey:G,workspaceRoot:process.cwd(),threadId:z,ownerUserId:K?.ownerUserId,threadVersion:K?.threadVersion,agentMode:K?.agentMode,initialToolDiscovery:Promise.all([J.mcpService.initialized,J.toolboxService.initialized,J.pluginService.initialized]).then(()=>{return}),configService:J.configService,mcpService:J.mcpService,toolService:J.toolService,skillService:J.skillService,pluginService:J.pluginService,pluginPlatform:J.headlessPluginPlatform})}finally{await W.release(),await J.asyncDispose()}await MG(),process.exit(0)}async function u85(A,Q,$,B,D){let{userInput:J,stdinInput:E}=await e96(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;A76({...Q,streamJson:F},A.executeMode,J),t8($,Q),qv4(),LZ0();let Y=Q.threadId,Z=Q.resumeThreadIDs??(Y?[Y]:[]),U=Q.observe?S8(Q.observe)??EB(Q.observe):void 0,X=await B.serverStatusPromise;if(sY(X))throw d10(X,A.ampURL);let G=vW(X),V=ix(Q,G);if(V instanceof Error)R3(V.message);if(A.executeMode&&Q.remote){if(!i6(X)||!E9(X.user.email))throw new h1("Remote execute mode is only available for Amp employees",1);await x51(J,E,B.configService,Q.mode),await B.asyncDispose(),await MG(),process.exit(0)}let K=null,z=async()=>{let H=B.consumeDraftNewThreadVisibility();if(H!==null)return H;return K??=(async()=>{let q=await Ls(A.settings,process.cwd(),G,V);if(q instanceof Error)R3(q.message);return q})(),K},W=await B.secretStorage.get("apiKey",A.ampURL);if(!W)throw new h1("API key required. Please run `amp login` first.",1);let I=i6(X)&&E9(X.user.email);if(A.executeMode){if(Z.length>1)throw new h1("Execute mode can only resume one thread.",1);j01(B.mcpService,A.settings);try{let H=QI0($,Q),q=await rz(),N=Y?H:IX0({agentMode:Q.mode,explicitEffort:H,sessionState:q}),C=Y?void 0:HX0(await gy(B.configService),{agentMode:Q.mode,explicitEffort:H,sessionState:q}),M=Y?void 0:await z(),O=await Xx4({apiKey:W,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:B,userInput:J,stdinInput:E,stats:!!Q.stats,streamJson:F,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:N,labels:Q.label,initialThreadID:Y,initialThreadMeta:M,initialSettings:C});if(await p10(O,"execute"),Q.archive)await B.threadService.archive(O,!0)}finally{await B.asyncDispose()}await MG(),process.exit(0)}else{let H=QI0($,Q),q=D.showNpmMigrationWelcome?"npm-migration":"intro",N=bU0("0.0.1779886645-g59fcb2",B.settingsStorage,{startDelayMs:3000}),C=new WX0(B.mcpService,A.settings.getWorkspaceRootPath()),M=va(B.configService),O=new D10(B.fuzzyServer),R=process.cwd();await oe4({ampURL:A.ampURL,apiKey:W,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??eJ(A.ampURL),configService:B.configService,toolService:B.toolService,pluginPlatform:B.pluginPlatform,pluginService:B.pluginService,skillService:B.skillService,mcpService:B.mcpService,readFileSystemDirectory:({uri:k})=>wy({workspaceRoot:R},k),completionBuilder:O,updateService:N,workspaceRoot:R,listThreads:()=>M.listThreads(),getThreadFromServer:(k)=>M.getThread(k),toolboxes:B.toolboxService.toolboxes,isInternalUser:I,settingsFilePath:B.settingsStorage.getSettingsFilePath(),workspaceSettingsFilePath:B.settingsStorage.getWorkspaceSettingsPath(),mcpTrustHandler:C,setActiveThreadID:(k)=>B.activeThread$.next(k),dispose:()=>{return C.dispose(),N.dispose(),B.asyncDispose()}},{initialThreadIDs:U?[U]:Z,initialUserInput:J||void 0,getDefaultNewThreadVisibility:z,onFirstFrame:Q.ide?r96:void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!U,splashOrbVisualStyle:"neo",hideNeoWelcome:!!Q.hideWelcome,showNeoWelcome:Q.showWelcome,neoWelcomeVariant:q,initialAgentMode:$.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:H}),process.exit(0)}}async function P85(A,Q,$,B,D){let J=process.hrtime.bigint(),E=(B0,j0)=>{let Q0=Number(process.hrtime.bigint()-j0)/1e6,M0=lr0();u.info("Startup phase",{phase:B0,phaseMs:Math.round(Q0),sinceMainMs:M0===null?void 0:Math.round(M0)})},{userInput:F,stdinInput:Y}=await e96(Q),Z=!!Q.streamJson||!!Q.streamJsonThinking;A76({...Q,streamJson:Z},A.executeMode,F),t8($,Q);let U=process.hrtime.bigint(),X=D?.dependencies??await s2(A,Q),G=X.hasAPIKeyAtStartup,V=X.serverStatus==="pending";if(u.info("Interactive auth startup mode",{deferInteractiveAuth:V,hasAPIKeyAtStartup:G,executeMode:A.executeMode,headless:Boolean(Q.headless)}),!D)E("runMainThread:createThreadDependencies",U);let{serverStatus:K}=X;if(!V&&sY(K))throw d10(K,A.ampURL);let z=i6(K)?K:null,W=z?.user.email,I=!!(W&&E9(W));if(I)LZ0();if(!V)await r71($,Q,K);let H=vW(K),q=H?.features??[],N=H?.team??null,C=ix(Q,H);if(C instanceof Error)R3(C.message);if(z&&!qL(Q.mode,W))throw new h1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(A.executeMode&&Q.remote){if(!W||!E9(W))throw new h1("Remote execute mode is only available for Amp employees",1);await x51(F,Y,X.configService,Q.mode),await X.asyncDispose(),process.exit(0)}let M=Q.threadId&&S9(Q.threadId)?Q.threadId:void 0;U=process.hrtime.bigint();let O=await DI0(X);E("runMainThread:createWorkerDeps",U);let R=A.executeMode?void 0:async(B0)=>p10(B0,"interactive"),k={threadService:X.threadService,workerDeps:O,createThread:async(B0)=>{let j0=V?await X.serverStatusPromise:K,Q0=await Ls(A.settings,process.cwd(),vW(j0),C);if(Q0 instanceof Error)R3(Q0.message);return w91(O,{threadMeta:Q0,agentMode:B0??Q.mode,onFirstAssistantMessage:R})},validateThreadOwnership:async(B0,j0)=>{if(j0?.nonBlockingOwnershipCheck){c96(B0,X.configService,X.viewerUserIDPromise).catch((Q0)=>{if(Q0 instanceof h1){if(j0.onOwnershipError){j0.onOwnershipError(Q0,B0);return}fz(Q0,B0);return}u.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})});return}try{await c96(B0,X.configService,X.viewerUserIDPromise)}catch(Q0){if(Q0 instanceof h1)throw Q0;u.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})}},switchThreadVisibility:C,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:R,handleError:fz},_=async()=>{try{return W56(k,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(B0){if(B0 instanceof h1)throw B0;throw await fz(B0,Q.threadId),Error("handleError should have called process.exit()")}},f=(async()=>{if(V){u.info("Skipping initial free tier status fetch until auth is complete");return}try{let B0=await X.configService.getLatest(),j0=Rc(B0),Q0=await o4.getUserFreeTierStatus({},{config:X.configService,signal:AbortSignal.timeout(j0)});if(Q0.ok)return u.info("User free tier status:",Q0),Q0.result;return}catch(B0){u.error("Failed to fetch free tier status:",B0);return}})(),b=!A.executeMode?new n51:null,v,x=null;if(b)v=b,x=(async()=>{let B0=V?await X.serverStatusPromise:X.serverStatus;if(sY(B0))throw d10(B0,A.ampURL);await r71($,Q,B0);let j0=process.hrtime.bigint(),Q0=await _();if(E("runMainThread:createThreadPool",j0),b.attach(Q0),F){let M0=await S1(Q0.threadHandles$);if(!M0)throw new h1("No active thread is available yet.",1);await M0.sendMessage({content:[{type:"text",text:F}]})}})(),x.catch(async(B0)=>{let j0=B0 instanceof Error?B0:Error(String(B0));b.setInitError(j0),await fz(B0,Q.threadId)});else U=process.hrtime.bigint(),v=await _(),E("runMainThread:createThreadPool",U);let c=Q.notifications!==void 0?Q.notifications:!A.executeMode;U=process.hrtime.bigint();let p=await X.configService.getLatest();if(E("runMainThread:configService.getLatest",U),U=process.hrtime.bigint(),$16({configService:X.configService,threadService:X.threadService,threadPool:v,config:p,useNotifications:c}),E("runMainThread:createLegacyTuiNotificationService",U),A.executeMode){j01(X.mcpService,A.settings);let B0=QI0($,Q),j0=await rz(),Q0=M?B0:IX0({agentMode:Q.mode,explicitEffort:B0,sessionState:j0}),M0={userInput:F,stdinInput:Y,dependencies:X,streamJson:Z,streamJsonInput:!!Q.streamJsonInput,streamJsonThinking:!!Q.streamJsonThinking,stats:!!Q.stats,ampURL:A.ampURL,isInternalUser:I,agentMode:Q.mode,reasoningEffort:Q0,labels:Q.label},n=await $k4({threadPool:v,...M0});if(await p10(n,"execute"),Q.archive)await X.threadService.archive(n,!0);await X.asyncDispose(),process.exit(0)}let h=!1,i=!1;if(Q.jetbrains||Q.ide){await h90();let B0=await QZ({jetbrainsOnly:Q.jetbrains});if(B0.length===0){if(Q.jetbrains)h=!await X.configService.get("jetbrains.skipInstall")}else if(B0.length===1){let j0=B0[0];if(j0)s5.selectConfig(j0)}else i=!0}U=process.hrtime.bigint();let r=bU0("0.0.1779886645-g59fcb2",X.settingsStorage,{startDelayMs:3000});E("runMainThread:createUpdateService",U),U=process.hrtime.bigint();let A0=new WX0(X.mcpService,A.settings.getWorkspaceRootPath());if(E("runMainThread:createMcpTrustHandler",U),F&&A.executeMode){let B0=await S1(v.threadHandles$);if(!B0)throw new h1("No active thread is available yet.",1);await B0.sendMessage({content:[{type:"text",text:F}]})}U=process.hrtime.bigint();let V0=await rz();E("runMainThread:loadSessionState",U),u.info("Loaded session state:",V0);let Y0=QI0($,Q),I0={...V0,launchCount:V0.launchCount+1,lastReasoningEffortByMode:Y0?{...V0.lastReasoningEffortByMode,[Q.mode]:Y0}:V0.lastReasoningEffortByMode};qQ((B0)=>({...B0,launchCount:B0.launchCount+1}));try{if(U=process.hrtime.bigint(),await P16({history:new Ut,fuzzyServer:X.fuzzyServer,settingsStorage:X.settingsStorage,threadService:X.threadService,skillService:X.skillService,configService:X.configService,secretStorage:X.secretStorage,internalAPIClient:o4,threadPool:v,createSystemPromptDeps:async()=>s96(X),ideClient:s5,mcpService:X.mcpService,toolboxService:X.toolboxService,mcpTrustHandler:A0,updateService:r,pluginPlatform:X.pluginPlatform,pluginService:X.pluginService},{initialServerStatus:X.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:X.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:M,showJetBrainsInstaller:h,showIdePickerHint:i,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:D85,logFile:{path:B},sessionState:I0,freeTierStatusPromise:f,workspace:N??null,features:q,isInternalUser:I,initialAgentMode:$.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-27T13:02:21.391Z"},(B0)=>new A21({...B0,threadPool:B0.threadPool},(j0)=>new N91({...j0,threadState:j0.threadState}))),E("runMainThread:mountApp-returned",U),x)await x}finally{await v.dispose().catch((B0)=>{u.error("Failed to dispose thread pool during shutdown",B0)})}await X.asyncDispose(),E("runMainThread:dependencies.asyncDispose",J),process.exit(0)}async function d3(A){if(u.info("Initializing CLI context",{argv:process.argv,nodeEnv:"production",hasAmpURL:Boolean(process.env.AMP_URL),hasAmpAPIKey:Boolean(process.env.AMP_API_KEY),hasSettingsFile:Boolean(process.env.AMP_SETTINGS_FILE)}),A.interactive)O$.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7305
+ `);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,$=process.stdout.isTTY&&process.stderr.isTTY;u.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let B=await JB4({get:async(F)=>{if(F!==gi)return;try{let Y=await o96(o71,"utf-8");return JSON.parse(Y).installationID}catch{return}},set:async(F,Y)=>{if(F!==gi)return;await A85(m10.dirname(o71),{recursive:!0}),await Q85(o71,JSON.stringify({installationID:Y},null,2),{mode:384})}},{clientType:"cli",platform:D$0()});h44(B);let D=await R06({...A,workspaceTrust:{current:!0,changes:uc},getHook:process.env.AMP_URL?(F,Y)=>{if(F==="url")return Promise.resolve(process.env.AMP_URL);return Y()}:void 0});if(A.mcpConfig){let F=await Tg4(A.mcpConfig);D=vg4(D,F)}let J=m10.dirname(D.getSettingsFilePath());qP4(Hl,J),D=et1(D);let E=await D.get("url","admin")??await D.get("url","global");if(!E)E=e7;if(u.info("Resolved Amp URL",{ampURL:E,settingsFile:D.getSettingsFilePath(),workspaceRoot:D.getWorkspaceRootPath()}),!IH(E))u.info("Targeting custom Amp server",{ampURL:E});return{executeMode:Q,isTTY:$,ampURL:E,settings:D,secrets:C06(await h51(A,D))}}function _85(A){let Q={};for(let $=0;$<A.length;$++){let B=A[$];if(B?.startsWith("--")){let J=B.slice(2).replace(/-([a-z])/g,(F,Y)=>Y.toUpperCase()),E=A[$+1];if(E&&!E.startsWith("--"))Q[J]=E,$++}}return Q}function T85(A,Q){let $=A.includes("--headless")||A.some((D)=>D.startsWith("--headless=")),B=m10.resolve(Q.logFile??process.env.AMP_LOG_FILE??($?B85:Ms));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:B}}async function v85(){Gv4();let A=_85(process.argv),Q=T85(process.argv,A),$=Nv4(Q);zZ0("silent");let B=process.argv.includes("--no-color"),D=process.argv.includes("--color"),J=process.stdout.isTTY&&process.stderr.isTTY;if(B||!D&&!J)e0.level=0;if(E85(u),u.info("Starting Amp CLI.",{version:"0.0.1779886645-g59fcb2",buildTimestamp:"2026-05-27T13:02:21.391Z"}),process.platform==="win32"&&BR())ub4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new h1(a9.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await L85($).parseAsync(process.argv)}IP4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await v85().catch(fz)});async function k85(A,Q){let $=A.ampURL.includes("localhost")||A.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!$)await A.settings.set("url",process.env.AMP_URL,"global"),Q3.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7306
7306
  `);else if(!IH(A.ampURL))Q3.write(`Logging in to ${new URL(A.ampURL).hostname}
7307
7307
  `);let B=process.env.AMP_API_KEY;if(B)Q3.write(`API key found in environment variable, storing...
7308
7308
  `),await Q.set("apiKey",B,A.ampURL),Q3.write(`API key successfully stored.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1779872458-g7b0532",
3
+ "version": "0.0.1779886645-g59fcb2",
4
4
  "description": "Renamed to @ampcode/cli - see https://ampcode.com/news/npm-package-changes",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -8,7 +8,7 @@
8
8
  "amp": "node_modules/@ampcode/cli/bin/amp.exe"
9
9
  },
10
10
  "dependencies": {
11
- "@ampcode/cli": "0.0.1779872458-g7b0532"
11
+ "@ampcode/cli": "0.0.1779886645-g59fcb2"
12
12
  },
13
13
  "files": [
14
14
  "dist/main.js",