@sourcegraph/amp 0.0.1778718002-g664bf7 → 0.0.1778732631-gc5875c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +10 -10
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -5291,12 +5291,12 @@ ${z}`))}},error:(E)=>{if(!K)K=!0,D(Error(`Failed to spawn brew: ${E.message}`))}
|
|
|
5291
5291
|
${z}`;if(Z==="pnpm"&&z.includes("Unable to find the global bin directory"))W+=`
|
|
5292
5292
|
|
|
5293
5293
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
5294
|
-
npm install -g ${Y}`;D(Error(W))}},error:(E)=>{if(!U)U=!0,D(Error(`Failed to spawn ${Z}: ${E.message}`))},complete:()=>{if(!U)U=!0,X()}})})}d0();d0();Dz();var Pw5="@ampcode/cli";async function jX0(A,Q,B=Pw5){let J=`${Q||"https://registry.npmjs.org"}/${B}/latest`,Y=new AbortController,Z=setTimeout(()=>Y.abort(),5000);try{let F=await fetch(J,{signal:Y.signal});if(!F.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let X=await F.json(),D=X.version??X["dist-tags"]?.latest;if(!D)return{hasUpdate:!1,currentVersion:A,source:"npm"};let G=xo(A,D),V=G<0,U,K;if(X.time){let E=X.time[A],z=X.time[D],W=Date.now();if(E)U=Math.floor((W-new Date(E).getTime())/3600000);if(z)K=Math.floor((W-new Date(z).getTime())/3600000)}return j.info("NPM version comparison",{currentVersion:A,latestVersion:D,compareResult:G,hasUpdate:V,currentVersionAge:U,latestVersionAge:K}),{hasUpdate:V,latestVersion:D,currentVersion:A,currentVersionAge:U,latestVersionAge:K,source:"npm"}}catch(F){return j.debug("Error checking npm version",{error:F}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(Z)}}var _w5="https://static.ampcode.com/cli/cli-version.txt";async function RX0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${_w5}?t=${Date.now()}`,{signal:Q.signal,cache:"no-store"});if(!$.ok)return{hasUpdate:!1,currentVersion:A,source:"bin"};let J=(await $.text()).trim();if(!J||!/^\d+\.\d+\.\d+/.test(J))return{hasUpdate:!1,currentVersion:A,source:"bin"};let Y=xo(A,J),Z=Y<0;return j.info("Bin version comparison",{currentVersion:A,latestVersion:J,compareResult:Y,hasUpdate:Z}),{hasUpdate:Z,latestVersion:J,currentVersion:A,source:"bin"}}catch($){return j.debug("Error checking bin version",{error:$}),{hasUpdate:!1,currentVersion:A,source:"bin"}}finally{clearTimeout(B)}}var Tw5=604800000;function Cu4(A){if(!A)return null;let Q=typeof A==="number"?A:new Date(A).getTime();if(isNaN(Q))return null;let B=Date.now()-Q;if(B>Tw5)return{ageMs:B};return null}function xo(A,Q){let B=(Z)=>{let[F,X]=Z.split("-");return{parts:F?.split(".").map(Number)||[],label:X}},$=B(A),J=B(Q),Y=Math.max($.parts.length,J.parts.length);for(let Z=0;Z<Y;Z++){let F=$.parts[Z]||0,X=J.parts[Z]||0;if(F<X)return-1;if(F>X)return 1}if($.label===J.label)return 0;if(!$.label&&J.label)return 1;if($.label&&!J.label)return-1;if($.label&&J.label)return $.label<J.label?-1:1;return 0}function fo(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-g?([a-f0-9]+))?/);if(!Q)return null;let B=parseInt(Q[1],10)*1000,$=Q[2],J=B!==0?LF(B):void 0;return{sha:$,timestamp:B,age:J}}catch{return null}}L1();d0();import{readFile as kw5,realpath as Sw5}from"node:fs/promises";import{homedir as vw5}from"node:os";import{dirname as Mu4,join as Pe0}from"node:path";async function Lu4(A){switch(A){case"binary":case"brew":return yw5(ko());case"npm":case"pnpm":case"yarn":case"bun":return xw5();case"bootstrap":return fw5()}}async function yw5(A){let Q=await uD(A,["--version"],5000);if(Q.reason!=="success")return j.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function xw5(){try{let A=process.argv[1];if(!A)return null;let Q=await Sw5(A),B=Mu4(Mu4(Q));return await Ou4(Pe0(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function fw5(){try{let A=process.env.AMP_HOME??Pe0(vw5(),".amp");return await Ou4(Pe0(A,"package","package.json"))}catch(A){return j.debug("failed to read installed version from bootstrap package.json",{error:A}),null}}async function Ou4(A){let Q=await kw5(A,"utf8"),B=JSON.parse(Q);if(!B.name||!He0(B.name))return j.debug("package.json name mismatch",{pkgJsonPath:A,name:B.name}),null;return B.version||null}var bw5=3600000,uw5=5000;function PX0(A,Q,B={}){let $=new g4,J=$.pipe(tA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??bw5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await AU(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await hw5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await AU(uw5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let z=Math.min(K,E);await AU(z),E-=z}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function hw5(A,Q,B,$){let J={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return B.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),J.stop=!0,J;let Y=await Q.get("updates.mode");if(Y==="disabled")return B.debug("checking disabled"),J.stop=!0,J;let Z=await kU(),F=Z==="binary"||Z==="brew",X=F?void 0:await VI();B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F,npmPackageName:X});let D;if(F)D=await RX0(A);else{let U=await kj();D=await jX0(A,U,X)}if(!(D.latestVersion&&D.hasUpdate))return B.debug("no update available"),J;let G=(U)=>{$.next(U),J.emittedVisibleState=!0};if(Z){let U=await Lu4(Z);if(U&&xo(U,D.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:U,latestVersion:D.latestVersion}),J.updatedTo=U,xo(A,U)<0){let K=await xz(U),E={from:A,to:U,externallyUpdated:!0,...K};if(K.status==="same")B.info("on-disk already updated by another instance",E),G("updated");else B.warn("on-disk already updated by another instance, with PATH warning",E),G("updated-with-warning")}return J}}let V=()=>{if(D.currentVersionAge!==void 0&&D.latestVersionAge!==void 0){let U=D.currentVersionAge-D.latestVersionAge,K=0.5;if(Math.abs(U)<0.5)return B.debug("versions too close together, suppressing update warning",{currentVersionAge:D.currentVersionAge,latestVersionAge:D.latestVersionAge,ageDifferenceHours:U}),!0}return!1};if(!Y)Y=Z==="pnpm"?"warn":"auto",B.debug("no configured update mode; selected default based on package manager",{packageManager:Z,mode:Y});if(Z==="brew"){if(!V())G("update-available-brew");return J}if(Z==="binary"&&process.execPath!==ko()){if(B.debug("non-standard binary path, showing warning"),!V())G("update-available-unrecognized-path");return J}if(Y==="warn"){if(!V())G("update-available");return J}if(!Z){if(B.debug("auto-update not supported, falling back to warn mode"),!V())G("update-available");return J}if(Z==="binary"&&process.platform==="win32"){if(B.debug("binary auto-update not supported on Windows, falling back to warn mode"),!V())G("update-available");return J}try{await yo(D.latestVersion,Z),J.updatedTo=D.latestVersion;let U=await xz(D.latestVersion),K={from:D.currentVersion,to:D.latestVersion,...U};if(U.status==="same")B.info("success",K),G("updated");else B.warn("success with warning",K),G("updated-with-warning")}catch(U){G("update-error")}return J}catch(Y){return B.debug("check failed",{error:Y}),J}}Dz();import{stderr as hD}from"node:process";function ju4(A){let Q=new dN().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($)=>{await ze0($.force||!1,$.verbose||!1,"0.0.
|
|
5294
|
+
npm install -g ${Y}`;D(Error(W))}},error:(E)=>{if(!U)U=!0,D(Error(`Failed to spawn ${Z}: ${E.message}`))},complete:()=>{if(!U)U=!0,X()}})})}d0();d0();Dz();var Pw5="@ampcode/cli";async function jX0(A,Q,B=Pw5){let J=`${Q||"https://registry.npmjs.org"}/${B}/latest`,Y=new AbortController,Z=setTimeout(()=>Y.abort(),5000);try{let F=await fetch(J,{signal:Y.signal});if(!F.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let X=await F.json(),D=X.version??X["dist-tags"]?.latest;if(!D)return{hasUpdate:!1,currentVersion:A,source:"npm"};let G=xo(A,D),V=G<0,U,K;if(X.time){let E=X.time[A],z=X.time[D],W=Date.now();if(E)U=Math.floor((W-new Date(E).getTime())/3600000);if(z)K=Math.floor((W-new Date(z).getTime())/3600000)}return j.info("NPM version comparison",{currentVersion:A,latestVersion:D,compareResult:G,hasUpdate:V,currentVersionAge:U,latestVersionAge:K}),{hasUpdate:V,latestVersion:D,currentVersion:A,currentVersionAge:U,latestVersionAge:K,source:"npm"}}catch(F){return j.debug("Error checking npm version",{error:F}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(Z)}}var _w5="https://static.ampcode.com/cli/cli-version.txt";async function RX0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${_w5}?t=${Date.now()}`,{signal:Q.signal,cache:"no-store"});if(!$.ok)return{hasUpdate:!1,currentVersion:A,source:"bin"};let J=(await $.text()).trim();if(!J||!/^\d+\.\d+\.\d+/.test(J))return{hasUpdate:!1,currentVersion:A,source:"bin"};let Y=xo(A,J),Z=Y<0;return j.info("Bin version comparison",{currentVersion:A,latestVersion:J,compareResult:Y,hasUpdate:Z}),{hasUpdate:Z,latestVersion:J,currentVersion:A,source:"bin"}}catch($){return j.debug("Error checking bin version",{error:$}),{hasUpdate:!1,currentVersion:A,source:"bin"}}finally{clearTimeout(B)}}var Tw5=604800000;function Cu4(A){if(!A)return null;let Q=typeof A==="number"?A:new Date(A).getTime();if(isNaN(Q))return null;let B=Date.now()-Q;if(B>Tw5)return{ageMs:B};return null}function xo(A,Q){let B=(Z)=>{let[F,X]=Z.split("-");return{parts:F?.split(".").map(Number)||[],label:X}},$=B(A),J=B(Q),Y=Math.max($.parts.length,J.parts.length);for(let Z=0;Z<Y;Z++){let F=$.parts[Z]||0,X=J.parts[Z]||0;if(F<X)return-1;if(F>X)return 1}if($.label===J.label)return 0;if(!$.label&&J.label)return 1;if($.label&&!J.label)return-1;if($.label&&J.label)return $.label<J.label?-1:1;return 0}function fo(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-g?([a-f0-9]+))?/);if(!Q)return null;let B=parseInt(Q[1],10)*1000,$=Q[2],J=B!==0?LF(B):void 0;return{sha:$,timestamp:B,age:J}}catch{return null}}L1();d0();import{readFile as kw5,realpath as Sw5}from"node:fs/promises";import{homedir as vw5}from"node:os";import{dirname as Mu4,join as Pe0}from"node:path";async function Lu4(A){switch(A){case"binary":case"brew":return yw5(ko());case"npm":case"pnpm":case"yarn":case"bun":return xw5();case"bootstrap":return fw5()}}async function yw5(A){let Q=await uD(A,["--version"],5000);if(Q.reason!=="success")return j.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function xw5(){try{let A=process.argv[1];if(!A)return null;let Q=await Sw5(A),B=Mu4(Mu4(Q));return await Ou4(Pe0(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function fw5(){try{let A=process.env.AMP_HOME??Pe0(vw5(),".amp");return await Ou4(Pe0(A,"package","package.json"))}catch(A){return j.debug("failed to read installed version from bootstrap package.json",{error:A}),null}}async function Ou4(A){let Q=await kw5(A,"utf8"),B=JSON.parse(Q);if(!B.name||!He0(B.name))return j.debug("package.json name mismatch",{pkgJsonPath:A,name:B.name}),null;return B.version||null}var bw5=3600000,uw5=5000;function PX0(A,Q,B={}){let $=new g4,J=$.pipe(tA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??bw5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await AU(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await hw5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await AU(uw5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let z=Math.min(K,E);await AU(z),E-=z}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function hw5(A,Q,B,$){let J={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return B.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),J.stop=!0,J;let Y=await Q.get("updates.mode");if(Y==="disabled")return B.debug("checking disabled"),J.stop=!0,J;let Z=await kU(),F=Z==="binary"||Z==="brew",X=F?void 0:await VI();B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F,npmPackageName:X});let D;if(F)D=await RX0(A);else{let U=await kj();D=await jX0(A,U,X)}if(!(D.latestVersion&&D.hasUpdate))return B.debug("no update available"),J;let G=(U)=>{$.next(U),J.emittedVisibleState=!0};if(Z){let U=await Lu4(Z);if(U&&xo(U,D.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:U,latestVersion:D.latestVersion}),J.updatedTo=U,xo(A,U)<0){let K=await xz(U),E={from:A,to:U,externallyUpdated:!0,...K};if(K.status==="same")B.info("on-disk already updated by another instance",E),G("updated");else B.warn("on-disk already updated by another instance, with PATH warning",E),G("updated-with-warning")}return J}}let V=()=>{if(D.currentVersionAge!==void 0&&D.latestVersionAge!==void 0){let U=D.currentVersionAge-D.latestVersionAge,K=0.5;if(Math.abs(U)<0.5)return B.debug("versions too close together, suppressing update warning",{currentVersionAge:D.currentVersionAge,latestVersionAge:D.latestVersionAge,ageDifferenceHours:U}),!0}return!1};if(!Y)Y=Z==="pnpm"?"warn":"auto",B.debug("no configured update mode; selected default based on package manager",{packageManager:Z,mode:Y});if(Z==="brew"){if(!V())G("update-available-brew");return J}if(Z==="binary"&&process.execPath!==ko()){if(B.debug("non-standard binary path, showing warning"),!V())G("update-available-unrecognized-path");return J}if(Y==="warn"){if(!V())G("update-available");return J}if(!Z){if(B.debug("auto-update not supported, falling back to warn mode"),!V())G("update-available");return J}if(Z==="binary"&&process.platform==="win32"){if(B.debug("binary auto-update not supported on Windows, falling back to warn mode"),!V())G("update-available");return J}try{await yo(D.latestVersion,Z),J.updatedTo=D.latestVersion;let U=await xz(D.latestVersion),K={from:D.currentVersion,to:D.latestVersion,...U};if(U.status==="same")B.info("success",K),G("updated");else B.warn("success with warning",K),G("updated-with-warning")}catch(U){G("update-error")}return J}catch(Y){return B.debug("check failed",{error:Y}),J}}Dz();import{stderr as hD}from"node:process";function ju4(A){let Q=new dN().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($)=>{await ze0($.force||!1,$.verbose||!1,"0.0.1778732631-gc5875c"),process.exit()});A.addCommand(Q,{hidden:!0});let B=new dN("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($)=>{await mw5($.targetVersion)});A.addCommand(B)}function gw5(A){let Q=Boolean(A.isTTY),B=0,$=!1;function J(){if(!Q||!$)return;A.write(`
|
|
5295
5295
|
`),$=!1,B=0}function Y(Z){if(!Q)return;let F=Z.padEnd(B," ");A.write(`\r${F}`),$=!0,B=F.length}return{flushProgressLine:J,renderProgress:Y}}async function mw5(A){let B=process.platform==="win32"&&Tj()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:$,renderProgress:J}=gw5(hD);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")hD.write(a0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
5296
5296
|
|
|
5297
5297
|
`));try{if(!A){hD.write(a0.blue(`Checking for updates...
|
|
5298
|
-
`));let F=!1,X;if(Tj()){let D=await RX0("0.0.
|
|
5299
|
-
`));let V=await xz("0.0.
|
|
5298
|
+
`));let F=!1,X;if(Tj()){let D=await RX0("0.0.1778732631-gc5875c");F=D.hasUpdate,X=D.latestVersion}else{let D=await kj(),G=await VI(),V=await jX0("0.0.1778732631-gc5875c",D,G);F=V.hasUpdate,X=V.latestVersion}if(!F){let D=fo("0.0.1778732631-gc5875c"),G=D?.age?`released ${D.age} ago`:`built ${LF(new Date("2026-05-14T04:27:49.335Z"))} ago`;hD.write(a0.green(`✓ Amp is already up to date on version ${"0.0.1778732631-gc5875c"} (${G})
|
|
5299
|
+
`));let V=await xz("0.0.1778732631-gc5875c",B);if(V.warning)hD.write(`
|
|
5300
5300
|
`+a0.yellow(V.warning)+`
|
|
5301
5301
|
`);process.exit(0)}if(!X)hD.write(a0.yellow("[WARN] could not find latest version")),process.exit(0);A=X}hD.write(a0.blue(`Updating to version ${A}...
|
|
5302
5302
|
`)),await yo(A,void 0,(F)=>{$(),hD.write(a0.dim(`Running: ${F}
|
|
@@ -5702,7 +5702,7 @@ ${$}`).join(`
|
|
|
5702
5702
|
`).length,J=new p({text:new C(A,new v({color:B}))});if($<=mG0)return J;return new K0({width:1/0,height:mG0,child:new m9({autofocus:!1,controller:Q,child:J})})}function ux5(){return new Map([[C1.key("PageUp"),new pG0],[C1.key("PageDown"),new $A1],[C1.ctrl("u"),new pG0],[C1.shift("Home"),new JA1],[C1.shift("End"),new YA1]])}function hx5(A,Q,B){return Math.max(Q,Math.min(A,B))}var ZA1=8,Sn4=1,vn4=ZA1-1;class FA1 extends L4{}class XA1 extends L4{}class dG0 extends L4{}class cG0 extends L4{}class DA1 extends L4{}class GA1 extends L4{}class VA1 extends T0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new yn4}}class yn4 extends _0{messageScroll=new xA;initState(){super.initState(),this.messageScroll.followMode=!1,this.messageScroll.jumpTo(0)}dispose(){this.messageScroll.dispose(),super.dispose()}build(A){let Q=this.widget.props,B=gx5(Q,this.messageScroll),$=mx5(Q.options.message),J=$?new i4({actions:this.buildScrollActions(),child:new Y5({debugLabel:"NeoSelectDialogScrollShortcuts",shortcuts:dx5(),child:B})}):B,Y=[{keys:["↑/↓","j/k"],label:"move"},{keys:["Enter"],label:"select"}];if($)Y.push({keys:["Ctrl+E","Ctrl+Y"],label:"scroll"});return Y.push({keys:["Esc"],label:"cancel"}),new RA({header:Q.options.title,minWidth:64,maxWidth:80,footer:Y,autofocus:!1,onDismiss:Q.onCancel,child:J})}buildScrollActions(){let A=(Q)=>{let B=cx5(this.messageScroll.offset+Q,0,this.messageScroll.maxScrollExtent);this.messageScroll.jumpTo(B)};return new Map([[FA1,new p1(()=>A(-Sn4))],[XA1,new p1(()=>A(Sn4))],[dG0,new p1(()=>A(-vn4))],[cG0,new p1(()=>A(vn4))],[DA1,new p1(()=>this.messageScroll.jumpTo(0))],[GA1,new p1(()=>this.messageScroll.jumpTo(this.messageScroll.maxScrollExtent))]])}}function gx5(A,Q){let B=A.options.options.map((J)=>({value:J,label:J})),$=Math.max(0,B.findIndex((J)=>J.value===A.options.initialValue));return new K2({options:B,selectedIndex:$,body:px5(A.options.message,Q),onSelect:(J)=>{if(J===null){A.onCancel();return}A.onSelect(J)},padding:U0.all(0),showBorder:!1,showDismissalMessage:!1,enableMouseInteraction:!1})}function mx5(A){if(A===void 0)return!1;return A.split(`
|
|
5703
5703
|
`).length>ZA1}function px5(A,Q){if(A===void 0)return;let B=A.split(`
|
|
5704
5704
|
`).length,$=Math.min(B,ZA1);return new K0({width:1/0,height:$,child:new m9({autofocus:!1,controller:Q,child:new p({text:new C(A)})})})}function dx5(){return new Map([[C1.key("PageUp"),new dG0],[C1.key("PageDown"),new cG0],[C1.ctrl("u"),new dG0],[C1.ctrl("d"),new cG0],[C1.ctrl("y"),new FA1],[C1.ctrl("e"),new XA1],[C1.shift("Home"),new DA1],[C1.shift("End"),new GA1]])}function cx5(A,Q,B){return Math.max(Q,Math.min(A,B))}class UA1{options;unregisterPluginCommands=null;pluginCommandSubscriptions=[];pluginErrorToastKeys=new Set;activeDialog=null;queuedDialogs=[];statusItems=new Map;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.cancelPendingDialogs(),this.statusItems.clear(),this.clearPluginPlatformStatusHandlers()}hasBlockingDialog(){return this.activeDialog!==null}buildDialogLayers(){let A=this.activeDialog;if(!A)return[];switch(A.kind){case"input":return[new Cs({key:new uz(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 BA1({key:new uz(A),options:A.options,onConfirm:()=>this.resolveConfirmDialog(A,!0),onCancel:()=>this.resolveConfirmDialog(A,!1)})];case"select":return[new VA1({key:new uz(A),options:A.options,onSelect:(Q)=>this.resolveSelectDialog(A,Q),onCancel:()=>this.resolveSelectDialog(A,void 0)})]}}getStatusItems(){return[...this.statusItems.values()].flatMap((A)=>A.value===void 0?[]:[{pluginURI:A.pluginURI,id:A.id,value:A.value}])}configurePluginPlatform(){let A=this.options.neoContext.pluginPlatform;if(!A)return;A.showToast=(Q)=>this.options.toastController.show(Q,"success"),A.showOpenedURLToast=(Q)=>{this.options.toastController.show(`Opened URL: ${Q}`,"success",8000)},A.appendToThreadHandler=this.options.neoContext.observerOnly?async()=>{throw Error("thread.append is only available from an executor-owned plugin runtime")}:this.options.appendToThread,A.showInputDialog=this.showInputDialog,A.showConfirmDialog=this.showConfirmDialog,A.showSelectDialog=this.showSelectDialog,A.createStatusItemHandler=this.createStatusItem,A.updateStatusItemHandler=this.updateStatusItem,A.removeStatusItemHandler=this.removeStatusItem}clearPluginPlatformStatusHandlers(){let A=this.options.neoContext.pluginPlatform;if(!A)return;if(A.createStatusItemHandler===this.createStatusItem)A.createStatusItemHandler=null;if(A.updateStatusItemHandler===this.updateStatusItem)A.updateStatusItemHandler=null;if(A.removeStatusItemHandler===this.removeStatusItem)A.removeStatusItemHandler=null}subscribePluginCommands(){let A=this.options.neoContext.pluginService;if(!A)return;this.refreshPluginCommands(A.commands.list()),this.pluginCommandSubscriptions=[A.plugins.subscribe((Q)=>{this.removeInactivePluginStatusItems(Q),this.showNewPluginErrorToasts(Q),this.refreshPluginCommands(A.commands.list())}),A.commands.changed.subscribe(()=>{this.refreshPluginCommands(A.commands.list())})]}refreshPluginCommands(A){this.unregisterPluginCommands?.();let B=A.map(($)=>this.createPluginCommand($)).map(($)=>this.options.commandRegistry.register($));this.unregisterPluginCommands=()=>{for(let $ of B)$()}}showNewPluginErrorToasts(A){let Q=new Set;for(let B of A){if(B.status!=="error")continue;if(Ac(B.errorMessage))continue;let $=`${B.uri.toString()}
|
|
5705
|
-
${B.errorMessage??""}`;if(Q.add($),this.pluginErrorToastKeys.has($))continue;this.options.toastController.show(this.formatPluginErrorToast(B),"error",8000)}this.pluginErrorToastKeys=Q}removeInactivePluginStatusItems(A){let Q=new Set(A.filter(($)=>$.status==="active").map(($)=>$.uri.toString())),B=[];for(let[$,J]of this.statusItems){if(Q.has(J.pluginURI))continue;B.push($)}if(B.length===0)return;this.updateStatusItemState(()=>{for(let $ of B)this.statusItems.delete($)})}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.neoContext.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,keywords:["plugin",A.pluginName,A.id],status:A.availability,run:async(Q,B,$)=>{$();try{await this.options.neoContext.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(J){j.error("Neo plugin command failed",{error:J,command:A}),this.options.toastController.show(J instanceof Error?J.message:String(J),"error",5000)}}}}showInputDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"input",options:A,resolve:Q})})};showConfirmDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(!1);return}this.enqueueDialog({kind:"confirm",options:A,resolve:Q})})};showSelectDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"select",options:A,resolve:Q})})};createStatusItem=(A,Q,B)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let $=this.statusItemKey(A,Q),J={pluginURI:A,id:Q};if(B!==void 0)J.value=B;this.statusItems.set($,J)})};updateStatusItem=(A,Q,B)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.set(this.statusItemKey(A,Q),{pluginURI:A,id:Q,value:B})})};removeStatusItem=(A,Q)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.delete(this.statusItemKey(A,Q))})};updateStatusItemState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}statusItemKey(A,Q){return`${A}\x00${Q}`}cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[];for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}enqueueDialog(A){if(this.activeDialog){this.queuedDialogs.push(A);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A})}resolveInputDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveConfirmDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveSelectDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}}Ll();e8();import{readFile as lx5}from"node:fs/promises";import KA1 from"node:os";function ix5(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function xn4(A,Q){try{return{path:Q,contents:$g0(await lx5(A,"utf8"))}}catch{return null}}async function lG0(A,Q){let B=[],$=ix5(),J=await r4.getThread({thread:Q},{config:A.configService}),Y=J.ok?J.result.thread.data:null;B.push({path:`${$}/thread.json`,contents:JSON.stringify(ZJ(Y),null,2)});let Z=await xn4(Ex(Q),`${$}/logs/${Q}.log`);if(Z)B.push(Z);let F=await xn4(A.settingsFilePath,`${$}/settings/global.json`);if(F)B.push(F);let X=await kU()??"unknown",D=await r4.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778718002-g664bf7",clientOS:`${KA1.platform()} ${KA1.release()} ${KA1.arch()}`,installMethod:X}},{config:A.configService});if(!D.ok)throw Error(`Failed to submit report: ${D.error.message}`);return D.result.reportID}class EA1{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 B=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let B=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.backStack.pop();this.forwardStack.push(Q)}}}}class iG0 extends w5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new zA1(this.offstage)}updateRenderObject(A){if(A instanceof zA1)A.offstage=this.offstage}}class zA1 extends Y4{_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;H4(!!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 B=A.constrain(Q.size.width,Q.size.height);this.setSize(B.width,B.height),Q.setOffset(0,0)}else{let B=A.smallest;this.setSize(B.width,B.height)}super.performLayout()}paint(A,Q,B){if(this._offstage)return;super.paint(A,Q,B)}hitTest(A,Q,B,$){if(this._offstage)return!1;return super.hitTest(A,Q,B,$)}}class Ms{_state=null;_attach(A){this._state=A}_detach(){this._state=null}push(A){this._state?.push(A)}pushWithDismiss(A){this._state?.pushWithDismiss(A)}pop(){return this._state?.pop()??!1}get canPop(){return this._state?.canPop??!1}}class WA1 extends T0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new fn4}}class fn4 extends _0{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 bj,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new bj,B=this.makeScopedDismiss(Q),$=A(B);this.setState(()=>{this.entries.push({key:Q,widget:$,dismiss:B})})}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 iG0({offstage:this.entries.length>0,child:this.widget.root}));for(let B=0;B<this.entries.length;B++){let $=this.entries[B],J=B===this.entries.length-1,Y=J?new a4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new iG0({key:$.key,offstage:!J,child:Y}))}return new $A({fit:"expand",children:Q})}}class qA1 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=nx5(Q);return new RA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:U0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new X5({items:Q,showBorder:!1,getLabel:($)=>{let J=HA1($);return $.keywords&&$.keywords.length>0?`${J} ${$.keywords.join(" ").toLowerCase()}`:J},sortItems:($,J,Y)=>{if(Y===""){let G=$.item.status.type==="disabled"?1:0,V=J.item.status.type==="disabled"?1:0;if(G!==V)return G-V;let U=$.item.sortBoost??0,K=J.item.sortBoost??0;if(U!==K)return K-U;let E=$.item.noun?.toLowerCase()??"",z=J.item.noun?.toLowerCase()??"";if(E!==z)return E<z?-1:1;return 0}let Z=BR($.item.verb.toLowerCase(),Y),F=BR(J.item.verb.toLowerCase(),Y);if(Z!==F)return F-Z;let X=BR(HA1($.item),Y),D=BR(HA1(J.item),Y);if(X!==D)return D-X;return J.score-$.score},isItemDisabled:($)=>$.status.type==="disabled",buildDisabledReasonWidget:($,J)=>{if($.status.type!=="disabled")return;let{colors:Y}=P0.of(J);return new p({text:new C($.status.reason,new v({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new bn4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class bn4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=P0.of(Y),{colors:F,app:X}=Z,D=B?X.selectionBackground:void 0,G=B?X.selectionForeground:F.foreground,V=B?G:F.mutedForeground,U=new p({text:new C(Q.noun?.toLowerCase()??"",new v({color:V,dim:$||!B})),textAlign:"right"}),K=[new C(Q.verb.toLowerCase(),new v({color:G,bold:!0,dim:$}))];if($)K.push(new C(" (unavailable)",new v({color:G,dim:!0})));let E=p.spans(K),z=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)z.push({child:ax5(Q.shortcut,Z,$)});return new un4({columns:z,padding:U0.horizontal(1),backgroundColor:D})}}function HA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function nx5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,y4(B.noun)):Q},0)}function ax5(A,Q,B){let{colors:$,app:J}=Q,Y=new v({color:$.mutedForeground,dim:B}),Z=[];for(let F of A.modifiers()){if(Z.length>0)Z.push(new C(" ",Y));Z.push(new C(F,new v({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new C(" ",Y));return Z.push(new C(A.key,new v({color:J.keybind,bold:!0,dim:B}))),p.spans(Z)}class un4 extends H1{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:B=2,padding:$,backgroundColor:J}=this.props,Y=[];for(let F=0;F<Q.length;F++){let X=Q[F];if(F>0&&B>0)Y.push(new K0({width:B}));if(X.fixedWidth!==void 0)Y.push(new K0({width:X.fixedWidth,child:X.child}));else if(X.expanded)Y.push(new _1({child:X.child}));else Y.push(X.child)}let Z=new s0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new m0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class NA1{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#B(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#B()}}findByID(A){return this.#A.find((Q)=>Q.id===A)}runByID(A,Q){let B=this.findByID(A);if(!B||B.status.type!=="enabled")return!1;return B.run(new Ms,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#B(){for(let A of this.#Q)A()}}class N7 extends q6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=N7.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(N7)?.commandRegistry??null}}class IA1 extends T0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new hn4}}class hn4 extends _0{modalStack=new Ms;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=N7.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=N7.of(A).commands,B=new qA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new WA1({root:B,controller:this.modalStack})}}var wA1=[{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"]},{input:"S",keys:["Alt"]}]},{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"]}]}],CA1=[{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 nG0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=a1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[F,X]=this.renderRow(Z),D;if(J)D=new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new x0({padding:U0.only({left:4}),child:X})]});else D=new s0({crossAxisAlignment:"start",children:[new _1({flex:1,child:F}),new K0({width:1}),new _1({flex:1,child:X})]});Y.push(new x0({padding:U0.horizontal(6),child:D}))}return new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class MA1 extends T0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:B}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=B??!0}createState(){return new gn4}}class gn4 extends _0{scrollController;initState(){this.scrollController=new xA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=O1.of(A).colorScheme,J=P0.of(A).app,Y=a1.of(A),Z=new v({color:B.primary,bold:!0}),F=new v({color:B.secondary,bold:!0}),X=new v({color:J.keybind}),D=new v({color:J.command}),G=new v({color:B.foreground}),V=new v({color:B.foreground}),U=Y.size.width,K=Y.size.height,E=U-4,z=K-4,W=Math.max(40,Math.min(80,E)),H=new Set(["permissions-disable"]),N=[...this.widget.commands.filter((O)=>{let _=O.noun?.toLowerCase();return _!=="dev"&&_!=="debug"&&!O.id.startsWith("debug-")&&!H.has(O.id)})].sort((O,_)=>{let S=(O.noun??"").toLowerCase(),T=(_.noun??"").toLowerCase(),x=S.localeCompare(T);if(x!==0)return x;let h=O.verb.toLowerCase(),u=_.verb.toLowerCase(),k=h.localeCompare(u);if(k!==0)return k;return O.id.localeCompare(_.id)}),I=new fA({autofocus:!0,controller:this.scrollController,child:new m0({constraints:new I1(W,W,0,Number.POSITIVE_INFINITY),child:new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new t1({child:new p({text:new C(`Amp CLI - Help & Keyboard Shortcuts
|
|
5705
|
+
${B.errorMessage??""}`;if(Q.add($),this.pluginErrorToastKeys.has($))continue;this.options.toastController.show(this.formatPluginErrorToast(B),"error",8000)}this.pluginErrorToastKeys=Q}removeInactivePluginStatusItems(A){let Q=new Set(A.filter(($)=>$.status==="active").map(($)=>$.uri.toString())),B=[];for(let[$,J]of this.statusItems){if(Q.has(J.pluginURI))continue;B.push($)}if(B.length===0)return;this.updateStatusItemState(()=>{for(let $ of B)this.statusItems.delete($)})}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.neoContext.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,keywords:["plugin",A.pluginName,A.id],status:A.availability,run:async(Q,B,$)=>{$();try{await this.options.neoContext.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(J){j.error("Neo plugin command failed",{error:J,command:A}),this.options.toastController.show(J instanceof Error?J.message:String(J),"error",5000)}}}}showInputDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"input",options:A,resolve:Q})})};showConfirmDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(!1);return}this.enqueueDialog({kind:"confirm",options:A,resolve:Q})})};showSelectDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"select",options:A,resolve:Q})})};createStatusItem=(A,Q,B)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let $=this.statusItemKey(A,Q),J={pluginURI:A,id:Q};if(B!==void 0)J.value=B;this.statusItems.set($,J)})};updateStatusItem=(A,Q,B)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.set(this.statusItemKey(A,Q),{pluginURI:A,id:Q,value:B})})};removeStatusItem=(A,Q)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.delete(this.statusItemKey(A,Q))})};updateStatusItemState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}statusItemKey(A,Q){return`${A}\x00${Q}`}cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[];for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}enqueueDialog(A){if(this.activeDialog){this.queuedDialogs.push(A);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A})}resolveInputDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveConfirmDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveSelectDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}}Ll();e8();import{readFile as lx5}from"node:fs/promises";import KA1 from"node:os";function ix5(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function xn4(A,Q){try{return{path:Q,contents:$g0(await lx5(A,"utf8"))}}catch{return null}}async function lG0(A,Q){let B=[],$=ix5(),J=await r4.getThread({thread:Q},{config:A.configService}),Y=J.ok?J.result.thread.data:null;B.push({path:`${$}/thread.json`,contents:JSON.stringify(ZJ(Y),null,2)});let Z=await xn4(Ex(Q),`${$}/logs/${Q}.log`);if(Z)B.push(Z);let F=await xn4(A.settingsFilePath,`${$}/settings/global.json`);if(F)B.push(F);let X=await kU()??"unknown",D=await r4.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778732631-gc5875c",clientOS:`${KA1.platform()} ${KA1.release()} ${KA1.arch()}`,installMethod:X}},{config:A.configService});if(!D.ok)throw Error(`Failed to submit report: ${D.error.message}`);return D.result.reportID}class EA1{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 B=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let B=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.backStack.pop();this.forwardStack.push(Q)}}}}class iG0 extends w5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new zA1(this.offstage)}updateRenderObject(A){if(A instanceof zA1)A.offstage=this.offstage}}class zA1 extends Y4{_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;H4(!!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 B=A.constrain(Q.size.width,Q.size.height);this.setSize(B.width,B.height),Q.setOffset(0,0)}else{let B=A.smallest;this.setSize(B.width,B.height)}super.performLayout()}paint(A,Q,B){if(this._offstage)return;super.paint(A,Q,B)}hitTest(A,Q,B,$){if(this._offstage)return!1;return super.hitTest(A,Q,B,$)}}class Ms{_state=null;_attach(A){this._state=A}_detach(){this._state=null}push(A){this._state?.push(A)}pushWithDismiss(A){this._state?.pushWithDismiss(A)}pop(){return this._state?.pop()??!1}get canPop(){return this._state?.canPop??!1}}class WA1 extends T0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new fn4}}class fn4 extends _0{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 bj,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new bj,B=this.makeScopedDismiss(Q),$=A(B);this.setState(()=>{this.entries.push({key:Q,widget:$,dismiss:B})})}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 iG0({offstage:this.entries.length>0,child:this.widget.root}));for(let B=0;B<this.entries.length;B++){let $=this.entries[B],J=B===this.entries.length-1,Y=J?new a4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new iG0({key:$.key,offstage:!J,child:Y}))}return new $A({fit:"expand",children:Q})}}class qA1 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=nx5(Q);return new RA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:U0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new X5({items:Q,showBorder:!1,getLabel:($)=>{let J=HA1($);return $.keywords&&$.keywords.length>0?`${J} ${$.keywords.join(" ").toLowerCase()}`:J},sortItems:($,J,Y)=>{if(Y===""){let G=$.item.status.type==="disabled"?1:0,V=J.item.status.type==="disabled"?1:0;if(G!==V)return G-V;let U=$.item.sortBoost??0,K=J.item.sortBoost??0;if(U!==K)return K-U;let E=$.item.noun?.toLowerCase()??"",z=J.item.noun?.toLowerCase()??"";if(E!==z)return E<z?-1:1;return 0}let Z=BR($.item.verb.toLowerCase(),Y),F=BR(J.item.verb.toLowerCase(),Y);if(Z!==F)return F-Z;let X=BR(HA1($.item),Y),D=BR(HA1(J.item),Y);if(X!==D)return D-X;return J.score-$.score},isItemDisabled:($)=>$.status.type==="disabled",buildDisabledReasonWidget:($,J)=>{if($.status.type!=="disabled")return;let{colors:Y}=P0.of(J);return new p({text:new C($.status.reason,new v({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new bn4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class bn4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=P0.of(Y),{colors:F,app:X}=Z,D=B?X.selectionBackground:void 0,G=B?X.selectionForeground:F.foreground,V=B?G:F.mutedForeground,U=new p({text:new C(Q.noun?.toLowerCase()??"",new v({color:V,dim:$||!B})),textAlign:"right"}),K=[new C(Q.verb.toLowerCase(),new v({color:G,bold:!0,dim:$}))];if($)K.push(new C(" (unavailable)",new v({color:G,dim:!0})));let E=p.spans(K),z=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)z.push({child:ax5(Q.shortcut,Z,$)});return new un4({columns:z,padding:U0.horizontal(1),backgroundColor:D})}}function HA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function nx5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,y4(B.noun)):Q},0)}function ax5(A,Q,B){let{colors:$,app:J}=Q,Y=new v({color:$.mutedForeground,dim:B}),Z=[];for(let F of A.modifiers()){if(Z.length>0)Z.push(new C(" ",Y));Z.push(new C(F,new v({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new C(" ",Y));return Z.push(new C(A.key,new v({color:J.keybind,bold:!0,dim:B}))),p.spans(Z)}class un4 extends H1{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:B=2,padding:$,backgroundColor:J}=this.props,Y=[];for(let F=0;F<Q.length;F++){let X=Q[F];if(F>0&&B>0)Y.push(new K0({width:B}));if(X.fixedWidth!==void 0)Y.push(new K0({width:X.fixedWidth,child:X.child}));else if(X.expanded)Y.push(new _1({child:X.child}));else Y.push(X.child)}let Z=new s0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new m0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class NA1{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#B(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#B()}}findByID(A){return this.#A.find((Q)=>Q.id===A)}runByID(A,Q){let B=this.findByID(A);if(!B||B.status.type!=="enabled")return!1;return B.run(new Ms,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#B(){for(let A of this.#Q)A()}}class N7 extends q6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=N7.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(N7)?.commandRegistry??null}}class IA1 extends T0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new hn4}}class hn4 extends _0{modalStack=new Ms;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=N7.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=N7.of(A).commands,B=new qA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new WA1({root:B,controller:this.modalStack})}}var wA1=[{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"]},{input:"S",keys:["Alt"]}]},{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"]}]}],CA1=[{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 nG0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=a1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[F,X]=this.renderRow(Z),D;if(J)D=new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new x0({padding:U0.only({left:4}),child:X})]});else D=new s0({crossAxisAlignment:"start",children:[new _1({flex:1,child:F}),new K0({width:1}),new _1({flex:1,child:X})]});Y.push(new x0({padding:U0.horizontal(6),child:D}))}return new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class MA1 extends T0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:B}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=B??!0}createState(){return new gn4}}class gn4 extends _0{scrollController;initState(){this.scrollController=new xA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=O1.of(A).colorScheme,J=P0.of(A).app,Y=a1.of(A),Z=new v({color:B.primary,bold:!0}),F=new v({color:B.secondary,bold:!0}),X=new v({color:J.keybind}),D=new v({color:J.command}),G=new v({color:B.foreground}),V=new v({color:B.foreground}),U=Y.size.width,K=Y.size.height,E=U-4,z=K-4,W=Math.max(40,Math.min(80,E)),H=new Set(["permissions-disable"]),N=[...this.widget.commands.filter((O)=>{let _=O.noun?.toLowerCase();return _!=="dev"&&_!=="debug"&&!O.id.startsWith("debug-")&&!H.has(O.id)})].sort((O,_)=>{let S=(O.noun??"").toLowerCase(),T=(_.noun??"").toLowerCase(),x=S.localeCompare(T);if(x!==0)return x;let h=O.verb.toLowerCase(),u=_.verb.toLowerCase(),k=h.localeCompare(u);if(k!==0)return k;return O.id.localeCompare(_.id)}),I=new fA({autofocus:!0,controller:this.scrollController,child:new m0({constraints:new I1(W,W,0,Number.POSITIVE_INFINITY),child:new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new t1({child:new p({text:new C(`Amp CLI - Help & Keyboard Shortcuts
|
|
5706
5706
|
`,Z)})}),new K0({height:1}),new x0({padding:U0.horizontal(2),child:new p({text:new C(`Editor Shortcuts
|
|
5707
5707
|
`,F)})}),new nG0({items:wA1.filter((O)=>O.submitOnEnterOnly===void 0||O.submitOnEnterOnly===this.widget.submitOnEnter),renderRow:(O)=>{let _=[];for(let T of O.methods){let x=this.buildCleanKeyCombination(T);_.push(x)}let S=_.join(", ");return[new p({text:new C(S,X)}),new p({text:new C(O.description,G)})]}}),new K0({height:1}),new x0({padding:U0.horizontal(2),child:new p({text:new C(`Scrolling & Navigation
|
|
5708
5708
|
`,F)})}),new nG0({items:CA1,renderRow:(O)=>{let _=[];for(let T of O.methods){let x=this.buildCleanKeyCombination(T);_.push(x)}let S=_.join(", ");return[new p({text:new C(S,X)}),new p({text:new C(O.description,G)})]}}),new K0({height:1}),new x0({padding:U0.horizontal(2),child:new p({text:new C(`Command Palette Commands
|
|
@@ -5799,7 +5799,7 @@ Ctrl-X, Y, Z to unlock`;if(this.widget.centerContent)h=this.widget.centerContent
|
|
|
5799
5799
|
`))}function Km5(A,Q){let{colors:B,app:$}=Q;switch(A){case"pending":return{icon:"◌",color:B.warning};case"registered":return{icon:"•",color:B.mutedForeground};case"failed":return{icon:"✗",color:$.toolError};case"duplicate":return{icon:"◇",color:B.warning};default:return{icon:"?",color:B.foreground}}}function zs4(A,Q){let B=A.replace(/\s+/g," ").trim();if(y4(B)<=Q)return B;let $="...",J=y4($);if(Q<=J)return qJ($,Q);return`${qJ(B,Q-J,!0,"")}${$}`}var Y51="https://ampcode.com/news/neo",Z51=[{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:Y51,href:Y51},"","",{text:"Need old Amp for a bit? Use ",keybind:"amp --take-me-back"}]}];function Em5(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:Y51,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function zm5(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var cf=50,NR=40,$51=1000,Wm5=420,Hm5=760,qm5=-250,Nm5=1100,jV0=33,Ns4=0.999,Im5=2.1,wm5=720,Cm5=420,Rs4="Meet the new",Ps4="Amp",_s4="CLI",F51=w4(Rs4).length,Mm5=w4(Ps4).length,Lm5=w4(_s4).length,RV0={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},Is4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},ws4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},Cs4=[RV0,Is4,ws4,RV0,Is4,ws4,RV0],Om5=RV0;class X51 extends T0{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??zm5(),this.introStages=this.variant==="npm-migration"?Em5(this.binaryInstallCommand):Z51,this.dismissible=this.variant!=="npm-migration"}createState(){return new Ts4}}class Ts4 extends _0{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=$51;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 f9(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=$Z(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=Ns4,this.firstStageHintVisible=this.animationProgress>=Ns4,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:$51,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=$Z(A/Hm5);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},jV0)}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 B=performance.now()-this.stageTransitionStartedAt,$=$Z(B/Wm5);if(this.setState(()=>{if(this.stageTransitionProgress=$,$>=1)this.previousIntroStage=null}),$>=1)this.stopStageTransitionTimer()},jV0)}startProgressAnimation({from:A,to:Q,durationMs:B,onComplete:$}){this.stopAnimation(),this.startedAt=performance.now(),this.animationStartProgress=A,this.animationTargetProgress=Q,this.animationDurationMs=B,this.onAnimationComplete=$,this.animationProgress=A,this.animationTimer=setInterval(()=>{let J=performance.now()-this.startedAt,Y=$Z(J/this.animationDurationMs),Z=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*lf(Y);if(this.setState(()=>{this.animationProgress=Z}),Y>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},jV0)}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,$51+qm5),Q=A+Nm5;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?$Z((A-this.firstStageTitleRevealStartedAt)/wm5):this.firstStageTitleRevealProgress,B=this.firstStageHintRevealStartedAt?$Z((A-this.firstStageHintRevealStartedAt)/Cm5):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=B}),Q>=1&&B>=1)this.stopFirstStageRevealTimer()},jV0)}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=Ms4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:Ls4(Ms4(this.previousIntroStage),A,lf(this.stageTransitionProgress));return this.dismissProgress>0?Ls4(Q,Om5,lf(this.dismissProgress)):Q}build(A){let Q=O1.of(A).colorScheme,B=P0.of(A),$=this.currentOrbPalette(),J=QB(1,"frontier",$),Y=a1.of(A).size,F=this.widget.animationProgress??this.animationProgress,X=Math.max(Y.width/cf,Y.height/NR)*Im5,D=X+(1-X)*F,G=lf(this.dismissProgress),V=Math.max(cf,Math.round(cf*D)),U=Math.max(NR,Math.round(NR*D)),K=Math.round((Y.width-V)/2),E=Math.round((Y.height-U)/2),z=Math.max(0,Math.floor((Y.width-cf)/2)),W=-Math.floor(NR/2),H=Math.round(K+(z-K)*F),q=Math.round(E+(W-E)*F),N=H+V/2,I=q+U/2,w=jm5({dismissProgress:this.dismissProgress,easedDismissProgress:G,introOrbScale:D,normalOrbCenterX:N,normalOrbCenterY:I,size:Y}),L=Math.max(cf,Math.round(cf*w.orbScale)),O=Math.max(NR,Math.round(NR*w.orbScale)),_=w.orbCenterX,S=w.orbCenterY,T=Math.round(_-L/2),x=Math.round(S-O/2),h=Math.max(3,Math.min(Y.height-5,Math.floor(NR/2)+2)),u=Math.max(h+3,Y.height-3),k=w.textDissolveProgress,f=this.isFinalIntroStage()?w.backdropDissolveProgress:0,d=this.firstStageTitleVisible&&k<1,c=d&&this.firstStageHintVisible,g=c&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),l=this.introStage===0?this.firstStageTitleRevealProgress:1,a=this.introStage===0?this.firstStageHintRevealProgress:1,A0=Math.max(24,Math.min(74,Y.width-4)),I0=Math.min(12,Math.max(8,Y.height-h-6)),V0=Math.max(0,Math.floor((Y.width-A0)/2)),N0=Math.max(0,Math.min(Y.height-I0,Math.floor(Y.height*0.55-I0/2))),j0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new hx({width:L,height:O,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:$.primary,secondaryColor:$.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new hx({width:L,height:O,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:$.primary,secondaryColor:$.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new a4({autofocus:!0,canRequestFocus:!0,debugLabel:"NeoWelcomeTakeover",onKey:(Q0)=>{if(Q0.key==="Enter")return this.advanceIntroStage(),"handled";if(!this.widget.dismissible&&Q0.key==="c"&&Q0.ctrlKey)return this.widget.onQuit?.(),"handled";if(!this.widget.dismissible&&Q0.key==="q")return this.widget.onQuit?.(),"handled";if((Q0.key===" "||Q0.key==="Space")&&!this.isFinalIntroStage())return this.advanceIntroStage(),"handled";if(Q0.key==="Escape"||Q0.key==="Esc"){if(!this.widget.dismissible)return this.widget.onQuit?.(),"handled";return this.dismissFromFinalIntroStage()?"handled":"ignored"}if(Q0.key==="ArrowRight")return this.nextIntroStage(),"handled";if(Q0.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new $A({fit:"expand",children:[new ks4({color:Q.background,dissolveProgress:f}),new $A({fit:"expand",children:[new k1({onClick:()=>{},child:K0.expand()}),new zA({left:T,top:x,width:L,height:O,child:j0}),...d?[new zA({left:V0,top:N0,width:A0,height:I0,child:Pm5({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:A0,height:I0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:J,link:B.app.link,keybind:B.app.keybind,titleRevealProgress:l,dissolveProgress:k,context:A})})]:[],...c?[...g?[new zA({left:V0,top:Math.max(0,u-1),width:A0,height:1,child:new p({text:ym5({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:k}),textAlign:"center"})})]:[],new zA({left:V0,top:u,width:A0,height:1,child:fm5({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:B.app.keybind,revealProgress:a,dissolveProgress:k,context:A})})]:[]]})]})})}}class ks4 extends G8{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new Ss4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class Ss4 extends Y4{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;H4(!!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,B=0){let $=Math.floor(Q+this.offset.x),J=Math.floor(B+this.offset.y),Y=Math.floor(this.size.width),Z=Math.floor(this.size.height),F={bg:this.color},X=$Z(this.dissolveProgress);if(X<=0){A.fill($,J,Y,Z," ",F);return}if(X>=1)return;for(let D=0;D<Z;D++)for(let G=0;G<Y;G++)if(!Rm5(G,D,Y,Z,X))A.fill($+G,J+D,1,1," ",F)}}function $Z(A){return Math.min(1,Math.max(0,A))}function lf(A){return 1-(1-A)**3}function Ms4(A){return Cs4[A]??Cs4[0]}function Ls4(A,Q,B){return{primary:uj(A.primary,Q.primary,B),secondary:uj(A.secondary,Q.secondary,B)}}function jm5({dismissProgress:A,easedDismissProgress:Q,introOrbScale:B,normalOrbCenterX:$,normalOrbCenterY:J,size:Y}){return{orbScale:B+(B*0.86-B)*Q,orbCenterX:$+(Y.width*0.54-$)*Q,orbCenterY:J-Y.height*0.44*Q,textDissolveProgress:$Z(A/0.52),backdropDissolveProgress:lf($Z((A-0.12)/0.88))}}function Rm5(A,Q,B,$,J){let Y=$<=1?0:Q/($-1),Z=vs4(A+Q*Math.max(1,B));return(1-Y)*0.72+Z*0.28<J}function Pm5({introStages:A,stage:Q,previousStage:B,progress:$,direction:J,width:Y,height:Z,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E}){if(B===null||$>=1)return J51({introStages:A,stage:Q,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E});let z=lf($),W=J*Math.round((1-z)*Y),H=-J*Math.round(z*Y);return new dz(new $A({fit:"expand",children:[new zA({left:H,top:0,width:Y,height:Z,child:J51({introStages:A,stage:B,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:B===0?1:U,dissolveProgress:K,context:E})}),new zA({left:W,top:0,width:Y,height:Z,child:J51({introStages:A,stage:Q,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E})})]}))}function J51({introStages:A,stage:Q,foreground:B,mutedForeground:$,accent:J,link:Y,keybind:Z,titleRevealProgress:F,dissolveProgress:X,context:D}){let G=A[Q]??A[0]??Z51[0],V=new v({color:J,bold:!0}),U=new v({color:B}),K=A===Z51&&Q===0,E=[...G.title===null?[]:[new p({text:K?PV0(km5({progress:F,foreground:J,pulseColor:J}),X):new C(X$(G.title,X),V),textAlign:"center"})],...G.body.length>0?[_m5()]:[],...G.body.map((z)=>Tm5(z,U,$,Y,Z,X,D))];return new t1({child:new x0({padding:U0.horizontal(1),child:new y0({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:E})})})}function _m5(){return K0.height(1)}function Tm5(A,Q,B,$,J,Y,Z){if(typeof A==="string")return new p({text:new C(X$(A,Y),Q),textAlign:"center"});if("codeBlock"in A)return new F3({onCopy:(F,X)=>{if(X)g5.success(Z,"Copied to clipboard",2000)},child:new y0({mainAxisSize:"min",children:A.codeBlock.map((F)=>new p({text:new C(X$(F,Y),new v({color:J})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let F=new p({text:new C("",void 0,[new C(X$(A.text,Y),new v({color:B,dim:!0})),new C(X$(A.keybind,Y,w4(A.text).length),new v({color:J}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new t1({child:new F3({child:F})});return F}if("highlightText"in A){let F=DA.createSpan(A.href,A.linkText,new v({color:$,underline:!0})),X=AG.of(Z),D=new C("",void 0,[new C(A.text,Q),new C(A.highlightText,new v({color:J})),new C(A.textAfterHighlight,Q),new C(F.text,F.style,F.children,F.hyperlink,()=>{aA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new C(A.textAfter,Q)]);return new p({text:PV0(D,Y),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new y0({mainAxisSize:"min",children:[new p({text:new C(X$(A.text,Y),Q),textAlign:"center"}),new t1({child:new s0({mainAxisSize:"min",children:[DA.createWidget(Z,A.href,X$(A.linkText,Y),new v({color:$,underline:!0})),new p({text:new C(X$(A.textAfter,Y),Q)})]})})]});let F=DA.createSpan(A.href,A.linkText,new v({color:$,underline:!0})),X=AG.of(Z),D=new C("",void 0,[new C(A.text,Q),new C(F.text,F.style,F.children,F.hyperlink,()=>{aA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new C(A.textAfter,Q)]);return new p({text:PV0(D,Y),textAlign:"center"})}if(Y>0)return new p({text:new C(X$(A.text,Y),new v({color:$,underline:!0})),textAlign:"center"});return new t1({child:DA.createWidget(Z,A.href,A.text,new v({color:$,underline:!0}))})}function km5({progress:A,foreground:Q,pulseColor:B}){let $=new v({color:Q,bold:!0}),J=new v({color:vm5({progress:A,foreground:Q,pulseColor:B}),bold:!0});return new C("",void 0,[new C(Sm5(A).padEnd(F51," "),$),new C(" ",$),new C(Os4(Ps4,Mm5,A,0.72),$),new C(" ",$),new C(Os4(_s4,Lm5,A,0.88),J)])}function Sm5(A){let Q=w4(Rs4),B=Math.min(F51,Math.ceil($Z(A/0.62)*F51));return Q.slice(0,B).join("")}function Os4(A,Q,B,$){return B>=$?A:"".padEnd(Q," ")}function vm5({progress:A,foreground:Q,pulseColor:B}){if(A<0.88||A>=1)return Q;let $=$Z((A-0.88)/0.12);return Math.cos($*Math.PI*4)*(1-$)>0.12?B:Q}function ym5({stage:A,featureStageCount:Q,foreground:B,dissolveProgress:$}){return new C(X$(`${A}/${Q}`,$),new v({color:B,dim:!0}))}function xm5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y}){let Z=new v({color:$}),F=new v({color:B,dim:!0}),X=Q?A?"Enter":"Space":"Esc",D=Q?A?" to get started":" to continue":" to quit, or use ",G=Q?"":"amp --take-me-back",V=Q?"":" to use the old version",U=`${D}${G}${V}`;if(!Q)return new C("",void 0,[new C(X,Z),new C(D,F),new C(G,Z),new C(V,F)]);let K=js4(X,J),E=js4(U,$Z((J*(w4(X).length+w4(U).length)-w4(X).length)/w4(U).length));return new C("",void 0,[new C(X$(K,Y),Z),new C(X$(E.slice(0,D.length),Y),F),new C(X$(E.slice(D.length,D.length+G.length),Y),Z),new C(X$(E.slice(D.length+G.length),Y),F)])}function fm5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y,context:Z}){if(Q)return new p({text:xm5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y}),textAlign:"center"});let F=new v({color:$}),X=new v({color:B,dim:!0});return new F3({onCopy:(D,G)=>{if(G)g5.success(Z,"Copied to clipboard",2000)},child:new p({text:new C("",void 0,[new C("q",F),new C(" to quit, or use ",X),new C("amp --take-me-back",F),new C(" to use the old version",X)]),textAlign:"center",selectable:!0})})}function js4(A,Q){let B=w4(A),$=Math.min(B.length,Math.ceil($Z(Q)*B.length));return B.slice(0,$).join("").padEnd(B.length," ")}function PV0(A,Q,B=0){if(Q<=0)return A;let $=B+w4(A.text??"").length,J=A.children?.map((Y)=>{let Z=PV0(Y,Q,$);return $+=w4(Y.toPlainText()).length,Z});return new C(A.text?X$(A.text,Q,B):A.text,A.style,J,A.hyperlink,A.onClick)}function X$(A,Q,B=0){if(Q<=0)return A;return w4(A).map((J,Y)=>{if(J.trim()==="")return J;return vs4(B+Y)<Q?" ":J}).join("")}function vs4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}d0();e8();function oI(A,Q){let{colors:B,dim:$}=Q,J=[];if(A.totalCostUSD===null)return J;let Y=A.costBreakdown,Z=Y?.freeUSD??0,F=Y?.paidUSD??0;if(Z===0&&F===0)return J;let D={decimalPlaces:"more-if-tiny",intent:"cost"};if(F===0)J.push(new C(rU(Z,D),new v({color:B.foreground,dim:$}))),J.push(new C(" (free)",new v({color:B.foreground,dim:$})));else if(Z>0)J.push(new C(rU(Z,D),new v({color:B.foreground,dim:$}))),J.push(new C(" (free)",new v({color:B.foreground,dim:$}))),J.push(new C(" + ",new v({color:B.foreground,dim:$}))),J.push(new C(rU(F,D),new v({color:B.foreground,dim:$,bold:!$})));else J.push(new C(rU(F,D),new v({color:B.foreground,dim:$,bold:!$})));return J}class D51 extends L4{}class G51 extends L4{}function bm5(A,Q){if(Q.code==="auth-required")return"You must be logged in to view thread usage. Run `amp login` first.";if(Q.code==="thread-not-found")return`Thread ${A} not found.`;return`Failed to load thread usage: ${Q.message??Q.code}`}function um5(A,Q){let B=P0.of(Q),{colors:$}=B,J=oI(A,{colors:{foreground:$.foreground}}),Y=[];if(J.length>0)Y.push(new C("Total: ",new v({color:$.mutedForeground}))),Y.push(...J);else if(A.totalCostUSD===null)Y.push(new C("Usage information is currently unavailable."));else Y.push(new C("No usage recorded for this thread yet."));if(A.costBreakdownURL)Y.push(new C(`
|
|
5800
5800
|
|
|
5801
5801
|
`)),Y.push(new C("Details: ",new v({color:$.mutedForeground}))),Y.push(new C(A.costBreakdownURL,new v({color:B.app.link})));return new p({text:new C("",void 0,Y)})}function hm5(A,Q,B){let $=um5(A,Q);if(!A.costBreakdownURL)return new RA({header:"Thread Cost",minWidth:80,maxWidth:100,onDismiss:B,child:$});let J=A.costBreakdownURL,Y=new p1(()=>{return i4.maybeInvoke(Q,new g9(J,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),Z=new p1(()=>{return aA(Q,J),"handled"});return new RA({header:"Thread Cost",minWidth:80,maxWidth:100,autofocus:!1,footer:[{keys:["Esc"],label:"close"},{keys:["o"],label:"open in browser"},{keys:["y"],label:"copy url"}],onDismiss:B,child:new i4({actions:new Map([[D51,Y],[G51,Z]]),child:new Y5({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[C1.key("o"),new G51],[C1.key("y"),new D51]]),child:new d4({autofocus:!0,debugLabel:"ThreadCostBody",child:$})})})})}function ys4(A){return{noun:"thread",verb:"show cost",description:"Show usage cost for the active thread",keywords:["usage","credits","billing","spend"],get status(){return A.getActiveThreadID()?{type:"enabled"}:{type:"disabled",reason:"No active thread"}},run:async(Q,B,$)=>{let J=A.getActiveThreadID();if(!J)return;try{let Y=await r4.threadDisplayCostInfo({threadID:J},{config:A.configService});if(!Y.ok){A.toastController.show(bm5(J,Y.error),"error",5000),$();return}Q.push(hm5(Y.result,B,$))}catch(Y){j.error("Failed to load Neo thread cost",{error:Y,threadID:J}),A.toastController.show(`Failed to show thread cost: ${Y instanceof Error?Y.message:String(Y)}`,"error",5000),$()}}}}function gm5({ampURL:A,threadID:Q,logPath:B}){return[`Debug thread ${VY(new URL(A),Q).toString()} (cli log: ${B}). 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(`
|
|
5802
|
-
`)}class V51 extends T0{analyzeContextForThread;listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;initialThreadID;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;onThreadArchived;onActiveThreadChange;initialUserInput;getDefaultNewThreadVisibility;openThreadPickerOnStart;neoContext;constructor(A){super();this.analyzeContextForThread=A.analyzeContextForThread,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.initialThreadID=A.initialThreadID,this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.neoContext=A.neoContext}createState(){return new bs4}}class bs4 extends _0{editorController=new P8;commandPalette=new qr(this);commandRegistry=new NA1;toastController=new h01;exitHintTimer=new Hr(this,1000);ideStatus=new U2(this,{});threadNavigationHistory=new EA1;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;neoWelcomeVisible=!1;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;pluginIntegration=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};onSwitchThread=(A)=>{this.connectToExistingThread(A,{recordNavigation:!0})};sendFeedbackReport=async(A)=>lG0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await Lc4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Oc4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};removeThreadLabel=async(A,Q)=>{let B=await jc4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if(Q$.getInstance().interceptConsole(),this.notices=new e41(this.widget.configService,(Q)=>this.setState(Q)),this.notices.startPolling(),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:Q,error:B})=>{if(j.error("Neo failed to connect to thread",{threadID:Q,error:B}),!Q)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe((Q)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(l30(Q.settings)))}),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput;if(this.widget.initialThreadID){let Q={};if(A)Q.initialUserInput=A;this.connectToExistingThread(this.widget.initialThreadID,Q)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new UA1({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,neoContext:this.widget.neoContext,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread}),this.pluginIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=C4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?Pn4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],$=[{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(J,Y,Z)=>{J.pushWithDismiss((F)=>$61({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:F,onThreadSelected:Z}))}},{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:(J,Y,Z)=>{A.navigateBack(),Z()}},ys4({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:(J,Y,Z)=>{A.navigateForward(),Z()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",keywords:["servers","tools","plugins","integrations"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new kA1({mcpServers:this.widget.neoContext.mcpServers,onDismiss:Z}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",keywords:["tools","toolbox"],status:{type:"enabled"},run:(J)=>{J.pushWithDismiss((Y)=>new B51({toolboxes:this.widget.neoContext.toolboxes,onDismiss:Y}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(J,Y,Z)=>{try{await aA(Y,"https://ampcode.com/chronicle")}finally{Z()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{MJ(this.widget.neoContext.settingsFilePath).catch((J)=>{j.error("Failed to open settings file in editor",{error:J})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains","editor","attach"],status:{type:"enabled"},run:(J,Y,Z)=>{J.pushWithDismiss((F)=>new _A1({onCancel:F,onSelect:(X)=>{this.handleIdeSelection(X),Z()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["shortcuts","keybindings","docs","manual","?"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new LA1({commands:N7.of(Y).commands,onDismiss:Z}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",keywords:["intro","onboarding","getting started"],status:{type:"enabled"},run:(J,Y,Z)=>{Z(),A.showNeoWelcome()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["about","release","build"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new RA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new p({text:new C(HD0({version:"0.0.1778718002-g664bf7",buildTimestamp:"2026-05-14T00:23:59.092Z",buildType:"'release'"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:C1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{i4.maybeInvoke(Y,new Tf)}},...Q,...En4(this.widget.neoContext.logFilePath)].map((J)=>this.commandRegistry.register(J));return()=>{for(let J of $)J()}}build(A){let Q=this.buildHints(),B=this.ideStatus.getValue(),$=this.notices.current,J=new Q51({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.widget.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:B,statusItems:this.pluginIntegration?.getStatusItems()??[],notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.neoWelcomeVisible?null:$,onDismissNotice:(G)=>this.notices.dismiss(G)}),Y=a1.of(A),Z=Y.capabilities.animationSupport!=="disabled",X=[new m0({constraints:I1.tight(Y.size.width,Y.size.height),child:J})];if(this.commandPalette.isEnabled())X.push(new a4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new IA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)X.push($61({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)X.push(new a4({debugLabel:"NeoWelcomeDialogOverlay",child:new X51({onDismiss:this.dismissNeoWelcome,onQuit:()=>C4.instance.stop(),animationsEnabled:Z,variant:this.widget.neoWelcomeVariant})}));let D=this.executorAlreadyConnectedDialog;if(D)X.push(new a4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new RA1({existingExecutorPid:D.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(X.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)X.push(new jA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:xs4.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)X.push(new PA1);if($&&this.activeThreadContext&&!this.neoWelcomeVisible)X.push(zn4($,()=>this.notices.dismiss($.key)));return new y3({neoContext:this.widget.neoContext,child:new N7({commandRegistry:this.commandRegistry,child:new hI({completionBuilder:this.widget.completionBuilder,child:new g5({controller:this.toastController,child:new i4({actions:this.buildActions(),child:new Y5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[C1.ctrl("c"),new vG0],[C1.ctrl("o"),new yG0],[C1.alt("i"),new fG0],[C1.alt("p"),new MI],[C1.ctrl("."),new bG0],[C1.ctrl("t"),new uG0]]),child:new d4({debugLabel:"AppShellFocus",child:new g01({controller:this.toastController,child:new OA1({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new $A({children:X})})})})})})})})})})}buildActions(){let A=new p1(()=>{if(CJ.hasAnyCopyableSelection())return CJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new p1(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new p1(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new p1(()=>{return this.startNewDraftThread(),"handled"}),J=new p1(()=>{return C4.instance.stop(),"handled"}),Y=new p1((K)=>{if(!K.text)return"ignored";return C4.instance.tuiInstance.clipboard.writeText(K.text).then((E)=>{if(E.ok)this.toastController.show(K.successMessage,"success",2000);else this.toastController.show(`${K.failureMessage}: ${E.userFacingErrorMessage}`,"error",4000)}).catch((E)=>{j.error("Failed to copy Neo text to clipboard",{error:E}),this.toastController.show(K.failureMessage,"error",2000)}),"handled"}),Z=new p1(()=>{return C4.instance.toggleFrameStatsOverlay(),"handled"}),F=new p1(()=>this.notices.dismissCurrent()?"handled":"ignored"),X=new p1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),D=new p1(()=>{let K=this.activeThreadContext?.client.getThreadId();if(!K)return this.toastController.show("No active thread","error",2000),"handled";let E=Ex(K);return C4.instance.tuiInstance.clipboard.writeText(E).then(()=>{this.toastController.show("Copied log path to clipboard","success",2000)}).catch((z)=>{j.error("Failed to copy thread log path",{error:z,threadID:K,logPath:E}),this.toastController.show("Failed to copy log path","error",2000)}),"handled"}),G=new p1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";let K=this.activeThreadContext?.client.getThreadId();if(!K)return"handled";return this.prepareThreadIssueInvestigation(K),"handled"}),V=new p1(()=>{let K=this.activeThreadContext?.client.getThreadId();if(!K)return this.toastController.show("No active thread","error",2000),"handled";return this.toastController.show("Sending report...","success",2000),this.sendFeedbackReport(K).then(async(E)=>{try{await C4.instance.tuiInstance.clipboard.writeText(E),this.toastController.show("Sent report and copied report ID","success",3000)}catch(z){j.warn("Failed to copy report ID to clipboard",{error:z,reportID:E}),this.toastController.show(`Sent report ${E}`,"success",3000)}}).catch((E)=>{j.error("Failed to send report from debug overlay",{error:E,threadID:K}),this.toastController.show("Failed to send report","error",3000)}),"handled"}),U=new p1(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[vG0,A],[Us,$],[Tf,J],[g9,Y],[zs,B],[yG0,Q],[fG0,X],[Ws,D],[bG0,F],[Hs,G],[qs,V],[MI,Z],[uG0,U]])}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.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),this.widget.onActiveThreadChange?.(null),A.prompt!==void 0)this.editorController.text=A.prompt}prepareThreadIssueInvestigation(A){try{this.startNewDraftThread({prompt:gm5({ampURL:this.widget.neoContext.ampURL,threadID:A,logPath:Ex(A)}),hideDebugOverlay:!0})}catch(Q){j.error("Failed to prepare thread issue investigation",{error:Q,threadID:A})}}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 ix(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){j.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.neoContext.sessionAgentMode,B=A,$=B$(Q),J=ZD0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return YD0(B,{agentMode:Q,explicitEffort:this.widget.neoContext.explicitReasoningEffort,sessionState:this.widget.neoContext})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=fs4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(dZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=fs4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(uI);if(this.exitHintTimer.isActive())A.add(Of);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),C4.instance.stop();else this.exitHintTimer.activate()};dismissNeoWelcome=()=>{if(!this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!1}),this.widget.onNeoWelcomeDismissed?.()};showNeoWelcome=()=>{if(this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!0})};promptExecutorAlreadyConnected(A){return new Promise((Q)=>{this.setState(()=>{this.executorAlreadyConnectedDialog={existingExecutorPid:A.existingExecutorPid,resolve:(B)=>{Q(B==="watch"?"observe":"disconnect")}}})})}handleExecutorAlreadyConnectedChoice=(A)=>{if(this.resolveExecutorAlreadyConnectedDialog(A),A==="exit")C4.instance.stop()};resolveExecutorAlreadyConnectedDialog(A){let Q=this.executorAlreadyConnectedDialog;if(!Q)return;this.setState(()=>{this.executorAlreadyConnectedDialog=null}),Q.resolve(A)}closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1})};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,B=null,$)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),Y=A.find((D)=>D.type==="text");if(Y&&Y.type==="text")this.widget.history.add(Y.text,xs4.cwd()),this.widget.history.reset();let Z=B?void 0:await this.widget.getDefaultNewThreadVisibility?.(),F=B??Z??null,X=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,F??void 0);this.sendUserMessage(X,A,Q,$),this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings),this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(X)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.neoContext.sessionAgentMode=A;let B=Q["reasoning.effort"];if(B!==void 0)this.widget.neoContext.lastReasoningEffortByMode={...this.widget.neoContext.lastReasoningEffortByMode??{},[A]:B};let $=B$(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};BB((Y)=>{let Z={...Y,agentMode:A};if(B!==void 0)Z={...Z,lastReasoningEffortByMode:{...Z.lastReasoningEffortByMode??{},[A]:B}};if(J!==void 0)Z={...Z,lastSpeedByMode:{...Z.lastSpeedByMode??{},[A]:J}};return Z}).catch((Y)=>{j.warn("Failed to persist Neo session defaults for new message",{error:Y instanceof Error?Y.message:String(Y)})})}sendUserMessage(A,Q,B,$){let J=hY0(this.ideStatus.getValue());if($===void 0){A.client.sendUserMessage(Q,B,{userState:J});return}A.client.sendUserMessage(Q,B,{reasoningEffort:$,userState:J})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};appendPluginMessagesToThread=async(A,Q)=>{let B=this.activeThreadContext;if(!B)throw Error("appendToThread is not available - no active thread");let $=B.client.getThreadId();if(Q&&$!==Q)throw Error("thread.append is only available for the active executor thread");for(let J of A)this.sendUserMessage(B,[{type:"text",text:J.content}])};async connectToExistingThread(A,Q={}){let B=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let $=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:(J)=>this.promptExecutorAlreadyConnected(J)});if(this.setActiveClient($),Q.recordNavigation&&B!==A)this.threadNavigationHistory.recordNavigation(B);if(Q.initialUserInput)this.sendUserMessage($,[{type:"text",text:Q.initialUserInput}])}catch($){if(j.error("Failed to load thread",{error:$,threadID:A}),this.toastController.show(`Failed to load ${A}: ${$ instanceof Error?$.message:String($)}`,"error",4000),Q.rethrowError)throw $}finally{this.setState(()=>{this.connectingToThreadID=null})}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q}}),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){j.error("Failed to connect to IDE",{error:Q});let B=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${B}`,"error",4000)}};dispose(){this.unregisterCommands?.(),this.unregisterCommands=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.neoWelcomeVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function fs4(A,Q,B){let $={...A};for(let J of mm5(Q,B)){if(!dZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function mm5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}c4();function us4(A,Q,B,$){let J=Yk(A),Y="\x1B[0m",Z="\x1B[34m",F="\x1B[90m",X="\x1B[2m",D=[];if(A.archived)D.push("\x1B[90m\x1B[2mArchived\x1B[0m");D.push(`${J}`),D.push(`\x1B[34m${Q}\x1B[0m`),D.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let G=14,V=7,U=new rY(G,V),K=new f9(42),E=new qI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,E0.default(),K);E.layout(I1.tight(G,V)),E.paint(U,0,0);let z=U.getBuffer().getCells(),W=0;for(let _=0;_<V;_++)if(z[_].some((S)=>S.char!==" ")){W=_;break}let H=V-1;for(let _=V-1;_>=0;_--)if(z[_].some((S)=>S.char!==" ")){H=_;break}function q(_,S){if(!_)return"";if(_.type==="rgb"){let{r:T,g:x,b:h}=_.value;if(B.getColorDepth()>=24)return`\x1B[${S?38:48};2;${T};${x};${h}m`;let u=xj(T,x,h);return`\x1B[${S?38:48};5;${u}m`}return""}let N=[];if(H>=W)for(let _=W;_<=H;_++){let S="";for(let T=0;T<G;T++){let x=z[_][T],h=x.char,u=q(x.style.fg,!0);S+=u+h+"\x1B[0m"}N.push(S)}let I=N.length,w=Math.max(I,D.length),L=Math.floor((w-I)/2),O=Math.floor((w-D.length)/2);for(let _=0;_<w;_++){let S=" ".repeat(G);if(_>=L&&_<L+I)S=N[_-L];let T=" ",x="";if(_>=O&&_<O+D.length)x=D[_-O];B.write(S+T+x+`
|
|
5802
|
+
`)}class V51 extends T0{analyzeContextForThread;listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;initialThreadID;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;onThreadArchived;onActiveThreadChange;initialUserInput;getDefaultNewThreadVisibility;openThreadPickerOnStart;neoContext;constructor(A){super();this.analyzeContextForThread=A.analyzeContextForThread,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.initialThreadID=A.initialThreadID,this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.neoContext=A.neoContext}createState(){return new bs4}}class bs4 extends _0{editorController=new P8;commandPalette=new qr(this);commandRegistry=new NA1;toastController=new h01;exitHintTimer=new Hr(this,1000);ideStatus=new U2(this,{});threadNavigationHistory=new EA1;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;neoWelcomeVisible=!1;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;pluginIntegration=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};onSwitchThread=(A)=>{this.connectToExistingThread(A,{recordNavigation:!0})};sendFeedbackReport=async(A)=>lG0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await Lc4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Oc4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};removeThreadLabel=async(A,Q)=>{let B=await jc4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if(Q$.getInstance().interceptConsole(),this.notices=new e41(this.widget.configService,(Q)=>this.setState(Q)),this.notices.startPolling(),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:Q,error:B})=>{if(j.error("Neo failed to connect to thread",{threadID:Q,error:B}),!Q)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe((Q)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(l30(Q.settings)))}),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput;if(this.widget.initialThreadID){let Q={};if(A)Q.initialUserInput=A;this.connectToExistingThread(this.widget.initialThreadID,Q)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new UA1({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,neoContext:this.widget.neoContext,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread}),this.pluginIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=C4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?Pn4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],$=[{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(J,Y,Z)=>{J.pushWithDismiss((F)=>$61({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:F,onThreadSelected:Z}))}},{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:(J,Y,Z)=>{A.navigateBack(),Z()}},ys4({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:(J,Y,Z)=>{A.navigateForward(),Z()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",keywords:["servers","tools","plugins","integrations"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new kA1({mcpServers:this.widget.neoContext.mcpServers,onDismiss:Z}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",keywords:["tools","toolbox"],status:{type:"enabled"},run:(J)=>{J.pushWithDismiss((Y)=>new B51({toolboxes:this.widget.neoContext.toolboxes,onDismiss:Y}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(J,Y,Z)=>{try{await aA(Y,"https://ampcode.com/chronicle")}finally{Z()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{MJ(this.widget.neoContext.settingsFilePath).catch((J)=>{j.error("Failed to open settings file in editor",{error:J})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains","editor","attach"],status:{type:"enabled"},run:(J,Y,Z)=>{J.pushWithDismiss((F)=>new _A1({onCancel:F,onSelect:(X)=>{this.handleIdeSelection(X),Z()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["shortcuts","keybindings","docs","manual","?"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new LA1({commands:N7.of(Y).commands,onDismiss:Z}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",keywords:["intro","onboarding","getting started"],status:{type:"enabled"},run:(J,Y,Z)=>{Z(),A.showNeoWelcome()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["about","release","build"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new RA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new p({text:new C(HD0({version:"0.0.1778732631-gc5875c",buildTimestamp:"2026-05-14T04:27:49.335Z",buildType:"'release'"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:C1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{i4.maybeInvoke(Y,new Tf)}},...Q,...En4(this.widget.neoContext.logFilePath)].map((J)=>this.commandRegistry.register(J));return()=>{for(let J of $)J()}}build(A){let Q=this.buildHints(),B=this.ideStatus.getValue(),$=this.notices.current,J=new Q51({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.widget.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:B,statusItems:this.pluginIntegration?.getStatusItems()??[],notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.neoWelcomeVisible?null:$,onDismissNotice:(G)=>this.notices.dismiss(G)}),Y=a1.of(A),Z=Y.capabilities.animationSupport!=="disabled",X=[new m0({constraints:I1.tight(Y.size.width,Y.size.height),child:J})];if(this.commandPalette.isEnabled())X.push(new a4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new IA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)X.push($61({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)X.push(new a4({debugLabel:"NeoWelcomeDialogOverlay",child:new X51({onDismiss:this.dismissNeoWelcome,onQuit:()=>C4.instance.stop(),animationsEnabled:Z,variant:this.widget.neoWelcomeVariant})}));let D=this.executorAlreadyConnectedDialog;if(D)X.push(new a4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new RA1({existingExecutorPid:D.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(X.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)X.push(new jA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:xs4.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)X.push(new PA1);if($&&this.activeThreadContext&&!this.neoWelcomeVisible)X.push(zn4($,()=>this.notices.dismiss($.key)));return new y3({neoContext:this.widget.neoContext,child:new N7({commandRegistry:this.commandRegistry,child:new hI({completionBuilder:this.widget.completionBuilder,child:new g5({controller:this.toastController,child:new i4({actions:this.buildActions(),child:new Y5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[C1.ctrl("c"),new vG0],[C1.ctrl("o"),new yG0],[C1.alt("i"),new fG0],[C1.alt("p"),new MI],[C1.ctrl("."),new bG0],[C1.ctrl("t"),new uG0]]),child:new d4({debugLabel:"AppShellFocus",child:new g01({controller:this.toastController,child:new OA1({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new $A({children:X})})})})})})})})})})}buildActions(){let A=new p1(()=>{if(CJ.hasAnyCopyableSelection())return CJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new p1(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new p1(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new p1(()=>{return this.startNewDraftThread(),"handled"}),J=new p1(()=>{return C4.instance.stop(),"handled"}),Y=new p1((K)=>{if(!K.text)return"ignored";return C4.instance.tuiInstance.clipboard.writeText(K.text).then((E)=>{if(E.ok)this.toastController.show(K.successMessage,"success",2000);else this.toastController.show(`${K.failureMessage}: ${E.userFacingErrorMessage}`,"error",4000)}).catch((E)=>{j.error("Failed to copy Neo text to clipboard",{error:E}),this.toastController.show(K.failureMessage,"error",2000)}),"handled"}),Z=new p1(()=>{return C4.instance.toggleFrameStatsOverlay(),"handled"}),F=new p1(()=>this.notices.dismissCurrent()?"handled":"ignored"),X=new p1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),D=new p1(()=>{let K=this.activeThreadContext?.client.getThreadId();if(!K)return this.toastController.show("No active thread","error",2000),"handled";let E=Ex(K);return C4.instance.tuiInstance.clipboard.writeText(E).then(()=>{this.toastController.show("Copied log path to clipboard","success",2000)}).catch((z)=>{j.error("Failed to copy thread log path",{error:z,threadID:K,logPath:E}),this.toastController.show("Failed to copy log path","error",2000)}),"handled"}),G=new p1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";let K=this.activeThreadContext?.client.getThreadId();if(!K)return"handled";return this.prepareThreadIssueInvestigation(K),"handled"}),V=new p1(()=>{let K=this.activeThreadContext?.client.getThreadId();if(!K)return this.toastController.show("No active thread","error",2000),"handled";return this.toastController.show("Sending report...","success",2000),this.sendFeedbackReport(K).then(async(E)=>{try{await C4.instance.tuiInstance.clipboard.writeText(E),this.toastController.show("Sent report and copied report ID","success",3000)}catch(z){j.warn("Failed to copy report ID to clipboard",{error:z,reportID:E}),this.toastController.show(`Sent report ${E}`,"success",3000)}}).catch((E)=>{j.error("Failed to send report from debug overlay",{error:E,threadID:K}),this.toastController.show("Failed to send report","error",3000)}),"handled"}),U=new p1(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[vG0,A],[Us,$],[Tf,J],[g9,Y],[zs,B],[yG0,Q],[fG0,X],[Ws,D],[bG0,F],[Hs,G],[qs,V],[MI,Z],[uG0,U]])}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.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),this.widget.onActiveThreadChange?.(null),A.prompt!==void 0)this.editorController.text=A.prompt}prepareThreadIssueInvestigation(A){try{this.startNewDraftThread({prompt:gm5({ampURL:this.widget.neoContext.ampURL,threadID:A,logPath:Ex(A)}),hideDebugOverlay:!0})}catch(Q){j.error("Failed to prepare thread issue investigation",{error:Q,threadID:A})}}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 ix(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){j.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.neoContext.sessionAgentMode,B=A,$=B$(Q),J=ZD0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return YD0(B,{agentMode:Q,explicitEffort:this.widget.neoContext.explicitReasoningEffort,sessionState:this.widget.neoContext})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=fs4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(dZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=fs4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(uI);if(this.exitHintTimer.isActive())A.add(Of);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),C4.instance.stop();else this.exitHintTimer.activate()};dismissNeoWelcome=()=>{if(!this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!1}),this.widget.onNeoWelcomeDismissed?.()};showNeoWelcome=()=>{if(this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!0})};promptExecutorAlreadyConnected(A){return new Promise((Q)=>{this.setState(()=>{this.executorAlreadyConnectedDialog={existingExecutorPid:A.existingExecutorPid,resolve:(B)=>{Q(B==="watch"?"observe":"disconnect")}}})})}handleExecutorAlreadyConnectedChoice=(A)=>{if(this.resolveExecutorAlreadyConnectedDialog(A),A==="exit")C4.instance.stop()};resolveExecutorAlreadyConnectedDialog(A){let Q=this.executorAlreadyConnectedDialog;if(!Q)return;this.setState(()=>{this.executorAlreadyConnectedDialog=null}),Q.resolve(A)}closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1})};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,B=null,$)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),Y=A.find((D)=>D.type==="text");if(Y&&Y.type==="text")this.widget.history.add(Y.text,xs4.cwd()),this.widget.history.reset();let Z=B?void 0:await this.widget.getDefaultNewThreadVisibility?.(),F=B??Z??null,X=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,F??void 0);this.sendUserMessage(X,A,Q,$),this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings),this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(X)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.neoContext.sessionAgentMode=A;let B=Q["reasoning.effort"];if(B!==void 0)this.widget.neoContext.lastReasoningEffortByMode={...this.widget.neoContext.lastReasoningEffortByMode??{},[A]:B};let $=B$(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};BB((Y)=>{let Z={...Y,agentMode:A};if(B!==void 0)Z={...Z,lastReasoningEffortByMode:{...Z.lastReasoningEffortByMode??{},[A]:B}};if(J!==void 0)Z={...Z,lastSpeedByMode:{...Z.lastSpeedByMode??{},[A]:J}};return Z}).catch((Y)=>{j.warn("Failed to persist Neo session defaults for new message",{error:Y instanceof Error?Y.message:String(Y)})})}sendUserMessage(A,Q,B,$){let J=hY0(this.ideStatus.getValue());if($===void 0){A.client.sendUserMessage(Q,B,{userState:J});return}A.client.sendUserMessage(Q,B,{reasoningEffort:$,userState:J})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};appendPluginMessagesToThread=async(A,Q)=>{let B=this.activeThreadContext;if(!B)throw Error("appendToThread is not available - no active thread");let $=B.client.getThreadId();if(Q&&$!==Q)throw Error("thread.append is only available for the active executor thread");for(let J of A)this.sendUserMessage(B,[{type:"text",text:J.content}])};async connectToExistingThread(A,Q={}){let B=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let $=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:(J)=>this.promptExecutorAlreadyConnected(J)});if(this.setActiveClient($),Q.recordNavigation&&B!==A)this.threadNavigationHistory.recordNavigation(B);if(Q.initialUserInput)this.sendUserMessage($,[{type:"text",text:Q.initialUserInput}])}catch($){if(j.error("Failed to load thread",{error:$,threadID:A}),this.toastController.show(`Failed to load ${A}: ${$ instanceof Error?$.message:String($)}`,"error",4000),Q.rethrowError)throw $}finally{this.setState(()=>{this.connectingToThreadID=null})}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q}}),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){j.error("Failed to connect to IDE",{error:Q});let B=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${B}`,"error",4000)}};dispose(){this.unregisterCommands?.(),this.unregisterCommands=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.neoWelcomeVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function fs4(A,Q,B){let $={...A};for(let J of mm5(Q,B)){if(!dZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function mm5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}c4();function us4(A,Q,B,$){let J=Yk(A),Y="\x1B[0m",Z="\x1B[34m",F="\x1B[90m",X="\x1B[2m",D=[];if(A.archived)D.push("\x1B[90m\x1B[2mArchived\x1B[0m");D.push(`${J}`),D.push(`\x1B[34m${Q}\x1B[0m`),D.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let G=14,V=7,U=new rY(G,V),K=new f9(42),E=new qI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,E0.default(),K);E.layout(I1.tight(G,V)),E.paint(U,0,0);let z=U.getBuffer().getCells(),W=0;for(let _=0;_<V;_++)if(z[_].some((S)=>S.char!==" ")){W=_;break}let H=V-1;for(let _=V-1;_>=0;_--)if(z[_].some((S)=>S.char!==" ")){H=_;break}function q(_,S){if(!_)return"";if(_.type==="rgb"){let{r:T,g:x,b:h}=_.value;if(B.getColorDepth()>=24)return`\x1B[${S?38:48};2;${T};${x};${h}m`;let u=xj(T,x,h);return`\x1B[${S?38:48};5;${u}m`}return""}let N=[];if(H>=W)for(let _=W;_<=H;_++){let S="";for(let T=0;T<G;T++){let x=z[_][T],h=x.char,u=q(x.style.fg,!0);S+=u+h+"\x1B[0m"}N.push(S)}let I=N.length,w=Math.max(I,D.length),L=Math.floor((w-I)/2),O=Math.floor((w-D.length)/2);for(let _=0;_<w;_++){let S=" ".repeat(G);if(_>=L&&_<L+I)S=N[_-L];let T=" ",x="";if(_>=O&&_<O+D.length)x=D[_-O];B.write(S+T+x+`
|
|
5803
5803
|
`)}if($)B.write(`
|
|
5804
5804
|
\x1B[90m${$}\x1B[0m
|
|
5805
5805
|
`)}d0();ED0();var pm5=2000,dm5="Agent is ready",cm5="Waiting for approval";function hs4(A){let Q=!0,B=!0,$=A.configService.config.subscribe((z)=>{Q=z.settings["notifications.enabled"]??!0,B=z.settings["notifications.system.enabled"]!==!1}),J=0,Y=(z)=>{if(!Q)return;let W=Date.now();if(W-J<pm5)return;if(J=W,pj())return;if(EX0())zX0();else LZ0(z)},Z=(z)=>{if(!Q||!B)return;if(pj()&&!Dr()&&!fx())return;process.stdout.write(mD(`\x1B]777;notify;Amp;${z}\x1B\\`))},F=()=>{Y("idle"),Z(dm5)},X=()=>{Y("requires-user-input"),Z(cm5)},D=(z)=>z?.attempt===void 0||z.attempt===0,G=null,V=null,U=null,K=()=>{G?.unsubscribe(),V?.unsubscribe(),G=null,V=null,U=null};return{attach:(z,W)=>{if(K(),W)V=W.subscribe({next:(H)=>{if(H===null)return;if(!D(H))return;F()},error:(H)=>{j.debug("Neo notification active error stream errored",{error:H})}});G=z.subscribe({next:(H)=>{try{let q=U!==null&&aQ(U),N=U==="awaiting_approval",I=q||N;if(H==="awaiting_approval"&&!N)X();else if(H==="idle"&&I)F()}catch(q){j.debug("Neo notification handling failed",{error:q})}finally{U=H}},error:(H)=>{j.debug("Neo notification agent state stream errored",{error:H})}})},detach:K,unsubscribe(){K(),$.unsubscribe()}}}function lm5({initialUserInput:A,showNeoWelcome:Q,hideNeoWelcome:B,neoWelcomeVariant:$,neoWelcomeDismissed:J}){if(B)return{show:!1,markDismissedOnDismiss:!1};if($==="npm-migration")return{show:!0,markDismissedOnDismiss:!1};if(Q)return{show:!0,markDismissedOnDismiss:!0};let Y=!A&&!J;return{show:Y,markDismissedOnDismiss:Y}}async function im5(A){await BB((Q)=>nx(Q,A,"interactive"))}async function gs4(A,Q={}){let{initialThreadID:B,initialUserInput:$,getDefaultNewThreadVisibility:J,openThreadPickerOnStart:Y=!1,observerOnly:Z=!1,initialAgentMode:F,initialReasoningEffort:X,showNeoWelcome:D=!1,hideNeoWelcome:G=!1,neoWelcomeVariant:V="intro"}=Q,U=V==="npm-migration",K=async(S)=>{let T=await A.getThreadFromServer(S);if(!T)return null;return eF0(T)},E=async(S)=>{let T=await A.getThreadFromServer(S);if(!T)throw Error(`Thread ${S} not found`);let x=await S9(S,A.configService,A.apiKey,{usesThreadActors:!0}),k=await jU({endpoint:A.rivetEndpoint,poolName:x.poolName}).threadActor.getOrCreate([S],{params:{wsToken:x.wsToken},createWithInput:{threadId:x.threadId,threadVersion:x.threadVersion,ownerUserId:x.ownerUserId,...x.agentMode?{agentMode:x.agentMode}:{}}}).fetch("/import",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({thread:nx4(T)}),skipReadyWait:!0});if(!k.ok&&k.status!==409)throw Error(`Thread import failed (${k.status}): ${await k.text()}`);try{await Iv4(S,A.configService,A.apiKey,{executorType:"local-client"})}catch(f){j.warn("failed to mark thread as imported on server",{threadID:S,error:f instanceof Error?f.message:String(f)})}},z=new U01(A.rivetEndpoint,A.apiKey,A.configService,{clientID:BI.parse(`neo-${crypto.randomUUID()}`),toolService:A.toolService,skillService:A.skillService,requestPluginToolCall:(S)=>A.pluginService.event.toolCall(S),requestPluginToolResult:(S)=>A.pluginService.event.toolResult(S),pluginService:A.pluginService,invokeTool:async(S,T)=>{let x=typeof T.args==="object"&&T.args!==null?T.args:{},h=await ZI({toolName:T.toolName,configService:A.configService,toolService:A.toolService,mcpService:A.mcpService,skillService:A.skillService,toolUseID:T.toolCallId,threadId:S});return A.toolService.invokeTool(T.toolName,{args:x},h)},persistLastThreadID:im5,readFileSystemDirectory:A.readFileSystemDirectory},K,E),W=await mz(),H=lm5({initialUserInput:$,showNeoWelcome:D,hideNeoWelcome:G,neoWelcomeVariant:V,neoWelcomeDismissed:W.neoWelcomeDismissed}),q={ampURL:A.ampURL,configService:A.configService,getThreadMarkdown:async(S)=>{let T=await A.getThreadFromServer(S);return T?yV(T):null},isInternalUser:A.isInternalUser,listThreads:A.listThreads,logFilePath:sa,mcpServers:A.mcpService.servers,pluginPlatform:A.pluginPlatform,pluginService:A.pluginService,toolboxes:A.toolboxes,observerOnly:U?!1:Z,sessionAgentMode:F??W.agentMode,explicitReasoningEffort:X,lastReasoningEffortByMode:W.lastReasoningEffortByMode,lastSpeedByMode:W.lastSpeedByMode,settingsFilePath:A.settingsFilePath,splashOrbVisualStyle:Q.splashOrbVisualStyle??"neo",workspaceRoot:A.workspaceRoot},N=(S,T)=>{return Gx({ampURL:A.ampURL,configService:A.configService,threadID:S,signal:T})},I=(S,T)=>{return Lg4({ampURL:A.ampURL,configService:A.configService,threadID:S,signal:T})},w=new S01,L=hs4({configService:A.configService}),O=await A.configService.getLatest();C4.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:O.settings["terminal.animation"]===!1}});let _=new Set;try{await Gr(new V51({clientPool:z,analyzeContextForThread:N,listSkillsForThread:I,completionBuilder:A.completionBuilder,history:new Ho,ideManager:w,configService:A.configService,initialThreadID:U?void 0:B,notificationService:L,initialUserInput:U?void 0:$,getDefaultNewThreadVisibility:J,openThreadPickerOnStart:U?!1:Y,neoContext:q,showNeoWelcome:H.show,neoWelcomeVariant:V,onActiveThreadChange:A.setActiveThreadID,onNeoWelcomeDismissed:H.markDismissedOnDismiss?()=>{BB(Pg4).catch((T)=>{j.warn("Failed to mark Neo welcome as dismissed",{error:T})})}:void 0,onThreadArchived:(T)=>{_.add(T)}}));let S=z.lastActiveObservingClient;if(S){let{client:T,observer:x}=S,h=T.getThreadId();if(h){let u={id:h,title:x.title().getValue(),agentMode:x.agentMode,archived:_.has(h)},k=`${A.ampURL.replace(/\/$/,"")}/threads/${h}`;us4(u,k,process.stdout)}}}finally{process.stdout.write(zI("")),L.unsubscribe(),z.dispose(),await A.dispose?.()}process.exit(0)}W3();function nf(A){let Q=[],B={meta:{visibility:"private",sharedGroupIDs:[]}};if(A.workspace?.disablePrivateThreads)B.disabledReason="Disabled by workspace policy";if(Q.push(B),A.workspace?.groups&&A.workspace.groups.length>0){let Z={meta:{visibility:"private",shareWithAllCreatorGroups:!0}};if(A.creatorIsViewer===!1)Z.disabledReason="Can only be set by thread creator";Q.push(Z)}if(A.workspace)Q.push({meta:{visibility:"thread_workspace_shared"}});let $=A.workspace?.disablePublicSharing?"Disabled by workspace policy":void 0,J={meta:{visibility:"public_unlisted"}},Y={meta:{visibility:"public_discoverable"}};if($)J.disabledReason=$,Y.disabledReason=$;return Q.push(J,Y),Q}function ms4(A){if(A.visibility!=="private")return!0;if("shareWithAllCreatorGroups"in A&&A.shareWithAllCreatorGroups)return!0;return"sharedGroupIDs"in A&&A.sharedGroupIDs.length>0}function IR(A,Q={}){switch(A.visibility){case"thread_workspace_shared":return{text:"Workspace",description:"Visible to all members of the workspace"};case"public_discoverable":return{text:"Public",description:"Visible on public profile & publicly searchable"};case"public_unlisted":return{text:"Unlisted",description:"Visible to anyone on the Internet who has the link"};case"private":{let B="shareWithAllCreatorGroups"in A&&A.shareWithAllCreatorGroups,J=(B?Q.workspace?.groups.map((Y)=>Y.id)??[]:("sharedGroupIDs"in A)?A.sharedGroupIDs:[]).reduce((Y,Z)=>{let F=Q.workspace?.groups.find((X)=>X.id===Z)?.name;if(F)Y.push(`'${F}'`);return Y},[]);if(J.length>0)return{text:"Group",description:`Shared with ${D4(J.length,"group")} ${J.join(", ")} and workspace admins`};if(B)return{text:"Group",description:"Shared with creator groups and workspace admins"};return{text:"Private",description:Q.workspace?"Only visible to you and workspace admins":"Only you can see this thread"}}}}function _V0(A){if(A.visibility==="private")return"shareWithAllCreatorGroups"in A?"group":"private";if(A.visibility==="thread_workspace_shared")return"workspace";if(A.visibility==="public_unlisted")return"unlisted";return"public"}function af(A,Q=null){let B=A!==null&&typeof A==="object"&&"visibility"in A?A.visibility:void 0;if(!B||typeof B!=="string")return;let J=nf({workspace:Q?.team??void 0}).filter((Y)=>!Y.disabledReason).map((Y)=>_V0(Y.meta));if(J.includes(B))return nm5(B);if(B==="group"&&!J.includes("group")){if(Q?.team?.groups!==void 0)return Error(`Group visibility is not available. You are not a member of any group in this workspace.
|
|
@@ -7558,7 +7558,7 @@ ${J}`,Q);this.line=B,this.column=$,this.codeblock=J}}/*!
|
|
|
7558
7558
|
`),Y=[];for(let Z=0;Z<J.length;Z++){let D=J[Z].replace(/\b(SELECT|FROM|WHERE|GROUP BY|ORDER BY|HAVING|LIMIT|JOIN|LEFT JOIN|RIGHT JOIN|INNER JOIN|ON|AND|OR|AS|IN|NOT|NULL|IS|BETWEEN|LIKE|EXISTS|UNION|DISTINCT|COUNT|SUM|AVG|MIN|MAX|DATE|TIMESTAMP_TRUNC|TIMESTAMP_SUB|CURRENT_TIMESTAMP|INTERVAL|CASE|WHEN|THEN|ELSE|END|WITH|INSERT|UPDATE|DELETE|SET|VALUES|INTO|CREATE|ALTER|DROP|TRUE|FALSE|ASC|DESC)\b/gi,"\x00$1\x01").split(/(\x00[^\x01]+\x01)/);for(let G of D)if(G.startsWith("\x00")&&G.endsWith("\x01"))Y.push(new C(G.slice(1,-1),new v({color:$.app.keybind,bold:!0})));else Y.push(new C(G,new v({color:B.colorScheme.foreground})));if(Z<J.length-1)Y.push(new C(`
|
|
7559
7559
|
`))}return new m0({decoration:{color:B.colorScheme.background,border:d1.all(new c1($.app.keybind,1,"rounded"))},child:new x0({padding:U0.symmetric(0,1),child:new p({text:new C(void 0,void 0,Y)})})})}}class I31 extends G8{chartData;highlightIndex;showAxes;colors;constructor({key:A,chartData:Q,highlightIndex:B=null,showAxes:$=!0,colors:J=cU0}){super(A?{key:A}:{});this.chartData=Q,this.highlightIndex=B,this.showAxes=$,this.colors=J}createRenderObject(){return new q31({chartData:this.chartData,highlightIndex:this.highlightIndex,showAxes:this.showAxes,colors:this.colors})}updateRenderObject(A){let Q=A;Q.chartData=this.chartData,Q.highlightIndex=this.highlightIndex,Q.showAxes=this.showAxes,Q.colors=this.colors,Q.markNeedsLayout()}}function K1A(A,Q,B,$,J,Y,Z){if(Y<=0)return null;switch(A){case"horizontal-bar":{let F=B;return F>=0&&F<Y?F:null}case"bar":case"stacked-bar":{let F=Z?i8:0,X=$-F;if(X<=0)return null;let D=Q-F;if(D<0||D>=X)return null;let G=Math.max(1,Math.floor(X/Y)),V=Math.floor(D/G);return V>=0&&V<Y?V:null}case"line":case"sparkline":case"stacked-area":{let F=Z?i8:0,X=$-F;if(X<=0)return null;let D=Math.max(0,Math.min(X-1,Q-F));if(Y===1)return 0;let G=X/(Y-1),V=Math.round(D/G);return Math.max(0,Math.min(Y-1,V))}default:return null}}function Fa5(A,Q,B,$,J,Y,Z,F){if(J<=0||Q<0||Q>=J)return null;let X=2;switch(A){case"horizontal-bar":return{x:Math.floor(B/2),y:Q};case"bar":case"stacked-bar":{let D=Y?i8:0,G=B-D,V=$-(Y?X:0);if(G<=0||V<=0)return null;let U=Math.max(1,Math.floor(G/J)),K=D+Q*U+Math.floor(U/2),E=F>0?Z/F:0,z=Math.round((1-E)*(V-1));return{x:K,y:z}}case"line":case"sparkline":case"stacked-area":{let D=Y?i8:0,G=B-D,V=$-(Y?X:0);if(G<=0||V<=0)return null;let U=J>1?D+Math.round(Q/(J-1)*(G-1)):D+Math.floor(G/2),K=F>0?Z/F:0,E=Math.round((1-K)*(V-1));return{x:U,y:E}}default:return null}}function Xa5(A){let Q=0;for(let B of A)for(let $ of B.points)if($.value>Q)Q=$.value;return Q||1}function Da5(A,Q,B,$,J){if(B.length<=1){let F=$(A.value),X=A.meta?` (${A.meta})`:"";return A.label.length+2+F.length+X.length}let Y=A.label.length,Z=0;for(let F of B){let X=F.points[Q];if(!X)continue;Z+=X.value;let D=2+F.name.length+2+$(X.value).length;Y=Math.max(Y,D)}if(J){let F=9+$(Z).length;Y=Math.max(Y,F)}return Y}function Ga5(A,Q,B,$,J,Y,Z){let F;try{let E=O1.of(A),z=P0.of(A);F={foreground:E.colorScheme.foreground,background:E.colorScheme.background,border:z.app.keybind}}catch{F={foreground:{type:"index",value:15},background:{type:"index",value:0},border:{type:"index",value:7}}}let X=new v({color:F.foreground,bold:!0}),D=new v({color:F.foreground}),G=new v({color:F.foreground,dim:!0}),V=[],U=new v({color:F.foreground,underline:!0}),K=(E,z)=>new C(z,U,void 0,fz(E),()=>{aA(A,E)});if($.length<=1){if(V.push(new C(`${Q.label}: `,X)),Q.link)V.push(K(Q.link,Y(Q.value)));else V.push(new C(Y(Q.value),D));if(Q.meta)V.push(new C(` (${Q.meta})`,G))}else{let E=Z==="stacked-bar"||Z==="stacked-area";V.push(new C(`${Q.label}
|
|
7560
7560
|
`,X));let z=0;for(let W=0;W<$.length;W++){let H=$[W],q=H.points[B];if(!q)continue;z+=q.value;let N=H.color??J[W%J.length]??F.foreground;if(V.push(new C("● ",new v({color:N}))),V.push(new C(`${H.name}: `,G)),q.link)V.push(K(q.link,Y(q.value)));else V.push(new C(Y(q.value),D));if(W<$.length-1||E)V.push(new C(`
|
|
7561
|
-
`))}if(E)V.push(new C(" ",G)),V.push(new C("Total: ",G)),V.push(new C(Y(z),D))}return new m0({decoration:{color:F.background,border:d1.all(new c1(F.border,1,"rounded"))},child:new p({text:new C(void 0,void 0,V)})})}d0();function E1A(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}W3();I8();J3();c7();b7();e9();e8();_Q();vV();c4();rS();LT();L1();d0();e9();class w31{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(A,Q){this.enabled=A;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let A=Array.from(this.commandCounts.entries()).map(([Q,B])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1778718002-g664bf7"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await m30(Q,this.configService)}catch(Q){j.error("Failed to export command telemetry events",Q)}}async submit(A){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(A)||0;this.commandCounts.set(A,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class Xw extends T0{props;constructor(A){super();this.props=A}createState(){return new z1A}}class z1A extends _0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(A){let Q=(B)=>{this.setState(()=>{this._state=B(this._state)})};return this.widget.props.builder(A,Q,this._state)}}class W1A extends _0{controller=new P8;focusNode=new V6({debugLabel:"CommandArgumentPrompt",onKey:(A)=>{if(A.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,J=this.widget.props.isRequiredArg??!0,Y=this.controller.text.trim().length>0,Z=!J||Y,F=d1.all(new c1(B.foreground,1,"solid")),X=new $$({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(K)=>{let E=K.trim();if(J&&E.length===0)return;this.widget.props.onSubmit(E)},autofocus:!0,style:{textColor:B.foreground,border:null},maxLines:1}),D=new s0({children:[new m0({decoration:{color:B.background},child:new p({text:new C(">",new v({color:B.foreground}))})}),new _1({child:X})]}),G=new m0({padding:U0.symmetric(1,0),child:new p({text:this.widget.props.title?new C(this.widget.props.title,new v({color:$.command,bold:!0})):new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new C("Enter",new v({color:$.keybind}))),V.push(new C(" to submit, ",new v({color:B.foreground,dim:!0})));V.push(new C("Esc",new v({color:$.keybind}))),V.push(new C(" to cancel",new v({color:B.foreground,dim:!0})));let U=new m0({padding:U0.symmetric(1,0),child:new p({text:new C("",void 0,V)})});return new m0({decoration:{border:F,color:B.background},padding:U0.all(1),child:new y0({children:[G,new K0({height:1}),D,new Z5,U]})})}}class Ft extends T0{props;constructor(A){super();this.props=A}createState(){return new W1A}}_Q();class H1A extends _0{controller=new P8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new V6({debugLabel:"CommandMultilinePrompt",onKey:(A)=>{if(A.key==="Escape"){if(this.isConfirmingClearInput){if(this.controller.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[],this.imagePaths=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.controller.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return this.widget.props.onDismiss(),"handled"}return"ignored"}});initState(){if(this.widget.props.initialText)this.controller.text=this.widget.props.initialText;if(this.widget.props.initialImages)this.imageAttachments=[...this.widget.props.initialImages];this.focusNode.requestFocus()}_handleInsertImage=async(A)=>{if(this.imageAttachments.length>=B7)return!1;let Q=await AX(A);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,A]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,Y=a1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new BG({controller:this.controller,triggers:[new _J],completionBuilder:this.widget.props.completionBuilder,onSubmitted:(K)=>{this.widget.props.onSubmit(K.trim(),this.imageAttachments)},theme:B,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:C4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),X=new d4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),D=new m0({constraints:new I1({maxHeight:Z}),padding:U0.symmetric(1,0),child:X}),G=new m0({padding:U0.symmetric(1,0),child:new p({text:new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=new m0({padding:U0.symmetric(1,0),child:new p({text:this.isConfirmingClearInput?new C("",void 0,[new C("Esc",new v({color:$.keybind})),new C(" again to clear input",new v({color:B.foreground,dim:!0}))]):new C("",void 0,[new C("Press ",new v({color:B.foreground,dim:!0})),new C("Enter",new v({color:$.keybind})),new C(" to submit, ",new v({color:B.foreground,dim:!0})),new C("Esc",new v({color:$.keybind})),new C(" to clear",new v({color:B.foreground,dim:!0}))])})}),U=[G,new K0({height:1}),new _1({child:D}),new K0({height:1}),V];return new m0({decoration:{border:d1.all(new c1(B.foreground,1,"solid")),color:B.background},padding:U0.all(1),child:new y0({children:U})})}}class C31 extends T0{props;constructor(A){super();this.props=A}createState(){return new H1A}}function q1A(A){let B=new Date().getTime()-A.getTime(),$=Math.floor(B/60000),J=Math.floor(B/3600000),Y=Math.floor(B/86400000);if($<1)return"just now";if($<60)return`${$}m ago`;if(J<24)return`${J}h ago`;if(Y<7)return`${Y}d ago`;return A.toLocaleDateString()}class M31 extends H1{props;debugLabel="NewsFeedPicker";constructor(A){super();this.props=A}build(A){let Q=[...this.props.entries].sort((J,Y)=>Y.pubDate.getTime()-J.pubDate.getTime()),B=Math.max(0,...Q.map((J)=>q1A(J.pubDate).length));return new X5({items:Q,getLabel:(J)=>J.title,onAccept:(J)=>this.props.onSelect?.(J),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(J,Y,Z,F)=>{let X=P0.of(F),{colors:D}=X,G=X.app,V=Y?G.selectionBackground:void 0,U=Y?G.selectionForeground:D.foreground,K=D.mutedForeground,E=(z,W)=>new K0({width:W,child:s0.end([new p({text:new C(z,new v({color:K}))})])});return new m0({decoration:V?{color:V}:void 0,padding:U0.symmetric(2,0),child:new s0({children:[new _1({child:new p({text:new C(J.title,new v({color:U})),overflow:"ellipsis",maxLines:1})}),new K0({width:2}),E(q1A(J.pubDate),B)]})})}})}}class EB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!EB._instance)EB._instance=new EB;return EB._instance}get allExpanded(){return this._allExpanded}setAllExpanded(A){if(this._allExpanded===A)return;this._allExpanded=A,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(A){return this._listeners.add(A),()=>this.removeListener(A)}removeListener(A){this._listeners.delete(A)}_notifyListeners(){for(let A of this._listeners)A()}}d0();class N1A extends _0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let A=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!A.ok){j.error("Failed to load labels",A.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=A.result,this.isLoading=!1,this.setState()}catch(A){j.error("Failed to load labels",A),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(A){let Q=A.trim().toLowerCase();if(Q.length===0)return null;if(Q.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Q))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(A){return this.getValidationError(A)===null&&A.length>0}getAvailableLabels(){let A=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!A.includes(Q.name))}shouldShowCreateMarker(A){if(A.length===0||this.isLoading)return!1;let Q=A.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let B=this.widget.props.currentLabels||[],$=this.labels.some((Y)=>Y.name===Q),J=B.includes(Q);return!$&&!J}build(A){let Q=P0.of(A),{app:B,colors:$}=Q,J=this.currentQuery.trim().toLowerCase(),Y=J.length>0?this.getValidationError(J):null,Z=this.getAvailableLabels(),X=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...Z];return new X5({title:"Add Label",items:X,getLabel:(D)=>{if("__isCreateMarker"in D)return this.currentQuery.trim().toLowerCase();return D.name},onAccept:(D)=>{if("__isCreateMarker"in D)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(D.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:Y||"Type to create a new label",renderItem:(D,G,V,U)=>{let K=G?B.selectionBackground:void 0,E=G?B.selectionForeground:$.foreground;if("__isCreateMarker"in D&&D.__isCreateMarker){let W=this.currentQuery.trim().toLowerCase();return new m0({decoration:K?{color:K}:void 0,padding:U0.symmetric(2,0),child:new p({text:new C("",void 0,[new C("Create new label: ",new v({color:E})),new C(W,new v({color:E,bold:!0}))])})})}return new m0({decoration:K?{color:K}:void 0,padding:U0.symmetric(2,0),child:new p({text:new C(D.name,new v({color:E}))})})},filterItem:(D,G)=>{if(this.currentQuery!==G)this.currentQuery=G,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in D&&D.__isCreateMarker)return this.shouldShowCreateMarker(G);let U=G.trim().toLowerCase();return U.length===0||D.name.includes(U)},sortItems:(D,G,V)=>{let U="__isCreateMarker"in D.item&&D.item.__isCreateMarker,K="__isCreateMarker"in G.item&&G.item.__isCreateMarker;if(U&&!K)return-1;if(!U&&K)return 1;return G.score-D.score}})}}class L31 extends T0{props;constructor(A){super();this.props=A}createState(){return new N1A}}class YG extends T0{props;constructor(A){super();this.props=A}createState(){return new I1A}}class I1A extends _0{_spinner=new H6;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,J=d1.all(new c1(B.foreground,1,"solid")),Y=this._spinner.toBraille(),Z=new p({textAlign:"center",text:new C("",void 0,[new C(Y,new v({color:$.processing})),new C(" ",void 0),new C(this.widget.props.message,new v({color:B.foreground}))])}),X=[new _1({child:new y0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)X.push(new K0({height:2,child:new m0({padding:U0.symmetric(2,0),child:new p({text:new C("",new v({dim:!0}),[new C("Press ",new v({color:B.foreground})),new C("Esc",new v({color:B.info})),new C(" to cancel",new v({color:B.foreground}))])})})}));let D=new m0({decoration:new T4(B.background,J),child:new K0({width:60,height:7,child:new y0({mainAxisAlignment:"start",children:X})})});if(this.widget.props.onAbort)return new a4({debugLabel:"LoadingDialog",child:new d4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:D})});return D}}class eU extends T0{props;constructor(A){super();this.props=A}createState(){return new w1A}}class w1A extends _0{scrollController=new xA;scrollAreaKey=new D2("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof u2}resolveFooterStyle(A){if(this.isWidgetMessage(A))return A.footerStyle;return"default"}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let B=Q.size;if(typeof B.height==="number"&&B.height>0)return this.viewportHeight=B.height,B.height}return this.viewportHeight}build(A){let Q=P0.of(A),B=this.widget.props.message,$=(()=>{if(this.isWidgetMessage(B))return{title:B.title,type:B.type};if(B instanceof Error&&B.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:B.message};if(B instanceof Error&&B.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:B.message};let G=nD0(B);return{title:G.title,type:G.type,description:G.description}})(),J=$.type==="error"?Q.app.toolError:Q.app.command,Y=d1.all(new c1(Q.colors.border,1,"solid")),Z=new m0({padding:U0.symmetric(1,0),child:new p({text:new C($.title,new v({color:J,bold:!0}))})}),F=this.isWidgetMessage(B)?B.widget:new p({text:new C($.description,new v({color:Q.colors.foreground})),selectable:!0}),X=new _1({child:new F3({child:new m0({padding:U0.symmetric(1,0),child:new s0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new _1({child:new fA({controller:this.scrollController,autofocus:!0,child:F})}),new z2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,V=this.scrollController.offset,U=this.getViewportHeight(),K=G+U;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(V,0)}}})]})})})}),D=new m0({padding:U0.symmetric(1,0),child:new p({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new v({color:Q.colors.foreground,dim:!0})),new C("R",new v({color:Q.app.keybind})),new C(" to retry, ",new v({color:Q.colors.foreground,dim:!0})),new C("Esc",new v({color:Q.app.keybind})),new C(" to cancel",new v({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new C("",new v({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new v({color:Q.app.keybind}),U=new v({color:Q.colors.foreground,dim:!0});return new C("",U,[new C("Press ",U),new C("Escape",V),new C(" to close • Use ",U),new C("↑↓",V),new C(" or ",U),new C("j/k",V),new C(" to scroll",U)])}return new C("Press any key to close",new v({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new a4({debugLabel:"MessageDialog",child:new $A({fit:"expand",children:[new k1({onClick:()=>{},child:new K0}),new d4({onKey:(G)=>{if(this.widget.props.onRetry&&G.key==="r")return this.widget.props.onRetry(),"handled";if(G.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new m0({decoration:{border:Y,color:Q.colors.background},padding:U0.all(1),child:new y0({mainAxisAlignment:"center",children:[Z,new K0({height:1}),X,D]})})})]})})}}W3();e1();class C1A extends T0{props;constructor(A){super();this.props=A}createState(){return new M1A}}class M1A extends _0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((A)=>{this.plugins=A,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(A){let Q=r0.file(this.widget.props.cwd),B=Y1.relativePath(Q,TA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return v5(A)}statusIcon(A){let Q=c8.default(),{colors:B,app:$}=Q;switch(A){case"loading":return{icon:"◌",color:B.warning};case"active":return{icon:"✓",color:$.toolSuccess};case"error":return{icon:"✗",color:$.toolError}}}build(A){let Q=P0.of(A),{app:B}=Q;if(this.plugins.length===0)return new p({text:new C("No plugins found.",new v({dim:!0}))});let $=[],J=this.plugins.length,Y=this.plugins.filter((X)=>X.status==="active").length,Z=this.plugins.reduce((X,D)=>X+D.registeredCommands.length,0),F=this.plugins.reduce((X,D)=>X+D.registeredTools.length,0);if($.push(new C(`${Y}/${J} ${D4(J,"plugin")} active`,new v({bold:!0}))),Z>0||F>0)$.push(new C(` (${Z} ${D4(Z,"command")}, ${F} ${D4(F,"tool")})`,new v({dim:!0})));$.push(new C(`
|
|
7561
|
+
`))}if(E)V.push(new C(" ",G)),V.push(new C("Total: ",G)),V.push(new C(Y(z),D))}return new m0({decoration:{color:F.background,border:d1.all(new c1(F.border,1,"rounded"))},child:new p({text:new C(void 0,void 0,V)})})}d0();function E1A(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}W3();I8();J3();c7();b7();e9();e8();_Q();vV();c4();rS();LT();L1();d0();e9();class w31{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(A,Q){this.enabled=A;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let A=Array.from(this.commandCounts.entries()).map(([Q,B])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1778732631-gc5875c"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await m30(Q,this.configService)}catch(Q){j.error("Failed to export command telemetry events",Q)}}async submit(A){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(A)||0;this.commandCounts.set(A,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class Xw extends T0{props;constructor(A){super();this.props=A}createState(){return new z1A}}class z1A extends _0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(A){let Q=(B)=>{this.setState(()=>{this._state=B(this._state)})};return this.widget.props.builder(A,Q,this._state)}}class W1A extends _0{controller=new P8;focusNode=new V6({debugLabel:"CommandArgumentPrompt",onKey:(A)=>{if(A.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,J=this.widget.props.isRequiredArg??!0,Y=this.controller.text.trim().length>0,Z=!J||Y,F=d1.all(new c1(B.foreground,1,"solid")),X=new $$({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(K)=>{let E=K.trim();if(J&&E.length===0)return;this.widget.props.onSubmit(E)},autofocus:!0,style:{textColor:B.foreground,border:null},maxLines:1}),D=new s0({children:[new m0({decoration:{color:B.background},child:new p({text:new C(">",new v({color:B.foreground}))})}),new _1({child:X})]}),G=new m0({padding:U0.symmetric(1,0),child:new p({text:this.widget.props.title?new C(this.widget.props.title,new v({color:$.command,bold:!0})):new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new C("Enter",new v({color:$.keybind}))),V.push(new C(" to submit, ",new v({color:B.foreground,dim:!0})));V.push(new C("Esc",new v({color:$.keybind}))),V.push(new C(" to cancel",new v({color:B.foreground,dim:!0})));let U=new m0({padding:U0.symmetric(1,0),child:new p({text:new C("",void 0,V)})});return new m0({decoration:{border:F,color:B.background},padding:U0.all(1),child:new y0({children:[G,new K0({height:1}),D,new Z5,U]})})}}class Ft extends T0{props;constructor(A){super();this.props=A}createState(){return new W1A}}_Q();class H1A extends _0{controller=new P8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new V6({debugLabel:"CommandMultilinePrompt",onKey:(A)=>{if(A.key==="Escape"){if(this.isConfirmingClearInput){if(this.controller.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[],this.imagePaths=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.controller.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return this.widget.props.onDismiss(),"handled"}return"ignored"}});initState(){if(this.widget.props.initialText)this.controller.text=this.widget.props.initialText;if(this.widget.props.initialImages)this.imageAttachments=[...this.widget.props.initialImages];this.focusNode.requestFocus()}_handleInsertImage=async(A)=>{if(this.imageAttachments.length>=B7)return!1;let Q=await AX(A);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,A]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,Y=a1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new BG({controller:this.controller,triggers:[new _J],completionBuilder:this.widget.props.completionBuilder,onSubmitted:(K)=>{this.widget.props.onSubmit(K.trim(),this.imageAttachments)},theme:B,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:C4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),X=new d4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),D=new m0({constraints:new I1({maxHeight:Z}),padding:U0.symmetric(1,0),child:X}),G=new m0({padding:U0.symmetric(1,0),child:new p({text:new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=new m0({padding:U0.symmetric(1,0),child:new p({text:this.isConfirmingClearInput?new C("",void 0,[new C("Esc",new v({color:$.keybind})),new C(" again to clear input",new v({color:B.foreground,dim:!0}))]):new C("",void 0,[new C("Press ",new v({color:B.foreground,dim:!0})),new C("Enter",new v({color:$.keybind})),new C(" to submit, ",new v({color:B.foreground,dim:!0})),new C("Esc",new v({color:$.keybind})),new C(" to clear",new v({color:B.foreground,dim:!0}))])})}),U=[G,new K0({height:1}),new _1({child:D}),new K0({height:1}),V];return new m0({decoration:{border:d1.all(new c1(B.foreground,1,"solid")),color:B.background},padding:U0.all(1),child:new y0({children:U})})}}class C31 extends T0{props;constructor(A){super();this.props=A}createState(){return new H1A}}function q1A(A){let B=new Date().getTime()-A.getTime(),$=Math.floor(B/60000),J=Math.floor(B/3600000),Y=Math.floor(B/86400000);if($<1)return"just now";if($<60)return`${$}m ago`;if(J<24)return`${J}h ago`;if(Y<7)return`${Y}d ago`;return A.toLocaleDateString()}class M31 extends H1{props;debugLabel="NewsFeedPicker";constructor(A){super();this.props=A}build(A){let Q=[...this.props.entries].sort((J,Y)=>Y.pubDate.getTime()-J.pubDate.getTime()),B=Math.max(0,...Q.map((J)=>q1A(J.pubDate).length));return new X5({items:Q,getLabel:(J)=>J.title,onAccept:(J)=>this.props.onSelect?.(J),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(J,Y,Z,F)=>{let X=P0.of(F),{colors:D}=X,G=X.app,V=Y?G.selectionBackground:void 0,U=Y?G.selectionForeground:D.foreground,K=D.mutedForeground,E=(z,W)=>new K0({width:W,child:s0.end([new p({text:new C(z,new v({color:K}))})])});return new m0({decoration:V?{color:V}:void 0,padding:U0.symmetric(2,0),child:new s0({children:[new _1({child:new p({text:new C(J.title,new v({color:U})),overflow:"ellipsis",maxLines:1})}),new K0({width:2}),E(q1A(J.pubDate),B)]})})}})}}class EB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!EB._instance)EB._instance=new EB;return EB._instance}get allExpanded(){return this._allExpanded}setAllExpanded(A){if(this._allExpanded===A)return;this._allExpanded=A,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(A){return this._listeners.add(A),()=>this.removeListener(A)}removeListener(A){this._listeners.delete(A)}_notifyListeners(){for(let A of this._listeners)A()}}d0();class N1A extends _0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let A=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!A.ok){j.error("Failed to load labels",A.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=A.result,this.isLoading=!1,this.setState()}catch(A){j.error("Failed to load labels",A),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(A){let Q=A.trim().toLowerCase();if(Q.length===0)return null;if(Q.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Q))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(A){return this.getValidationError(A)===null&&A.length>0}getAvailableLabels(){let A=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!A.includes(Q.name))}shouldShowCreateMarker(A){if(A.length===0||this.isLoading)return!1;let Q=A.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let B=this.widget.props.currentLabels||[],$=this.labels.some((Y)=>Y.name===Q),J=B.includes(Q);return!$&&!J}build(A){let Q=P0.of(A),{app:B,colors:$}=Q,J=this.currentQuery.trim().toLowerCase(),Y=J.length>0?this.getValidationError(J):null,Z=this.getAvailableLabels(),X=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...Z];return new X5({title:"Add Label",items:X,getLabel:(D)=>{if("__isCreateMarker"in D)return this.currentQuery.trim().toLowerCase();return D.name},onAccept:(D)=>{if("__isCreateMarker"in D)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(D.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:Y||"Type to create a new label",renderItem:(D,G,V,U)=>{let K=G?B.selectionBackground:void 0,E=G?B.selectionForeground:$.foreground;if("__isCreateMarker"in D&&D.__isCreateMarker){let W=this.currentQuery.trim().toLowerCase();return new m0({decoration:K?{color:K}:void 0,padding:U0.symmetric(2,0),child:new p({text:new C("",void 0,[new C("Create new label: ",new v({color:E})),new C(W,new v({color:E,bold:!0}))])})})}return new m0({decoration:K?{color:K}:void 0,padding:U0.symmetric(2,0),child:new p({text:new C(D.name,new v({color:E}))})})},filterItem:(D,G)=>{if(this.currentQuery!==G)this.currentQuery=G,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in D&&D.__isCreateMarker)return this.shouldShowCreateMarker(G);let U=G.trim().toLowerCase();return U.length===0||D.name.includes(U)},sortItems:(D,G,V)=>{let U="__isCreateMarker"in D.item&&D.item.__isCreateMarker,K="__isCreateMarker"in G.item&&G.item.__isCreateMarker;if(U&&!K)return-1;if(!U&&K)return 1;return G.score-D.score}})}}class L31 extends T0{props;constructor(A){super();this.props=A}createState(){return new N1A}}class YG extends T0{props;constructor(A){super();this.props=A}createState(){return new I1A}}class I1A extends _0{_spinner=new H6;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,J=d1.all(new c1(B.foreground,1,"solid")),Y=this._spinner.toBraille(),Z=new p({textAlign:"center",text:new C("",void 0,[new C(Y,new v({color:$.processing})),new C(" ",void 0),new C(this.widget.props.message,new v({color:B.foreground}))])}),X=[new _1({child:new y0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)X.push(new K0({height:2,child:new m0({padding:U0.symmetric(2,0),child:new p({text:new C("",new v({dim:!0}),[new C("Press ",new v({color:B.foreground})),new C("Esc",new v({color:B.info})),new C(" to cancel",new v({color:B.foreground}))])})})}));let D=new m0({decoration:new T4(B.background,J),child:new K0({width:60,height:7,child:new y0({mainAxisAlignment:"start",children:X})})});if(this.widget.props.onAbort)return new a4({debugLabel:"LoadingDialog",child:new d4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:D})});return D}}class eU extends T0{props;constructor(A){super();this.props=A}createState(){return new w1A}}class w1A extends _0{scrollController=new xA;scrollAreaKey=new D2("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof u2}resolveFooterStyle(A){if(this.isWidgetMessage(A))return A.footerStyle;return"default"}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let B=Q.size;if(typeof B.height==="number"&&B.height>0)return this.viewportHeight=B.height,B.height}return this.viewportHeight}build(A){let Q=P0.of(A),B=this.widget.props.message,$=(()=>{if(this.isWidgetMessage(B))return{title:B.title,type:B.type};if(B instanceof Error&&B.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:B.message};if(B instanceof Error&&B.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:B.message};let G=nD0(B);return{title:G.title,type:G.type,description:G.description}})(),J=$.type==="error"?Q.app.toolError:Q.app.command,Y=d1.all(new c1(Q.colors.border,1,"solid")),Z=new m0({padding:U0.symmetric(1,0),child:new p({text:new C($.title,new v({color:J,bold:!0}))})}),F=this.isWidgetMessage(B)?B.widget:new p({text:new C($.description,new v({color:Q.colors.foreground})),selectable:!0}),X=new _1({child:new F3({child:new m0({padding:U0.symmetric(1,0),child:new s0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new _1({child:new fA({controller:this.scrollController,autofocus:!0,child:F})}),new z2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,V=this.scrollController.offset,U=this.getViewportHeight(),K=G+U;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(V,0)}}})]})})})}),D=new m0({padding:U0.symmetric(1,0),child:new p({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new v({color:Q.colors.foreground,dim:!0})),new C("R",new v({color:Q.app.keybind})),new C(" to retry, ",new v({color:Q.colors.foreground,dim:!0})),new C("Esc",new v({color:Q.app.keybind})),new C(" to cancel",new v({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new C("",new v({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new v({color:Q.app.keybind}),U=new v({color:Q.colors.foreground,dim:!0});return new C("",U,[new C("Press ",U),new C("Escape",V),new C(" to close • Use ",U),new C("↑↓",V),new C(" or ",U),new C("j/k",V),new C(" to scroll",U)])}return new C("Press any key to close",new v({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new a4({debugLabel:"MessageDialog",child:new $A({fit:"expand",children:[new k1({onClick:()=>{},child:new K0}),new d4({onKey:(G)=>{if(this.widget.props.onRetry&&G.key==="r")return this.widget.props.onRetry(),"handled";if(G.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new m0({decoration:{border:Y,color:Q.colors.background},padding:U0.all(1),child:new y0({mainAxisAlignment:"center",children:[Z,new K0({height:1}),X,D]})})})]})})}}W3();e1();class C1A extends T0{props;constructor(A){super();this.props=A}createState(){return new M1A}}class M1A extends _0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((A)=>{this.plugins=A,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(A){let Q=r0.file(this.widget.props.cwd),B=Y1.relativePath(Q,TA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return v5(A)}statusIcon(A){let Q=c8.default(),{colors:B,app:$}=Q;switch(A){case"loading":return{icon:"◌",color:B.warning};case"active":return{icon:"✓",color:$.toolSuccess};case"error":return{icon:"✗",color:$.toolError}}}build(A){let Q=P0.of(A),{app:B}=Q;if(this.plugins.length===0)return new p({text:new C("No plugins found.",new v({dim:!0}))});let $=[],J=this.plugins.length,Y=this.plugins.filter((X)=>X.status==="active").length,Z=this.plugins.reduce((X,D)=>X+D.registeredCommands.length,0),F=this.plugins.reduce((X,D)=>X+D.registeredTools.length,0);if($.push(new C(`${Y}/${J} ${D4(J,"plugin")} active`,new v({bold:!0}))),Z>0||F>0)$.push(new C(` (${Z} ${D4(Z,"command")}, ${F} ${D4(F,"tool")})`,new v({dim:!0})));$.push(new C(`
|
|
7562
7562
|
|
|
7563
7563
|
`));for(let X of this.plugins){let{icon:D,color:G}=this.statusIcon(X.status),V=this.getRelativePath(X.uri);if($.push(new C(`${D} `,new v({color:G}))),$.push(new C(V,new v({bold:!0}))),$.push(new C(` ${X.status}`,new v({dim:!0}))),$.push(new C(`
|
|
7564
7564
|
`)),X.status==="active"&&X.registeredEvents.length>0)$.push(new C(" Events: ",new v({dim:!0}))),$.push(new C(X.registeredEvents.join(", "),new v({color:B.link}))),$.push(new C(`
|
|
@@ -7736,7 +7736,7 @@ ${s.content||""}`:s.content||"",f0=[],g0=s.baseDir.startsWith("file://")?NK0(s.b
|
|
|
7736
7736
|
`)}function J6A(A,Q){A.command("usage").description("Show your current Amp usage and credit balance").action(async(B,$)=>{let J=$.optsWithGlobals(),Y=await Q(J),Z=await Y.settings.get("proxy"),F=P04({settings:{url:Y.ampURL,proxy:Z},secrets:{getToken:(D,G)=>Y.secrets.get(D,G)}}),X=await r4.userDisplayBalanceInfo({},{config:F});if(!X.ok){if(X.error.code==="auth-required")process.stderr.write(a0.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(a0.red("Error: ")+X.error.message+`
|
|
7737
7737
|
`),process.exit(1)}process.stdout.write(await Ps5(X.result.displayText)+`
|
|
7738
7738
|
`),process.exit(0)})}var r13=lt.join(u$,"logs","headless.log"),R91=lt.join(vx,"device-id.json"),s13=`cli-tui-${v8A(16).toString("hex")}`;async function t13(){for(let A of pM)try{if((await A.listConfigs()).length>0)return A}catch(Q){j.debug("Failed to detect query-based IDE integration",{ideName:A.ideName,error:Q})}return}try{if(process.platform==="win32")await Promise.resolve().then(() => v4(bb(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){zB.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
|
|
7739
|
-
`)}function e13(A){process.emitWarning=(Q,B,$,J)=>{let Y=typeof Q==="string"?Q:Q.message||String(Q),Z=B||"Warning",F=!1;A.warn(Y,{name:Z,code:$})}}function q2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")FY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")FY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)FY("internal.model",B43(Q.model))}function O8A(A){let Q=A.indexOf(":");if(Q===-1)throw new s1(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let B=A.slice(0,Q).trim(),$=A.slice(Q+1).trim();if(!B||!$)throw new s1(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function A43(A){if(A===void 0)return;let Q=A.trim();if(z04(Q))return Q;throw new s1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function Q43(A,Q){if(gX(A,Q))return;let B=l$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new s1(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function B43(A){if(!A.includes("="))return O8A(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new s1(`Invalid mode-specific model entry "${$}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let Y=$.slice(0,J).trim(),Z=$.slice(J+1).trim();if(!Y)throw new s1(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new s1(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);O8A(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new s1("No valid model overrides found in --model flag value.",1);return Q}function $43(A,Q){if(A.getOptionValueSourceWithGlobals("sp")==="cli"&&Q.sp)return Q.sp;if(A.getOptionValueSourceWithGlobals("systemPrompt")==="cli"&&Q.systemPrompt)return Q.systemPrompt;return}async function J43(A){try{return await y8A(A,"utf-8")}catch{return A}}async function P91(A,Q,B){let $=$43(A,Q);if(!$)return;let J=gA(B)?B.features:[],Y=gA(B)?B.user.email:void 0;if(!at(J,TB.HARNESS_SYSTEM_PROMPT)&&!(Y&&x7(Y)))throw new s1("You are not allowed to do this.",1);FY("systemPrompt",await J43($))}function at(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function Y43(A){return A!=="pending"}function NW(A){if(!gA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function Z43(A){let Q=NW(A);if(Q)return Q.id;if(hX(A))throw Error(A.error.message);throw Error("unreachable")}function F43(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 X43(A){let $=F43(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 s1(`Couldn't connect to the Amp server at ${A}.`,1,$)}function it(A,Q){let B=Hs0(Error(A.error.message));if(B.message===E7.networkOffline||B.message===E7.networkTimeout)return X43(Q);if(B.message!==E7.internalBug)return new s1(B.message,1,B.suggestion);return new s1(A.error.message.replace(/^Error: /,""),1)}async function D43(){if(process.versions.bun)return!1;try{return await kU()==="npm"}catch(A){return j.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var j8A=[{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??cF,description:`Custom settings file path (overrides the default location ${cF})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(j).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${sa})`},{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:G9(),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:gM.SMART.key,description:`Set the agent mode (${d$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(d$().map((A)=>A.mode))),hiddenChoices:["frontier"]},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Disable thread-actors mode and use the legacy worker runtime",hidden:!0},{name:"neoOrb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"hideWelcome",long:"hide-welcome",type:"switch",description:"Skip the welcome experience on startup",hidden:!0},{name:"showWelcome",long:"show-welcome",type:"switch",description:"Show the welcome experience on startup",hidden:!0},{name:"observe",long:"observe",type:"option",description:"Open the Neo TUI as an observer of an existing thread (thread ID or URL)",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless thread-actor executor (no TUI). Optionally provide a thread ID to connect to existing thread, otherwise create one.",hidden:!0},{name:"sp",long:"sp",type:"option",description:"Custom system prompt text or file path",hidden:!0},{name:"systemPrompt",long:"system-prompt",type:"option",description:"Custom system prompt text",hidden:!0},{name:"model",long:"model",type:"option",description:'Override the model. Use "provider:model" for all modes, or "mode=provider:model,mode=provider:model" for mode-specific overrides',hidden:!0}],R8A=(A)=>("deprecated"in A)&&A.deprecated===!0,G43=(A)=>("hidden"in A)&&A.hidden===!0,V43=(A)=>("default"in A),U43=(A)=>("default"in A)?A.default:void 0;function XE0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=A43(Q.effort);if(B!==void 0)Q43(Q.mode,B);return B}function K43(A,Q){let B=Q.args[0],$=Q.commands.map((Y)=>Y.name());if(B&&!B.includes(" ")&&B.length<30&&!/[./\\]/.test(B)){let Y=$.filter((F)=>B.includes(F)||F.includes(B)),Z="Run amp --help for a list of available commands.";if(Y.length>0)Z=`Did you mean: ${Y.join(", ")}? Or run amp --help for all commands.`;throw new s1(E7.unknownCommand(B),1,Z)}}async function VE0(A){return{...A,getThreadEnvironment:yD,getEnvironmentData:(Q,B)=>ZD({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new OL(A.fileSystem),generateThreadTitle:_F4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>RQ(A.configService),pluginService:A.pluginService}}function x8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:yD,getEnvironmentData:(Q,B)=>ZD({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var DE0=r0.file(o13.homedir()),_91=process.env.XDG_CONFIG_HOME?r0.file(process.env.XDG_CONFIG_HOME):Y1.joinPath(DE0,".config");function E43(A){return $P4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(EX0())zX0();else LZ0(Q);let B=pj(),$=Dr();if((!B||$||fx())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(mD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(mD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(pj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function v8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;Z04("0.0.
|
|
7739
|
+
`)}function e13(A){process.emitWarning=(Q,B,$,J)=>{let Y=typeof Q==="string"?Q:Q.message||String(Q),Z=B||"Warning",F=!1;A.warn(Y,{name:Z,code:$})}}function q2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")FY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")FY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)FY("internal.model",B43(Q.model))}function O8A(A){let Q=A.indexOf(":");if(Q===-1)throw new s1(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let B=A.slice(0,Q).trim(),$=A.slice(Q+1).trim();if(!B||!$)throw new s1(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function A43(A){if(A===void 0)return;let Q=A.trim();if(z04(Q))return Q;throw new s1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function Q43(A,Q){if(gX(A,Q))return;let B=l$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new s1(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function B43(A){if(!A.includes("="))return O8A(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new s1(`Invalid mode-specific model entry "${$}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let Y=$.slice(0,J).trim(),Z=$.slice(J+1).trim();if(!Y)throw new s1(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new s1(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);O8A(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new s1("No valid model overrides found in --model flag value.",1);return Q}function $43(A,Q){if(A.getOptionValueSourceWithGlobals("sp")==="cli"&&Q.sp)return Q.sp;if(A.getOptionValueSourceWithGlobals("systemPrompt")==="cli"&&Q.systemPrompt)return Q.systemPrompt;return}async function J43(A){try{return await y8A(A,"utf-8")}catch{return A}}async function P91(A,Q,B){let $=$43(A,Q);if(!$)return;let J=gA(B)?B.features:[],Y=gA(B)?B.user.email:void 0;if(!at(J,TB.HARNESS_SYSTEM_PROMPT)&&!(Y&&x7(Y)))throw new s1("You are not allowed to do this.",1);FY("systemPrompt",await J43($))}function at(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function Y43(A){return A!=="pending"}function NW(A){if(!gA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function Z43(A){let Q=NW(A);if(Q)return Q.id;if(hX(A))throw Error(A.error.message);throw Error("unreachable")}function F43(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 X43(A){let $=F43(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 s1(`Couldn't connect to the Amp server at ${A}.`,1,$)}function it(A,Q){let B=Hs0(Error(A.error.message));if(B.message===E7.networkOffline||B.message===E7.networkTimeout)return X43(Q);if(B.message!==E7.internalBug)return new s1(B.message,1,B.suggestion);return new s1(A.error.message.replace(/^Error: /,""),1)}async function D43(){if(process.versions.bun)return!1;try{return await kU()==="npm"}catch(A){return j.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var j8A=[{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??cF,description:`Custom settings file path (overrides the default location ${cF})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(j).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${sa})`},{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:G9(),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:gM.SMART.key,description:`Set the agent mode (${d$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(d$().map((A)=>A.mode))),hiddenChoices:["frontier"]},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Disable thread-actors mode and use the legacy worker runtime",hidden:!0},{name:"neoOrb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"hideWelcome",long:"hide-welcome",type:"switch",description:"Skip the welcome experience on startup",hidden:!0},{name:"showWelcome",long:"show-welcome",type:"switch",description:"Show the welcome experience on startup",hidden:!0},{name:"observe",long:"observe",type:"option",description:"Open the Neo TUI as an observer of an existing thread (thread ID or URL)",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless thread-actor executor (no TUI). Optionally provide a thread ID to connect to existing thread, otherwise create one.",hidden:!0},{name:"sp",long:"sp",type:"option",description:"Custom system prompt text or file path",hidden:!0},{name:"systemPrompt",long:"system-prompt",type:"option",description:"Custom system prompt text",hidden:!0},{name:"model",long:"model",type:"option",description:'Override the model. Use "provider:model" for all modes, or "mode=provider:model,mode=provider:model" for mode-specific overrides',hidden:!0}],R8A=(A)=>("deprecated"in A)&&A.deprecated===!0,G43=(A)=>("hidden"in A)&&A.hidden===!0,V43=(A)=>("default"in A),U43=(A)=>("default"in A)?A.default:void 0;function XE0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=A43(Q.effort);if(B!==void 0)Q43(Q.mode,B);return B}function K43(A,Q){let B=Q.args[0],$=Q.commands.map((Y)=>Y.name());if(B&&!B.includes(" ")&&B.length<30&&!/[./\\]/.test(B)){let Y=$.filter((F)=>B.includes(F)||F.includes(B)),Z="Run amp --help for a list of available commands.";if(Y.length>0)Z=`Did you mean: ${Y.join(", ")}? Or run amp --help for all commands.`;throw new s1(E7.unknownCommand(B),1,Z)}}async function VE0(A){return{...A,getThreadEnvironment:yD,getEnvironmentData:(Q,B)=>ZD({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new OL(A.fileSystem),generateThreadTitle:_F4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>RQ(A.configService),pluginService:A.pluginService}}function x8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:yD,getEnvironmentData:(Q,B)=>ZD({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var DE0=r0.file(o13.homedir()),_91=process.env.XDG_CONFIG_HOME?r0.file(process.env.XDG_CONFIG_HOME):Y1.joinPath(DE0,".config");function E43(A){return $P4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(EX0())zX0();else LZ0(Q);let B=pj(),$=Dr();if((!B||$||fx())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(mD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(mD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(pj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function v8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;Z04("0.0.1778732631-gc5875c");let Y=n30({storage:A.settings,secretStorage:A.secrets,workspaceRoot:u0.of(r0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:DE0,userConfigDir:_91});Wt4(Y);let Z=await Y.getLatest();j.debug("Global configuration initialized",{settingsKeys:Object.keys(Z.settings)});let F=!1;{let a=await A.secrets.get("apiKey",A.ampURL);if(F=Boolean(a),j.info("API key lookup before login",{found:Boolean(a),ampURL:A.ampURL,deferAuth:$}),!a)if($)j.info("No API key found, continuing startup with deferred auth");else{r6.write(`No API key found. Starting login flow...
|
|
7740
7740
|
`);let A0=await z43(A),I0=await A.secrets.get("apiKey",A.ampURL);if(j.info("Login flow completed",{success:A0,storedKeyPresent:Boolean(I0),ampURL:A.ampURL}),!A0)await Tz(),process.exit(1);F=!0}}{let a=await Y.getLatest(),A0=a.settings.url,I0=a.secrets.isSet?.[A0];j.info("Config secrets state after login",{configURL:A0,apiKeySet:I0?.apiKey??!1})}let X=T1(RQ(Y).pipe(A5(Y43))),D=$?"pending":await X;if(!$)j.info("Server status resolved",{status:"ready",isAuthenticated:gA(D),isError:hX(D),errorMessage:hX(D)?D.error.message:void 0});let G=X.then((a)=>Z43(a));G.catch(()=>{return});let V=!Q.takeMeBack&&gA(D)&&at(D.features,TB.THREAD_ACTORS_TUI),U=V?"all":process.env.PLUGINS??"permissions",{toolService:K,dispose:E}=tR4({configService:Y}),z=new Map,W=()=>z.clear(),H=new Bb0(Y,A.settings.getWorkspaceRootPath()),q=$Y4({configService:Y,filesystem:k3}),N=i74({configService:Y,trustStore:H,skillMCPServers:q.skillMCPServers,uploadImageAttachments:V,createOAuthProvider:async(a,A0,I0)=>{let V0=`${a}:${A0}`,N0=z.get(V0);if(N0)return j.debug("Reusing existing OAuth provider for server",{serverName:a,serverUrl:A0}),N0;j.debug("Creating OAuth provider for server",{serverName:a,serverUrl:A0});let X0=(async()=>{let j0=new aM(A.secrets),Q0=await j0.getClientInfo(a,A0),w0=I0?.scopes??Q0?.scopes,n=Jb4();j.info("OAuth headless mode check",{useHeadless:n,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:r6.isTTY});let o;if(n)o=A.executeMode?$b4():Bb4(a);let s=new Uv0({storage:j0,serverName:a,serverUrl:A0,clientId:I0?.clientId??Q0?.clientId,clientSecret:I0?.clientSecret??Q0?.clientSecret,authUrl:I0?.authUrl??Q0?.authUrl,tokenUrl:I0?.tokenUrl??Q0?.tokenUrl,scopes:w0,headlessAuthHandler:o});return j.debug("OAuth provider created",{serverName:a,serverUrl:A0,hasManualClientId:!!(I0?.clientId??Q0?.clientId),willUseDCR:!(I0?.clientId??Q0?.clientId),scopes:w0,headlessMode:n,executeMode:A.executeMode}),s})();return z.set(V0,X0),X0}}),I=$a0({configService:Y,filesystem:k3,spawn:cY0}),w=Q.headless?as4():void 0,L=w??new TV0({configService:Y}),O=L instanceof TV0?L:void 0;if(O)O.pluginExecutorKind="local";let _=new n1(null),S=V?[...ss4(Z.settings)?[{name:"permissions",entryPoint:z51}]:[],{name:"thread-visibility",entryPoint:At4(Y,()=>X.then(NW)),alwaysLoad:!0}]:[],T=Ib0({configService:Y,fileSystem:k3,platform:L,loadGlobalPlugins:ot0(Y),pluginFilter:U,activeThread$:_,internalPlugins:S}),x=iQ4(T),h=[N,I,x],u;if(J)u=new Map;else if(A.executeMode){let a=await PO4({toolService:K,providers:h,initialTimeout:15000});u=a.registrations;for(let[A0,I0]of a.initErrors)j.warn(`${A0} provider initialization slow or failed:`,I0)}else u=Ja0({toolService:K,providers:h});if(Q.jetbrains)xM("JetBrains");else if(Q.ide&&cb4())xM("VS Code");else if(Q.ide&&lb4())xM("Neovim");else if(Q.ide){let a=await t13();if(a){let A0=$80(a.ideName);if(A0)xM(A0)}}if(A.executeMode)F04(!0);let k,f=d3.status.pipe(q1((a)=>Boolean(a.connected&&a.authenticated&&a.ideName&&J14(a.ideName))),R4()).subscribe((a)=>{if(a){if(!k)k=K.registerTool(RO4)}else k?.dispose(),k=void 0}),d;if(!A.executeMode){let a=await A.settings.get("fuzzy.alwaysIncludePaths")??[];d=new VX0(process.cwd(),{alwaysIncludePaths:a},!0)}else d=new class extends VX0{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let c=new Ng0(Sl(Y,{usesThreadActors:!1}),{maxThreads:200});j.info("Starting Amp background services");let g=new I51,l={configService:Y,toolService:K,mcpService:N,skillService:q,toolboxService:I,trustStore:H,threadService:c,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:d,fileSystem:k3,terminal:g,pluginService:T,pluginPlatform:O,headlessPluginPlatform:w,activeThread$:_,serverStatus:D,serverStatusPromise:X,viewerUserIDPromise:G,hasAPIKeyAtStartup:F};return{...l,async asyncDispose(){if(l.mcpService.hasAuthenticatingClients())j.info("Waiting for OAuth authentication to complete before exit..."),await l.mcpService.waitForAuthentication();for(let a of u.values())a.dispose();await l.mcpService.dispose(),W(),await l.threadService.asyncDispose(),l.configService.unsubscribe(),E(),l.fuzzyServer.dispose(),l.settingsStorage[Symbol.dispose](),f.unsubscribe(),k?.dispose(),await l.pluginService.dispose()}}}async function z43(A){if(!A.executeMode){if(!await $D0("Would you like to log in to Amp? [(y)es, (n)o]: "))return r6.write(`Login cancelled. Run the command again to retry.
|
|
7741
7741
|
`),!1}return await f8A(A)}async function f8A(A){let Q=v8A(32).toString("hex"),B=await lx(A.ampURL,Q),$=new AbortController;try{await fX(B,$.signal)}catch(Y){j.error("Error opening browser",{error:Y})}let J=await lx(A.ampURL,Q,!1);r6.write(`If your browser does not open automatically, visit:
|
|
7742
7742
|
|
|
@@ -7744,7 +7744,7 @@ ${a0.blue.bold(J)}
|
|
|
7744
7744
|
|
|
7745
7745
|
`);try{return await Vg4(A.ampURL,Q,A.secrets,$),r6.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(Y){return j.error("Login failed",{error:Y}),zB.write(`
|
|
7746
7746
|
Login failed: ${Y instanceof Error?Y.message:String(Y)}
|
|
7747
|
-
`),!1}}async function W43(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new s1("No Amp API key found. Run `amp login` first.",1);let J=i13("curl",["-H",`Authorization: Bearer ${$}`,...B],{stdio:"inherit"});process.exitCode=await new Promise((Y,Z)=>{J.on("error",Z),J.on("close",(F)=>Y(F??1))})}function H43(A){let Q=new dN().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((W)=>{if(W.code==="commander.help"||W.code==="commander.version"||W.exitCode===0)Ij(),process.exit(0);let H=W.originalError??W;hv4(H)}),Nm4(Q,{version:"0.0.
|
|
7747
|
+
`),!1}}async function W43(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new s1("No Amp API key found. Run `amp login` first.",1);let J=i13("curl",["-H",`Authorization: Bearer ${$}`,...B],{stdio:"inherit"});process.exitCode=await new Promise((Y,Z)=>{J.on("error",Z),J.on("close",(F)=>Y(F??1))})}function H43(A){let Q=new dN().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((W)=>{if(W.code==="commander.help"||W.code==="commander.version"||W.exitCode===0)Ij(),process.exit(0);let H=W.originalError??W;hv4(H)}),Nm4(Q,{version:"0.0.1778732631-gc5875c",buildTimestamp:"2026-05-14T04:27:49.335Z",buildType:"'release'"}),Q.addHelpText("after",mb4()),Q.configureHelp({formatHelp:pb4}),Q.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await j43(N)}),Q.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await O43(N,await Fe0(q,N.settings))}),fv4(Q,p5);let $=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(...W)=>{let H=W.find((w)=>typeof w==="object"&&w!==null&&typeof w.optsWithGlobals==="function")??$,q=W.filter((w)=>w!==H).flatMap((w)=>Array.isArray(w)?w:typeof w==="string"?[w]:[]),N=H.optsWithGlobals(),I=await p5(N);await W43(I.ampURL,I.secrets,q),process.exit(process.exitCode??0)});Q.command("git-credential-helper [action]",{hidden:!0}).summary("Git credential helper for GitHub").description("Internal: implements the git credential helper protocol. Used inside sandboxes to authenticate git operations with GitHub.").action(async(W,H,q)=>{let N=q.optsWithGlobals(),I=await p5(N);await af4(W??"get",I.ampURL,I.secrets),process.exit(process.exitCode??0)}),Q.command("sign-commit",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements the gpg signing interface for git commit signing. Used inside sandboxes as gpg.program.").allowUnknownOption().action(async(W,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await of4(N.ampURL,N.secrets),process.exit(process.exitCode??0)}),Q.command("keyboard-tester",{hidden:!0}).summary("Keyboard input tester").description("Internal: stream parsed terminal input events as JSONL.").option("--raw","Log raw incoming terminal bytes before parsing").action(async(W)=>{await Gh4({raw:W.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(`
|
|
7748
7748
|
`)).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(W,H,q)=>{if(W&&H.apply)throw new s1("Choose either a positional thread ID/URL or --apply <thread-id>, not both.",1);let N=H.apply??W;if(!N||N.trim().length===0)r6.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.
|
|
7749
7749
|
|
|
7750
7750
|
`),q.outputHelp(),process.exit(0);let I=s8(N)??sB(N),w=q.optsWithGlobals(),L=await p5(w);q2(q,w);let O=await v8(L,w),_=!1;try{if(H.checkout&&H.skipCheckout)throw new s1("Choose either --checkout or --skip-checkout, not both.",1);if(hX(O.serverStatus))throw it(O.serverStatus,L.ampURL);let S=gA(O.serverStatus)?O.serverStatus.features:void 0;if(!at(S,TB.V2))throw new s1("live-sync is not enabled for your user",1);await Ag4({ampURL:L.ampURL,threadId:I,configService:O.configService,threadService:O.threadService,apiKey:process.env.AMP_API_KEY,applyOnce:typeof H.apply==="string",checkoutMode:H.checkout?"always":H.skipCheckout?"never":"prompt",promptForYesNo:$D0}),_=!0}finally{if(await O.asyncDispose(),_)process.exit(0)}});let J=async(W,H,q)=>{n30({storage:H.settings,secretStorage:H.secrets,workspaceRoot:u0.of(r0.file(process.cwd())),defaultAmpURL:H.ampURL,homeDir:DE0,userConfigDir:_91});let N={...H,executeMode:!1};await GE0(N,{...W,openThreadSwitcher:!0},q,A)},Y=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").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await S8A(q,N,H)});Y.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await u43(q,N,H)}),Y.command("continue [threadIDOrURL]").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.").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(W,H,q)=>{let N=q.optsWithGlobals(),I=await p5(N);if(H.pick)zB.write(`${a0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
@@ -7777,8 +7777,8 @@ ${L}
|
|
|
7777
7777
|
`))}),H.args.length>0)K43(N,H);await GE0(N,q,H,A)}),ju4(Q),Q}async function nt(A,Q){await BB((B)=>nx(B,A,Q))}async function P8A(A,Q,B){let $=Date.now(),[J,Y]=await Promise.all([r4.getThreadLinkInfo({thread:A},{config:Q}),B]);if(j.getChild("fetchAndStartThread").info(`Ownership check in ${Date.now()-$}ms`),J.ok){let Z=J.result.creatorUserID;if(Z&&Z!==Y&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new s1(`Cannot resume thread created by another user.
|
|
7778
7778
|
|
|
7779
7779
|
This thread belongs to a different user and cannot be continued for security reasons. Set AMP_RESUME_OTHER_USER_THREADS_INSECURE=1 to bypass this check.`)}}async function b8A(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await yV0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await yV0()).trimEnd(),stdinInput:null}}function u8A(A,Q,B){if(A.streamJson&&!Q)throw new s1("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(A.streamJsonInput&&!Q)throw new s1("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(A.streamJsonInput&&!A.streamJson)throw new s1("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(A.stats&&A.streamJson)throw new s1("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 s1("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(A.archive&&!Q)throw new s1("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 s1("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&&B===""&&!A.streamJsonInput&&!A.headless)throw new s1("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"
|
|
7780
|
-
Or pipe via stdin: echo "your message" | amp --execute`)}function q43(){lA4([$30.parse({tool:"*",action:"allow"})]),wA4({bypass:!0})}async function GE0(A,Q,B,$){if(Q.headless)return N43(A,Q,B);let J=await v8(A,Q),Y=await J.serverStatusPromise,Z=gA(Y)&&at(Y.features,TB.THREAD_ACTORS_TUI),F=Z&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await J.asyncDispose(),new s1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!Z)throw await J.asyncDispose(),new s1("--show-welcome is only available with the new Amp CLI feature flag",1);if(F){let X=!A.executeMode&&await D43();return q43(),I43(A,Q,B,J,{showNpmMigrationWelcome:X})}else{if(Q.threadId&&H9(Q.threadId)){let X=await r4.getThreadLinkInfo({thread:Q.threadId},{config:J.configService}).catch(()=>null);if(X?.ok&&X.result.usesThreadActors)throw await J.asyncDispose(),new s1(`Thread ${Q.threadId} was created with the Neo TUI and cannot be continued in the legacy CLI.`,1,"Re-run without --take-me-back to continue this thread.")}return w43(A,Q,B,$,{dependencies:J})}}async function N43(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=Xs0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};q2(B,Q);let J=process.hrtime.bigint(),Y=await v8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(hX(Z))throw it(Z,A.ampURL);let F=gA(Z)?Z:null,X=F?.user.email;await P91(B,Q,Z);let D=NW(Z),G=af(Q,D);if(G instanceof Error)V5(G.message);if(F&&!hM(Q.mode,X))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!X||!x7(X)))throw new s1("Headless executor mode is only available for Amp employees",1);RF0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new s1("API key required for headless mode. Please run `amp login` first.",1);let K=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(K&&!H9(K))throw new s1(`Invalid thread ID: ${K}`,1);let E=K?void 0:await f43({dependencies:Y,apiKey:U,visibility:G??void 0}),z=K??E?.threadId;if(!z)throw new s1("Failed to resolve headless thread ID",1);let W=await Xb4(z);if(W.status==="already-running")await Y.asyncDispose(),await Tz(),process.exit(0);try{await ef4({ampURL:A.ampURL,apiKey:U,workspaceRoot:process.cwd(),threadId:z,ownerUserId:E?.ownerUserId,threadVersion:E?.threadVersion,agentMode:E?.agentMode,initialToolDiscovery:Promise.all([Y.mcpService.initialized,Y.toolboxService.initialized,Y.pluginService.initialized]).then(()=>{return}),configService:Y.configService,mcpService:Y.mcpService,toolService:Y.toolService,skillService:Y.skillService,fileSystem:Y.fileSystem,pluginService:Y.pluginService,pluginPlatform:Y.headlessPluginPlatform})}finally{await W.release(),await Y.asyncDispose()}await Tz(),process.exit(0)}async function I43(A,Q,B,$,J){let{userInput:Y,stdinInput:Z}=await b8A(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;u8A({...Q,streamJson:F},A.executeMode,Y),q2(B,Q),_v4(),RF0();let X=Q.threadId&&H9(Q.threadId)?Q.threadId:void 0,D=Q.observe?s8(Q.observe)??sB(Q.observe):void 0,G=await $.serverStatusPromise;if(hX(G))throw it(G,A.ampURL);let V=NW(G),U=af(Q,V);if(U instanceof Error)V5(U.message);let K=null,E=()=>{return K??=(async()=>{let H=await ta(A.settings,process.cwd(),V,U);if(H instanceof Error)V5(H.message);return H})(),K},z=await $.secretStorage.get("apiKey",A.ampURL);if(!z)throw new s1("API key required. Please run `amp login` first.",1);let W=gA(G)&&x7(G.user.email);if(A.executeMode){X01($.mcpService,A.settings);try{let H=XE0(B,Q),q=await mz(),N=X?H:JD0({agentMode:Q.mode,explicitEffort:H,sessionState:q}),I=X?void 0:YD0(await ix($.configService),{agentMode:Q.mode,explicitEffort:H,sessionState:q}),w=X?void 0:await E(),L=await jf4({apiKey:z,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:$,userInput:Y,stdinInput:Z,stats:!!Q.stats,streamJson:F,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:N,labels:Q.label,initialThreadID:X,initialThreadMeta:w,initialSettings:I});if(await nt(L,"execute"),Q.archive)await $.threadService.archive(L,!0)}finally{await $.asyncDispose()}await Tz(),process.exit(0)}else{let H=XE0(B,Q),q=J.showNpmMigrationWelcome?"npm-migration":"intro",N=PX0("0.0.1778718002-g664bf7",$.settingsStorage,{startDelayMs:3000}),I=Sl($.configService),w=new Xt($.fuzzyServer),L=process.cwd();await gs4({ampURL:A.ampURL,apiKey:z,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??mF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:O})=>Lx({fileSystem:$.fileSystem,workspaceRoot:L},O),completionBuilder:w,workspaceRoot:L,listThreads:()=>I.listThreads(),getThreadFromServer:(O)=>I.getThread(O),toolboxes:$.toolboxService.toolboxes,isInternalUser:W,settingsFilePath:$.settingsStorage.getSettingsFilePath(),setActiveThreadID:(O)=>$.activeThread$.next(O),dispose:()=>{return N.dispose(),$.asyncDispose()}},{initialThreadID:D??X,initialUserInput:Y||void 0,getDefaultNewThreadVisibility:E,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!D,splashOrbVisualStyle:"neo",hideNeoWelcome:!!Q.hideWelcome,showNeoWelcome:Q.showWelcome,neoWelcomeVariant:q,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:H}),process.exit(0)}}async function w43(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(X0,j0)=>{let Q0=Number(process.hrtime.bigint()-j0)/1e6,w0=Xs0();j.info("Startup phase",{phase:X0,phaseMs:Math.round(Q0),sinceMainMs:w0===null?void 0:Math.round(w0)})},{userInput:F,stdinInput:X}=await b8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;u8A({...Q,streamJson:D},A.executeMode,F),q2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await v8(A,Q),U=V.hasAPIKeyAtStartup,K=V.serverStatus==="pending";if(j.info("Interactive auth startup mode",{deferInteractiveAuth:K,hasAPIKeyAtStartup:U,executeMode:A.executeMode,headless:Boolean(Q.headless)}),!J)Z("runMainThread:createThreadDependencies",G);let{serverStatus:E}=V;if(!K&&hX(E))throw it(E,A.ampURL);let z=gA(E)?E:null,W=z?.user.email,H=!!(W&&x7(W));if(H)RF0();if(!K)await P91(B,Q,E);let q=NW(E),N=q?.features??[],I=q?.team??null,w=af(Q,q);if(w instanceof Error)V5(w.message);if(z&&!hM(Q.mode,W))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let L=Q.threadId&&H9(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await VE0(V);Z("runMainThread:createWorkerDeps",G);let _=A.executeMode?void 0:async(X0)=>nt(X0,"interactive"),S={threadService:V.threadService,workerDeps:O,createThread:async(X0)=>{let j0=K?await V.serverStatusPromise:E,Q0=await ta(A.settings,process.cwd(),NW(j0),w);if(Q0 instanceof Error)V5(Q0.message);return A21(O,{threadMeta:Q0,agentMode:X0??Q.mode,onFirstAssistantMessage:_})},validateThreadOwnership:async(X0,j0)=>{if(j0?.nonBlockingOwnershipCheck){P8A(X0,V.configService,V.viewerUserIDPromise).catch((Q0)=>{if(Q0 instanceof s1){if(j0.onOwnershipError){j0.onOwnershipError(Q0,X0);return}kz(Q0,X0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})});return}try{await P8A(X0,V.configService,V.viewerUserIDPromise)}catch(Q0){if(Q0 instanceof s1)throw Q0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:_,handleError:kz},T=async()=>{try{return A6A(S,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(X0){if(X0 instanceof s1)throw X0;throw await kz(X0,Q.threadId),Error("handleError should have called process.exit()")}},x=(async()=>{if(K){j.info("Skipping initial free tier status fetch until auth is complete");return}try{let X0=await V.configService.getLatest(),j0=mm(X0),Q0=await r4.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(j0)});if(Q0.ok)return j.info("User free tier status:",Q0),Q0.result;return}catch(X0){j.error("Failed to fetch free tier status:",X0);return}})(),u=!A.executeMode?new O51:null,k,f=null;if(u)k=u,f=(async()=>{let X0=K?await V.serverStatusPromise:V.serverStatus;if(hX(X0))throw it(X0,A.ampURL);await P91(B,Q,X0);let j0=process.hrtime.bigint(),Q0=await T();if(Z("runMainThread:createThreadPool",j0),u.attach(Q0),F){let w0=await T1(Q0.threadHandles$);if(!w0)throw new s1("No active thread is available yet.",1);await w0.sendMessage({content:[{type:"text",text:F}]})}})(),f.catch(async(X0)=>{let j0=X0 instanceof Error?X0:Error(String(X0));u.setInitError(j0),await kz(X0,Q.threadId)});else G=process.hrtime.bigint(),k=await T(),Z("runMainThread:createThreadPool",G);let d=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let c=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),E43({configService:V.configService,threadService:V.threadService,config:c,useNotificationsForService:d,threadViewStates$:()=>k.threadHandles$.pipe(x4((X0)=>{if(!X0)return u0.of({});return L6(X0.thread$,X0.threadViewState$).pipe(q1(([j0,Q0])=>({[j0.id]:Q0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){X01(V.mcpService,A.settings);let X0=XE0(B,Q),j0=await mz(),Q0=L?X0:JD0({agentMode:Q.mode,explicitEffort:X0,sessionState:j0}),w0={userInput:F,stdinInput:X,dependencies:V,streamJson:D,streamJsonInput:!!Q.streamJsonInput,streamJsonThinking:!!Q.streamJsonThinking,stats:!!Q.stats,ampURL:A.ampURL,isInternalUser:H,agentMode:Q.mode,reasoningEffort:Q0,labels:Q.label},n=await Zy4({threadPool:k,...w0});if(await nt(n,"execute"),Q.archive)await V.threadService.archive(n,!0);await V.asyncDispose(),process.exit(0)}let g=!1,l=!1;if(Q.jetbrains||Q.ide){await J80();let X0=await pX({jetbrainsOnly:Q.jetbrains});if(X0.length===0){if(Q.jetbrains)g=!await V.configService.get("jetbrains.skipInstall")}else if(X0.length===1){let j0=X0[0];if(j0)d3.selectConfig(j0)}else l=!0}G=process.hrtime.bigint();let a=PX0("0.0.1778718002-g664bf7",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let A0=new D01(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let X0=await T1(k.threadHandles$);if(!X0)throw new s1("No active thread is available yet.",1);await X0.sendMessage({content:[{type:"text",text:F}]})}G=process.hrtime.bigint();let I0=await mz();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",I0);let V0=XE0(B,Q),N0={...I0,launchCount:I0.launchCount+1,lastReasoningEffortByMode:V0?{...I0.lastReasoningEffortByMode,[Q.mode]:V0}:I0.lastReasoningEffortByMode};BB((X0)=>({...X0,launchCount:X0.launchCount+1}));try{if(G=process.hrtime.bigint(),await Ke4({history:new Ho,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:r4,threadPool:k,createSystemPromptDeps:async()=>x8A(V),ideClient:d3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:A0,updateService:a,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:L,showJetBrainsInstaller:g,showIdePickerHint:l,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:s13,logFile:{path:$},sessionState:N0,freeTierStatusPromise:x,workspace:I??null,features:N,isInternalUser:H,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-14T00:23:59.092Z"},(X0)=>new S51({...X0,threadPool:X0.threadPool},(j0)=>new t81({...j0,threadState:j0.threadState}))),Z("runMainThread:mountApp-returned",G),f)await f}finally{await k.dispose().catch((X0)=>{j.error("Failed to dispose thread pool during shutdown",X0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function p5(A){if(j.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)zB.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
7781
|
-
`);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,B=process.stdout.isTTY&&process.stderr.isTTY;j.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let $=await s74({get:async(F)=>{if(F!==ld)return;try{let X=await y8A(R91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==ld)return;await n13(lt.dirname(R91),{recursive:!0}),await a13(R91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:T90()});X04($);let J=await Mb4({...A,workspaceTrust:{current:!0,changes:pm},getHook:process.env.AMP_URL?(F,X)=>{if(F==="url")return Promise.resolve(process.env.AMP_URL);return X()}:void 0});if(A.mcpConfig){let F=await wg4(A.mcpConfig);J=Cg4(J,F)}let Y=lt.dirname(J.getSettingsFilePath());BP4(vx,Y),J=ms1(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=f7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!bH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:Ut4(await Fe0(A,J))}}function C43(A){let Q={};for(let B=0;B<A.length;B++){let $=A[B];if($?.startsWith("--")){let Y=$.slice(2).replace(/-([a-z])/g,(F,X)=>X.toUpperCase()),Z=A[B+1];if(Z&&!Z.startsWith("--"))Q[Y]=Z,B++}}return Q}function M43(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=lt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?r13:sa));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function L43(){Mv4();let A=C43(process.argv),Q=M43(process.argv,A),B=Tv4(Q);sZ0("silent");let $=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)a0.level=0;if(e13(j),j.info("Starting Amp CLI.",{version:"0.0.
|
|
7780
|
+
Or pipe via stdin: echo "your message" | amp --execute`)}function q43(){lA4([$30.parse({tool:"*",action:"allow"})]),wA4({bypass:!0})}async function GE0(A,Q,B,$){if(Q.headless)return N43(A,Q,B);let J=await v8(A,Q),Y=await J.serverStatusPromise,Z=gA(Y)&&at(Y.features,TB.THREAD_ACTORS_TUI),F=Z&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await J.asyncDispose(),new s1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!Z)throw await J.asyncDispose(),new s1("--show-welcome is only available with the new Amp CLI feature flag",1);if(F){let X=!A.executeMode&&await D43();return q43(),I43(A,Q,B,J,{showNpmMigrationWelcome:X})}else{if(Q.threadId&&H9(Q.threadId)){let X=await r4.getThreadLinkInfo({thread:Q.threadId},{config:J.configService}).catch(()=>null);if(X?.ok&&X.result.usesThreadActors)throw await J.asyncDispose(),new s1(`Thread ${Q.threadId} was created with the Neo TUI and cannot be continued in the legacy CLI.`,1,"Re-run without --take-me-back to continue this thread.")}return w43(A,Q,B,$,{dependencies:J})}}async function N43(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=Xs0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};q2(B,Q);let J=process.hrtime.bigint(),Y=await v8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(hX(Z))throw it(Z,A.ampURL);let F=gA(Z)?Z:null,X=F?.user.email;await P91(B,Q,Z);let D=NW(Z),G=af(Q,D);if(G instanceof Error)V5(G.message);if(F&&!hM(Q.mode,X))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!X||!x7(X)))throw new s1("Headless executor mode is only available for Amp employees",1);RF0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new s1("API key required for headless mode. Please run `amp login` first.",1);let K=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(K&&!H9(K))throw new s1(`Invalid thread ID: ${K}`,1);let E=K?void 0:await f43({dependencies:Y,apiKey:U,visibility:G??void 0}),z=K??E?.threadId;if(!z)throw new s1("Failed to resolve headless thread ID",1);let W=await Xb4(z);if(W.status==="already-running")await Y.asyncDispose(),await Tz(),process.exit(0);try{await ef4({ampURL:A.ampURL,apiKey:U,workspaceRoot:process.cwd(),threadId:z,ownerUserId:E?.ownerUserId,threadVersion:E?.threadVersion,agentMode:E?.agentMode,initialToolDiscovery:Promise.all([Y.mcpService.initialized,Y.toolboxService.initialized,Y.pluginService.initialized]).then(()=>{return}),configService:Y.configService,mcpService:Y.mcpService,toolService:Y.toolService,skillService:Y.skillService,fileSystem:Y.fileSystem,pluginService:Y.pluginService,pluginPlatform:Y.headlessPluginPlatform})}finally{await W.release(),await Y.asyncDispose()}await Tz(),process.exit(0)}async function I43(A,Q,B,$,J){let{userInput:Y,stdinInput:Z}=await b8A(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;u8A({...Q,streamJson:F},A.executeMode,Y),q2(B,Q),_v4(),RF0();let X=Q.threadId&&H9(Q.threadId)?Q.threadId:void 0,D=Q.observe?s8(Q.observe)??sB(Q.observe):void 0,G=await $.serverStatusPromise;if(hX(G))throw it(G,A.ampURL);let V=NW(G),U=af(Q,V);if(U instanceof Error)V5(U.message);let K=null,E=()=>{return K??=(async()=>{let H=await ta(A.settings,process.cwd(),V,U);if(H instanceof Error)V5(H.message);return H})(),K},z=await $.secretStorage.get("apiKey",A.ampURL);if(!z)throw new s1("API key required. Please run `amp login` first.",1);let W=gA(G)&&x7(G.user.email);if(A.executeMode){X01($.mcpService,A.settings);try{let H=XE0(B,Q),q=await mz(),N=X?H:JD0({agentMode:Q.mode,explicitEffort:H,sessionState:q}),I=X?void 0:YD0(await ix($.configService),{agentMode:Q.mode,explicitEffort:H,sessionState:q}),w=X?void 0:await E(),L=await jf4({apiKey:z,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:$,userInput:Y,stdinInput:Z,stats:!!Q.stats,streamJson:F,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:N,labels:Q.label,initialThreadID:X,initialThreadMeta:w,initialSettings:I});if(await nt(L,"execute"),Q.archive)await $.threadService.archive(L,!0)}finally{await $.asyncDispose()}await Tz(),process.exit(0)}else{let H=XE0(B,Q),q=J.showNpmMigrationWelcome?"npm-migration":"intro",N=PX0("0.0.1778732631-gc5875c",$.settingsStorage,{startDelayMs:3000}),I=Sl($.configService),w=new Xt($.fuzzyServer),L=process.cwd();await gs4({ampURL:A.ampURL,apiKey:z,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??mF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:O})=>Lx({fileSystem:$.fileSystem,workspaceRoot:L},O),completionBuilder:w,workspaceRoot:L,listThreads:()=>I.listThreads(),getThreadFromServer:(O)=>I.getThread(O),toolboxes:$.toolboxService.toolboxes,isInternalUser:W,settingsFilePath:$.settingsStorage.getSettingsFilePath(),setActiveThreadID:(O)=>$.activeThread$.next(O),dispose:()=>{return N.dispose(),$.asyncDispose()}},{initialThreadID:D??X,initialUserInput:Y||void 0,getDefaultNewThreadVisibility:E,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!D,splashOrbVisualStyle:"neo",hideNeoWelcome:!!Q.hideWelcome,showNeoWelcome:Q.showWelcome,neoWelcomeVariant:q,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:H}),process.exit(0)}}async function w43(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(X0,j0)=>{let Q0=Number(process.hrtime.bigint()-j0)/1e6,w0=Xs0();j.info("Startup phase",{phase:X0,phaseMs:Math.round(Q0),sinceMainMs:w0===null?void 0:Math.round(w0)})},{userInput:F,stdinInput:X}=await b8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;u8A({...Q,streamJson:D},A.executeMode,F),q2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await v8(A,Q),U=V.hasAPIKeyAtStartup,K=V.serverStatus==="pending";if(j.info("Interactive auth startup mode",{deferInteractiveAuth:K,hasAPIKeyAtStartup:U,executeMode:A.executeMode,headless:Boolean(Q.headless)}),!J)Z("runMainThread:createThreadDependencies",G);let{serverStatus:E}=V;if(!K&&hX(E))throw it(E,A.ampURL);let z=gA(E)?E:null,W=z?.user.email,H=!!(W&&x7(W));if(H)RF0();if(!K)await P91(B,Q,E);let q=NW(E),N=q?.features??[],I=q?.team??null,w=af(Q,q);if(w instanceof Error)V5(w.message);if(z&&!hM(Q.mode,W))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let L=Q.threadId&&H9(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await VE0(V);Z("runMainThread:createWorkerDeps",G);let _=A.executeMode?void 0:async(X0)=>nt(X0,"interactive"),S={threadService:V.threadService,workerDeps:O,createThread:async(X0)=>{let j0=K?await V.serverStatusPromise:E,Q0=await ta(A.settings,process.cwd(),NW(j0),w);if(Q0 instanceof Error)V5(Q0.message);return A21(O,{threadMeta:Q0,agentMode:X0??Q.mode,onFirstAssistantMessage:_})},validateThreadOwnership:async(X0,j0)=>{if(j0?.nonBlockingOwnershipCheck){P8A(X0,V.configService,V.viewerUserIDPromise).catch((Q0)=>{if(Q0 instanceof s1){if(j0.onOwnershipError){j0.onOwnershipError(Q0,X0);return}kz(Q0,X0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})});return}try{await P8A(X0,V.configService,V.viewerUserIDPromise)}catch(Q0){if(Q0 instanceof s1)throw Q0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:_,handleError:kz},T=async()=>{try{return A6A(S,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(X0){if(X0 instanceof s1)throw X0;throw await kz(X0,Q.threadId),Error("handleError should have called process.exit()")}},x=(async()=>{if(K){j.info("Skipping initial free tier status fetch until auth is complete");return}try{let X0=await V.configService.getLatest(),j0=mm(X0),Q0=await r4.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(j0)});if(Q0.ok)return j.info("User free tier status:",Q0),Q0.result;return}catch(X0){j.error("Failed to fetch free tier status:",X0);return}})(),u=!A.executeMode?new O51:null,k,f=null;if(u)k=u,f=(async()=>{let X0=K?await V.serverStatusPromise:V.serverStatus;if(hX(X0))throw it(X0,A.ampURL);await P91(B,Q,X0);let j0=process.hrtime.bigint(),Q0=await T();if(Z("runMainThread:createThreadPool",j0),u.attach(Q0),F){let w0=await T1(Q0.threadHandles$);if(!w0)throw new s1("No active thread is available yet.",1);await w0.sendMessage({content:[{type:"text",text:F}]})}})(),f.catch(async(X0)=>{let j0=X0 instanceof Error?X0:Error(String(X0));u.setInitError(j0),await kz(X0,Q.threadId)});else G=process.hrtime.bigint(),k=await T(),Z("runMainThread:createThreadPool",G);let d=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let c=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),E43({configService:V.configService,threadService:V.threadService,config:c,useNotificationsForService:d,threadViewStates$:()=>k.threadHandles$.pipe(x4((X0)=>{if(!X0)return u0.of({});return L6(X0.thread$,X0.threadViewState$).pipe(q1(([j0,Q0])=>({[j0.id]:Q0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){X01(V.mcpService,A.settings);let X0=XE0(B,Q),j0=await mz(),Q0=L?X0:JD0({agentMode:Q.mode,explicitEffort:X0,sessionState:j0}),w0={userInput:F,stdinInput:X,dependencies:V,streamJson:D,streamJsonInput:!!Q.streamJsonInput,streamJsonThinking:!!Q.streamJsonThinking,stats:!!Q.stats,ampURL:A.ampURL,isInternalUser:H,agentMode:Q.mode,reasoningEffort:Q0,labels:Q.label},n=await Zy4({threadPool:k,...w0});if(await nt(n,"execute"),Q.archive)await V.threadService.archive(n,!0);await V.asyncDispose(),process.exit(0)}let g=!1,l=!1;if(Q.jetbrains||Q.ide){await J80();let X0=await pX({jetbrainsOnly:Q.jetbrains});if(X0.length===0){if(Q.jetbrains)g=!await V.configService.get("jetbrains.skipInstall")}else if(X0.length===1){let j0=X0[0];if(j0)d3.selectConfig(j0)}else l=!0}G=process.hrtime.bigint();let a=PX0("0.0.1778732631-gc5875c",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let A0=new D01(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let X0=await T1(k.threadHandles$);if(!X0)throw new s1("No active thread is available yet.",1);await X0.sendMessage({content:[{type:"text",text:F}]})}G=process.hrtime.bigint();let I0=await mz();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",I0);let V0=XE0(B,Q),N0={...I0,launchCount:I0.launchCount+1,lastReasoningEffortByMode:V0?{...I0.lastReasoningEffortByMode,[Q.mode]:V0}:I0.lastReasoningEffortByMode};BB((X0)=>({...X0,launchCount:X0.launchCount+1}));try{if(G=process.hrtime.bigint(),await Ke4({history:new Ho,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:r4,threadPool:k,createSystemPromptDeps:async()=>x8A(V),ideClient:d3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:A0,updateService:a,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:L,showJetBrainsInstaller:g,showIdePickerHint:l,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:s13,logFile:{path:$},sessionState:N0,freeTierStatusPromise:x,workspace:I??null,features:N,isInternalUser:H,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-14T04:27:49.335Z"},(X0)=>new S51({...X0,threadPool:X0.threadPool},(j0)=>new t81({...j0,threadState:j0.threadState}))),Z("runMainThread:mountApp-returned",G),f)await f}finally{await k.dispose().catch((X0)=>{j.error("Failed to dispose thread pool during shutdown",X0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function p5(A){if(j.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)zB.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
7781
|
+
`);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,B=process.stdout.isTTY&&process.stderr.isTTY;j.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let $=await s74({get:async(F)=>{if(F!==ld)return;try{let X=await y8A(R91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==ld)return;await n13(lt.dirname(R91),{recursive:!0}),await a13(R91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:T90()});X04($);let J=await Mb4({...A,workspaceTrust:{current:!0,changes:pm},getHook:process.env.AMP_URL?(F,X)=>{if(F==="url")return Promise.resolve(process.env.AMP_URL);return X()}:void 0});if(A.mcpConfig){let F=await wg4(A.mcpConfig);J=Cg4(J,F)}let Y=lt.dirname(J.getSettingsFilePath());BP4(vx,Y),J=ms1(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=f7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!bH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:Ut4(await Fe0(A,J))}}function C43(A){let Q={};for(let B=0;B<A.length;B++){let $=A[B];if($?.startsWith("--")){let Y=$.slice(2).replace(/-([a-z])/g,(F,X)=>X.toUpperCase()),Z=A[B+1];if(Z&&!Z.startsWith("--"))Q[Y]=Z,B++}}return Q}function M43(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=lt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?r13:sa));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function L43(){Mv4();let A=C43(process.argv),Q=M43(process.argv,A),B=Tv4(Q);sZ0("silent");let $=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)a0.level=0;if(e13(j),j.info("Starting Amp CLI.",{version:"0.0.1778732631-gc5875c",buildTimestamp:"2026-05-14T04:27:49.335Z"}),process.platform==="win32"&&Tj())Ku4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new s1(E7.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await H43(B).parseAsync(process.argv)}AP4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await L43().catch(kz)});async function O43(A,Q){let B=A.ampURL.includes("localhost")||A.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!B)await A.settings.set("url",process.env.AMP_URL,"global"),r6.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
7782
7782
|
`);else if(!bH(A.ampURL))r6.write(`Logging in to ${new URL(A.ampURL).hostname}
|
|
7783
7783
|
`);let $=process.env.AMP_API_KEY;if($)r6.write(`API key found in environment variable, storing...
|
|
7784
7784
|
`),await Q.set("apiKey",$,A.ampURL),r6.write(`API key successfully stored.
|