@sourcegraph/amp 0.0.1779772576-g751b94 → 0.0.1779786108-g751b94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +10 -10
- package/package.json +2 -2
package/dist/main.js
CHANGED
|
@@ -4789,13 +4789,13 @@ ${W}`))}},error:(K)=>{if(!V)V=!0,Z(Error(`Failed to spawn brew: ${K.message}`))}
|
|
|
4789
4789
|
${W}`;if(F==="pnpm"&&W.includes("Unable to find the global bin directory"))z+=`
|
|
4790
4790
|
|
|
4791
4791
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
4792
|
-
npm install -g ${J}`;Z(Error(z))}},error:(K)=>{if(!G)G=!0,Z(Error(`Failed to spawn ${F}: ${K.message}`))},complete:()=>{if(!G)G=!0,Y()}})})}p0();p0();Ez();var lq3="@ampcode/cli";async function GY0(A,Q,$=lq3){let D=`${Q||"https://registry.npmjs.org"}/${$}/latest`,J=new AbortController,F=setTimeout(()=>J.abort(),5000);try{let E=await fetch(D,{signal:J.signal});if(!E.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let Y=await E.json(),Z=Y.version??Y["dist-tags"]?.latest;if(!Z)return{hasUpdate:!1,currentVersion:A,source:"npm"};let U=_o(A,Z),X=U<0,G,V;if(Y.time){let K=Y.time[A],W=Y.time[Z],z=Date.now();if(K)G=Math.floor((z-new Date(K).getTime())/3600000);if(W)V=Math.floor((z-new Date(W).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(E){return u.debug("Error checking npm version",{error:E}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(F)}}var iq3="https://static.ampcode.com/cli/cli-version.txt";async function VY0(A){let Q=new AbortController,$=setTimeout(()=>Q.abort(),5000);try{let B=await fetch(`${iq3}?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=_o(A,D),F=J<0;return u.info("Bin version comparison",{currentVersion:A,latestVersion:D,compareResult:J,hasUpdate:F}),{hasUpdate:F,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 nq3=604800000;function Cy4(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($>nq3)return{ageMs:$};return null}function _o(A,Q){let $=(F)=>{let[E,Y]=F.split("-");return{parts:E?.split(".").map(Number)||[],label:Y}},B=$(A),D=$(Q),J=Math.max(B.parts.length,D.parts.length);for(let F=0;F<J;F++){let E=B.parts[F]||0,Y=D.parts[F]||0;if(E<Y)return-1;if(E>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 To(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],F=B!==void 0?RE(B):void 0;return{sha:J,timestamp:B,age:F}}catch{return null}}u1();p0();import{readFile as aq3,realpath as oq3}from"node:fs/promises";import{dirname as wy4,join as rq3}from"node:path";async function My4(A){switch(A){case"binary":case"brew":return sq3(uo());case"npm":case"pnpm":case"yarn":case"bun":return tq3()}}async function sq3(A){let Q=await KN(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 tq3(){try{let A=process.argv[1];if(!A)return null;let Q=await oq3(A),$=wy4(wy4(Q));return await eq3(rq3($,"package.json"))}catch(A){return u.debug("failed to read installed version from package.json",{error:A}),null}}async function eq3(A){let Q=await aq3(A,"utf8"),$=JSON.parse(Q);if(!$.name||!xt0($.name))return u.debug("package.json name mismatch",{pkgJsonPath:A,name:$.name}),null;return $.version||null}p0();import{spawn as AN3}from"node:child_process";function ct0(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 KY0=null,vo=null;function Ly4(A){return new Promise((Q)=>{let $=AN3("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 F=B.trim();Q(F&&F!=="undefined"?F:null)}),$.on("error",()=>{Q(null)})})}async function zY0(){if(KY0)return KY0;if(vo)return vo;vo=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return ct0(A);let Q=await Ly4("@sourcegraph:registry");if(Q)return ct0(Q);let $=await Ly4("registry");if($)return ct0($);return"https://registry.npmjs.org"})();try{return KY0=await vo,KY0}finally{vo=null}}var QN3=3600000,$N3=5000;function WY0(A,Q,$={}){let B=new d4,D=B.pipe(e6({shouldCountRefs:!1})),J=$.startDelayMs??0,F=$.checkIntervalMs??QN3,E=!1,Y=()=>{E=!0};return setImmediate(async()=>{let Z=u.getChild("update");if(J>0){if(await tX(J),E)return}let U=D.subscribe({next:(G)=>{Z.debug("emit new state",G)}}),X=A;try{while(!E){let G=await BN3(X,Q,Z,B);if(G.stop)return;if(G.updatedTo)X=G.updatedTo;if(G.emittedVisibleState){if(await tX($N3),E)return;B.next("hidden")}if(F<=0)return;let V=1000,K=F;while(K>0&&!E){let W=Math.min(V,K);await tX(W),K-=W}}}finally{U.unsubscribe(),B.complete()}}),{state:D,dispose:Y}}async function BN3(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 F=await RG(),E=F==="binary"||F==="brew",Y=E?void 0:await zN();$.debug("checking",{currentVersion:A,mode:J,packageManager:F,isBinaryDistribution:E,npmPackageName:Y});let Z;if(E)Z=await VY0(A);else{let G=await zY0();Z=await GY0(A,G,Y)}if(!(Z.latestVersion&&Z.hasUpdate))return $.debug("no update available"),D;let U=(G)=>{B.next(G),D.emittedVisibleState=!0};if(F){let G=await My4(F);if(G&&_o(G,Z.latestVersion)>=0){if($.debug("on-disk version already up to date",{currentVersion:A,installedVersion:G,latestVersion:Z.latestVersion}),D.updatedTo=G,_o(A,G)<0){let V=await Tz(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=F==="pnpm"?"warn":"auto",$.debug("no configured update mode; selected default based on package manager",{packageManager:F,mode:J});if(F==="brew"){if(!X())U("update-available-brew");return D}if(F==="binary"&&process.execPath!==uo()){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(!F){if($.debug("auto-update not supported, falling back to warn mode"),!X())U("update-available");return D}try{await Po(Z.latestVersion,F),D.updatedTo=Z.latestVersion;let G=await Tz(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}}Ez();import{stderr as cE}from"node:process";function Oy4(A){let Q=new oq().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 ft0(B.force||!1,B.verbose||!1,"0.0.
|
|
4792
|
+
npm install -g ${J}`;Z(Error(z))}},error:(K)=>{if(!G)G=!0,Z(Error(`Failed to spawn ${F}: ${K.message}`))},complete:()=>{if(!G)G=!0,Y()}})})}p0();p0();Ez();var lq3="@ampcode/cli";async function GY0(A,Q,$=lq3){let D=`${Q||"https://registry.npmjs.org"}/${$}/latest`,J=new AbortController,F=setTimeout(()=>J.abort(),5000);try{let E=await fetch(D,{signal:J.signal});if(!E.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let Y=await E.json(),Z=Y.version??Y["dist-tags"]?.latest;if(!Z)return{hasUpdate:!1,currentVersion:A,source:"npm"};let U=_o(A,Z),X=U<0,G,V;if(Y.time){let K=Y.time[A],W=Y.time[Z],z=Date.now();if(K)G=Math.floor((z-new Date(K).getTime())/3600000);if(W)V=Math.floor((z-new Date(W).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(E){return u.debug("Error checking npm version",{error:E}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(F)}}var iq3="https://static.ampcode.com/cli/cli-version.txt";async function VY0(A){let Q=new AbortController,$=setTimeout(()=>Q.abort(),5000);try{let B=await fetch(`${iq3}?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=_o(A,D),F=J<0;return u.info("Bin version comparison",{currentVersion:A,latestVersion:D,compareResult:J,hasUpdate:F}),{hasUpdate:F,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 nq3=604800000;function Cy4(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($>nq3)return{ageMs:$};return null}function _o(A,Q){let $=(F)=>{let[E,Y]=F.split("-");return{parts:E?.split(".").map(Number)||[],label:Y}},B=$(A),D=$(Q),J=Math.max(B.parts.length,D.parts.length);for(let F=0;F<J;F++){let E=B.parts[F]||0,Y=D.parts[F]||0;if(E<Y)return-1;if(E>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 To(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],F=B!==void 0?RE(B):void 0;return{sha:J,timestamp:B,age:F}}catch{return null}}u1();p0();import{readFile as aq3,realpath as oq3}from"node:fs/promises";import{dirname as wy4,join as rq3}from"node:path";async function My4(A){switch(A){case"binary":case"brew":return sq3(uo());case"npm":case"pnpm":case"yarn":case"bun":return tq3()}}async function sq3(A){let Q=await KN(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 tq3(){try{let A=process.argv[1];if(!A)return null;let Q=await oq3(A),$=wy4(wy4(Q));return await eq3(rq3($,"package.json"))}catch(A){return u.debug("failed to read installed version from package.json",{error:A}),null}}async function eq3(A){let Q=await aq3(A,"utf8"),$=JSON.parse(Q);if(!$.name||!xt0($.name))return u.debug("package.json name mismatch",{pkgJsonPath:A,name:$.name}),null;return $.version||null}p0();import{spawn as AN3}from"node:child_process";function ct0(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 KY0=null,vo=null;function Ly4(A){return new Promise((Q)=>{let $=AN3("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 F=B.trim();Q(F&&F!=="undefined"?F:null)}),$.on("error",()=>{Q(null)})})}async function zY0(){if(KY0)return KY0;if(vo)return vo;vo=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return ct0(A);let Q=await Ly4("@sourcegraph:registry");if(Q)return ct0(Q);let $=await Ly4("registry");if($)return ct0($);return"https://registry.npmjs.org"})();try{return KY0=await vo,KY0}finally{vo=null}}var QN3=3600000,$N3=5000;function WY0(A,Q,$={}){let B=new d4,D=B.pipe(e6({shouldCountRefs:!1})),J=$.startDelayMs??0,F=$.checkIntervalMs??QN3,E=!1,Y=()=>{E=!0};return setImmediate(async()=>{let Z=u.getChild("update");if(J>0){if(await tX(J),E)return}let U=D.subscribe({next:(G)=>{Z.debug("emit new state",G)}}),X=A;try{while(!E){let G=await BN3(X,Q,Z,B);if(G.stop)return;if(G.updatedTo)X=G.updatedTo;if(G.emittedVisibleState){if(await tX($N3),E)return;B.next("hidden")}if(F<=0)return;let V=1000,K=F;while(K>0&&!E){let W=Math.min(V,K);await tX(W),K-=W}}}finally{U.unsubscribe(),B.complete()}}),{state:D,dispose:Y}}async function BN3(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 F=await RG(),E=F==="binary"||F==="brew",Y=E?void 0:await zN();$.debug("checking",{currentVersion:A,mode:J,packageManager:F,isBinaryDistribution:E,npmPackageName:Y});let Z;if(E)Z=await VY0(A);else{let G=await zY0();Z=await GY0(A,G,Y)}if(!(Z.latestVersion&&Z.hasUpdate))return $.debug("no update available"),D;let U=(G)=>{B.next(G),D.emittedVisibleState=!0};if(F){let G=await My4(F);if(G&&_o(G,Z.latestVersion)>=0){if($.debug("on-disk version already up to date",{currentVersion:A,installedVersion:G,latestVersion:Z.latestVersion}),D.updatedTo=G,_o(A,G)<0){let V=await Tz(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=F==="pnpm"?"warn":"auto",$.debug("no configured update mode; selected default based on package manager",{packageManager:F,mode:J});if(F==="brew"){if(!X())U("update-available-brew");return D}if(F==="binary"&&process.execPath!==uo()){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(!F){if($.debug("auto-update not supported, falling back to warn mode"),!X())U("update-available");return D}try{await Po(Z.latestVersion,F),D.updatedTo=Z.latestVersion;let G=await Tz(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}}Ez();import{stderr as cE}from"node:process";function Oy4(A){let Q=new oq().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 ft0(B.force||!1,B.verbose||!1,"0.0.1779786108-g751b94"),process.exit()});A.addCommand(Q,{hidden:!0});let $=new oq("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 FN3(B.targetVersion)});A.addCommand($)}function DN3(A){let Q=Boolean(A.isTTY),$=0,B=!1;function D(){if(!Q||!B)return;A.write(`
|
|
4793
4793
|
`),B=!1,$=0}function J(F){if(!Q)return;let E=F.padEnd($," ");A.write(`\r${E}`),B=!0,$=E.length}return{flushProgressLine:D,renderProgress:J}}function JN3(A){if(A.source==="npm"&&A.latestVersionAge!==void 0&&A.latestVersionAge>36)cE.write(t0.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.
|
|
4794
4794
|
`))}async function FN3(A){let $=process.platform==="win32"&&Lj()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:B,renderProgress:D}=DN3(cE);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")cE.write(t0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
4795
4795
|
|
|
4796
4796
|
`));try{if(!A){cE.write(t0.blue(`Checking for updates...
|
|
4797
|
-
`));let E=!1,Y;if(Lj()){let Z=await VY0("0.0.
|
|
4798
|
-
`));let X=await Tz("0.0.
|
|
4797
|
+
`));let E=!1,Y;if(Lj()){let Z=await VY0("0.0.1779786108-g751b94");E=Z.hasUpdate,Y=Z.latestVersion}else{let Z=await zY0(),U=await zN(),X=await GY0("0.0.1779786108-g751b94",Z,U);JN3(X),E=X.hasUpdate,Y=X.latestVersion}if(!E){let Z=To("0.0.1779786108-g751b94"),U=Z?.age?`released ${Z.age} ago`:`built ${RE(new Date("2026-05-26T09:06:27.137Z"))} ago`;cE.write(t0.green(`✓ Amp is already up to date on version ${"0.0.1779786108-g751b94"} (${U})
|
|
4798
|
+
`));let X=await Tz("0.0.1779786108-g751b94",$);if(X.warning)cE.write(`
|
|
4799
4799
|
`+t0.yellow(X.warning)+`
|
|
4800
4800
|
`);process.exit(0)}if(!Y)cE.write(t0.yellow("[WARN] could not find latest version")),process.exit(0);A=Y}cE.write(t0.blue(`Updating to version ${A}...
|
|
4801
4801
|
`)),await Po(A,void 0,(E)=>{B(),cE.write(t0.dim(`Running: ${E}
|
|
@@ -5224,7 +5224,7 @@ ${B}`).join(`
|
|
|
5224
5224
|
`).length,D=new d({text:new w(A,new T({color:$}))});if(B<=cU0)return D;return new X0({width:1/0,height:cU0,child:new i8({autofocus:!1,controller:Q,child:D})})}function Cf3(){return new Map([[G1.key("PageUp"),new lU0],[G1.key("PageDown"),new S41],[G1.ctrl("u"),new lU0],[G1.shift("Home"),new f41],[G1.shift("End"),new y41]])}function wf3(A,Q,$){return Math.max(Q,Math.min(A,$))}var x41=8,Ni4=1,Ci4=x41-1;class b41 extends V4{}class h41 extends V4{}class iU0 extends V4{}class nU0 extends V4{}class g41 extends V4{}class m41 extends V4{}class d41 extends u0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new wi4}}class wi4 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,$=Mf3(Q,this.messageScroll),B=Lf3(Q.options.message),D=B?new x4({actions:this.buildScrollActions(),child:new vA({debugLabel:"NeoSelectDialogScrollShortcuts",shortcuts:jf3(),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 $=Rf3(this.messageScroll.offset+Q,0,this.messageScroll.maxScrollExtent);this.messageScroll.jumpTo($)};return new Map([[b41,new T1(()=>A(-Ni4))],[h41,new T1(()=>A(Ni4))],[iU0,new T1(()=>A(-Ci4))],[nU0,new T1(()=>A(Ci4))],[g41,new T1(()=>this.messageScroll.jumpTo(0))],[m41,new T1(()=>this.messageScroll.jumpTo(this.messageScroll.maxScrollExtent))]])}}function Mf3(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 G8({options:$,selectedIndex:B,body:Of3(A.options.message,Q),onSelect:(D)=>{if(D===null){A.onCancel();return}A.onSelect(D)},padding:V0.all(0),showBorder:!1,showDismissalMessage:!1,enableMouseInteraction:!0,wrapOptions:!0})}function Lf3(A){if(A===void 0)return!1;return A.split(`
|
|
5225
5225
|
`).length>x41}function Of3(A,Q){if(A===void 0)return;let $=A.split(`
|
|
5226
5226
|
`).length,B=Math.min($,x41);return new X0({width:1/0,height:B,child:new i8({autofocus:!1,controller:Q,child:new d({text:new w(A)})})})}function jf3(){return new Map([[G1.key("PageUp"),new iU0],[G1.key("PageDown"),new nU0],[G1.ctrl("u"),new iU0],[G1.ctrl("d"),new nU0],[G1.ctrl("y"),new b41],[G1.ctrl("e"),new h41],[G1.shift("Home"),new g41],[G1.shift("End"),new m41]])}function Rf3(A,Q,$){return Math.max(Q,Math.min(A,$))}var uf3=3,Pf3=new y6("NeoPluginDialogOverlay");function Mi4(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 p41{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(!zE0($.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:Pf3,debugLabel:"PluginDialogOverlay",autofocus:!1,canRequestFocus:!0,child:this.buildActiveDialog(A)})]}buildActiveDialog(A){switch(A.kind){case"input":return new Cs({key:new fz(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 k41({key:new fz(A),options:A.options,onConfirm:()=>this.resolveConfirmDialog(A,!0),onCancel:()=>this.resolveConfirmDialog(A,!1)});case"select":return new d41({key:new fz(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(Mi4(A.id,B))}catch(B){if(this.pendingOwnerUIRequests.get(A.id)!==$)return;this.pendingOwnerUIRequests.delete(A.id),Q(Mi4(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 $=BT4.safeParse(A.data);if($.success)this.handlePluginUISnapshot($.data,Q);return!0}if(A.event==="plugin.ui.request_added"){let $=DT4.safeParse(A.data);if($.success)this.handlePluginUIRequestAdded($.data,Q);return!0}if(A.event==="plugin.ui.request_settled"){let $=JT4.safeParse(A.data);if($.success)this.handlePluginUIRequestSettled($.data,Q);return!0}if(A.event==="plugin.ui.request_removed"){let $=FT4.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(Bc($.errorMessage))continue;let B=`${$.uri.toString()}
|
|
5227
|
-
${$.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}`,keywords:["plugin",A.pluginName,A.id],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=eF(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=eF(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=eF(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,uf3)}scheduleResolvingDialogAdvance(A,Q){i6.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 _f3=48;class c41{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 Hs({width:_f3,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()}}p0();import{spawnSync as Tf3}from"node:child_process";import _D from"node:process";var Li4={options:new Set(["settings-file","log-level","log-file","mcp-config"]),booleans:new Set(["color","dangerously-allow-all","ide","jetbrains","neo-orb","notifications"])};function ws(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else z4.instance.stop()}function Oi4(A){return{noun:"amp",verb:"Relaunch (Quit, then Reopen & Resume Thread)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update","resume","reopen"],shortcut:_D.env.NODE_ENV==="development"&&_D.platform==="darwin"?G1.meta("r"):void 0,status:{type:"enabled"},sortBoost:90,run:(Q,$,B)=>{B(),ws(A)}}}function vf3(A,Q){let{command:$,args:B}=kf3(A),D=_D.execve,J=_D.platform==="win32"||!D,F=J?"spawnSync":"execve";if(u.info("Relaunching Amp; threads will be resumed",{threadIDs:A,relaunchMethod:F}),J){let E=Tf3($,B,{cwd:Q,env:_D.env,stdio:"inherit"});if(E.error)return u.error("Failed to relaunch Amp",{error:E.error}),1;return E.status??1}try{if(_D.chdir(Q),$.includes("/"))return D($,[$,...B],_D.env);return D("/usr/bin/env",["env",$,...B],_D.env)}catch(E){return u.error("Failed to relaunch Amp",{error:E}),1}}class l41{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 vf3(this.requestedThreadIDs,A)}}function kf3(A){let Q=A.length>0?["threads","continue",...A]:[],$=Sf3(_D.argv),B=yf3();if(B)return{command:B.command,args:[...B.args,...$,...Q]};let D=_D.argv[1],J=D&&ff3(D)?[D]:[];return{command:_D.execPath,args:[...J,...$,...Q]}}function Sf3(A){let Q=[],$=A.slice(2);for(let B=0;B<$.length;B+=1){let D=$[B];if(!D?.startsWith("--"))continue;let[J,F]=D.split("=",2);if(!J)continue;let E=J.slice(2),Y=E.startsWith("no-")?E.slice(3):E;if(Li4.booleans.has(Y)){Q.push(D);continue}if(!Li4.options.has(E))continue;if(F!==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 ff3(A){return A!==_D.execPath&&!A.startsWith("/$bunfs/")}function yf3(){if(_D.env.NODE_ENV!=="development")return null;let A=_D.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=xf3(A),$=Q[0];if(!$)return null;return{command:$,args:Q.slice(1)}}function xf3(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 bf3=18000000;class i41{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??bf3)-(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(()=>ws(this.options))}}_l();e2();import{readFile as hf3}from"node:fs/promises";import n41 from"node:os";function gf3(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function ji4(A,Q){try{return{path:Q,contents:Cg0(await hf3(A,"utf8"))}}catch{return null}}async function aU0(A,Q){let $=[],B=gf3(),D=await e4.getThread({thread:Q},{config:A.configService}),J=D.ok?D.result.thread.data:null;$.push({path:`${B}/thread.json`,contents:JSON.stringify(UD(J),null,2)});let F=await ji4(eS(Q),`${B}/logs/${Q}.log`);if(F)$.push(F);let E=await ji4(A.settingsFilePath,`${B}/settings/global.json`);if(E)$.push(E);let Y=await RG()??"unknown",Z=await e4.sendReport({threadID:Q,files:$,metadata:{clientVersion:"0.0.1779772576-g751b94",clientOS:`${n41.platform()} ${n41.release()} ${n41.arch()}`,installMethod:Y}},{config:A.configService});if(!Z.ok)throw Error(`Failed to submit report: ${Z.error.message}`);return Z.result.reportID}class a41{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 oU0 extends h3{offstage;constructor({key:A,offstage:Q=!0,child:$}){super({key:A,child:$});this.offstage=Q}createRenderObject(){return new o41(this.offstage)}updateRenderObject(A){if(A instanceof o41)A.offstage=this.offstage}}class o41 extends c1{_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 Ms{_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 r41 extends u0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new Ri4}}class Ri4 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 _j,$=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:$})})}pushWithDismiss(A){let Q=new _j,$=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 oU0({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:(F)=>{if(F.key!=="Escape")return"ignored";return B.dismiss(),"handled"},child:B.widget}):B.widget;Q.push(new oU0({key:B.key,offstage:!D,child:J}))}return new i4({fit:"expand",children:Q})}}import ui4 from"node:process";class t41 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter((B)=>B.status.type!=="hidden"),$=mf3(Q);return new C6({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:V0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new pA({items:Q,showBorder:!1,getLabel:(B)=>{let D=s41(B);return B.keywords&&B.keywords.length>0?`${D} ${B.keywords.join(" ").toLowerCase()}`:D},sortItems:(B,D,J)=>{if(J===""){let U=B.item.status.type==="disabled"?1:0,X=D.item.status.type==="disabled"?1:0;if(U!==X)return U-X;let G=B.item.sortBoost??0,V=D.item.sortBoost??0;if(G!==V)return V-G;let K=B.item.noun?.toLowerCase()??"",W=D.item.noun?.toLowerCase()??"";if(K!==W)return K<W?-1:1;return 0}let F=oj(B.item.verb.toLowerCase(),J),E=oj(D.item.verb.toLowerCase(),J);if(F!==E)return E-F;let Y=oj(s41(B.item),J),Z=oj(s41(D.item),J);if(Y!==Z)return Z-Y;return D.score-B.score},isItemDisabled:(B)=>B.status.type==="disabled",buildDisabledReasonWidget:(B,D)=>{if(B.status.type!=="disabled")return;let{colors:J}=O0.of(D);return new d({text:new w(B.status.reason,new T({color:J.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:(B,D,J,F)=>new Pi4({command:B,isSelected:D,isDisabled:J,categoryWidth:$,buildContext:F}),onAccept:(B)=>{this.props.onAccept(B)},onDismiss:this.props.onDismiss})})}}class Pi4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:$,isDisabled:B,categoryWidth:D,buildContext:J}=this.props,F=O0.of(J),{colors:E,app:Y}=F,Z=$?Y.selectionBackground:void 0,U=$?Y.selectionForeground:E.foreground,X=$?U:E.mutedForeground,G=new d({text:new w(Q.noun?.toLowerCase()??"",new T({color:X,dim:B||!$})),textAlign:"right"}),V=[new w(Q.verb.toLowerCase(),new T({color:U,bold:!0,dim:B}))];if(B)V.push(new w(" (unavailable)",new T({color:U,dim:!0})));let K=d.spans(V),W=[{child:G,fixedWidth:D},{child:K,expanded:!0}];if(Q.shortcut)W.push({child:df3(Q.shortcut,F,B)});return new _i4({columns:W,padding:V0.horizontal(1),backgroundColor:Z})}}function s41(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function mf3(A){return A.reduce((Q,$)=>{return $.noun?Math.max(Q,J4($.noun)):Q},0)}function df3(A,Q,$){let{colors:B,app:D}=Q,J=new T({color:B.mutedForeground,dim:$}),F=[];for(let E of A.modifiers()){if(F.length>0)F.push(new w(" ",J));F.push(new w(pf3(E),new T({color:D.keybind,bold:!0,dim:$})))}if(F.length>0)F.push(new w(" ",J));return F.push(new w(cf3(A),new T({color:D.keybind,bold:!0,dim:$}))),d.spans(F)}function pf3(A){return A==="Meta"&&ui4.platform==="darwin"?"Cmd":A}function cf3(A){return A.meta&&ui4.platform==="darwin"?A.key.toUpperCase():A.key}class _i4 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 E=0;E<Q.length;E++){let Y=Q[E];if(E>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 F=new r0({crossAxisAlignment:"start",children:J});if(!B&&!D)return F;return new x0({decoration:D?{color:D}:void 0,padding:B,child:F})}}class e41{#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 Ms,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#$(){for(let A of this.#Q)A()}}class w9 extends GA{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=w9.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(w9)?.commandRegistry??null}}class A61 extends u0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new Ti4}}class Ti4 extends R0{modalStack=new Ms;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=w9.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=w9.of(A).commands,$=new t41({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 r41({root:$,controller:this.modalStack})}}var Q61=[{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"]}]}],$61=[{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 rU0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let $=b1.of(A).size.width,B=50,D=$<50,J=[];for(let F of this.items){let[E,Y]=this.renderRow(F),Z;if(D)Z=new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:[E,new f0({padding:V0.only({left:4}),child:Y})]});else Z=new r0({crossAxisAlignment:"start",children:[new R1({flex:1,child:E}),new X0({width:1}),new R1({flex:1,child:Y})]});J.push(new f0({padding:V0.horizontal(6),child:Z}))}return new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:J})}}class B61 extends u0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:$}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=$??!0}createState(){return new vi4}}class vi4 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=b1.of(A),F=new T({color:$.primary,bold:!0}),E=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,W=V-4,z=Math.max(40,Math.min(80,K)),I=new Set(["permissions-disable"]),q=[...this.widget.commands.filter((L)=>{let j=L.noun?.toLowerCase();return j!=="dev"&&j!=="debug"&&!L.id.startsWith("debug-")&&!I.has(L.id)})].sort((L,j)=>{let k=(L.noun??"").toLowerCase(),_=(j.noun??"").toLowerCase(),S=k.localeCompare(_);if(S!==0)return S;let h=L.verb.toLowerCase(),b=j.verb.toLowerCase(),v=h.localeCompare(b);if(v!==0)return v;return L.id.localeCompare(j.id)}),N=new k6({autofocus:!0,controller:this.scrollController,child:new x0({constraints:new w1(z,z,0,Number.POSITIVE_INFINITY),child:new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new $4({child:new d({text:new w(`Amp CLI - Help & Keyboard Shortcuts
|
|
5227
|
+
${$.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}`,keywords:["plugin",A.pluginName,A.id],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=eF(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=eF(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=eF(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,uf3)}scheduleResolvingDialogAdvance(A,Q){i6.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 _f3=48;class c41{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 Hs({width:_f3,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()}}p0();import{spawnSync as Tf3}from"node:child_process";import _D from"node:process";var Li4={options:new Set(["settings-file","log-level","log-file","mcp-config"]),booleans:new Set(["color","dangerously-allow-all","ide","jetbrains","neo-orb","notifications"])};function ws(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else z4.instance.stop()}function Oi4(A){return{noun:"amp",verb:"Relaunch (Quit, then Reopen & Resume Thread)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update","resume","reopen"],shortcut:_D.env.NODE_ENV==="development"&&_D.platform==="darwin"?G1.meta("r"):void 0,status:{type:"enabled"},sortBoost:90,run:(Q,$,B)=>{B(),ws(A)}}}function vf3(A,Q){let{command:$,args:B}=kf3(A),D=_D.execve,J=_D.platform==="win32"||!D,F=J?"spawnSync":"execve";if(u.info("Relaunching Amp; threads will be resumed",{threadIDs:A,relaunchMethod:F}),J){let E=Tf3($,B,{cwd:Q,env:_D.env,stdio:"inherit"});if(E.error)return u.error("Failed to relaunch Amp",{error:E.error}),1;return E.status??1}try{if(_D.chdir(Q),$.includes("/"))return D($,[$,...B],_D.env);return D("/usr/bin/env",["env",$,...B],_D.env)}catch(E){return u.error("Failed to relaunch Amp",{error:E}),1}}class l41{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 vf3(this.requestedThreadIDs,A)}}function kf3(A){let Q=A.length>0?["threads","continue",...A]:[],$=Sf3(_D.argv),B=yf3();if(B)return{command:B.command,args:[...B.args,...$,...Q]};let D=_D.argv[1],J=D&&ff3(D)?[D]:[];return{command:_D.execPath,args:[...J,...$,...Q]}}function Sf3(A){let Q=[],$=A.slice(2);for(let B=0;B<$.length;B+=1){let D=$[B];if(!D?.startsWith("--"))continue;let[J,F]=D.split("=",2);if(!J)continue;let E=J.slice(2),Y=E.startsWith("no-")?E.slice(3):E;if(Li4.booleans.has(Y)){Q.push(D);continue}if(!Li4.options.has(E))continue;if(F!==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 ff3(A){return A!==_D.execPath&&!A.startsWith("/$bunfs/")}function yf3(){if(_D.env.NODE_ENV!=="development")return null;let A=_D.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=xf3(A),$=Q[0];if(!$)return null;return{command:$,args:Q.slice(1)}}function xf3(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 bf3=18000000;class i41{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??bf3)-(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(()=>ws(this.options))}}_l();e2();import{readFile as hf3}from"node:fs/promises";import n41 from"node:os";function gf3(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function ji4(A,Q){try{return{path:Q,contents:Cg0(await hf3(A,"utf8"))}}catch{return null}}async function aU0(A,Q){let $=[],B=gf3(),D=await e4.getThread({thread:Q},{config:A.configService}),J=D.ok?D.result.thread.data:null;$.push({path:`${B}/thread.json`,contents:JSON.stringify(UD(J),null,2)});let F=await ji4(eS(Q),`${B}/logs/${Q}.log`);if(F)$.push(F);let E=await ji4(A.settingsFilePath,`${B}/settings/global.json`);if(E)$.push(E);let Y=await RG()??"unknown",Z=await e4.sendReport({threadID:Q,files:$,metadata:{clientVersion:"0.0.1779786108-g751b94",clientOS:`${n41.platform()} ${n41.release()} ${n41.arch()}`,installMethod:Y}},{config:A.configService});if(!Z.ok)throw Error(`Failed to submit report: ${Z.error.message}`);return Z.result.reportID}class a41{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 oU0 extends h3{offstage;constructor({key:A,offstage:Q=!0,child:$}){super({key:A,child:$});this.offstage=Q}createRenderObject(){return new o41(this.offstage)}updateRenderObject(A){if(A instanceof o41)A.offstage=this.offstage}}class o41 extends c1{_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 Ms{_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 r41 extends u0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new Ri4}}class Ri4 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 _j,$=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:$})})}pushWithDismiss(A){let Q=new _j,$=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 oU0({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:(F)=>{if(F.key!=="Escape")return"ignored";return B.dismiss(),"handled"},child:B.widget}):B.widget;Q.push(new oU0({key:B.key,offstage:!D,child:J}))}return new i4({fit:"expand",children:Q})}}import ui4 from"node:process";class t41 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter((B)=>B.status.type!=="hidden"),$=mf3(Q);return new C6({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:V0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new pA({items:Q,showBorder:!1,getLabel:(B)=>{let D=s41(B);return B.keywords&&B.keywords.length>0?`${D} ${B.keywords.join(" ").toLowerCase()}`:D},sortItems:(B,D,J)=>{if(J===""){let U=B.item.status.type==="disabled"?1:0,X=D.item.status.type==="disabled"?1:0;if(U!==X)return U-X;let G=B.item.sortBoost??0,V=D.item.sortBoost??0;if(G!==V)return V-G;let K=B.item.noun?.toLowerCase()??"",W=D.item.noun?.toLowerCase()??"";if(K!==W)return K<W?-1:1;return 0}let F=oj(B.item.verb.toLowerCase(),J),E=oj(D.item.verb.toLowerCase(),J);if(F!==E)return E-F;let Y=oj(s41(B.item),J),Z=oj(s41(D.item),J);if(Y!==Z)return Z-Y;return D.score-B.score},isItemDisabled:(B)=>B.status.type==="disabled",buildDisabledReasonWidget:(B,D)=>{if(B.status.type!=="disabled")return;let{colors:J}=O0.of(D);return new d({text:new w(B.status.reason,new T({color:J.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:(B,D,J,F)=>new Pi4({command:B,isSelected:D,isDisabled:J,categoryWidth:$,buildContext:F}),onAccept:(B)=>{this.props.onAccept(B)},onDismiss:this.props.onDismiss})})}}class Pi4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:$,isDisabled:B,categoryWidth:D,buildContext:J}=this.props,F=O0.of(J),{colors:E,app:Y}=F,Z=$?Y.selectionBackground:void 0,U=$?Y.selectionForeground:E.foreground,X=$?U:E.mutedForeground,G=new d({text:new w(Q.noun?.toLowerCase()??"",new T({color:X,dim:B||!$})),textAlign:"right"}),V=[new w(Q.verb.toLowerCase(),new T({color:U,bold:!0,dim:B}))];if(B)V.push(new w(" (unavailable)",new T({color:U,dim:!0})));let K=d.spans(V),W=[{child:G,fixedWidth:D},{child:K,expanded:!0}];if(Q.shortcut)W.push({child:df3(Q.shortcut,F,B)});return new _i4({columns:W,padding:V0.horizontal(1),backgroundColor:Z})}}function s41(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function mf3(A){return A.reduce((Q,$)=>{return $.noun?Math.max(Q,J4($.noun)):Q},0)}function df3(A,Q,$){let{colors:B,app:D}=Q,J=new T({color:B.mutedForeground,dim:$}),F=[];for(let E of A.modifiers()){if(F.length>0)F.push(new w(" ",J));F.push(new w(pf3(E),new T({color:D.keybind,bold:!0,dim:$})))}if(F.length>0)F.push(new w(" ",J));return F.push(new w(cf3(A),new T({color:D.keybind,bold:!0,dim:$}))),d.spans(F)}function pf3(A){return A==="Meta"&&ui4.platform==="darwin"?"Cmd":A}function cf3(A){return A.meta&&ui4.platform==="darwin"?A.key.toUpperCase():A.key}class _i4 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 E=0;E<Q.length;E++){let Y=Q[E];if(E>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 F=new r0({crossAxisAlignment:"start",children:J});if(!B&&!D)return F;return new x0({decoration:D?{color:D}:void 0,padding:B,child:F})}}class e41{#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 Ms,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#$(){for(let A of this.#Q)A()}}class w9 extends GA{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=w9.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(w9)?.commandRegistry??null}}class A61 extends u0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new Ti4}}class Ti4 extends R0{modalStack=new Ms;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=w9.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=w9.of(A).commands,$=new t41({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 r41({root:$,controller:this.modalStack})}}var Q61=[{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"]}]}],$61=[{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 rU0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let $=b1.of(A).size.width,B=50,D=$<50,J=[];for(let F of this.items){let[E,Y]=this.renderRow(F),Z;if(D)Z=new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:[E,new f0({padding:V0.only({left:4}),child:Y})]});else Z=new r0({crossAxisAlignment:"start",children:[new R1({flex:1,child:E}),new X0({width:1}),new R1({flex:1,child:Y})]});J.push(new f0({padding:V0.horizontal(6),child:Z}))}return new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:J})}}class B61 extends u0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:$}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=$??!0}createState(){return new vi4}}class vi4 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=b1.of(A),F=new T({color:$.primary,bold:!0}),E=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,W=V-4,z=Math.max(40,Math.min(80,K)),I=new Set(["permissions-disable"]),q=[...this.widget.commands.filter((L)=>{let j=L.noun?.toLowerCase();return j!=="dev"&&j!=="debug"&&!L.id.startsWith("debug-")&&!I.has(L.id)})].sort((L,j)=>{let k=(L.noun??"").toLowerCase(),_=(j.noun??"").toLowerCase(),S=k.localeCompare(_);if(S!==0)return S;let h=L.verb.toLowerCase(),b=j.verb.toLowerCase(),v=h.localeCompare(b);if(v!==0)return v;return L.id.localeCompare(j.id)}),N=new k6({autofocus:!0,controller:this.scrollController,child:new x0({constraints:new w1(z,z,0,Number.POSITIVE_INFINITY),child:new S0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new $4({child:new d({text:new w(`Amp CLI - Help & Keyboard Shortcuts
|
|
5228
5228
|
`,F)})}),new X0({height:1}),new f0({padding:V0.horizontal(2),child:new d({text:new w(`Editor Shortcuts
|
|
5229
5229
|
`,E)})}),new rU0({items:Q61.filter((L)=>L.submitOnEnterOnly===void 0||L.submitOnEnterOnly===this.widget.submitOnEnter),renderRow:(L)=>{let j=[];for(let _ of L.methods){let S=this.buildCleanKeyCombination(_);j.push(S)}let k=j.join(", ");return[new d({text:new w(k,Y)}),new d({text:new w(L.description,U)})]}}),new X0({height:1}),new f0({padding:V0.horizontal(2),child:new d({text:new w(`Scrolling & Navigation
|
|
5230
5230
|
`,E)})}),new rU0({items:$61,renderRow:(L)=>{let j=[];for(let _ of L.methods){let S=this.buildCleanKeyCombination(_);j.push(S)}let k=j.join(", ");return[new d({text:new w(k,Y)}),new d({text:new w(L.description,U)})]}}),new X0({height:1}),new f0({padding:V0.horizontal(2),child:new d({text:new w(`Command Palette Commands
|
|
@@ -5315,7 +5315,7 @@ Ctrl-X, Y, Z to unlock`;if(this.widget.centerContent)h=this.widget.centerContent
|
|
|
5315
5315
|
`))}return F}function Jp3(A,Q,$){let{colors:B,app:D}=$,J=Fp3(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(` ${Xs4(Q.description,50)}`,new T({color:B.foreground,dim:!0})));if(Q.error)A.push(new w(` ${Xs4(Q.error,40)}`,new T({color:D.toolError})));A.push(new w(`
|
|
5316
5316
|
`))}function Fp3(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 Xs4(A,Q){let $=A.replace(/\s+/g," ").trim();if(J4($)<=Q)return $;let B="...",D=J4(B);if(Q<=D)return UQ(B,Q);return`${UQ($,Q-D,!0,"")}${B}`}var K31="https://ampcode.com/news/neo",z31=[{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:K31,href:K31},"","",{text:"Need old Amp for a bit? Use ",keybind:"amp --take-me-back"}]}];function Ep3(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:K31,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function Yp3(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var dy=50,HR=40,G31=1000,Zp3=420,Up3=760,Xp3=-250,Gp3=1100,lX0=33,zs4=0.999,Vp3=2.1,Kp3=720,zp3=420,Ms4="Meet the new",Ls4="Amp",Os4="CLI",W31=G4(Ms4).length,Wp3=G4(Ls4).length,Ip3=G4(Os4).length,iX0={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},Ws4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},Is4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},Hs4=[iX0,Ws4,Is4,iX0,Ws4,Is4,iX0],Hp3=iX0;class I31 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??Yp3(),this.introStages=this.variant==="npm-migration"?Ep3(this.binaryInstallCommand):z31,this.dismissible=this.variant!=="npm-migration"}createState(){return new js4}}class js4 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=G31;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 n9(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=JF(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=zs4,this.firstStageHintVisible=this.animationProgress>=zs4,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:G31,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=JF(A/Up3);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},lX0)}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=JF($/Zp3);if(this.setState(()=>{if(this.stageTransitionProgress=B,B>=1)this.previousIntroStage=null}),B>=1)this.stopStageTransitionTimer()},lX0)}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=JF(D/this.animationDurationMs),F=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*py(J);if(this.setState(()=>{this.animationProgress=F}),J>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},lX0)}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,G31+Xp3),Q=A+Gp3;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?JF((A-this.firstStageTitleRevealStartedAt)/Kp3):this.firstStageTitleRevealProgress,$=this.firstStageHintRevealStartedAt?JF((A-this.firstStageHintRevealStartedAt)/zp3):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=$}),Q>=1&&$>=1)this.stopFirstStageRevealTimer()},lX0)}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=qs4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:Ns4(qs4(this.previousIntroStage),A,py(this.stageTransitionProgress));return this.dismissProgress>0?Ns4(Q,Hp3,py(this.dismissProgress)):Q}build(A){let Q=L1.of(A).colorScheme,$=O0.of(A),B=this.currentOrbPalette(),D=D$(1,"frontier",B),J=b1.of(A).size,E=this.widget.animationProgress??this.animationProgress,Y=Math.max(J.width/dy,J.height/HR)*Vp3,Z=Y+(1-Y)*E,U=py(this.dismissProgress),X=Math.max(dy,Math.round(dy*Z)),G=Math.max(HR,Math.round(HR*Z)),V=Math.round((J.width-X)/2),K=Math.round((J.height-G)/2),W=Math.max(0,Math.floor((J.width-dy)/2)),z=-Math.floor(HR/2),I=Math.round(V+(W-V)*E),H=Math.round(K+(z-K)*E),q=I+X/2,N=H+G/2,C=qp3({dismissProgress:this.dismissProgress,easedDismissProgress:U,introOrbScale:Z,normalOrbCenterX:q,normalOrbCenterY:N,size:J}),O=Math.max(dy,Math.round(dy*C.orbScale)),L=Math.max(HR,Math.round(HR*C.orbScale)),j=C.orbCenterX,k=C.orbCenterY,_=Math.round(j-O/2),S=Math.round(k-L/2),h=Math.max(3,Math.min(J.height-5,Math.floor(HR/2)+2)),b=Math.max(h+3,J.height-3),v=C.textDissolveProgress,x=this.isFinalIntroStage()?C.backdropDissolveProgress:0,c=this.firstStageTitleVisible&&v<1,p=c&&this.firstStageHintVisible,g=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)),W0=Math.min(12,Math.max(8,J.height-h-6)),Y0=Math.max(0,Math.floor((J.width-A0)/2)),I0=Math.max(0,Math.min(J.height-W0,Math.floor(J.height*0.55-W0/2))),j0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new NN({width:O,height:L,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new NN({width:O,height:L,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 Rs4({color:Q.background,dissolveProgress:x}),new i4({fit:"expand",children:[new O1({onClick:()=>{},child:X0.expand()}),new o4({left:_,top:S,width:O,height:L,child:j0}),...c?[new o4({left:Y0,top:I0,width:A0,height:W0,child:Cp3({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:A0,height:W0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:D,link:$.app.link,keybind:$.app.keybind,titleRevealProgress:i,dissolveProgress:v,context:A})})]:[],...p?[...g?[new o4({left:Y0,top:Math.max(0,b-1),width:A0,height:1,child:new d({text:Rp3({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:v}),textAlign:"center"})})]:[],new o4({left:Y0,top:b,width:A0,height:1,child:Pp3({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:$.app.keybind,revealProgress:r,dissolveProgress:v,context:A})})]:[]]})]})})}}class Rs4 extends j5{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new us4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class us4 extends c1{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),F=Math.floor(this.size.height),E={bg:this.color},Y=JF(this.dissolveProgress);if(Y<=0){A.fill(B,D,J,F," ",E);return}if(Y>=1)return;for(let Z=0;Z<F;Z++)for(let U=0;U<J;U++)if(!Np3(U,Z,J,F,Y))A.fill(B+U,D+Z,1,1," ",E)}}function JF(A){return Math.min(1,Math.max(0,A))}function py(A){return 1-(1-A)**3}function qs4(A){return Hs4[A]??Hs4[0]}function Ns4(A,Q,$){return{primary:vj(A.primary,Q.primary,$),secondary:vj(A.secondary,Q.secondary,$)}}function qp3({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:JF(A/0.52),backdropDissolveProgress:py(JF((A-0.12)/0.88))}}function Np3(A,Q,$,B,D){let J=B<=1?0:Q/(B-1),F=Ps4(A+Q*Math.max(1,$));return(1-J)*0.72+F*0.28<D}function Cp3({introStages:A,stage:Q,previousStage:$,progress:B,direction:D,width:J,height:F,foreground:E,mutedForeground:Y,accent:Z,link:U,keybind:X,titleRevealProgress:G,dissolveProgress:V,context:K}){if($===null||B>=1)return V31({introStages:A,stage:Q,foreground:E,mutedForeground:Y,accent:Z,link:U,keybind:X,titleRevealProgress:G,dissolveProgress:V,context:K});let W=py(B),z=D*Math.round((1-W)*J),I=-D*Math.round(W*J);return new gz(new i4({fit:"expand",children:[new o4({left:I,top:0,width:J,height:F,child:V31({introStages:A,stage:$,foreground:E,mutedForeground:Y,accent:Z,link:U,keybind:X,titleRevealProgress:$===0?1:G,dissolveProgress:V,context:K})}),new o4({left:z,top:0,width:J,height:F,child:V31({introStages:A,stage:Q,foreground:E,mutedForeground:Y,accent:Z,link:U,keybind:X,titleRevealProgress:G,dissolveProgress:V,context:K})})]}))}function V31({introStages:A,stage:Q,foreground:$,mutedForeground:B,accent:D,link:J,keybind:F,titleRevealProgress:E,dissolveProgress:Y,context:Z}){let U=A[Q]??A[0]??z31[0],X=new T({color:D,bold:!0}),G=new T({color:$}),V=A===z31&&Q===0,K=[...U.title===null?[]:[new d({text:V?nX0(Lp3({progress:E,foreground:D,pulseColor:D}),Y):new w(VB(U.title,Y),X),textAlign:"center"})],...U.body.length>0?[wp3()]:[],...U.body.map((W)=>Mp3(W,G,B,J,F,Y,Z))];return new $4({child:new f0({padding:V0.horizontal(1),child:new S0({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:K})})})}function wp3(){return X0.height(1)}function Mp3(A,Q,$,B,D,J,F){if(typeof A==="string")return new d({text:new w(VB(A,J),Q),textAlign:"center"});if("codeBlock"in A)return new U5({onCopy:(E,Y)=>{if(Y)w3.success(F,"Copied to clipboard",2000)},child:new S0({mainAxisSize:"min",children:A.codeBlock.map((E)=>new d({text:new w(VB(E,J),new T({color:D})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let E=new d({text:new w("",void 0,[new w(VB(A.text,J),new T({color:$,dim:!0})),new w(VB(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 $4({child:new U5({child:E})});return E}if("highlightText"in A){let E=P6.createSpan(A.href,A.linkText,new T({color:B,underline:!0})),Y=oZ.of(F),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(E.text,E.style,E.children,E.hyperlink,()=>{n6(F,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new w(A.textAfter,Q)]);return new d({text:nX0(Z,J),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new S0({mainAxisSize:"min",children:[new d({text:new w(VB(A.text,J),Q),textAlign:"center"}),new $4({child:new r0({mainAxisSize:"min",children:[P6.createWidget(F,A.href,VB(A.linkText,J),new T({color:B,underline:!0})),new d({text:new w(VB(A.textAfter,J),Q)})]})})]});let E=P6.createSpan(A.href,A.linkText,new T({color:B,underline:!0})),Y=oZ.of(F),Z=new w("",void 0,[new w(A.text,Q),new w(E.text,E.style,E.children,E.hyperlink,()=>{n6(F,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new w(A.textAfter,Q)]);return new d({text:nX0(Z,J),textAlign:"center"})}if(J>0)return new d({text:new w(VB(A.text,J),new T({color:B,underline:!0})),textAlign:"center"});return new $4({child:P6.createWidget(F,A.href,A.text,new T({color:B,underline:!0}))})}function Lp3({progress:A,foreground:Q,pulseColor:$}){let B=new T({color:Q,bold:!0}),D=new T({color:jp3({progress:A,foreground:Q,pulseColor:$}),bold:!0});return new w("",void 0,[new w(Op3(A).padEnd(W31," "),B),new w(" ",B),new w(Cs4(Ls4,Wp3,A,0.72),B),new w(" ",B),new w(Cs4(Os4,Ip3,A,0.88),D)])}function Op3(A){let Q=G4(Ms4),$=Math.min(W31,Math.ceil(JF(A/0.62)*W31));return Q.slice(0,$).join("")}function Cs4(A,Q,$,B){return $>=B?A:"".padEnd(Q," ")}function jp3({progress:A,foreground:Q,pulseColor:$}){if(A<0.88||A>=1)return Q;let B=JF((A-0.88)/0.12);return Math.cos(B*Math.PI*4)*(1-B)>0.12?$:Q}function Rp3({stage:A,featureStageCount:Q,foreground:$,dissolveProgress:B}){return new w(VB(`${A}/${Q}`,B),new T({color:$,dim:!0}))}function up3({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:D,dissolveProgress:J}){let F=new T({color:B}),E=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,F),new w(Z,E),new w(U,F),new w(X,E)]);let V=ws4(Y,D),K=ws4(G,JF((D*(G4(Y).length+G4(G).length)-G4(Y).length)/G4(G).length));return new w("",void 0,[new w(VB(V,J),F),new w(VB(K.slice(0,Z.length),J),E),new w(VB(K.slice(Z.length,Z.length+U.length),J),F),new w(VB(K.slice(Z.length+U.length),J),E)])}function Pp3({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:D,dissolveProgress:J,context:F}){if(Q)return new d({text:up3({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:D,dissolveProgress:J}),textAlign:"center"});let E=new T({color:B}),Y=new T({color:$,dim:!0});return new U5({onCopy:(Z,U)=>{if(U)w3.success(F,"Copied to clipboard",2000)},child:new d({text:new w("",void 0,[new w("q",E),new w(" to quit, or use ",Y),new w("amp --take-me-back",E),new w(" to use the old version",Y)]),textAlign:"center",selectable:!0})})}function ws4(A,Q){let $=G4(A),B=Math.min($.length,Math.ceil(JF(Q)*$.length));return $.slice(0,B).join("").padEnd($.length," ")}function nX0(A,Q,$=0){if(Q<=0)return A;let B=$+G4(A.text??"").length,D=A.children?.map((J)=>{let F=nX0(J,Q,B);return B+=G4(J.toPlainText()).length,F});return new w(A.text?VB(A.text,Q,$):A.text,A.style,D,A.hyperlink,A.onClick)}function VB(A,Q,$=0){if(Q<=0)return A;return G4(A).map((D,J)=>{if(D.trim()==="")return D;return Ps4($+J)<Q?" ":D}).join("")}function Ps4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}p0();e2();function $C(A,Q){let{colors:$,dim:B}=Q,D=[];if(A.totalCostUSD===null)return D;let J=A.costBreakdown,F=J?.freeUSD??0,E=J?.paidUSD??0;if(F===0&&E===0)return D;let Z={decimalPlaces:"more-if-tiny",intent:"cost"};if(E===0)D.push(new w(nG(F,Z),new T({color:$.foreground,dim:B}))),D.push(new w(" (free)",new T({color:$.foreground,dim:B})));else if(F>0)D.push(new w(nG(F,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(nG(E,Z),new T({color:$.foreground,dim:B,bold:!B})));else D.push(new w(nG(E,Z),new T({color:$.foreground,dim:B,bold:!B})));return D}class H31 extends V4{}class q31 extends V4{}function _p3(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 Tp3(A,Q){let $=O0.of(Q),{colors:B}=$,D=$C(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(`
|
|
5317
5317
|
|
|
5318
|
-
`)),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 vp3(A,Q,$){let B=Tp3(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 x4.maybeInvoke(Q,new K8(D,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),F=new T1(()=>{return n6(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 x4({actions:new Map([[H31,J],[q31,F]]),child:new vA({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[G1.key("o"),new q31],[G1.key("y"),new H31]]),child:new v4({autofocus:!0,debugLabel:"ThreadCostBody",child:B})})})})}function _s4(A){return{noun:"thread",verb:"show cost",description:"Show usage cost for the active thread",keywords:["usage","credits","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 e4.threadDisplayCostInfo({threadID:D},{config:A.configService});if(!J.ok){A.toastController.show(_p3(D,J.error),"error",5000),B();return}Q.push(vp3(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()}}}}p0();u9();Q4();class ez extends V4{direction;constructor(A){super();this.direction=A}}class aX0 extends V4{}class as extends V4{}class oX0 extends V4{index;constructor(A){super();this.index=A}}function N31(A){return A.length+2}class C31 extends u0{props;constructor(A){super();this.props=A}createState(){return new Ts4}}class Ts4 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 ez)return this.moveSelection(A.direction),"handled";if(A instanceof aX0)return this.acceptIndex(this.selectedIndex),"handled";if(A instanceof as)return this.widget.props.onDismiss(),"handled";if(A instanceof oX0)return this.acceptIndex(A.index),"handled";return"ignored"};buildShortcuts(){let A=new Map([[G1.key("ArrowDown"),new ez(1)],[G1.key("j"),new ez(1)],[G1.ctrl("n"),new ez(1)],[G1.key("ArrowUp"),new ez(-1)],[G1.key("k"),new ez(-1)],[G1.ctrl("p"),new ez(-1)],[G1.key("Enter"),new aX0],[G1.key("Escape"),new as],[G1.ctrl("."),new as]]);return this.widget.props.entries.forEach((Q,$)=>{if(Q.type==="item"&&Q.shortcut)A.set(Q.shortcut,new oX0($))}),A}buildActions(){return new Map([[ez,new T1(this.invoke)],[aX0,new T1(this.invoke)],[as,new T1(this.invoke)],[oX0,new T1(this.invoke)]])}build(A){let Q=O0.of(A),$=kp3(this.widget.props.entries,b1.of(A).supportsEmojiWidth);return new x0({width:this.widget.props.width,height:N31(this.widget.props.entries),decoration:new R4(Q.colors.background,d1.all(new p1(Q.colors.border,1,"solid"))),child:new x4({actions:this.buildActions(),child:new vA({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 x0({height:1,decoration:{border:new d1(new p1(B.colors.border,1,"solid"))}});let D=Q===this.selectedIndex,J=A.enabled??!0,F=new T({color:D?B.app.selectionForeground:B.colors.foreground,dim:!J}),E=new T({color:D?B.app.selectionForeground:B.app.keybind,bold:!0,dim:!J});return new O1({onClick:()=>this.acceptIndex(Q),child:new x0({padding:V0.symmetric(1,0),decoration:D?new R4(B.app.selectionBackground):void 0,child:new r0({crossAxisAlignment:"start",children:[new R1({child:new d({text:new w(A.label,F),maxLines:1,overflow:"ellipsis"})}),new X0({width:1}),new X0({width:$,child:new d({text:new w(vs4(A),E),textAlign:"right",maxLines:1,overflow:"ellipsis"})})]})})})}}function kp3(A,Q){return A.reduce(($,B)=>{return B.type==="item"?Math.max($,J4(vs4(B),Q)):$},0)}function vs4(A){return A.shortcutLabel??A.shortcut?.toString().toLowerCase()??""}var Sp3=36,fp3=24,yp3=72;class ks4 extends u0{child;onContext;constructor(A,Q){super();this.child=A;this.onContext=Q}createState(){return new Ss4}}class Ss4 extends R0{build(A){return this.widget.onContext(A),this.widget.child}}function fs4(A){return A.replace(/ ago$/,"")}function rX0(A){return A.reduce((Q,$)=>Math.max(Q,J4(fs4($.description.timeAgo))),0)}function ys4(A){return Math.max(fp3,Math.min(A,yp3))}class w31 extends V4{}class M31 extends V4{}class L31{options;visibility;width=Sp3;constructor(A){this.options=A;this.visibility=new Wr(A.state)}isVisible(){return this.visibility.isEnabled()}buildBody(A){return new r0({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 xs4({activeThreadID:this.options.getActiveThreadID(),currentWorkspaceURI:t1(i0.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",keywords:["sidebar","recent","history","threads"],shortcut:G1.alt("s"),status:{type:"enabled"},run:(A,Q,$)=>{$(),this.toggle()}}]}shortcutEntries(){return this.options.isAvailable()?[[G1.alt("s"),new fU0]]:[]}actionEntries(){if(!this.options.isAvailable())return[];return[[fU0,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=ys4(A);if(Q===this.width)return;this.options.state.setState(()=>{this.width=Q})}}class xs4 extends u0{props;constructor(A){super();this.props=A}createState(){return new bs4}}class bs4 extends R0{threads=[];isLoading=!0;isSwitchingThread=!1;hasError=!1;filterByWorkspace=!0;timeColWidth=0;contextMenu=null;pendingThreadMutations=new Map;resizeSession=null;isResizeHandleHovered=!1;pickerController=new Sr;threadItemContexts=new Map;shortcuts=new Map([[G1.alt("w"),new w31],[G1.ctrl("."),new M31]]);actions=new Map([[w31,new T1(()=>{return this.setState(()=>{this.filterByWorkspace=!this.filterByWorkspace,this.contextMenu=null}),"handled"})],[M31,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=GA1(A);if(!this.mounted)return;this.setState(()=>{this.pickerController.selectedItem=Q.find(($)=>$.id===this.widget.props.activeThreadID)??null,this.threads=Q,this.timeColWidth=rX0(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(),$=N31(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(),F=this.context.findRenderObject();if(!(J instanceof c1)||!(F instanceof c1))return{left:B,top:1};let E=J.localToGlobal({x:0,y:0}),Y=F.localToGlobal({x:0,y:0}),Z=E.y-Y.y,U=Z+J.size.height,X=b1.sizeOf(this.context).height,G=Math.max(1,Math.min(F.size.height,X-Y.y)),W=G-U>=Q||Z<G/2?U:Z-Q,z=Math.max(0,G-Q);return{left:B,top:Math.max(0,Math.min(W,z))}}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"){x4.maybeInvoke(this.context,new K8(Q,"Thread ID copied to clipboard","Failed to copy thread ID"));return}x4.maybeInvoke(this.context,new K8(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=rX0(this.getOptimisticThreads())}),i6.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=rX0(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=rX0(this.getOptimisticThreads());let B=this.pickerController.selectedItem?.id??null;if(B===null||B===Q.fallbackSelectedThreadID)this.pickerController.selectedItem=$})}async archiveContextMenuThread(A){let Q=w3.maybeOf(this.context),{configService:$}=G5.of(this.context);if(!this.beginOptimisticArchive(A))return;try{let B=await hZ0({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 f$(new URL(G5.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 o4({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 C31({entries:this.buildContextMenuEntries(),width:A.width,onAccept:this.handleContextMenuAccept,onDismiss:this.closeContextMenu})})})}buildContextMenuBackdrop(){return new o4({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:F}=D,E=!Q,Y=Q?J.selectionForeground:F.foreground,Z=Q?J.selectionForeground:F.mutedForeground,X=A.id===this.widget.props.activeThreadID?new d({text:new w("*",new T({color:Q?J.selectionForeground:F.success,dim:E}))}):void 0,G=fs4(A.description.timeAgo);return new ks4(new x0({padding:V0.symmetric(1,0),child:new r0({children:[new X0({width:2,child:X}),new R1({child:new d({text:new w(A.title,new T({color:Y,dim:E})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),new X0({width:$,child:r0.end([new d({text:new w(G,new T({color:Z,dim:E}))})])})]})}),(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,$=ys4(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 o4({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",F=this.isResizeActive?2:1,E=new d1(void 0,new p1(Q.colors.border,F),void 0,void 0),Y=this.buildContextMenuOverlay(),Z=[new x0({decoration:new R4(Q.colors.background,E),child:new x4({actions:this.actions,child:new vA({shortcuts:this.shortcuts,debugLabel:"ThreadListSidebarFilter",child:new pA({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 x0({width:this.widget.props.width,child:new i4({fit:"expand",children:Z})})}}class O31 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 gs4}}class gs4 extends R0{editorController=new _2;commandPalette=new Wr(this);commandRegistry=new e41;toastController=new K01;relaunchNotificationController=new c41;exitHintTimer=new zr(this,1000);ideStatus=new X8(this,{});threadNavigationHistory=new a41;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 Ps;pluginIntegration=null;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};analyzeContextForThread=async(A,Q)=>{return Qg4({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 L31({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)=>aU0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await hZ0({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let $=await Zp4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};removeThreadLabel=async(A,Q)=>{let $=await Up4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};initState(){if(JB.getInstance().interceptConsole(),this.neoInvadersHighScore=this.widget.neoContext.neoInvadersHighScore??0,this.notices=new P41(this.widget.configService,($)=>this.setState($)),i6.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(s50($.settings)))}),this.updateRelaunchIntegration=new i41({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 p41({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 u41({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?Wi4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],B=[Oi4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(D,J,F)=>{D.pushWithDismiss((E)=>VA1({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:E,onThreadSelected:F}))}},...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,F)=>{A.navigateBack(),F()}},_s4({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,F)=>{A.navigateForward(),F()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",keywords:["servers","tools","plugins","integrations"],status:{type:"enabled"},run:(D,J,F)=>{D.push(new y61({mcpServers:this.widget.neoContext.mcpServers,onDismiss:F}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",keywords:["tools","toolbox"],status:{type:"enabled"},run:(D)=>{D.pushWithDismiss((J)=>new X31({toolboxes:this.widget.neoContext.toolboxes,onDismiss:J}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(D,J,F)=>{try{await n6(J,"https://ampcode.com/chronicle")}finally{F()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{J$(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","editor","attach"],status:{type:"enabled"},run:(D,J,F)=>{D.pushWithDismiss((E)=>new S61({onCancel:E,onSelect:(Y)=>{this.handleIdeSelection(Y),F()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["shortcuts","keybindings","docs","manual","?"],status:{type:"enabled"},run:(D,J,F)=>{D.push(new D61({commands:w9.of(J).commands,onDismiss:F}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",keywords:["intro","onboarding","getting started"],status:{type:"enabled"},run:(D,J,F)=>{F(),A.showNeoWelcome()}},{noun:"amp",verb:"end credits",description:"Roll the full-screen Amp credits",keywords:["team","contributors","movie","credits","easter egg"],status:{type:"enabled"},run:(D,J,F)=>{F(),A.showEndCredits()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["about","release","build"],status:{type:"enabled"},run:(D,J,F)=>{D.push(new C6({header:"Amp Version",maxWidth:72,onDismiss:F,child:new d({text:new w(GZ0({version:"0.0.1779772576-g751b94",buildTimestamp:"2026-05-26T05:20:44.243Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:G1.ctrl("c"),status:{type:"enabled"},run:(D,J)=>{x4.maybeInvoke(J,new wy)}},...Q,...tl4(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 U31({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=b1.of(A),F=J.capabilities.animationSupport!=="disabled",Y=[new x0({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 A61({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)Y.push(VA1({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 I31({onDismiss:this.dismissNeoWelcome,onQuit:()=>z4.instance.stop(),animationsEnabled:F,variant:this.widget.neoWelcomeVariant})}));let Z=this.executorAlreadyConnectedDialog;if(Z)Y.push(new k4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new v61({existingExecutorPid:Z.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(Y.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),Y.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)Y.push(new F61({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:sX0.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)Y.push(new k61);if(this.endCreditsVisible)Y.push(new j61({onComplete:this.completeEndCredits,highScore:this.neoInvadersHighScore,onHighScoreChange:this.updateNeoInvadersHighScore}));return new G5({neoContext:this.widget.neoContext,child:new w9({commandRegistry:this.commandRegistry,child:new Ly({completionBuilder:this.widget.completionBuilder,child:new w3({controller:this.toastController,child:new x4({actions:this.buildActions(),child:new vA({debugLabel:"NeoAppShortcuts",shortcuts:this.buildShortcuts(),child:new v4({debugLabel:"AppShellFocus",child:new z01({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...B&&this.activeThreadContext&&!this.neoWelcomeVisible?[this.notices]:[]],child:new J61({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new i4({children:Y})})})})})})})})})})}buildShortcuts(){let A=new Map([[G1.ctrl("c"),new _U0],[G1.ctrl("o"),new vU0],[G1.alt("i"),new SU0],[G1.alt("p"),new jN],[G1.ctrl("."),new xU0],[G1.ctrl("t"),new gU0],...this.threadListSidebar.shortcutEntries()]);if(sX0.env.NODE_ENV==="development"&&sX0.platform==="darwin")A.set(G1.meta("r"),new TU0);return A}buildActions(){let A=new T1(()=>{if(OD.hasAnyCopyableSelection())return OD.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 ws({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),F=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"}),E=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=yi4({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([[_U0,A],[Vs,B],[wy,D],[TU0,J],[K8,F],[Is,$],[vU0,Q],[SU0,Z],...this.threadListSidebar.actionEntries(),[xU0,Y],...U,[jN,E],[gU0,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 bf(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=FB(Q),D=sY0(this.widget.neoContext,Q);if(B!==void 0&&D!==void 0)$={...$,[B]:D};return rY0($,{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=hs4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(cF(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=hs4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(cN);if(this.exitHintTimer.isActive())A.add(Iy);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}),GQ((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(m50);if(J)this.widget.history.add(J.text,sX0.cwd()),this.widget.history.reset();let F=$?void 0:await this.widget.getDefaultNewThreadVisibility?.(),E=$??F??null,Y=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,E??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=FB(A),D=B?Q[B]:void 0;if(D!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:D};GQ((J)=>{let F={...J,agentMode:A};if($!==void 0)F={...F,lastReasoningEffortByMode:{...F.lastReasoningEffortByMode??{},[A]:$}};if(D!==void 0)F={...F,lastSpeedByMode:{...F.lastSpeedByMode??{},[A]:D}};return F}).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=xJ0(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 hs4(A,Q,$){let B={...A};for(let D of xp3(Q,$)){if(!cF(A[D],Q[D]))continue;let J=$[D];if(J===void 0)delete B[D];else B[D]=J}return B}function xp3(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}a4();function ms4(A,Q,$,B){let D=DT(A),J="\x1B[0m",F="\x1B[34m",E="\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 rJ(U,X),V=new n9(42),K=new CN(U,X,U,X,U,X,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,K0.default(),V);K.layout(w1.tight(U,X)),K.paint(G,0,0);let W=G.getBuffer().getCells(),z=0;for(let j=0;j<X;j++)if(W[j].some((k)=>k.char!==" ")){z=j;break}let I=X-1;for(let j=X-1;j>=0;j--)if(W[j].some((k)=>k.char!==" ")){I=j;break}function H(j,k){if(!j)return"";if(j.type==="rgb"){let{r:_,g:S,b:h}=j.value;if($.getColorDepth()>=24)return`\x1B[${k?38:48};2;${_};${S};${h}m`;let b=uj(_,S,h);return`\x1B[${k?38:48};5;${b}m`}return""}let q=[];if(I>=z)for(let j=z;j<=I;j++){let k="";for(let _=0;_<U;_++){let S=W[j][_],h=S.char,b=H(S.style.fg,!0);k+=b+h+"\x1B[0m"}q.push(k)}let N=q.length,C=Math.max(N,Z.length),O=Math.floor((C-N)/2),L=Math.floor((C-Z.length)/2);for(let j=0;j<C;j++){let k=" ".repeat(U);if(j>=O&&j<O+N)k=q[j-O];let _=" ",S="";if(j>=L&&j<L+Z.length)S=Z[j-L];$.write(k+_+S+`
|
|
5318
|
+
`)),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 vp3(A,Q,$){let B=Tp3(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 x4.maybeInvoke(Q,new K8(D,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),F=new T1(()=>{return n6(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 x4({actions:new Map([[H31,J],[q31,F]]),child:new vA({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[G1.key("o"),new q31],[G1.key("y"),new H31]]),child:new v4({autofocus:!0,debugLabel:"ThreadCostBody",child:B})})})})}function _s4(A){return{noun:"thread",verb:"show cost",description:"Show usage cost for the active thread",keywords:["usage","credits","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 e4.threadDisplayCostInfo({threadID:D},{config:A.configService});if(!J.ok){A.toastController.show(_p3(D,J.error),"error",5000),B();return}Q.push(vp3(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()}}}}p0();u9();Q4();class ez extends V4{direction;constructor(A){super();this.direction=A}}class aX0 extends V4{}class as extends V4{}class oX0 extends V4{index;constructor(A){super();this.index=A}}function N31(A){return A.length+2}class C31 extends u0{props;constructor(A){super();this.props=A}createState(){return new Ts4}}class Ts4 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 ez)return this.moveSelection(A.direction),"handled";if(A instanceof aX0)return this.acceptIndex(this.selectedIndex),"handled";if(A instanceof as)return this.widget.props.onDismiss(),"handled";if(A instanceof oX0)return this.acceptIndex(A.index),"handled";return"ignored"};buildShortcuts(){let A=new Map([[G1.key("ArrowDown"),new ez(1)],[G1.key("j"),new ez(1)],[G1.ctrl("n"),new ez(1)],[G1.key("ArrowUp"),new ez(-1)],[G1.key("k"),new ez(-1)],[G1.ctrl("p"),new ez(-1)],[G1.key("Enter"),new aX0],[G1.key("Escape"),new as],[G1.ctrl("."),new as]]);return this.widget.props.entries.forEach((Q,$)=>{if(Q.type==="item"&&Q.shortcut)A.set(Q.shortcut,new oX0($))}),A}buildActions(){return new Map([[ez,new T1(this.invoke)],[aX0,new T1(this.invoke)],[as,new T1(this.invoke)],[oX0,new T1(this.invoke)]])}build(A){let Q=O0.of(A),$=kp3(this.widget.props.entries,b1.of(A).supportsEmojiWidth);return new x0({width:this.widget.props.width,height:N31(this.widget.props.entries),decoration:new R4(Q.colors.background,d1.all(new p1(Q.colors.border,1,"solid"))),child:new x4({actions:this.buildActions(),child:new vA({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 x0({height:1,decoration:{border:new d1(new p1(B.colors.border,1,"solid"))}});let D=Q===this.selectedIndex,J=A.enabled??!0,F=new T({color:D?B.app.selectionForeground:B.colors.foreground,dim:!J}),E=new T({color:D?B.app.selectionForeground:B.app.keybind,bold:!0,dim:!J});return new O1({onClick:()=>this.acceptIndex(Q),child:new x0({padding:V0.symmetric(1,0),decoration:D?new R4(B.app.selectionBackground):void 0,child:new r0({crossAxisAlignment:"start",children:[new R1({child:new d({text:new w(A.label,F),maxLines:1,overflow:"ellipsis"})}),new X0({width:1}),new X0({width:$,child:new d({text:new w(vs4(A),E),textAlign:"right",maxLines:1,overflow:"ellipsis"})})]})})})}}function kp3(A,Q){return A.reduce(($,B)=>{return B.type==="item"?Math.max($,J4(vs4(B),Q)):$},0)}function vs4(A){return A.shortcutLabel??A.shortcut?.toString().toLowerCase()??""}var Sp3=36,fp3=24,yp3=72;class ks4 extends u0{child;onContext;constructor(A,Q){super();this.child=A;this.onContext=Q}createState(){return new Ss4}}class Ss4 extends R0{build(A){return this.widget.onContext(A),this.widget.child}}function fs4(A){return A.replace(/ ago$/,"")}function rX0(A){return A.reduce((Q,$)=>Math.max(Q,J4(fs4($.description.timeAgo))),0)}function ys4(A){return Math.max(fp3,Math.min(A,yp3))}class w31 extends V4{}class M31 extends V4{}class L31{options;visibility;width=Sp3;constructor(A){this.options=A;this.visibility=new Wr(A.state)}isVisible(){return this.visibility.isEnabled()}buildBody(A){return new r0({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 xs4({activeThreadID:this.options.getActiveThreadID(),currentWorkspaceURI:t1(i0.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",keywords:["sidebar","recent","history","threads"],shortcut:G1.alt("s"),status:{type:"enabled"},run:(A,Q,$)=>{$(),this.toggle()}}]}shortcutEntries(){return this.options.isAvailable()?[[G1.alt("s"),new fU0]]:[]}actionEntries(){if(!this.options.isAvailable())return[];return[[fU0,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=ys4(A);if(Q===this.width)return;this.options.state.setState(()=>{this.width=Q})}}class xs4 extends u0{props;constructor(A){super();this.props=A}createState(){return new bs4}}class bs4 extends R0{threads=[];isLoading=!0;isSwitchingThread=!1;hasError=!1;filterByWorkspace=!0;timeColWidth=0;contextMenu=null;pendingThreadMutations=new Map;resizeSession=null;isResizeHandleHovered=!1;pickerController=new Sr;threadItemContexts=new Map;shortcuts=new Map([[G1.alt("w"),new w31],[G1.ctrl("."),new M31]]);actions=new Map([[w31,new T1(()=>{return this.setState(()=>{this.filterByWorkspace=!this.filterByWorkspace,this.contextMenu=null}),"handled"})],[M31,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=GA1(A);if(!this.mounted)return;this.setState(()=>{this.pickerController.selectedItem=Q.find(($)=>$.id===this.widget.props.activeThreadID)??null,this.threads=Q,this.timeColWidth=rX0(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(),$=N31(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(),F=this.context.findRenderObject();if(!(J instanceof c1)||!(F instanceof c1))return{left:B,top:1};let E=J.localToGlobal({x:0,y:0}),Y=F.localToGlobal({x:0,y:0}),Z=E.y-Y.y,U=Z+J.size.height,X=b1.sizeOf(this.context).height,G=Math.max(1,Math.min(F.size.height,X-Y.y)),W=G-U>=Q||Z<G/2?U:Z-Q,z=Math.max(0,G-Q);return{left:B,top:Math.max(0,Math.min(W,z))}}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"){x4.maybeInvoke(this.context,new K8(Q,"Thread ID copied to clipboard","Failed to copy thread ID"));return}x4.maybeInvoke(this.context,new K8(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=rX0(this.getOptimisticThreads())}),i6.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=rX0(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=rX0(this.getOptimisticThreads());let B=this.pickerController.selectedItem?.id??null;if(B===null||B===Q.fallbackSelectedThreadID)this.pickerController.selectedItem=$})}async archiveContextMenuThread(A){let Q=w3.maybeOf(this.context),{configService:$}=G5.of(this.context);if(!this.beginOptimisticArchive(A))return;try{let B=await hZ0({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 f$(new URL(G5.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 o4({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 C31({entries:this.buildContextMenuEntries(),width:A.width,onAccept:this.handleContextMenuAccept,onDismiss:this.closeContextMenu})})})}buildContextMenuBackdrop(){return new o4({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:F}=D,E=!Q,Y=Q?J.selectionForeground:F.foreground,Z=Q?J.selectionForeground:F.mutedForeground,X=A.id===this.widget.props.activeThreadID?new d({text:new w("*",new T({color:Q?J.selectionForeground:F.success,dim:E}))}):void 0,G=fs4(A.description.timeAgo);return new ks4(new x0({padding:V0.symmetric(1,0),child:new r0({children:[new X0({width:2,child:X}),new R1({child:new d({text:new w(A.title,new T({color:Y,dim:E})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),new X0({width:$,child:r0.end([new d({text:new w(G,new T({color:Z,dim:E}))})])})]})}),(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,$=ys4(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 o4({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",F=this.isResizeActive?2:1,E=new d1(void 0,new p1(Q.colors.border,F),void 0,void 0),Y=this.buildContextMenuOverlay(),Z=[new x0({decoration:new R4(Q.colors.background,E),child:new x4({actions:this.actions,child:new vA({shortcuts:this.shortcuts,debugLabel:"ThreadListSidebarFilter",child:new pA({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 x0({width:this.widget.props.width,child:new i4({fit:"expand",children:Z})})}}class O31 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 gs4}}class gs4 extends R0{editorController=new _2;commandPalette=new Wr(this);commandRegistry=new e41;toastController=new K01;relaunchNotificationController=new c41;exitHintTimer=new zr(this,1000);ideStatus=new X8(this,{});threadNavigationHistory=new a41;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 Ps;pluginIntegration=null;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};analyzeContextForThread=async(A,Q)=>{return Qg4({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 L31({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)=>aU0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await hZ0({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let $=await Zp4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};removeThreadLabel=async(A,Q)=>{let $=await Up4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};initState(){if(JB.getInstance().interceptConsole(),this.neoInvadersHighScore=this.widget.neoContext.neoInvadersHighScore??0,this.notices=new P41(this.widget.configService,($)=>this.setState($)),i6.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(s50($.settings)))}),this.updateRelaunchIntegration=new i41({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 p41({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 u41({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?Wi4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],B=[Oi4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(D,J,F)=>{D.pushWithDismiss((E)=>VA1({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:E,onThreadSelected:F}))}},...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,F)=>{A.navigateBack(),F()}},_s4({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,F)=>{A.navigateForward(),F()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",keywords:["servers","tools","plugins","integrations"],status:{type:"enabled"},run:(D,J,F)=>{D.push(new y61({mcpServers:this.widget.neoContext.mcpServers,onDismiss:F}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",keywords:["tools","toolbox"],status:{type:"enabled"},run:(D)=>{D.pushWithDismiss((J)=>new X31({toolboxes:this.widget.neoContext.toolboxes,onDismiss:J}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(D,J,F)=>{try{await n6(J,"https://ampcode.com/chronicle")}finally{F()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{J$(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","editor","attach"],status:{type:"enabled"},run:(D,J,F)=>{D.pushWithDismiss((E)=>new S61({onCancel:E,onSelect:(Y)=>{this.handleIdeSelection(Y),F()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["shortcuts","keybindings","docs","manual","?"],status:{type:"enabled"},run:(D,J,F)=>{D.push(new D61({commands:w9.of(J).commands,onDismiss:F}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",keywords:["intro","onboarding","getting started"],status:{type:"enabled"},run:(D,J,F)=>{F(),A.showNeoWelcome()}},{noun:"amp",verb:"end credits",description:"Roll the full-screen Amp credits",keywords:["team","contributors","movie","credits","easter egg"],status:{type:"enabled"},run:(D,J,F)=>{F(),A.showEndCredits()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["about","release","build"],status:{type:"enabled"},run:(D,J,F)=>{D.push(new C6({header:"Amp Version",maxWidth:72,onDismiss:F,child:new d({text:new w(GZ0({version:"0.0.1779786108-g751b94",buildTimestamp:"2026-05-26T09:06:27.137Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:G1.ctrl("c"),status:{type:"enabled"},run:(D,J)=>{x4.maybeInvoke(J,new wy)}},...Q,...tl4(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 U31({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=b1.of(A),F=J.capabilities.animationSupport!=="disabled",Y=[new x0({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 A61({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)Y.push(VA1({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 I31({onDismiss:this.dismissNeoWelcome,onQuit:()=>z4.instance.stop(),animationsEnabled:F,variant:this.widget.neoWelcomeVariant})}));let Z=this.executorAlreadyConnectedDialog;if(Z)Y.push(new k4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new v61({existingExecutorPid:Z.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(Y.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),Y.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)Y.push(new F61({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:sX0.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)Y.push(new k61);if(this.endCreditsVisible)Y.push(new j61({onComplete:this.completeEndCredits,highScore:this.neoInvadersHighScore,onHighScoreChange:this.updateNeoInvadersHighScore}));return new G5({neoContext:this.widget.neoContext,child:new w9({commandRegistry:this.commandRegistry,child:new Ly({completionBuilder:this.widget.completionBuilder,child:new w3({controller:this.toastController,child:new x4({actions:this.buildActions(),child:new vA({debugLabel:"NeoAppShortcuts",shortcuts:this.buildShortcuts(),child:new v4({debugLabel:"AppShellFocus",child:new z01({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...B&&this.activeThreadContext&&!this.neoWelcomeVisible?[this.notices]:[]],child:new J61({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new i4({children:Y})})})})})})})})})})}buildShortcuts(){let A=new Map([[G1.ctrl("c"),new _U0],[G1.ctrl("o"),new vU0],[G1.alt("i"),new SU0],[G1.alt("p"),new jN],[G1.ctrl("."),new xU0],[G1.ctrl("t"),new gU0],...this.threadListSidebar.shortcutEntries()]);if(sX0.env.NODE_ENV==="development"&&sX0.platform==="darwin")A.set(G1.meta("r"),new TU0);return A}buildActions(){let A=new T1(()=>{if(OD.hasAnyCopyableSelection())return OD.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 ws({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),F=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"}),E=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=yi4({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([[_U0,A],[Vs,B],[wy,D],[TU0,J],[K8,F],[Is,$],[vU0,Q],[SU0,Z],...this.threadListSidebar.actionEntries(),[xU0,Y],...U,[jN,E],[gU0,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 bf(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=FB(Q),D=sY0(this.widget.neoContext,Q);if(B!==void 0&&D!==void 0)$={...$,[B]:D};return rY0($,{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=hs4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(cF(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=hs4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(cN);if(this.exitHintTimer.isActive())A.add(Iy);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}),GQ((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(m50);if(J)this.widget.history.add(J.text,sX0.cwd()),this.widget.history.reset();let F=$?void 0:await this.widget.getDefaultNewThreadVisibility?.(),E=$??F??null,Y=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,E??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=FB(A),D=B?Q[B]:void 0;if(D!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:D};GQ((J)=>{let F={...J,agentMode:A};if($!==void 0)F={...F,lastReasoningEffortByMode:{...F.lastReasoningEffortByMode??{},[A]:$}};if(D!==void 0)F={...F,lastSpeedByMode:{...F.lastSpeedByMode??{},[A]:D}};return F}).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=xJ0(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 hs4(A,Q,$){let B={...A};for(let D of xp3(Q,$)){if(!cF(A[D],Q[D]))continue;let J=$[D];if(J===void 0)delete B[D];else B[D]=J}return B}function xp3(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}a4();function ms4(A,Q,$,B){let D=DT(A),J="\x1B[0m",F="\x1B[34m",E="\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 rJ(U,X),V=new n9(42),K=new CN(U,X,U,X,U,X,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,K0.default(),V);K.layout(w1.tight(U,X)),K.paint(G,0,0);let W=G.getBuffer().getCells(),z=0;for(let j=0;j<X;j++)if(W[j].some((k)=>k.char!==" ")){z=j;break}let I=X-1;for(let j=X-1;j>=0;j--)if(W[j].some((k)=>k.char!==" ")){I=j;break}function H(j,k){if(!j)return"";if(j.type==="rgb"){let{r:_,g:S,b:h}=j.value;if($.getColorDepth()>=24)return`\x1B[${k?38:48};2;${_};${S};${h}m`;let b=uj(_,S,h);return`\x1B[${k?38:48};5;${b}m`}return""}let q=[];if(I>=z)for(let j=z;j<=I;j++){let k="";for(let _=0;_<U;_++){let S=W[j][_],h=S.char,b=H(S.style.fg,!0);k+=b+h+"\x1B[0m"}q.push(k)}let N=q.length,C=Math.max(N,Z.length),O=Math.floor((C-N)/2),L=Math.floor((C-Z.length)/2);for(let j=0;j<C;j++){let k=" ".repeat(U);if(j>=O&&j<O+N)k=q[j-O];let _=" ",S="";if(j>=L&&j<L+Z.length)S=Z[j-L];$.write(k+_+S+`
|
|
5319
5319
|
`)}if(B)$.write(`
|
|
5320
5320
|
\x1B[90m${B}\x1B[0m
|
|
5321
5321
|
`)}p0();p0();import{exec as qR}from"node:child_process";function tX0(A="idle"){try{if(A==="idle"){if(process.platform==="darwin")qR("afplay /System/Library/Sounds/Submarine.aiff");else if(process.platform==="win32")qR("powershell [console]::beep(800,200)");else if(process.platform==="linux")qR("paplay /usr/share/sounds/freedesktop/stereo/message.oga || beep")}else if(A==="idle-review"){if(process.platform==="darwin")qR("afplay /System/Library/Sounds/Glass.aiff")}else if(A==="requires-user-input"){if(process.platform==="darwin")qR("afplay /System/Library/Sounds/Ping.aiff");else if(process.platform==="win32")qR("powershell [console]::beep(1000,300)");else if(process.platform==="linux")qR("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)}}Er();YZ0();var bp3=2000,hp3="Agent is ready",gp3="Waiting for approval";function ds4(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(jY0(I))},F=(I)=>{if(!Q)return;let H=Date.now();if(H-D<bp3)return;if(D=H,hz())return;if(JY0())J(),setTimeout(FY0,mo);else tX0(I)},E=()=>{F("idle"),K(hp3)},Y=()=>{F("requires-user-input"),K(gp3)},Z=(I)=>I?.attempt===void 0||I.attempt===0,U=null,X=null,G=null,V,K=(I)=>{if(!Q||!$)return;if(hz()&&!Yr()&&!Pf())return;J(),setTimeout(()=>{process.stdout.write(po(I))},mo)},W=()=>{U?.unsubscribe(),X?.unsubscribe(),U=null,X=null,G=null,V=void 0};return{attach:(I,H,q)=>{if(W(),V=q,H)X=H.subscribe({next:(N)=>{if(N===null)return;if(!Z(N))return;E()},error:(N)=>{u.debug("Neo notification active error stream errored",{error:N})}});U=I.subscribe({next:(N)=>{try{let C=G!==null&&sQ(G),O=G==="awaiting_approval",L=C||O;if(N==="awaiting_approval"&&!O)Y();else if(N==="idle"&&L)E()}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:W,unsubscribe(){W(),B.unsubscribe()}}}function mp3({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 dp3(A){await GQ((Q)=>mf(Q,A,"interactive"))}async function ps4(A,Q={}){let{initialThreadIDs:$=[],initialUserInput:B,getDefaultNewThreadVisibility:D,openThreadPickerOnStart:J=!1,observerOnly:F=!1,initialAgentMode:E,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 S=await A.getThreadFromServer(_);if(!S)return null;return aE0(S)},W=async(_)=>{let S=await A.getThreadFromServer(_);if(!S)throw Error(`Thread ${_} not found`);let h=await c9(_,A.configService,A.apiKey,{usesThreadActors:!0}),b=OG({endpoint:A.rivetEndpoint,poolName:h.poolName}),v={wsToken:h.wsToken,transport:"amp-rpc"},c=await b.threadActor.getOrCreate([_],{params:v,createWithInput:{threadId:h.threadId,threadVersion:h.threadVersion,ownerUserId:h.ownerUserId,...h.agentMode?{agentMode:h.agentMode}:{}}}).fetch("/import",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({thread:qS4(S)}),skipReadyWait:!0});if(!c.ok&&c.status!==409)throw Error(`Thread import failed (${c.status}): ${await c.text()}`);try{await oS4(_,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)})}},z=new ge0(A.rivetEndpoint,A.apiKey,A.configService,{clientID:AN.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(_,S)=>{let h=typeof S.args==="object"&&S.args!==null?S.args:{},b=await GN({toolName:S.toolName,configService:A.configService,toolService:A.toolService,mcpService:A.mcpService,skillService:A.skillService,toolUseID:S.toolCallId,threadId:_});return A.toolService.invokeTool(S.toolName,{args:h},b)},persistLastThreadID:dp3,readFileSystemDirectory:A.readFileSystemDirectory},K,W),I=await bz(),H=mp3({initialUserInput:B,showNeoWelcome:U,hideNeoWelcome:X,neoWelcomeVariant:G,neoWelcomeDismissed:I.neoWelcomeDismissed}),q={ampURL:A.ampURL,configService:A.configService,getThreadMarkdown:async(_)=>{let S=await A.getThreadFromServer(_);return S?kX(S):null},isInternalUser:A.isInternalUser,listThreads:A.listThreads,logFilePath:Ta,mcpServers:A.mcpService.servers,pluginPlatform:A.pluginPlatform,pluginService:A.pluginService,toolboxes:A.toolboxes,observerOnly:V?!1:F,neoInvadersHighScore:I.neoInvadersHighScore,sessionAgentMode:E??I.agentMode,explicitReasoningEffort:Y,lastReasoningEffortByMode:I.lastReasoningEffortByMode,lastSpeedByMode:I.lastSpeedByMode,settingsFilePath:A.settingsFilePath,splashOrbVisualStyle:Q.splashOrbVisualStyle??"neo",workspaceRoot:A.workspaceRoot},N=(_,S)=>{return Zh4({ampURL:A.ampURL,configService:A.configService,threadID:_,signal:S})},C=new Y01,O=ds4({configService:A.configService}),L=await A.configService.getLatest();z4.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:L.settings["terminal.animation"]===!1}});let j=new Set,k=new l41;try{await Zr(new O31({clientPool:z,listSkillsForThread:N,completionBuilder:A.completionBuilder,history:new qo,ideManager:C,configService:A.configService,updateService:A.updateService,initialThreadIDs:V?[]:$,notificationService:O,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?()=>{GQ(Gh4).catch((S)=>{u.warn("Failed to mark Neo welcome as dismissed",{error:S})})}:void 0,onThreadArchived:(S)=>{j.add(S)},onFirstFrame:Z}));let _=z.lastActiveObservingClient;if(_&&k.shouldShowExitSummary){let{client:S,observer:h}=_,b=S.getThreadId();if(b){let v={id:b,title:h.title().getValue(),agentMode:h.agentMode,archived:j.has(b)},x=`${A.ampURL.replace(/\/$/,"")}/threads/${b}`;ms4(v,x,process.stdout)}}}finally{process.stdout.write(IN("")),O.unsubscribe(),z.dispose(),await A.dispose?.()}process.exit(k.relaunchIfRequested(A.workspaceRoot)??0)}Y5();function cy(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 F={meta:{visibility:"private",shareWithAllCreatorGroups:!0}};if(A.creatorIsViewer===!1)F.disabledReason="Can only be set by thread creator";Q.push(F)}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 cs4(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 NR(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,F)=>{let E=Q.workspace?.groups.find((Y)=>Y.id===F)?.name;if(E)J.push(`'${E}'`);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 eX0(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 ly(A,Q=null){let $=A!==null&&typeof A==="object"&&"visibility"in A?A.visibility:void 0;if(!$||typeof $!=="string")return;let D=cy({workspace:Q?.team??void 0}).filter((J)=>!J.disabledReason).map((J)=>eX0(J.meta));if(D.includes($))return pp3($);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.
|
|
@@ -7077,7 +7077,7 @@ ${D}`,Q);this.line=$,this.column=B,this.codeblock=D}}/*!
|
|
|
7077
7077
|
`),J=[];for(let F=0;F<D.length;F++){let Z=D[F].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(F<D.length-1)J.push(new w(`
|
|
7078
7078
|
`))}return new x0({decoration:{color:$.colorScheme.background,border:d1.all(new p1(B.app.keybind,1,"rounded"))},child:new f0({padding:V0.symmetric(0,1),child:new d({text:new w(void 0,void 0,J)})})})}}class f51 extends j5{chartData;highlightIndex;showAxes;colors;constructor({key:A,chartData:Q,highlightIndex:$=null,showAxes:B=!0,colors:D=zV0}){super(A?{key:A}:{});this.chartData=Q,this.highlightIndex=$,this.showAxes=B,this.colors=D}createRenderObject(){return new k51({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 L16(A,Q,$,B,D,J,F){if(J<=0)return null;switch(A){case"horizontal-bar":{let E=$;return E>=0&&E<J?E:null}case"bar":case"stacked-bar":{let E=F?l2:0,Y=B-E;if(Y<=0)return null;let Z=Q-E;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 E=F?l2:0,Y=B-E;if(Y<=0)return null;let Z=Math.max(0,Math.min(Y-1,Q-E));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 Kr3(A,Q,$,B,D,J,F,E){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?l2: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=E>0?F/E:0,W=Math.round((1-K)*(X-1));return{x:V,y:W}}case"line":case"sparkline":case"stacked-area":{let Z=J?l2: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=E>0?F/E:0,K=Math.round((1-V)*(X-1));return{x:G,y:K}}default:return null}}function zr3(A){let Q=0;for(let $ of A)for(let B of $.points)if(B.value>Q)Q=B.value;return Q||1}function Wr3(A,Q,$,B,D){if($.length<=1){let E=B(A.value),Y=A.meta?` (${A.meta})`:"";return A.label.length+2+E.length+Y.length}let J=A.label.length,F=0;for(let E of $){let Y=E.points[Q];if(!Y)continue;F+=Y.value;let Z=2+E.name.length+2+B(Y.value).length;J=Math.max(J,Z)}if(D){let E=9+B(F).length;J=Math.max(J,E)}return J}function Ir3(A,Q,$,B,D,J,F){let E;try{let K=L1.of(A),W=O0.of(A);E={foreground:K.colorScheme.foreground,background:K.colorScheme.background,border:W.app.keybind}}catch{E={foreground:{type:"index",value:15},background:{type:"index",value:0},border:{type:"index",value:7}}}let Y=new T({color:E.foreground,bold:!0}),Z=new T({color:E.foreground}),U=new T({color:E.foreground,dim:!0}),X=[],G=new T({color:E.foreground,underline:!0}),V=(K,W)=>new w(W,G,void 0,kz(K),()=>{n6(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=F==="stacked-bar"||F==="stacked-area";X.push(new w(`${Q.label}
|
|
7079
7079
|
`,Y));let W=0;for(let z=0;z<B.length;z++){let I=B[z],H=I.points[$];if(!H)continue;W+=H.value;let q=I.color??D[z%D.length]??E.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(z<B.length-1||K)X.push(new w(`
|
|
7080
|
-
`))}if(K)X.push(new w(" ",U)),X.push(new w("Total: ",U)),X.push(new w(J(W),Z))}return new x0({decoration:{color:E.background,border:d1.all(new p1(E.border,1,"rounded"))},child:new d({text:new w(void 0,void 0,X)})})}p0();function O16(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}Y5();a5();y5();b$();u9();e2();yQ();nH();a4();sv();M_();u1();p0();u9();class y51{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.1779772576-g751b94"},parameters:{metadata:{count:$}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await l50(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 zC extends u0{props;constructor(A){super();this.props=A}createState(){return new j16}}class j16 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 R16 extends R0{controller=new _2;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,F=!D||J,E=d1.all(new p1($.foreground,1,"solid")),Y=new YB({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 r0({children:[new x0({decoration:{color:$.background},child:new d({text:new w(">",new T({color:$.foreground}))})}),new R1({child:Y})]}),U=new x0({padding:V0.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(F)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 x0({padding:V0.symmetric(1,0),child:new d({text:new w("",void 0,X)})});return new x0({decoration:{border:E,color:$.background},padding:V0.all(1),child:new S0({children:[U,new X0({height:1}),Z,new Z3,G]})})}}class Vt extends u0{props;constructor(A){super();this.props=A}createState(){return new R16}}yQ();class u16 extends R0{controller=new _2;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>=_9)return!1;let Q=await cG(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=b1.of(A).size.height,F=Math.max(Math.floor(J*0.5),10),E=new sz({controller:this.controller,triggers:[new BY],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:E}),Z=new x0({constraints:new w1({maxHeight:F}),padding:V0.symmetric(1,0),child:Y}),U=new x0({padding:V0.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 x0({padding:V0.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 x0({decoration:{border:d1.all(new p1($.foreground,1,"solid")),color:$.background},padding:V0.all(1),child:new S0({children:G})})}}class x51 extends u0{props;constructor(A){super();this.props=A}createState(){return new u16}}function P16(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 b51 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)=>P16(D.pubDate).length));return new pA({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,F,E)=>{let Y=O0.of(E),{colors:Z}=Y,U=Y.app,X=J?U.selectionBackground:void 0,G=J?U.selectionForeground:Z.foreground,V=Z.mutedForeground,K=(W,z)=>new X0({width:z,child:r0.end([new d({text:new w(W,new T({color:V}))})])});return new x0({decoration:X?{color:X}:void 0,padding:V0.symmetric(2,0),child:new r0({children:[new R1({child:new d({text:new w(D.title,new T({color:G})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),K(P16(D.pubDate),$)]})})}})}}class W${static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!W$._instance)W$._instance=new W$;return W$._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()}}p0();class _16 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,F=this.getAvailableLabels(),Y=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...F];return new pA({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 z=this.currentQuery.trim().toLowerCase();return new x0({decoration:V?{color:V}:void 0,padding:V0.symmetric(2,0),child:new d({text:new w("",void 0,[new w("Create new label: ",new T({color:K})),new w(z,new T({color:K,bold:!0}))])})})}return new x0({decoration:V?{color:V}:void 0,padding:V0.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 h51 extends u0{props;constructor(A){super();this.props=A}createState(){return new _16}}class AU extends u0{props;constructor(A){super();this.props=A}createState(){return new T16}}class T16 extends R0{_spinner=new qA;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=d1.all(new p1($.foreground,1,"solid")),J=this._spinner.toBraille(),F=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:[F]})})];if(this.widget.props.onAbort)Y.push(new X0({height:2,child:new x0({padding:V0.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 x0({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 rG extends u0{props;constructor(A){super();this.props=A}createState(){return new v16}}class v16 extends R0{scrollController=new v6;scrollAreaKey=new Y8("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 l8}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=cZ0($);return{title:U.title,type:U.type,description:U.description}})(),D=B.type==="error"?Q.app.toolError:Q.app.command,J=d1.all(new p1(Q.colors.border,1,"solid")),F=new x0({padding:V0.symmetric(1,0),child:new d({text:new w(B.title,new T({color:D,bold:!0}))})}),E=this.isWidgetMessage($)?$.widget:new d({text:new w(B.description,new T({color:Q.colors.foreground})),selectable:!0}),Y=new R1({child:new U5({child:new x0({padding:V0.symmetric(1,0),child:new r0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new R1({child:new k6({controller:this.scrollController,autofocus:!0,child:E})}),new z8({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 x0({padding:V0.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 x0({decoration:{border:J,color:Q.colors.background},padding:V0.all(1),child:new S0({mainAxisAlignment:"center",children:[F,new X0({height:1}),Y,Z]})})})]})})}}Y5();Q4();class k16 extends u0{props;constructor(A){super();this.props=A}createState(){return new S16}}class S16 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=i0.file(this.widget.props.cwd),$=B1.relativePath(Q,XA(A));if($!==null&&$!==""&&$!==".."&&!$.startsWith("../"))return $;return c3(A)}statusIcon(A){let Q=d2.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,F=this.plugins.reduce((Y,Z)=>Y+Z.registeredCommands.length,0),E=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}))),F>0||E>0)B.push(new w(` (${F} ${U4(F,"command")}, ${E} ${U4(E,"tool")})`,new T({dim:!0})));B.push(new w(`
|
|
7080
|
+
`))}if(K)X.push(new w(" ",U)),X.push(new w("Total: ",U)),X.push(new w(J(W),Z))}return new x0({decoration:{color:E.background,border:d1.all(new p1(E.border,1,"rounded"))},child:new d({text:new w(void 0,void 0,X)})})}p0();function O16(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}Y5();a5();y5();b$();u9();e2();yQ();nH();a4();sv();M_();u1();p0();u9();class y51{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.1779786108-g751b94"},parameters:{metadata:{count:$}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await l50(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 zC extends u0{props;constructor(A){super();this.props=A}createState(){return new j16}}class j16 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 R16 extends R0{controller=new _2;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,F=!D||J,E=d1.all(new p1($.foreground,1,"solid")),Y=new YB({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 r0({children:[new x0({decoration:{color:$.background},child:new d({text:new w(">",new T({color:$.foreground}))})}),new R1({child:Y})]}),U=new x0({padding:V0.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(F)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 x0({padding:V0.symmetric(1,0),child:new d({text:new w("",void 0,X)})});return new x0({decoration:{border:E,color:$.background},padding:V0.all(1),child:new S0({children:[U,new X0({height:1}),Z,new Z3,G]})})}}class Vt extends u0{props;constructor(A){super();this.props=A}createState(){return new R16}}yQ();class u16 extends R0{controller=new _2;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>=_9)return!1;let Q=await cG(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=b1.of(A).size.height,F=Math.max(Math.floor(J*0.5),10),E=new sz({controller:this.controller,triggers:[new BY],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:E}),Z=new x0({constraints:new w1({maxHeight:F}),padding:V0.symmetric(1,0),child:Y}),U=new x0({padding:V0.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 x0({padding:V0.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 x0({decoration:{border:d1.all(new p1($.foreground,1,"solid")),color:$.background},padding:V0.all(1),child:new S0({children:G})})}}class x51 extends u0{props;constructor(A){super();this.props=A}createState(){return new u16}}function P16(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 b51 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)=>P16(D.pubDate).length));return new pA({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,F,E)=>{let Y=O0.of(E),{colors:Z}=Y,U=Y.app,X=J?U.selectionBackground:void 0,G=J?U.selectionForeground:Z.foreground,V=Z.mutedForeground,K=(W,z)=>new X0({width:z,child:r0.end([new d({text:new w(W,new T({color:V}))})])});return new x0({decoration:X?{color:X}:void 0,padding:V0.symmetric(2,0),child:new r0({children:[new R1({child:new d({text:new w(D.title,new T({color:G})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),K(P16(D.pubDate),$)]})})}})}}class W${static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!W$._instance)W$._instance=new W$;return W$._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()}}p0();class _16 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,F=this.getAvailableLabels(),Y=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...F];return new pA({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 z=this.currentQuery.trim().toLowerCase();return new x0({decoration:V?{color:V}:void 0,padding:V0.symmetric(2,0),child:new d({text:new w("",void 0,[new w("Create new label: ",new T({color:K})),new w(z,new T({color:K,bold:!0}))])})})}return new x0({decoration:V?{color:V}:void 0,padding:V0.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 h51 extends u0{props;constructor(A){super();this.props=A}createState(){return new _16}}class AU extends u0{props;constructor(A){super();this.props=A}createState(){return new T16}}class T16 extends R0{_spinner=new qA;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=d1.all(new p1($.foreground,1,"solid")),J=this._spinner.toBraille(),F=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:[F]})})];if(this.widget.props.onAbort)Y.push(new X0({height:2,child:new x0({padding:V0.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 x0({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 rG extends u0{props;constructor(A){super();this.props=A}createState(){return new v16}}class v16 extends R0{scrollController=new v6;scrollAreaKey=new Y8("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 l8}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=cZ0($);return{title:U.title,type:U.type,description:U.description}})(),D=B.type==="error"?Q.app.toolError:Q.app.command,J=d1.all(new p1(Q.colors.border,1,"solid")),F=new x0({padding:V0.symmetric(1,0),child:new d({text:new w(B.title,new T({color:D,bold:!0}))})}),E=this.isWidgetMessage($)?$.widget:new d({text:new w(B.description,new T({color:Q.colors.foreground})),selectable:!0}),Y=new R1({child:new U5({child:new x0({padding:V0.symmetric(1,0),child:new r0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new R1({child:new k6({controller:this.scrollController,autofocus:!0,child:E})}),new z8({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 x0({padding:V0.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 x0({decoration:{border:J,color:Q.colors.background},padding:V0.all(1),child:new S0({mainAxisAlignment:"center",children:[F,new X0({height:1}),Y,Z]})})})]})})}}Y5();Q4();class k16 extends u0{props;constructor(A){super();this.props=A}createState(){return new S16}}class S16 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=i0.file(this.widget.props.cwd),$=B1.relativePath(Q,XA(A));if($!==null&&$!==""&&$!==".."&&!$.startsWith("../"))return $;return c3(A)}statusIcon(A){let Q=d2.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,F=this.plugins.reduce((Y,Z)=>Y+Z.registeredCommands.length,0),E=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}))),F>0||E>0)B.push(new w(` (${F} ${U4(F,"command")}, ${E} ${U4(E,"tool")})`,new T({dim:!0})));B.push(new w(`
|
|
7081
7081
|
|
|
7082
7082
|
`));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(`
|
|
7083
7083
|
`)),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(`
|
|
@@ -7256,7 +7256,7 @@ ${t.content||""}`:t.content||"",d0=[],b0=t.baseDir.startsWith("file://")?pV0(t.b
|
|
|
7256
7256
|
`)}function zA6(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),F=await J.settings.get("proxy"),E=e04({settings:{url:J.ampURL,proxy:F},secrets:{getToken:(Z,U)=>J.secrets.get(Z,U)}}),Y=await e4.userDisplayBalanceInfo({},{config:E});if(!Y.ok){if(Y.error.code==="auth-required")process.stderr.write(t0.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(t0.red("Error: ")+Y.error.message+`
|
|
7257
7257
|
`),process.exit(1)}process.stdout.write(await be3(Y.result.displayText)+`
|
|
7258
7258
|
`),process.exit(0)})}var FA5=st.join(pB,"logs","headless.log"),d91=st.join(Rd,"device-id.json"),EA5=`cli-tui-${p26(16).toString("hex")}`;D_4();async function YA5(){let A=await Promise.all(iM.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 l26(){YA5().then((A)=>{if(A){let Q=V20(A.ideName);if(Q)hM(Q)}})}try{if(process.platform==="win32")await Promise.resolve().then(() => b4(fx(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){I$.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
|
|
7259
|
-
`)}function ZA5(A){process.emitWarning=(Q,$,B,D)=>{let J=typeof Q==="string"?Q:Q.message||String(Q),F=$||"Warning",E=!1;A.warn(J,{name:F,code:B})}}function r8(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")sB("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")sB("experimental.agentMode",Q.mode)}function UA5(A,Q){if(!o6(Q))return;if(!F7(Q.user.email)){if(A.model)throw new n1("The --model flag is only available for Amp employees.",1);sB("internal.model",void 0);return}if(A.model)sB("internal.model",VA5(A.model))}function y26(A){let Q=A.indexOf(":");if(Q===-1)throw new n1(`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 n1(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function XA5(A){if(A===void 0)return;let Q=A.trim();if(n50(Q))return Q;throw new n1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function GA5(A,Q){if(n5(A,Q))return;let $=rB(A)?.levels,B=$?` Allowed for ${A}: ${$.join(", ")}.`:"";throw new n1(`Reasoning effort "${Q}" is not available for ${A} mode.${B}`,1)}function VA5(A){if(!A.includes("="))return y26(A),A;let Q={};for(let $ of A.split(",")){let B=$.trim();if(!B)continue;let D=B.indexOf("=");if(D===-1)throw new n1(`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(),F=B.slice(D+1).trim();if(!J)throw new n1(`Missing mode name in "${B}". Expected "mode=provider:model".`,1);if(!F)throw new n1(`Missing model value for mode "${J}". Expected "${J}=provider:model".`,1);y26(F),Q[J]=F}if(Object.keys(Q).length===0)throw new n1("No valid model overrides found in --model flag value.",1);return Q}function vK0(A,Q,$){let B=Number(A);if(!Number.isInteger(B)||B<$.min)throw new MF0(`${Q} must be an integer >= ${$.min}`);if($.max!==void 0&&B>$.max)throw new MF0(`${Q} must be an integer <= ${$.max}`);return B}function KA5(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 zA5(A){try{return await c26(A,"utf-8")}catch{return A}}async function p91(A,Q,$){let B=KA5(A,Q);if(!B)return;let D=o6($)?$.features:[],J=o6($)?$.user.email:void 0;if(!Ae(D,v$.HARNESS_SYSTEM_PROMPT)&&!(J&&F7(J)))throw new n1("You are not allowed to do this.",1);sB("systemPrompt",await zA5(B))}function Ae(A,Q){return A?.some(($)=>$.name===Q&&$.enabled)??!1}function WA5(A){return A!=="pending"}function NW(A){if(!o6(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function IA5(A){let Q=NW(A);if(Q)return Q.id;if(mY(A))throw Error(A.error.message);throw Error("unreachable")}function HA5(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 qA5(A){let B=HA5(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 n1(`Couldn't connect to the Amp server at ${A}.`,1,B)}function tt(A,Q){let $=to0(Error(A.error.message));if($.message===m9.networkOffline||$.message===m9.networkTimeout)return qA5(Q);if($.message!==m9.internalBug)return new n1($.message,1,$.suggestion);return new n1(A.error.message.replace(/^Error: /,""),1)}async function NA5(){if(process.versions.bun)return!1;try{return await RG()==="npm"}catch(A){return u.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var x26=[{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??pY,description:`Custom settings file path (overrides the default location ${pY})`},{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 ${Ta})`},{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:N9(),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:pM.SMART.key,description:`Set the agent mode (${oB({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(oB().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}],b26=(A)=>("deprecated"in A)&&A.deprecated===!0,CA5=(A)=>("hidden"in A)&&A.hidden===!0,wA5=(A)=>("default"in A),MA5=(A)=>("default"in A)?A.default:void 0;function kK0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let $=XA5(Q.effort);if($!==void 0)GA5(Q.mode,$);return $}function LA5(A,Q){let $=Q.args[0],B=Q.commands.map((J)=>J.name());if($&&!$.includes(" ")&&$.length<30&&!/[./\\]/.test($)){let J=B.filter((E)=>$.includes(E)||E.includes($)),F="Run amp --help for a list of available commands.";if(J.length>0)F=`Did you mean: ${J.join(", ")}? Or run amp --help for all commands.`;throw new n1(m9.unknownCommand($),1,F)}}async function yK0(A){return{...A,getThreadEnvironment:wz,getEnvironmentData:(Q,$)=>dK(Q,$),skillService:A.skillService,fileChangeTrackerStorage:new TL,generateThreadTitle:yE4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>oF(A.configService),pluginService:A.pluginService}}function i26(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:wz,getEnvironmentData:(Q,$)=>dK(Q,$)}}var SK0=i0.file(JA5.homedir()),c91=process.env.XDG_CONFIG_HOME?i0.file(process.env.XDG_CONFIG_HOME):B1.joinPath(SK0,".config");async function i2(A,Q,$){let B=$?.deferAuth??!1,D=$?.skipToolProviders??!1;O04("0.0.
|
|
7259
|
+
`)}function ZA5(A){process.emitWarning=(Q,$,B,D)=>{let J=typeof Q==="string"?Q:Q.message||String(Q),F=$||"Warning",E=!1;A.warn(J,{name:F,code:B})}}function r8(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")sB("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")sB("experimental.agentMode",Q.mode)}function UA5(A,Q){if(!o6(Q))return;if(!F7(Q.user.email)){if(A.model)throw new n1("The --model flag is only available for Amp employees.",1);sB("internal.model",void 0);return}if(A.model)sB("internal.model",VA5(A.model))}function y26(A){let Q=A.indexOf(":");if(Q===-1)throw new n1(`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 n1(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function XA5(A){if(A===void 0)return;let Q=A.trim();if(n50(Q))return Q;throw new n1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function GA5(A,Q){if(n5(A,Q))return;let $=rB(A)?.levels,B=$?` Allowed for ${A}: ${$.join(", ")}.`:"";throw new n1(`Reasoning effort "${Q}" is not available for ${A} mode.${B}`,1)}function VA5(A){if(!A.includes("="))return y26(A),A;let Q={};for(let $ of A.split(",")){let B=$.trim();if(!B)continue;let D=B.indexOf("=");if(D===-1)throw new n1(`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(),F=B.slice(D+1).trim();if(!J)throw new n1(`Missing mode name in "${B}". Expected "mode=provider:model".`,1);if(!F)throw new n1(`Missing model value for mode "${J}". Expected "${J}=provider:model".`,1);y26(F),Q[J]=F}if(Object.keys(Q).length===0)throw new n1("No valid model overrides found in --model flag value.",1);return Q}function vK0(A,Q,$){let B=Number(A);if(!Number.isInteger(B)||B<$.min)throw new MF0(`${Q} must be an integer >= ${$.min}`);if($.max!==void 0&&B>$.max)throw new MF0(`${Q} must be an integer <= ${$.max}`);return B}function KA5(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 zA5(A){try{return await c26(A,"utf-8")}catch{return A}}async function p91(A,Q,$){let B=KA5(A,Q);if(!B)return;let D=o6($)?$.features:[],J=o6($)?$.user.email:void 0;if(!Ae(D,v$.HARNESS_SYSTEM_PROMPT)&&!(J&&F7(J)))throw new n1("You are not allowed to do this.",1);sB("systemPrompt",await zA5(B))}function Ae(A,Q){return A?.some(($)=>$.name===Q&&$.enabled)??!1}function WA5(A){return A!=="pending"}function NW(A){if(!o6(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function IA5(A){let Q=NW(A);if(Q)return Q.id;if(mY(A))throw Error(A.error.message);throw Error("unreachable")}function HA5(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 qA5(A){let B=HA5(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 n1(`Couldn't connect to the Amp server at ${A}.`,1,B)}function tt(A,Q){let $=to0(Error(A.error.message));if($.message===m9.networkOffline||$.message===m9.networkTimeout)return qA5(Q);if($.message!==m9.internalBug)return new n1($.message,1,$.suggestion);return new n1(A.error.message.replace(/^Error: /,""),1)}async function NA5(){if(process.versions.bun)return!1;try{return await RG()==="npm"}catch(A){return u.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var x26=[{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??pY,description:`Custom settings file path (overrides the default location ${pY})`},{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 ${Ta})`},{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:N9(),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:pM.SMART.key,description:`Set the agent mode (${oB({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(oB().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}],b26=(A)=>("deprecated"in A)&&A.deprecated===!0,CA5=(A)=>("hidden"in A)&&A.hidden===!0,wA5=(A)=>("default"in A),MA5=(A)=>("default"in A)?A.default:void 0;function kK0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let $=XA5(Q.effort);if($!==void 0)GA5(Q.mode,$);return $}function LA5(A,Q){let $=Q.args[0],B=Q.commands.map((J)=>J.name());if($&&!$.includes(" ")&&$.length<30&&!/[./\\]/.test($)){let J=B.filter((E)=>$.includes(E)||E.includes($)),F="Run amp --help for a list of available commands.";if(J.length>0)F=`Did you mean: ${J.join(", ")}? Or run amp --help for all commands.`;throw new n1(m9.unknownCommand($),1,F)}}async function yK0(A){return{...A,getThreadEnvironment:wz,getEnvironmentData:(Q,$)=>dK(Q,$),skillService:A.skillService,fileChangeTrackerStorage:new TL,generateThreadTitle:yE4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>oF(A.configService),pluginService:A.pluginService}}function i26(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:wz,getEnvironmentData:(Q,$)=>dK(Q,$)}}var SK0=i0.file(JA5.homedir()),c91=process.env.XDG_CONFIG_HOME?i0.file(process.env.XDG_CONFIG_HOME):B1.joinPath(SK0,".config");async function i2(A,Q,$){let B=$?.deferAuth??!1,D=$?.skipToolProviders??!1;O04("0.0.1779786108-g751b94");let J=J20({storage:A.settings,secretStorage:A.secrets,workspaceRoot:h0.of(i0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:SK0,userConfigDir:c91}),F=A.secrets.get("apiKey",A.ampURL),E=oF(J),Y=null,Z=()=>{return},U=new Promise((Q0)=>{Z=Q0}),X=F.then(async(Q0)=>{if(!Q0&&!B)await U;return Y??=E.subscribe(()=>{}),k1(E.pipe(l3(WA5)))});X.catch(()=>{return}),Ot4(J);let G=await J.getLatest();u.debug("Global configuration initialized",{settingsKeys:Object.keys(G.settings)});let V=!1;{let Q0=await F;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{A3.write(`No API key found. Starting login flow...
|
|
7260
7260
|
`);let M0=await OA5(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 Cz(),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:o6(K),isError:mY(K),errorMessage:mY(K)?K.error.message:void 0});UA5(Q,K);let W=X.then((Q0)=>IA5(Q0));W.catch(()=>{return});let z=!Q.takeMeBack&&o6(K)&&Ae(K.features,v$.THREAD_ACTORS_TUI),I=!1;if(process.env.AMP_DISABLE_PLUGINS==="1")u.warn("Ignoring AMP_DISABLE_PLUGINS outside development");let H=I?"off":z?"all":process.env.PLUGINS??"permissions",{toolService:q,dispose:N}=FR4({configService:J}),C=new Map,O=()=>C.clear(),L=new Cx0(J,A.settings.getWorkspaceRootPath()),j=XJ4({configService:J}),k=a74({configService:J,trustStore:L,skillMCPServers:j.skillMCPServers,uploadImageAttachments:z,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 F0=new tM(A.secrets),J0=await F0.getClientInfo(Q0,M0),C0=n?.scopes??J0?.scopes,w0=Of4();u.info("OAuth headless mode check",{useHeadless:w0,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:A3.isTTY});let _0;if(w0)_0=A.executeMode?Lf4():Mf4(Q0);let U0=new Tk0({storage:F0,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}}),_=pn0({configService:J,spawn:dJ0}),S=Q.headless?ss4():void 0,h=S??new AG0({configService:J}),b=h instanceof AG0?h:void 0;if(b)b.pluginExecutorKind="local";let v=new a1(null),x=null,c=z&&!I?[...At4(G.settings)?[{name:"permissions",entryPoint:P31}]:[],{name:"thread-visibility",entryPoint:Bt4(J,()=>X.then(NW),()=>x,(Q0)=>{x=Q0}),alwaysLoad:!0}]:[],p=yx0({configService:J,platform:h,loadGlobalPlugins:It0(J),pluginFilter:H,activeThread$:v,internalPlugins:c}),g=mQ4(p),i=[k,_,g],r;if(D)r=new Map;else if(A.executeMode){let Q0=await oL4({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=cn0({toolService:q,providers:i});if(Q.jetbrains)hM("JetBrains");else if(Q.ide&&rf4())hM("VS Code");else if(Q.ide&&sf4())hM("Neovim");else if(Q.ide&&(!z||A.executeMode||Q.takeMeBack))l26();if(A.executeMode)j04(!0);let A0,W0=o5.status.pipe(N1((Q0)=>Boolean(Q0.connected&&Q0.authenticated&&Q0.ideName&&u14(Q0.ideName))),T4()).subscribe((Q0)=>{if(Q0){if(!A0)A0=q.registerTool(aL4)}else A0?.dispose(),A0=void 0}),Y0;if(!A.executeMode){let Q0=await A.settings.get("fuzzy.alwaysIncludePaths")??[];Y0=new $Y0(process.cwd(),{alwaysIncludePaths:Q0},!0)}else Y0=new class extends $Y0{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let I0=new bg0(gl(J,{usesThreadActors:!1}),{maxThreads:200});u.info("Starting Amp background services");let $0=new f31,j0={configService:J,toolService:q,mcpService:k,skillService:j,toolboxService:_,trustStore:L,threadService:I0,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:Y0,terminal:$0,pluginService:p,pluginPlatform:b,headlessPluginPlatform:S,activeThread$:v,serverStatus:K,serverStatusPromise:X,viewerUserIDPromise:W,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(),O(),await j0.threadService.asyncDispose(),j0.configService.unsubscribe(),Y?.unsubscribe(),N(),j0.fuzzyServer.dispose(),j0.settingsStorage[Symbol.dispose](),W0.unsubscribe(),A0?.dispose(),await j0.pluginService.dispose()}}}async function OA5(A){if(!A.executeMode){if(!await nY0("Would you like to log in to Amp? [(y)es, (n)o]: "))return A3.write(`Login cancelled. Run the command again to retry.
|
|
7261
7261
|
`),!1}return await n26(A)}async function n26(A){let Q=p26(32).toString("hex"),$=await xf(A.ampURL,Q),B=new AbortController;try{await hY($,B.signal)}catch(J){u.error("Error opening browser",{error:J})}let D=await xf(A.ampURL,Q,!1);A3.write(`If your browser does not open automatically, visit:
|
|
7262
7262
|
|
|
@@ -7264,7 +7264,7 @@ ${t0.blue.bold(D)}
|
|
|
7264
7264
|
|
|
7265
7265
|
`);try{return await Gb4(A.ampURL,Q,A.secrets,B),A3.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(J){return u.error("Login failed",{error:J}),I$.write(`
|
|
7266
7266
|
Login failed: ${J instanceof Error?J.message:String(J)}
|
|
7267
|
-
`),!1}}async function jA5(A,Q,$){let B=await Q.get("apiKey",A);if(!B)throw new n1("No Amp API key found. Run `amp login` first.",1);let D=$A5("curl",["-H",`Authorization: Bearer ${B}`,...$],{stdio:"inherit"});process.exitCode=await new Promise((J,F)=>{D.on("error",F),D.on("close",(E)=>J(E??1))})}function RA5(A){let Q=new oq().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((z)=>{if(z.code==="commander.help"||z.code==="commander.version"||z.exitCode===0)$j(),process.exit(0);let I=z.originalError??z;j_4(I)}),Bg4(Q,{version:"0.0.
|
|
7267
|
+
`),!1}}async function jA5(A,Q,$){let B=await Q.get("apiKey",A);if(!B)throw new n1("No Amp API key found. Run `amp login` first.",1);let D=$A5("curl",["-H",`Authorization: Bearer ${B}`,...$],{stdio:"inherit"});process.exitCode=await new Promise((J,F)=>{D.on("error",F),D.on("close",(E)=>J(E??1))})}function RA5(A){let Q=new oq().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((z)=>{if(z.code==="commander.help"||z.code==="commander.version"||z.exitCode===0)$j(),process.exit(0);let I=z.originalError??z;j_4(I)}),Bg4(Q,{version:"0.0.1779786108-g751b94",buildTimestamp:"2026-05-26T09:06:27.137Z",buildType:"release"}),Q.addHelpText("after",nf4()),Q.configureHelp({formatHelp:af4}),Q.command("logout").description("Log out by removing stored API key").action(async(z,I)=>{let H=I.optsWithGlobals(),q=await m3(H);await xA5(q)}),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(z,I)=>{let H=I.optsWithGlobals(),q=await m3(H);await yA5(q,await T31(H,q.settings))}),M_4(Q,m3);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(...z)=>{let I=z.find((C)=>typeof C==="object"&&C!==null&&typeof C.optsWithGlobals==="function")??B,H=z.filter((C)=>C!==I).flatMap((C)=>Array.isArray(C)?C:typeof C==="string"?[C]:[]),q=I.optsWithGlobals(),N=await m3(q);await jA5(N.ampURL,N.secrets,H),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(z,I,H)=>{let q=H.optsWithGlobals(),N=await m3(q);await zf4(z??"get",N.ampURL,N.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(z,I)=>{let H=I.optsWithGlobals(),q=await m3(H);await Wf4(q.ampURL,q.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(z)=>{await Xx4({raw:z.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(`
|
|
7268
7268
|
`)).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(z,I,H)=>{if(z&&I.apply)throw new n1("Choose either a positional thread ID/URL or --apply <thread-id>, not both.",1);let q=I.apply??z;if(!q||q.trim().length===0)A3.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.
|
|
7269
7269
|
|
|
7270
7270
|
`),H.outputHelp(),process.exit(0);let N=v8(q)??$B(q),C=H.optsWithGlobals(),O=await m3(C);r8(H,C);let L=await i2(O,C),j=!1;try{if(I.checkout&&I.skipCheckout)throw new n1("Choose either --checkout or --skip-checkout, not both.",1);if(mY(L.serverStatus))throw tt(L.serverStatus,O.ampURL);let k=o6(L.serverStatus)?L.serverStatus.features:void 0;if(!Ae(k,v$.V2))throw new n1("live-sync is not enabled for your user",1);await Qb4({ampURL:O.ampURL,threadId:N,configService:L.configService,threadService:L.threadService,apiKey:process.env.AMP_API_KEY,applyOnce:typeof I.apply==="string",checkoutMode:I.checkout?"always":I.skipCheckout?"never":"prompt",promptForYesNo:nY0}),j=!0}finally{if(await L.asyncDispose(),j)process.exit(0)}});let D=async(z,I,H)=>{J20({storage:I.settings,secretStorage:I.secrets,workspaceRoot:h0.of(i0.file(process.cwd())),defaultAmpURL:I.ampURL,homeDir:SK0,userConfigDir:c91});let q={...I,executeMode:!1};await fK0(q,{...z,openThreadSwitcher:!0},H,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",(z)=>vK0(z,"--limit",{min:1,max:500})).option("--offset <number>","Number of threads to skip",(z)=>vK0(z,"--offset",{min:0})).action(async(z,I)=>{let H=I.optsWithGlobals(),q=await m3(H);await d26(H,q,I)});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(z,I)=>{let H=I.optsWithGlobals(),q=await m3(H);await rA5(H,q,I)}),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(z,I,H)=>{let q=H.optsWithGlobals(),N=await m3(q),C=Array.isArray(z)?z:[];if(I.pick)I$.write(`${t0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
@@ -7297,8 +7297,8 @@ ${O}
|
|
|
7297
7297
|
`))}),I.args.length>0)LA5(q,I);await fK0(q,H,I,A)}),Oy4(Q),Q}async function et(A,Q){await GQ(($)=>mf($,A,Q))}async function h26(A,Q,$){let B=Date.now(),[D,J]=await Promise.all([e4.getThreadLinkInfo({thread:A},{config:Q}),$]);if(u.getChild("fetchAndStartThread").info(`Ownership check in ${Date.now()-B}ms`),D.ok){let F=D.result.creatorUserID;if(F&&F!==J&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new n1(`Cannot resume thread created by another user.
|
|
7298
7298
|
|
|
7299
7299
|
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 a26(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await JG0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await JG0()).trimEnd(),stdinInput:null}}function o26(A,Q,$){if(A.streamJson&&!Q)throw new n1("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(A.streamJsonInput&&!Q)throw new n1("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(A.streamJsonInput&&!A.streamJson)throw new n1("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(A.stats&&A.streamJson)throw new n1("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 n1("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(A.archive&&!Q)throw new n1("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 n1("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 n1("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"
|
|
7300
|
-
Or pipe via stdin: echo "your message" | amp --execute`)}function uA5(){AA4([$20.parse({tool:"*",action:"allow"})]),j64({bypass:!0})}function PA5(A){if(A.threadId&&!R9(A.threadId))delete A.threadId}async function fK0(A,Q,$,B){if(Q.headless)return _A5(A,Q,$);let D=await i2(A,Q),J=await D.serverStatusPromise,F=o6(J)&&Ae(J.features,v$.THREAD_ACTORS_TUI),E=F&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await D.asyncDispose(),new n1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!F)throw await D.asyncDispose(),new n1("--show-welcome is only available with the new Amp CLI feature flag",1);if(E){let Y=!A.executeMode&&await NA5();return uA5(),PA5(Q),TA5(A,Q,$,D,{showNpmMigrationWelcome:Y})}else{if(Q.threadId&&R9(Q.threadId)){let Y=await e4.getThreadLinkInfo({thread:Q.threadId},{config:D.configService}).catch(()=>null);if(Y?.ok&&Y.result.usesThreadActors)throw await D.asyncDispose(),new n1(`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 vA5(A,Q,$,B,{dependencies:D})}}async function _A5(A,Q,$){let B=(I,H)=>{let q=Number(process.hrtime.bigint()-H)/1e6,N=do0();u.info("Startup phase",{phase:I,phaseMs:Math.round(q),sinceMainMs:N===null?void 0:Math.round(N)})};r8($,Q);let D=process.hrtime.bigint(),J=await i2(A,Q);B("runMainThread:createThreadDependencies",D);let{serverStatus:F}=J;if(mY(F))throw tt(F,A.ampURL);let E=o6(F)?F:null,Y=E?.user.email;await p91($,Q,F);let Z=NW(F),U=ly(Q,Z);if(U instanceof Error)j3(U.message);if(E&&!dM(Q.mode,Y))throw new n1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!Y||!F7(Y)))throw new n1("Headless executor mode is only available for Amp employees",1);$E0();let G=await J.secretStorage.get("apiKey",A.ampURL);if(!G)throw new n1("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&&!R9(V))throw new n1(`Invalid thread ID: ${V}`,1);let K=V?void 0:await aA5({dependencies:J,apiKey:G,visibility:U??void 0}),W=V??K?.threadId;if(!W)throw new n1("Failed to resolve headless thread ID",1);let z=await Pf4(W);if(z.status==="already-running")await J.asyncDispose(),await Cz(),process.exit(0);try{await Nf4({ampURL:A.ampURL,apiKey:G,workspaceRoot:process.cwd(),threadId:W,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 z.release(),await J.asyncDispose()}await Cz(),process.exit(0)}async function TA5(A,Q,$,B,D){let{userInput:J,stdinInput:F}=await a26(Q),E=!!Q.streamJson||!!Q.streamJsonThinking;o26({...Q,streamJson:E},A.executeMode,J),r8($,Q),U_4(),$E0();let Y=Q.threadId,Z=Q.resumeThreadIDs??(Y?[Y]:[]),U=Q.observe?v8(Q.observe)??$B(Q.observe):void 0,X=await B.serverStatusPromise;if(mY(X))throw tt(X,A.ampURL);let G=NW(X),V=ly(Q,G);if(V instanceof Error)j3(V.message);let K=null,W=async()=>{let H=B.consumeDraftNewThreadVisibility();if(H!==null)return H;return K??=(async()=>{let q=await va(A.settings,process.cwd(),G,V);if(q instanceof Error)j3(q.message);return q})(),K},z=await B.secretStorage.get("apiKey",A.ampURL);if(!z)throw new n1("API key required. Please run `amp login` first.",1);let I=o6(X)&&F7(X.user.email);if(A.executeMode){if(Z.length>1)throw new n1("Execute mode can only resume one thread.",1);Le0(B.mcpService,A.settings);try{let H=kK0($,Q),q=await bz(),N=Y?H:oY0({agentMode:Q.mode,explicitEffort:H,sessionState:q}),C=Y?void 0:rY0(await bf(B.configService),{agentMode:Q.mode,explicitEffort:H,sessionState:q}),O=Y?void 0:await W(),L=await $f4({apiKey:z,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:B,userInput:J,stdinInput:F,stats:!!Q.stats,streamJson:E,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:N,labels:Q.label,initialThreadID:Y,initialThreadMeta:O,initialSettings:C});if(await et(L,"execute"),Q.archive)await B.threadService.archive(L,!0)}finally{await B.asyncDispose()}await Cz(),process.exit(0)}else{let H=kK0($,Q),q=D.showNpmMigrationWelcome?"npm-migration":"intro",N=WY0("0.0.1779772576-g751b94",B.settingsStorage,{startDelayMs:3000}),C=new aY0(B.mcpService,A.settings.getWorkspaceRootPath()),O=gl(B.configService),L=new Kt(B.fuzzyServer),j=process.cwd();await ps4({ampURL:A.ampURL,apiKey:z,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??aJ(A.ampURL),configService:B.configService,toolService:B.toolService,pluginPlatform:B.pluginPlatform,pluginService:B.pluginService,skillService:B.skillService,mcpService:B.mcpService,readFileSystemDirectory:({uri:k})=>Nf({workspaceRoot:j},k),completionBuilder:L,updateService:N,workspaceRoot:j,listThreads:()=>O.listThreads(),getThreadFromServer:(k)=>O.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:W,onFirstFrame:Q.ide?l26: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 vA5(A,Q,$,B,D){let J=process.hrtime.bigint(),F=($0,j0)=>{let Q0=Number(process.hrtime.bigint()-j0)/1e6,M0=do0();u.info("Startup phase",{phase:$0,phaseMs:Math.round(Q0),sinceMainMs:M0===null?void 0:Math.round(M0)})},{userInput:E,stdinInput:Y}=await a26(Q),Z=!!Q.streamJson||!!Q.streamJsonThinking;o26({...Q,streamJson:Z},A.executeMode,E),r8($,Q);let U=process.hrtime.bigint(),X=D?.dependencies??await i2(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)F("runMainThread:createThreadDependencies",U);let{serverStatus:K}=X;if(!V&&mY(K))throw tt(K,A.ampURL);let W=o6(K)?K:null,z=W?.user.email,I=!!(z&&F7(z));if(I)$E0();if(!V)await p91($,Q,K);let H=NW(K),q=H?.features??[],N=H?.team??null,C=ly(Q,H);if(C instanceof Error)j3(C.message);if(W&&!dM(Q.mode,z))throw new n1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let O=Q.threadId&&R9(Q.threadId)?Q.threadId:void 0;U=process.hrtime.bigint();let L=await yK0(X);F("runMainThread:createWorkerDeps",U);let j=A.executeMode?void 0:async($0)=>et($0,"interactive"),k={threadService:X.threadService,workerDeps:L,createThread:async($0)=>{let j0=V?await X.serverStatusPromise:K,Q0=await va(A.settings,process.cwd(),NW(j0),C);if(Q0 instanceof Error)j3(Q0.message);return z81(L,{threadMeta:Q0,agentMode:$0??Q.mode,onFirstAssistantMessage:j})},validateThreadOwnership:async($0,j0)=>{if(j0?.nonBlockingOwnershipCheck){h26($0,X.configService,X.viewerUserIDPromise).catch((Q0)=>{if(Q0 instanceof n1){if(j0.onOwnershipError){j0.onOwnershipError(Q0,$0);return}Mz(Q0,$0);return}u.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})});return}try{await h26($0,X.configService,X.viewerUserIDPromise)}catch(Q0){if(Q0 instanceof n1)throw Q0;u.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})}},switchThreadVisibility:C,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:j,handleError:Mz},_=async()=>{try{return XA6(k,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch($0){if($0 instanceof n1)throw $0;throw await Mz($0,Q.threadId),Error("handleError should have called process.exit()")}},S=(async()=>{if(V){u.info("Skipping initial free tier status fetch until auth is complete");return}try{let $0=await X.configService.getLatest(),j0=dm($0),Q0=await e4.getUserFreeTierStatus({},{config:X.configService,signal:AbortSignal.timeout(j0)});if(Q0.ok)return u.info("User free tier status:",Q0),Q0.result;return}catch($0){u.error("Failed to fetch free tier status:",$0);return}})(),b=!A.executeMode?new g31:null,v,x=null;if(b)v=b,x=(async()=>{let $0=V?await X.serverStatusPromise:X.serverStatus;if(mY($0))throw tt($0,A.ampURL);await p91($,Q,$0);let j0=process.hrtime.bigint(),Q0=await _();if(F("runMainThread:createThreadPool",j0),b.attach(Q0),E){let M0=await k1(Q0.threadHandles$);if(!M0)throw new n1("No active thread is available yet.",1);await M0.sendMessage({content:[{type:"text",text:E}]})}})(),x.catch(async($0)=>{let j0=$0 instanceof Error?$0:Error(String($0));b.setInitError(j0),await Mz($0,Q.threadId)});else U=process.hrtime.bigint(),v=await _(),F("runMainThread:createThreadPool",U);let c=Q.notifications!==void 0?Q.notifications:!A.executeMode;U=process.hrtime.bigint();let p=await X.configService.getLatest();if(F("runMainThread:configService.getLatest",U),U=process.hrtime.bigint(),st4({configService:X.configService,threadService:X.threadService,threadPool:v,config:p,useNotifications:c}),F("runMainThread:createLegacyTuiNotificationService",U),A.executeMode){Le0(X.mcpService,A.settings);let $0=kK0($,Q),j0=await bz(),Q0=O?$0:oY0({agentMode:Q.mode,explicitEffort:$0,sessionState:j0}),M0={userInput:E,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 n_4({threadPool:v,...M0});if(await et(n,"execute"),Q.archive)await X.threadService.archive(n,!0);await X.asyncDispose(),process.exit(0)}let g=!1,i=!1;if(Q.jetbrains||Q.ide){await z20();let $0=await lY({jetbrainsOnly:Q.jetbrains});if($0.length===0){if(Q.jetbrains)g=!await X.configService.get("jetbrains.skipInstall")}else if($0.length===1){let j0=$0[0];if(j0)o5.selectConfig(j0)}else i=!0}U=process.hrtime.bigint();let r=WY0("0.0.1779772576-g751b94",X.settingsStorage,{startDelayMs:3000});F("runMainThread:createUpdateService",U),U=process.hrtime.bigint();let A0=new aY0(X.mcpService,A.settings.getWorkspaceRootPath());if(F("runMainThread:createMcpTrustHandler",U),E&&A.executeMode){let $0=await k1(v.threadHandles$);if(!$0)throw new n1("No active thread is available yet.",1);await $0.sendMessage({content:[{type:"text",text:E}]})}U=process.hrtime.bigint();let W0=await bz();F("runMainThread:loadSessionState",U),u.info("Loaded session state:",W0);let Y0=kK0($,Q),I0={...W0,launchCount:W0.launchCount+1,lastReasoningEffortByMode:Y0?{...W0.lastReasoningEffortByMode,[Q.mode]:Y0}:W0.lastReasoningEffortByMode};GQ(($0)=>({...$0,launchCount:$0.launchCount+1}));try{if(U=process.hrtime.bigint(),await Le4({history:new qo,fuzzyServer:X.fuzzyServer,settingsStorage:X.settingsStorage,threadService:X.threadService,skillService:X.skillService,configService:X.configService,secretStorage:X.secretStorage,internalAPIClient:e4,threadPool:v,createSystemPromptDeps:async()=>i26(X),ideClient:o5,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:O,showJetBrainsInstaller:g,showIdePickerHint:i,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:EA5,logFile:{path:B},sessionState:I0,freeTierStatusPromise:S,workspace:N??null,features:q,isInternalUser:I,initialAgentMode:$.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-26T05:20:44.243Z"},($0)=>new n31({...$0,threadPool:$0.threadPool},(j0)=>new V81({...j0,threadState:j0.threadState}))),F("runMainThread:mountApp-returned",U),x)await x}finally{await v.dispose().catch(($0)=>{u.error("Failed to dispose thread pool during shutdown",$0)})}await X.asyncDispose(),F("runMainThread:dependencies.asyncDispose",J),process.exit(0)}async function m3(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)I$.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
7301
|
-
`);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 e74({get:async(E)=>{if(E!==op)return;try{let Y=await c26(d91,"utf-8");return JSON.parse(Y).installationID}catch{return}},set:async(E,Y)=>{if(E!==op)return;await BA5(st.dirname(d91),{recursive:!0}),await DA5(d91,JSON.stringify({installationID:Y},null,2),{mode:384})}},{clientType:"cli",platform:k90()});R04(B);let D=await Ct4({...A,workspaceTrust:{current:!0,changes:pm},getHook:process.env.AMP_URL?(E,Y)=>{if(E==="url")return Promise.resolve(process.env.AMP_URL);return Y()}:void 0});if(A.mcpConfig){let E=await wb4(A.mcpConfig);D=Mb4(D,E)}let J=st.dirname(D.getSettingsFilePath());UR4(Rd,J),D=Qt1(D);let F=await D.get("url","admin")??await D.get("url","global");if(!F)F=l7;if(u.info("Resolved Amp URL",{ampURL:F,settingsFile:D.getSettingsFilePath(),workspaceRoot:D.getWorkspaceRootPath()}),!iI(F))u.info("Targeting custom Amp server",{ampURL:F});return{executeMode:Q,isTTY:$,ampURL:F,settings:D,secrets:zt4(await T31(A,D))}}function kA5(A){let Q={};for(let $=0;$<A.length;$++){let B=A[$];if(B?.startsWith("--")){let J=B.slice(2).replace(/-([a-z])/g,(E,Y)=>Y.toUpperCase()),F=A[$+1];if(F&&!F.startsWith("--"))Q[J]=F,$++}}return Q}function SA5(A,Q){let $=A.includes("--headless")||A.some((D)=>D.startsWith("--headless=")),B=st.resolve(Q.logFile??process.env.AMP_LOG_FILE??($?FA5:Ta));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:B}}async function fA5(){B_4();let A=kA5(process.argv),Q=SA5(process.argv,A),$=X_4(Q);nF0("silent");let B=process.argv.includes("--no-color"),D=process.argv.includes("--color"),J=process.stdout.isTTY&&process.stderr.isTTY;if(B||!D&&!J)t0.level=0;if(ZA5(u),u.info("Starting Amp CLI.",{version:"0.0.
|
|
7300
|
+
Or pipe via stdin: echo "your message" | amp --execute`)}function uA5(){AA4([$20.parse({tool:"*",action:"allow"})]),j64({bypass:!0})}function PA5(A){if(A.threadId&&!R9(A.threadId))delete A.threadId}async function fK0(A,Q,$,B){if(Q.headless)return _A5(A,Q,$);let D=await i2(A,Q),J=await D.serverStatusPromise,F=o6(J)&&Ae(J.features,v$.THREAD_ACTORS_TUI),E=F&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await D.asyncDispose(),new n1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!F)throw await D.asyncDispose(),new n1("--show-welcome is only available with the new Amp CLI feature flag",1);if(E){let Y=!A.executeMode&&await NA5();return uA5(),PA5(Q),TA5(A,Q,$,D,{showNpmMigrationWelcome:Y})}else{if(Q.threadId&&R9(Q.threadId)){let Y=await e4.getThreadLinkInfo({thread:Q.threadId},{config:D.configService}).catch(()=>null);if(Y?.ok&&Y.result.usesThreadActors)throw await D.asyncDispose(),new n1(`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 vA5(A,Q,$,B,{dependencies:D})}}async function _A5(A,Q,$){let B=(I,H)=>{let q=Number(process.hrtime.bigint()-H)/1e6,N=do0();u.info("Startup phase",{phase:I,phaseMs:Math.round(q),sinceMainMs:N===null?void 0:Math.round(N)})};r8($,Q);let D=process.hrtime.bigint(),J=await i2(A,Q);B("runMainThread:createThreadDependencies",D);let{serverStatus:F}=J;if(mY(F))throw tt(F,A.ampURL);let E=o6(F)?F:null,Y=E?.user.email;await p91($,Q,F);let Z=NW(F),U=ly(Q,Z);if(U instanceof Error)j3(U.message);if(E&&!dM(Q.mode,Y))throw new n1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!Y||!F7(Y)))throw new n1("Headless executor mode is only available for Amp employees",1);$E0();let G=await J.secretStorage.get("apiKey",A.ampURL);if(!G)throw new n1("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&&!R9(V))throw new n1(`Invalid thread ID: ${V}`,1);let K=V?void 0:await aA5({dependencies:J,apiKey:G,visibility:U??void 0}),W=V??K?.threadId;if(!W)throw new n1("Failed to resolve headless thread ID",1);let z=await Pf4(W);if(z.status==="already-running")await J.asyncDispose(),await Cz(),process.exit(0);try{await Nf4({ampURL:A.ampURL,apiKey:G,workspaceRoot:process.cwd(),threadId:W,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 z.release(),await J.asyncDispose()}await Cz(),process.exit(0)}async function TA5(A,Q,$,B,D){let{userInput:J,stdinInput:F}=await a26(Q),E=!!Q.streamJson||!!Q.streamJsonThinking;o26({...Q,streamJson:E},A.executeMode,J),r8($,Q),U_4(),$E0();let Y=Q.threadId,Z=Q.resumeThreadIDs??(Y?[Y]:[]),U=Q.observe?v8(Q.observe)??$B(Q.observe):void 0,X=await B.serverStatusPromise;if(mY(X))throw tt(X,A.ampURL);let G=NW(X),V=ly(Q,G);if(V instanceof Error)j3(V.message);let K=null,W=async()=>{let H=B.consumeDraftNewThreadVisibility();if(H!==null)return H;return K??=(async()=>{let q=await va(A.settings,process.cwd(),G,V);if(q instanceof Error)j3(q.message);return q})(),K},z=await B.secretStorage.get("apiKey",A.ampURL);if(!z)throw new n1("API key required. Please run `amp login` first.",1);let I=o6(X)&&F7(X.user.email);if(A.executeMode){if(Z.length>1)throw new n1("Execute mode can only resume one thread.",1);Le0(B.mcpService,A.settings);try{let H=kK0($,Q),q=await bz(),N=Y?H:oY0({agentMode:Q.mode,explicitEffort:H,sessionState:q}),C=Y?void 0:rY0(await bf(B.configService),{agentMode:Q.mode,explicitEffort:H,sessionState:q}),O=Y?void 0:await W(),L=await $f4({apiKey:z,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:B,userInput:J,stdinInput:F,stats:!!Q.stats,streamJson:E,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:N,labels:Q.label,initialThreadID:Y,initialThreadMeta:O,initialSettings:C});if(await et(L,"execute"),Q.archive)await B.threadService.archive(L,!0)}finally{await B.asyncDispose()}await Cz(),process.exit(0)}else{let H=kK0($,Q),q=D.showNpmMigrationWelcome?"npm-migration":"intro",N=WY0("0.0.1779786108-g751b94",B.settingsStorage,{startDelayMs:3000}),C=new aY0(B.mcpService,A.settings.getWorkspaceRootPath()),O=gl(B.configService),L=new Kt(B.fuzzyServer),j=process.cwd();await ps4({ampURL:A.ampURL,apiKey:z,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??aJ(A.ampURL),configService:B.configService,toolService:B.toolService,pluginPlatform:B.pluginPlatform,pluginService:B.pluginService,skillService:B.skillService,mcpService:B.mcpService,readFileSystemDirectory:({uri:k})=>Nf({workspaceRoot:j},k),completionBuilder:L,updateService:N,workspaceRoot:j,listThreads:()=>O.listThreads(),getThreadFromServer:(k)=>O.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:W,onFirstFrame:Q.ide?l26: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 vA5(A,Q,$,B,D){let J=process.hrtime.bigint(),F=($0,j0)=>{let Q0=Number(process.hrtime.bigint()-j0)/1e6,M0=do0();u.info("Startup phase",{phase:$0,phaseMs:Math.round(Q0),sinceMainMs:M0===null?void 0:Math.round(M0)})},{userInput:E,stdinInput:Y}=await a26(Q),Z=!!Q.streamJson||!!Q.streamJsonThinking;o26({...Q,streamJson:Z},A.executeMode,E),r8($,Q);let U=process.hrtime.bigint(),X=D?.dependencies??await i2(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)F("runMainThread:createThreadDependencies",U);let{serverStatus:K}=X;if(!V&&mY(K))throw tt(K,A.ampURL);let W=o6(K)?K:null,z=W?.user.email,I=!!(z&&F7(z));if(I)$E0();if(!V)await p91($,Q,K);let H=NW(K),q=H?.features??[],N=H?.team??null,C=ly(Q,H);if(C instanceof Error)j3(C.message);if(W&&!dM(Q.mode,z))throw new n1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let O=Q.threadId&&R9(Q.threadId)?Q.threadId:void 0;U=process.hrtime.bigint();let L=await yK0(X);F("runMainThread:createWorkerDeps",U);let j=A.executeMode?void 0:async($0)=>et($0,"interactive"),k={threadService:X.threadService,workerDeps:L,createThread:async($0)=>{let j0=V?await X.serverStatusPromise:K,Q0=await va(A.settings,process.cwd(),NW(j0),C);if(Q0 instanceof Error)j3(Q0.message);return z81(L,{threadMeta:Q0,agentMode:$0??Q.mode,onFirstAssistantMessage:j})},validateThreadOwnership:async($0,j0)=>{if(j0?.nonBlockingOwnershipCheck){h26($0,X.configService,X.viewerUserIDPromise).catch((Q0)=>{if(Q0 instanceof n1){if(j0.onOwnershipError){j0.onOwnershipError(Q0,$0);return}Mz(Q0,$0);return}u.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})});return}try{await h26($0,X.configService,X.viewerUserIDPromise)}catch(Q0){if(Q0 instanceof n1)throw Q0;u.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})}},switchThreadVisibility:C,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:j,handleError:Mz},_=async()=>{try{return XA6(k,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch($0){if($0 instanceof n1)throw $0;throw await Mz($0,Q.threadId),Error("handleError should have called process.exit()")}},S=(async()=>{if(V){u.info("Skipping initial free tier status fetch until auth is complete");return}try{let $0=await X.configService.getLatest(),j0=dm($0),Q0=await e4.getUserFreeTierStatus({},{config:X.configService,signal:AbortSignal.timeout(j0)});if(Q0.ok)return u.info("User free tier status:",Q0),Q0.result;return}catch($0){u.error("Failed to fetch free tier status:",$0);return}})(),b=!A.executeMode?new g31:null,v,x=null;if(b)v=b,x=(async()=>{let $0=V?await X.serverStatusPromise:X.serverStatus;if(mY($0))throw tt($0,A.ampURL);await p91($,Q,$0);let j0=process.hrtime.bigint(),Q0=await _();if(F("runMainThread:createThreadPool",j0),b.attach(Q0),E){let M0=await k1(Q0.threadHandles$);if(!M0)throw new n1("No active thread is available yet.",1);await M0.sendMessage({content:[{type:"text",text:E}]})}})(),x.catch(async($0)=>{let j0=$0 instanceof Error?$0:Error(String($0));b.setInitError(j0),await Mz($0,Q.threadId)});else U=process.hrtime.bigint(),v=await _(),F("runMainThread:createThreadPool",U);let c=Q.notifications!==void 0?Q.notifications:!A.executeMode;U=process.hrtime.bigint();let p=await X.configService.getLatest();if(F("runMainThread:configService.getLatest",U),U=process.hrtime.bigint(),st4({configService:X.configService,threadService:X.threadService,threadPool:v,config:p,useNotifications:c}),F("runMainThread:createLegacyTuiNotificationService",U),A.executeMode){Le0(X.mcpService,A.settings);let $0=kK0($,Q),j0=await bz(),Q0=O?$0:oY0({agentMode:Q.mode,explicitEffort:$0,sessionState:j0}),M0={userInput:E,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 n_4({threadPool:v,...M0});if(await et(n,"execute"),Q.archive)await X.threadService.archive(n,!0);await X.asyncDispose(),process.exit(0)}let g=!1,i=!1;if(Q.jetbrains||Q.ide){await z20();let $0=await lY({jetbrainsOnly:Q.jetbrains});if($0.length===0){if(Q.jetbrains)g=!await X.configService.get("jetbrains.skipInstall")}else if($0.length===1){let j0=$0[0];if(j0)o5.selectConfig(j0)}else i=!0}U=process.hrtime.bigint();let r=WY0("0.0.1779786108-g751b94",X.settingsStorage,{startDelayMs:3000});F("runMainThread:createUpdateService",U),U=process.hrtime.bigint();let A0=new aY0(X.mcpService,A.settings.getWorkspaceRootPath());if(F("runMainThread:createMcpTrustHandler",U),E&&A.executeMode){let $0=await k1(v.threadHandles$);if(!$0)throw new n1("No active thread is available yet.",1);await $0.sendMessage({content:[{type:"text",text:E}]})}U=process.hrtime.bigint();let W0=await bz();F("runMainThread:loadSessionState",U),u.info("Loaded session state:",W0);let Y0=kK0($,Q),I0={...W0,launchCount:W0.launchCount+1,lastReasoningEffortByMode:Y0?{...W0.lastReasoningEffortByMode,[Q.mode]:Y0}:W0.lastReasoningEffortByMode};GQ(($0)=>({...$0,launchCount:$0.launchCount+1}));try{if(U=process.hrtime.bigint(),await Le4({history:new qo,fuzzyServer:X.fuzzyServer,settingsStorage:X.settingsStorage,threadService:X.threadService,skillService:X.skillService,configService:X.configService,secretStorage:X.secretStorage,internalAPIClient:e4,threadPool:v,createSystemPromptDeps:async()=>i26(X),ideClient:o5,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:O,showJetBrainsInstaller:g,showIdePickerHint:i,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:EA5,logFile:{path:B},sessionState:I0,freeTierStatusPromise:S,workspace:N??null,features:q,isInternalUser:I,initialAgentMode:$.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-26T09:06:27.137Z"},($0)=>new n31({...$0,threadPool:$0.threadPool},(j0)=>new V81({...j0,threadState:j0.threadState}))),F("runMainThread:mountApp-returned",U),x)await x}finally{await v.dispose().catch(($0)=>{u.error("Failed to dispose thread pool during shutdown",$0)})}await X.asyncDispose(),F("runMainThread:dependencies.asyncDispose",J),process.exit(0)}async function m3(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)I$.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
7301
|
+
`);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 e74({get:async(E)=>{if(E!==op)return;try{let Y=await c26(d91,"utf-8");return JSON.parse(Y).installationID}catch{return}},set:async(E,Y)=>{if(E!==op)return;await BA5(st.dirname(d91),{recursive:!0}),await DA5(d91,JSON.stringify({installationID:Y},null,2),{mode:384})}},{clientType:"cli",platform:k90()});R04(B);let D=await Ct4({...A,workspaceTrust:{current:!0,changes:pm},getHook:process.env.AMP_URL?(E,Y)=>{if(E==="url")return Promise.resolve(process.env.AMP_URL);return Y()}:void 0});if(A.mcpConfig){let E=await wb4(A.mcpConfig);D=Mb4(D,E)}let J=st.dirname(D.getSettingsFilePath());UR4(Rd,J),D=Qt1(D);let F=await D.get("url","admin")??await D.get("url","global");if(!F)F=l7;if(u.info("Resolved Amp URL",{ampURL:F,settingsFile:D.getSettingsFilePath(),workspaceRoot:D.getWorkspaceRootPath()}),!iI(F))u.info("Targeting custom Amp server",{ampURL:F});return{executeMode:Q,isTTY:$,ampURL:F,settings:D,secrets:zt4(await T31(A,D))}}function kA5(A){let Q={};for(let $=0;$<A.length;$++){let B=A[$];if(B?.startsWith("--")){let J=B.slice(2).replace(/-([a-z])/g,(E,Y)=>Y.toUpperCase()),F=A[$+1];if(F&&!F.startsWith("--"))Q[J]=F,$++}}return Q}function SA5(A,Q){let $=A.includes("--headless")||A.some((D)=>D.startsWith("--headless=")),B=st.resolve(Q.logFile??process.env.AMP_LOG_FILE??($?FA5:Ta));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:B}}async function fA5(){B_4();let A=kA5(process.argv),Q=SA5(process.argv,A),$=X_4(Q);nF0("silent");let B=process.argv.includes("--no-color"),D=process.argv.includes("--color"),J=process.stdout.isTTY&&process.stderr.isTTY;if(B||!D&&!J)t0.level=0;if(ZA5(u),u.info("Starting Amp CLI.",{version:"0.0.1779786108-g751b94",buildTimestamp:"2026-05-26T09:06:27.137Z"}),process.platform==="win32"&&Lj())qy4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new n1(m9.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await RA5($).parseAsync(process.argv)}YR4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await fA5().catch(Mz)});async function yA5(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"),A3.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
7302
7302
|
`);else if(!iI(A.ampURL))A3.write(`Logging in to ${new URL(A.ampURL).hostname}
|
|
7303
7303
|
`);let B=process.env.AMP_API_KEY;if(B)A3.write(`API key found in environment variable, storing...
|
|
7304
7304
|
`),await Q.set("apiKey",B,A.ampURL),A3.write(`API key successfully stored.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sourcegraph/amp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1779786108-g751b94",
|
|
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.
|
|
11
|
+
"@ampcode/cli": "0.0.1779786108-g751b94"
|
|
12
12
|
},
|
|
13
13
|
"files": [
|
|
14
14
|
"dist/main.js",
|