@sourcegraph/amp 0.0.1778989718-g339de8 → 0.0.1778994836-g963bd3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.js +10 -10
  2. package/package.json +2 -2
package/dist/main.js CHANGED
@@ -5393,12 +5393,12 @@ ${z}`))}},error:(E)=>{if(!K)K=!0,D(Error(`Failed to spawn brew: ${E.message}`))}
5393
5393
  ${z}`;if(Z==="pnpm"&&z.includes("Unable to find the global bin directory"))W+=`
5394
5394
 
5395
5395
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
5396
- 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();Fz();var eN5="@ampcode/cli";async function DX0(A,Q,B=eN5){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=Oo(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 AI5="https://static.ampcode.com/cli/cli-version.txt";async function GX0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${AI5}?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=Oo(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 QI5=604800000;function Ob4(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>QI5)return{ageMs:B};return null}function Oo(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 jo(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-(.+))?/);if(!Q)return null;let B=parseInt(Q[1],10),$=B!==0?B*1000:void 0,Y=Q[2]?.match(/^g?([a-f0-9]+)$/)?.[1],Z=$!==void 0?wF($):void 0;return{sha:Y,timestamp:$,age:Z}}catch{return null}}R1();d0();import{readFile as BI5,realpath as $I5}from"node:fs/promises";import{dirname as jb4,join as JI5}from"node:path";async function Rb4(A){switch(A){case"binary":case"brew":return YI5(Mo());case"npm":case"pnpm":case"yarn":case"bun":return ZI5()}}async function YI5(A){let Q=await XI(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 ZI5(){try{let A=process.argv[1];if(!A)return null;let Q=await $I5(A),B=jb4(jb4(Q));return await FI5(JI5(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function FI5(A){let Q=await BI5(A,"utf8"),B=JSON.parse(Q);if(!B.name||!Ae0(B.name))return j.debug("package.json name mismatch",{pkgJsonPath:A,name:B.name}),null;return B.version||null}d0();import{spawn as XI5}from"node:child_process";function Fe0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return j.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var VX0=null,Ro=null;function Pb4(A){return new Promise((Q)=>{let B=XI5("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),$="";B.stdout.on("data",(J)=>{$+=J.toString()}),B.on("close",(J,Y)=>{if(J!==0||Y==="SIGTERM"){Q(null);return}let Z=$.trim();Q(Z&&Z!=="undefined"?Z:null)}),B.on("error",()=>{Q(null)})})}async function UX0(){if(VX0)return VX0;if(Ro)return Ro;Ro=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return Fe0(A);let Q=await Pb4("@sourcegraph:registry");if(Q)return Fe0(Q);let B=await Pb4("registry");if(B)return Fe0(B);return"https://registry.npmjs.org"})();try{return VX0=await Ro,VX0}finally{Ro=null}}var DI5=3600000,GI5=5000;function KX0(A,Q,B={}){let $=new m4,J=$.pipe(oA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??DI5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await sV(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await VI5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await sV(GI5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let z=Math.min(K,E);await sV(z),E-=z}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function VI5(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 RU(),F=Z==="binary"||Z==="brew",X=F?void 0:await DI();B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F,npmPackageName:X});let D;if(F)D=await GX0(A);else{let U=await UX0();D=await DX0(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 Rb4(Z);if(U&&Oo(U,D.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:U,latestVersion:D.latestVersion}),J.updatedTo=U,Oo(A,U)<0){let K=await yz(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!==Mo()){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}try{await Lo(D.latestVersion,Z),J.updatedTo=D.latestVersion;let U=await yz(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}}Fz();import{stderr as vD}from"node:process";function _b4(A){let Q=new pN().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 tt0($.force||!1,$.verbose||!1,"0.0.1778989718-g339de8"),process.exit()});A.addCommand(Q,{hidden:!0});let B=new pN("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 KI5($.targetVersion)});A.addCommand(B)}function UI5(A){let Q=Boolean(A.isTTY),B=0,$=!1;function J(){if(!Q||!$)return;A.write(`
5396
+ 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();Fz();var eN5="@ampcode/cli";async function DX0(A,Q,B=eN5){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=Oo(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 AI5="https://static.ampcode.com/cli/cli-version.txt";async function GX0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${AI5}?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=Oo(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 QI5=604800000;function Ob4(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>QI5)return{ageMs:B};return null}function Oo(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 jo(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-(.+))?/);if(!Q)return null;let B=parseInt(Q[1],10),$=B!==0?B*1000:void 0,Y=Q[2]?.match(/^g?([a-f0-9]+)$/)?.[1],Z=$!==void 0?wF($):void 0;return{sha:Y,timestamp:$,age:Z}}catch{return null}}R1();d0();import{readFile as BI5,realpath as $I5}from"node:fs/promises";import{dirname as jb4,join as JI5}from"node:path";async function Rb4(A){switch(A){case"binary":case"brew":return YI5(Mo());case"npm":case"pnpm":case"yarn":case"bun":return ZI5()}}async function YI5(A){let Q=await XI(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 ZI5(){try{let A=process.argv[1];if(!A)return null;let Q=await $I5(A),B=jb4(jb4(Q));return await FI5(JI5(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function FI5(A){let Q=await BI5(A,"utf8"),B=JSON.parse(Q);if(!B.name||!Ae0(B.name))return j.debug("package.json name mismatch",{pkgJsonPath:A,name:B.name}),null;return B.version||null}d0();import{spawn as XI5}from"node:child_process";function Fe0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return j.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var VX0=null,Ro=null;function Pb4(A){return new Promise((Q)=>{let B=XI5("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),$="";B.stdout.on("data",(J)=>{$+=J.toString()}),B.on("close",(J,Y)=>{if(J!==0||Y==="SIGTERM"){Q(null);return}let Z=$.trim();Q(Z&&Z!=="undefined"?Z:null)}),B.on("error",()=>{Q(null)})})}async function UX0(){if(VX0)return VX0;if(Ro)return Ro;Ro=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return Fe0(A);let Q=await Pb4("@sourcegraph:registry");if(Q)return Fe0(Q);let B=await Pb4("registry");if(B)return Fe0(B);return"https://registry.npmjs.org"})();try{return VX0=await Ro,VX0}finally{Ro=null}}var DI5=3600000,GI5=5000;function KX0(A,Q,B={}){let $=new m4,J=$.pipe(oA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??DI5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await sV(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await VI5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await sV(GI5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let z=Math.min(K,E);await sV(z),E-=z}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function VI5(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 RU(),F=Z==="binary"||Z==="brew",X=F?void 0:await DI();B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F,npmPackageName:X});let D;if(F)D=await GX0(A);else{let U=await UX0();D=await DX0(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 Rb4(Z);if(U&&Oo(U,D.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:U,latestVersion:D.latestVersion}),J.updatedTo=U,Oo(A,U)<0){let K=await yz(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!==Mo()){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}try{await Lo(D.latestVersion,Z),J.updatedTo=D.latestVersion;let U=await yz(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}}Fz();import{stderr as vD}from"node:process";function _b4(A){let Q=new pN().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 tt0($.force||!1,$.verbose||!1,"0.0.1778994836-g963bd3"),process.exit()});A.addCommand(Q,{hidden:!0});let B=new pN("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 KI5($.targetVersion)});A.addCommand(B)}function UI5(A){let Q=Boolean(A.isTTY),B=0,$=!1;function J(){if(!Q||!$)return;A.write(`
5397
5397
  `),$=!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 KI5(A){let B=process.platform==="win32"&&Lj()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:$,renderProgress:J}=UI5(vD);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")vD.write(t0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
5398
5398
 
5399
5399
  `));try{if(!A){vD.write(t0.blue(`Checking for updates...
5400
- `));let F=!1,X;if(Lj()){let D=await GX0("0.0.1778989718-g339de8");F=D.hasUpdate,X=D.latestVersion}else{let D=await UX0(),G=await DI(),V=await DX0("0.0.1778989718-g339de8",D,G);F=V.hasUpdate,X=V.latestVersion}if(!F){let D=jo("0.0.1778989718-g339de8"),G=D?.age?`released ${D.age} ago`:`built ${wF(new Date("2026-05-17T03:53:42.010Z"))} ago`;vD.write(t0.green(`✓ Amp is already up to date on version ${"0.0.1778989718-g339de8"} (${G})
5401
- `));let V=await yz("0.0.1778989718-g339de8",B);if(V.warning)vD.write(`
5400
+ `));let F=!1,X;if(Lj()){let D=await GX0("0.0.1778994836-g963bd3");F=D.hasUpdate,X=D.latestVersion}else{let D=await UX0(),G=await DI(),V=await DX0("0.0.1778994836-g963bd3",D,G);F=V.hasUpdate,X=V.latestVersion}if(!F){let D=jo("0.0.1778994836-g963bd3"),G=D?.age?`released ${D.age} ago`:`built ${wF(new Date("2026-05-17T05:18:35.020Z"))} ago`;vD.write(t0.green(`✓ Amp is already up to date on version ${"0.0.1778994836-g963bd3"} (${G})
5401
+ `));let V=await yz("0.0.1778994836-g963bd3",B);if(V.warning)vD.write(`
5402
5402
  `+t0.yellow(V.warning)+`
5403
5403
  `);process.exit(0)}if(!X)vD.write(t0.yellow("[WARN] could not find latest version")),process.exit(0);A=X}vD.write(t0.blue(`Updating to version ${A}...
5404
5404
  `)),await Lo(A,void 0,(F)=>{$(),vD.write(t0.dim(`Running: ${F}
@@ -5823,7 +5823,7 @@ ${$}`).join(`
5823
5823
  `).length,J=new p({text:new C(A,new S({color:B}))});if($<=xG0)return J;return new U0({width:1/0,height:xG0,child:new g2({autofocus:!1,controller:Q,child:J})})}function Cx5(){return new Map([[C1.key("PageUp"),new fG0],[C1.key("PageDown"),new s41],[C1.ctrl("u"),new fG0],[C1.shift("Home"),new t41],[C1.shift("End"),new e41]])}function Mx5(A,Q,B){return Math.max(Q,Math.min(A,B))}var AA1=8,In4=1,wn4=AA1-1;class QA1 extends L4{}class BA1 extends L4{}class bG0 extends L4{}class uG0 extends L4{}class $A1 extends L4{}class JA1 extends L4{}class YA1 extends _0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new Cn4}}class Cn4 extends P0{messageScroll=new yA;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=Lx5(Q,this.messageScroll),$=Ox5(Q.options.message),J=$?new d4({actions:this.buildScrollActions(),child:new Z5({debugLabel:"NeoSelectDialogScrollShortcuts",shortcuts:Rx5(),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 CA({header:Q.options.title,minWidth:64,maxWidth:80,footer:Y,autofocus:!1,onDismiss:Q.onCancel,child:J})}buildScrollActions(){let A=(Q)=>{let B=Px5(this.messageScroll.offset+Q,0,this.messageScroll.maxScrollExtent);this.messageScroll.jumpTo(B)};return new Map([[QA1,new g1(()=>A(-In4))],[BA1,new g1(()=>A(In4))],[bG0,new g1(()=>A(-wn4))],[uG0,new g1(()=>A(wn4))],[$A1,new g1(()=>this.messageScroll.jumpTo(0))],[JA1,new g1(()=>this.messageScroll.jumpTo(this.messageScroll.maxScrollExtent))]])}}function Lx5(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 U2({options:B,selectedIndex:$,body:jx5(A.options.message,Q),onSelect:(J)=>{if(J===null){A.onCancel();return}A.onSelect(J)},padding:K0.all(0),showBorder:!1,showDismissalMessage:!1,enableMouseInteraction:!1})}function Ox5(A){if(A===void 0)return!1;return A.split(`
5824
5824
  `).length>AA1}function jx5(A,Q){if(A===void 0)return;let B=A.split(`
5825
5825
  `).length,$=Math.min(B,AA1);return new U0({width:1/0,height:$,child:new g2({autofocus:!1,controller:Q,child:new p({text:new C(A)})})})}function Rx5(){return new Map([[C1.key("PageUp"),new bG0],[C1.key("PageDown"),new uG0],[C1.ctrl("u"),new bG0],[C1.ctrl("d"),new uG0],[C1.ctrl("y"),new QA1],[C1.ctrl("e"),new BA1],[C1.shift("Home"),new $A1],[C1.shift("End"),new JA1]])}function Px5(A,Q,B){return Math.max(Q,Math.min(A,B))}class ZA1{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 Vs({key:new bz(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 r41({key:new bz(A),options:A.options,onConfirm:()=>this.resolveConfirmDialog(A,!0),onCancel:()=>this.resolveConfirmDialog(A,!1)})];case"select":return[new YA1({key:new bz(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(od(B.errorMessage))continue;let $=`${B.uri.toString()}
5826
- ${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()}}var _x5=48;class FA1{visible=!1;onClick=void 0;listeners=new Set;show(A){this.visible=!0,this.onClick=A,this.notifyListeners()}activate(){this.onClick?.()}get isVisible(){return this.visible}dismiss(){this.visible=!1,this.onClick=void 0,this.notifyListeners()}addListener(A){this.listeners.add(A)}removeListener(A){this.listeners.delete(A)}buildComplexToast(){if(!this.visible||!this.onClick)return null;return new Fs({width:_x5,title:"Relaunch to Update Amp",message:"Your threads will resume.",variant:"success",mouseBehavior:"click-anywhere",action:{keyboardShortcut:"Ctrl+o, relaunch, Enter",label:"relaunch",onAction:()=>this.activate()}})}notifyListeners(){for(let A of this.listeners)A()}}d0();import{spawnSync as Tx5}from"node:child_process";import uI from"node:process";function Us(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else H4.instance.stop()}function Mn4(A){return{noun:"amp",verb:"Relaunch (Quit, then Reopen & Resume Thread)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update","resume","reopen"],shortcut:uI.env.NODE_ENV==="development"&&uI.platform==="darwin"?C1.meta("r"):void 0,status:{type:"enabled"},sortBoost:90,run:(Q,B,$)=>{$(),Us(A)}}}function kx5(A,Q){j.info("Relaunching Amp; threads will be resumed",{threadIDs:A});let{command:B,args:$}=Sx5(A),J=Tx5(B,$,{cwd:Q,env:uI.env,stdio:"inherit"});if(J.error)return j.error("Failed to relaunch Amp",{error:J.error}),1;return J.status??1}class XA1{relaunchRequested=!1;requestedThreadIDs=[];request=(A)=>{j.info("Relaunch requested; threads will be resumed",{threadIDs:A}),this.relaunchRequested=!0,this.requestedThreadIDs=A};get shouldShowExitSummary(){return!this.relaunchRequested}relaunchIfRequested(A){if(!this.relaunchRequested)return;return kx5(this.requestedThreadIDs,A)}}function Sx5(A){let Q=A.length>0?["threads","continue",...A]:[],B=yx5();if(B)return{command:B.command,args:[...B.args,...Q]};let $=uI.argv[1],J=$&&vx5($)?[$]:[];return{command:uI.execPath,args:[...J,...Q]}}function vx5(A){return A!==uI.execPath&&!A.startsWith("/$bunfs/")}function yx5(){if(uI.env.NODE_ENV!=="development")return null;let A=uI.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=xx5(A),B=Q[0];if(!B)return null;return{command:B,args:Q.slice(1)}}function xx5(A){if(A.startsWith("["))try{let Q=JSON.parse(A);if(Array.isArray(Q)&&Q.every((B)=>typeof B==="string"))return Q}catch{return[]}return A.split(/\s+/).filter(Boolean)}var fx5=18000000;class DA1{options;subscription=null;relaunchNotificationShown=!1;relaunchNotificationPending=!1;relaunchNotificationTimer=null;openedAt=Date.now();constructor(A){this.options=A}init(){if(this.subscription=this.options.updateService?.state.subscribe((A)=>{this.handleUpdateState(A)})??null,process.env.DEV_SHOW_RELAUNCH_NOTIF_ON_STARTUP==="1")this.showUpdateRelaunchNotification(!0)}dispose(){if(this.subscription?.unsubscribe(),this.subscription=null,this.relaunchNotificationTimer)clearTimeout(this.relaunchNotificationTimer),this.relaunchNotificationTimer=null}handleUpdateState(A){if(A!=="updated")return;this.showUpdateRelaunchNotification()}showUpdateRelaunchNotification(A=!1){if(this.relaunchNotificationShown)return;let B=(this.options.minimumOpenDurationMs??fx5)-(Date.now()-this.openedAt);if(B>0&&!A){if(this.relaunchNotificationPending=!0,!this.relaunchNotificationTimer)this.relaunchNotificationTimer=setTimeout(()=>{if(this.relaunchNotificationTimer=null,!this.relaunchNotificationPending)return;this.relaunchNotificationPending=!1,this.showUpdateRelaunchNotification()},B),this.relaunchNotificationTimer.unref();return}this.relaunchNotificationPending=!1,this.relaunchNotificationShown=!0,this.options.relaunchNotificationController.show(()=>Us(this.options))}}Cl();A2();import{readFile as bx5}from"node:fs/promises";import GA1 from"node:os";function ux5(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function Ln4(A,Q){try{return{path:Q,contents:eh0(await bx5(A,"utf8"))}}catch{return null}}async function hG0(A,Q){let B=[],$=ux5(),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 Ln4(ay(Q),`${$}/logs/${Q}.log`);if(Z)B.push(Z);let F=await Ln4(A.settingsFilePath,`${$}/settings/global.json`);if(F)B.push(F);let X=await RU()??"unknown",D=await r4.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778989718-g339de8",clientOS:`${GA1.platform()} ${GA1.release()} ${GA1.arch()}`,installMethod:X}},{config:A.configService});if(!D.ok)throw Error(`Failed to submit report: ${D.error.message}`);return D.result.reportID}class VA1{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 gG0 extends w5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new UA1(this.offstage)}updateRenderObject(A){if(A instanceof UA1)A.offstage=this.offstage}}class UA1 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;N4(!!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 Ks{_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 KA1 extends _0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new On4}}class On4 extends P0{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 Tj,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new Tj,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 gG0({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 c4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new gG0({key:$.key,offstage:!J,child:Y}))}return new BA({fit:"expand",children:Q})}}import jn4 from"node:process";class zA1 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=hx5(Q);return new CA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:K0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new G5({items:Q,showBorder:!1,getLabel:($)=>{let J=EA1($);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=oj($.item.verb.toLowerCase(),Y),F=oj(J.item.verb.toLowerCase(),Y);if(Z!==F)return F-Z;let X=oj(EA1($.item),Y),D=oj(EA1(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}=j0.of(J);return new p({text:new C($.status.reason,new S({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new Rn4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class Rn4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=j0.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 S({color:V,dim:$||!B})),textAlign:"right"}),K=[new C(Q.verb.toLowerCase(),new S({color:G,bold:!0,dim:$}))];if($)K.push(new C(" (unavailable)",new S({color:G,dim:!0})));let E=p.spans(K),z=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)z.push({child:gx5(Q.shortcut,Z,$)});return new Pn4({columns:z,padding:K0.horizontal(1),backgroundColor:D})}}function EA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function hx5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,_4(B.noun)):Q},0)}function gx5(A,Q,B){let{colors:$,app:J}=Q,Y=new S({color:$.mutedForeground,dim:B}),Z=[];for(let F of A.modifiers()){if(Z.length>0)Z.push(new C(" ",Y));Z.push(new C(mx5(F),new S({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new C(" ",Y));return Z.push(new C(px5(A),new S({color:J.keybind,bold:!0,dim:B}))),p.spans(Z)}function mx5(A){return A==="Meta"&&jn4.platform==="darwin"?"Cmd":A}function px5(A){return A.meta&&jn4.platform==="darwin"?A.key.toUpperCase():A.key}class Pn4 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 U0({width:B}));if(X.fixedWidth!==void 0)Y.push(new U0({width:X.fixedWidth,child:X.child}));else if(X.expanded)Y.push(new T1({child:X.child}));else Y.push(X.child)}let Z=new s0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new u0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class WA1{#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 Ks,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#B(){for(let A of this.#Q)A()}}class W9 extends U6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=W9.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(W9)?.commandRegistry??null}}class HA1 extends _0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new _n4}}class _n4 extends P0{modalStack=new Ks;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=W9.of(this.context);this.commandRegistry=A,A.addListener(this.onCommandsChanged)})}dispose(){this.commandRegistry?.removeListener(this.onCommandsChanged),this.commandRegistry=null,super.dispose()}onCommandsChanged=()=>{this.setState()};build(A){let Q=W9.of(A).commands,B=new zA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new KA1({root:B,controller:this.modalStack})}}var qA1=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],NA1=[{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 mG0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=s1.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:K0.only({left:4}),child:X})]});else D=new s0({crossAxisAlignment:"start",children:[new T1({flex:1,child:F}),new U0({width:1}),new T1({flex:1,child:X})]});Y.push(new x0({padding:K0.horizontal(6),child:D}))}return new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class IA1 extends _0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:B}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=B??!0}createState(){return new Tn4}}class Tn4 extends P0{scrollController;initState(){this.scrollController=new yA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=L1.of(A).colorScheme,J=j0.of(A).app,Y=s1.of(A),Z=new S({color:B.primary,bold:!0}),F=new S({color:B.secondary,bold:!0}),X=new S({color:J.keybind}),D=new S({color:J.command}),G=new S({color:B.foreground}),V=new S({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((L)=>{let R=L.noun?.toLowerCase();return R!=="dev"&&R!=="debug"&&!L.id.startsWith("debug-")&&!H.has(L.id)})].sort((L,R)=>{let v=(L.noun??"").toLowerCase(),k=(R.noun??"").toLowerCase(),x=v.localeCompare(k);if(x!==0)return x;let h=L.verb.toLowerCase(),u=R.verb.toLowerCase(),T=h.localeCompare(u);if(T!==0)return T;return L.id.localeCompare(R.id)}),I=new xA({autofocus:!0,controller:this.scrollController,child:new u0({constraints:new M1(W,W,0,Number.POSITIVE_INFINITY),child:new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new Q4({child:new p({text:new C(`Amp CLI - Help & Keyboard Shortcuts
5826
+ ${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()}}var _x5=48;class FA1{visible=!1;onClick=void 0;listeners=new Set;show(A){this.visible=!0,this.onClick=A,this.notifyListeners()}activate(){this.onClick?.()}get isVisible(){return this.visible}dismiss(){this.visible=!1,this.onClick=void 0,this.notifyListeners()}addListener(A){this.listeners.add(A)}removeListener(A){this.listeners.delete(A)}buildComplexToast(){if(!this.visible||!this.onClick)return null;return new Fs({width:_x5,title:"Relaunch to Update Amp",message:"Your threads will resume.",variant:"success",mouseBehavior:"click-anywhere",action:{keyboardShortcut:"Ctrl+o, relaunch, Enter",label:"relaunch",onAction:()=>this.activate()}})}notifyListeners(){for(let A of this.listeners)A()}}d0();import{spawnSync as Tx5}from"node:child_process";import uI from"node:process";function Us(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else H4.instance.stop()}function Mn4(A){return{noun:"amp",verb:"Relaunch (Quit, then Reopen & Resume Thread)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update","resume","reopen"],shortcut:uI.env.NODE_ENV==="development"&&uI.platform==="darwin"?C1.meta("r"):void 0,status:{type:"enabled"},sortBoost:90,run:(Q,B,$)=>{$(),Us(A)}}}function kx5(A,Q){j.info("Relaunching Amp; threads will be resumed",{threadIDs:A});let{command:B,args:$}=Sx5(A),J=Tx5(B,$,{cwd:Q,env:uI.env,stdio:"inherit"});if(J.error)return j.error("Failed to relaunch Amp",{error:J.error}),1;return J.status??1}class XA1{relaunchRequested=!1;requestedThreadIDs=[];request=(A)=>{j.info("Relaunch requested; threads will be resumed",{threadIDs:A}),this.relaunchRequested=!0,this.requestedThreadIDs=A};get shouldShowExitSummary(){return!this.relaunchRequested}relaunchIfRequested(A){if(!this.relaunchRequested)return;return kx5(this.requestedThreadIDs,A)}}function Sx5(A){let Q=A.length>0?["threads","continue",...A]:[],B=yx5();if(B)return{command:B.command,args:[...B.args,...Q]};let $=uI.argv[1],J=$&&vx5($)?[$]:[];return{command:uI.execPath,args:[...J,...Q]}}function vx5(A){return A!==uI.execPath&&!A.startsWith("/$bunfs/")}function yx5(){if(uI.env.NODE_ENV!=="development")return null;let A=uI.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=xx5(A),B=Q[0];if(!B)return null;return{command:B,args:Q.slice(1)}}function xx5(A){if(A.startsWith("["))try{let Q=JSON.parse(A);if(Array.isArray(Q)&&Q.every((B)=>typeof B==="string"))return Q}catch{return[]}return A.split(/\s+/).filter(Boolean)}var fx5=18000000;class DA1{options;subscription=null;relaunchNotificationShown=!1;relaunchNotificationPending=!1;relaunchNotificationTimer=null;openedAt=Date.now();constructor(A){this.options=A}init(){if(this.subscription=this.options.updateService?.state.subscribe((A)=>{this.handleUpdateState(A)})??null,process.env.DEV_SHOW_RELAUNCH_NOTIF_ON_STARTUP==="1")this.showUpdateRelaunchNotification(!0)}dispose(){if(this.subscription?.unsubscribe(),this.subscription=null,this.relaunchNotificationTimer)clearTimeout(this.relaunchNotificationTimer),this.relaunchNotificationTimer=null}handleUpdateState(A){if(A!=="updated")return;this.showUpdateRelaunchNotification()}showUpdateRelaunchNotification(A=!1){if(this.relaunchNotificationShown)return;let B=(this.options.minimumOpenDurationMs??fx5)-(Date.now()-this.openedAt);if(B>0&&!A){if(this.relaunchNotificationPending=!0,!this.relaunchNotificationTimer)this.relaunchNotificationTimer=setTimeout(()=>{if(this.relaunchNotificationTimer=null,!this.relaunchNotificationPending)return;this.relaunchNotificationPending=!1,this.showUpdateRelaunchNotification()},B),this.relaunchNotificationTimer.unref();return}this.relaunchNotificationPending=!1,this.relaunchNotificationShown=!0,this.options.relaunchNotificationController.show(()=>Us(this.options))}}Cl();A2();import{readFile as bx5}from"node:fs/promises";import GA1 from"node:os";function ux5(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function Ln4(A,Q){try{return{path:Q,contents:eh0(await bx5(A,"utf8"))}}catch{return null}}async function hG0(A,Q){let B=[],$=ux5(),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 Ln4(ay(Q),`${$}/logs/${Q}.log`);if(Z)B.push(Z);let F=await Ln4(A.settingsFilePath,`${$}/settings/global.json`);if(F)B.push(F);let X=await RU()??"unknown",D=await r4.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778994836-g963bd3",clientOS:`${GA1.platform()} ${GA1.release()} ${GA1.arch()}`,installMethod:X}},{config:A.configService});if(!D.ok)throw Error(`Failed to submit report: ${D.error.message}`);return D.result.reportID}class VA1{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 gG0 extends w5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new UA1(this.offstage)}updateRenderObject(A){if(A instanceof UA1)A.offstage=this.offstage}}class UA1 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;N4(!!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 Ks{_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 KA1 extends _0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new On4}}class On4 extends P0{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 Tj,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new Tj,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 gG0({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 c4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new gG0({key:$.key,offstage:!J,child:Y}))}return new BA({fit:"expand",children:Q})}}import jn4 from"node:process";class zA1 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=hx5(Q);return new CA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:K0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new G5({items:Q,showBorder:!1,getLabel:($)=>{let J=EA1($);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=oj($.item.verb.toLowerCase(),Y),F=oj(J.item.verb.toLowerCase(),Y);if(Z!==F)return F-Z;let X=oj(EA1($.item),Y),D=oj(EA1(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}=j0.of(J);return new p({text:new C($.status.reason,new S({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new Rn4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class Rn4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=j0.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 S({color:V,dim:$||!B})),textAlign:"right"}),K=[new C(Q.verb.toLowerCase(),new S({color:G,bold:!0,dim:$}))];if($)K.push(new C(" (unavailable)",new S({color:G,dim:!0})));let E=p.spans(K),z=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)z.push({child:gx5(Q.shortcut,Z,$)});return new Pn4({columns:z,padding:K0.horizontal(1),backgroundColor:D})}}function EA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function hx5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,_4(B.noun)):Q},0)}function gx5(A,Q,B){let{colors:$,app:J}=Q,Y=new S({color:$.mutedForeground,dim:B}),Z=[];for(let F of A.modifiers()){if(Z.length>0)Z.push(new C(" ",Y));Z.push(new C(mx5(F),new S({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new C(" ",Y));return Z.push(new C(px5(A),new S({color:J.keybind,bold:!0,dim:B}))),p.spans(Z)}function mx5(A){return A==="Meta"&&jn4.platform==="darwin"?"Cmd":A}function px5(A){return A.meta&&jn4.platform==="darwin"?A.key.toUpperCase():A.key}class Pn4 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 U0({width:B}));if(X.fixedWidth!==void 0)Y.push(new U0({width:X.fixedWidth,child:X.child}));else if(X.expanded)Y.push(new T1({child:X.child}));else Y.push(X.child)}let Z=new s0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new u0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class WA1{#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 Ks,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#B(){for(let A of this.#Q)A()}}class W9 extends U6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=W9.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(W9)?.commandRegistry??null}}class HA1 extends _0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new _n4}}class _n4 extends P0{modalStack=new Ks;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=W9.of(this.context);this.commandRegistry=A,A.addListener(this.onCommandsChanged)})}dispose(){this.commandRegistry?.removeListener(this.onCommandsChanged),this.commandRegistry=null,super.dispose()}onCommandsChanged=()=>{this.setState()};build(A){let Q=W9.of(A).commands,B=new zA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new KA1({root:B,controller:this.modalStack})}}var qA1=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],NA1=[{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 mG0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=s1.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:K0.only({left:4}),child:X})]});else D=new s0({crossAxisAlignment:"start",children:[new T1({flex:1,child:F}),new U0({width:1}),new T1({flex:1,child:X})]});Y.push(new x0({padding:K0.horizontal(6),child:D}))}return new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class IA1 extends _0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:B}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=B??!0}createState(){return new Tn4}}class Tn4 extends P0{scrollController;initState(){this.scrollController=new yA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=L1.of(A).colorScheme,J=j0.of(A).app,Y=s1.of(A),Z=new S({color:B.primary,bold:!0}),F=new S({color:B.secondary,bold:!0}),X=new S({color:J.keybind}),D=new S({color:J.command}),G=new S({color:B.foreground}),V=new S({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((L)=>{let R=L.noun?.toLowerCase();return R!=="dev"&&R!=="debug"&&!L.id.startsWith("debug-")&&!H.has(L.id)})].sort((L,R)=>{let v=(L.noun??"").toLowerCase(),k=(R.noun??"").toLowerCase(),x=v.localeCompare(k);if(x!==0)return x;let h=L.verb.toLowerCase(),u=R.verb.toLowerCase(),T=h.localeCompare(u);if(T!==0)return T;return L.id.localeCompare(R.id)}),I=new xA({autofocus:!0,controller:this.scrollController,child:new u0({constraints:new M1(W,W,0,Number.POSITIVE_INFINITY),child:new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new Q4({child:new p({text:new C(`Amp CLI - Help & Keyboard Shortcuts
5827
5827
  `,Z)})}),new U0({height:1}),new x0({padding:K0.horizontal(2),child:new p({text:new C(`Editor Shortcuts
5828
5828
  `,F)})}),new mG0({items:qA1.filter((L)=>L.submitOnEnterOnly===void 0||L.submitOnEnterOnly===this.widget.submitOnEnter),renderRow:(L)=>{let R=[];for(let k of L.methods){let x=this.buildCleanKeyCombination(k);R.push(x)}let v=R.join(", ");return[new p({text:new C(v,X)}),new p({text:new C(L.description,G)})]}}),new U0({height:1}),new x0({padding:K0.horizontal(2),child:new p({text:new C(`Scrolling & Navigation
5829
5829
  `,F)})}),new mG0({items:NA1,renderRow:(L)=>{let R=[];for(let k of L.methods){let x=this.buildCleanKeyCombination(k);R.push(x)}let v=R.join(", ");return[new p({text:new C(v,X)}),new p({text:new C(L.description,G)})]}}),new U0({height:1}),new x0({padding:K0.horizontal(2),child:new p({text:new C(`Command Palette Commands
@@ -5913,7 +5913,7 @@ Ctrl-X, Y, Z to unlock`;if(this.widget.centerContent)h=this.widget.centerContent
5913
5913
  `))}return Z}function Zm5(A,Q,B){let{colors:$,app:J}=B,Y=Fm5(Q.status,B);if(A.push(new C(` ${Y.icon} `,new S({color:Y.color}))),A.push(new C(Q.name,new S({color:Q.status==="pending"?$.warning:J.command}))),Q.status==="pending")A.push(new C(" discovering...",new S({color:$.foreground,dim:!0})));else if(Q.description)A.push(new C(` ${Xs4(Q.description,50)}`,new S({color:$.foreground,dim:!0})));if(Q.error)A.push(new C(` ${Xs4(Q.error,40)}`,new S({color:J.toolError})));A.push(new C(`
5914
5914
  `))}function Fm5(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 Xs4(A,Q){let B=A.replace(/\s+/g," ").trim();if(_4(B)<=Q)return B;let $="...",J=_4($);if(Q<=J)return qJ($,Q);return`${qJ(B,Q-J,!0,"")}${$}`}var Z51="https://ampcode.com/news/neo",F51=[{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:Z51,href:Z51},"","",{text:"Need old Amp for a bit? Use ",keybind:"amp --take-me-back"}]}];function Xm5(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:Z51,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function Dm5(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var ff=50,UR=40,J51=1000,Gm5=420,Vm5=760,Um5=-250,Km5=1100,HV0=33,Us4=0.999,Em5=2.1,zm5=720,Wm5=420,Is4="Meet the new",ws4="Amp",Cs4="CLI",X51=w4(Is4).length,Hm5=w4(ws4).length,qm5=w4(Cs4).length,qV0={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},Ks4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},Es4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},zs4=[qV0,Ks4,Es4,qV0,Ks4,Es4,qV0],Nm5=qV0;class D51 extends _0{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??Dm5(),this.introStages=this.variant==="npm-migration"?Xm5(this.binaryInstallCommand):F51,this.dismissible=this.variant!=="npm-migration"}createState(){return new Ms4}}class Ms4 extends P0{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=J51;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 g9(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=eY(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=Us4,this.firstStageHintVisible=this.animationProgress>=Us4,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:J51,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=eY(A/Vm5);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},HV0)}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,$=eY(B/Gm5);if(this.setState(()=>{if(this.stageTransitionProgress=$,$>=1)this.previousIntroStage=null}),$>=1)this.stopStageTransitionTimer()},HV0)}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=eY(J/this.animationDurationMs),Z=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*bf(Y);if(this.setState(()=>{this.animationProgress=Z}),Y>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},HV0)}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,J51+Um5),Q=A+Km5;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?eY((A-this.firstStageTitleRevealStartedAt)/zm5):this.firstStageTitleRevealProgress,B=this.firstStageHintRevealStartedAt?eY((A-this.firstStageHintRevealStartedAt)/Wm5):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=B}),Q>=1&&B>=1)this.stopFirstStageRevealTimer()},HV0)}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=Ws4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:Hs4(Ws4(this.previousIntroStage),A,bf(this.stageTransitionProgress));return this.dismissProgress>0?Hs4(Q,Nm5,bf(this.dismissProgress)):Q}build(A){let Q=L1.of(A).colorScheme,B=j0.of(A),$=this.currentOrbPalette(),J=eQ(1,"frontier",$),Y=s1.of(A).size,F=this.widget.animationProgress??this.animationProgress,X=Math.max(Y.width/ff,Y.height/UR)*Em5,D=X+(1-X)*F,G=bf(this.dismissProgress),V=Math.max(ff,Math.round(ff*D)),U=Math.max(UR,Math.round(UR*D)),K=Math.round((Y.width-V)/2),E=Math.round((Y.height-U)/2),z=Math.max(0,Math.floor((Y.width-ff)/2)),W=-Math.floor(UR/2),H=Math.round(K+(z-K)*F),q=Math.round(E+(W-E)*F),N=H+V/2,I=q+U/2,w=Im5({dismissProgress:this.dismissProgress,easedDismissProgress:G,introOrbScale:D,normalOrbCenterX:N,normalOrbCenterY:I,size:Y}),O=Math.max(ff,Math.round(ff*w.orbScale)),L=Math.max(UR,Math.round(UR*w.orbScale)),R=w.orbCenterX,v=w.orbCenterY,k=Math.round(R-O/2),x=Math.round(v-L/2),h=Math.max(3,Math.min(Y.height-5,Math.floor(UR/2)+2)),u=Math.max(h+3,Y.height-3),T=w.textDissolveProgress,f=this.isFinalIntroStage()?w.backdropDissolveProgress:0,c=this.firstStageTitleVisible&&T<1,d=c&&this.firstStageHintVisible,g=d&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),i=this.introStage===0?this.firstStageTitleRevealProgress:1,r=this.introStage===0?this.firstStageHintRevealProgress:1,B0=Math.max(24,Math.min(74,Y.width-4)),w0=Math.min(12,Math.max(8,Y.height-h-6)),X0=Math.max(0,Math.floor((Y.width-B0)/2)),H0=Math.max(0,Math.min(Y.height-w0,Math.floor(Y.height*0.55-w0/2))),R0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new Px({width:O,height:L,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:$.primary,secondaryColor:$.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new Px({width:O,height:L,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:$.primary,secondaryColor:$.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new c4({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 BA({fit:"expand",children:[new Ls4({color:Q.background,dissolveProgress:f}),new BA({fit:"expand",children:[new _1({onClick:()=>{},child:U0.expand()}),new HA({left:k,top:x,width:O,height:L,child:R0}),...c?[new HA({left:X0,top:H0,width:B0,height:w0,child:Cm5({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:B0,height:w0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:J,link:B.app.link,keybind:B.app.keybind,titleRevealProgress:i,dissolveProgress:T,context:A})})]:[],...d?[...g?[new HA({left:X0,top:Math.max(0,u-1),width:B0,height:1,child:new p({text:Pm5({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:T}),textAlign:"center"})})]:[],new HA({left:X0,top:u,width:B0,height:1,child:Tm5({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:B.app.keybind,revealProgress:r,dissolveProgress:T,context:A})})]:[]]})]})})}}class Ls4 extends U8{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new Os4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class Os4 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;N4(!!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=eY(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(!wm5(G,D,Y,Z,X))A.fill($+G,J+D,1,1," ",F)}}function eY(A){return Math.min(1,Math.max(0,A))}function bf(A){return 1-(1-A)**3}function Ws4(A){return zs4[A]??zs4[0]}function Hs4(A,Q,B){return{primary:kj(A.primary,Q.primary,B),secondary:kj(A.secondary,Q.secondary,B)}}function Im5({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:eY(A/0.52),backdropDissolveProgress:bf(eY((A-0.12)/0.88))}}function wm5(A,Q,B,$,J){let Y=$<=1?0:Q/($-1),Z=js4(A+Q*Math.max(1,B));return(1-Y)*0.72+Z*0.28<J}function Cm5({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 Y51({introStages:A,stage:Q,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E});let z=bf($),W=J*Math.round((1-z)*Y),H=-J*Math.round(z*Y);return new mz(new BA({fit:"expand",children:[new HA({left:H,top:0,width:Y,height:Z,child:Y51({introStages:A,stage:B,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:B===0?1:U,dissolveProgress:K,context:E})}),new HA({left:W,top:0,width:Y,height:Z,child:Y51({introStages:A,stage:Q,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E})})]}))}function Y51({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]??F51[0],V=new S({color:J,bold:!0}),U=new S({color:B}),K=A===F51&&Q===0,E=[...G.title===null?[]:[new p({text:K?NV0(Om5({progress:F,foreground:J,pulseColor:J}),X):new C(G$(G.title,X),V),textAlign:"center"})],...G.body.length>0?[Mm5()]:[],...G.body.map((z)=>Lm5(z,U,$,Y,Z,X,D))];return new Q4({child:new x0({padding:K0.horizontal(1),child:new y0({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:E})})})}function Mm5(){return U0.height(1)}function Lm5(A,Q,B,$,J,Y,Z){if(typeof A==="string")return new p({text:new C(G$(A,Y),Q),textAlign:"center"});if("codeBlock"in A)return new G3({onCopy:(F,X)=>{if(X)h5.success(Z,"Copied to clipboard",2000)},child:new y0({mainAxisSize:"min",children:A.codeBlock.map((F)=>new p({text:new C(G$(F,Y),new S({color:J})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let F=new p({text:new C("",void 0,[new C(G$(A.text,Y),new S({color:B,dim:!0})),new C(G$(A.keybind,Y,w4(A.text).length),new S({color:J}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new Q4({child:new G3({child:F})});return F}if("highlightText"in A){let F=GA.createSpan(A.href,A.linkText,new S({color:$,underline:!0})),X=aD.of(Z),D=new C("",void 0,[new C(A.text,Q),new C(A.highlightText,new S({color:J})),new C(A.textAfterHighlight,Q),new C(F.text,F.style,F.children,F.hyperlink,()=>{lA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new C(A.textAfter,Q)]);return new p({text:NV0(D,Y),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new y0({mainAxisSize:"min",children:[new p({text:new C(G$(A.text,Y),Q),textAlign:"center"}),new Q4({child:new s0({mainAxisSize:"min",children:[GA.createWidget(Z,A.href,G$(A.linkText,Y),new S({color:$,underline:!0})),new p({text:new C(G$(A.textAfter,Y),Q)})]})})]});let F=GA.createSpan(A.href,A.linkText,new S({color:$,underline:!0})),X=aD.of(Z),D=new C("",void 0,[new C(A.text,Q),new C(F.text,F.style,F.children,F.hyperlink,()=>{lA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new C(A.textAfter,Q)]);return new p({text:NV0(D,Y),textAlign:"center"})}if(Y>0)return new p({text:new C(G$(A.text,Y),new S({color:$,underline:!0})),textAlign:"center"});return new Q4({child:GA.createWidget(Z,A.href,A.text,new S({color:$,underline:!0}))})}function Om5({progress:A,foreground:Q,pulseColor:B}){let $=new S({color:Q,bold:!0}),J=new S({color:Rm5({progress:A,foreground:Q,pulseColor:B}),bold:!0});return new C("",void 0,[new C(jm5(A).padEnd(X51," "),$),new C(" ",$),new C(qs4(ws4,Hm5,A,0.72),$),new C(" ",$),new C(qs4(Cs4,qm5,A,0.88),J)])}function jm5(A){let Q=w4(Is4),B=Math.min(X51,Math.ceil(eY(A/0.62)*X51));return Q.slice(0,B).join("")}function qs4(A,Q,B,$){return B>=$?A:"".padEnd(Q," ")}function Rm5({progress:A,foreground:Q,pulseColor:B}){if(A<0.88||A>=1)return Q;let $=eY((A-0.88)/0.12);return Math.cos($*Math.PI*4)*(1-$)>0.12?B:Q}function Pm5({stage:A,featureStageCount:Q,foreground:B,dissolveProgress:$}){return new C(G$(`${A}/${Q}`,$),new S({color:B,dim:!0}))}function _m5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y}){let Z=new S({color:$}),F=new S({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=Ns4(X,J),E=Ns4(U,eY((J*(w4(X).length+w4(U).length)-w4(X).length)/w4(U).length));return new C("",void 0,[new C(G$(K,Y),Z),new C(G$(E.slice(0,D.length),Y),F),new C(G$(E.slice(D.length,D.length+G.length),Y),Z),new C(G$(E.slice(D.length+G.length),Y),F)])}function Tm5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y,context:Z}){if(Q)return new p({text:_m5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y}),textAlign:"center"});let F=new S({color:$}),X=new S({color:B,dim:!0});return new G3({onCopy:(D,G)=>{if(G)h5.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 Ns4(A,Q){let B=w4(A),$=Math.min(B.length,Math.ceil(eY(Q)*B.length));return B.slice(0,$).join("").padEnd(B.length," ")}function NV0(A,Q,B=0){if(Q<=0)return A;let $=B+w4(A.text??"").length,J=A.children?.map((Y)=>{let Z=NV0(Y,Q,$);return $+=w4(Y.toPlainText()).length,Z});return new C(A.text?G$(A.text,Q,B):A.text,A.style,J,A.hyperlink,A.onClick)}function G$(A,Q,B=0){if(Q<=0)return A;return w4(A).map((J,Y)=>{if(J.trim()==="")return J;return js4(B+Y)<Q?" ":J}).join("")}function js4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}d0();A2();function nI(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(iU(Z,D),new S({color:B.foreground,dim:$}))),J.push(new C(" (free)",new S({color:B.foreground,dim:$})));else if(Z>0)J.push(new C(iU(Z,D),new S({color:B.foreground,dim:$}))),J.push(new C(" (free)",new S({color:B.foreground,dim:$}))),J.push(new C(" + ",new S({color:B.foreground,dim:$}))),J.push(new C(iU(F,D),new S({color:B.foreground,dim:$,bold:!$})));else J.push(new C(iU(F,D),new S({color:B.foreground,dim:$,bold:!$})));return J}class G51 extends L4{}class V51 extends L4{}function km5(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 Sm5(A,Q){let B=j0.of(Q),{colors:$}=B,J=nI(A,{colors:{foreground:$.foreground}}),Y=[];if(J.length>0)Y.push(new C("Total: ",new S({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(`
5915
5915
 
5916
- `)),Y.push(new C("Details: ",new S({color:$.mutedForeground}))),Y.push(new C(A.costBreakdownURL,new S({color:B.app.link})));return new p({text:new C("",void 0,Y)})}function vm5(A,Q,B){let $=Sm5(A,Q);if(!A.costBreakdownURL)return new CA({header:"Thread Cost",minWidth:80,maxWidth:100,onDismiss:B,child:$});let J=A.costBreakdownURL,Y=new g1(()=>{return d4.maybeInvoke(Q,new l9(J,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),Z=new g1(()=>{return lA(Q,J),"handled"});return new CA({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 d4({actions:new Map([[G51,Y],[V51,Z]]),child:new Z5({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[C1.key("o"),new V51],[C1.key("y"),new G51]]),child:new g4({autofocus:!0,debugLabel:"ThreadCostBody",child:$})})})})}function Rs4(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(km5(J,Y.error),"error",5000),$();return}Q.push(vm5(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),$()}}}}class U51 extends _0{listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;updateService;initialThreadIDs;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;onRelaunchRequested;onFirstFrame;initialUserInput;getDefaultNewThreadVisibility;openThreadPickerOnStart;workspaceSettingsFilePath;neoContext;constructor(A){super();this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.updateService=A.updateService,this.initialThreadIDs=A.initialThreadIDs??[],this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.mcpTrustHandler=A.mcpTrustHandler,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.onRelaunchRequested=A.onRelaunchRequested,this.onFirstFrame=A.onFirstFrame,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.neoContext=A.neoContext}createState(){return new _s4}}class _s4 extends P0{editorController=new T8;commandPalette=new j01(this);commandRegistry=new WA1;toastController=new k01;relaunchNotificationController=new FA1;exitHintTimer=new Dr(this,1000);ideStatus=new V2(this,{});threadNavigationHistory=new VA1;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;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};analyzeContextForThread=async(A,Q)=>{return Qm4({ampURL:this.widget.neoContext.ampURL,configService:this.widget.configService,threadID:A,signal:Q})};onSwitchThread=(A)=>{this.connectToExistingThread(A,{recordNavigation:!0})};sendFeedbackReport=async(A)=>hG0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await Xc4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Dc4({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 Gc4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if(B$.getInstance().interceptConsole(),this.notices=new n41(this.widget.configService,(B)=>this.setState(B)),Q6.instance.addPostFrameCallback(()=>{setTimeout(()=>this.widget.onFirstFrame?.(),0),this.noticesPollingTimeout=setTimeout(()=>{this.noticesPollingTimeout=null,this.notices.startPolling()},500)},"Neo notices polling"),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:B,error:$})=>{if(j.error("Neo failed to connect to thread",{threadID:B,error:$}),!B)this.toastController.show(`Connection failed: ${$.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe((B)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(S30(B.settings)))}),this.updateRelaunchIntegration=new DA1({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested,relaunchNotificationController:this.relaunchNotificationController,updateService:this.widget.updateService}),this.updateRelaunchIntegration.init(),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput,Q=this.widget.initialThreadIDs[0];if(Q){let B={};if(A)B.initialUserInput=A;this.connectToInitialThreads(Q,B)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new ZA1({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.mcpTrustIntegration=new i41({state:this,mcpTrustHandler:this.widget.mcpTrustHandler,toastController:this.toastController,workspaceSettingsFilePath:this.widget.workspaceSettingsFilePath}),this.mcpTrustIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=H4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?Wn4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],$=[Mn4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(J,Y,Z)=>{J.pushWithDismiss((F)=>J61({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()}},Rs4({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 PA1({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 $51({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 lA(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:()=>{QB(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 jA1({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 wA1({commands:W9.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 CA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new p({text:new C(ZD0({version:"0.0.1778989718-g339de8",buildTimestamp:"2026-05-17T03:53:42.010Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:C1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{d4.maybeInvoke(Y,new Nf)}},...Q,...ti4(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 Map([[C1.ctrl("c"),new MG0],[C1.ctrl("o"),new OG0],[C1.alt("i"),new RG0],[C1.alt("p"),new wI],[C1.ctrl("."),new _G0],[C1.ctrl("t"),new SG0]]);if(IV0.env.NODE_ENV==="development"&&IV0.platform==="darwin")J.set(C1.meta("r"),new LG0);let Y=new B51({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:B,statusItems:this.pluginIntegration?.getStatusItems()??[],notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.neoWelcomeVisible?null:$,onDismissNotice:(V)=>this.notices.dismiss(V)}),Z=s1.of(A),F=Z.capabilities.animationSupport!=="disabled",D=[new u0({constraints:M1.tight(Z.size.width,Z.size.height),child:Y})];if(this.commandPalette.isEnabled())D.push(new c4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new HA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)D.push(J61({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)D.push(new c4({debugLabel:"NeoWelcomeDialogOverlay",child:new D51({onDismiss:this.dismissNeoWelcome,onQuit:()=>H4.instance.stop(),animationsEnabled:F,variant:this.widget.neoWelcomeVariant})}));let G=this.executorAlreadyConnectedDialog;if(G)D.push(new c4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new LA1({existingExecutorPid:G.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(D.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),D.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)D.push(new MA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:IV0.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)D.push(new OA1);return new Q8({neoContext:this.widget.neoContext,child:new W9({commandRegistry:this.commandRegistry,child:new Cf({completionBuilder:this.widget.completionBuilder,child:new h5({controller:this.toastController,child:new d4({actions:this.buildActions(),child:new Z5({debugLabel:"NeoAppShortcuts",shortcuts:J,child:new g4({debugLabel:"AppShellFocus",child:new S01({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...$&&this.activeThreadContext&&!this.neoWelcomeVisible?[this.notices]:[]],child:new CA1({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new BA({children:D})})})})})})})})})})}buildActions(){let A=new g1(()=>{if(CJ.hasAnyCopyableSelection())return CJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new g1(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new g1(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new g1(()=>{return this.startNewDraftThread(),"handled"}),J=new g1(()=>{return H4.instance.stop(),"handled"}),Y=new g1(()=>{return Us({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),Z=new g1((U)=>{if(!U.text)return"ignored";return H4.instance.tuiInstance.clipboard.writeText(U.text).then((K)=>{if(K.ok)this.toastController.show(U.successMessage,"success",2000);else this.toastController.show(`${U.failureMessage}: ${K.userFacingErrorMessage}`,"error",4000)}).catch((K)=>{j.error("Failed to copy Neo text to clipboard",{error:K}),this.toastController.show(U.failureMessage,"error",2000)}),"handled"}),F=new g1(()=>{return H4.instance.toggleFrameStatsOverlay(),"handled"}),X=new g1(()=>this.notices.dismissCurrent()?"handled":"ignored"),D=new g1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),G=yn4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,neoContext:this.widget.neoContext,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),V=new g1(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[MG0,A],[$s,$],[Nf,J],[LG0,Y],[l9,Z],[Zs,B],[OG0,Q],[RG0,D],[_G0,X],...G,[wI,F],[SG0,V]])}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}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 xx(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,$=$$(Q),J=nX0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return iX0(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=Ps4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(uZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=Ps4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(bI);if(this.exitHintTimer.isActive())A.add(Ef);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),H4.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")H4.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(M30);if(Y)this.widget.history.add(Y.text,IV0.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 $=$$(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};AB((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=kY0(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};getRelaunchThreadIDs=()=>{let A=new Set,Q=this.getActiveThreadID();if(Q)A.add(Q);for(let B of this.widget.clientPool.activeThreadIDs)A.add(B);return[...A]};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 connectToInitialThreads(A,Q={}){await this.connectToExistingThread(A,Q);let B=this.widget.initialThreadIDs.filter(($)=>$!==A);await Promise.all(B.map(($)=>this.resumeBackgroundThread($)))}async resumeBackgroundThread(A){try{await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:async()=>"observe"})}catch(Q){j.error("Failed to resume background thread",{error:Q,threadID:A}),this.toastController.show(`Failed to resume ${A}: ${Q instanceof Error?Q.message:String(Q)}`,"error",4000)}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q}}),this.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(){if(this.unregisterCommands?.(),this.unregisterCommands=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.mcpTrustIntegration?.dispose(),this.mcpTrustIntegration=null,this.updateRelaunchIntegration?.dispose(),this.updateRelaunchIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.noticesPollingTimeout)clearTimeout(this.noticesPollingTimeout),this.noticesPollingTimeout=null;this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.neoWelcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function Ps4(A,Q,B){let $={...A};for(let J of ym5(Q,B)){if(!uZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function ym5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}n4();function Ts4(A,Q,B,$){let J=sT(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 iY(G,V),K=new g9(42),E=new zI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,E0.default(),K);E.layout(M1.tight(G,V)),E.paint(U,0,0);let z=U.getBuffer().getCells(),W=0;for(let R=0;R<V;R++)if(z[R].some((v)=>v.char!==" ")){W=R;break}let H=V-1;for(let R=V-1;R>=0;R--)if(z[R].some((v)=>v.char!==" ")){H=R;break}function q(R,v){if(!R)return"";if(R.type==="rgb"){let{r:k,g:x,b:h}=R.value;if(B.getColorDepth()>=24)return`\x1B[${v?38:48};2;${k};${x};${h}m`;let u=Pj(k,x,h);return`\x1B[${v?38:48};5;${u}m`}return""}let N=[];if(H>=W)for(let R=W;R<=H;R++){let v="";for(let k=0;k<G;k++){let x=z[R][k],h=x.char,u=q(x.style.fg,!0);v+=u+h+"\x1B[0m"}N.push(v)}let I=N.length,w=Math.max(I,D.length),O=Math.floor((w-I)/2),L=Math.floor((w-D.length)/2);for(let R=0;R<w;R++){let v=" ".repeat(G);if(R>=O&&R<O+I)v=N[R-O];let k=" ",x="";if(R>=L&&R<L+D.length)x=D[R-L];B.write(v+k+x+`
5916
+ `)),Y.push(new C("Details: ",new S({color:$.mutedForeground}))),Y.push(new C(A.costBreakdownURL,new S({color:B.app.link})));return new p({text:new C("",void 0,Y)})}function vm5(A,Q,B){let $=Sm5(A,Q);if(!A.costBreakdownURL)return new CA({header:"Thread Cost",minWidth:80,maxWidth:100,onDismiss:B,child:$});let J=A.costBreakdownURL,Y=new g1(()=>{return d4.maybeInvoke(Q,new l9(J,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),Z=new g1(()=>{return lA(Q,J),"handled"});return new CA({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 d4({actions:new Map([[G51,Y],[V51,Z]]),child:new Z5({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[C1.key("o"),new V51],[C1.key("y"),new G51]]),child:new g4({autofocus:!0,debugLabel:"ThreadCostBody",child:$})})})})}function Rs4(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(km5(J,Y.error),"error",5000),$();return}Q.push(vm5(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),$()}}}}class U51 extends _0{listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;updateService;initialThreadIDs;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;onRelaunchRequested;onFirstFrame;initialUserInput;getDefaultNewThreadVisibility;openThreadPickerOnStart;workspaceSettingsFilePath;neoContext;constructor(A){super();this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.updateService=A.updateService,this.initialThreadIDs=A.initialThreadIDs??[],this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.mcpTrustHandler=A.mcpTrustHandler,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.onRelaunchRequested=A.onRelaunchRequested,this.onFirstFrame=A.onFirstFrame,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.neoContext=A.neoContext}createState(){return new _s4}}class _s4 extends P0{editorController=new T8;commandPalette=new j01(this);commandRegistry=new WA1;toastController=new k01;relaunchNotificationController=new FA1;exitHintTimer=new Dr(this,1000);ideStatus=new V2(this,{});threadNavigationHistory=new VA1;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;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};analyzeContextForThread=async(A,Q)=>{return Qm4({ampURL:this.widget.neoContext.ampURL,configService:this.widget.configService,threadID:A,signal:Q})};onSwitchThread=(A)=>{this.connectToExistingThread(A,{recordNavigation:!0})};sendFeedbackReport=async(A)=>hG0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await Xc4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Dc4({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 Gc4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if(B$.getInstance().interceptConsole(),this.notices=new n41(this.widget.configService,(B)=>this.setState(B)),Q6.instance.addPostFrameCallback(()=>{setTimeout(()=>this.widget.onFirstFrame?.(),0),this.noticesPollingTimeout=setTimeout(()=>{this.noticesPollingTimeout=null,this.notices.startPolling()},500)},"Neo notices polling"),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:B,error:$})=>{if(j.error("Neo failed to connect to thread",{threadID:B,error:$}),!B)this.toastController.show(`Connection failed: ${$.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe((B)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(S30(B.settings)))}),this.updateRelaunchIntegration=new DA1({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested,relaunchNotificationController:this.relaunchNotificationController,updateService:this.widget.updateService}),this.updateRelaunchIntegration.init(),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput,Q=this.widget.initialThreadIDs[0];if(Q){let B={};if(A)B.initialUserInput=A;this.connectToInitialThreads(Q,B)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new ZA1({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.mcpTrustIntegration=new i41({state:this,mcpTrustHandler:this.widget.mcpTrustHandler,toastController:this.toastController,workspaceSettingsFilePath:this.widget.workspaceSettingsFilePath}),this.mcpTrustIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=H4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?Wn4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],$=[Mn4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(J,Y,Z)=>{J.pushWithDismiss((F)=>J61({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()}},Rs4({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 PA1({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 $51({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 lA(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:()=>{QB(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 jA1({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 wA1({commands:W9.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 CA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new p({text:new C(ZD0({version:"0.0.1778994836-g963bd3",buildTimestamp:"2026-05-17T05:18:35.020Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:C1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{d4.maybeInvoke(Y,new Nf)}},...Q,...ti4(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 Map([[C1.ctrl("c"),new MG0],[C1.ctrl("o"),new OG0],[C1.alt("i"),new RG0],[C1.alt("p"),new wI],[C1.ctrl("."),new _G0],[C1.ctrl("t"),new SG0]]);if(IV0.env.NODE_ENV==="development"&&IV0.platform==="darwin")J.set(C1.meta("r"),new LG0);let Y=new B51({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:B,statusItems:this.pluginIntegration?.getStatusItems()??[],notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.neoWelcomeVisible?null:$,onDismissNotice:(V)=>this.notices.dismiss(V)}),Z=s1.of(A),F=Z.capabilities.animationSupport!=="disabled",D=[new u0({constraints:M1.tight(Z.size.width,Z.size.height),child:Y})];if(this.commandPalette.isEnabled())D.push(new c4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new HA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)D.push(J61({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)D.push(new c4({debugLabel:"NeoWelcomeDialogOverlay",child:new D51({onDismiss:this.dismissNeoWelcome,onQuit:()=>H4.instance.stop(),animationsEnabled:F,variant:this.widget.neoWelcomeVariant})}));let G=this.executorAlreadyConnectedDialog;if(G)D.push(new c4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new LA1({existingExecutorPid:G.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(D.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),D.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)D.push(new MA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:IV0.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)D.push(new OA1);return new Q8({neoContext:this.widget.neoContext,child:new W9({commandRegistry:this.commandRegistry,child:new Cf({completionBuilder:this.widget.completionBuilder,child:new h5({controller:this.toastController,child:new d4({actions:this.buildActions(),child:new Z5({debugLabel:"NeoAppShortcuts",shortcuts:J,child:new g4({debugLabel:"AppShellFocus",child:new S01({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...$&&this.activeThreadContext&&!this.neoWelcomeVisible?[this.notices]:[]],child:new CA1({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new BA({children:D})})})})})})})})})})}buildActions(){let A=new g1(()=>{if(CJ.hasAnyCopyableSelection())return CJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new g1(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new g1(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new g1(()=>{return this.startNewDraftThread(),"handled"}),J=new g1(()=>{return H4.instance.stop(),"handled"}),Y=new g1(()=>{return Us({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),Z=new g1((U)=>{if(!U.text)return"ignored";return H4.instance.tuiInstance.clipboard.writeText(U.text).then((K)=>{if(K.ok)this.toastController.show(U.successMessage,"success",2000);else this.toastController.show(`${U.failureMessage}: ${K.userFacingErrorMessage}`,"error",4000)}).catch((K)=>{j.error("Failed to copy Neo text to clipboard",{error:K}),this.toastController.show(U.failureMessage,"error",2000)}),"handled"}),F=new g1(()=>{return H4.instance.toggleFrameStatsOverlay(),"handled"}),X=new g1(()=>this.notices.dismissCurrent()?"handled":"ignored"),D=new g1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),G=yn4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,neoContext:this.widget.neoContext,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),V=new g1(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[MG0,A],[$s,$],[Nf,J],[LG0,Y],[l9,Z],[Zs,B],[OG0,Q],[RG0,D],[_G0,X],...G,[wI,F],[SG0,V]])}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}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 xx(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,$=$$(Q),J=nX0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return iX0(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=Ps4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(uZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=Ps4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(bI);if(this.exitHintTimer.isActive())A.add(Ef);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),H4.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")H4.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(M30);if(Y)this.widget.history.add(Y.text,IV0.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 $=$$(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};AB((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=kY0(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};getRelaunchThreadIDs=()=>{let A=new Set,Q=this.getActiveThreadID();if(Q)A.add(Q);for(let B of this.widget.clientPool.activeThreadIDs)A.add(B);return[...A]};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 connectToInitialThreads(A,Q={}){await this.connectToExistingThread(A,Q);let B=this.widget.initialThreadIDs.filter(($)=>$!==A);await Promise.all(B.map(($)=>this.resumeBackgroundThread($)))}async resumeBackgroundThread(A){try{await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:async()=>"observe"})}catch(Q){j.error("Failed to resume background thread",{error:Q,threadID:A}),this.toastController.show(`Failed to resume ${A}: ${Q instanceof Error?Q.message:String(Q)}`,"error",4000)}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q}}),this.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(){if(this.unregisterCommands?.(),this.unregisterCommands=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.mcpTrustIntegration?.dispose(),this.mcpTrustIntegration=null,this.updateRelaunchIntegration?.dispose(),this.updateRelaunchIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.noticesPollingTimeout)clearTimeout(this.noticesPollingTimeout),this.noticesPollingTimeout=null;this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.neoWelcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function Ps4(A,Q,B){let $={...A};for(let J of ym5(Q,B)){if(!uZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function ym5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}n4();function Ts4(A,Q,B,$){let J=sT(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 iY(G,V),K=new g9(42),E=new zI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,E0.default(),K);E.layout(M1.tight(G,V)),E.paint(U,0,0);let z=U.getBuffer().getCells(),W=0;for(let R=0;R<V;R++)if(z[R].some((v)=>v.char!==" ")){W=R;break}let H=V-1;for(let R=V-1;R>=0;R--)if(z[R].some((v)=>v.char!==" ")){H=R;break}function q(R,v){if(!R)return"";if(R.type==="rgb"){let{r:k,g:x,b:h}=R.value;if(B.getColorDepth()>=24)return`\x1B[${v?38:48};2;${k};${x};${h}m`;let u=Pj(k,x,h);return`\x1B[${v?38:48};5;${u}m`}return""}let N=[];if(H>=W)for(let R=W;R<=H;R++){let v="";for(let k=0;k<G;k++){let x=z[R][k],h=x.char,u=q(x.style.fg,!0);v+=u+h+"\x1B[0m"}N.push(v)}let I=N.length,w=Math.max(I,D.length),O=Math.floor((w-I)/2),L=Math.floor((w-D.length)/2);for(let R=0;R<w;R++){let v=" ".repeat(G);if(R>=O&&R<O+I)v=N[R-O];let k=" ",x="";if(R>=L&&R<L+D.length)x=D[R-L];B.write(v+k+x+`
5917
5917
  `)}if($)B.write(`
5918
5918
  \x1B[90m${$}\x1B[0m
5919
5919
  `)}d0();$D0();var xm5=2000,fm5="Agent is ready",bm5="Waiting for approval";function ks4(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<xm5)return;if(J=W,xj())return;if(BX0())$X0();else WZ0(z)},Z=(z)=>{if(!Q||!B)return;if(xj()&&!Qr()&&!Ox())return;process.stdout.write(xD(`\x1B]777;notify;Amp;${z}\x1B\\`))},F=()=>{Y("idle"),Z(fm5)},X=()=>{Y("requires-user-input"),Z(bm5)},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&&dQ(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 um5({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 hm5(A){await AB((Q)=>bx(Q,A,"interactive"))}async function Ss4(A,Q={}){let{initialThreadIDs:B=[],initialUserInput:$,getDefaultNewThreadVisibility:J,openThreadPickerOnStart:Y=!1,observerOnly:Z=!1,initialAgentMode:F,initialReasoningEffort:X,onFirstFrame:D,showNeoWelcome:G=!1,hideNeoWelcome:V=!1,neoWelcomeVariant:U="intro"}=Q,K=U==="npm-migration";if(B.length>1)j.info("Resuming multiple initial threads",{threadIDs:B});let E=async(k)=>{let x=await A.getThreadFromServer(k);if(!x)return null;return mF0(x)},z=async(k)=>{let x=await A.getThreadFromServer(k);if(!x)throw Error(`Thread ${k} not found`);let h=await b9(k,A.configService,A.apiKey,{usesThreadActors:!0}),f=await OU({endpoint:A.rivetEndpoint,poolName:h.poolName}).threadActor.getOrCreate([k],{params:{wsToken:h.wsToken},createWithInput:{threadId:h.threadId,threadVersion:h.threadVersion,ownerUserId:h.ownerUserId,...h.agentMode?{agentMode:h.agentMode}:{}}}).fetch("/import",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({thread:Wx4(x)}),skipReadyWait:!0});if(!f.ok&&f.status!==409)throw Error(`Thread import failed (${f.status}): ${await f.text()}`);try{await cx4(k,A.configService,A.apiKey,{executorType:"local-client"})}catch(c){j.warn("failed to mark thread as imported on server",{threadID:k,error:c instanceof Error?c.message:String(c)})}},W=new $01(A.rivetEndpoint,A.apiKey,A.configService,{clientID:iN.parse(`neo-${crypto.randomUUID()}`),toolService:A.toolService,skillService:A.skillService,requestPluginToolCall:(k)=>A.pluginService.event.toolCall(k),requestPluginToolResult:(k)=>A.pluginService.event.toolResult(k),pluginService:A.pluginService,invokeTool:async(k,x)=>{let h=typeof x.args==="object"&&x.args!==null?x.args:{},u=await JI({toolName:x.toolName,configService:A.configService,toolService:A.toolService,mcpService:A.mcpService,skillService:A.skillService,toolUseID:x.toolCallId,threadId:k});return A.toolService.invokeTool(x.toolName,{args:h},u)},persistLastThreadID:hm5,readFileSystemDirectory:A.readFileSystemDirectory},E,z),H=await gz(),q=um5({initialUserInput:$,showNeoWelcome:G,hideNeoWelcome:V,neoWelcomeVariant:U,neoWelcomeDismissed:H.neoWelcomeDismissed}),N={ampURL:A.ampURL,configService:A.configService,getThreadMarkdown:async(k)=>{let x=await A.getThreadFromServer(k);return x?SV(x):null},isInternalUser:A.isInternalUser,listThreads:A.listThreads,logFilePath:ja,mcpServers:A.mcpService.servers,pluginPlatform:A.pluginPlatform,pluginService:A.pluginService,toolboxes:A.toolboxes,observerOnly:K?!1:Z,sessionAgentMode:F??H.agentMode,explicitReasoningEffort:X,lastReasoningEffortByMode:H.lastReasoningEffortByMode,lastSpeedByMode:H.lastSpeedByMode,settingsFilePath:A.settingsFilePath,splashOrbVisualStyle:Q.splashOrbVisualStyle??"neo",workspaceRoot:A.workspaceRoot},I=(k,x)=>{return Fg4({ampURL:A.ampURL,configService:A.configService,threadID:k,signal:x})},w=new M01,O=ks4({configService:A.configService}),L=await A.configService.getLatest();H4.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:L.settings["terminal.animation"]===!1}});let R=new Set,v=new XA1;try{await Br(new U51({clientPool:W,listSkillsForThread:I,completionBuilder:A.completionBuilder,history:new Vo,ideManager:w,configService:A.configService,updateService:A.updateService,initialThreadIDs:K?[]:B,notificationService:O,mcpTrustHandler:A.mcpTrustHandler,initialUserInput:K?void 0:$,getDefaultNewThreadVisibility:J,openThreadPickerOnStart:K?!1:Y,workspaceSettingsFilePath:A.workspaceSettingsFilePath,neoContext:N,showNeoWelcome:q.show,neoWelcomeVariant:U,onActiveThreadChange:A.setActiveThreadID,onRelaunchRequested:v.request,onNeoWelcomeDismissed:q.markDismissedOnDismiss?()=>{AB(Gg4).catch((x)=>{j.warn("Failed to mark Neo welcome as dismissed",{error:x})})}:void 0,onThreadArchived:(x)=>{R.add(x)},onFirstFrame:D}));let k=W.lastActiveObservingClient;if(k&&v.shouldShowExitSummary){let{client:x,observer:h}=k,u=x.getThreadId();if(u){let T={id:u,title:h.title().getValue(),agentMode:h.agentMode,archived:R.has(u)},f=`${A.ampURL.replace(/\/$/,"")}/threads/${u}`;Ts4(T,f,process.stdout)}}}finally{process.stdout.write(UI("")),O.unsubscribe(),W.dispose(),await A.dispose?.()}process.exit(v.relaunchIfRequested(A.workspaceRoot)??0)}F3();function uf(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 vs4(A){if(A.visibility!=="private")return!0;if("shareWithAllCreatorGroups"in A&&A.shareWithAllCreatorGroups)return!0;return"sharedGroupIDs"in A&&A.sharedGroupIDs.length>0}function KR(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 wV0(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 hf(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=uf({workspace:Q?.team??void 0}).filter((Y)=>!Y.disabledReason).map((Y)=>wV0(Y.meta));if(J.includes(B))return gm5(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.
@@ -7675,7 +7675,7 @@ ${J}`,Q);this.line=B,this.column=$,this.codeblock=J}}/*!
7675
7675
  `),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 S({color:$.app.keybind,bold:!0})));else Y.push(new C(G,new S({color:B.colorScheme.foreground})));if(Z<J.length-1)Y.push(new C(`
7676
7676
  `))}return new u0({decoration:{color:B.colorScheme.background,border:d1.all(new c1($.app.keybind,1,"rounded"))},child:new x0({padding:K0.symmetric(0,1),child:new p({text:new C(void 0,void 0,Y)})})})}}class C31 extends U8{chartData;highlightIndex;showAxes;colors;constructor({key:A,chartData:Q,highlightIndex:B=null,showAxes:$=!0,colors:J=bU0}){super(A?{key:A}:{});this.chartData=Q,this.highlightIndex=B,this.showAxes=$,this.colors=J}createRenderObject(){return new I31({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 V1A(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?n8: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?n8: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 Za5(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?n8: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?n8: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 Fa5(A){let Q=0;for(let B of A)for(let $ of B.points)if($.value>Q)Q=$.value;return Q||1}function Xa5(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 Da5(A,Q,B,$,J,Y,Z){let F;try{let E=L1.of(A),z=j0.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 S({color:F.foreground,bold:!0}),D=new S({color:F.foreground}),G=new S({color:F.foreground,dim:!0}),V=[],U=new S({color:F.foreground,underline:!0}),K=(E,z)=>new C(z,U,void 0,xz(E),()=>{lA(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}
7677
7677
  `,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 S({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(`
7678
- `))}if(E)V.push(new C(" ",G)),V.push(new C("Total: ",G)),V.push(new C(Y(z),D))}return new u0({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 U1A(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}F3();l3();S3();PQ();J7();A2();i7();mq();n4();dS();WT();R1();d0();J7();class M31{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.1778989718-g339de8"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await R30(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 Zw extends _0{props;constructor(A){super();this.props=A}createState(){return new K1A}}class K1A extends P0{_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 E1A extends P0{controller=new T8;focusNode=new A6({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=j0.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 Y$({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 u0({decoration:{color:B.background},child:new p({text:new C(">",new S({color:B.foreground}))})}),new T1({child:X})]}),G=new u0({padding:K0.symmetric(1,0),child:new p({text:this.widget.props.title?new C(this.widget.props.title,new S({color:$.command,bold:!0})):new C("",void 0,[new C("Command: ",new S({color:B.foreground})),new C(this.widget.props.commandName,new S({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new C("Enter",new S({color:$.keybind}))),V.push(new C(" to submit, ",new S({color:B.foreground,dim:!0})));V.push(new C("Esc",new S({color:$.keybind}))),V.push(new C(" to cancel",new S({color:B.foreground,dim:!0})));let U=new u0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,V)})});return new u0({decoration:{border:F,color:B.background},padding:K0.all(1),child:new y0({children:[G,new U0({height:1}),D,new X5,U]})})}}class os extends _0{props;constructor(A){super();this.props=A}createState(){return new E1A}}i7();class z1A extends P0{controller=new T8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new A6({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>=L9)return!1;let Q=await dU(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=j0.of(A),{colors:B,app:$}=Q,Y=s1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new sz({controller:this.controller,triggers:[new sF],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:H4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),X=new g4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),D=new u0({constraints:new M1({maxHeight:Z}),padding:K0.symmetric(1,0),child:X}),G=new u0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,[new C("Command: ",new S({color:B.foreground})),new C(this.widget.props.commandName,new S({color:$.command,bold:!0}))])})}),V=new u0({padding:K0.symmetric(1,0),child:new p({text:this.isConfirmingClearInput?new C("",void 0,[new C("Esc",new S({color:$.keybind})),new C(" again to clear input",new S({color:B.foreground,dim:!0}))]):new C("",void 0,[new C("Press ",new S({color:B.foreground,dim:!0})),new C("Enter",new S({color:$.keybind})),new C(" to submit, ",new S({color:B.foreground,dim:!0})),new C("Esc",new S({color:$.keybind})),new C(" to clear",new S({color:B.foreground,dim:!0}))])})}),U=[G,new U0({height:1}),new T1({child:D}),new U0({height:1}),V];return new u0({decoration:{border:d1.all(new c1(B.foreground,1,"solid")),color:B.background},padding:K0.all(1),child:new y0({children:U})})}}class L31 extends _0{props;constructor(A){super();this.props=A}createState(){return new z1A}}function W1A(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 O31 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)=>W1A(J.pubDate).length));return new G5({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=j0.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 U0({width:W,child:s0.end([new p({text:new C(z,new S({color:K}))})])});return new u0({decoration:V?{color:V}:void 0,padding:K0.symmetric(2,0),child:new s0({children:[new T1({child:new p({text:new C(J.title,new S({color:U})),overflow:"ellipsis",maxLines:1})}),new U0({width:2}),E(W1A(J.pubDate),B)]})})}})}}class KB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!KB._instance)KB._instance=new KB;return KB._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 H1A extends P0{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=j0.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 G5({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 u0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C("",void 0,[new C("Create new label: ",new S({color:E})),new C(W,new S({color:E,bold:!0}))])})})}return new u0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C(D.name,new S({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 j31 extends _0{props;constructor(A){super();this.props=A}createState(){return new H1A}}class tD extends _0{props;constructor(A){super();this.props=A}createState(){return new q1A}}class q1A extends P0{_spinner=new q6;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=j0.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 S({color:$.processing})),new C(" ",void 0),new C(this.widget.props.message,new S({color:B.foreground}))])}),X=[new T1({child:new y0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)X.push(new U0({height:2,child:new u0({padding:K0.symmetric(2,0),child:new p({text:new C("",new S({dim:!0}),[new C("Press ",new S({color:B.foreground})),new C("Esc",new S({color:B.info})),new C(" to cancel",new S({color:B.foreground}))])})})}));let D=new u0({decoration:new b4(B.background,J),child:new U0({width:60,height:7,child:new y0({mainAxisAlignment:"start",children:X})})});if(this.widget.props.onAbort)return new c4({debugLabel:"LoadingDialog",child:new g4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:D})});return D}}class oU extends _0{props;constructor(A){super();this.props=A}createState(){return new N1A}}class N1A extends P0{scrollController=new yA;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 h2}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=j0.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=bD0(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 u0({padding:K0.symmetric(1,0),child:new p({text:new C($.title,new S({color:J,bold:!0}))})}),F=this.isWidgetMessage(B)?B.widget:new p({text:new C($.description,new S({color:Q.colors.foreground})),selectable:!0}),X=new T1({child:new G3({child:new u0({padding:K0.symmetric(1,0),child:new s0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new T1({child:new xA({controller:this.scrollController,autofocus:!0,child:F})}),new E2({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 u0({padding:K0.symmetric(1,0),child:new p({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new S({color:Q.colors.foreground,dim:!0})),new C("R",new S({color:Q.app.keybind})),new C(" to retry, ",new S({color:Q.colors.foreground,dim:!0})),new C("Esc",new S({color:Q.app.keybind})),new C(" to cancel",new S({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new C("",new S({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new S({color:Q.app.keybind}),U=new S({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 S({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new c4({debugLabel:"MessageDialog",child:new BA({fit:"expand",children:[new _1({onClick:()=>{},child:new U0}),new g4({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 u0({decoration:{border:Y,color:Q.colors.background},padding:K0.all(1),child:new y0({mainAxisAlignment:"center",children:[Z,new U0({height:1}),X,D]})})})]})})}}F3();l1();class I1A extends _0{props;constructor(A){super();this.props=A}createState(){return new w1A}}class w1A extends P0{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=m0.file(this.widget.props.cwd),B=Q1.relativePath(Q,G6(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return d5(A)}statusIcon(A){let Q=l8.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=j0.of(A),{app:B}=Q;if(this.plugins.length===0)return new p({text:new C("No plugins found.",new S({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 S({bold:!0}))),Z>0||F>0)$.push(new C(` (${Z} ${D4(Z,"command")}, ${F} ${D4(F,"tool")})`,new S({dim:!0})));$.push(new C(`
7678
+ `))}if(E)V.push(new C(" ",G)),V.push(new C("Total: ",G)),V.push(new C(Y(z),D))}return new u0({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 U1A(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}F3();l3();S3();PQ();J7();A2();i7();mq();n4();dS();WT();R1();d0();J7();class M31{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.1778994836-g963bd3"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await R30(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 Zw extends _0{props;constructor(A){super();this.props=A}createState(){return new K1A}}class K1A extends P0{_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 E1A extends P0{controller=new T8;focusNode=new A6({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=j0.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 Y$({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 u0({decoration:{color:B.background},child:new p({text:new C(">",new S({color:B.foreground}))})}),new T1({child:X})]}),G=new u0({padding:K0.symmetric(1,0),child:new p({text:this.widget.props.title?new C(this.widget.props.title,new S({color:$.command,bold:!0})):new C("",void 0,[new C("Command: ",new S({color:B.foreground})),new C(this.widget.props.commandName,new S({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new C("Enter",new S({color:$.keybind}))),V.push(new C(" to submit, ",new S({color:B.foreground,dim:!0})));V.push(new C("Esc",new S({color:$.keybind}))),V.push(new C(" to cancel",new S({color:B.foreground,dim:!0})));let U=new u0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,V)})});return new u0({decoration:{border:F,color:B.background},padding:K0.all(1),child:new y0({children:[G,new U0({height:1}),D,new X5,U]})})}}class os extends _0{props;constructor(A){super();this.props=A}createState(){return new E1A}}i7();class z1A extends P0{controller=new T8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new A6({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>=L9)return!1;let Q=await dU(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=j0.of(A),{colors:B,app:$}=Q,Y=s1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new sz({controller:this.controller,triggers:[new sF],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:H4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),X=new g4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),D=new u0({constraints:new M1({maxHeight:Z}),padding:K0.symmetric(1,0),child:X}),G=new u0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,[new C("Command: ",new S({color:B.foreground})),new C(this.widget.props.commandName,new S({color:$.command,bold:!0}))])})}),V=new u0({padding:K0.symmetric(1,0),child:new p({text:this.isConfirmingClearInput?new C("",void 0,[new C("Esc",new S({color:$.keybind})),new C(" again to clear input",new S({color:B.foreground,dim:!0}))]):new C("",void 0,[new C("Press ",new S({color:B.foreground,dim:!0})),new C("Enter",new S({color:$.keybind})),new C(" to submit, ",new S({color:B.foreground,dim:!0})),new C("Esc",new S({color:$.keybind})),new C(" to clear",new S({color:B.foreground,dim:!0}))])})}),U=[G,new U0({height:1}),new T1({child:D}),new U0({height:1}),V];return new u0({decoration:{border:d1.all(new c1(B.foreground,1,"solid")),color:B.background},padding:K0.all(1),child:new y0({children:U})})}}class L31 extends _0{props;constructor(A){super();this.props=A}createState(){return new z1A}}function W1A(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 O31 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)=>W1A(J.pubDate).length));return new G5({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=j0.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 U0({width:W,child:s0.end([new p({text:new C(z,new S({color:K}))})])});return new u0({decoration:V?{color:V}:void 0,padding:K0.symmetric(2,0),child:new s0({children:[new T1({child:new p({text:new C(J.title,new S({color:U})),overflow:"ellipsis",maxLines:1})}),new U0({width:2}),E(W1A(J.pubDate),B)]})})}})}}class KB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!KB._instance)KB._instance=new KB;return KB._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 H1A extends P0{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=j0.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 G5({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 u0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C("",void 0,[new C("Create new label: ",new S({color:E})),new C(W,new S({color:E,bold:!0}))])})})}return new u0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C(D.name,new S({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 j31 extends _0{props;constructor(A){super();this.props=A}createState(){return new H1A}}class tD extends _0{props;constructor(A){super();this.props=A}createState(){return new q1A}}class q1A extends P0{_spinner=new q6;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=j0.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 S({color:$.processing})),new C(" ",void 0),new C(this.widget.props.message,new S({color:B.foreground}))])}),X=[new T1({child:new y0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)X.push(new U0({height:2,child:new u0({padding:K0.symmetric(2,0),child:new p({text:new C("",new S({dim:!0}),[new C("Press ",new S({color:B.foreground})),new C("Esc",new S({color:B.info})),new C(" to cancel",new S({color:B.foreground}))])})})}));let D=new u0({decoration:new b4(B.background,J),child:new U0({width:60,height:7,child:new y0({mainAxisAlignment:"start",children:X})})});if(this.widget.props.onAbort)return new c4({debugLabel:"LoadingDialog",child:new g4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:D})});return D}}class oU extends _0{props;constructor(A){super();this.props=A}createState(){return new N1A}}class N1A extends P0{scrollController=new yA;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 h2}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=j0.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=bD0(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 u0({padding:K0.symmetric(1,0),child:new p({text:new C($.title,new S({color:J,bold:!0}))})}),F=this.isWidgetMessage(B)?B.widget:new p({text:new C($.description,new S({color:Q.colors.foreground})),selectable:!0}),X=new T1({child:new G3({child:new u0({padding:K0.symmetric(1,0),child:new s0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new T1({child:new xA({controller:this.scrollController,autofocus:!0,child:F})}),new E2({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 u0({padding:K0.symmetric(1,0),child:new p({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new S({color:Q.colors.foreground,dim:!0})),new C("R",new S({color:Q.app.keybind})),new C(" to retry, ",new S({color:Q.colors.foreground,dim:!0})),new C("Esc",new S({color:Q.app.keybind})),new C(" to cancel",new S({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new C("",new S({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new S({color:Q.app.keybind}),U=new S({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 S({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new c4({debugLabel:"MessageDialog",child:new BA({fit:"expand",children:[new _1({onClick:()=>{},child:new U0}),new g4({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 u0({decoration:{border:Y,color:Q.colors.background},padding:K0.all(1),child:new y0({mainAxisAlignment:"center",children:[Z,new U0({height:1}),X,D]})})})]})})}}F3();l1();class I1A extends _0{props;constructor(A){super();this.props=A}createState(){return new w1A}}class w1A extends P0{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=m0.file(this.widget.props.cwd),B=Q1.relativePath(Q,G6(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return d5(A)}statusIcon(A){let Q=l8.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=j0.of(A),{app:B}=Q;if(this.plugins.length===0)return new p({text:new C("No plugins found.",new S({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 S({bold:!0}))),Z>0||F>0)$.push(new C(` (${Z} ${D4(Z,"command")}, ${F} ${D4(F,"tool")})`,new S({dim:!0})));$.push(new C(`
7679
7679
 
7680
7680
  `));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 S({color:G}))),$.push(new C(V,new S({bold:!0}))),$.push(new C(` ${X.status}`,new S({dim:!0}))),$.push(new C(`
7681
7681
  `)),X.status==="active"&&X.registeredEvents.length>0)$.push(new C(" Events: ",new S({dim:!0}))),$.push(new C(X.registeredEvents.join(", "),new S({color:B.link}))),$.push(new C(`
@@ -7853,7 +7853,7 @@ ${t.content||""}`:t.content||"",g0=[],c0=t.baseDir.startsWith("file://")?UK0(t.b
7853
7853
  `)}function $6A(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(t0.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(t0.red("Error: ")+X.error.message+`
7854
7854
  `),process.exit(1)}process.stdout.write(await Ps5(X.result.displayText)+`
7855
7855
  `),process.exit(0)})}var r13=vt.join(g$,"logs","headless.log"),_91=vt.join(Ip,"device-id.json"),s13=`cli-tui-${k8A(16).toString("hex")}`;async function t13(){let A=await Promise.all(hM.map(async(Q)=>{try{return{query:Q,hasConfigs:(await Q.listConfigs()).length>0}}catch(B){return j.debug("Failed to detect query-based IDE integration",{ideName:Q.ideName,error:B}),{query:Q,hasConfigs:!1}}}));for(let Q of A)if(Q.hasConfigs)return Q.query;return}function v8A(){t13().then((A)=>{if(A){let Q=a30(A.ideName);if(Q)kM(Q)}})}try{if(process.platform==="win32")await Promise.resolve().then(() => T4(_b(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){EB.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
7856
- `)}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 c2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")UY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")UY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)UY("internal.model",B43(Q.model))}function L8A(A){let Q=A.indexOf(":");if(Q===-1)throw new i1(`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 i1(`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(w04(Q))return Q;throw new i1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function Q43(A,Q){if(C8(A,Q))return;let B=i$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new i1(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function B43(A){if(!A.includes("="))return L8A(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new i1(`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 i1(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new i1(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);L8A(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new i1("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 S8A(A,"utf-8")}catch{return A}}async function T91(A,Q,B){let $=$43(A,Q);if(!$)return;let J=sA(B)?B.features:[],Y=sA(B)?B.user.email:void 0;if(!ft(J,_B.HARNESS_SYSTEM_PROMPT)&&!(Y&&h7(Y)))throw new i1("You are not allowed to do this.",1);UY("systemPrompt",await J43($))}function ft(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function Y43(A){return A!=="pending"}function qW(A){if(!sA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function Z43(A){let Q=qW(A);if(Q)return Q.id;if(fX(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 i1(`Couldn't connect to the Amp server at ${A}.`,1,$)}function yt(A,Q){let B=Xr0(Error(A.error.message));if(B.message===q7.networkOffline||B.message===q7.networkTimeout)return X43(Q);if(B.message!==q7.internalBug)return new i1(B.message,1,B.suggestion);return new i1(A.error.message.replace(/^Error: /,""),1)}async function D43(){if(process.versions.bun)return!1;try{return await RU()==="npm"}catch(A){return j.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var O8A=[{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??uX,description:`Custom settings file path (overrides the default location ${uX})`},{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 ${ja})`},{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:E9(),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:fM.SMART.key,description:`Set the agent mode (${l$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(l$().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}],j8A=(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 QE0(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 i1(q7.unknownCommand(B),1,Z)}}async function JE0(A){return{...A,getThreadEnvironment:Lz,getEnvironmentData:(Q,B)=>pE(Q,B),skillService:A.skillService,fileChangeTrackerStorage:new ML,generateThreadTitle:iF4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>dZ(A.configService),pluginService:A.pluginService}}function y8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:Lz,getEnvironmentData:(Q,B)=>pE(Q,B)}}var BE0=m0.file(o13.homedir()),k91=process.env.XDG_CONFIG_HOME?m0.file(process.env.XDG_CONFIG_HOME):Q1.joinPath(BE0,".config");function E43(A){return KP4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(BX0())$X0();else WZ0(Q);let B=xj(),$=Qr();if((!B||$||Ox())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(xD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(xD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(xj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function a8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;U04("0.0.1778989718-g339de8");let Y=g30({storage:A.settings,secretStorage:A.secrets,workspaceRoot:b0.of(m0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:BE0,userConfigDir:k91}),Z=A.secrets.get("apiKey",A.ampURL),F=dZ(Y),X=null,D=()=>{return},G=new Promise((Q0)=>{D=Q0}),V=Z.then(async(Q0)=>{if(!Q0&&!$)await G;return X??=F.subscribe(()=>{}),S1(F.pipe(c5(Y43)))});V.catch(()=>{return}),Et4(Y);let U=await Y.getLatest();j.debug("Global configuration initialized",{settingsKeys:Object.keys(U.settings)});let K=!1;{let Q0=await Z;if(K=Boolean(Q0),j.info("API key lookup before login",{found:Boolean(Q0),ampURL:A.ampURL,deferAuth:$}),!Q0)if($)j.info("No API key found, continuing startup with deferred auth");else{t6.write(`No API key found. Starting login flow...
7856
+ `)}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 c2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")UY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")UY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)UY("internal.model",B43(Q.model))}function L8A(A){let Q=A.indexOf(":");if(Q===-1)throw new i1(`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 i1(`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(w04(Q))return Q;throw new i1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function Q43(A,Q){if(C8(A,Q))return;let B=i$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new i1(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function B43(A){if(!A.includes("="))return L8A(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new i1(`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 i1(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new i1(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);L8A(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new i1("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 S8A(A,"utf-8")}catch{return A}}async function T91(A,Q,B){let $=$43(A,Q);if(!$)return;let J=sA(B)?B.features:[],Y=sA(B)?B.user.email:void 0;if(!ft(J,_B.HARNESS_SYSTEM_PROMPT)&&!(Y&&h7(Y)))throw new i1("You are not allowed to do this.",1);UY("systemPrompt",await J43($))}function ft(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function Y43(A){return A!=="pending"}function qW(A){if(!sA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function Z43(A){let Q=qW(A);if(Q)return Q.id;if(fX(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 i1(`Couldn't connect to the Amp server at ${A}.`,1,$)}function yt(A,Q){let B=Xr0(Error(A.error.message));if(B.message===q7.networkOffline||B.message===q7.networkTimeout)return X43(Q);if(B.message!==q7.internalBug)return new i1(B.message,1,B.suggestion);return new i1(A.error.message.replace(/^Error: /,""),1)}async function D43(){if(process.versions.bun)return!1;try{return await RU()==="npm"}catch(A){return j.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var O8A=[{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??uX,description:`Custom settings file path (overrides the default location ${uX})`},{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 ${ja})`},{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:E9(),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:fM.SMART.key,description:`Set the agent mode (${l$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(l$().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}],j8A=(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 QE0(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 i1(q7.unknownCommand(B),1,Z)}}async function JE0(A){return{...A,getThreadEnvironment:Lz,getEnvironmentData:(Q,B)=>pE(Q,B),skillService:A.skillService,fileChangeTrackerStorage:new ML,generateThreadTitle:iF4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>dZ(A.configService),pluginService:A.pluginService}}function y8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:Lz,getEnvironmentData:(Q,B)=>pE(Q,B)}}var BE0=m0.file(o13.homedir()),k91=process.env.XDG_CONFIG_HOME?m0.file(process.env.XDG_CONFIG_HOME):Q1.joinPath(BE0,".config");function E43(A){return KP4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(BX0())$X0();else WZ0(Q);let B=xj(),$=Qr();if((!B||$||Ox())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(xD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(xD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(xj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function a8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;U04("0.0.1778994836-g963bd3");let Y=g30({storage:A.settings,secretStorage:A.secrets,workspaceRoot:b0.of(m0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:BE0,userConfigDir:k91}),Z=A.secrets.get("apiKey",A.ampURL),F=dZ(Y),X=null,D=()=>{return},G=new Promise((Q0)=>{D=Q0}),V=Z.then(async(Q0)=>{if(!Q0&&!$)await G;return X??=F.subscribe(()=>{}),S1(F.pipe(c5(Y43)))});V.catch(()=>{return}),Et4(Y);let U=await Y.getLatest();j.debug("Global configuration initialized",{settingsKeys:Object.keys(U.settings)});let K=!1;{let Q0=await Z;if(K=Boolean(Q0),j.info("API key lookup before login",{found:Boolean(Q0),ampURL:A.ampURL,deferAuth:$}),!Q0)if($)j.info("No API key found, continuing startup with deferred auth");else{t6.write(`No API key found. Starting login flow...
7857
7857
  `);let M0=await z43(A),n=await A.secrets.get("apiKey",A.ampURL);if(j.info("Login flow completed",{success:M0,storedKeyPresent:Boolean(n),ampURL:A.ampURL}),!M0)await Mz(),process.exit(1);K=!0,D()}}{let Q0=await Y.getLatest(),M0=Q0.settings.url,n=Q0.secrets.isSet?.[M0];j.info("Config secrets state after login",{configURL:M0,apiKeySet:n?.apiKey??!1})}let E=$?"pending":await V;if(!$)j.info("Server status resolved",{status:"ready",isAuthenticated:sA(E),isError:fX(E),errorMessage:fX(E)?E.error.message:void 0});let z=V.then((Q0)=>Z43(Q0));z.catch(()=>{return});let W=!Q.takeMeBack&&sA(E)&&ft(E.features,_B.THREAD_ACTORS_TUI),H=!1;if(process.env.AMP_DISABLE_PLUGINS==="1")j.warn("Ignoring AMP_DISABLE_PLUGINS outside development");let q=H?"off":W?"all":process.env.PLUGINS??"permissions",{toolService:N,dispose:I}=XP4({configService:Y}),w=new Map,O=()=>w.clear(),L=new ef0(Y,A.settings.getWorkspaceRootPath()),R=wY4({configService:Y}),v=YQ4({configService:Y,trustStore:L,skillMCPServers:R.skillMCPServers,uploadImageAttachments:W,createOAuthProvider:async(Q0,M0,n)=>{let a=`${Q0}:${M0}`,t=w.get(a);if(t)return j.debug("Reusing existing OAuth provider for server",{serverName:Q0,serverUrl:M0}),t;j.debug("Creating OAuth provider for server",{serverName:Q0,serverUrl:M0});let e=(async()=>{let Z0=new lM(A.secrets),Y0=await Z0.getClientInfo(Q0,M0),I0=n?.scopes??Y0?.scopes,C0=_f4();j.info("OAuth headless mode check",{useHeadless:C0,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:t6.isTTY});let T0;if(C0)T0=A.executeMode?Pf4():Rf4(Q0);let G0=new Dv0({storage:Z0,serverName:Q0,serverUrl:M0,clientId:n?.clientId??Y0?.clientId,clientSecret:n?.clientSecret??Y0?.clientSecret,authUrl:n?.authUrl??Y0?.authUrl,tokenUrl:n?.tokenUrl??Y0?.tokenUrl,scopes:I0,headlessAuthHandler:T0});return j.debug("OAuth provider created",{serverName:Q0,serverUrl:M0,hasManualClientId:!!(n?.clientId??Y0?.clientId),willUseDCR:!(n?.clientId??Y0?.clientId),scopes:I0,headlessMode:C0,executeMode:A.executeMode}),G0})();return w.set(a,e),e}}),k=Ba0({configService:Y,spawn:fY0}),x=Q.headless?gs4():void 0,h=x??new CV0({configService:Y}),u=h instanceof CV0?h:void 0;if(u)u.pluginExecutorKind="local";let T=new a1(null),f=null,c=W&&!H?[...ds4(U.settings)?[{name:"permissions",entryPoint:W51}]:[],{name:"thread-visibility",entryPoint:is4(Y,()=>V.then(qW),()=>f,(Q0)=>{f=Q0}),alwaysLoad:!0}]:[],d=Eb0({configService:Y,platform:h,loadGlobalPlugins:yt0(Y),pluginFilter:q,activeThread$:T,internalPlugins:c}),g=tQ4(d),i=[v,k,g],r;if(J)r=new Map;else if(A.executeMode){let Q0=await lO4({toolService:N,providers:i,initialTimeout:15000});r=Q0.registrations;for(let[M0,n]of Q0.initErrors)j.warn(`${M0} provider initialization slow or failed:`,n)}else r=$a0({toolService:N,providers:i});if(Q.jetbrains)kM("JetBrains");else if(Q.ide&&Ab4())kM("VS Code");else if(Q.ide&&Qb4())kM("Neovim");else if(Q.ide&&(!W||A.executeMode||Q.takeMeBack))v8A();if(A.executeMode)K04(!0);let B0,w0=i3.status.pipe(I1((Q0)=>Boolean(Q0.connected&&Q0.authenticated&&Q0.ideName&&H14(Q0.ideName))),k4()).subscribe((Q0)=>{if(Q0){if(!B0)B0=N.registerTool(cO4)}else B0?.dispose(),B0=void 0}),X0;if(!A.executeMode){let Q0=await A.settings.get("fuzzy.alwaysIncludePaths")??[];X0=new eF0(process.cwd(),{alwaysIncludePaths:Q0},!0)}else X0=new class extends eF0{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let H0=new Hg0(kl(Y,{usesThreadActors:!1}),{maxThreads:200});j.info("Starting Amp background services");let A0=new C51,R0={configService:Y,toolService:N,mcpService:v,skillService:R,toolboxService:k,trustStore:L,threadService:H0,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:X0,terminal:A0,pluginService:d,pluginPlatform:u,headlessPluginPlatform:x,activeThread$:T,serverStatus:E,serverStatusPromise:V,viewerUserIDPromise:z,hasAPIKeyAtStartup:K,consumeDraftNewThreadVisibility:()=>{let Q0=f;return f=null,Q0}};return{...R0,async asyncDispose(){if(R0.mcpService.hasAuthenticatingClients())j.info("Waiting for OAuth authentication to complete before exit..."),await R0.mcpService.waitForAuthentication();for(let Q0 of r.values())Q0.dispose();await R0.mcpService.dispose(),O(),await R0.threadService.asyncDispose(),R0.configService.unsubscribe(),X?.unsubscribe(),I(),R0.fuzzyServer.dispose(),R0.settingsStorage[Symbol.dispose](),w0.unsubscribe(),B0?.dispose(),await R0.pluginService.dispose()}}}async function z43(A){if(!A.executeMode){if(!await dX0("Would you like to log in to Amp? [(y)es, (n)o]: "))return t6.write(`Login cancelled. Run the command again to retry.
7858
7858
  `),!1}return await x8A(A)}async function x8A(A){let Q=k8A(32).toString("hex"),B=await yx(A.ampURL,Q),$=new AbortController;try{await vX(B,$.signal)}catch(Y){j.error("Error opening browser",{error:Y})}let J=await yx(A.ampURL,Q,!1);t6.write(`If your browser does not open automatically, visit:
7859
7859
 
@@ -7861,7 +7861,7 @@ ${t0.blue.bold(J)}
7861
7861
 
7862
7862
  `);try{return await Eh4(A.ampURL,Q,A.secrets,$),t6.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(Y){return j.error("Login failed",{error:Y}),EB.write(`
7863
7863
  Login failed: ${Y instanceof Error?Y.message:String(Y)}
7864
- `),!1}}async function W43(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new i1("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 pN().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)Bj(),process.exit(0);let H=W.originalError??W;Pk4(H)}),$m4(Q,{version:"0.0.1778989718-g339de8",buildTimestamp:"2026-05-17T03:53:42.010Z",buildType:"release"}),Q.addHelpText("after",sf4()),Q.configureHelp({formatHelp:tf4}),Q.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await o5(q);await R43(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 o5(q);await j43(N,await q51(q,N.settings))}),Ok4(Q,o5);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 o5(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 o5(N);await Nf4(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 o5(q);await If4(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 Ku4({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(`
7864
+ `),!1}}async function W43(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new i1("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 pN().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)Bj(),process.exit(0);let H=W.originalError??W;Pk4(H)}),$m4(Q,{version:"0.0.1778994836-g963bd3",buildTimestamp:"2026-05-17T05:18:35.020Z",buildType:"release"}),Q.addHelpText("after",sf4()),Q.configureHelp({formatHelp:tf4}),Q.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await o5(q);await R43(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 o5(q);await j43(N,await q51(q,N.settings))}),Ok4(Q,o5);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 o5(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 o5(N);await Nf4(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 o5(q);await If4(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 Ku4({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(`
7865
7865
  `)).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 i1("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)t6.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.
7866
7866
 
7867
7867
  `),q.outputHelp(),process.exit(0);let I=j2(N)??tB(N),w=q.optsWithGlobals(),O=await o5(w);c2(q,w);let L=await a8(O,w),R=!1;try{if(H.checkout&&H.skipCheckout)throw new i1("Choose either --checkout or --skip-checkout, not both.",1);if(fX(L.serverStatus))throw yt(L.serverStatus,O.ampURL);let v=sA(L.serverStatus)?L.serverStatus.features:void 0;if(!ft(v,_B.V2))throw new i1("live-sync is not enabled for your user",1);await $h4({ampURL:O.ampURL,threadId:I,configService:L.configService,threadService:L.threadService,apiKey:process.env.AMP_API_KEY,applyOnce:typeof H.apply==="string",checkoutMode:H.checkout?"always":H.skipCheckout?"never":"prompt",promptForYesNo:dX0}),R=!0}finally{if(await L.asyncDispose(),R)process.exit(0)}});let J=async(W,H,q)=>{g30({storage:H.settings,secretStorage:H.secrets,workspaceRoot:b0.of(m0.file(process.cwd())),defaultAmpURL:H.ampURL,homeDir:BE0,userConfigDir:k91});let N={...H,executeMode:!1};await $E0(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 o5(q);await T8A(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 o5(q);await g43(q,N,H)}),Y.command("continue [threadIDOrURLs...]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, interactive mode shows a picker. Use --last to continue the last thread for the current mode directly. When multiple thread are given, all are resumed and the first is shown in the foreground.").option("--last","Continue the last thread for the current mode directly").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(W,H,q)=>{let N=q.optsWithGlobals(),I=await o5(N),w=Array.isArray(W)?W:[];if(H.pick)EB.write(`${t0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
@@ -7894,8 +7894,8 @@ ${O}
7894
7894
  `))}),H.args.length>0)K43(N,H);await $E0(N,q,H,A)}),_b4(Q),Q}async function xt(A,Q){await AB((B)=>bx(B,A,Q))}async function R8A(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 i1(`Cannot resume thread created by another user.
7895
7895
 
7896
7896
  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 f8A(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await RV0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await RV0()).trimEnd(),stdinInput:null}}function b8A(A,Q,B){if(A.streamJson&&!Q)throw new i1("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(A.streamJsonInput&&!Q)throw new i1("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(A.streamJsonInput&&!A.streamJson)throw new i1("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(A.stats&&A.streamJson)throw new i1("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 i1("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(A.archive&&!Q)throw new i1("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 i1("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 i1("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"
7897
- Or pipe via stdin: echo "your message" | amp --execute`)}function q43(){Y64([b30.parse({tool:"*",action:"allow"})]),bA4({bypass:!0})}function N43(A){if(A.threadId&&!C9(A.threadId))delete A.threadId}async function $E0(A,Q,B,$){if(Q.headless)return I43(A,Q,B);let J=await a8(A,Q),Y=await J.serverStatusPromise,Z=sA(Y)&&ft(Y.features,_B.THREAD_ACTORS_TUI),F=Z&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await J.asyncDispose(),new i1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!Z)throw await J.asyncDispose(),new i1("--show-welcome is only available with the new Amp CLI feature flag",1);if(F){let X=!A.executeMode&&await D43();return q43(),N43(Q),w43(A,Q,B,J,{showNpmMigrationWelcome:X})}else{if(Q.threadId&&C9(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 i1(`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 C43(A,Q,B,$,{dependencies:J})}}async function I43(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=to0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};c2(B,Q);let J=process.hrtime.bigint(),Y=await a8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(fX(Z))throw yt(Z,A.ampURL);let F=sA(Z)?Z:null,X=F?.user.email;await T91(B,Q,Z);let D=qW(Z),G=hf(Q,D);if(G instanceof Error)O5(G.message);if(F&&!xM(Q.mode,X))throw new i1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!X||!h7(X)))throw new i1("Headless executor mode is only available for Amp employees",1);sZ0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new i1("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&&!C9(K))throw new i1(`Invalid thread ID: ${K}`,1);let E=K?void 0:await u43({dependencies:Y,apiKey:U,visibility:G??void 0}),z=K??E?.threadId;if(!z)throw new i1("Failed to resolve headless thread ID",1);let W=await vf4(z);if(W.status==="already-running")await Y.asyncDispose(),await Mz(),process.exit(0);try{await Lf4({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,pluginService:Y.pluginService,pluginPlatform:Y.headlessPluginPlatform})}finally{await W.release(),await Y.asyncDispose()}await Mz(),process.exit(0)}async function w43(A,Q,B,$,J){let{userInput:Y,stdinInput:Z}=await f8A(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;b8A({...Q,streamJson:F},A.executeMode,Y),c2(B,Q),Kk4(),sZ0();let X=Q.threadId,D=Q.resumeThreadIDs??(X?[X]:[]),G=Q.observe?j2(Q.observe)??tB(Q.observe):void 0,V=await $.serverStatusPromise;if(fX(V))throw yt(V,A.ampURL);let U=qW(V),K=hf(Q,U);if(K instanceof Error)O5(K.message);let E=null,z=async()=>{let q=$.consumeDraftNewThreadVisibility();if(q!==null)return q;return E??=(async()=>{let N=await Ra(A.settings,process.cwd(),U,K);if(N instanceof Error)O5(N.message);return N})(),E},W=await $.secretStorage.get("apiKey",A.ampURL);if(!W)throw new i1("API key required. Please run `amp login` first.",1);let H=sA(V)&&h7(V.user.email);if(A.executeMode){if(D.length>1)throw new i1("Execute mode can only resume one thread.",1);me0($.mcpService,A.settings);try{let q=QE0(B,Q),N=await gz(),I=X?q:lX0({agentMode:Q.mode,explicitEffort:q,sessionState:N}),w=X?void 0:iX0(await xx($.configService),{agentMode:Q.mode,explicitEffort:q,sessionState:N}),O=X?void 0:await z(),L=await sx4({apiKey:W,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:I,labels:Q.label,initialThreadID:X,initialThreadMeta:O,initialSettings:w});if(await xt(L,"execute"),Q.archive)await $.threadService.archive(L,!0)}finally{await $.asyncDispose()}await Mz(),process.exit(0)}else{let q=QE0(B,Q),N=J.showNpmMigrationWelcome?"npm-migration":"intro",I=KX0("0.0.1778989718-g339de8",$.settingsStorage,{startDelayMs:3000}),w=new cX0($.mcpService,A.settings.getWorkspaceRootPath()),O=kl($.configService),L=new rs($.fuzzyServer),R=process.cwd();await Ss4({ampURL:A.ampURL,apiKey:W,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??gF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:v})=>zx({workspaceRoot:R},v),completionBuilder:L,updateService:I,workspaceRoot:R,listThreads:()=>O.listThreads(),getThreadFromServer:(v)=>O.getThread(v),toolboxes:$.toolboxService.toolboxes,isInternalUser:H,settingsFilePath:$.settingsStorage.getSettingsFilePath(),workspaceSettingsFilePath:$.settingsStorage.getWorkspaceSettingsPath(),mcpTrustHandler:w,setActiveThreadID:(v)=>$.activeThread$.next(v),dispose:()=>{return w.dispose(),I.dispose(),$.asyncDispose()}},{initialThreadIDs:G?[G]:D,initialUserInput:Y||void 0,getDefaultNewThreadVisibility:z,onFirstFrame:Q.ide?v8A:void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!G,splashOrbVisualStyle:"neo",hideNeoWelcome:!!Q.hideWelcome,showNeoWelcome:Q.showWelcome,neoWelcomeVariant:N,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:q}),process.exit(0)}}async function C43(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(A0,R0)=>{let Q0=Number(process.hrtime.bigint()-R0)/1e6,M0=to0();j.info("Startup phase",{phase:A0,phaseMs:Math.round(Q0),sinceMainMs:M0===null?void 0:Math.round(M0)})},{userInput:F,stdinInput:X}=await f8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;b8A({...Q,streamJson:D},A.executeMode,F),c2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await a8(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&&fX(E))throw yt(E,A.ampURL);let z=sA(E)?E:null,W=z?.user.email,H=!!(W&&h7(W));if(H)sZ0();if(!K)await T91(B,Q,E);let q=qW(E),N=q?.features??[],I=q?.team??null,w=hf(Q,q);if(w instanceof Error)O5(w.message);if(z&&!xM(Q.mode,W))throw new i1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let O=Q.threadId&&C9(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let L=await JE0(V);Z("runMainThread:createWorkerDeps",G);let R=A.executeMode?void 0:async(A0)=>xt(A0,"interactive"),v={threadService:V.threadService,workerDeps:L,createThread:async(A0)=>{let R0=K?await V.serverStatusPromise:E,Q0=await Ra(A.settings,process.cwd(),qW(R0),w);if(Q0 instanceof Error)O5(Q0.message);return B21(L,{threadMeta:Q0,agentMode:A0??Q.mode,onFirstAssistantMessage:R})},validateThreadOwnership:async(A0,R0)=>{if(R0?.nonBlockingOwnershipCheck){R8A(A0,V.configService,V.viewerUserIDPromise).catch((Q0)=>{if(Q0 instanceof i1){if(R0.onOwnershipError){R0.onOwnershipError(Q0,A0);return}Oz(Q0,A0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})});return}try{await R8A(A0,V.configService,V.viewerUserIDPromise)}catch(Q0){if(Q0 instanceof i1)throw Q0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:R,handleError:Oz},k=async()=>{try{return eAA(v,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(A0){if(A0 instanceof i1)throw A0;throw await Oz(A0,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 A0=await V.configService.getLatest(),R0=xm(A0),Q0=await r4.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(R0)});if(Q0.ok)return j.info("User free tier status:",Q0),Q0.result;return}catch(A0){j.error("Failed to fetch free tier status:",A0);return}})(),u=!A.executeMode?new R51:null,T,f=null;if(u)T=u,f=(async()=>{let A0=K?await V.serverStatusPromise:V.serverStatus;if(fX(A0))throw yt(A0,A.ampURL);await T91(B,Q,A0);let R0=process.hrtime.bigint(),Q0=await k();if(Z("runMainThread:createThreadPool",R0),u.attach(Q0),F){let M0=await S1(Q0.threadHandles$);if(!M0)throw new i1("No active thread is available yet.",1);await M0.sendMessage({content:[{type:"text",text:F}]})}})(),f.catch(async(A0)=>{let R0=A0 instanceof Error?A0:Error(String(A0));u.setInitError(R0),await Oz(A0,Q.threadId)});else G=process.hrtime.bigint(),T=await k(),Z("runMainThread:createThreadPool",G);let c=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let d=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),E43({configService:V.configService,threadService:V.threadService,config:d,useNotificationsForService:c,threadViewStates$:()=>T.threadHandles$.pipe(y4((A0)=>{if(!A0)return b0.of({});return M6(A0.thread$,A0.threadViewState$).pipe(I1(([R0,Q0])=>({[R0.id]:Q0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){me0(V.mcpService,A.settings);let A0=QE0(B,Q),R0=await gz(),Q0=O?A0:lX0({agentMode:Q.mode,explicitEffort:A0,sessionState:R0}),M0={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 ok4({threadPool:T,...M0});if(await xt(n,"execute"),Q.archive)await V.threadService.archive(n,!0);await V.asyncDispose(),process.exit(0)}let g=!1,i=!1;if(Q.jetbrains||Q.ide){await r30();let A0=await gX({jetbrainsOnly:Q.jetbrains});if(A0.length===0){if(Q.jetbrains)g=!await V.configService.get("jetbrains.skipInstall")}else if(A0.length===1){let R0=A0[0];if(R0)i3.selectConfig(R0)}else i=!0}G=process.hrtime.bigint();let r=KX0("0.0.1778989718-g339de8",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let B0=new cX0(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let A0=await S1(T.threadHandles$);if(!A0)throw new i1("No active thread is available yet.",1);await A0.sendMessage({content:[{type:"text",text:F}]})}G=process.hrtime.bigint();let w0=await gz();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",w0);let X0=QE0(B,Q),H0={...w0,launchCount:w0.launchCount+1,lastReasoningEffortByMode:X0?{...w0.lastReasoningEffortByMode,[Q.mode]:X0}:w0.lastReasoningEffortByMode};AB((A0)=>({...A0,launchCount:A0.launchCount+1}));try{if(G=process.hrtime.bigint(),await Ve4({history:new Vo,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:r4,threadPool:T,createSystemPromptDeps:async()=>y8A(V),ideClient:i3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:B0,updateService:r,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:O,showJetBrainsInstaller:g,showIdePickerHint:i,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:s13,logFile:{path:$},sessionState:H0,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-17T03:53:42.010Z"},(A0)=>new y51({...A0,threadPool:A0.threadPool},(R0)=>new A21({...R0,threadState:R0.threadState}))),Z("runMainThread:mountApp-returned",G),f)await f}finally{await T.dispose().catch((A0)=>{j.error("Failed to dispose thread pool during shutdown",A0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function o5(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)EB.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7898
- `);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 GQ4({get:async(F)=>{if(F!==md)return;try{let X=await S8A(_91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==md)return;await n13(vt.dirname(_91),{recursive:!0}),await a13(_91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:q90()});E04($);let J=await Gt4({...A,workspaceTrust:{current:!0,changes:fm},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 Lh4(A.mcpConfig);J=Oh4(J,F)}let Y=vt.dirname(J.getSettingsFilePath());UP4(Ip,Y),J=ps1(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=d7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!cH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:Jt4(await q51(A,J))}}function M43(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 L43(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=vt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?r13:ja));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function O43(){Fk4();let A=M43(process.argv),Q=L43(process.argv,A),B=Ek4(Q);dZ0("silent");let $=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)t0.level=0;if(e13(j),j.info("Starting Amp CLI.",{version:"0.0.1778989718-g339de8",buildTimestamp:"2026-05-17T03:53:42.010Z"}),process.platform==="win32"&&Lj())Mb4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new i1(q7.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await H43(B).parseAsync(process.argv)}GP4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await O43().catch(Oz)});async function j43(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"),t6.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7897
+ Or pipe via stdin: echo "your message" | amp --execute`)}function q43(){Y64([b30.parse({tool:"*",action:"allow"})]),bA4({bypass:!0})}function N43(A){if(A.threadId&&!C9(A.threadId))delete A.threadId}async function $E0(A,Q,B,$){if(Q.headless)return I43(A,Q,B);let J=await a8(A,Q),Y=await J.serverStatusPromise,Z=sA(Y)&&ft(Y.features,_B.THREAD_ACTORS_TUI),F=Z&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await J.asyncDispose(),new i1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!Z)throw await J.asyncDispose(),new i1("--show-welcome is only available with the new Amp CLI feature flag",1);if(F){let X=!A.executeMode&&await D43();return q43(),N43(Q),w43(A,Q,B,J,{showNpmMigrationWelcome:X})}else{if(Q.threadId&&C9(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 i1(`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 C43(A,Q,B,$,{dependencies:J})}}async function I43(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=to0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};c2(B,Q);let J=process.hrtime.bigint(),Y=await a8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(fX(Z))throw yt(Z,A.ampURL);let F=sA(Z)?Z:null,X=F?.user.email;await T91(B,Q,Z);let D=qW(Z),G=hf(Q,D);if(G instanceof Error)O5(G.message);if(F&&!xM(Q.mode,X))throw new i1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!X||!h7(X)))throw new i1("Headless executor mode is only available for Amp employees",1);sZ0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new i1("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&&!C9(K))throw new i1(`Invalid thread ID: ${K}`,1);let E=K?void 0:await u43({dependencies:Y,apiKey:U,visibility:G??void 0}),z=K??E?.threadId;if(!z)throw new i1("Failed to resolve headless thread ID",1);let W=await vf4(z);if(W.status==="already-running")await Y.asyncDispose(),await Mz(),process.exit(0);try{await Lf4({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,pluginService:Y.pluginService,pluginPlatform:Y.headlessPluginPlatform})}finally{await W.release(),await Y.asyncDispose()}await Mz(),process.exit(0)}async function w43(A,Q,B,$,J){let{userInput:Y,stdinInput:Z}=await f8A(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;b8A({...Q,streamJson:F},A.executeMode,Y),c2(B,Q),Kk4(),sZ0();let X=Q.threadId,D=Q.resumeThreadIDs??(X?[X]:[]),G=Q.observe?j2(Q.observe)??tB(Q.observe):void 0,V=await $.serverStatusPromise;if(fX(V))throw yt(V,A.ampURL);let U=qW(V),K=hf(Q,U);if(K instanceof Error)O5(K.message);let E=null,z=async()=>{let q=$.consumeDraftNewThreadVisibility();if(q!==null)return q;return E??=(async()=>{let N=await Ra(A.settings,process.cwd(),U,K);if(N instanceof Error)O5(N.message);return N})(),E},W=await $.secretStorage.get("apiKey",A.ampURL);if(!W)throw new i1("API key required. Please run `amp login` first.",1);let H=sA(V)&&h7(V.user.email);if(A.executeMode){if(D.length>1)throw new i1("Execute mode can only resume one thread.",1);me0($.mcpService,A.settings);try{let q=QE0(B,Q),N=await gz(),I=X?q:lX0({agentMode:Q.mode,explicitEffort:q,sessionState:N}),w=X?void 0:iX0(await xx($.configService),{agentMode:Q.mode,explicitEffort:q,sessionState:N}),O=X?void 0:await z(),L=await sx4({apiKey:W,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:I,labels:Q.label,initialThreadID:X,initialThreadMeta:O,initialSettings:w});if(await xt(L,"execute"),Q.archive)await $.threadService.archive(L,!0)}finally{await $.asyncDispose()}await Mz(),process.exit(0)}else{let q=QE0(B,Q),N=J.showNpmMigrationWelcome?"npm-migration":"intro",I=KX0("0.0.1778994836-g963bd3",$.settingsStorage,{startDelayMs:3000}),w=new cX0($.mcpService,A.settings.getWorkspaceRootPath()),O=kl($.configService),L=new rs($.fuzzyServer),R=process.cwd();await Ss4({ampURL:A.ampURL,apiKey:W,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??gF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:v})=>zx({workspaceRoot:R},v),completionBuilder:L,updateService:I,workspaceRoot:R,listThreads:()=>O.listThreads(),getThreadFromServer:(v)=>O.getThread(v),toolboxes:$.toolboxService.toolboxes,isInternalUser:H,settingsFilePath:$.settingsStorage.getSettingsFilePath(),workspaceSettingsFilePath:$.settingsStorage.getWorkspaceSettingsPath(),mcpTrustHandler:w,setActiveThreadID:(v)=>$.activeThread$.next(v),dispose:()=>{return w.dispose(),I.dispose(),$.asyncDispose()}},{initialThreadIDs:G?[G]:D,initialUserInput:Y||void 0,getDefaultNewThreadVisibility:z,onFirstFrame:Q.ide?v8A:void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!G,splashOrbVisualStyle:"neo",hideNeoWelcome:!!Q.hideWelcome,showNeoWelcome:Q.showWelcome,neoWelcomeVariant:N,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:q}),process.exit(0)}}async function C43(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(A0,R0)=>{let Q0=Number(process.hrtime.bigint()-R0)/1e6,M0=to0();j.info("Startup phase",{phase:A0,phaseMs:Math.round(Q0),sinceMainMs:M0===null?void 0:Math.round(M0)})},{userInput:F,stdinInput:X}=await f8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;b8A({...Q,streamJson:D},A.executeMode,F),c2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await a8(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&&fX(E))throw yt(E,A.ampURL);let z=sA(E)?E:null,W=z?.user.email,H=!!(W&&h7(W));if(H)sZ0();if(!K)await T91(B,Q,E);let q=qW(E),N=q?.features??[],I=q?.team??null,w=hf(Q,q);if(w instanceof Error)O5(w.message);if(z&&!xM(Q.mode,W))throw new i1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let O=Q.threadId&&C9(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let L=await JE0(V);Z("runMainThread:createWorkerDeps",G);let R=A.executeMode?void 0:async(A0)=>xt(A0,"interactive"),v={threadService:V.threadService,workerDeps:L,createThread:async(A0)=>{let R0=K?await V.serverStatusPromise:E,Q0=await Ra(A.settings,process.cwd(),qW(R0),w);if(Q0 instanceof Error)O5(Q0.message);return B21(L,{threadMeta:Q0,agentMode:A0??Q.mode,onFirstAssistantMessage:R})},validateThreadOwnership:async(A0,R0)=>{if(R0?.nonBlockingOwnershipCheck){R8A(A0,V.configService,V.viewerUserIDPromise).catch((Q0)=>{if(Q0 instanceof i1){if(R0.onOwnershipError){R0.onOwnershipError(Q0,A0);return}Oz(Q0,A0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})});return}try{await R8A(A0,V.configService,V.viewerUserIDPromise)}catch(Q0){if(Q0 instanceof i1)throw Q0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:R,handleError:Oz},k=async()=>{try{return eAA(v,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(A0){if(A0 instanceof i1)throw A0;throw await Oz(A0,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 A0=await V.configService.getLatest(),R0=xm(A0),Q0=await r4.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(R0)});if(Q0.ok)return j.info("User free tier status:",Q0),Q0.result;return}catch(A0){j.error("Failed to fetch free tier status:",A0);return}})(),u=!A.executeMode?new R51:null,T,f=null;if(u)T=u,f=(async()=>{let A0=K?await V.serverStatusPromise:V.serverStatus;if(fX(A0))throw yt(A0,A.ampURL);await T91(B,Q,A0);let R0=process.hrtime.bigint(),Q0=await k();if(Z("runMainThread:createThreadPool",R0),u.attach(Q0),F){let M0=await S1(Q0.threadHandles$);if(!M0)throw new i1("No active thread is available yet.",1);await M0.sendMessage({content:[{type:"text",text:F}]})}})(),f.catch(async(A0)=>{let R0=A0 instanceof Error?A0:Error(String(A0));u.setInitError(R0),await Oz(A0,Q.threadId)});else G=process.hrtime.bigint(),T=await k(),Z("runMainThread:createThreadPool",G);let c=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let d=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),E43({configService:V.configService,threadService:V.threadService,config:d,useNotificationsForService:c,threadViewStates$:()=>T.threadHandles$.pipe(y4((A0)=>{if(!A0)return b0.of({});return M6(A0.thread$,A0.threadViewState$).pipe(I1(([R0,Q0])=>({[R0.id]:Q0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){me0(V.mcpService,A.settings);let A0=QE0(B,Q),R0=await gz(),Q0=O?A0:lX0({agentMode:Q.mode,explicitEffort:A0,sessionState:R0}),M0={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 ok4({threadPool:T,...M0});if(await xt(n,"execute"),Q.archive)await V.threadService.archive(n,!0);await V.asyncDispose(),process.exit(0)}let g=!1,i=!1;if(Q.jetbrains||Q.ide){await r30();let A0=await gX({jetbrainsOnly:Q.jetbrains});if(A0.length===0){if(Q.jetbrains)g=!await V.configService.get("jetbrains.skipInstall")}else if(A0.length===1){let R0=A0[0];if(R0)i3.selectConfig(R0)}else i=!0}G=process.hrtime.bigint();let r=KX0("0.0.1778994836-g963bd3",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let B0=new cX0(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let A0=await S1(T.threadHandles$);if(!A0)throw new i1("No active thread is available yet.",1);await A0.sendMessage({content:[{type:"text",text:F}]})}G=process.hrtime.bigint();let w0=await gz();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",w0);let X0=QE0(B,Q),H0={...w0,launchCount:w0.launchCount+1,lastReasoningEffortByMode:X0?{...w0.lastReasoningEffortByMode,[Q.mode]:X0}:w0.lastReasoningEffortByMode};AB((A0)=>({...A0,launchCount:A0.launchCount+1}));try{if(G=process.hrtime.bigint(),await Ve4({history:new Vo,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:r4,threadPool:T,createSystemPromptDeps:async()=>y8A(V),ideClient:i3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:B0,updateService:r,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:O,showJetBrainsInstaller:g,showIdePickerHint:i,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:s13,logFile:{path:$},sessionState:H0,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-17T05:18:35.020Z"},(A0)=>new y51({...A0,threadPool:A0.threadPool},(R0)=>new A21({...R0,threadState:R0.threadState}))),Z("runMainThread:mountApp-returned",G),f)await f}finally{await T.dispose().catch((A0)=>{j.error("Failed to dispose thread pool during shutdown",A0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function o5(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)EB.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7898
+ `);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 GQ4({get:async(F)=>{if(F!==md)return;try{let X=await S8A(_91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==md)return;await n13(vt.dirname(_91),{recursive:!0}),await a13(_91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:q90()});E04($);let J=await Gt4({...A,workspaceTrust:{current:!0,changes:fm},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 Lh4(A.mcpConfig);J=Oh4(J,F)}let Y=vt.dirname(J.getSettingsFilePath());UP4(Ip,Y),J=ps1(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=d7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!cH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:Jt4(await q51(A,J))}}function M43(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 L43(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=vt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?r13:ja));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function O43(){Fk4();let A=M43(process.argv),Q=L43(process.argv,A),B=Ek4(Q);dZ0("silent");let $=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)t0.level=0;if(e13(j),j.info("Starting Amp CLI.",{version:"0.0.1778994836-g963bd3",buildTimestamp:"2026-05-17T05:18:35.020Z"}),process.platform==="win32"&&Lj())Mb4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new i1(q7.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await H43(B).parseAsync(process.argv)}GP4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await O43().catch(Oz)});async function j43(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"),t6.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7899
7899
  `);else if(!cH(A.ampURL))t6.write(`Logging in to ${new URL(A.ampURL).hostname}
7900
7900
  `);let $=process.env.AMP_API_KEY;if($)t6.write(`API key found in environment variable, storing...
7901
7901
  `),await Q.set("apiKey",$,A.ampURL),t6.write(`API key successfully stored.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1778989718-g339de8",
3
+ "version": "0.0.1778994836-g963bd3",
4
4
  "description": "Renamed to @ampcode/cli - see https://ampcode.com/news/npm-package-changes",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -8,7 +8,7 @@
8
8
  "amp": "node_modules/@ampcode/cli/bin/amp.exe"
9
9
  },
10
10
  "dependencies": {
11
- "@ampcode/cli": "0.0.1778989718-g339de8"
11
+ "@ampcode/cli": "0.0.1778994836-g963bd3"
12
12
  },
13
13
  "files": [
14
14
  "dist/main.js",