@sourcegraph/amp 0.0.1780601115-gdd09a6 → 0.0.1780605512-ga5182d
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 +9 -9
- package/package.json +2 -2
package/dist/main.js
CHANGED
|
@@ -2815,13 +2815,13 @@ ${K}`))}},error:(V)=>{if(!G)G=!0,Z(Error(`Failed to spawn brew: ${V.message}`))}
|
|
|
2815
2815
|
${K}`;if(J==="pnpm"&&K.includes("Unable to find the global bin directory"))z+=`
|
|
2816
2816
|
|
|
2817
2817
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
2818
|
-
npm install -g ${D}`;Z(Error(z))}},error:(V)=>{if(!I)I=!0,Z(Error(`Failed to spawn ${J}: ${V.message}`))},complete:()=>{if(!I)I=!0,Y()}})})}r0();r0();nh();var PsQ="@ampcode/cli";async function i30(A,Q,$=PsQ){let E=`${Q||"https://registry.npmjs.org"}/${$}/latest`,D=new AbortController,J=setTimeout(()=>D.abort(),5000);try{let U=await fetch(E,{signal:D.signal});if(!U.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let Y=await U.json(),Z=Y.version??Y["dist-tags"]?.latest;if(!Z)return{hasUpdate:!1,currentVersion:A,source:"npm"};let F=gc(A,Z),X=F<0,I,G;if(Y.time){let V=Y.time[A],K=Y.time[Z],z=Date.now();if(V)I=Math.floor((z-new Date(V).getTime())/3600000);if(K)G=Math.floor((z-new Date(K).getTime())/3600000)}return S.info("NPM version comparison",{currentVersion:A,latestVersion:Z,compareResult:F,hasUpdate:X,currentVersionAge:I,latestVersionAge:G}),{hasUpdate:X,latestVersion:Z,currentVersion:A,currentVersionAge:I,latestVersionAge:G,source:"npm"}}catch(U){return S.debug("Error checking npm version",{error:U}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(J)}}var TsQ="https://static.ampcode.com/cli/cli-version.txt";async function n30(A){let Q=new AbortController,$=setTimeout(()=>Q.abort(),5000);try{let B=await fetch(`${TsQ}?t=${Date.now()}`,{signal:Q.signal,cache:"no-store"});if(!B.ok)return{hasUpdate:!1,currentVersion:A,source:"bin"};let E=(await B.text()).trim();if(!E||!/^\d+\.\d+\.\d+/.test(E))return{hasUpdate:!1,currentVersion:A,source:"bin"};let D=gc(A,E),J=D<0;return S.info("Bin version comparison",{currentVersion:A,latestVersion:E,compareResult:D,hasUpdate:J}),{hasUpdate:J,latestVersion:E,currentVersion:A,source:"bin"}}catch(B){return S.debug("Error checking bin version",{error:B}),{hasUpdate:!1,currentVersion:A,source:"bin"}}finally{clearTimeout($)}}function gc(A,Q){let $=(J)=>{let[U,Y]=J.split("-");return{parts:U?.split(".").map(Number)||[],label:Y}},B=$(A),E=$(Q),D=Math.max(B.parts.length,E.parts.length);for(let J=0;J<D;J++){let U=B.parts[J]||0,Y=E.parts[J]||0;if(U<Y)return-1;if(U>Y)return 1}if(B.label===E.label)return 0;if(!B.label&&E.label)return 1;if(B.label&&!E.label)return-1;if(B.label&&E.label)return B.label<E.label?-1:1;return 0}function mc(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-(.+))?/);if(!Q)return null;let $=parseInt(Q[1],10),B=$!==0?$*1000:void 0,D=Q[2]?.match(/^g?([a-f0-9]+)$/)?.[1],J=B!==void 0?VV(B):void 0;return{sha:D,timestamp:B,age:J}}catch{return null}}hA();r0();import{readFile as vsQ,realpath as _sQ}from"node:fs/promises";import{dirname as wG4,join as SsQ}from"node:path";async function MG4(A){switch(A){case"binary":case"brew":return ksQ(bc());case"npm":case"pnpm":case"yarn":case"bun":return fsQ()}}async function ksQ(A){let Q=await VK(A,["--version"],5000);if(Q.reason!=="success")return S.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function fsQ(){try{let A=process.argv[1];if(!A)return null;let Q=await _sQ(A),$=wG4(wG4(Q));return await xsQ(SsQ($,"package.json"))}catch(A){return S.debug("failed to read installed version from package.json",{error:A}),null}}async function xsQ(A){let Q=await vsQ(A,"utf8"),$=JSON.parse(Q);if(!$.name||!mx0($.name))return S.debug("package.json name mismatch",{pkgJsonPath:A,name:$.name}),null;return $.version||null}r0();import{spawn as ysQ}from"node:child_process";function ox0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return S.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var o30=null,dc=null;function OG4(A){return new Promise((Q)=>{let $=ysQ("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),B="";$.stdout.on("data",(E)=>{B+=E.toString()}),$.on("close",(E,D)=>{if(E!==0||D==="SIGTERM"){Q(null);return}let J=B.trim();Q(J&&J!=="undefined"?J:null)}),$.on("error",()=>{Q(null)})})}async function a30(){if(o30)return o30;if(dc)return dc;dc=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return ox0(A);let Q=await OG4("@sourcegraph:registry");if(Q)return ox0(Q);let $=await OG4("registry");if($)return ox0($);return"https://registry.npmjs.org"})();try{return o30=await dc,o30}finally{dc=null}}var bsQ=3600000,hsQ=5000;function ax0(A,Q,$={}){let B=new w4,E=B.pipe(R$({shouldCountRefs:!1})),D=$.startDelayMs??0,J=$.checkIntervalMs??bsQ,U=!1,Y=()=>{U=!0};return setImmediate(async()=>{let Z=S.getChild("update");if(D>0){if(await zV(D),U)return}let F=E.subscribe({next:(I)=>{Z.debug("emit new state",I)}}),X=A;try{while(!U){let I=await gsQ(X,Q,Z,B);if(I.stop)return;if(I.updatedTo)X=I.updatedTo;if(I.emittedVisibleState){if(await zV(hsQ),U)return;B.next("hidden")}if(J<=0)return;let G=1000,V=J;while(V>0&&!U){let K=Math.min(G,V);await zV(K),V-=K}}}finally{F.unsubscribe(),B.complete()}}),{state:E,dispose:Y}}async function gsQ(A,Q,$,B){let E={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return $.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),E.stop=!0,E;let D=await Q.get("updates.mode");if(D==="disabled")return $.debug("checking disabled"),E.stop=!0,E;let J=await cY(),U=J==="binary"||J==="brew",Y=U?void 0:await KK();$.debug("checking",{currentVersion:A,mode:D,packageManager:J,isBinaryDistribution:U,npmPackageName:Y});let Z;if(U)Z=await n30(A);else{let I=await a30();Z=await i30(A,I,Y)}if(!(Z.latestVersion&&Z.hasUpdate))return $.debug("no update available"),E;let F=(I)=>{B.next(I),E.emittedVisibleState=!0};if(J){let I=await MG4(J);if(I&&gc(I,Z.latestVersion)>=0){if($.debug("on-disk version already up to date",{currentVersion:A,installedVersion:I,latestVersion:Z.latestVersion}),E.updatedTo=I,gc(A,I)<0){let G=await CX(I),V={from:A,to:I,externallyUpdated:!0,...G};if(G.status==="same")$.info("on-disk already updated by another instance",V),F("updated");else $.warn("on-disk already updated by another instance, with PATH warning",V),F("updated-with-warning")}return E}}let X=()=>{if(Z.currentVersionAge!==void 0&&Z.latestVersionAge!==void 0){let I=Z.currentVersionAge-Z.latestVersionAge,G=0.5;if(Math.abs(I)<0.5)return $.debug("versions too close together, suppressing update warning",{currentVersionAge:Z.currentVersionAge,latestVersionAge:Z.latestVersionAge,ageDifferenceHours:I}),!0}return!1};if(!D)D=J==="pnpm"?"warn":"auto",$.debug("no configured update mode; selected default based on package manager",{packageManager:J,mode:D});if(J==="brew"){if(!X())F("update-available-brew");return E}if(J==="binary"&&process.execPath!==bc()){if($.debug("non-standard binary path, showing warning"),!X())F("update-available-unrecognized-path");return E}if(D==="warn"){if(!X())F("update-available");return E}if(!J){if($.debug("auto-update not supported, falling back to warn mode"),!X())F("update-available");return E}try{await hc(Z.latestVersion,J),E.updatedTo=Z.latestVersion;let I=await CX(Z.latestVersion),G={from:Z.currentVersion,to:Z.latestVersion,...I};if(I.status==="same")$.info("success",G),F("updated");else $.warn("success with warning",G),F("updated-with-warning")}catch(I){F("update-error")}return E}catch(D){return $.debug("check failed",{error:D}),E}}nh();import{stderr as iD}from"node:process";function LG4(A){let Q=new GX().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 hx0(B.force||!1,B.verbose||!1,"0.0.
|
|
2818
|
+
npm install -g ${D}`;Z(Error(z))}},error:(V)=>{if(!I)I=!0,Z(Error(`Failed to spawn ${J}: ${V.message}`))},complete:()=>{if(!I)I=!0,Y()}})})}r0();r0();nh();var PsQ="@ampcode/cli";async function i30(A,Q,$=PsQ){let E=`${Q||"https://registry.npmjs.org"}/${$}/latest`,D=new AbortController,J=setTimeout(()=>D.abort(),5000);try{let U=await fetch(E,{signal:D.signal});if(!U.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let Y=await U.json(),Z=Y.version??Y["dist-tags"]?.latest;if(!Z)return{hasUpdate:!1,currentVersion:A,source:"npm"};let F=gc(A,Z),X=F<0,I,G;if(Y.time){let V=Y.time[A],K=Y.time[Z],z=Date.now();if(V)I=Math.floor((z-new Date(V).getTime())/3600000);if(K)G=Math.floor((z-new Date(K).getTime())/3600000)}return S.info("NPM version comparison",{currentVersion:A,latestVersion:Z,compareResult:F,hasUpdate:X,currentVersionAge:I,latestVersionAge:G}),{hasUpdate:X,latestVersion:Z,currentVersion:A,currentVersionAge:I,latestVersionAge:G,source:"npm"}}catch(U){return S.debug("Error checking npm version",{error:U}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(J)}}var TsQ="https://static.ampcode.com/cli/cli-version.txt";async function n30(A){let Q=new AbortController,$=setTimeout(()=>Q.abort(),5000);try{let B=await fetch(`${TsQ}?t=${Date.now()}`,{signal:Q.signal,cache:"no-store"});if(!B.ok)return{hasUpdate:!1,currentVersion:A,source:"bin"};let E=(await B.text()).trim();if(!E||!/^\d+\.\d+\.\d+/.test(E))return{hasUpdate:!1,currentVersion:A,source:"bin"};let D=gc(A,E),J=D<0;return S.info("Bin version comparison",{currentVersion:A,latestVersion:E,compareResult:D,hasUpdate:J}),{hasUpdate:J,latestVersion:E,currentVersion:A,source:"bin"}}catch(B){return S.debug("Error checking bin version",{error:B}),{hasUpdate:!1,currentVersion:A,source:"bin"}}finally{clearTimeout($)}}function gc(A,Q){let $=(J)=>{let[U,Y]=J.split("-");return{parts:U?.split(".").map(Number)||[],label:Y}},B=$(A),E=$(Q),D=Math.max(B.parts.length,E.parts.length);for(let J=0;J<D;J++){let U=B.parts[J]||0,Y=E.parts[J]||0;if(U<Y)return-1;if(U>Y)return 1}if(B.label===E.label)return 0;if(!B.label&&E.label)return 1;if(B.label&&!E.label)return-1;if(B.label&&E.label)return B.label<E.label?-1:1;return 0}function mc(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-(.+))?/);if(!Q)return null;let $=parseInt(Q[1],10),B=$!==0?$*1000:void 0,D=Q[2]?.match(/^g?([a-f0-9]+)$/)?.[1],J=B!==void 0?VV(B):void 0;return{sha:D,timestamp:B,age:J}}catch{return null}}hA();r0();import{readFile as vsQ,realpath as _sQ}from"node:fs/promises";import{dirname as wG4,join as SsQ}from"node:path";async function MG4(A){switch(A){case"binary":case"brew":return ksQ(bc());case"npm":case"pnpm":case"yarn":case"bun":return fsQ()}}async function ksQ(A){let Q=await VK(A,["--version"],5000);if(Q.reason!=="success")return S.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function fsQ(){try{let A=process.argv[1];if(!A)return null;let Q=await _sQ(A),$=wG4(wG4(Q));return await xsQ(SsQ($,"package.json"))}catch(A){return S.debug("failed to read installed version from package.json",{error:A}),null}}async function xsQ(A){let Q=await vsQ(A,"utf8"),$=JSON.parse(Q);if(!$.name||!mx0($.name))return S.debug("package.json name mismatch",{pkgJsonPath:A,name:$.name}),null;return $.version||null}r0();import{spawn as ysQ}from"node:child_process";function ox0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return S.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var o30=null,dc=null;function OG4(A){return new Promise((Q)=>{let $=ysQ("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),B="";$.stdout.on("data",(E)=>{B+=E.toString()}),$.on("close",(E,D)=>{if(E!==0||D==="SIGTERM"){Q(null);return}let J=B.trim();Q(J&&J!=="undefined"?J:null)}),$.on("error",()=>{Q(null)})})}async function a30(){if(o30)return o30;if(dc)return dc;dc=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return ox0(A);let Q=await OG4("@sourcegraph:registry");if(Q)return ox0(Q);let $=await OG4("registry");if($)return ox0($);return"https://registry.npmjs.org"})();try{return o30=await dc,o30}finally{dc=null}}var bsQ=3600000,hsQ=5000;function ax0(A,Q,$={}){let B=new w4,E=B.pipe(R$({shouldCountRefs:!1})),D=$.startDelayMs??0,J=$.checkIntervalMs??bsQ,U=!1,Y=()=>{U=!0};return setImmediate(async()=>{let Z=S.getChild("update");if(D>0){if(await zV(D),U)return}let F=E.subscribe({next:(I)=>{Z.debug("emit new state",I)}}),X=A;try{while(!U){let I=await gsQ(X,Q,Z,B);if(I.stop)return;if(I.updatedTo)X=I.updatedTo;if(I.emittedVisibleState){if(await zV(hsQ),U)return;B.next("hidden")}if(J<=0)return;let G=1000,V=J;while(V>0&&!U){let K=Math.min(G,V);await zV(K),V-=K}}}finally{F.unsubscribe(),B.complete()}}),{state:E,dispose:Y}}async function gsQ(A,Q,$,B){let E={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return $.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),E.stop=!0,E;let D=await Q.get("updates.mode");if(D==="disabled")return $.debug("checking disabled"),E.stop=!0,E;let J=await cY(),U=J==="binary"||J==="brew",Y=U?void 0:await KK();$.debug("checking",{currentVersion:A,mode:D,packageManager:J,isBinaryDistribution:U,npmPackageName:Y});let Z;if(U)Z=await n30(A);else{let I=await a30();Z=await i30(A,I,Y)}if(!(Z.latestVersion&&Z.hasUpdate))return $.debug("no update available"),E;let F=(I)=>{B.next(I),E.emittedVisibleState=!0};if(J){let I=await MG4(J);if(I&&gc(I,Z.latestVersion)>=0){if($.debug("on-disk version already up to date",{currentVersion:A,installedVersion:I,latestVersion:Z.latestVersion}),E.updatedTo=I,gc(A,I)<0){let G=await CX(I),V={from:A,to:I,externallyUpdated:!0,...G};if(G.status==="same")$.info("on-disk already updated by another instance",V),F("updated");else $.warn("on-disk already updated by another instance, with PATH warning",V),F("updated-with-warning")}return E}}let X=()=>{if(Z.currentVersionAge!==void 0&&Z.latestVersionAge!==void 0){let I=Z.currentVersionAge-Z.latestVersionAge,G=0.5;if(Math.abs(I)<0.5)return $.debug("versions too close together, suppressing update warning",{currentVersionAge:Z.currentVersionAge,latestVersionAge:Z.latestVersionAge,ageDifferenceHours:I}),!0}return!1};if(!D)D=J==="pnpm"?"warn":"auto",$.debug("no configured update mode; selected default based on package manager",{packageManager:J,mode:D});if(J==="brew"){if(!X())F("update-available-brew");return E}if(J==="binary"&&process.execPath!==bc()){if($.debug("non-standard binary path, showing warning"),!X())F("update-available-unrecognized-path");return E}if(D==="warn"){if(!X())F("update-available");return E}if(!J){if($.debug("auto-update not supported, falling back to warn mode"),!X())F("update-available");return E}try{await hc(Z.latestVersion,J),E.updatedTo=Z.latestVersion;let I=await CX(Z.latestVersion),G={from:Z.currentVersion,to:Z.latestVersion,...I};if(I.status==="same")$.info("success",G),F("updated");else $.warn("success with warning",G),F("updated-with-warning")}catch(I){F("update-error")}return E}catch(D){return $.debug("check failed",{error:D}),E}}nh();import{stderr as iD}from"node:process";function LG4(A){let Q=new GX().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 hx0(B.force||!1,B.verbose||!1,"0.0.1780605512-ga5182d"),process.exit()});A.addCommand(Q,{hidden:!0});let $=new GX("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 csQ(B.targetVersion)});A.addCommand($)}function msQ(A){let Q=Boolean(A.isTTY),$=0,B=!1;function E(){if(!Q||!B)return;A.write(`
|
|
2819
2819
|
`),B=!1,$=0}function D(J){if(!Q)return;let U=J.padEnd($," ");A.write(`\r${U}`),B=!0,$=U.length}return{flushProgressLine:E,renderProgress:D}}function dsQ(A){if(A.source==="npm"&&A.latestVersionAge!==void 0&&A.latestVersionAge>36)iD.write(k0.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.
|
|
2820
2820
|
`))}async function csQ(A){let $=process.platform==="win32"&&lN()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:B,renderProgress:E}=msQ(iD);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")iD.write(k0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
2821
2821
|
|
|
2822
2822
|
`));try{if(!A){iD.write(k0.blue(`Checking for updates...
|
|
2823
|
-
`));let U=!1,Y;if(lN()){let Z=await n30("0.0.
|
|
2824
|
-
`));let X=await CX("0.0.
|
|
2823
|
+
`));let U=!1,Y;if(lN()){let Z=await n30("0.0.1780605512-ga5182d");U=Z.hasUpdate,Y=Z.latestVersion}else{let Z=await a30(),F=await KK(),X=await i30("0.0.1780605512-ga5182d",Z,F);dsQ(X),U=X.hasUpdate,Y=X.latestVersion}if(!U){let Z=mc("0.0.1780605512-ga5182d"),F=Z?.age?`released ${Z.age} ago`:`built ${VV(new Date("2026-06-04T20:43:42.187Z"))} ago`;iD.write(k0.green(`✓ Amp is already up to date on version ${"0.0.1780605512-ga5182d"} (${F})
|
|
2824
|
+
`));let X=await CX("0.0.1780605512-ga5182d",$);if(X.warning)iD.write(`
|
|
2825
2825
|
`+k0.yellow(X.warning)+`
|
|
2826
2826
|
`);process.exit(0)}if(!Y)iD.write(k0.yellow("[WARN] could not find latest version")),process.exit(0);A=Y}iD.write(k0.blue(`Updating to version ${A}...
|
|
2827
2827
|
`)),await hc(A,void 0,(U)=>{B(),iD.write(k0.dim(`Running: ${U}
|
|
@@ -2989,7 +2989,7 @@ ${B}`}async function X66(A,Q){if(!Q?.forceExternal&&Q?.onShowImagePreview&&bC4(A
|
|
|
2989
2989
|
`).length,E=new J0({text:new g(A,new Q0({color:$}))});if(B<=Z80)return E;return new y0({width:1/0,height:Z80,child:new RB({autofocus:!1,controller:Q,child:E})})}function M76(){return new Map([[CA.key("PageUp"),new F80],[CA.key("PageDown"),new jg0],[CA.ctrl("u"),new F80],[CA.shift("Home"),new Rg0],[CA.shift("End"),new Pg0]])}function O76(A,Q,$){return Math.max(Q,Math.min(A,$))}var Tg0=8,Zu4=1,Fu4=Tg0-1;class vg0 extends V4{}class _g0 extends V4{}class X80 extends V4{}class I80 extends V4{}class Sg0 extends V4{}class kg0 extends V4{}class fg0 extends d0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new Xu4}}class Xu4 extends m0{messageScroll=new I$;initState(){super.initState(),this.messageScroll.followMode=!1,this.messageScroll.jumpTo(0)}dispose(){this.messageScroll.dispose(),super.dispose()}build(A){let Q=this.widget.props,$=L76(Q,this.messageScroll),B=j76(Q.options.message),E=B?new q4({actions:this.buildScrollActions(),child:new iQ({debugLabel:"SelectDialogScrollShortcuts",shortcuts:P76(),child:$})}):$,D=[{keys:["↑/↓","j/k"],label:"move"},{keys:["Enter"],label:"select"}];if(B)D.push({keys:["Ctrl+E","Ctrl+Y"],label:"scroll"});return D.push({keys:["Esc"],label:"cancel"}),new B1({header:Q.options.title,minWidth:64,maxWidth:80,footer:D,autofocus:!1,onDismiss:Q.onCancel,child:E})}buildScrollActions(){let A=(Q)=>{let $=T76(this.messageScroll.offset+Q,0,this.messageScroll.maxScrollExtent);this.messageScroll.jumpTo($)};return new Map([[vg0,new pA(()=>A(-Zu4))],[_g0,new pA(()=>A(Zu4))],[X80,new pA(()=>A(-Fu4))],[I80,new pA(()=>A(Fu4))],[Sg0,new pA(()=>this.messageScroll.jumpTo(0))],[kg0,new pA(()=>this.messageScroll.jumpTo(this.messageScroll.maxScrollExtent))]])}}function L76(A,Q){let $=A.options.options.map((E)=>({value:E,label:E})),B=Math.max(0,$.findIndex((E)=>E.value===A.options.initialValue));return new LX({options:$,selectedIndex:B,body:R76(A.options.message,Q),onSelect:(E)=>{if(E===null){A.onCancel();return}A.onSelect(E)},padding:i0.all(0),showBorder:!1,showDismissalMessage:!1,enableMouseInteraction:!0,wrapOptions:!0})}function j76(A){if(A===void 0)return!1;return A.split(`
|
|
2990
2990
|
`).length>Tg0}function R76(A,Q){if(A===void 0)return;let $=A.split(`
|
|
2991
2991
|
`).length,B=Math.min($,Tg0);return new y0({width:1/0,height:B,child:new RB({autofocus:!1,controller:Q,child:new J0({text:new g(A)})})})}function P76(){return new Map([[CA.key("PageUp"),new X80],[CA.key("PageDown"),new I80],[CA.ctrl("u"),new X80],[CA.ctrl("d"),new I80],[CA.ctrl("y"),new vg0],[CA.ctrl("e"),new _g0],[CA.shift("Home"),new Sg0],[CA.shift("End"),new kg0]])}function T76(A,Q,$){return Math.max(Q,Math.min(A,$))}var v76=3,_76=2097152,S76=new DB("PluginDialogOverlay");function G80(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}}function k76(A){let Q=new TextEncoder().encode(JSON.stringify(A)).byteLength;if(Q<=_76)return;throw Error(`thread.messages response is too large (${Q} bytes). Request fewer messages.`)}class xg0{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(!mB0($.method)){if($.method==="thread.messages")this.handleThreadMessagesRequest($,Q);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 W6({key:S76,debugLabel:"PluginDialogOverlay",autofocus:!1,canRequestFocus:!0,child:this.buildActiveDialog(A)})]}buildActiveDialog(A){switch(A.kind){case"input":return new Cl({key:new CK(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 Lg0({key:new CK(A),options:A.options,onConfirm:()=>this.resolveConfirmDialog(A,!0),onCancel:()=>this.resolveConfirmDialog(A,!1)});case"select":return new fg0({key:new CK(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.context.pluginPlatform;if(!A)return;if(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.context.observerOnly?async()=>{throw Error("thread.append is only available from an executor-owned plugin runtime")}:this.options.appendToThread,this.options.readThreadMessages)A.readThreadMessagesHandler=this.readThreadMessages;A.runAgentHandler=this.options.context.observerOnly?async()=>{throw Error("agent.run is only available from an executor-owned plugin runtime")}:this.options.runAgent??(async()=>{throw Error("agent.run is not available in this context")}),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 handleThreadMessagesRequest(A,Q){try{let{options:$,threadID:B}=this.parseThreadMessagesRequestParams(A.params),E=await this.readThreadMessages($,B);k76(E),Q(G80(A.id,E))}catch($){Q(G80(A.id,void 0,$ instanceof Error?$.message:String($)))}}parseThreadMessagesRequestParams(A){if(!A||typeof A!=="object")return{options:void 0,threadID:void 0};let Q=A;return{options:Q.options,threadID:typeof Q.threadID==="string"?Q.threadID:void 0}}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(G80(A.id,B))}catch(B){if(this.pendingOwnerUIRequests.get(A.id)!==$)return;this.pendingOwnerUIRequests.delete(A.id),Q(G80(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 E=await this.dispatchOwnerUIRequest(B,$.signal);if(this.pendingActorUIRequests.get(A.requestId)!==$)return;this.pendingActorUIRequests.delete(A.requestId),Q(this.buildPluginUIRespondRequest(A.requestId,E))}catch(E){if(this.pendingActorUIRequests.get(A.requestId)!==$)return;this.pendingActorUIRequests.delete(A.requestId),Q(this.buildPluginUIRespondRequest(A.requestId,void 0,E instanceof Error?E.message:String(E)))}}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 $=nY4.safeParse(A.data);if($.success)this.handlePluginUISnapshot($.data,Q);return!0}if(A.event==="plugin.ui.request_added"){let $=oY4.safeParse(A.data);if($.success)this.handlePluginUIRequestAdded($.data,Q);return!0}if(A.event==="plugin.ui.request_settled"){let $=aY4.safeParse(A.data);if($.success)this.handlePluginUIRequestSettled($.data,Q);return!0}if(A.event==="plugin.ui.request_removed"){let $=rY4.safeParse(A.data);if($.success)this.handlePluginUIRequestRemoved($.data);return!0}return!1}clearPluginPlatformStatusHandlers(){let A=this.options.context.pluginPlatform;if(!A)return;if(A.readThreadMessagesHandler===this.readThreadMessages)A.readThreadMessagesHandler=null;if(A.createStatusItemHandler===this.createStatusItem)A.createStatusItemHandler=null;if(A.updateStatusItemHandler===this.updateStatusItem)A.updateStatusItemHandler=null;if(A.removeStatusItemHandler===this.removeStatusItem)A.removeStatusItemHandler=null;if(A.runAgentHandler===this.options.runAgent)A.runAgentHandler=null}subscribePluginCommands(){let A=this.options.context.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(Dh($.errorMessage))continue;let B=`${$.uri.toString()}
|
|
2992
|
-
${$.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,E]of this.statusItems){if(Q.has(E.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.context.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,status:A.availability,run:async(Q,$,B)=>{B();try{await this.options.context.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(E){S.error("Neo plugin command failed",{error:E,command:A}),this.options.toastController.show(E instanceof Error?E.message:String(E),"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=xG(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=xG(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=xG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};createStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let B=this.statusItemKey(A,Q),E={pluginURI:A,id:Q};if($!==void 0)E.value=$;this.statusItems.set(B,E)})};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))})};readThreadMessages=(A,Q)=>{let $=this.options.readThreadMessages;if(!$)return Promise.reject(Error("thread.messages is not available - no active thread"));return $(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,v76)}scheduleResolvingDialogAdvance(A,Q){z6.instance.addPostFrameCallback(()=>{if(this.activeDialog!==A)return;if(this.queuedDialogs.length>0||Q<=1){this.advanceResolvingDialog(A);return}this.scheduleResolvingDialogAdvance(A,Q-1)},"PluginIntegration.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)}}r0();import{spawnSync as f76}from"node:child_process";import Z9 from"node:process";var Iu4={options:new Set(["settings-file","log-level","log-file","mcp-config"]),booleans:new Set(["color","dangerously-allow-all","ide","jetbrains","neo-orb","notifications"])};function Hl(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else I1.instance.stop()}function Gu4(A){return{noun:"amp",verb:"Relaunch (Quit & Reopen)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update"],shortcut:Z9.env.NODE_ENV==="development"&&Z9.platform==="darwin"?CA.meta("r"):void 0,status:{type:"enabled"},sortBoost:90,run:(Q,$,B)=>{B(),Hl(A)}}}function x76(A,Q){let{command:$,args:B}=y76(A),E=Z9.execve,D=Z9.platform==="win32"||!E,J=D?"spawnSync":"execve";if(S.info("Relaunching Amp; threads will be resumed",{threadIDs:A,relaunchMethod:J}),D){let U=f76($,B,{cwd:Q,env:Z9.env,stdio:"inherit"});if(U.error)return S.error("Failed to relaunch Amp",{error:U.error}),1;return U.status??1}try{if(Z9.chdir(Q),$.includes("/"))return E($,[$,...B],Z9.env);return E("/usr/bin/env",["env",$,...B],Z9.env)}catch(U){return S.error("Failed to relaunch Amp",{error:U}),1}}class yg0{relaunchRequested=!1;requestedThreadIDs=[];request=(A)=>{S.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 x76(this.requestedThreadIDs,A)}}function y76(A){let Q=A.length>0?["threads","continue",...A]:[],$=b76(Z9.argv),B=g76();if(B)return{command:B.command,args:[...B.args,...$,...Q]};let E=Z9.argv[1],D=E&&h76(E)?[E]:[];return{command:Z9.execPath,args:[...D,...$,...Q]}}function b76(A){let Q=[],$=A.slice(2);for(let B=0;B<$.length;B+=1){let E=$[B];if(!E?.startsWith("--"))continue;let[D,J]=E.split("=",2);if(!D)continue;let U=D.slice(2),Y=U.startsWith("no-")?U.slice(3):U;if(Iu4.booleans.has(Y)){Q.push(E);continue}if(!Iu4.options.has(U))continue;if(J!==void 0){Q.push(E);continue}let Z=$[B+1];if(Z===void 0||Z.startsWith("--"))continue;Q.push(E,Z),B+=1}return Q}function h76(A){return A!==Z9.execPath&&!A.startsWith("/$bunfs/")}function g76(){if(Z9.env.NODE_ENV!=="development")return null;let A=Z9.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=m76(A),$=Q[0];if(!$)return null;return{command:$,args:Q.slice(1)}}function m76(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 d76=48;class bg0{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 Kl({width:d76,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()}}import{readFile as i76}from"node:fs/promises";import gg0 from"node:os";var c76=["command","args","url","transport","_target"];function hg0(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}function p76(A){if(typeof A!=="string")return A;let Q=A.indexOf("?");return Q===-1?A:A.slice(0,Q)}function l76(A){if(!hg0(A))return A;let Q={};for(let[$,B]of Object.entries(A)){if(!hg0(B)){Q[$]=B;continue}let E={};for(let D of c76){if(!(D in B))continue;E[D]=D==="url"?p76(B[D]):B[D]}Q[$]=E}return Q}function Vu4(A){let Q=IO(A,[],{allowTrailingComma:!0});if(!hg0(Q))return JP(A);let $={...Q};for(let B of Object.keys($))if(B==="mcpServers"||B==="amp.mcpServers")$[B]=l76($[B]);return JP(JSON.stringify($,null,2))}D$();function n76(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function Ku4(A,Q,$=JP){try{return{path:Q,contents:$(await i76(A,"utf8"))}}catch{return null}}async function V80(A,Q){let $=[],B=n76(),E=await M4.getThread({thread:Q},{config:A.configService}),D=E.ok?E.result.thread.data:null;$.push({path:`${B}/thread.json`,contents:JSON.stringify(mD(D),null,2)});let J=await Ku4(CP(Q),`${B}/logs/${Q}.log`);if(J)$.push(J);let U=await Ku4(A.settingsFilePath,`${B}/settings/global.json`,Vu4);if(U)$.push(U);let Y=await cY()??"unknown",Z=await M4.sendReport({threadID:Q,files:$,metadata:{clientVersion:"0.0.1780601115-gdd09a6",clientOS:`${gg0.platform()} ${gg0.release()} ${gg0.arch()}`,installMethod:Y}},{config:A.configService});if(!Z.ok)throw Error(`Failed to submit report: ${Z.error.message}`);return Z.result.reportID}class mg0{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)}}}}var o76=86400000;class dg0{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??o76)-(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(()=>Hl(this.options))}}class K80 extends P6{offstage;constructor({key:A,offstage:Q=!0,child:$}){super({key:A,child:$});this.offstage=Q}createRenderObject(){return new cg0(this.offstage)}updateRenderObject(A){if(A instanceof cg0)A.offstage=this.offstage}}class cg0 extends bA{_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;oA(!!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 Nl{_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 pg0 extends d0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new zu4}}class zu4 extends m0{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 SP,$=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:$})})}pushWithDismiss(A){let Q=new SP,$=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 K80({offstage:this.entries.length>0,child:this.widget.root}));for(let $=0;$<this.entries.length;$++){let B=this.entries[$],E=$===this.entries.length-1,D=E?new W6({autofocus:!0,debugLabel:`ModalStackEntry[${$}]`,onKey:(J)=>{if(J.key!=="Escape")return"ignored";return B.dismiss(),"handled"},child:B.widget}):B.widget;Q.push(new K80({key:B.key,offstage:!E,child:D}))}return new BQ({fit:"expand",children:Q})}}class ig0 extends F4{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter((E)=>E.status.type!=="hidden"),$=r76(Q),B="";return new B1({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:i0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new w5({items:Q,showBorder:!1,getLabel:(E)=>{let D=lg0(E);return E.keywords&&E.keywords.length>0?`${D} ${E.keywords.join(" ").toLowerCase()}`:D},onQueryChange:(E)=>{B=E},sortItems:(E,D,J)=>{B=J;let U=J.trim().toLowerCase();if(U===""){let V=E.item.status.type==="disabled"?1:0,K=D.item.status.type==="disabled"?1:0;if(V!==K)return V-K;let z=E.item.sortBoost??0,W=D.item.sortBoost??0;if(z!==W)return W-z;let C=E.item.noun?.toLowerCase()??"",H=D.item.noun?.toLowerCase()??"";if(C!==H)return C<H?-1:1;return 0}let Y=Wu4(E.item,U),Z=Wu4(D.item,U);if(Y!==Z)return Y?-1:1;let F=Vq(E.item.verb.toLowerCase(),J),X=Vq(D.item.verb.toLowerCase(),J);if(F!==X)return X-F;let I=Vq(lg0(E.item),J),G=Vq(lg0(D.item),J);if(I!==G)return G-I;return D.score-E.score},isItemDisabled:(E)=>E.status.type==="disabled",buildDisabledReasonWidget:(E,D)=>{if(E.status.type!=="disabled")return;let{colors:J}=BA.of(D);return new J0({text:new g(E.status.reason,new Q0({color:J.mutedForeground,dim:!0})),textAlign:"center",maxLines:1,overflow:"ellipsis"})},renderItem:(E,D,J,U)=>new Cu4({command:E,isSelected:D,isDisabled:J,categoryWidth:$,query:B,buildContext:U}),onAccept:(E)=>{this.props.onAccept(E)},onDismiss:this.props.onDismiss})})}}class Cu4 extends F4{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:$,isDisabled:B,categoryWidth:E,query:D,buildContext:J}=this.props,U=BA.of(J),{colors:Y,app:Z}=U,F=$?Z.selectionBackground:void 0,X=$?Z.selectionForeground:Y.foreground,I=$?X:Y.mutedForeground,G=new J0({text:new g(Q.noun?.toLowerCase()??"",new Q0({color:I,dim:B||!$})),textAlign:"right",maxLines:1,overflow:"ellipsis"}),V=Q.verb.toLowerCase();if(B)V+=" (unavailable)";let K=a76(Q,D);if(K)V+=` (alias: ${K})`;let z=new J0({text:new g(V,new Q0({color:X,bold:!0,dim:B})),maxLines:1,overflow:"ellipsis"}),W=[{child:G,fixedWidth:E},{child:z,expanded:!0}];if(Q.shortcut)W.push({child:s76(Q.shortcut,U,B)});return new Hu4({columns:W,padding:i0.horizontal(1),backgroundColor:F})}}function lg0(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function Wu4(A,Q){return A.keywords?.some(($)=>$.trim().toLowerCase()===Q)??!1}function a76(A,Q){let $=Q.trim().toLowerCase();if($==="")return;return A.keywords?.find((B)=>B.trim().toLowerCase()===$)}function r76(A){return A.reduce((Q,$)=>{return $.noun?Math.max(Q,cA($.noun)):Q},0)}function s76(A,Q,$){let{app:B}=Q,E=new Q0({color:B.keybind,bold:!0,dim:$}),D=[],J=NX(A.toString()).split("+");for(let U=0;U<J.length;U++){if(U>0)D.push(new g("+",E));D.push(new g(J[U],E))}return J0.spans(D)}class Hu4 extends F4{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:$=2,padding:B,backgroundColor:E}=this.props,D=[];for(let U=0;U<Q.length;U++){let Y=Q[U];if(U>0&&$>0)D.push(new y0({width:$}));if(Y.fixedWidth!==void 0)D.push(new y0({width:Y.fixedWidth,child:Y.child}));else if(Y.expanded)D.push(new L4({child:Y.child}));else D.push(Y.child)}let J=new OA({crossAxisAlignment:"start",children:D});if(!B&&!E)return J;return new zA({decoration:E?{color:E}:void 0,padding:B,child:J})}}class ng0{#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 Nl,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#$(){for(let A of this.#Q)A()}}class iB extends nQ{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=iB.maybeOf(A);if(!Q)throw Error("No CommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(iB)?.commandRegistry??null}}class og0 extends d0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new Nu4}}class Nu4 extends m0{modalStack=new Nl;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=iB.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=iB.of(A).commands,$=new ig0({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 pg0({root:$,controller:this.modalStack})}}var qu4=[{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"]}]}],uu4=[{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 z80 extends F4{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let $=W4.of(A).size.width<50,B=[];for(let E of this.items){let[D,J]=this.renderRow(E),U;if($)U=new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:[D,new gA({padding:i0.only({left:4}),child:J})]});else U=new OA({crossAxisAlignment:"start",children:[new L4({flex:1,child:D}),new y0({width:1}),new L4({flex:1,child:J})]});B.push(new gA({padding:i0.horizontal(6),child:U}))}return new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:B})}}function t76(A){let Q=[...A.keys];if(A.input)Q.push(A.input);return NX(Q.join("+"))}class ag0 extends F4{commands;onDismiss;constructor(A){super();this.commands=A.commands,this.onDismiss=A.onDismiss}build(A){let Q=BA.of(A),{colors:$,app:B}=Q,E=W4.of(A),D=new Q0({color:$.secondary,bold:!0}),J=new Q0({color:B.keybind}),U=new Q0({color:B.command}),Y=new Q0({color:$.foreground}),Z=Math.max(40,Math.min(80,E.size.width-4)),X=[...this.commands.filter((V)=>{let K=V.noun?.toLowerCase();return K!=="dev"&&K!=="debug"&&V.status.type!=="hidden"})].sort((V,K)=>{let z=(V.noun??"").toLowerCase(),W=(K.noun??"").toLowerCase(),C=z.localeCompare(W);if(C!==0)return C;return V.verb.toLowerCase().localeCompare(K.verb.toLowerCase())}),I=(V)=>{let K=V.methods.map((z)=>t76(z)).join(", ");return[new J0({text:new g(K,J)}),new J0({text:new g(V.description,Y)})]},G=new RB({autofocus:!0,child:new zA({constraints:new Y4(Z,Z,0,Number.POSITIVE_INFINITY),child:new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:[new gA({padding:i0.horizontal(2),child:new J0({text:new g(`Editor Shortcuts
|
|
2992
|
+
${$.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,E]of this.statusItems){if(Q.has(E.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.context.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,status:A.availability,run:async(Q,$,B)=>{B();try{await this.options.context.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(E){S.error("Neo plugin command failed",{error:E,command:A}),this.options.toastController.show(E instanceof Error?E.message:String(E),"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=xG(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=xG(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=xG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};createStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let B=this.statusItemKey(A,Q),E={pluginURI:A,id:Q};if($!==void 0)E.value=$;this.statusItems.set(B,E)})};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))})};readThreadMessages=(A,Q)=>{let $=this.options.readThreadMessages;if(!$)return Promise.reject(Error("thread.messages is not available - no active thread"));return $(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,v76)}scheduleResolvingDialogAdvance(A,Q){z6.instance.addPostFrameCallback(()=>{if(this.activeDialog!==A)return;if(this.queuedDialogs.length>0||Q<=1){this.advanceResolvingDialog(A);return}this.scheduleResolvingDialogAdvance(A,Q-1)},"PluginIntegration.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)}}r0();import{spawnSync as f76}from"node:child_process";import Z9 from"node:process";var Iu4={options:new Set(["settings-file","log-level","log-file","mcp-config"]),booleans:new Set(["color","dangerously-allow-all","ide","jetbrains","neo-orb","notifications"])};function Hl(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else I1.instance.stop()}function Gu4(A){return{noun:"amp",verb:"Relaunch (Quit & Reopen)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update"],shortcut:Z9.env.NODE_ENV==="development"&&Z9.platform==="darwin"?CA.meta("r"):void 0,status:{type:"enabled"},sortBoost:90,run:(Q,$,B)=>{B(),Hl(A)}}}function x76(A,Q){let{command:$,args:B}=y76(A),E=Z9.execve,D=Z9.platform==="win32"||!E,J=D?"spawnSync":"execve";if(S.info("Relaunching Amp; threads will be resumed",{threadIDs:A,relaunchMethod:J}),D){let U=f76($,B,{cwd:Q,env:Z9.env,stdio:"inherit"});if(U.error)return S.error("Failed to relaunch Amp",{error:U.error}),1;return U.status??1}try{if(Z9.chdir(Q),$.includes("/"))return E($,[$,...B],Z9.env);return E("/usr/bin/env",["env",$,...B],Z9.env)}catch(U){return S.error("Failed to relaunch Amp",{error:U}),1}}class yg0{relaunchRequested=!1;requestedThreadIDs=[];request=(A)=>{S.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 x76(this.requestedThreadIDs,A)}}function y76(A){let Q=A.length>0?["threads","continue",...A]:[],$=b76(Z9.argv),B=g76();if(B)return{command:B.command,args:[...B.args,...$,...Q]};let E=Z9.argv[1],D=E&&h76(E)?[E]:[];return{command:Z9.execPath,args:[...D,...$,...Q]}}function b76(A){let Q=[],$=A.slice(2);for(let B=0;B<$.length;B+=1){let E=$[B];if(!E?.startsWith("--"))continue;let[D,J]=E.split("=",2);if(!D)continue;let U=D.slice(2),Y=U.startsWith("no-")?U.slice(3):U;if(Iu4.booleans.has(Y)){Q.push(E);continue}if(!Iu4.options.has(U))continue;if(J!==void 0){Q.push(E);continue}let Z=$[B+1];if(Z===void 0||Z.startsWith("--"))continue;Q.push(E,Z),B+=1}return Q}function h76(A){return A!==Z9.execPath&&!A.startsWith("/$bunfs/")}function g76(){if(Z9.env.NODE_ENV!=="development")return null;let A=Z9.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=m76(A),$=Q[0];if(!$)return null;return{command:$,args:Q.slice(1)}}function m76(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 d76=48;class bg0{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 Kl({width:d76,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()}}import{readFile as i76}from"node:fs/promises";import gg0 from"node:os";var c76=["command","args","url","transport","_target"];function hg0(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}function p76(A){if(typeof A!=="string")return A;let Q=A.indexOf("?");return Q===-1?A:A.slice(0,Q)}function l76(A){if(!hg0(A))return A;let Q={};for(let[$,B]of Object.entries(A)){if(!hg0(B)){Q[$]=B;continue}let E={};for(let D of c76){if(!(D in B))continue;E[D]=D==="url"?p76(B[D]):B[D]}Q[$]=E}return Q}function Vu4(A){let Q=IO(A,[],{allowTrailingComma:!0});if(!hg0(Q))return JP(A);let $={...Q};for(let B of Object.keys($))if(B==="mcpServers"||B==="amp.mcpServers")$[B]=l76($[B]);return JP(JSON.stringify($,null,2))}D$();function n76(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function Ku4(A,Q,$=JP){try{return{path:Q,contents:$(await i76(A,"utf8"))}}catch{return null}}async function V80(A,Q){let $=[],B=n76(),E=await M4.getThread({thread:Q},{config:A.configService}),D=E.ok?E.result.thread.data:null;$.push({path:`${B}/thread.json`,contents:JSON.stringify(mD(D),null,2)});let J=await Ku4(CP(Q),`${B}/logs/${Q}.log`);if(J)$.push(J);let U=await Ku4(A.settingsFilePath,`${B}/settings/global.json`,Vu4);if(U)$.push(U);let Y=await cY()??"unknown",Z=await M4.sendReport({threadID:Q,files:$,metadata:{clientVersion:"0.0.1780605512-ga5182d",clientOS:`${gg0.platform()} ${gg0.release()} ${gg0.arch()}`,installMethod:Y}},{config:A.configService});if(!Z.ok)throw Error(`Failed to submit report: ${Z.error.message}`);return Z.result.reportID}class mg0{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)}}}}var o76=86400000;class dg0{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??o76)-(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(()=>Hl(this.options))}}class K80 extends P6{offstage;constructor({key:A,offstage:Q=!0,child:$}){super({key:A,child:$});this.offstage=Q}createRenderObject(){return new cg0(this.offstage)}updateRenderObject(A){if(A instanceof cg0)A.offstage=this.offstage}}class cg0 extends bA{_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;oA(!!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 Nl{_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 pg0 extends d0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new zu4}}class zu4 extends m0{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 SP,$=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:$})})}pushWithDismiss(A){let Q=new SP,$=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 K80({offstage:this.entries.length>0,child:this.widget.root}));for(let $=0;$<this.entries.length;$++){let B=this.entries[$],E=$===this.entries.length-1,D=E?new W6({autofocus:!0,debugLabel:`ModalStackEntry[${$}]`,onKey:(J)=>{if(J.key!=="Escape")return"ignored";return B.dismiss(),"handled"},child:B.widget}):B.widget;Q.push(new K80({key:B.key,offstage:!E,child:D}))}return new BQ({fit:"expand",children:Q})}}class ig0 extends F4{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter((E)=>E.status.type!=="hidden"),$=r76(Q),B="";return new B1({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:i0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new w5({items:Q,showBorder:!1,getLabel:(E)=>{let D=lg0(E);return E.keywords&&E.keywords.length>0?`${D} ${E.keywords.join(" ").toLowerCase()}`:D},onQueryChange:(E)=>{B=E},sortItems:(E,D,J)=>{B=J;let U=J.trim().toLowerCase();if(U===""){let V=E.item.status.type==="disabled"?1:0,K=D.item.status.type==="disabled"?1:0;if(V!==K)return V-K;let z=E.item.sortBoost??0,W=D.item.sortBoost??0;if(z!==W)return W-z;let C=E.item.noun?.toLowerCase()??"",H=D.item.noun?.toLowerCase()??"";if(C!==H)return C<H?-1:1;return 0}let Y=Wu4(E.item,U),Z=Wu4(D.item,U);if(Y!==Z)return Y?-1:1;let F=Vq(E.item.verb.toLowerCase(),J),X=Vq(D.item.verb.toLowerCase(),J);if(F!==X)return X-F;let I=Vq(lg0(E.item),J),G=Vq(lg0(D.item),J);if(I!==G)return G-I;return D.score-E.score},isItemDisabled:(E)=>E.status.type==="disabled",buildDisabledReasonWidget:(E,D)=>{if(E.status.type!=="disabled")return;let{colors:J}=BA.of(D);return new J0({text:new g(E.status.reason,new Q0({color:J.mutedForeground,dim:!0})),textAlign:"center",maxLines:1,overflow:"ellipsis"})},renderItem:(E,D,J,U)=>new Cu4({command:E,isSelected:D,isDisabled:J,categoryWidth:$,query:B,buildContext:U}),onAccept:(E)=>{this.props.onAccept(E)},onDismiss:this.props.onDismiss})})}}class Cu4 extends F4{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:$,isDisabled:B,categoryWidth:E,query:D,buildContext:J}=this.props,U=BA.of(J),{colors:Y,app:Z}=U,F=$?Z.selectionBackground:void 0,X=$?Z.selectionForeground:Y.foreground,I=$?X:Y.mutedForeground,G=new J0({text:new g(Q.noun?.toLowerCase()??"",new Q0({color:I,dim:B||!$})),textAlign:"right",maxLines:1,overflow:"ellipsis"}),V=Q.verb.toLowerCase();if(B)V+=" (unavailable)";let K=a76(Q,D);if(K)V+=` (alias: ${K})`;let z=new J0({text:new g(V,new Q0({color:X,bold:!0,dim:B})),maxLines:1,overflow:"ellipsis"}),W=[{child:G,fixedWidth:E},{child:z,expanded:!0}];if(Q.shortcut)W.push({child:s76(Q.shortcut,U,B)});return new Hu4({columns:W,padding:i0.horizontal(1),backgroundColor:F})}}function lg0(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function Wu4(A,Q){return A.keywords?.some(($)=>$.trim().toLowerCase()===Q)??!1}function a76(A,Q){let $=Q.trim().toLowerCase();if($==="")return;return A.keywords?.find((B)=>B.trim().toLowerCase()===$)}function r76(A){return A.reduce((Q,$)=>{return $.noun?Math.max(Q,cA($.noun)):Q},0)}function s76(A,Q,$){let{app:B}=Q,E=new Q0({color:B.keybind,bold:!0,dim:$}),D=[],J=NX(A.toString()).split("+");for(let U=0;U<J.length;U++){if(U>0)D.push(new g("+",E));D.push(new g(J[U],E))}return J0.spans(D)}class Hu4 extends F4{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:$=2,padding:B,backgroundColor:E}=this.props,D=[];for(let U=0;U<Q.length;U++){let Y=Q[U];if(U>0&&$>0)D.push(new y0({width:$}));if(Y.fixedWidth!==void 0)D.push(new y0({width:Y.fixedWidth,child:Y.child}));else if(Y.expanded)D.push(new L4({child:Y.child}));else D.push(Y.child)}let J=new OA({crossAxisAlignment:"start",children:D});if(!B&&!E)return J;return new zA({decoration:E?{color:E}:void 0,padding:B,child:J})}}class ng0{#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 Nl,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#$(){for(let A of this.#Q)A()}}class iB extends nQ{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=iB.maybeOf(A);if(!Q)throw Error("No CommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(iB)?.commandRegistry??null}}class og0 extends d0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new Nu4}}class Nu4 extends m0{modalStack=new Nl;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=iB.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=iB.of(A).commands,$=new ig0({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 pg0({root:$,controller:this.modalStack})}}var qu4=[{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"]}]}],uu4=[{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 z80 extends F4{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let $=W4.of(A).size.width<50,B=[];for(let E of this.items){let[D,J]=this.renderRow(E),U;if($)U=new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:[D,new gA({padding:i0.only({left:4}),child:J})]});else U=new OA({crossAxisAlignment:"start",children:[new L4({flex:1,child:D}),new y0({width:1}),new L4({flex:1,child:J})]});B.push(new gA({padding:i0.horizontal(6),child:U}))}return new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:B})}}function t76(A){let Q=[...A.keys];if(A.input)Q.push(A.input);return NX(Q.join("+"))}class ag0 extends F4{commands;onDismiss;constructor(A){super();this.commands=A.commands,this.onDismiss=A.onDismiss}build(A){let Q=BA.of(A),{colors:$,app:B}=Q,E=W4.of(A),D=new Q0({color:$.secondary,bold:!0}),J=new Q0({color:B.keybind}),U=new Q0({color:B.command}),Y=new Q0({color:$.foreground}),Z=Math.max(40,Math.min(80,E.size.width-4)),X=[...this.commands.filter((V)=>{let K=V.noun?.toLowerCase();return K!=="dev"&&K!=="debug"&&V.status.type!=="hidden"})].sort((V,K)=>{let z=(V.noun??"").toLowerCase(),W=(K.noun??"").toLowerCase(),C=z.localeCompare(W);if(C!==0)return C;return V.verb.toLowerCase().localeCompare(K.verb.toLowerCase())}),I=(V)=>{let K=V.methods.map((z)=>t76(z)).join(", ");return[new J0({text:new g(K,J)}),new J0({text:new g(V.description,Y)})]},G=new RB({autofocus:!0,child:new zA({constraints:new Y4(Z,Z,0,Number.POSITIVE_INFINITY),child:new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:[new gA({padding:i0.horizontal(2),child:new J0({text:new g(`Editor Shortcuts
|
|
2993
2993
|
`,D)})}),new z80({items:qu4.filter((V)=>V.submitOnEnterOnly===void 0||V.submitOnEnterOnly===!0),renderRow:I}),new y0({height:1}),new gA({padding:i0.horizontal(2),child:new J0({text:new g(`Scrolling & Navigation
|
|
2994
2994
|
`,D)})}),new z80({items:uu4,renderRow:I}),new y0({height:1}),new gA({padding:i0.horizontal(2),child:new J0({text:new g(`Command Palette Commands
|
|
2995
2995
|
`,D)})}),new z80({items:X,renderRow:(V)=>{let K=V.noun?`${V.noun}: ${V.verb}`:V.verb;return[new J0({text:new g(K,U)}),new J0({text:new g(V.description,Y)})]}}),new y0({height:1})]})})});return new B1({header:"Amp CLI — Help & Keyboard Shortcuts",minWidth:Z,maxWidth:Z,maxHeight:E.size.height,autofocus:!1,footer:[{keys:["Esc"],label:"close"},{keys:["↑↓","j/k"],label:"scroll"}],onDismiss:this.onDismiss,child:G})}}class YT extends nQ{completionBuilder;constructor({completionBuilder:A,child:Q}){super({child:Q});this.completionBuilder=A}updateShouldNotify(A){return!1}static of(A){let Q=A.dependOnInheritedWidgetOfExactType(YT);if(!Q)throw Error("No CompletionBuilderProvider found in widget tree");return Q.completionBuilder}}var e76=250,A86=2000;class rg0 extends d0{configReloadEvents;toastController;child;constructor(A){super();this.configReloadEvents=A.configReloadEvents,this.toastController=A.toastController,this.child=A.child}createState(){return new wu4}}class wu4 extends m0{subscription=null;toastTimer=null;pendingToastType=null;lastToast=null;initState(){this.subscribeToConfigReloadEvents()}didUpdateWidget(A){if(A.configReloadEvents===this.widget.configReloadEvents)return;this.clearPendingToast(),this.subscribeToConfigReloadEvents()}dispose(){this.subscription?.unsubscribe(),this.subscription=null,this.clearPendingToast(),super.dispose()}build(A){return this.widget.child}subscribeToConfigReloadEvents(){this.subscription?.unsubscribe(),this.subscription=this.widget.configReloadEvents.subscribe((A)=>{this.scheduleToast(A)})}scheduleToast(A){if(this.pendingToastType=Q86(this.pendingToastType,A),this.toastTimer)clearTimeout(this.toastTimer);this.toastTimer=setTimeout(()=>{if(!this.mounted)return;this.flushToast()},e76),this.toastTimer.unref()}flushToast(){let A=this.pendingToastType;if(this.clearPendingToast(),!A)return;let Q=Date.now();if($86(this.lastToast,A,Q))return;this.lastToast={type:A,shownAt:Q},B86(this.widget.toastController,A)}clearPendingToast(){if(this.toastTimer)clearTimeout(this.toastTimer),this.toastTimer=null;this.pendingToastType=null}}function Q86(A,Q){return A==="failed"||Q.type==="failed"?"failed":"succeeded"}function $86(A,Q,$){return A?.type===Q&&$-A.shownAt<A86}function B86(A,Q){switch(Q){case"succeeded":A.show("Config reloaded","success",1500);break;case"failed":A.show("Config reload failed","error",5000);break}}class qQ extends nQ{context;constructor({context:A,child:Q}){super({child:Q});this.context=A}updateShouldNotify(A){return!1}static of(A){let Q=A.dependOnInheritedWidgetOfExactType(qQ);if(!Q)throw Error("No ContextProvider found in widget tree");return Q.context}}r0();h9();var C80=80,E86=15,D86=1,Mu4=-C80,J86=16,U86=Bb0(C80,C80);function Ou4({ampURL:A,threadID:Q,logPath:$}){return[`Debug thread ${xO(new URL(A),Q).toString()} (cli log: ${$}). Start with the CLI log, actor logs, and Rivet DB/inspector as sources of truth. Read thread-actors/docs/debugging-actors.md and thread-actors/scripts/README.md. For dev, actor logs are in .amp/in/thread-actors.json.log; for staging/prod, logs are in gcloud.`,"","Problem: "].join(`
|
|
@@ -3082,7 +3082,7 @@ Ctrl-X, Y, Z to unlock`;if(this.widget.centerContent)R=this.widget.centerContent
|
|
|
3082
3082
|
`));if(U.tools.length===0)J.push(new g(` └─ No tools available
|
|
3083
3083
|
`,E));else for(let F of U.tools)BZ6(J,F,$);J.push(new g(`
|
|
3084
3084
|
`))}return J}function BZ6(A,Q,$){let{colors:B,app:E}=$,D=EZ6(Q.status,$);if(A.push(new g(` ${D.icon} `,new Q0({color:D.color}))),A.push(new g(Q.name,new Q0({color:Q.status==="pending"?B.warning:E.command}))),Q.status==="pending")A.push(new g(" discovering...",new Q0({color:B.foreground,dim:!0})));else if(Q.description)A.push(new g(` ${Oj4(Q.description,50)}`,new Q0({color:B.foreground,dim:!0})));if(Q.error)A.push(new g(` ${Oj4(Q.error,40)}`,new Q0({color:E.toolError})));A.push(new g(`
|
|
3085
|
-
`))}function EZ6(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 Oj4(A,Q){let $=A.replace(/\s+/g," ").trim();if(cA($)<=Q)return $;let B="...",E=cA(B);if(Q<=E)return p7(B,Q);return`${p7($,Q-E,!0,"")}${B}`}var Lc0="https://ampcode.com/news/neo",jc0=[{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:Lc0,href:Lc0}]}];function DZ6(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:Lc0,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function JZ6(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var wT=50,yq=40,Mc0=1000,UZ6=420,YZ6=760,ZZ6=-250,FZ6=1100,w90=33,Pj4=0.999,XZ6=2.1,IZ6=720,GZ6=420,yj4="Meet the new",bj4="Amp",hj4="CLI",Rc0=B4(yj4).length,VZ6=B4(bj4).length,KZ6=B4(hj4).length,M90={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},Tj4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},vj4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},_j4=[M90,Tj4,vj4,M90,Tj4,vj4,M90],zZ6=M90;class Pc0 extends d0{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??JZ6(),this.introStages=this.variant==="npm-migration"?DZ6(this.binaryInstallCommand):jc0,this.dismissible=this.variant!=="npm-migration"}createState(){return new gj4}}class gj4 extends m0{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=Mc0;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 O5(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=uE(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=Pj4,this.firstStageHintVisible=this.animationProgress>=Pj4,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:Mc0,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=uE(A/YZ6);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},w90)}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=uE($/UZ6);if(this.setState(()=>{if(this.stageTransitionProgress=B,B>=1)this.previousIntroStage=null}),B>=1)this.stopStageTransitionTimer()},w90)}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 E=performance.now()-this.startedAt,D=uE(E/this.animationDurationMs),J=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*MT(D);if(this.setState(()=>{this.animationProgress=J}),D>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},w90)}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,Mc0+ZZ6),Q=A+FZ6;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?uE((A-this.firstStageTitleRevealStartedAt)/IZ6):this.firstStageTitleRevealProgress,$=this.firstStageHintRevealStartedAt?uE((A-this.firstStageHintRevealStartedAt)/GZ6):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=$}),Q>=1&&$>=1)this.stopFirstStageRevealTimer()},w90)}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=Sj4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:kj4(Sj4(this.previousIntroStage),A,MT(this.stageTransitionProgress));return this.dismissProgress>0?kj4(Q,zZ6,MT(this.dismissProgress)):Q}build(A){let Q=c4.of(A).colorScheme,$=BA.of(A),B=this.currentOrbPalette(),E=E7(1,"deep",B),D=W4.of(A).size,U=this.widget.animationProgress??this.animationProgress,Y=Math.max(D.width/wT,D.height/yq)*XZ6,Z=Y+(1-Y)*U,F=MT(this.dismissProgress),X=Math.max(wT,Math.round(wT*Z)),I=Math.max(yq,Math.round(yq*Z)),G=Math.round((D.width-X)/2),V=Math.round((D.height-I)/2),K=Math.max(0,Math.floor((D.width-wT)/2)),z=-Math.floor(yq/2),W=Math.round(G+(K-G)*U),C=Math.round(V+(z-V)*U),H=W+X/2,N=C+I/2,q=WZ6({dismissProgress:this.dismissProgress,easedDismissProgress:F,introOrbScale:Z,normalOrbCenterX:H,normalOrbCenterY:N,size:D}),w=Math.max(wT,Math.round(wT*q.orbScale)),L=Math.max(yq,Math.round(yq*q.orbScale)),R=q.orbCenterX,_=q.orbCenterY,T=Math.round(R-w/2),f=Math.round(_-L/2),d=Math.max(3,Math.min(D.height-5,Math.floor(yq/2)+2)),x=Math.max(d+3,D.height-3),v=q.textDissolveProgress,k=this.isFinalIntroStage()?q.backdropDissolveProgress:0,c=this.firstStageTitleVisible&&v<1,m=c&&this.firstStageHintVisible,b=m&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),p=this.introStage===0?this.firstStageTitleRevealProgress:1,n=this.introStage===0?this.firstStageHintRevealProgress:1,r=Math.max(24,Math.min(74,D.width-4)),X0=Math.min(12,Math.max(8,D.height-d-6)),E0=Math.max(0,Math.floor((D.width-r)/2)),I0=Math.max(0,Math.min(D.height-X0,Math.floor(D.height*0.55-X0/2))),P0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new xK({width:w,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new xK({width:w,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new W6({autofocus:!0,canRequestFocus:!0,debugLabel:"WelcomeTakeover",onKey:(B0)=>{if(B0.key==="Enter")return this.advanceIntroStage(),"handled";if(!this.widget.dismissible&&B0.key==="c"&&B0.ctrlKey)return this.widget.onQuit?.(),"handled";if(!this.widget.dismissible&&B0.key==="q")return this.widget.onQuit?.(),"handled";if((B0.key===" "||B0.key==="Space")&&!this.isFinalIntroStage())return this.advanceIntroStage(),"handled";if(B0.key==="Escape"||B0.key==="Esc"){if(!this.widget.dismissible)return this.widget.onQuit?.(),"handled";return this.dismissFromFinalIntroStage()?"handled":"ignored"}if(B0.key==="ArrowRight")return this.nextIntroStage(),"handled";if(B0.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new BQ({fit:"expand",children:[new mj4({color:Q.background,dissolveProgress:k}),new BQ({fit:"expand",children:[new aA({onClick:()=>{},child:y0.expand()}),new t1({left:T,top:f,width:w,height:L,child:P0}),...c?[new t1({left:E0,top:I0,width:r,height:X0,child:HZ6({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:r,height:X0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:E,link:$.app.link,keybind:$.app.keybind,titleRevealProgress:p,dissolveProgress:v,context:A})})]:[],...m?[...b?[new t1({left:E0,top:Math.max(0,x-1),width:r,height:1,child:new J0({text:OZ6({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:v}),textAlign:"center"})})]:[],new t1({left:E0,top:x,width:r,height:1,child:jZ6({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:$.app.keybind,revealProgress:n,dissolveProgress:v,context:A})})]:[]]})]})})}}class mj4 extends JB{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new dj4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class dj4 extends bA{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;oA(!!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),E=Math.floor($+this.offset.y),D=Math.floor(this.size.width),J=Math.floor(this.size.height),U={bg:this.color},Y=uE(this.dissolveProgress);if(Y<=0){A.fill(B,E,D,J," ",U);return}if(Y>=1)return;for(let Z=0;Z<J;Z++)for(let F=0;F<D;F++)if(!CZ6(F,Z,D,J,Y))A.fill(B+F,E+Z,1,1," ",U)}}function uE(A){return Math.min(1,Math.max(0,A))}function MT(A){return 1-(1-A)**3}function Sj4(A){return _j4[A]??_j4[0]}function kj4(A,Q,$){return{primary:Kq(A.primary,Q.primary,$),secondary:Kq(A.secondary,Q.secondary,$)}}function WZ6({dismissProgress:A,easedDismissProgress:Q,introOrbScale:$,normalOrbCenterX:B,normalOrbCenterY:E,size:D}){return{orbScale:$+($*0.86-$)*Q,orbCenterX:B+(D.width*0.54-B)*Q,orbCenterY:E-D.height*0.44*Q,textDissolveProgress:uE(A/0.52),backdropDissolveProgress:MT(uE((A-0.12)/0.88))}}function CZ6(A,Q,$,B,E){let D=B<=1?0:Q/(B-1),J=cj4(A+Q*Math.max(1,$));return(1-D)*0.72+J*0.28<E}function HZ6({introStages:A,stage:Q,previousStage:$,progress:B,direction:E,width:D,height:J,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V}){if($===null||B>=1)return Oc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V});let K=MT(B),z=E*Math.round((1-K)*D),W=-E*Math.round(K*D);return new Aq(new BQ({fit:"expand",children:[new t1({left:W,top:0,width:D,height:J,child:Oc0({introStages:A,stage:$,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:$===0?1:I,dissolveProgress:G,context:V})}),new t1({left:z,top:0,width:D,height:J,child:Oc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V})})]}))}function Oc0({introStages:A,stage:Q,foreground:$,mutedForeground:B,accent:E,link:D,keybind:J,titleRevealProgress:U,dissolveProgress:Y,context:Z}){let F=A[Q]??A[0]??jc0[0],X=new Q0({color:E,bold:!0}),I=new Q0({color:$}),G=A===jc0&&Q===0,V=[...F.title===null?[]:[new J0({text:G?O90(uZ6({progress:U,foreground:E,pulseColor:E}),Y):new g(t7(F.title,Y),X),textAlign:"center"})],...F.body.length>0?[NZ6()]:[],...F.body.map((K)=>qZ6(K,I,B,D,J,Y,Z))];return new Q6({child:new gA({padding:i0.horizontal(1),child:new IA({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:V})})})}function NZ6(){return y0.height(1)}function qZ6(A,Q,$,B,E,D,J){if(typeof A==="string")return new J0({text:new g(t7(A,D),Q),textAlign:"center"});if("codeBlock"in A)return new q5({onCopy:(U,Y)=>{if(Y)JQ.success(J,"Copied to clipboard",2000)},child:new IA({mainAxisSize:"min",children:A.codeBlock.map((U)=>new J0({text:new g(t7(U,D),new Q0({color:E})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let U=new J0({text:new g("",void 0,[new g(t7(A.text,D),new Q0({color:$,dim:!0})),new g(t7(A.keybind,D,B4(A.text).length),new Q0({color:E}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new Q6({child:new q5({child:U})});return U}if("highlightText"in A){let U=w$.createSpan(A.href,A.linkText,new Q0({color:B,underline:!0})),Y=fX.of(J),Z=new g("",void 0,[new g(A.text,Q),new g(A.highlightText,new Q0({color:E})),new g(A.textAfterHighlight,Q),new g(U.text,U.style,U.children,U.hyperlink,()=>{p6(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new g(A.textAfter,Q)]);return new J0({text:O90(Z,D),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new IA({mainAxisSize:"min",children:[new J0({text:new g(t7(A.text,D),Q),textAlign:"center"}),new Q6({child:new OA({mainAxisSize:"min",children:[w$.createWidget(J,A.href,t7(A.linkText,D),new Q0({color:B,underline:!0})),new J0({text:new g(t7(A.textAfter,D),Q)})]})})]});let U=w$.createSpan(A.href,A.linkText,new Q0({color:B,underline:!0})),Y=fX.of(J),Z=new g("",void 0,[new g(A.text,Q),new g(U.text,U.style,U.children,U.hyperlink,()=>{p6(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new g(A.textAfter,Q)]);return new J0({text:O90(Z,D),textAlign:"center"})}if(D>0)return new J0({text:new g(t7(A.text,D),new Q0({color:B,underline:!0})),textAlign:"center"});return new Q6({child:w$.createWidget(J,A.href,A.text,new Q0({color:B,underline:!0}))})}function uZ6({progress:A,foreground:Q,pulseColor:$}){let B=new Q0({color:Q,bold:!0}),E=new Q0({color:MZ6({progress:A,foreground:Q,pulseColor:$}),bold:!0});return new g("",void 0,[new g(wZ6(A).padEnd(Rc0," "),B),new g(" ",B),new g(fj4(bj4,VZ6,A,0.72),B),new g(" ",B),new g(fj4(hj4,KZ6,A,0.88),E)])}function wZ6(A){let Q=B4(yj4),$=Math.min(Rc0,Math.ceil(uE(A/0.62)*Rc0));return Q.slice(0,$).join("")}function fj4(A,Q,$,B){return $>=B?A:"".padEnd(Q," ")}function MZ6({progress:A,foreground:Q,pulseColor:$}){if(A<0.88||A>=1)return Q;let B=uE((A-0.88)/0.12);return Math.cos(B*Math.PI*4)*(1-B)>0.12?$:Q}function OZ6({stage:A,featureStageCount:Q,foreground:$,dissolveProgress:B}){return new g(t7(`${A}/${Q}`,B),new Q0({color:$,dim:!0}))}function LZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}){let J=new Q0({color:B}),U=new Q0({color:$,dim:!0}),Y=Q?A?"Enter":"Space":"Esc",Z=Q?A?" to get started":" to continue":" to quit",F="",X="",I=`${Z}`;if(!Q)return new g("",void 0,[new g(Y,J),new g(Z,U),new g("",J),new g("",U)]);let G=xj4(Y,E),V=xj4(I,uE((E*(B4(Y).length+B4(I).length)-B4(Y).length)/B4(I).length));return new g("",void 0,[new g(t7(G,D),J),new g(t7(V.slice(0,Z.length),D),U),new g(t7(V.slice(Z.length,Z.length+0),D),J),new g(t7(V.slice(Z.length+0),D),U)])}function jZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D,context:J}){if(Q)return new J0({text:LZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}),textAlign:"center"});let U=new Q0({color:B}),Y=new Q0({color:$,dim:!0});return new q5({onCopy:(Z,F)=>{if(F)JQ.success(J,"Copied to clipboard",2000)},child:new J0({text:new g("",void 0,[new g("q",U),new g(" to quit",Y)]),textAlign:"center",selectable:!0})})}function xj4(A,Q){let $=B4(A),B=Math.min($.length,Math.ceil(uE(Q)*$.length));return $.slice(0,B).join("").padEnd($.length," ")}function O90(A,Q,$=0){if(Q<=0)return A;let B=$+B4(A.text??"").length,E=A.children?.map((D)=>{let J=O90(D,Q,B);return B+=B4(D.toPlainText()).length,J});return new g(A.text?t7(A.text,Q,$):A.text,A.style,E,A.hyperlink,A.onClick)}function t7(A,Q,$=0){if(Q<=0)return A;return B4(A).map((E,D)=>{if(E.trim()==="")return E;return cj4($+D)<Q?" ":E}).join("")}function cj4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}function RZ6(A){let $=A.observer.protocolMessages().filter((B)=>B.role==="assistant").at(-1);if(!$)return null;return $.content.filter((B)=>B.type==="text").map((B)=>B.text).join("")}function PZ6(A,Q={}){return new Promise(($,B)=>{if(Q.signal?.aborted){A.client.cancelAgentLoop(),B(Error("Agent run cancelled"));return}let E=!1,D=null,J=setTimeout(()=>{D?.(),Y.unsubscribe(),B(Error("Timed out waiting for agent response"))},Q.timeoutMs??600000),U=()=>{clearTimeout(J),Y.unsubscribe(),A.client.cancelAgentLoop(),B(Error("Agent run cancelled"))};if(Q.signal!==void 0)Q.signal.addEventListener("abort",U,{once:!0}),D=()=>Q.signal?.removeEventListener("abort",U);let Y=A.observer.agentState().subscribe((Z)=>{if(h3(Z)){E=!0;return}if(!E)return;let F=RZ6(A);if(F===null)return;clearTimeout(J),D?.(),Y.unsubscribe(),$(F)})})}class Tc0 extends d0{listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;updateService;initialThreadIDs;showWelcome;welcomeVariant;onWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;onRelaunchRequested;onFirstFrame;initialUserInput;getDefaultNewThreadVisibility;observeThreadSummaries;openThreadPickerOnStart;workspaceSettingsFilePath;context;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.showWelcome=A.showWelcome??!1,this.welcomeVariant=A.welcomeVariant??"intro",this.onWelcomeDismissed=A.onWelcomeDismissed,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.observeThreadSummaries=A.observeThreadSummaries,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.context=A.context}createState(){return new lj4}}class lj4 extends m0{editorController=new sY;commandPalette=new ty0(this);commandRegistry=new ng0;toastController=new Qb0;relaunchNotificationController=new bg0;exitHintTimer=new Ip(this,1000);ideStatus=new c3(this,{});threadNavigationHistory=new mg0;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;activePluginMessageSubscription=null;activePluginUIRequestsSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;welcomeVisible=!1;endCreditsVisible=!1;invadersHighScore=0;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;emptyThreadTerminalTitleController=new Pl;pluginIntegration=null;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;editorFocusNode=new i7({debugLabel:"EditorPanel"});loadThreads=async()=>{return this.widget.context.listThreads()};focusEditor=()=>{this.editorFocusNode.requestFocus()};focusEditorAfterNextFrame(){z6.instance.addPostFrameCallback(()=>{if(!this.mounted)return;this.focusEditor()},"Neo focus editor")}analyzeContextForThread=async(A,Q)=>{return kK4({ampURL:this.widget.context.ampURL,configService:this.widget.configService,threadID:A,signal:Q})};onSwitchThread=(A)=>{return this.connectToExistingThread(A,{recordNavigation:!0,rethrowError:!0})};onSelectSidebarThread=async(A)=>{this.focusEditor(),await this.onSwitchThread(A)};threadListSidebar=new uc0({state:this,isBlocked:()=>this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal(),getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,getWorkspaceRoot:()=>this.widget.context.workspaceRoot,loadThreads:this.loadThreads,observeThreadSummaries:()=>this.widget.observeThreadSummaries(),onSelectThread:this.onSelectSidebarThread,focusMainContent:this.focusEditor,getInitialVisible:()=>this.widget.context.threadListSidebarVisible});sendFeedbackReport=async(A)=>V80({configService:this.widget.configService,settingsFilePath:this.widget.context.settingsFilePath},A);archiveThread=async(A)=>{let Q=await s50({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let $=await bH4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};removeThreadLabel=async(A,Q)=>{let $=await hH4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};initState(){if(HX.getInstance().interceptConsole(),this.invadersHighScore=this.widget.context.invadersHighScore??0,this.notices=new qg0(this.widget.configService,($)=>this.setState($)),z6.instance.addPostFrameCallback(()=>{setTimeout(()=>this.widget.onFirstFrame?.(),0),this.noticesPollingTimeout=setTimeout(()=>{this.noticesPollingTimeout=null,this.notices.startPolling()},500)},"Neo notices polling"),this.widget.showWelcome)this.welcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:$,error:B})=>{if(S.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(re($.settings)))}),this.updateRelaunchIntegration=new dg0({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.context.sessionAgentMode);this.pluginIntegration=new xg0({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,context:this.widget.context,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread,readThreadMessages:this.readPluginThreadMessages,runAgent:this.runPluginAgent,onBlockingConfirmDialogChange:this.syncEmptyThreadPluginConfirmationTitle}),this.pluginIntegration.init(),this.mcpTrustIntegration=new Ch0({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=I1.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.context.pluginService?Du4({pluginService:this.widget.context.pluginService,workspaceRoot:this.widget.context.workspaceRoot,logFilePath:this.widget.context.logFilePath,toastController:this.toastController}):[],B=[Gu4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["resume"],status:{type:"enabled"},sortBoost:100,run:(E,D,J)=>{E.pushWithDismiss((U)=>Nd0({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,loadThreadTail:this.widget.context.loadThreadTail,onSelectThread:this.onSwitchThread,onDismiss:U,onThreadSelected:J}))}},...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:(E,D,J)=>{A.navigateBack(),J()}},UM4({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:(E,D,J)=>{A.navigateForward(),J()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",status:{type:"enabled"},run:(E,D,J)=>{E.push(new Rm0({mcpServers:this.widget.context.mcpServers,onDismiss:J}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",status:{type:"enabled"},run:(E)=>{E.pushWithDismiss((D)=>new wc0({toolboxes:this.widget.context.toolboxes,onDismiss:D}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","blog","announcements"],status:{type:"enabled"},run:async(E,D,J)=>{try{await p6(D,"https://ampcode.com/chronicle")}finally{J()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config"],status:{type:"enabled"},run:()=>{NK(this.widget.context.settingsFilePath).catch((E)=>{S.error("Failed to open settings file in editor",{error:E})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains"],status:{type:"enabled"},run:(E,D,J)=>{E.pushWithDismiss((U)=>new jm0({onCancel:U,onSelect:(Y)=>{this.handleIdeSelection(Y),J()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["manual","?"],status:{type:"enabled"},run:(E,D,J)=>{E.push(new ag0({commands:iB.of(D).commands,onDismiss:J}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",status:{type:"enabled"},run:(E,D,J)=>{J(),A.showWelcome()}},{noun:"amp",verb:"end credits",description:"Roll the full-screen Amp credits",status:{type:"enabled"},run:(E,D,J)=>{J(),A.showEndCredits()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["v"],status:{type:"enabled"},run:(E,D,J)=>{E.push(new B1({header:"Amp Version",maxWidth:72,onDismiss:J,child:new J0({text:new g(M50({version:"0.0.1780601115-gdd09a6",buildTimestamp:"2026-06-04T19:30:25.713Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","bye"],shortcut:CA.ctrl("c"),status:{type:"enabled"},run:(E,D)=>{q4.maybeInvoke(D,new PK)}},...Q,...yH4(this.widget.context.logFilePath)].map((E)=>this.commandRegistry.register(E));return()=>{for(let E of B)E()}}build(A){let Q=this.buildHints(),$=this.ideStatus.getValue(),B=this.notices.current,E=new zc0({initialAgentMode:this.widget.context.sessionAgentMode,initialPluginAgentModeKey:this.widget.context.initialPluginAgentModeKey,analyzeContextForThread:this.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,editorFocusNode:this.editorFocusNode,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.welcomeVisible?null:B,onDismissNotice:(I)=>this.notices.dismiss(I)}),D=W4.of(A),J=D.capabilities.animationSupport!=="disabled",U=this.threadListSidebar.visibleWidth(),Y=Math.max(0,D.size.width-U),F=[new zA({constraints:Y4.tight(D.size.width,D.size.height),child:this.threadListSidebar.buildBody(E)})];if(this.commandPalette.isEnabled())F.push(new W6({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new og0({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.welcomeVisible)F.push(Nd0({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,loadThreadTail:this.widget.context.loadThreadTail,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.welcomeVisible)F.push(new W6({debugLabel:"WelcomeDialogOverlay",child:new Pc0({onDismiss:this.dismissWelcome,onQuit:()=>I1.instance.stop(),animationsEnabled:J,variant:this.widget.welcomeVariant})}));let X=this.executorAlreadyConnectedDialog;if(X)F.push(new W6({debugLabel:"ExecutorAlreadyConnectedDialogOverlay",child:new Om0({existingExecutorPid:X.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(F.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),F.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.context.isInternalUser)F.push(new sg0({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:L90.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,observerSnapshot$:this.activeThreadContext?.observer.observerSnapshot()??null}));if(this.focusDebugVisible)F.push(new Lm0);if(this.endCreditsVisible)F.push(new Hm0({onComplete:this.completeEndCredits,highScore:this.invadersHighScore,onHighScoreChange:this.updateInvadersHighScore}));return new qQ({context:this.widget.context,child:new iB({commandRegistry:this.commandRegistry,child:new YT({completionBuilder:this.widget.completionBuilder,child:new JQ({controller:this.toastController,child:new q4({actions:this.buildActions(),child:new iQ({debugLabel:"AppShortcuts",shortcuts:this.buildShortcuts(),child:new TQ({debugLabel:"AppShellFocus",canRequestFocus:!1,skipTraversal:!0,child:new $b0({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...B&&this.activeThreadContext&&!this.welcomeVisible?[this.notices]:[]],child:new rg0({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new fp({left:U,width:Y,child:new BQ({children:F})})})})})})})})})})})}buildShortcuts(){let A=new Map([[CA.ctrl("c"),new K70],[CA.ctrl("o"),new W70],[CA.alt("i"),new H70],[CA.alt("p"),new oc],[CA.ctrl("."),new u70],[CA.ctrl("t"),new O70],...this.threadListSidebar.shortcutEntries()]);if(L90.env.NODE_ENV==="development"&&L90.platform==="darwin")A.set(CA.meta("r"),new z70);return A}buildActions(){let A=new pA(()=>{if(_2.hasAnyCopyableSelection())return _2.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new pA(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),$=new pA(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),B=new pA(()=>{return this.startNewDraftThread(),"handled"}),E=new pA(()=>{return I1.instance.stop(),"handled"}),D=new pA(()=>{return Hl({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),J=new pA((I)=>{if(!I.text)return"ignored";return I1.instance.tuiInstance.clipboard.writeText(I.text).then((G)=>{if(G.ok)this.toastController.show(I.successMessage,"success",2000);else this.toastController.show(`${I.failureMessage}: ${G.userFacingErrorMessage}`,"error",4000)}).catch((G)=>{S.error("Failed to copy Neo text to clipboard",{error:G}),this.toastController.show(I.failureMessage,"error",2000)}),"handled"}),U=new pA(()=>{return I1.instance.toggleFrameStatsOverlay(),"handled"}),Y=new pA(()=>this.notices.dismissCurrent()?"handled":"ignored"),Z=new pA(()=>{if(!this.widget.context.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),F=Lu4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,context:this.widget.context,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),X=new pA(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[K70,A],[zq,B],[PK,E],[z70,D],[UB,J],[ip,$],[W70,Q],[H70,Z],...this.threadListSidebar.actionEntries(),[u70,Y],...F,[oc,U],[O70,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;this.focusEditorAfterNextFrame()}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 PP(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){S.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.context.sessionAgentMode,$=A,B=iN(Q),E=t30(this.widget.context,Q);if(B!==void 0&&E!==void 0)$={...$,[B]:E};return r30($,{agentMode:Q,explicitEffort:this.widget.context.explicitReasoningEffort,sessionState:this.widget.context})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=pj4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(cU(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=pj4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(RK);if(this.exitHintTimer.isActive())A.add(rP);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),I1.instance.stop();else this.exitHintTimer.activate()};dismissWelcome=()=>{if(!this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!1}),this.widget.onWelcomeDismissed?.()};updateInvadersHighScore=(A)=>{if(A<=this.invadersHighScore)return;this.setState(()=>{this.invadersHighScore=A}),oD((Q)=>({...Q,neoInvadersHighScore:Math.max(Q.neoInvadersHighScore,A)})).catch((Q)=>{S.warn("Failed to save Neo Invaders high score",{error:Q instanceof Error?Q.message:String(Q)})})};showWelcome=()=>{if(this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!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")I1.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}),this.focusEditorAfterNextFrame()};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,$=null,B,E,D)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),U=A.find(ce);if(U)this.widget.history.add(U.text,L90.cwd()),this.widget.history.reset();let Y=$?void 0:await this.widget.getDefaultNewThreadVisibility?.(),Z=$??Y??null,F=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,Z??void 0,E,D);if(this.sendUserMessage(F,A,E?void 0:Q,E?void 0:B),!E)this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings);this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(F)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.context.sessionAgentMode=A;let $=Q["reasoning.effort"];if($!==void 0)this.widget.context.lastReasoningEffortByMode={...this.widget.context.lastReasoningEffortByMode??{},[A]:$};let B=iN(A),E=B?Q[B]:void 0;if(E!==void 0)this.widget.context.lastSpeedByMode={...this.widget.context.lastSpeedByMode??{},[A]:E};oD((D)=>{let J={...D,agentMode:A};if($!==void 0)J={...J,lastReasoningEffortByMode:{...J.lastReasoningEffortByMode??{},[A]:$}};if(E!==void 0)J={...J,lastSpeedByMode:{...J.lastSpeedByMode??{},[A]:E}};return J}).catch((D)=>{S.warn("Failed to persist Neo session defaults for new message",{error:D instanceof Error?D.message:String(D)})})}sendUserMessage(A,Q,$,B,E){let D=w50(this.ideStatus.getValue());if(B===void 0){A.client.sendUserMessage(Q,$,{steer:E?.steer,userState:D}).catch((J)=>{S.warn("Failed to send user message",{error:J})});return}A.client.sendUserMessage(Q,$,{reasoningEffort:B,steer:E?.steer,userState:D}).catch((J)=>{S.warn("Failed to send user message",{error:J})})}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 B=this.activeThreadContext;if(!B){if(Q){for(let D of A)await this.widget.clientPool.appendUserMessageToThread(Q,D.content,$);return}throw Error("appendToThread is not available - no active thread")}let E=B.client.getThreadId();if(Q&&E!==Q){for(let D of A)await this.widget.clientPool.appendUserMessageToThread(Q,D.content,$);return}for(let D of A)this.sendUserMessage(B,[{type:"text",text:D.content}],void 0,void 0,$)};readPluginThreadMessages=async(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("thread.messages is not available - no active thread");let B=$.client.getThreadId();if(Q&&B!==Q)throw Error("thread.messages is only available for the active thread");return MoA(OoA($.observer.protocolMessages()),A)};runPluginAgent=async(A,Q,$)=>{await this.ensureDraftThreadSettingsInitialized();let B=this.widget.clientPool.createNewThread(this.widget.context.sessionAgentMode,this.draftThreadSettings,void 0,A,Q.agentModeDisplay,Q.parentThreadID,{trackAsLastActive:!1});this.sendUserMessage(B,[{type:"text",text:Q.message}]);try{let E=await PZ6(B,{timeoutMs:Q.timeoutMs,signal:$}),D=B.client.getThreadId();return D?{threadID:D,text:E}:{text:E}}finally{this.widget.clientPool.disconnect(B)}};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.context.observerOnly,onExecutorAlreadyConnected:(E)=>this.promptExecutorAlreadyConnected(E)});if(this.setActiveClient(B),Q.recordNavigation&&$!==A)this.threadNavigationHistory.recordNavigation($);if(Q.initialUserInput)this.sendUserMessage(B,[{type:"text",text:Q.initialUserInput}])}catch(B){if(S.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.context.observerOnly,onExecutorAlreadyConnected:async()=>"observe"})}catch(Q){S.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,agentModeDisplay:$}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q,agentModeDisplay:$}}),this.syncEmptyThreadPluginConfirmationTitle(),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)}),this.activePluginMessageSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription?.unsubscribe(),this.pluginIntegration?.cancelOwnerUIRequests(),this.activePluginMessageSubscription=Q.pluginMessages().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage(B,(E)=>{A.sendPluginMessage(E)})}),this.activePluginUIRequestsSubscription=Q.pluginUIRequests().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage({type:"plugin_message",message:{type:"event",event:"plugin.ui.snapshot",data:{requests:[...B]}}},(E)=>{A.sendPluginMessage(E)})})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){S.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.threadListSidebar.dispose(),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(),this.editorFocusNode.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.welcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||this.endCreditsVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function pj4(A,Q,$){let B={...A};for(let E of TZ6(Q,$)){if(!cU(A[E],Q[E]))continue;let D=$[E];if(D===void 0)delete B[E];else B[E]=D}return B}function TZ6(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}$3();function ij4(A,Q,$,B){let E=RyA(A),D="\x1B[0m",J="\x1B[34m",U="\x1B[90m",Y="\x1B[2m",Z=[];if(A.archived)Z.push("\x1B[90m\x1B[2mArchived\x1B[0m");Z.push(`${E}`),Z.push(`\x1B[34m${Q}\x1B[0m`),Z.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let F=14,X=7,I=new T2(F,X),G=new O5(42),V=new ZT(F,X,F,X,F,X,0,A.agentMode??"smart","intensity","ascii",void 0,void 0,g0.default(),G);V.layout(Y4.tight(F,X)),V.paint(I,0,0);let K=I.getBuffer().getCells(),z=0;for(let R=0;R<X;R++)if(K[R].some((_)=>_.char!==" ")){z=R;break}let W=X-1;for(let R=X-1;R>=0;R--)if(K[R].some((_)=>_.char!==" ")){W=R;break}function C(R,_){if(!R)return"";if(R.type==="rgb"){let{r:T,g:f,b:d}=R.value;if($.getColorDepth()>=24)return`\x1B[${_?38:48};2;${T};${f};${d}m`;let x=$p(T,f,d);return`\x1B[${_?38:48};5;${x}m`}return""}let H=[];if(W>=z)for(let R=z;R<=W;R++){let _="";for(let T=0;T<F;T++){let f=K[R][T],d=f.char,x=C(f.style.fg,!0);_+=x+d+"\x1B[0m"}H.push(_)}let N=H.length,q=Math.max(N,Z.length),w=Math.floor((q-N)/2),L=Math.floor((q-Z.length)/2);for(let R=0;R<q;R++){let _=" ".repeat(F);if(R>=w&&R<w+N)_=H[R-w];let T=" ",f="";if(R>=L&&R<L+Z.length)f=Z[R-L];$.write(_+T+f+`
|
|
3085
|
+
`))}function EZ6(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 Oj4(A,Q){let $=A.replace(/\s+/g," ").trim();if(cA($)<=Q)return $;let B="...",E=cA(B);if(Q<=E)return p7(B,Q);return`${p7($,Q-E,!0,"")}${B}`}var Lc0="https://ampcode.com/news/neo",jc0=[{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:Lc0,href:Lc0}]}];function DZ6(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:Lc0,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function JZ6(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var wT=50,yq=40,Mc0=1000,UZ6=420,YZ6=760,ZZ6=-250,FZ6=1100,w90=33,Pj4=0.999,XZ6=2.1,IZ6=720,GZ6=420,yj4="Meet the new",bj4="Amp",hj4="CLI",Rc0=B4(yj4).length,VZ6=B4(bj4).length,KZ6=B4(hj4).length,M90={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},Tj4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},vj4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},_j4=[M90,Tj4,vj4,M90,Tj4,vj4,M90],zZ6=M90;class Pc0 extends d0{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??JZ6(),this.introStages=this.variant==="npm-migration"?DZ6(this.binaryInstallCommand):jc0,this.dismissible=this.variant!=="npm-migration"}createState(){return new gj4}}class gj4 extends m0{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=Mc0;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 O5(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=uE(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=Pj4,this.firstStageHintVisible=this.animationProgress>=Pj4,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:Mc0,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=uE(A/YZ6);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},w90)}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=uE($/UZ6);if(this.setState(()=>{if(this.stageTransitionProgress=B,B>=1)this.previousIntroStage=null}),B>=1)this.stopStageTransitionTimer()},w90)}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 E=performance.now()-this.startedAt,D=uE(E/this.animationDurationMs),J=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*MT(D);if(this.setState(()=>{this.animationProgress=J}),D>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},w90)}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,Mc0+ZZ6),Q=A+FZ6;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?uE((A-this.firstStageTitleRevealStartedAt)/IZ6):this.firstStageTitleRevealProgress,$=this.firstStageHintRevealStartedAt?uE((A-this.firstStageHintRevealStartedAt)/GZ6):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=$}),Q>=1&&$>=1)this.stopFirstStageRevealTimer()},w90)}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=Sj4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:kj4(Sj4(this.previousIntroStage),A,MT(this.stageTransitionProgress));return this.dismissProgress>0?kj4(Q,zZ6,MT(this.dismissProgress)):Q}build(A){let Q=c4.of(A).colorScheme,$=BA.of(A),B=this.currentOrbPalette(),E=E7(1,"deep",B),D=W4.of(A).size,U=this.widget.animationProgress??this.animationProgress,Y=Math.max(D.width/wT,D.height/yq)*XZ6,Z=Y+(1-Y)*U,F=MT(this.dismissProgress),X=Math.max(wT,Math.round(wT*Z)),I=Math.max(yq,Math.round(yq*Z)),G=Math.round((D.width-X)/2),V=Math.round((D.height-I)/2),K=Math.max(0,Math.floor((D.width-wT)/2)),z=-Math.floor(yq/2),W=Math.round(G+(K-G)*U),C=Math.round(V+(z-V)*U),H=W+X/2,N=C+I/2,q=WZ6({dismissProgress:this.dismissProgress,easedDismissProgress:F,introOrbScale:Z,normalOrbCenterX:H,normalOrbCenterY:N,size:D}),w=Math.max(wT,Math.round(wT*q.orbScale)),L=Math.max(yq,Math.round(yq*q.orbScale)),R=q.orbCenterX,_=q.orbCenterY,T=Math.round(R-w/2),f=Math.round(_-L/2),d=Math.max(3,Math.min(D.height-5,Math.floor(yq/2)+2)),x=Math.max(d+3,D.height-3),v=q.textDissolveProgress,k=this.isFinalIntroStage()?q.backdropDissolveProgress:0,c=this.firstStageTitleVisible&&v<1,m=c&&this.firstStageHintVisible,b=m&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),p=this.introStage===0?this.firstStageTitleRevealProgress:1,n=this.introStage===0?this.firstStageHintRevealProgress:1,r=Math.max(24,Math.min(74,D.width-4)),X0=Math.min(12,Math.max(8,D.height-d-6)),E0=Math.max(0,Math.floor((D.width-r)/2)),I0=Math.max(0,Math.min(D.height-X0,Math.floor(D.height*0.55-X0/2))),P0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new xK({width:w,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new xK({width:w,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new W6({autofocus:!0,canRequestFocus:!0,debugLabel:"WelcomeTakeover",onKey:(B0)=>{if(B0.key==="Enter")return this.advanceIntroStage(),"handled";if(!this.widget.dismissible&&B0.key==="c"&&B0.ctrlKey)return this.widget.onQuit?.(),"handled";if(!this.widget.dismissible&&B0.key==="q")return this.widget.onQuit?.(),"handled";if((B0.key===" "||B0.key==="Space")&&!this.isFinalIntroStage())return this.advanceIntroStage(),"handled";if(B0.key==="Escape"||B0.key==="Esc"){if(!this.widget.dismissible)return this.widget.onQuit?.(),"handled";return this.dismissFromFinalIntroStage()?"handled":"ignored"}if(B0.key==="ArrowRight")return this.nextIntroStage(),"handled";if(B0.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new BQ({fit:"expand",children:[new mj4({color:Q.background,dissolveProgress:k}),new BQ({fit:"expand",children:[new aA({onClick:()=>{},child:y0.expand()}),new t1({left:T,top:f,width:w,height:L,child:P0}),...c?[new t1({left:E0,top:I0,width:r,height:X0,child:HZ6({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:r,height:X0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:E,link:$.app.link,keybind:$.app.keybind,titleRevealProgress:p,dissolveProgress:v,context:A})})]:[],...m?[...b?[new t1({left:E0,top:Math.max(0,x-1),width:r,height:1,child:new J0({text:OZ6({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:v}),textAlign:"center"})})]:[],new t1({left:E0,top:x,width:r,height:1,child:jZ6({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:$.app.keybind,revealProgress:n,dissolveProgress:v,context:A})})]:[]]})]})})}}class mj4 extends JB{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new dj4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class dj4 extends bA{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;oA(!!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),E=Math.floor($+this.offset.y),D=Math.floor(this.size.width),J=Math.floor(this.size.height),U={bg:this.color},Y=uE(this.dissolveProgress);if(Y<=0){A.fill(B,E,D,J," ",U);return}if(Y>=1)return;for(let Z=0;Z<J;Z++)for(let F=0;F<D;F++)if(!CZ6(F,Z,D,J,Y))A.fill(B+F,E+Z,1,1," ",U)}}function uE(A){return Math.min(1,Math.max(0,A))}function MT(A){return 1-(1-A)**3}function Sj4(A){return _j4[A]??_j4[0]}function kj4(A,Q,$){return{primary:Kq(A.primary,Q.primary,$),secondary:Kq(A.secondary,Q.secondary,$)}}function WZ6({dismissProgress:A,easedDismissProgress:Q,introOrbScale:$,normalOrbCenterX:B,normalOrbCenterY:E,size:D}){return{orbScale:$+($*0.86-$)*Q,orbCenterX:B+(D.width*0.54-B)*Q,orbCenterY:E-D.height*0.44*Q,textDissolveProgress:uE(A/0.52),backdropDissolveProgress:MT(uE((A-0.12)/0.88))}}function CZ6(A,Q,$,B,E){let D=B<=1?0:Q/(B-1),J=cj4(A+Q*Math.max(1,$));return(1-D)*0.72+J*0.28<E}function HZ6({introStages:A,stage:Q,previousStage:$,progress:B,direction:E,width:D,height:J,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V}){if($===null||B>=1)return Oc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V});let K=MT(B),z=E*Math.round((1-K)*D),W=-E*Math.round(K*D);return new Aq(new BQ({fit:"expand",children:[new t1({left:W,top:0,width:D,height:J,child:Oc0({introStages:A,stage:$,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:$===0?1:I,dissolveProgress:G,context:V})}),new t1({left:z,top:0,width:D,height:J,child:Oc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V})})]}))}function Oc0({introStages:A,stage:Q,foreground:$,mutedForeground:B,accent:E,link:D,keybind:J,titleRevealProgress:U,dissolveProgress:Y,context:Z}){let F=A[Q]??A[0]??jc0[0],X=new Q0({color:E,bold:!0}),I=new Q0({color:$}),G=A===jc0&&Q===0,V=[...F.title===null?[]:[new J0({text:G?O90(uZ6({progress:U,foreground:E,pulseColor:E}),Y):new g(t7(F.title,Y),X),textAlign:"center"})],...F.body.length>0?[NZ6()]:[],...F.body.map((K)=>qZ6(K,I,B,D,J,Y,Z))];return new Q6({child:new gA({padding:i0.horizontal(1),child:new IA({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:V})})})}function NZ6(){return y0.height(1)}function qZ6(A,Q,$,B,E,D,J){if(typeof A==="string")return new J0({text:new g(t7(A,D),Q),textAlign:"center"});if("codeBlock"in A)return new q5({onCopy:(U,Y)=>{if(Y)JQ.success(J,"Copied to clipboard",2000)},child:new IA({mainAxisSize:"min",children:A.codeBlock.map((U)=>new J0({text:new g(t7(U,D),new Q0({color:E})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let U=new J0({text:new g("",void 0,[new g(t7(A.text,D),new Q0({color:$,dim:!0})),new g(t7(A.keybind,D,B4(A.text).length),new Q0({color:E}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new Q6({child:new q5({child:U})});return U}if("highlightText"in A){let U=w$.createSpan(A.href,A.linkText,new Q0({color:B,underline:!0})),Y=fX.of(J),Z=new g("",void 0,[new g(A.text,Q),new g(A.highlightText,new Q0({color:E})),new g(A.textAfterHighlight,Q),new g(U.text,U.style,U.children,U.hyperlink,()=>{p6(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new g(A.textAfter,Q)]);return new J0({text:O90(Z,D),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new IA({mainAxisSize:"min",children:[new J0({text:new g(t7(A.text,D),Q),textAlign:"center"}),new Q6({child:new OA({mainAxisSize:"min",children:[w$.createWidget(J,A.href,t7(A.linkText,D),new Q0({color:B,underline:!0})),new J0({text:new g(t7(A.textAfter,D),Q)})]})})]});let U=w$.createSpan(A.href,A.linkText,new Q0({color:B,underline:!0})),Y=fX.of(J),Z=new g("",void 0,[new g(A.text,Q),new g(U.text,U.style,U.children,U.hyperlink,()=>{p6(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new g(A.textAfter,Q)]);return new J0({text:O90(Z,D),textAlign:"center"})}if(D>0)return new J0({text:new g(t7(A.text,D),new Q0({color:B,underline:!0})),textAlign:"center"});return new Q6({child:w$.createWidget(J,A.href,A.text,new Q0({color:B,underline:!0}))})}function uZ6({progress:A,foreground:Q,pulseColor:$}){let B=new Q0({color:Q,bold:!0}),E=new Q0({color:MZ6({progress:A,foreground:Q,pulseColor:$}),bold:!0});return new g("",void 0,[new g(wZ6(A).padEnd(Rc0," "),B),new g(" ",B),new g(fj4(bj4,VZ6,A,0.72),B),new g(" ",B),new g(fj4(hj4,KZ6,A,0.88),E)])}function wZ6(A){let Q=B4(yj4),$=Math.min(Rc0,Math.ceil(uE(A/0.62)*Rc0));return Q.slice(0,$).join("")}function fj4(A,Q,$,B){return $>=B?A:"".padEnd(Q," ")}function MZ6({progress:A,foreground:Q,pulseColor:$}){if(A<0.88||A>=1)return Q;let B=uE((A-0.88)/0.12);return Math.cos(B*Math.PI*4)*(1-B)>0.12?$:Q}function OZ6({stage:A,featureStageCount:Q,foreground:$,dissolveProgress:B}){return new g(t7(`${A}/${Q}`,B),new Q0({color:$,dim:!0}))}function LZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}){let J=new Q0({color:B}),U=new Q0({color:$,dim:!0}),Y=Q?A?"Enter":"Space":"Esc",Z=Q?A?" to get started":" to continue":" to quit",F="",X="",I=`${Z}`;if(!Q)return new g("",void 0,[new g(Y,J),new g(Z,U),new g("",J),new g("",U)]);let G=xj4(Y,E),V=xj4(I,uE((E*(B4(Y).length+B4(I).length)-B4(Y).length)/B4(I).length));return new g("",void 0,[new g(t7(G,D),J),new g(t7(V.slice(0,Z.length),D),U),new g(t7(V.slice(Z.length,Z.length+0),D),J),new g(t7(V.slice(Z.length+0),D),U)])}function jZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D,context:J}){if(Q)return new J0({text:LZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}),textAlign:"center"});let U=new Q0({color:B}),Y=new Q0({color:$,dim:!0});return new q5({onCopy:(Z,F)=>{if(F)JQ.success(J,"Copied to clipboard",2000)},child:new J0({text:new g("",void 0,[new g("q",U),new g(" to quit",Y)]),textAlign:"center",selectable:!0})})}function xj4(A,Q){let $=B4(A),B=Math.min($.length,Math.ceil(uE(Q)*$.length));return $.slice(0,B).join("").padEnd($.length," ")}function O90(A,Q,$=0){if(Q<=0)return A;let B=$+B4(A.text??"").length,E=A.children?.map((D)=>{let J=O90(D,Q,B);return B+=B4(D.toPlainText()).length,J});return new g(A.text?t7(A.text,Q,$):A.text,A.style,E,A.hyperlink,A.onClick)}function t7(A,Q,$=0){if(Q<=0)return A;return B4(A).map((E,D)=>{if(E.trim()==="")return E;return cj4($+D)<Q?" ":E}).join("")}function cj4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}function RZ6(A){let $=A.observer.protocolMessages().filter((B)=>B.role==="assistant").at(-1);if(!$)return null;return $.content.filter((B)=>B.type==="text").map((B)=>B.text).join("")}function PZ6(A,Q={}){return new Promise(($,B)=>{if(Q.signal?.aborted){A.client.cancelAgentLoop(),B(Error("Agent run cancelled"));return}let E=!1,D=null,J=setTimeout(()=>{D?.(),Y.unsubscribe(),B(Error("Timed out waiting for agent response"))},Q.timeoutMs??600000),U=()=>{clearTimeout(J),Y.unsubscribe(),A.client.cancelAgentLoop(),B(Error("Agent run cancelled"))};if(Q.signal!==void 0)Q.signal.addEventListener("abort",U,{once:!0}),D=()=>Q.signal?.removeEventListener("abort",U);let Y=A.observer.agentState().subscribe((Z)=>{if(h3(Z)){E=!0;return}if(!E)return;let F=RZ6(A);if(F===null)return;clearTimeout(J),D?.(),Y.unsubscribe(),$(F)})})}class Tc0 extends d0{listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;updateService;initialThreadIDs;showWelcome;welcomeVariant;onWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;onRelaunchRequested;onFirstFrame;initialUserInput;getDefaultNewThreadVisibility;observeThreadSummaries;openThreadPickerOnStart;workspaceSettingsFilePath;context;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.showWelcome=A.showWelcome??!1,this.welcomeVariant=A.welcomeVariant??"intro",this.onWelcomeDismissed=A.onWelcomeDismissed,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.observeThreadSummaries=A.observeThreadSummaries,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.context=A.context}createState(){return new lj4}}class lj4 extends m0{editorController=new sY;commandPalette=new ty0(this);commandRegistry=new ng0;toastController=new Qb0;relaunchNotificationController=new bg0;exitHintTimer=new Ip(this,1000);ideStatus=new c3(this,{});threadNavigationHistory=new mg0;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;activePluginMessageSubscription=null;activePluginUIRequestsSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;welcomeVisible=!1;endCreditsVisible=!1;invadersHighScore=0;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;emptyThreadTerminalTitleController=new Pl;pluginIntegration=null;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;editorFocusNode=new i7({debugLabel:"EditorPanel"});loadThreads=async()=>{return this.widget.context.listThreads()};focusEditor=()=>{this.editorFocusNode.requestFocus()};focusEditorAfterNextFrame(){z6.instance.addPostFrameCallback(()=>{if(!this.mounted)return;this.focusEditor()},"Neo focus editor")}analyzeContextForThread=async(A,Q)=>{return kK4({ampURL:this.widget.context.ampURL,configService:this.widget.configService,threadID:A,signal:Q})};onSwitchThread=(A)=>{return this.connectToExistingThread(A,{recordNavigation:!0,rethrowError:!0})};onSelectSidebarThread=async(A)=>{this.focusEditor(),await this.onSwitchThread(A)};threadListSidebar=new uc0({state:this,isBlocked:()=>this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal(),getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,getWorkspaceRoot:()=>this.widget.context.workspaceRoot,loadThreads:this.loadThreads,observeThreadSummaries:()=>this.widget.observeThreadSummaries(),onSelectThread:this.onSelectSidebarThread,focusMainContent:this.focusEditor,getInitialVisible:()=>this.widget.context.threadListSidebarVisible});sendFeedbackReport=async(A)=>V80({configService:this.widget.configService,settingsFilePath:this.widget.context.settingsFilePath},A);archiveThread=async(A)=>{let Q=await s50({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let $=await bH4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};removeThreadLabel=async(A,Q)=>{let $=await hH4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};initState(){if(HX.getInstance().interceptConsole(),this.invadersHighScore=this.widget.context.invadersHighScore??0,this.notices=new qg0(this.widget.configService,($)=>this.setState($)),z6.instance.addPostFrameCallback(()=>{setTimeout(()=>this.widget.onFirstFrame?.(),0),this.noticesPollingTimeout=setTimeout(()=>{this.noticesPollingTimeout=null,this.notices.startPolling()},500)},"Neo notices polling"),this.widget.showWelcome)this.welcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:$,error:B})=>{if(S.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(re($.settings)))}),this.updateRelaunchIntegration=new dg0({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.context.sessionAgentMode);this.pluginIntegration=new xg0({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,context:this.widget.context,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread,readThreadMessages:this.readPluginThreadMessages,runAgent:this.runPluginAgent,onBlockingConfirmDialogChange:this.syncEmptyThreadPluginConfirmationTitle}),this.pluginIntegration.init(),this.mcpTrustIntegration=new Ch0({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=I1.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.context.pluginService?Du4({pluginService:this.widget.context.pluginService,workspaceRoot:this.widget.context.workspaceRoot,logFilePath:this.widget.context.logFilePath,toastController:this.toastController}):[],B=[Gu4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["resume"],status:{type:"enabled"},sortBoost:100,run:(E,D,J)=>{E.pushWithDismiss((U)=>Nd0({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,loadThreadTail:this.widget.context.loadThreadTail,onSelectThread:this.onSwitchThread,onDismiss:U,onThreadSelected:J}))}},...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:(E,D,J)=>{A.navigateBack(),J()}},UM4({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:(E,D,J)=>{A.navigateForward(),J()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",status:{type:"enabled"},run:(E,D,J)=>{E.push(new Rm0({mcpServers:this.widget.context.mcpServers,onDismiss:J}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",status:{type:"enabled"},run:(E)=>{E.pushWithDismiss((D)=>new wc0({toolboxes:this.widget.context.toolboxes,onDismiss:D}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","blog","announcements"],status:{type:"enabled"},run:async(E,D,J)=>{try{await p6(D,"https://ampcode.com/chronicle")}finally{J()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config"],status:{type:"enabled"},run:()=>{NK(this.widget.context.settingsFilePath).catch((E)=>{S.error("Failed to open settings file in editor",{error:E})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains"],status:{type:"enabled"},run:(E,D,J)=>{E.pushWithDismiss((U)=>new jm0({onCancel:U,onSelect:(Y)=>{this.handleIdeSelection(Y),J()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["manual","?"],status:{type:"enabled"},run:(E,D,J)=>{E.push(new ag0({commands:iB.of(D).commands,onDismiss:J}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",status:{type:"enabled"},run:(E,D,J)=>{J(),A.showWelcome()}},{noun:"amp",verb:"end credits",description:"Roll the full-screen Amp credits",status:{type:"enabled"},run:(E,D,J)=>{J(),A.showEndCredits()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["v"],status:{type:"enabled"},run:(E,D,J)=>{E.push(new B1({header:"Amp Version",maxWidth:72,onDismiss:J,child:new J0({text:new g(M50({version:"0.0.1780605512-ga5182d",buildTimestamp:"2026-06-04T20:43:42.187Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","bye"],shortcut:CA.ctrl("c"),status:{type:"enabled"},run:(E,D)=>{q4.maybeInvoke(D,new PK)}},...Q,...yH4(this.widget.context.logFilePath)].map((E)=>this.commandRegistry.register(E));return()=>{for(let E of B)E()}}build(A){let Q=this.buildHints(),$=this.ideStatus.getValue(),B=this.notices.current,E=new zc0({initialAgentMode:this.widget.context.sessionAgentMode,initialPluginAgentModeKey:this.widget.context.initialPluginAgentModeKey,analyzeContextForThread:this.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,editorFocusNode:this.editorFocusNode,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.welcomeVisible?null:B,onDismissNotice:(I)=>this.notices.dismiss(I)}),D=W4.of(A),J=D.capabilities.animationSupport!=="disabled",U=this.threadListSidebar.visibleWidth(),Y=Math.max(0,D.size.width-U),F=[new zA({constraints:Y4.tight(D.size.width,D.size.height),child:this.threadListSidebar.buildBody(E)})];if(this.commandPalette.isEnabled())F.push(new W6({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new og0({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.welcomeVisible)F.push(Nd0({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,loadThreadTail:this.widget.context.loadThreadTail,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.welcomeVisible)F.push(new W6({debugLabel:"WelcomeDialogOverlay",child:new Pc0({onDismiss:this.dismissWelcome,onQuit:()=>I1.instance.stop(),animationsEnabled:J,variant:this.widget.welcomeVariant})}));let X=this.executorAlreadyConnectedDialog;if(X)F.push(new W6({debugLabel:"ExecutorAlreadyConnectedDialogOverlay",child:new Om0({existingExecutorPid:X.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(F.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),F.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.context.isInternalUser)F.push(new sg0({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:L90.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,observerSnapshot$:this.activeThreadContext?.observer.observerSnapshot()??null}));if(this.focusDebugVisible)F.push(new Lm0);if(this.endCreditsVisible)F.push(new Hm0({onComplete:this.completeEndCredits,highScore:this.invadersHighScore,onHighScoreChange:this.updateInvadersHighScore}));return new qQ({context:this.widget.context,child:new iB({commandRegistry:this.commandRegistry,child:new YT({completionBuilder:this.widget.completionBuilder,child:new JQ({controller:this.toastController,child:new q4({actions:this.buildActions(),child:new iQ({debugLabel:"AppShortcuts",shortcuts:this.buildShortcuts(),child:new TQ({debugLabel:"AppShellFocus",canRequestFocus:!1,skipTraversal:!0,child:new $b0({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...B&&this.activeThreadContext&&!this.welcomeVisible?[this.notices]:[]],child:new rg0({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new fp({left:U,width:Y,child:new BQ({children:F})})})})})})})})})})})}buildShortcuts(){let A=new Map([[CA.ctrl("c"),new K70],[CA.ctrl("o"),new W70],[CA.alt("i"),new H70],[CA.alt("p"),new oc],[CA.ctrl("."),new u70],[CA.ctrl("t"),new O70],...this.threadListSidebar.shortcutEntries()]);if(L90.env.NODE_ENV==="development"&&L90.platform==="darwin")A.set(CA.meta("r"),new z70);return A}buildActions(){let A=new pA(()=>{if(_2.hasAnyCopyableSelection())return _2.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new pA(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),$=new pA(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),B=new pA(()=>{return this.startNewDraftThread(),"handled"}),E=new pA(()=>{return I1.instance.stop(),"handled"}),D=new pA(()=>{return Hl({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),J=new pA((I)=>{if(!I.text)return"ignored";return I1.instance.tuiInstance.clipboard.writeText(I.text).then((G)=>{if(G.ok)this.toastController.show(I.successMessage,"success",2000);else this.toastController.show(`${I.failureMessage}: ${G.userFacingErrorMessage}`,"error",4000)}).catch((G)=>{S.error("Failed to copy Neo text to clipboard",{error:G}),this.toastController.show(I.failureMessage,"error",2000)}),"handled"}),U=new pA(()=>{return I1.instance.toggleFrameStatsOverlay(),"handled"}),Y=new pA(()=>this.notices.dismissCurrent()?"handled":"ignored"),Z=new pA(()=>{if(!this.widget.context.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),F=Lu4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,context:this.widget.context,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),X=new pA(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[K70,A],[zq,B],[PK,E],[z70,D],[UB,J],[ip,$],[W70,Q],[H70,Z],...this.threadListSidebar.actionEntries(),[u70,Y],...F,[oc,U],[O70,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;this.focusEditorAfterNextFrame()}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 PP(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){S.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.context.sessionAgentMode,$=A,B=iN(Q),E=t30(this.widget.context,Q);if(B!==void 0&&E!==void 0)$={...$,[B]:E};return r30($,{agentMode:Q,explicitEffort:this.widget.context.explicitReasoningEffort,sessionState:this.widget.context})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=pj4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(cU(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=pj4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(RK);if(this.exitHintTimer.isActive())A.add(rP);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),I1.instance.stop();else this.exitHintTimer.activate()};dismissWelcome=()=>{if(!this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!1}),this.widget.onWelcomeDismissed?.()};updateInvadersHighScore=(A)=>{if(A<=this.invadersHighScore)return;this.setState(()=>{this.invadersHighScore=A}),oD((Q)=>({...Q,neoInvadersHighScore:Math.max(Q.neoInvadersHighScore,A)})).catch((Q)=>{S.warn("Failed to save Neo Invaders high score",{error:Q instanceof Error?Q.message:String(Q)})})};showWelcome=()=>{if(this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!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")I1.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}),this.focusEditorAfterNextFrame()};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,$=null,B,E,D)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),U=A.find(ce);if(U)this.widget.history.add(U.text,L90.cwd()),this.widget.history.reset();let Y=$?void 0:await this.widget.getDefaultNewThreadVisibility?.(),Z=$??Y??null,F=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,Z??void 0,E,D);if(this.sendUserMessage(F,A,E?void 0:Q,E?void 0:B),!E)this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings);this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(F)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.context.sessionAgentMode=A;let $=Q["reasoning.effort"];if($!==void 0)this.widget.context.lastReasoningEffortByMode={...this.widget.context.lastReasoningEffortByMode??{},[A]:$};let B=iN(A),E=B?Q[B]:void 0;if(E!==void 0)this.widget.context.lastSpeedByMode={...this.widget.context.lastSpeedByMode??{},[A]:E};oD((D)=>{let J={...D,agentMode:A};if($!==void 0)J={...J,lastReasoningEffortByMode:{...J.lastReasoningEffortByMode??{},[A]:$}};if(E!==void 0)J={...J,lastSpeedByMode:{...J.lastSpeedByMode??{},[A]:E}};return J}).catch((D)=>{S.warn("Failed to persist Neo session defaults for new message",{error:D instanceof Error?D.message:String(D)})})}sendUserMessage(A,Q,$,B,E){let D=w50(this.ideStatus.getValue());if(B===void 0){A.client.sendUserMessage(Q,$,{steer:E?.steer,userState:D}).catch((J)=>{S.warn("Failed to send user message",{error:J})});return}A.client.sendUserMessage(Q,$,{reasoningEffort:B,steer:E?.steer,userState:D}).catch((J)=>{S.warn("Failed to send user message",{error:J})})}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 B=this.activeThreadContext;if(!B){if(Q){for(let D of A)await this.widget.clientPool.appendUserMessageToThread(Q,D.content,$);return}throw Error("appendToThread is not available - no active thread")}let E=B.client.getThreadId();if(Q&&E!==Q){for(let D of A)await this.widget.clientPool.appendUserMessageToThread(Q,D.content,$);return}for(let D of A)this.sendUserMessage(B,[{type:"text",text:D.content}],void 0,void 0,$)};readPluginThreadMessages=async(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("thread.messages is not available - no active thread");let B=$.client.getThreadId();if(Q&&B!==Q)throw Error("thread.messages is only available for the active thread");return MoA(OoA($.observer.protocolMessages()),A)};runPluginAgent=async(A,Q,$)=>{await this.ensureDraftThreadSettingsInitialized();let B=this.widget.clientPool.createNewThread(this.widget.context.sessionAgentMode,this.draftThreadSettings,void 0,A,Q.agentModeDisplay,Q.parentThreadID,{trackAsLastActive:!1});this.sendUserMessage(B,[{type:"text",text:Q.message}]);try{let E=await PZ6(B,{timeoutMs:Q.timeoutMs,signal:$}),D=B.client.getThreadId();return D?{threadID:D,text:E}:{text:E}}finally{this.widget.clientPool.disconnect(B)}};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.context.observerOnly,onExecutorAlreadyConnected:(E)=>this.promptExecutorAlreadyConnected(E)});if(this.setActiveClient(B),Q.recordNavigation&&$!==A)this.threadNavigationHistory.recordNavigation($);if(Q.initialUserInput)this.sendUserMessage(B,[{type:"text",text:Q.initialUserInput}])}catch(B){if(S.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.context.observerOnly,onExecutorAlreadyConnected:async()=>"observe"})}catch(Q){S.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,agentModeDisplay:$}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q,agentModeDisplay:$}}),this.syncEmptyThreadPluginConfirmationTitle(),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)}),this.activePluginMessageSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription?.unsubscribe(),this.pluginIntegration?.cancelOwnerUIRequests(),this.activePluginMessageSubscription=Q.pluginMessages().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage(B,(E)=>{A.sendPluginMessage(E)})}),this.activePluginUIRequestsSubscription=Q.pluginUIRequests().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage({type:"plugin_message",message:{type:"event",event:"plugin.ui.snapshot",data:{requests:[...B]}}},(E)=>{A.sendPluginMessage(E)})})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){S.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.threadListSidebar.dispose(),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(),this.editorFocusNode.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.welcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||this.endCreditsVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function pj4(A,Q,$){let B={...A};for(let E of TZ6(Q,$)){if(!cU(A[E],Q[E]))continue;let D=$[E];if(D===void 0)delete B[E];else B[E]=D}return B}function TZ6(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}$3();function ij4(A,Q,$,B){let E=RyA(A),D="\x1B[0m",J="\x1B[34m",U="\x1B[90m",Y="\x1B[2m",Z=[];if(A.archived)Z.push("\x1B[90m\x1B[2mArchived\x1B[0m");Z.push(`${E}`),Z.push(`\x1B[34m${Q}\x1B[0m`),Z.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let F=14,X=7,I=new T2(F,X),G=new O5(42),V=new ZT(F,X,F,X,F,X,0,A.agentMode??"smart","intensity","ascii",void 0,void 0,g0.default(),G);V.layout(Y4.tight(F,X)),V.paint(I,0,0);let K=I.getBuffer().getCells(),z=0;for(let R=0;R<X;R++)if(K[R].some((_)=>_.char!==" ")){z=R;break}let W=X-1;for(let R=X-1;R>=0;R--)if(K[R].some((_)=>_.char!==" ")){W=R;break}function C(R,_){if(!R)return"";if(R.type==="rgb"){let{r:T,g:f,b:d}=R.value;if($.getColorDepth()>=24)return`\x1B[${_?38:48};2;${T};${f};${d}m`;let x=$p(T,f,d);return`\x1B[${_?38:48};5;${x}m`}return""}let H=[];if(W>=z)for(let R=z;R<=W;R++){let _="";for(let T=0;T<F;T++){let f=K[R][T],d=f.char,x=C(f.style.fg,!0);_+=x+d+"\x1B[0m"}H.push(_)}let N=H.length,q=Math.max(N,Z.length),w=Math.floor((q-N)/2),L=Math.floor((q-Z.length)/2);for(let R=0;R<q;R++){let _=" ".repeat(F);if(R>=w&&R<w+N)_=H[R-w];let T=" ",f="";if(R>=L&&R<L+Z.length)f=Z[R-L];$.write(_+T+f+`
|
|
3086
3086
|
`)}if(B)$.write(`
|
|
3087
3087
|
\x1B[90m${B}\x1B[0m
|
|
3088
3088
|
`)}r0();class vc0{status=v3.status;constructor(){this.autoConnect()}async connect(A){await v3.start(A,!0,"user-initiated"),v3.selectConfig(A)}autoConnect(){let A=v3.getSelectedConfig();if(A){v3.start(A,!0,"auto-startup").catch((Q)=>{S.error("Failed to auto-connect to IDE",{error:Q})});return}this.discoverAndConnect()}async discoverAndConnect(){try{await sbA();let A=await kC({});if(A.length===1&&A[0])v3.selectConfig(A[0]),await v3.start(A[0],!0,"auto-startup")}catch(A){S.error("Failed to auto-discover IDE",{error:A})}}}r0();r0();import{exec as bq}from"node:child_process";function nj4(A="idle"){try{if(A==="idle"){if(process.platform==="darwin")bq("afplay /System/Library/Sounds/Submarine.aiff");else if(process.platform==="win32")bq("powershell [console]::beep(800,200)");else if(process.platform==="linux")bq("paplay /usr/share/sounds/freedesktop/stereo/message.oga || beep")}else if(A==="idle-review"){if(process.platform==="darwin")bq("afplay /System/Library/Sounds/Glass.aiff")}else if(A==="requires-user-input"){if(process.platform==="darwin")bq("afplay /System/Library/Sounds/Ping.aiff");else if(process.platform==="win32")bq("powershell [console]::beep(1000,300)");else if(process.platform==="linux")bq("paplay /usr/share/sounds/freedesktop/stereo/dialog-information.oga || beep -f 1000 -l 100")}}catch(Q){S.error(`Failed to play notification sound (${A}):`,Q)}}Up();py0();var vZ6=2000,_Z6="Agent is ready",SZ6="Waiting for approval";function oj4(A){let Q=!0,$=!0,B=A.configService.config.subscribe((W)=>{Q=W.settings["notifications.enabled"]??!0,$=W.settings["notifications.system.enabled"]!==!1}),E=0,D=()=>{let W=G?.prepareTerminalTitleForNotification();if(W!==void 0)process.stdout.write(yV4(W))},J=(W)=>{if(!Q)return;let C=Date.now();if(C-E<vZ6)return;if(E=C,HK())return;if(qI4())D(),setTimeout(uI4,Py0);else nj4(W)},U=()=>{J("idle"),V(_Z6)},Y=()=>{J("requires-user-input"),V(SZ6)},Z=(W)=>W?.attempt===void 0||W.attempt===0,F=null,X=null,I=null,G,V=(W)=>{if(!Q||!$)return;if(HK()&&!cy0()&&!sc())return;D(),setTimeout(()=>{process.stdout.write(xV4(W))},Py0)},K=()=>{F?.unsubscribe(),X?.unsubscribe(),F=null,X=null,I=null,G=void 0};return{attach:(W,C,H)=>{if(K(),G=H,C)X=C.subscribe({next:(N)=>{if(N===null)return;if(!Z(N))return;U()},error:(N)=>{S.debug("Neo notification active error stream errored",{error:N})}});F=W.subscribe({next:(N)=>{try{let q=I!==null&&h3(I),w=I==="awaiting_approval",L=q||w;if(N==="awaiting_approval"&&!w)Y();else if(N==="idle"&&L)U()}catch(q){S.debug("Neo notification handling failed",{error:q})}finally{I=N}},error:(N)=>{S.debug("Neo notification agent state stream errored",{error:N})}})},detach:K,unsubscribe(){K(),B.unsubscribe()}}}function kZ6({initialUserInput:A,showWelcome:Q,hideWelcome:$,welcomeVariant:B,welcomeDismissed:E}){if($)return{show:!1,markDismissedOnDismiss:!1};if(B==="npm-migration")return{show:!0,markDismissedOnDismiss:!1};if(Q)return{show:!0,markDismissedOnDismiss:!0};let D=!A&&!E;return{show:D,markDismissedOnDismiss:D}}async function fZ6(A){await oD((Q)=>_P(Q,A,"interactive"))}async function aj4(A,Q={}){let{initialThreadIDs:$=[],initialUserInput:B,getDefaultNewThreadVisibility:E,openThreadPickerOnStart:D=!1,observerOnly:J=!1,initialAgentMode:U,initialPluginAgentModeKey:Y,initialReasoningEffort:Z,onFirstFrame:F,showWelcome:X=!1,hideWelcome:I=!1,welcomeVariant:G="intro"}=Q,V=G==="npm-migration";if($.length>1)S.info("Resuming multiple initial threads",{threadIDs:$});let K=async(d)=>{let x=await A.getThreadFromServer(d);if(!x)return null;return H30(x)},z=async(d)=>{let x=await A.getThreadFromServer(d);if(!x)throw Error(`Thread ${d} not found`);let v=await EB(d,A.configService,A.apiKey,{usesThreadActors:!0}),k=Q7({endpoint:A.rivetEndpoint,poolName:v.poolName}),c={wsToken:v.wsToken,transport:"json-rpc"},b=await k.threadActor.get([v.threadId],{params:c}).fetch("/import",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({thread:N30(x)}),skipReadyWait:!0});if(!b.ok&&b.status!==409)throw Error(`Thread import failed (${b.status}): ${await b.text()}`);try{await P30(d,A.configService,A.apiKey,{executorType:"local-client"})}catch(p){S.warn("failed to mark thread as imported on server",{threadID:d,error:p instanceof Error?p.message:String(p)})}},W=new Hy0(A.rivetEndpoint,A.apiKey,A.configService,{clientID:DK.parse(`neo-${crypto.randomUUID()}`),toolService:A.toolService,skillService:A.skillService,requestPluginToolCall:(d)=>A.pluginService.event.toolCall(d),requestPluginToolResult:(d)=>A.pluginService.event.toolResult(d),pluginService:A.pluginService,pluginPlatform:A.pluginPlatform,canUseV2LocalThreadChanges:A.canUseV2LocalThreadChanges,invokeTool:async(d,x)=>{let v=typeof x.args==="object"&&x.args!==null?x.args:{},k=await GK({toolName:x.toolName,configService:A.configService,toolService:A.toolService,mcpService:A.mcpService,skillService:A.skillService,toolUseID:x.toolCallId,threadId:d});return A.toolService.invokeTool(x.toolName,{args:v},k)},persistLastThreadID:fZ6,readFileSystemDirectory:A.readFileSystemDirectory},K,z),C=await nN(),H=kZ6({initialUserInput:B,showWelcome:X,hideWelcome:I,welcomeVariant:G,welcomeDismissed:C.neoWelcomeDismissed}),N={ampURL:A.ampURL,configService:A.configService,getThreadMarkdown:async(d)=>{let x=await A.getThreadFromServer(d);return x?m10(x):null},isInternalUser:A.isInternalUser,listThreads:A.listThreads,loadThreadTail:A.getThreadTail,logFilePath:wc,mcpServers:A.mcpService.servers,pluginPlatform:A.pluginPlatform,pluginService:A.pluginService,toolboxes:A.toolboxes,observerOnly:V?!1:J,invadersHighScore:C.neoInvadersHighScore,sessionAgentMode:U??C.agentMode,threadListSidebarVisible:C.threadListSidebarVisible,initialPluginAgentModeKey:Y,explicitReasoningEffort:Z,lastReasoningEffortByMode:C.lastReasoningEffortByMode,lastSpeedByMode:C.lastSpeedByMode,settingsFilePath:A.settingsFilePath,workspaceRoot:A.workspaceRoot},q=(d,x)=>{return HV4({ampURL:A.ampURL,configService:A.configService,threadID:d,signal:x})},w=()=>qV4({apiKey:A.apiKey,configService:A.configService,rivetEndpoint:A.rivetEndpoint}),L=new vc0,R=oj4({configService:A.configService}),_=await A.configService.getLatest();I1.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:_.settings["terminal.animation"]===!1}});let T=new Set,f=new yg0;try{await ly0(new Tc0({clientPool:W,listSkillsForThread:q,completionBuilder:A.completionBuilder,history:new tx0,ideManager:L,configService:A.configService,updateService:A.updateService,initialThreadIDs:V?[]:$,notificationService:R,mcpTrustHandler:A.mcpTrustHandler,initialUserInput:V?void 0:B,getDefaultNewThreadVisibility:E,observeThreadSummaries:w,openThreadPickerOnStart:V?!1:D,workspaceSettingsFilePath:A.workspaceSettingsFilePath,context:N,showWelcome:H.show,welcomeVariant:G,onActiveThreadChange:A.setActiveThreadID,onRelaunchRequested:f.request,onWelcomeDismissed:H.markDismissedOnDismiss?()=>{oD(OV4).catch((x)=>{S.warn("Failed to mark Neo welcome as dismissed",{error:x})})}:void 0,onThreadArchived:(x)=>{T.add(x)},onFirstFrame:F}));let d=W.lastActiveObservingClient;if(d&&f.shouldShowExitSummary){let{client:x,observer:v}=d,k=x.getThreadId();if(k){let c={id:k,title:v.title().getValue(),agentMode:v.agentMode,archived:T.has(k)},m=`${A.ampURL.replace(/\/$/,"")}/threads/${k}`;ij4(c,m,process.stdout)}}}finally{process.stdout.write(I50("")),R.unsubscribe(),W.dispose(),await A.dispose?.()}process.exit(f.relaunchIfRequested(A.workspaceRoot)??0)}import{execFile as xZ6}from"node:child_process";import{closeSync as rj4,openSync as yZ6,writeSync as bZ6}from"node:fs";import hZ6 from"node:tty";var gZ6="\x1B[c",mZ6="\x1B[?1004h",dZ6="\x1B[?1004l",cZ6="\x1B[?u",sj4=200,pZ6="\x1B[>4;2m",lZ6="\x1B[?9001h",iZ6="\x1B[?9001l";function tj4(){let A=null;try{if(process.stdout.isTTY){let Q=process.stdout.getWindowSize();A=[Q[0],Q[1]]}}catch{}return{isTTY:process.stdout.isTTY,columns:process.stdout.columns??null,rows:process.stdout.rows??null,windowSize:A,hasRefreshSize:typeof process.stdout._refreshSize==="function"}}function nZ6(){if(process.stdout.isTTY)return{stream:process.stdout,target:"stdout",dispose:()=>{}};if(process.stderr.isTTY)return{stream:process.stderr,target:"stderr",dispose:()=>{}};if(process.platform!=="win32")try{let A=yZ6("/dev/tty","w");if(hZ6.isatty(A))return{stream:{write(Q){return bZ6(A,Q),!0}},target:"dev-tty",dispose:()=>{rj4(A)}};rj4(A)}catch{}return{stream:process.stdout,target:"stdout",dispose:()=>{}}}function M$(A,Q){if(!process.stdout.writable||process.stdout.destroyed){Q?.();return}let $=`${JSON.stringify(A)}
|
|
@@ -4998,7 +4998,7 @@ Start Amp from a smaller directory.`};function dX(A,Q){if(!FI4())return;S.debug(
|
|
|
4998
4998
|
`)}function tP4(A,Q){A.command("usage").description("Show your current Amp usage and credit balance").action(async($,B)=>{let E=B.optsWithGlobals(),D=await Q(E),J=await LP(D),U=await M4.userDisplayBalanceInfo({},{config:J});if(!U.ok){if(U.error.code==="auth-required")process.stderr.write(k0.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(k0.red("Error: ")+U.error.message+`
|
|
4999
4999
|
`),process.exit(1)}process.stdout.write(await IV6(U.result.displayText)+`
|
|
5000
5000
|
`),process.exit(0)})}var xC6=qi.join(mU,"logs","headless.log"),Tl0=qi.join(vy,"device-id.json");SF4();async function yC6(){let A=await Promise.all(SC.map(async(Q)=>{try{return{query:Q,hasConfigs:(await Q.listConfigs()).length>0}}catch($){return S.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 OS4(){yC6().then((A)=>{if(A){let Q=X00(A.ideName);if(Q)jC(Q)}})}try{if(process.platform==="win32")await Promise.resolve().then(() => T4(tT(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){G7.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
|
|
5001
|
-
`)}function bC6(A){process.emitWarning=(Q,$,B,E)=>{let D=typeof Q==="string"?Q:Q.message||String(Q),J=$||"Warning",U=!1;A.warn(D,{name:J,code:B})}}function H3(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")Q00("dangerouslyAllowAll",Q.dangerouslyAllowAll)}function hC6(A,Q){if(!g9(Q))return;if(!CG(Q.user.email)){if(A.model)throw new GA("The --model flag is only available for Amp employees.",1);Q00("internal.model",void 0);return}if(A.model)Q00("internal.model",dC6(A.model))}function HS4(A){let Q=A.indexOf(":");if(Q===-1)throw new GA(`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 GA(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function gC6(A){if(A===void 0)return;let Q=A.trim();if(Ty(Q))return Q;throw new GA(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function mC6(A,Q){if(TC(A))return;throw new GA(`Reasoning effort "${Q}" is not available for ${A} mode.`,1)}function dC6(A){if(!A.includes("="))return HS4(A),A;let Q={};for(let $ of A.split(",")){let B=$.trim();if(!B)continue;let E=B.indexOf("=");if(E===-1)throw new GA(`Invalid mode-specific model entry "${B}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let D=B.slice(0,E).trim(),J=B.slice(E+1).trim();if(!D)throw new GA(`Missing mode name in "${B}". Expected "mode=provider:model".`,1);if(!J)throw new GA(`Missing model value for mode "${D}". Expected "${D}=provider:model".`,1);HS4(J),Q[D]=J}if(Object.keys(Q).length===0)throw new GA("No valid model overrides found in --model flag value.",1);return Q}function TE0(A,Q,$){let B=Number(A);if(!Number.isInteger(B)||B<$.min)throw new E30(`${Q} must be an integer >= ${$.min}`);if($.max!==void 0&&B>$.max)throw new E30(`${Q} must be an integer <= ${$.max}`);return B}function cC6(A,Q){return A?.some(($)=>$.name===Q&&$.enabled)??!1}async function pC6(A,Q){let $=await M4.getUserInfo({},{config:A});return $.ok?cC6($.result.features,Q):!1}function lC6(A){return A!=="pending"}function tq(A){if(!g9(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function iC6(A){let Q=tq(A);if(Q)return Q.id;if(RC(A))throw Error(A.error.message);throw Error("unreachable")}function nC6(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 oC6(A){let B=nC6(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 GA(`Couldn't connect to the Amp server at ${A}.`,1,B)}function Sl0(A,Q){let $=Zx0(Error(A.error.message));if($.message===V3.networkOffline||$.message===V3.networkTimeout)return oC6(Q);if($.message!==V3.internalBug)return new GA($.message,1,$.suggestion);return new GA(A.error.message.replace(/^Error: /,""),1)}async function aC6(){if(process.versions.bun)return!1;try{return await cY()==="npm"}catch(A){return S.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var NS4=[{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??iJ,description:`Custom settings file path (overrides the default location ${iJ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(S).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${wc})`},{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:Q9(),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:m9.SMART.key,description:`Set the agent mode (${PG({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`},{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:"Show migration instructions for the removed legacy runtime",hidden:!0},{name:"orb",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:"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}],qS4=(A)=>("deprecated"in A)&&A.deprecated===!0,rC6=(A)=>("hidden"in A)&&A.hidden===!0,sC6=(A)=>("default"in A),tC6=(A)=>("default"in A)?A.default:void 0;function uS4(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let $=gC6(Q.effort);if($!==void 0){if(ui(Q.mode))mC6(Q.mode,$)}return $}var eC6="Amp Neo is now Amp and available to everyone. If you need to finish work in the old Amp, you can use an older version. For instructions on how to do that and more information: https://ampcode.com/news/drop-the-neo";function ui(A){return Object.values(m9).some((Q)=>Q.key===A)}function AH6(A,Q){if(ui(A))return A;throw new GA(`${Q} does not support plugin-defined agent modes`,1)}function LS4(A,Q){if(ui(Q))return{agentMode:Q};let $=A.agentModes.list().find((E)=>E.key===Q||E.label===Q);if(!$){let E=PG({}).map((U)=>U.mode).join(", "),D=A.agentModes.list().map((U)=>U.label).join(", "),J=D?` Plugin modes: ${D}.`:"";throw new GA(`Unknown agent mode '${Q}'. Built-in modes: ${E}.${J}`,1)}let B={label:$.label};if($.color!==void 0)B.color=$.color;return{agentMode:m9.SMART.key,agent:$.agent,agentModeDisplay:B,pluginAgentModeKey:$.key}}async function QH6(A,Q,$){if(A.getOptionValueSourceWithGlobals("mode")!=="cli")return;return await Q.initialized,LS4(Q,$)}function $H6(A,Q){let $=Q.args[0],B=Q.commands.map((D)=>D.name());if($&&!$.includes(" ")&&$.length<30&&!/[./\\]/.test($)){let D=B.filter((U)=>$.includes(U)||U.includes($)),J="Run amp --help for a list of available commands.";if(D.length>0)J=`Did you mean: ${D.join(", ")}? Or run amp --help for all commands.`;throw new GA(V3.unknownCommand($),1,J)}}var vE0=c0.file(fC6.homedir()),vl0=process.env.XDG_CONFIG_HOME?c0.file(process.env.XDG_CONFIG_HOME):EA.joinPath(vE0,".config");async function PB(A,Q,$){let B=$?.deferAuth??!1,E=$?.skipToolProviders??!1;hyA("0.0.
|
|
5001
|
+
`)}function bC6(A){process.emitWarning=(Q,$,B,E)=>{let D=typeof Q==="string"?Q:Q.message||String(Q),J=$||"Warning",U=!1;A.warn(D,{name:J,code:B})}}function H3(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")Q00("dangerouslyAllowAll",Q.dangerouslyAllowAll)}function hC6(A,Q){if(!g9(Q))return;if(!CG(Q.user.email)){if(A.model)throw new GA("The --model flag is only available for Amp employees.",1);Q00("internal.model",void 0);return}if(A.model)Q00("internal.model",dC6(A.model))}function HS4(A){let Q=A.indexOf(":");if(Q===-1)throw new GA(`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 GA(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function gC6(A){if(A===void 0)return;let Q=A.trim();if(Ty(Q))return Q;throw new GA(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function mC6(A,Q){if(TC(A))return;throw new GA(`Reasoning effort "${Q}" is not available for ${A} mode.`,1)}function dC6(A){if(!A.includes("="))return HS4(A),A;let Q={};for(let $ of A.split(",")){let B=$.trim();if(!B)continue;let E=B.indexOf("=");if(E===-1)throw new GA(`Invalid mode-specific model entry "${B}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let D=B.slice(0,E).trim(),J=B.slice(E+1).trim();if(!D)throw new GA(`Missing mode name in "${B}". Expected "mode=provider:model".`,1);if(!J)throw new GA(`Missing model value for mode "${D}". Expected "${D}=provider:model".`,1);HS4(J),Q[D]=J}if(Object.keys(Q).length===0)throw new GA("No valid model overrides found in --model flag value.",1);return Q}function TE0(A,Q,$){let B=Number(A);if(!Number.isInteger(B)||B<$.min)throw new E30(`${Q} must be an integer >= ${$.min}`);if($.max!==void 0&&B>$.max)throw new E30(`${Q} must be an integer <= ${$.max}`);return B}function cC6(A,Q){return A?.some(($)=>$.name===Q&&$.enabled)??!1}async function pC6(A,Q){let $=await M4.getUserInfo({},{config:A});return $.ok?cC6($.result.features,Q):!1}function lC6(A){return A!=="pending"}function tq(A){if(!g9(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function iC6(A){let Q=tq(A);if(Q)return Q.id;if(RC(A))throw Error(A.error.message);throw Error("unreachable")}function nC6(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 oC6(A){let B=nC6(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 GA(`Couldn't connect to the Amp server at ${A}.`,1,B)}function Sl0(A,Q){let $=Zx0(Error(A.error.message));if($.message===V3.networkOffline||$.message===V3.networkTimeout)return oC6(Q);if($.message!==V3.internalBug)return new GA($.message,1,$.suggestion);return new GA(A.error.message.replace(/^Error: /,""),1)}async function aC6(){if(process.versions.bun)return!1;try{return await cY()==="npm"}catch(A){return S.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var NS4=[{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??iJ,description:`Custom settings file path (overrides the default location ${iJ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(S).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${wc})`},{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:Q9(),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:m9.SMART.key,description:`Set the agent mode (${PG({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`},{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:"Show migration instructions for the removed legacy runtime",hidden:!0},{name:"orb",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:"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}],qS4=(A)=>("deprecated"in A)&&A.deprecated===!0,rC6=(A)=>("hidden"in A)&&A.hidden===!0,sC6=(A)=>("default"in A),tC6=(A)=>("default"in A)?A.default:void 0;function uS4(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let $=gC6(Q.effort);if($!==void 0){if(ui(Q.mode))mC6(Q.mode,$)}return $}var eC6="Amp Neo is now Amp and available to everyone. If you need to finish work in the old Amp, you can use an older version. For instructions on how to do that and more information: https://ampcode.com/news/drop-the-neo";function ui(A){return Object.values(m9).some((Q)=>Q.key===A)}function AH6(A,Q){if(ui(A))return A;throw new GA(`${Q} does not support plugin-defined agent modes`,1)}function LS4(A,Q){if(ui(Q))return{agentMode:Q};let $=A.agentModes.list().find((E)=>E.key===Q||E.label===Q);if(!$){let E=PG({}).map((U)=>U.mode).join(", "),D=A.agentModes.list().map((U)=>U.label).join(", "),J=D?` Plugin modes: ${D}.`:"";throw new GA(`Unknown agent mode '${Q}'. Built-in modes: ${E}.${J}`,1)}let B={label:$.label};if($.color!==void 0)B.color=$.color;return{agentMode:m9.SMART.key,agent:$.agent,agentModeDisplay:B,pluginAgentModeKey:$.key}}async function QH6(A,Q,$){if(A.getOptionValueSourceWithGlobals("mode")!=="cli")return;return await Q.initialized,LS4(Q,$)}function $H6(A,Q){let $=Q.args[0],B=Q.commands.map((D)=>D.name());if($&&!$.includes(" ")&&$.length<30&&!/[./\\]/.test($)){let D=B.filter((U)=>$.includes(U)||U.includes($)),J="Run amp --help for a list of available commands.";if(D.length>0)J=`Did you mean: ${D.join(", ")}? Or run amp --help for all commands.`;throw new GA(V3.unknownCommand($),1,J)}}var vE0=c0.file(fC6.homedir()),vl0=process.env.XDG_CONFIG_HOME?c0.file(process.env.XDG_CONFIG_HOME):EA.joinPath(vE0,".config");async function PB(A,Q,$){let B=$?.deferAuth??!1,E=$?.skipToolProviders??!1;hyA("0.0.1780605512-ga5182d");let D=E00({storage:A.settings,secretStorage:A.secrets,workspaceRoot:process.cwd(),defaultAmpURL:A.ampURL,homeDir:vE0,userConfigDir:vl0}),J=A.secrets.get("apiKey",A.ampURL),U=yO(D),Y=null,Z=()=>{return},F=new Promise((B0)=>{Z=B0}),X=J.then(async(B0)=>{if(!B0&&!B)await F;return Y??=U.subscribe(()=>{}),i4(U.pipe(E5(lC6)))});X.catch(()=>{return}),SP4(D);let I=await D.getLatest();S.debug("Global configuration initialized",{settingsKeys:Object.keys(I.settings)});let G=!1;{let B0=await J;if(G=Boolean(B0),S.info("API key lookup before login",{found:Boolean(B0),ampURL:A.ampURL,deferAuth:B}),!B0)if(B)S.info("No API key found, continuing startup with deferred auth");else{kQ.write(`No API key found. Starting login flow...
|
|
5002
5002
|
`);let H0=await BH6(A),l=await A.secrets.get("apiKey",A.ampURL);if(S.info("Login flow completed",{success:H0,storedKeyPresent:Boolean(l),ampURL:A.ampURL}),!H0)await mY(),process.exit(1);G=!0,Z()}}{let B0=await D.getLatest(),H0=B0.settings.url,l=B0.secrets.isSet?.[H0];S.info("Config secrets state after login",{configURL:H0,apiKeySet:l?.apiKey??!1})}let V=B?"pending":await X;if(!B)S.info("Server status resolved",{status:"ready",isAuthenticated:g9(V),isError:RC(V),errorMessage:RC(V)?V.error.message:void 0});hC6(Q,V);let K=X.then((B0)=>iC6(B0));K.catch(()=>{return});let z=g9(V),W=!1;if(process.env.AMP_DISABLE_PLUGINS==="1")S.warn("Ignoring AMP_DISABLE_PLUGINS outside development");let C=W?"off":"all",{toolService:H,dispose:N}=UD4({configService:D}),q=new Map,w=()=>q.clear(),L=new XM0(D,A.settings.getWorkspaceRootPath()),R=ssA({configService:D}),_=nnA({configService:D,trustStore:L,skillMCPServers:R.skillMCPServers,uploadImageAttachments:z,createOAuthProvider:async(B0,H0,l)=>{let i=`${B0}:${H0}`,A0=q.get(i);if(A0)return S.debug("Reusing existing OAuth provider for server",{serverName:B0,serverUrl:H0}),A0;S.debug("Creating OAuth provider for server",{serverName:B0,serverUrl:H0});let s=(async()=>{let $0=new gC(A.secrets),e=await $0.getClientInfo(B0,H0),V0=l?.scopes??e?.scopes,G0=jI4();S.info("OAuth headless mode check",{useHeadless:G0,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:kQ.isTTY});let w0;if(G0)w0=A.executeMode?LI4():OI4(B0);let F0=new Bq0({storage:$0,serverName:B0,serverUrl:H0,clientId:l?.clientId??e?.clientId,clientSecret:l?.clientSecret??e?.clientSecret,authUrl:l?.authUrl??e?.authUrl,tokenUrl:l?.tokenUrl??e?.tokenUrl,scopes:V0,headlessAuthHandler:w0});return S.debug("OAuth provider created",{serverName:B0,serverUrl:H0,hasManualClientId:!!(l?.clientId??e?.clientId),willUseDCR:!(l?.clientId??e?.clientId),scopes:V0,headlessMode:G0,executeMode:A.executeMode}),F0})();return q.set(i,s),s}}),T=ZL0({configService:D,spawn:p10}),f=Q.headless?aR4():void 0,d=f??new b90({configService:D}),x=d instanceof b90?d:void 0;if(x)x.pluginExecutorKind="local";let v=new C4(null),k=null,c=z&&!W?[...tR4(I.settings)?[{name:"permissions",entryPoint:nc0}]:[],{name:"thread-visibility",entryPoint:QP4(D,()=>X.then(tq),()=>k,(B0)=>{k=B0}),alwaysLoad:!0}]:[],m=MM0({configService:D,platform:d,loadGlobalPlugins:wx0(D),pluginFilter:C,activeThread$:v,internalPlugins:c}),b=ioA(m),p=[_,T,b],n;if(E)n=new Map;else if(A.executeMode){let B0=await weA({toolService:H,providers:p,initialTimeout:15000});n=B0.registrations;for(let[H0,l]of B0.initErrors)S.warn(`${H0} provider initialization slow or failed:`,l)}else n=FL0({toolService:H,providers:p});if(Q.jetbrains)jC("JetBrains");else if(Q.ide&&SI4())jC("VS Code");else if(Q.ide&&kI4())jC("Neovim");else if(Q.ide&&A.executeMode)OS4();if(A.executeMode)gyA(!0);let r,X0=v3.status.pipe(sA((B0)=>Boolean(B0.connected&&B0.authenticated&&B0.ideName&&pbA(B0.ideName))),ZQ()).subscribe((B0)=>{if(B0){if(!r)r=H.registerTool(ueA)}else r?.dispose(),r=void 0}),E0;if(!A.executeMode){let B0=await A.settings.get("fuzzy.alwaysIncludePaths")??[];E0=new v30(process.cwd(),{alwaysIncludePaths:B0},!0)}else E0=new class extends v30{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let I0=gh(D);S.info("Starting Amp background services");let C0=new Ap0,P0={configService:D,toolService:H,mcpService:_,skillService:R,toolboxService:T,trustStore:L,threadRemote:I0,setThreadMeta:I0.setThreadMeta,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:E0,terminal:C0,pluginService:m,pluginPlatform:x,headlessPluginPlatform:f,activeThread$:v,serverStatus:V,serverStatusPromise:X,viewerUserIDPromise:K,hasAPIKeyAtStartup:G,consumeDraftNewThreadVisibility:()=>{let B0=k;return k=null,B0}};return{...P0,async asyncDispose(){if(P0.mcpService.hasAuthenticatingClients())S.info("Waiting for OAuth authentication to complete before exit..."),await P0.mcpService.waitForAuthentication();for(let B0 of n.values())B0.dispose();await P0.mcpService.dispose(),w(),P0.configService.unsubscribe(),Y?.unsubscribe(),N(),P0.fuzzyServer.dispose(),P0.settingsStorage[Symbol.dispose](),X0.unsubscribe(),r?.dispose(),await P0.pluginService.dispose()}}}async function BH6(A){if(!A.executeMode){if(!await f90("Would you like to log in to Amp? [(y)es, (n)o]: "))return kQ.write(`Login cancelled. Run the command again to retry.
|
|
5003
5003
|
`),!1}return await jS4(A)}async function jS4(A){let Q=vC6(32).toString("hex"),$=await mc0(A.ampURL,Q),B=new AbortController;try{await dJ($,B.signal)}catch(D){S.error("Error opening browser",{error:D})}let E=await mc0(A.ampURL,Q,!1);kQ.write(`If your browser does not open automatically, visit:
|
|
5004
5004
|
|
|
@@ -5006,7 +5006,7 @@ ${k0.blue.bold(E)}
|
|
|
5006
5006
|
|
|
5007
5007
|
`);try{return await vR4(A.ampURL,Q,A.secrets,B),kQ.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(D){return S.error("Login failed",{error:D}),G7.write(`
|
|
5008
5008
|
Login failed: ${D instanceof Error?D.message:String(D)}
|
|
5009
|
-
`),!1}}async function EH6(A,Q,$){let B=await Q.get("apiKey",A);if(!B)throw new GA("No Amp API key found. Run `amp login` first.",1);let E=TC6("curl",["-H",`Authorization: Bearer ${B}`,...$],{stdio:"inherit"});process.exitCode=await new Promise((D,J)=>{E.on("error",J),E.on("close",(U)=>D(U??1))})}function DH6(A){let Q=new GX().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, unlisted, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((C)=>{if(C.code==="commander.help"||C.code==="commander.version"||C.exitCode===0)kN(),process.exit(0);let H=C.originalError??C;eF4(H)}),xK4(Q,{version:"0.0.
|
|
5009
|
+
`),!1}}async function EH6(A,Q,$){let B=await Q.get("apiKey",A);if(!B)throw new GA("No Amp API key found. Run `amp login` first.",1);let E=TC6("curl",["-H",`Authorization: Bearer ${B}`,...$],{stdio:"inherit"});process.exitCode=await new Promise((D,J)=>{E.on("error",J),E.on("close",(U)=>D(U??1))})}function DH6(A){let Q=new GX().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, unlisted, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((C)=>{if(C.code==="commander.help"||C.code==="commander.version"||C.exitCode===0)kN(),process.exit(0);let H=C.originalError??C;eF4(H)}),xK4(Q,{version:"0.0.1780605512-ga5182d",buildTimestamp:"2026-06-04T20:43:42.187Z",buildType:"release"}),Q.addHelpText("after",sI4()),Q.configureHelp({formatHelp:tI4}),Q.command("logout").description("Log out by removing stored API key").action(async(C,H)=>{let N=H.optsWithGlobals(),q=await aQ(N);await zH6(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(C,H)=>{let N=H.optsWithGlobals(),q=await aQ(N);await KH6(q,await ac0(N,q.settings))}),VP4(Q,aQ);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(...C)=>{let H=C.find((L)=>typeof L==="object"&&L!==null&&typeof L.optsWithGlobals==="function")??B,N=C.filter((L)=>L!==H).flatMap((L)=>Array.isArray(L)?L:typeof L==="string"?[L]:[]),q=H.optsWithGlobals(),w=await aQ(q);await EH6(w.ampURL,w.secrets,N),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(C,H,N)=>{let q=N.optsWithGlobals(),w=await aQ(q);await GI4(C??"get",w.ampURL,w.secrets),process.exit(process.exitCode??0)}),Q.command("sign-commit [args...]",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements Git signing helper interfaces. Used inside sandboxes for commit signing.").allowUnknownOption(!0).allowExcessArguments(!0).action(async(C,H,N)=>{let q=N.optsWithGlobals(),w=await aQ(q);await KI4(w,C),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(C)=>{await QR4({raw:C.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(`
|
|
5010
5010
|
`)).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(C,H,N)=>{if(C&&H.apply)throw new GA("Choose either a positional thread ID/URL or --apply <thread-id>, not both.",1);let q=H.apply??C;if(!q||q.trim().length===0)kQ.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.
|
|
5011
5011
|
|
|
5012
5012
|
`),N.outputHelp(),process.exit(0);let w=Q3(q)??c7(q),L=N.optsWithGlobals(),R=await aQ(L);H3(N,L);let _=await PB(R,L),T=!1;try{if(H.checkout&&H.skipCheckout)throw new GA("Choose either --checkout or --skip-checkout, not both.",1);if(RC(_.serverStatus))throw Sl0(_.serverStatus,R.ampURL);await HR4({ampURL:R.ampURL,threadId:w,configService:_.configService,threadSnapshotReader:{get:_.threadRemote.getThread},apiKey:process.env.AMP_API_KEY,applyOnce:typeof H.apply==="string",checkoutMode:H.checkout?"always":H.skipCheckout?"never":"prompt",promptForYesNo:f90}),T=!0}finally{if(await _.asyncDispose(),T)process.exit(0)}});let E=async(C,H,N)=>{E00({storage:H.settings,secretStorage:H.secrets,workspaceRoot:process.cwd(),defaultAmpURL:H.ampURL,homeDir:vE0,userConfigDir:vl0});let q={...H,executeMode:!1};await _l0(q,{...C,openThreadSwitcher:!0},N)},D=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",(C)=>TE0(C,"--limit",{min:1,max:500})).option("--offset <number>","Number of threads to skip",(C)=>TE0(C,"--offset",{min:0})).action(async(C,H)=>{let N=H.optsWithGlobals(),q=await aQ(N);await MS4(N,q,H)});D.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, unlisted, workspace, group)").action(async(C,H)=>{let N=H.optsWithGlobals(),q=await aQ(N);await PH6(N,q,H)}),D.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(C,H,N)=>{let q=N.optsWithGlobals(),w=await aQ(q),L=Array.isArray(C)?C:[];if(H.pick)G7.write(`${k0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
@@ -5031,8 +5031,8 @@ ${R}
|
|
|
5031
5031
|
|
|
5032
5032
|
`)},async input(){return},async confirm(){return!1},async select(){return},async ask(){return{result:"uncertain",probability:0.5,reason:"AI not available"}}},loadGlobalPlugins:wx0(q),pluginFilter:process.env.PLUGINS??"all"}),asyncDispose:async()=>{}}}),qP4(Q,async(C)=>{let H=C.optsWithGlobals(),N=await aQ(H);H3(C,H);let q=await PB(N,H),w=await q.secretStorage.get("apiKey",N.ampURL);if(!w)throw await q.asyncDispose(),new GA("API key required. Please run `amp login` first.",1);return{configService:q.configService,actorOptions:{apiKey:w,ampURL:N.ampURL,workspaceRoot:process.cwd(),dependencies:q},cleanupTerminal:kN,asyncDispose:q.asyncDispose.bind(q)}}),TP4(Q,async(C)=>{let H=C.optsWithGlobals(),N=await aQ(H);H3(C,H);let q=await PB(N,H);return{settings:N.settings,configService:q.configService,skillService:q.skillService,asyncDispose:q.asyncDispose.bind(q)}}),lR4(Q,async(C)=>{let H=C.optsWithGlobals();return await aQ(H)}),yR4(Q,async(C)=>{let H=await aQ(C);return{settings:H.settings,secretStorage:H.secrets,getThreadDeps:async(N)=>{H3(N,C);let q=await PB(H,C);return{mcpService:q.mcpService,settings:H.settings,asyncDispose:q.asyncDispose.bind(q)}}}}),TF4(Q,aQ),lF4(Q,aQ),tP4(Q,aQ),vP4(Q,aQ);function Z(C,H,N){let w=typeof C.description==="string"?C.description:N===void 0?C.description(!0):C.description(N),L=new R2(H,w),R=tC6(C);if(R)L.default(R);if(L.hidden=rC6(C)||qS4(C),"choices"in C&&Array.isArray(C.choices))if("hiddenChoices"in C){let _=[...C.choices],T=Array.isArray(C.hiddenChoices)?C.hiddenChoices:[],f=new Set([..._,...T]);L.argParser((d)=>{if(!f.has(d))throw new E30(`Allowed choices are ${_.join(", ")}.`);return d})}else L.choices([...C.choices]);return L}for(let C of NS4){switch(C.type){case"flag":{Q.addOption(Z(C,`--${C.long}`)),Q.addOption(Z(C,`--no-${C.long}`,!1));break}case"switch":{Q.addOption(Z(C,`--${C.long}`,!0));break}case"optional-option":{Q.addOption(Z(C,`${"short"in C?`-${C.short}, `:""}--${C.long} [value]`));break}default:{Q.addOption(Z(C,`${"short"in C?`-${C.short}, `:""}--${C.long} <value>`));break}}if("aliases"in C&&Array.isArray(C.aliases))for(let H of C.aliases){let N=new R2(`--${H}`,C.description);N.hidden=!0,N.implies({[C.name]:!0}),Q.addOption(N)}}Q.hook("preAction",(C,H)=>{if(H.optsWithGlobals().takeMeBack)Y6(eC6)});let F=new R2("-x, --execute [message]","Use execute mode, optionally with user message. In execute mode, agent will execute provided prompt (either as argument, or via stdin). Only last assistant message is printed. Enabled automatically when redirecting stdout.").default(!1);Q.addOption(F);let X=new R2("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp(!0);Q.addOption(X);let I=new R2("--stream-json","When used with --execute, output in Claude Code-compatible stream JSON format instead of plain text.").default(!1);Q.addOption(I);let G=new R2("--stream-json-thinking","Include thinking blocks in stream JSON output (non-Claude Code extension). Implies --stream-json.").default(!1);Q.addOption(G);let V=new R2("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);Q.addOption(V);let K=new R2("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);Q.addOption(K);let z=new R2("--archive","When used with --execute, archive the thread after the command finishes.").default(!1);Q.addOption(z);let W=new R2("-l, --label <label>","When used with --execute, add a label to the thread. Repeat the flag for multiple labels.").argParser((C,H)=>{if(H===void 0)return[C];return[...H,C]});return Q.addOption(W),Q.action(async(C,H)=>{let N=C,q=await aQ(N);if(Object.keys(N).forEach((w)=>{let L=NS4.find((R)=>R.name===w);if(L&&qS4(L)&&!sC6(L))G7.write(k0.yellow(`Warning: '--${w}' flag is deprecated
|
|
5033
5033
|
`))}),H.args.length>0)$H6(q,H);await _l0(q,N,H)}),LG4(Q),Q}async function RS4(A,Q){await oD(($)=>_P($,A,Q))}async function JH6(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await rc0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await rc0()).trimEnd(),stdinInput:null}}function UH6(A,Q,$){if(A.remote&&!Q)throw new GA("The -r/--remote flag requires --execute mode",1,'Use: amp --remote --execute "your message"');if(A.streamJson&&!Q)throw new GA("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(A.streamJsonInput&&!Q)throw new GA("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(A.streamJsonInput&&!A.streamJson)throw new GA("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(A.stats&&A.streamJson)throw new GA("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 GA("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(A.archive&&!Q)throw new GA("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 GA("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 GA("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"
|
|
5034
|
-
Or pipe via stdin: echo "your message" | amp --execute`)}function YH6(){zmA([$00.parse({tool:"*",action:"allow"})]),cgA({bypass:!0})}function ZH6(A){if(A.threadId&&!j7(A.threadId))delete A.threadId}async function _l0(A,Q,$){if(Q.headless)return FH6(A,Q,$);let B=await PB(A,Q);if(Q.showWelcome&&Q.hideWelcome)throw await B.asyncDispose(),new GA("Cannot use --show-welcome and --hide-welcome together",1);let E=!A.executeMode&&await aC6();return YH6(),ZH6(Q),XH6(A,Q,$,B,{showNpmMigrationWelcome:E})}async function FH6(A,Q,$){let B=(W,C)=>{let H=Number(process.hrtime.bigint()-C)/1e6,N=_F4();S.info("Startup phase",{phase:W,phaseMs:Math.round(H),sinceMainMs:N===null?void 0:Math.round(N)})};H3($,Q);let E=process.hrtime.bigint(),D=await PB(A,Q);B("runMainThread:createThreadDependencies",E);let{serverStatus:J}=D;if(RC(J))throw Sl0(J,A.ampURL);let U=g9(J)?J:null,Y=U?.user.email,Z=tq(J),F=al(Q,Z);if(F instanceof Error)Y6(F.message);if(U&&ui(Q.mode)&&!ne(Q.mode,Y))throw new GA(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!Y||!CG(Y)))throw new GA("Headless executor mode is only available for Amp employees",1);Jx0();let I=await D.secretStorage.get("apiKey",A.ampURL);if(!I)throw new GA("API key required for headless mode. Please run `amp login` first.",1);let G=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(G&&!j7(G))throw new GA(`Invalid thread ID: ${G}`,1);let V=G?void 0:await jH6({dependencies:D,apiKey:I,visibility:F??void 0}),K=G??V?.threadId;if(!K)throw new GA("Failed to resolve headless thread ID",1);let z=await vI4(K);if(z.status==="already-running")await D.asyncDispose(),await mY(),process.exit(0);try{await HI4({ampURL:A.ampURL,apiKey:I,workspaceRoot:process.cwd(),threadId:K,ownerUserId:V?.ownerUserId,threadVersion:V?.threadVersion,agentMode:V?.agentMode,initialToolDiscovery:Promise.all([D.mcpService.initialized,D.toolboxService.initialized,D.pluginService.initialized]).then(()=>{return}),configService:D.configService,mcpService:D.mcpService,toolService:D.toolService,skillService:D.skillService,pluginService:D.pluginService,pluginPlatform:D.headlessPluginPlatform,setActiveThreadID:(W)=>D.activeThread$.next(W)})}finally{await z.release(),await D.asyncDispose()}await mY(),process.exit(0)}async function XH6(A,Q,$,B,E){let{userInput:D,stdinInput:J}=await JH6(Q),U=!!Q.streamJson||!!Q.streamJsonThinking;UH6({...Q,streamJson:U},A.executeMode,D),H3($,Q),hF4(),Jx0();let Y=Q.threadId,Z=Q.resumeThreadIDs??(Y?[Y]:[]),F=Q.observe?Q3(Q.observe)??c7(Q.observe):void 0,X=await B.serverStatusPromise;if(RC(X))throw Sl0(X,A.ampURL);let I=tq(X),G=()=>pC6(B.configService,hSA.V2_LOCAL_THREAD_CHANGES),V=al(Q,I);if(V instanceof Error)Y6(V.message);if(A.executeMode&&Q.remote){if(!ui(Q.mode))throw new GA("Remote execute mode does not support plugin-defined agent modes",1);if(!g9(X)||!CG(X.user.email))throw new GA("Remote execute mode is only available for Amp employees",1);await UP4(D,J,B.configService,Q.mode),await B.asyncDispose(),await mY(),process.exit(0)}let K=null,z=async()=>{let H=B.consumeDraftNewThreadVisibility();if(H!==null)return H;return K??=(async()=>{let N=await K30(A.settings,process.cwd(),I,V);if(N instanceof Error)Y6(N.message);return N})(),K},W=await B.secretStorage.get("apiKey",A.ampURL);if(!W)throw new GA("API key required. Please run `amp login` first.",1);let C=g9(X)&&CG(X.user.email);if(A.executeMode){if(Z.length>1)throw new GA("Execute mode can only resume one thread.",1);mR4(B.mcpService,A.settings);try{await B.pluginService.initialized;let H=LS4(B.pluginService,Q.mode),N=uS4($,Q),q=await nN(),w=Y?N:Ay0({agentMode:H.agentMode,explicitEffort:N,sessionState:q}),L=Y?void 0:r30(await PP(B.configService),{agentMode:H.agentMode,explicitEffort:N,sessionState:q}),R=Y?void 0:await z(),{threadID:_}=await T30({apiKey:W,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:B,userInput:D,stdinInput:J,stats:!!Q.stats,streamJson:U,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:H.agentMode,reasoningEffort:H.agent?void 0:w,agent:H.agent,labels:Q.label,initialThreadID:Y,initialThreadMeta:R,initialSettings:L});if(await RS4(_,"execute"),Q.archive)await B.threadRemote.archiveThread(_,!0)}finally{await B.asyncDispose()}await mY(),process.exit(0)}else{let H=uS4($,Q),N=await QH6($,B.pluginService,Q.mode),q=E.showNpmMigrationWelcome?"npm-migration":"intro",w=ax0("0.0.
|
|
5035
|
-
`);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,$=process.stdout.isTTY&&process.stderr.isTTY;S.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let B=await tnA({get:async(U)=>{if(U!==sb)return;try{let Y=await SC6(Tl0,"utf-8");return JSON.parse(Y).installationID}catch{return}},set:async(U,Y)=>{if(U!==sb)return;await _C6(qi.dirname(Tl0),{recursive:!0}),await kC6(Tl0,JSON.stringify({installationID:Y},null,2),{mode:384})}},{clientType:"cli",platform:C40()});myA(B);let E=await RP4({...A,workspaceTrust:{current:!0,changes:cx},getHook:process.env.AMP_URL?(U,Y)=>{if(U==="url")return Promise.resolve(process.env.AMP_URL);return Y()}:void 0});if(A.mcpConfig){let U=await hR4(A.mcpConfig);E=gR4(E,U)}let D=qi.dirname(E.getSettingsFilePath());XD4(vy,D),E=_SA(E);let J=await E.get("url","admin")??await E.get("url","global");if(!J)J=P8;if(S.info("Resolved Amp URL",{ampURL:J,settingsFile:E.getSettingsFilePath(),workspaceRoot:E.getWorkspaceRootPath()}),!PO(J))S.info("Targeting custom Amp server",{ampURL:J});return{executeMode:Q,isTTY:$,ampURL:J,settings:E,secrets:uP4(await ac0(A,E))}}function IH6(A){let Q={};for(let $=0;$<A.length;$++){let B=A[$];if(B?.startsWith("--")){let D=B.slice(2).replace(/-([a-z])/g,(U,Y)=>Y.toUpperCase()),J=A[$+1];if(J&&!J.startsWith("--"))Q[D]=J,$++}}return Q}function GH6(A,Q){let $=A.includes("--headless")||A.some((E)=>E.startsWith("--headless=")),B=qi.resolve(Q.logFile??process.env.AMP_LOG_FILE??($?xC6:wc));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:B}}async function VH6(){vF4();let A=IH6(process.argv),Q=GH6(process.argv,A),$=gF4(Q);GB0("silent");let B=process.argv.includes("--no-color"),E=process.argv.includes("--color"),D=process.stdout.isTTY&&process.stderr.isTTY;if(B||!E&&!D)k0.level=0;if(bC6(S),S.info("Starting Amp CLI.",{version:"0.0.
|
|
5034
|
+
Or pipe via stdin: echo "your message" | amp --execute`)}function YH6(){zmA([$00.parse({tool:"*",action:"allow"})]),cgA({bypass:!0})}function ZH6(A){if(A.threadId&&!j7(A.threadId))delete A.threadId}async function _l0(A,Q,$){if(Q.headless)return FH6(A,Q,$);let B=await PB(A,Q);if(Q.showWelcome&&Q.hideWelcome)throw await B.asyncDispose(),new GA("Cannot use --show-welcome and --hide-welcome together",1);let E=!A.executeMode&&await aC6();return YH6(),ZH6(Q),XH6(A,Q,$,B,{showNpmMigrationWelcome:E})}async function FH6(A,Q,$){let B=(W,C)=>{let H=Number(process.hrtime.bigint()-C)/1e6,N=_F4();S.info("Startup phase",{phase:W,phaseMs:Math.round(H),sinceMainMs:N===null?void 0:Math.round(N)})};H3($,Q);let E=process.hrtime.bigint(),D=await PB(A,Q);B("runMainThread:createThreadDependencies",E);let{serverStatus:J}=D;if(RC(J))throw Sl0(J,A.ampURL);let U=g9(J)?J:null,Y=U?.user.email,Z=tq(J),F=al(Q,Z);if(F instanceof Error)Y6(F.message);if(U&&ui(Q.mode)&&!ne(Q.mode,Y))throw new GA(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!Y||!CG(Y)))throw new GA("Headless executor mode is only available for Amp employees",1);Jx0();let I=await D.secretStorage.get("apiKey",A.ampURL);if(!I)throw new GA("API key required for headless mode. Please run `amp login` first.",1);let G=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(G&&!j7(G))throw new GA(`Invalid thread ID: ${G}`,1);let V=G?void 0:await jH6({dependencies:D,apiKey:I,visibility:F??void 0}),K=G??V?.threadId;if(!K)throw new GA("Failed to resolve headless thread ID",1);let z=await vI4(K);if(z.status==="already-running")await D.asyncDispose(),await mY(),process.exit(0);try{await HI4({ampURL:A.ampURL,apiKey:I,workspaceRoot:process.cwd(),threadId:K,ownerUserId:V?.ownerUserId,threadVersion:V?.threadVersion,agentMode:V?.agentMode,initialToolDiscovery:Promise.all([D.mcpService.initialized,D.toolboxService.initialized,D.pluginService.initialized]).then(()=>{return}),configService:D.configService,mcpService:D.mcpService,toolService:D.toolService,skillService:D.skillService,pluginService:D.pluginService,pluginPlatform:D.headlessPluginPlatform,setActiveThreadID:(W)=>D.activeThread$.next(W)})}finally{await z.release(),await D.asyncDispose()}await mY(),process.exit(0)}async function XH6(A,Q,$,B,E){let{userInput:D,stdinInput:J}=await JH6(Q),U=!!Q.streamJson||!!Q.streamJsonThinking;UH6({...Q,streamJson:U},A.executeMode,D),H3($,Q),hF4(),Jx0();let Y=Q.threadId,Z=Q.resumeThreadIDs??(Y?[Y]:[]),F=Q.observe?Q3(Q.observe)??c7(Q.observe):void 0,X=await B.serverStatusPromise;if(RC(X))throw Sl0(X,A.ampURL);let I=tq(X),G=()=>pC6(B.configService,hSA.V2_LOCAL_THREAD_CHANGES),V=al(Q,I);if(V instanceof Error)Y6(V.message);if(A.executeMode&&Q.remote){if(!ui(Q.mode))throw new GA("Remote execute mode does not support plugin-defined agent modes",1);if(!g9(X)||!CG(X.user.email))throw new GA("Remote execute mode is only available for Amp employees",1);await UP4(D,J,B.configService,Q.mode),await B.asyncDispose(),await mY(),process.exit(0)}let K=null,z=async()=>{let H=B.consumeDraftNewThreadVisibility();if(H!==null)return H;return K??=(async()=>{let N=await K30(A.settings,process.cwd(),I,V);if(N instanceof Error)Y6(N.message);return N})(),K},W=await B.secretStorage.get("apiKey",A.ampURL);if(!W)throw new GA("API key required. Please run `amp login` first.",1);let C=g9(X)&&CG(X.user.email);if(A.executeMode){if(Z.length>1)throw new GA("Execute mode can only resume one thread.",1);mR4(B.mcpService,A.settings);try{await B.pluginService.initialized;let H=LS4(B.pluginService,Q.mode),N=uS4($,Q),q=await nN(),w=Y?N:Ay0({agentMode:H.agentMode,explicitEffort:N,sessionState:q}),L=Y?void 0:r30(await PP(B.configService),{agentMode:H.agentMode,explicitEffort:N,sessionState:q}),R=Y?void 0:await z(),{threadID:_}=await T30({apiKey:W,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:B,userInput:D,stdinInput:J,stats:!!Q.stats,streamJson:U,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:H.agentMode,reasoningEffort:H.agent?void 0:w,agent:H.agent,labels:Q.label,initialThreadID:Y,initialThreadMeta:R,initialSettings:L});if(await RS4(_,"execute"),Q.archive)await B.threadRemote.archiveThread(_,!0)}finally{await B.asyncDispose()}await mY(),process.exit(0)}else{let H=uS4($,Q),N=await QH6($,B.pluginService,Q.mode),q=E.showNpmMigrationWelcome?"npm-migration":"intro",w=ax0("0.0.1780605512-ga5182d",B.settingsStorage,{startDelayMs:3000}),L=new dc0(B.mcpService,A.settings.getWorkspaceRootPath()),R=gh(B.configService),_=new Bp0(B.fuzzyServer),T=process.cwd();await aj4({ampURL:A.ampURL,apiKey:W,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??A9(A.ampURL),configService:B.configService,toolService:B.toolService,pluginPlatform:B.pluginPlatform,pluginService:B.pluginService,skillService:B.skillService,mcpService:B.mcpService,readFileSystemDirectory:({uri:f})=>qP({workspaceRoot:T},f),canUseV2LocalThreadChanges:G,completionBuilder:_,updateService:w,workspaceRoot:T,listThreads:()=>R.listThreads(),getThreadFromServer:(f)=>R.getThread(f),getThreadTail:async(f,d)=>{let x=await M4.getThreadTail({thread:f,limit:d},{config:B.configService});if(!x.ok){if(x.error.code==="thread-not-found")return null;throw Error(x.error.message??x.error.code)}return{...x.result.thread.data,messages:x.result.messages}},toolboxes:B.toolboxService.toolboxes,isInternalUser:C,settingsFilePath:B.settingsStorage.getSettingsFilePath(),workspaceSettingsFilePath:B.settingsStorage.getWorkspaceSettingsPath(),mcpTrustHandler:L,setActiveThreadID:(f)=>B.activeThread$.next(f),dispose:()=>{return L.dispose(),w.dispose(),B.asyncDispose()}},{initialThreadIDs:F?[F]:Z,initialUserInput:D||void 0,getDefaultNewThreadVisibility:z,onFirstFrame:Q.ide?OS4:void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!F,hideWelcome:!!Q.hideWelcome,showWelcome:Q.showWelcome,welcomeVariant:q,initialAgentMode:N?.agentMode,initialPluginAgentModeKey:N?.pluginAgentModeKey,initialReasoningEffort:H}),process.exit(0)}}async function aQ(A){if(S.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)G7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
5035
|
+
`);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,$=process.stdout.isTTY&&process.stderr.isTTY;S.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let B=await tnA({get:async(U)=>{if(U!==sb)return;try{let Y=await SC6(Tl0,"utf-8");return JSON.parse(Y).installationID}catch{return}},set:async(U,Y)=>{if(U!==sb)return;await _C6(qi.dirname(Tl0),{recursive:!0}),await kC6(Tl0,JSON.stringify({installationID:Y},null,2),{mode:384})}},{clientType:"cli",platform:C40()});myA(B);let E=await RP4({...A,workspaceTrust:{current:!0,changes:cx},getHook:process.env.AMP_URL?(U,Y)=>{if(U==="url")return Promise.resolve(process.env.AMP_URL);return Y()}:void 0});if(A.mcpConfig){let U=await hR4(A.mcpConfig);E=gR4(E,U)}let D=qi.dirname(E.getSettingsFilePath());XD4(vy,D),E=_SA(E);let J=await E.get("url","admin")??await E.get("url","global");if(!J)J=P8;if(S.info("Resolved Amp URL",{ampURL:J,settingsFile:E.getSettingsFilePath(),workspaceRoot:E.getWorkspaceRootPath()}),!PO(J))S.info("Targeting custom Amp server",{ampURL:J});return{executeMode:Q,isTTY:$,ampURL:J,settings:E,secrets:uP4(await ac0(A,E))}}function IH6(A){let Q={};for(let $=0;$<A.length;$++){let B=A[$];if(B?.startsWith("--")){let D=B.slice(2).replace(/-([a-z])/g,(U,Y)=>Y.toUpperCase()),J=A[$+1];if(J&&!J.startsWith("--"))Q[D]=J,$++}}return Q}function GH6(A,Q){let $=A.includes("--headless")||A.some((E)=>E.startsWith("--headless=")),B=qi.resolve(Q.logFile??process.env.AMP_LOG_FILE??($?xC6:wc));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:B}}async function VH6(){vF4();let A=IH6(process.argv),Q=GH6(process.argv,A),$=gF4(Q);GB0("silent");let B=process.argv.includes("--no-color"),E=process.argv.includes("--color"),D=process.stdout.isTTY&&process.stderr.isTTY;if(B||!E&&!D)k0.level=0;if(bC6(S),S.info("Starting Amp CLI.",{version:"0.0.1780605512-ga5182d",buildTimestamp:"2026-06-04T20:43:42.187Z"}),process.platform==="win32"&&lN())qG4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new GA(V3.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await DH6($).parseAsync(process.argv)}ZD4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await VH6().catch(z30)});async function KH6(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"),kQ.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
5036
5036
|
`);else if(!PO(A.ampURL))kQ.write(`Logging in to ${new URL(A.ampURL).hostname}
|
|
5037
5037
|
`);let B=process.env.AMP_API_KEY;if(B)kQ.write(`API key found in environment variable, storing...
|
|
5038
5038
|
`),await Q.set("apiKey",B,A.ampURL),kQ.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.1780605512-ga5182d",
|
|
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.1780605512-ga5182d"
|
|
12
12
|
},
|
|
13
13
|
"files": [
|
|
14
14
|
"dist/main.js",
|