@sourcegraph/amp 0.0.1778790531-gba894e → 0.0.1778790766-g60d194
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +10 -10
- package/package.json +3 -4
package/dist/main.js
CHANGED
|
@@ -5289,12 +5289,12 @@ ${z}`))}},error:(E)=>{if(!K)K=!0,D(Error(`Failed to spawn brew: ${E.message}`))}
|
|
|
5289
5289
|
${z}`;if(Z==="pnpm"&&z.includes("Unable to find the global bin directory"))W+=`
|
|
5290
5290
|
|
|
5291
5291
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
5292
|
-
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();Xz();var $w5="@ampcode/cli";async function qX0(A,Q,B=$w5){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=_o(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 Jw5="https://static.ampcode.com/cli/cli-version.txt";async function NX0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${Jw5}?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=_o(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 Yw5=604800000;function Xu4(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>Yw5)return{ageMs:B};return null}function _o(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 To(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-g?([a-f0-9]+))?/);if(!Q)return null;let B=parseInt(Q[1],10)*1000,$=Q[2],J=B!==0?OF(B):void 0;return{sha:$,timestamp:B,age:J}}catch{return null}}L1();d0();import{readFile as Zw5,realpath as Fw5}from"node:fs/promises";import{dirname as Du4,join as Xw5}from"node:path";async function Gu4(A){switch(A){case"binary":case"brew":return Dw5(Ro());case"npm":case"pnpm":case"yarn":case"bun":return Gw5()}}async function Dw5(A){let Q=await DI(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 Gw5(){try{let A=process.argv[1];if(!A)return null;let Q=await Fw5(A),B=Du4(Du4(Q));return await Vw5(Xw5(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function Vw5(A){let Q=await Zw5(A,"utf8"),B=JSON.parse(Q);if(!B.name||!ze0(B.name))return j.debug("package.json name mismatch",{pkgJsonPath:A,name:B.name}),null;return B.version||null}d0();import{spawn as Uw5}from"node:child_process";function Ce0(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 IX0=null,ko=null;function Vu4(A){return new Promise((Q)=>{let B=Uw5("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 wX0(){if(IX0)return IX0;if(ko)return ko;ko=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return Ce0(A);let Q=await Vu4("@sourcegraph:registry");if(Q)return Ce0(Q);let B=await Vu4("registry");if(B)return Ce0(B);return"https://registry.npmjs.org"})();try{return IX0=await ko,IX0}finally{ko=null}}var Kw5=3600000,Ew5=5000;function CX0(A,Q,B={}){let $=new g4,J=$.pipe(tA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??Kw5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await AU(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await zw5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await AU(Ew5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let z=Math.min(K,E);await AU(z),E-=z}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function zw5(A,Q,B,$){let J={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return B.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),J.stop=!0,J;let Y=await Q.get("updates.mode");if(Y==="disabled")return B.debug("checking disabled"),J.stop=!0,J;let Z=await kU(),F=Z==="binary"||Z==="brew",X=F?void 0:await GI();B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F,npmPackageName:X});let D;if(F)D=await NX0(A);else{let U=await wX0();D=await qX0(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 Gu4(Z);if(U&&_o(U,D.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:U,latestVersion:D.latestVersion}),J.updatedTo=U,_o(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!==Ro()){if(B.debug("non-standard binary path, showing warning"),!V())G("update-available-unrecognized-path");return J}if(Y==="warn"){if(!V())G("update-available");return J}if(!Z){if(B.debug("auto-update not supported, falling back to warn mode"),!V())G("update-available");return J}if(Z==="binary"&&process.platform==="win32"){if(B.debug("binary auto-update not supported on Windows, falling back to warn mode"),!V())G("update-available");return J}try{await Po(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}}Xz();import{stderr as uD}from"node:process";function Uu4(A){let Q=new mN().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 Ke0($.force||!1,$.verbose||!1,"0.0.
|
|
5292
|
+
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();Xz();var $w5="@ampcode/cli";async function qX0(A,Q,B=$w5){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=_o(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 Jw5="https://static.ampcode.com/cli/cli-version.txt";async function NX0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${Jw5}?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=_o(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 Yw5=604800000;function Xu4(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>Yw5)return{ageMs:B};return null}function _o(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 To(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-g?([a-f0-9]+))?/);if(!Q)return null;let B=parseInt(Q[1],10)*1000,$=Q[2],J=B!==0?OF(B):void 0;return{sha:$,timestamp:B,age:J}}catch{return null}}L1();d0();import{readFile as Zw5,realpath as Fw5}from"node:fs/promises";import{dirname as Du4,join as Xw5}from"node:path";async function Gu4(A){switch(A){case"binary":case"brew":return Dw5(Ro());case"npm":case"pnpm":case"yarn":case"bun":return Gw5()}}async function Dw5(A){let Q=await DI(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 Gw5(){try{let A=process.argv[1];if(!A)return null;let Q=await Fw5(A),B=Du4(Du4(Q));return await Vw5(Xw5(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function Vw5(A){let Q=await Zw5(A,"utf8"),B=JSON.parse(Q);if(!B.name||!ze0(B.name))return j.debug("package.json name mismatch",{pkgJsonPath:A,name:B.name}),null;return B.version||null}d0();import{spawn as Uw5}from"node:child_process";function Ce0(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 IX0=null,ko=null;function Vu4(A){return new Promise((Q)=>{let B=Uw5("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 wX0(){if(IX0)return IX0;if(ko)return ko;ko=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return Ce0(A);let Q=await Vu4("@sourcegraph:registry");if(Q)return Ce0(Q);let B=await Vu4("registry");if(B)return Ce0(B);return"https://registry.npmjs.org"})();try{return IX0=await ko,IX0}finally{ko=null}}var Kw5=3600000,Ew5=5000;function CX0(A,Q,B={}){let $=new g4,J=$.pipe(tA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??Kw5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await AU(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await zw5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await AU(Ew5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let z=Math.min(K,E);await AU(z),E-=z}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function zw5(A,Q,B,$){let J={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return B.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),J.stop=!0,J;let Y=await Q.get("updates.mode");if(Y==="disabled")return B.debug("checking disabled"),J.stop=!0,J;let Z=await kU(),F=Z==="binary"||Z==="brew",X=F?void 0:await GI();B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F,npmPackageName:X});let D;if(F)D=await NX0(A);else{let U=await wX0();D=await qX0(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 Gu4(Z);if(U&&_o(U,D.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:U,latestVersion:D.latestVersion}),J.updatedTo=U,_o(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!==Ro()){if(B.debug("non-standard binary path, showing warning"),!V())G("update-available-unrecognized-path");return J}if(Y==="warn"){if(!V())G("update-available");return J}if(!Z){if(B.debug("auto-update not supported, falling back to warn mode"),!V())G("update-available");return J}if(Z==="binary"&&process.platform==="win32"){if(B.debug("binary auto-update not supported on Windows, falling back to warn mode"),!V())G("update-available");return J}try{await Po(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}}Xz();import{stderr as uD}from"node:process";function Uu4(A){let Q=new mN().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 Ke0($.force||!1,$.verbose||!1,"0.0.1778790766-g60d194"),process.exit()});A.addCommand(Q,{hidden:!0});let B=new mN("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 Hw5($.targetVersion)});A.addCommand(B)}function Ww5(A){let Q=Boolean(A.isTTY),B=0,$=!1;function J(){if(!Q||!$)return;A.write(`
|
|
5293
5293
|
`),$=!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 Hw5(A){let B=process.platform==="win32"&&Pj()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:$,renderProgress:J}=Ww5(uD);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")uD.write(a0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
5294
5294
|
|
|
5295
5295
|
`));try{if(!A){uD.write(a0.blue(`Checking for updates...
|
|
5296
|
-
`));let F=!1,X;if(Pj()){let D=await NX0("0.0.
|
|
5297
|
-
`));let V=await yz("0.0.
|
|
5296
|
+
`));let F=!1,X;if(Pj()){let D=await NX0("0.0.1778790766-g60d194");F=D.hasUpdate,X=D.latestVersion}else{let D=await wX0(),G=await GI(),V=await qX0("0.0.1778790766-g60d194",D,G);F=V.hasUpdate,X=V.latestVersion}if(!F){let D=To("0.0.1778790766-g60d194"),G=D?.age?`released ${D.age} ago`:`built ${OF(new Date("2026-05-14T20:37:10.095Z"))} ago`;uD.write(a0.green(`✓ Amp is already up to date on version ${"0.0.1778790766-g60d194"} (${G})
|
|
5297
|
+
`));let V=await yz("0.0.1778790766-g60d194",B);if(V.warning)uD.write(`
|
|
5298
5298
|
`+a0.yellow(V.warning)+`
|
|
5299
5299
|
`);process.exit(0)}if(!X)uD.write(a0.yellow("[WARN] could not find latest version")),process.exit(0);A=X}uD.write(a0.blue(`Updating to version ${A}...
|
|
5300
5300
|
`)),await Po(A,void 0,(F)=>{$(),uD.write(a0.dim(`Running: ${F}
|
|
@@ -5700,7 +5700,7 @@ ${$}`).join(`
|
|
|
5700
5700
|
`).length,J=new p({text:new C(A,new v({color:B}))});if($<=uG0)return J;return new U0({width:1/0,height:uG0,child:new p9({autofocus:!1,controller:Q,child:J})})}function zx5(){return new Map([[C1.key("PageUp"),new hG0],[C1.key("PageDown"),new s41],[C1.ctrl("u"),new hG0],[C1.shift("Home"),new t41],[C1.shift("End"),new e41]])}function Wx5(A,Q,B){return Math.max(Q,Math.min(A,B))}var AA1=8,qn4=1,Nn4=AA1-1;class QA1 extends L4{}class BA1 extends L4{}class gG0 extends L4{}class mG0 extends L4{}class $A1 extends L4{}class JA1 extends L4{}class YA1 extends T0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new In4}}class In4 extends _0{messageScroll=new xA;initState(){super.initState(),this.messageScroll.followMode=!1,this.messageScroll.jumpTo(0)}dispose(){this.messageScroll.dispose(),super.dispose()}build(A){let Q=this.widget.props,B=Hx5(Q,this.messageScroll),$=qx5(Q.options.message),J=$?new i4({actions:this.buildScrollActions(),child:new Y5({debugLabel:"NeoSelectDialogScrollShortcuts",shortcuts:Ix5(),child:B})}):B,Y=[{keys:["↑/↓","j/k"],label:"move"},{keys:["Enter"],label:"select"}];if($)Y.push({keys:["Ctrl+E","Ctrl+Y"],label:"scroll"});return Y.push({keys:["Esc"],label:"cancel"}),new RA({header:Q.options.title,minWidth:64,maxWidth:80,footer:Y,autofocus:!1,onDismiss:Q.onCancel,child:J})}buildScrollActions(){let A=(Q)=>{let B=wx5(this.messageScroll.offset+Q,0,this.messageScroll.maxScrollExtent);this.messageScroll.jumpTo(B)};return new Map([[QA1,new p1(()=>A(-qn4))],[BA1,new p1(()=>A(qn4))],[gG0,new p1(()=>A(-Nn4))],[mG0,new p1(()=>A(Nn4))],[$A1,new p1(()=>this.messageScroll.jumpTo(0))],[JA1,new p1(()=>this.messageScroll.jumpTo(this.messageScroll.maxScrollExtent))]])}}function Hx5(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 V9({options:B,selectedIndex:$,body:Nx5(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 qx5(A){if(A===void 0)return!1;return A.split(`
|
|
5701
5701
|
`).length>AA1}function Nx5(A,Q){if(A===void 0)return;let B=A.split(`
|
|
5702
5702
|
`).length,$=Math.min(B,AA1);return new U0({width:1/0,height:$,child:new p9({autofocus:!1,controller:Q,child:new p({text:new C(A)})})})}function Ix5(){return new Map([[C1.key("PageUp"),new gG0],[C1.key("PageDown"),new mG0],[C1.ctrl("u"),new gG0],[C1.ctrl("d"),new mG0],[C1.ctrl("y"),new QA1],[C1.ctrl("e"),new BA1],[C1.shift("Home"),new $A1],[C1.shift("End"),new JA1]])}function wx5(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 Es({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(sd(B.errorMessage))continue;let $=`${B.uri.toString()}
|
|
5703
|
-
${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()}}wl();A2();import{readFile as Cx5}from"node:fs/promises";import FA1 from"node:os";function Mx5(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function wn4(A,Q){try{return{path:Q,contents:Ag0(await Cx5(A,"utf8"))}}catch{return null}}async function pG0(A,Q){let B=[],$=Mx5(),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(FJ(Y),null,2)});let Z=await wn4(Gx(Q),`${$}/logs/${Q}.log`);if(Z)B.push(Z);let F=await wn4(A.settingsFilePath,`${$}/settings/global.json`);if(F)B.push(F);let X=await kU()??"unknown",D=await r4.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778790531-gba894e",clientOS:`${FA1.platform()} ${FA1.release()} ${FA1.arch()}`,installMethod:X}},{config:A.configService});if(!D.ok)throw Error(`Failed to submit report: ${D.error.message}`);return D.result.reportID}class XA1{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 dG0 extends w5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new DA1(this.offstage)}updateRenderObject(A){if(A instanceof DA1)A.offstage=this.offstage}}class DA1 extends Y4{_offstage;constructor(A){super();this._offstage=A}get offstage(){return this._offstage}set offstage(A){if(A===this._offstage)return;this._offstage=A,this.markNeedsLayout()}getMinIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicWidth(A)??0}getMaxIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicWidth(A)??0}getMinIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicHeight(A)??0}getMaxIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicHeight(A)??0}performLayout(){let A=this._lastConstraints;H4(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let B=A.constrain(Q.size.width,Q.size.height);this.setSize(B.width,B.height),Q.setOffset(0,0)}else{let B=A.smallest;this.setSize(B.width,B.height)}super.performLayout()}paint(A,Q,B){if(this._offstage)return;super.paint(A,Q,B)}hitTest(A,Q,B,$){if(this._offstage)return!1;return super.hitTest(A,Q,B,$)}}class zs{_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 GA1 extends T0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new Cn4}}class Cn4 extends _0{entries=[];initState(){this.widget.controller._attach(this)}didUpdateWidget(A){if(A.controller!==this.widget.controller)A.controller._detach(),this.widget.controller._attach(this)}dispose(){this.widget.controller._detach(),super.dispose()}push(A){let Q=new yj,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new yj,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 dG0({offstage:this.entries.length>0,child:this.widget.root}));for(let B=0;B<this.entries.length;B++){let $=this.entries[B],J=B===this.entries.length-1,Y=J?new a4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new dG0({key:$.key,offstage:!J,child:Y}))}return new $A({fit:"expand",children:Q})}}class UA1 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=Lx5(Q);return new RA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:K0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new X5({items:Q,showBorder:!1,getLabel:($)=>{let J=VA1($);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=ej($.item.verb.toLowerCase(),Y),F=ej(J.item.verb.toLowerCase(),Y);if(Z!==F)return F-Z;let X=ej(VA1($.item),Y),D=ej(VA1(J.item),Y);if(X!==D)return D-X;return J.score-$.score},isItemDisabled:($)=>$.status.type==="disabled",buildDisabledReasonWidget:($,J)=>{if($.status.type!=="disabled")return;let{colors:Y}=P0.of(J);return new p({text:new C($.status.reason,new v({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new Mn4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class Mn4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=P0.of(Y),{colors:F,app:X}=Z,D=B?X.selectionBackground:void 0,G=B?X.selectionForeground:F.foreground,V=B?G:F.mutedForeground,U=new p({text:new C(Q.noun?.toLowerCase()??"",new v({color:V,dim:$||!B})),textAlign:"right"}),K=[new C(Q.verb.toLowerCase(),new v({color:G,bold:!0,dim:$}))];if($)K.push(new C(" (unavailable)",new v({color:G,dim:!0})));let E=p.spans(K),z=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)z.push({child:Ox5(Q.shortcut,Z,$)});return new Ln4({columns:z,padding:K0.horizontal(1),backgroundColor:D})}}function VA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function Lx5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,y4(B.noun)):Q},0)}function Ox5(A,Q,B){let{colors:$,app:J}=Q,Y=new v({color:$.mutedForeground,dim:B}),Z=[];for(let F of A.modifiers()){if(Z.length>0)Z.push(new C(" ",Y));Z.push(new C(F,new v({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new C(" ",Y));return Z.push(new C(A.key,new v({color:J.keybind,bold:!0,dim:B}))),p.spans(Z)}class Ln4 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 _1({child:X.child}));else Y.push(X.child)}let Z=new s0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new m0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class KA1{#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 zs,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#B(){for(let A of this.#Q)A()}}class I7 extends q6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=I7.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(I7)?.commandRegistry??null}}class EA1 extends T0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new On4}}class On4 extends _0{modalStack=new zs;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=I7.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=I7.of(A).commands,B=new UA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new GA1({root:B,controller:this.modalStack})}}var zA1=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]},{input:"S",keys:["Alt"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],WA1=[{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 cG0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=a1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[F,X]=this.renderRow(Z),D;if(J)D=new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new x0({padding:K0.only({left:4}),child:X})]});else D=new s0({crossAxisAlignment:"start",children:[new _1({flex:1,child:F}),new U0({width:1}),new _1({flex:1,child:X})]});Y.push(new x0({padding:K0.horizontal(6),child:D}))}return new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class HA1 extends T0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:B}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=B??!0}createState(){return new jn4}}class jn4 extends _0{scrollController;initState(){this.scrollController=new xA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=O1.of(A).colorScheme,J=P0.of(A).app,Y=a1.of(A),Z=new v({color:B.primary,bold:!0}),F=new v({color:B.secondary,bold:!0}),X=new v({color:J.keybind}),D=new v({color:J.command}),G=new v({color:B.foreground}),V=new v({color:B.foreground}),U=Y.size.width,K=Y.size.height,E=U-4,z=K-4,W=Math.max(40,Math.min(80,E)),H=new Set(["permissions-disable"]),N=[...this.widget.commands.filter((O)=>{let _=O.noun?.toLowerCase();return _!=="dev"&&_!=="debug"&&!O.id.startsWith("debug-")&&!H.has(O.id)})].sort((O,_)=>{let S=(O.noun??"").toLowerCase(),T=(_.noun??"").toLowerCase(),x=S.localeCompare(T);if(x!==0)return x;let h=O.verb.toLowerCase(),u=_.verb.toLowerCase(),k=h.localeCompare(u);if(k!==0)return k;return O.id.localeCompare(_.id)}),I=new fA({autofocus:!0,controller:this.scrollController,child:new m0({constraints:new I1(W,W,0,Number.POSITIVE_INFINITY),child:new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new t1({child:new p({text:new C(`Amp CLI - Help & Keyboard Shortcuts
|
|
5703
|
+
${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()}}wl();A2();import{readFile as Cx5}from"node:fs/promises";import FA1 from"node:os";function Mx5(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function wn4(A,Q){try{return{path:Q,contents:Ag0(await Cx5(A,"utf8"))}}catch{return null}}async function pG0(A,Q){let B=[],$=Mx5(),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(FJ(Y),null,2)});let Z=await wn4(Gx(Q),`${$}/logs/${Q}.log`);if(Z)B.push(Z);let F=await wn4(A.settingsFilePath,`${$}/settings/global.json`);if(F)B.push(F);let X=await kU()??"unknown",D=await r4.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778790766-g60d194",clientOS:`${FA1.platform()} ${FA1.release()} ${FA1.arch()}`,installMethod:X}},{config:A.configService});if(!D.ok)throw Error(`Failed to submit report: ${D.error.message}`);return D.result.reportID}class XA1{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 dG0 extends w5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new DA1(this.offstage)}updateRenderObject(A){if(A instanceof DA1)A.offstage=this.offstage}}class DA1 extends Y4{_offstage;constructor(A){super();this._offstage=A}get offstage(){return this._offstage}set offstage(A){if(A===this._offstage)return;this._offstage=A,this.markNeedsLayout()}getMinIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicWidth(A)??0}getMaxIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicWidth(A)??0}getMinIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicHeight(A)??0}getMaxIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicHeight(A)??0}performLayout(){let A=this._lastConstraints;H4(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let B=A.constrain(Q.size.width,Q.size.height);this.setSize(B.width,B.height),Q.setOffset(0,0)}else{let B=A.smallest;this.setSize(B.width,B.height)}super.performLayout()}paint(A,Q,B){if(this._offstage)return;super.paint(A,Q,B)}hitTest(A,Q,B,$){if(this._offstage)return!1;return super.hitTest(A,Q,B,$)}}class zs{_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 GA1 extends T0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new Cn4}}class Cn4 extends _0{entries=[];initState(){this.widget.controller._attach(this)}didUpdateWidget(A){if(A.controller!==this.widget.controller)A.controller._detach(),this.widget.controller._attach(this)}dispose(){this.widget.controller._detach(),super.dispose()}push(A){let Q=new yj,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new yj,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 dG0({offstage:this.entries.length>0,child:this.widget.root}));for(let B=0;B<this.entries.length;B++){let $=this.entries[B],J=B===this.entries.length-1,Y=J?new a4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new dG0({key:$.key,offstage:!J,child:Y}))}return new $A({fit:"expand",children:Q})}}class UA1 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=Lx5(Q);return new RA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:K0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new X5({items:Q,showBorder:!1,getLabel:($)=>{let J=VA1($);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=ej($.item.verb.toLowerCase(),Y),F=ej(J.item.verb.toLowerCase(),Y);if(Z!==F)return F-Z;let X=ej(VA1($.item),Y),D=ej(VA1(J.item),Y);if(X!==D)return D-X;return J.score-$.score},isItemDisabled:($)=>$.status.type==="disabled",buildDisabledReasonWidget:($,J)=>{if($.status.type!=="disabled")return;let{colors:Y}=P0.of(J);return new p({text:new C($.status.reason,new v({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new Mn4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class Mn4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=P0.of(Y),{colors:F,app:X}=Z,D=B?X.selectionBackground:void 0,G=B?X.selectionForeground:F.foreground,V=B?G:F.mutedForeground,U=new p({text:new C(Q.noun?.toLowerCase()??"",new v({color:V,dim:$||!B})),textAlign:"right"}),K=[new C(Q.verb.toLowerCase(),new v({color:G,bold:!0,dim:$}))];if($)K.push(new C(" (unavailable)",new v({color:G,dim:!0})));let E=p.spans(K),z=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)z.push({child:Ox5(Q.shortcut,Z,$)});return new Ln4({columns:z,padding:K0.horizontal(1),backgroundColor:D})}}function VA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function Lx5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,y4(B.noun)):Q},0)}function Ox5(A,Q,B){let{colors:$,app:J}=Q,Y=new v({color:$.mutedForeground,dim:B}),Z=[];for(let F of A.modifiers()){if(Z.length>0)Z.push(new C(" ",Y));Z.push(new C(F,new v({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new C(" ",Y));return Z.push(new C(A.key,new v({color:J.keybind,bold:!0,dim:B}))),p.spans(Z)}class Ln4 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 _1({child:X.child}));else Y.push(X.child)}let Z=new s0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new m0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class KA1{#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 zs,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#B(){for(let A of this.#Q)A()}}class I7 extends q6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=I7.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(I7)?.commandRegistry??null}}class EA1 extends T0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new On4}}class On4 extends _0{modalStack=new zs;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=I7.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=I7.of(A).commands,B=new UA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new GA1({root:B,controller:this.modalStack})}}var zA1=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]},{input:"S",keys:["Alt"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],WA1=[{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 cG0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=a1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[F,X]=this.renderRow(Z),D;if(J)D=new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new x0({padding:K0.only({left:4}),child:X})]});else D=new s0({crossAxisAlignment:"start",children:[new _1({flex:1,child:F}),new U0({width:1}),new _1({flex:1,child:X})]});Y.push(new x0({padding:K0.horizontal(6),child:D}))}return new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class HA1 extends T0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:B}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=B??!0}createState(){return new jn4}}class jn4 extends _0{scrollController;initState(){this.scrollController=new xA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=O1.of(A).colorScheme,J=P0.of(A).app,Y=a1.of(A),Z=new v({color:B.primary,bold:!0}),F=new v({color:B.secondary,bold:!0}),X=new v({color:J.keybind}),D=new v({color:J.command}),G=new v({color:B.foreground}),V=new v({color:B.foreground}),U=Y.size.width,K=Y.size.height,E=U-4,z=K-4,W=Math.max(40,Math.min(80,E)),H=new Set(["permissions-disable"]),N=[...this.widget.commands.filter((O)=>{let _=O.noun?.toLowerCase();return _!=="dev"&&_!=="debug"&&!O.id.startsWith("debug-")&&!H.has(O.id)})].sort((O,_)=>{let S=(O.noun??"").toLowerCase(),T=(_.noun??"").toLowerCase(),x=S.localeCompare(T);if(x!==0)return x;let h=O.verb.toLowerCase(),u=_.verb.toLowerCase(),k=h.localeCompare(u);if(k!==0)return k;return O.id.localeCompare(_.id)}),I=new fA({autofocus:!0,controller:this.scrollController,child:new m0({constraints:new I1(W,W,0,Number.POSITIVE_INFINITY),child:new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new t1({child:new p({text:new C(`Amp CLI - Help & Keyboard Shortcuts
|
|
5704
5704
|
`,Z)})}),new U0({height:1}),new x0({padding:K0.horizontal(2),child:new p({text:new C(`Editor Shortcuts
|
|
5705
5705
|
`,F)})}),new cG0({items:zA1.filter((O)=>O.submitOnEnterOnly===void 0||O.submitOnEnterOnly===this.widget.submitOnEnter),renderRow:(O)=>{let _=[];for(let T of O.methods){let x=this.buildCleanKeyCombination(T);_.push(x)}let S=_.join(", ");return[new p({text:new C(S,X)}),new p({text:new C(O.description,G)})]}}),new U0({height:1}),new x0({padding:K0.horizontal(2),child:new p({text:new C(`Scrolling & Navigation
|
|
5706
5706
|
`,F)})}),new cG0({items:WA1,renderRow:(O)=>{let _=[];for(let T of O.methods){let x=this.buildCleanKeyCombination(T);_.push(x)}let S=_.join(", ");return[new p({text:new C(S,X)}),new p({text:new C(O.description,G)})]}}),new U0({height:1}),new x0({padding:K0.horizontal(2),child:new p({text:new C(`Command Palette Commands
|
|
@@ -5797,7 +5797,7 @@ Ctrl-X, Y, Z to unlock`;if(this.widget.centerContent)h=this.widget.centerContent
|
|
|
5797
5797
|
`))}return Z}function pg5(A,Q,B){let{colors:$,app:J}=B,Y=dg5(Q.status,B);if(A.push(new C(` ${Y.icon} `,new v({color:Y.color}))),A.push(new C(Q.name,new v({color:Q.status==="pending"?$.warning:J.command}))),Q.status==="pending")A.push(new C(" discovering...",new v({color:$.foreground,dim:!0})));else if(Q.description)A.push(new C(` ${$s4(Q.description,50)}`,new v({color:$.foreground,dim:!0})));if(Q.error)A.push(new C(` ${$s4(Q.error,40)}`,new v({color:J.toolError})));A.push(new C(`
|
|
5798
5798
|
`))}function dg5(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 $s4(A,Q){let B=A.replace(/\s+/g," ").trim();if(y4(B)<=Q)return B;let $="...",J=y4($);if(Q<=J)return NJ($,Q);return`${NJ(B,Q-J,!0,"")}${$}`}var e61="https://ampcode.com/news/neo",A51=[{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:e61,href:e61},"","",{text:"Need old Amp for a bit? Use ",keybind:"amp --take-me-back"}]}];function cg5(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:e61,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function lg5(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var gf=50,WR=40,s61=1000,ig5=420,ng5=760,ag5=-250,og5=1100,MV0=33,Fs4=0.999,rg5=2.1,sg5=720,tg5=420,zs4="Meet the new",Ws4="Amp",Hs4="CLI",Q51=C4(zs4).length,eg5=C4(Ws4).length,Am5=C4(Hs4).length,LV0={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},Xs4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},Ds4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},Gs4=[LV0,Xs4,Ds4,LV0,Xs4,Ds4,LV0],Qm5=LV0;class B51 extends T0{onDismiss;onQuit;animationProgress;animationsEnabled;variant;binaryInstallCommand;introStages;dismissible;constructor(A){super();this.onDismiss=A.onDismiss,this.onQuit=A.onQuit,this.animationProgress=A.animationProgress,this.animationsEnabled=A.animationsEnabled??!0,this.variant=A.variant??"intro",this.binaryInstallCommand=A.binaryInstallCommand??lg5(),this.introStages=this.variant==="npm-migration"?cg5(this.binaryInstallCommand):A51,this.dismissible=this.variant!=="npm-migration"}createState(){return new qs4}}class qs4 extends _0{startedAt=performance.now();animationTimer=null;stageTransitionTimer=null;firstStageTitleTimer=null;firstStageHintTimer=null;firstStageRevealTimer=null;firstStageTitleRevealStartedAt=null;firstStageHintRevealStartedAt=null;stageTransitionStartedAt=performance.now();animationStartProgress=0;animationTargetProgress=1;animationDurationMs=s61;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 b9(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=JZ(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=Fs4,this.firstStageHintVisible=this.animationProgress>=Fs4,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:s61,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=JZ(A/ng5);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},MV0)}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,$=JZ(B/ig5);if(this.setState(()=>{if(this.stageTransitionProgress=$,$>=1)this.previousIntroStage=null}),$>=1)this.stopStageTransitionTimer()},MV0)}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=JZ(J/this.animationDurationMs),Z=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*mf(Y);if(this.setState(()=>{this.animationProgress=Z}),Y>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},MV0)}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,s61+ag5),Q=A+og5;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?JZ((A-this.firstStageTitleRevealStartedAt)/sg5):this.firstStageTitleRevealProgress,B=this.firstStageHintRevealStartedAt?JZ((A-this.firstStageHintRevealStartedAt)/tg5):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=B}),Q>=1&&B>=1)this.stopFirstStageRevealTimer()},MV0)}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=Vs4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:Us4(Vs4(this.previousIntroStage),A,mf(this.stageTransitionProgress));return this.dismissProgress>0?Us4(Q,Qm5,mf(this.dismissProgress)):Q}build(A){let Q=O1.of(A).colorScheme,B=P0.of(A),$=this.currentOrbPalette(),J=BB(1,"frontier",$),Y=a1.of(A).size,F=this.widget.animationProgress??this.animationProgress,X=Math.max(Y.width/gf,Y.height/WR)*rg5,D=X+(1-X)*F,G=mf(this.dismissProgress),V=Math.max(gf,Math.round(gf*D)),U=Math.max(WR,Math.round(WR*D)),K=Math.round((Y.width-V)/2),E=Math.round((Y.height-U)/2),z=Math.max(0,Math.floor((Y.width-gf)/2)),W=-Math.floor(WR/2),H=Math.round(K+(z-K)*F),q=Math.round(E+(W-E)*F),N=H+V/2,I=q+U/2,w=Bm5({dismissProgress:this.dismissProgress,easedDismissProgress:G,introOrbScale:D,normalOrbCenterX:N,normalOrbCenterY:I,size:Y}),L=Math.max(gf,Math.round(gf*w.orbScale)),O=Math.max(WR,Math.round(WR*w.orbScale)),_=w.orbCenterX,S=w.orbCenterY,T=Math.round(_-L/2),x=Math.round(S-O/2),h=Math.max(3,Math.min(Y.height-5,Math.floor(WR/2)+2)),u=Math.max(h+3,Y.height-3),k=w.textDissolveProgress,f=this.isFinalIntroStage()?w.backdropDissolveProgress:0,d=this.firstStageTitleVisible&&k<1,c=d&&this.firstStageHintVisible,g=c&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),l=this.introStage===0?this.firstStageTitleRevealProgress:1,o=this.introStage===0?this.firstStageHintRevealProgress:1,A0=Math.max(24,Math.min(74,Y.width-4)),I0=Math.min(12,Math.max(8,Y.height-h-6)),V0=Math.max(0,Math.floor((Y.width-A0)/2)),H0=Math.max(0,Math.min(Y.height-I0,Math.floor(Y.height*0.55-I0/2))),j0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new xx({width:L,height:O,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:$.primary,secondaryColor:$.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new xx({width:L,height:O,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:$.primary,secondaryColor:$.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new a4({autofocus:!0,canRequestFocus:!0,debugLabel:"NeoWelcomeTakeover",onKey:(Q0)=>{if(Q0.key==="Enter")return this.advanceIntroStage(),"handled";if(!this.widget.dismissible&&Q0.key==="c"&&Q0.ctrlKey)return this.widget.onQuit?.(),"handled";if(!this.widget.dismissible&&Q0.key==="q")return this.widget.onQuit?.(),"handled";if((Q0.key===" "||Q0.key==="Space")&&!this.isFinalIntroStage())return this.advanceIntroStage(),"handled";if(Q0.key==="Escape"||Q0.key==="Esc"){if(!this.widget.dismissible)return this.widget.onQuit?.(),"handled";return this.dismissFromFinalIntroStage()?"handled":"ignored"}if(Q0.key==="ArrowRight")return this.nextIntroStage(),"handled";if(Q0.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new $A({fit:"expand",children:[new Ns4({color:Q.background,dissolveProgress:f}),new $A({fit:"expand",children:[new k1({onClick:()=>{},child:U0.expand()}),new zA({left:T,top:x,width:L,height:O,child:j0}),...d?[new zA({left:V0,top:H0,width:A0,height:I0,child:Jm5({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:A0,height:I0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:J,link:B.app.link,keybind:B.app.keybind,titleRevealProgress:l,dissolveProgress:k,context:A})})]:[],...c?[...g?[new zA({left:V0,top:Math.max(0,u-1),width:A0,height:1,child:new p({text:Gm5({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:k}),textAlign:"center"})})]:[],new zA({left:V0,top:u,width:A0,height:1,child:Um5({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:B.app.keybind,revealProgress:o,dissolveProgress:k,context:A})})]:[]]})]})})}}class Ns4 extends U8{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new Is4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class Is4 extends Y4{color;dissolveProgress;constructor(A,Q){super();this.color=A,this.dissolveProgress=Q}update(A,Q){this.color=A,this.dissolveProgress=Q,this.markNeedsPaint()}performLayout(){let A=this._lastConstraints;H4(!!A,"performLayout called without constraints");let Q=A.constrain(A.biggest.width,A.biggest.height);this.setSize(Q.width,Q.height),super.performLayout()}paint(A,Q=0,B=0){let $=Math.floor(Q+this.offset.x),J=Math.floor(B+this.offset.y),Y=Math.floor(this.size.width),Z=Math.floor(this.size.height),F={bg:this.color},X=JZ(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(!$m5(G,D,Y,Z,X))A.fill($+G,J+D,1,1," ",F)}}function JZ(A){return Math.min(1,Math.max(0,A))}function mf(A){return 1-(1-A)**3}function Vs4(A){return Gs4[A]??Gs4[0]}function Us4(A,Q,B){return{primary:xj(A.primary,Q.primary,B),secondary:xj(A.secondary,Q.secondary,B)}}function Bm5({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:JZ(A/0.52),backdropDissolveProgress:mf(JZ((A-0.12)/0.88))}}function $m5(A,Q,B,$,J){let Y=$<=1?0:Q/($-1),Z=ws4(A+Q*Math.max(1,B));return(1-Y)*0.72+Z*0.28<J}function Jm5({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 t61({introStages:A,stage:Q,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E});let z=mf($),W=J*Math.round((1-z)*Y),H=-J*Math.round(z*Y);return new pz(new $A({fit:"expand",children:[new zA({left:H,top:0,width:Y,height:Z,child:t61({introStages:A,stage:B,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:B===0?1:U,dissolveProgress:K,context:E})}),new zA({left:W,top:0,width:Y,height:Z,child:t61({introStages:A,stage:Q,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E})})]}))}function t61({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]??A51[0],V=new v({color:J,bold:!0}),U=new v({color:B}),K=A===A51&&Q===0,E=[...G.title===null?[]:[new p({text:K?OV0(Fm5({progress:F,foreground:J,pulseColor:J}),X):new C(D$(G.title,X),V),textAlign:"center"})],...G.body.length>0?[Ym5()]:[],...G.body.map((z)=>Zm5(z,U,$,Y,Z,X,D))];return new t1({child:new x0({padding:K0.horizontal(1),child:new y0({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:E})})})}function Ym5(){return U0.height(1)}function Zm5(A,Q,B,$,J,Y,Z){if(typeof A==="string")return new p({text:new C(D$(A,Y),Q),textAlign:"center"});if("codeBlock"in A)return new X3({onCopy:(F,X)=>{if(X)m5.success(Z,"Copied to clipboard",2000)},child:new y0({mainAxisSize:"min",children:A.codeBlock.map((F)=>new p({text:new C(D$(F,Y),new v({color:J})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let F=new p({text:new C("",void 0,[new C(D$(A.text,Y),new v({color:B,dim:!0})),new C(D$(A.keybind,Y,C4(A.text).length),new v({color:J}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new t1({child:new X3({child:F})});return F}if("highlightText"in A){let F=DA.createSpan(A.href,A.linkText,new v({color:$,underline:!0})),X=eD.of(Z),D=new C("",void 0,[new C(A.text,Q),new C(A.highlightText,new v({color:J})),new C(A.textAfterHighlight,Q),new C(F.text,F.style,F.children,F.hyperlink,()=>{aA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new C(A.textAfter,Q)]);return new p({text:OV0(D,Y),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new y0({mainAxisSize:"min",children:[new p({text:new C(D$(A.text,Y),Q),textAlign:"center"}),new t1({child:new s0({mainAxisSize:"min",children:[DA.createWidget(Z,A.href,D$(A.linkText,Y),new v({color:$,underline:!0})),new p({text:new C(D$(A.textAfter,Y),Q)})]})})]});let F=DA.createSpan(A.href,A.linkText,new v({color:$,underline:!0})),X=eD.of(Z),D=new C("",void 0,[new C(A.text,Q),new C(F.text,F.style,F.children,F.hyperlink,()=>{aA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new C(A.textAfter,Q)]);return new p({text:OV0(D,Y),textAlign:"center"})}if(Y>0)return new p({text:new C(D$(A.text,Y),new v({color:$,underline:!0})),textAlign:"center"});return new t1({child:DA.createWidget(Z,A.href,A.text,new v({color:$,underline:!0}))})}function Fm5({progress:A,foreground:Q,pulseColor:B}){let $=new v({color:Q,bold:!0}),J=new v({color:Dm5({progress:A,foreground:Q,pulseColor:B}),bold:!0});return new C("",void 0,[new C(Xm5(A).padEnd(Q51," "),$),new C(" ",$),new C(Ks4(Ws4,eg5,A,0.72),$),new C(" ",$),new C(Ks4(Hs4,Am5,A,0.88),J)])}function Xm5(A){let Q=C4(zs4),B=Math.min(Q51,Math.ceil(JZ(A/0.62)*Q51));return Q.slice(0,B).join("")}function Ks4(A,Q,B,$){return B>=$?A:"".padEnd(Q," ")}function Dm5({progress:A,foreground:Q,pulseColor:B}){if(A<0.88||A>=1)return Q;let $=JZ((A-0.88)/0.12);return Math.cos($*Math.PI*4)*(1-$)>0.12?B:Q}function Gm5({stage:A,featureStageCount:Q,foreground:B,dissolveProgress:$}){return new C(D$(`${A}/${Q}`,$),new v({color:B,dim:!0}))}function Vm5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y}){let Z=new v({color:$}),F=new v({color:B,dim:!0}),X=Q?A?"Enter":"Space":"Esc",D=Q?A?" to get started":" to continue":" to quit, or use ",G=Q?"":"amp --take-me-back",V=Q?"":" to use the old version",U=`${D}${G}${V}`;if(!Q)return new C("",void 0,[new C(X,Z),new C(D,F),new C(G,Z),new C(V,F)]);let K=Es4(X,J),E=Es4(U,JZ((J*(C4(X).length+C4(U).length)-C4(X).length)/C4(U).length));return new C("",void 0,[new C(D$(K,Y),Z),new C(D$(E.slice(0,D.length),Y),F),new C(D$(E.slice(D.length,D.length+G.length),Y),Z),new C(D$(E.slice(D.length+G.length),Y),F)])}function Um5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y,context:Z}){if(Q)return new p({text:Vm5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y}),textAlign:"center"});let F=new v({color:$}),X=new v({color:B,dim:!0});return new X3({onCopy:(D,G)=>{if(G)m5.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 Es4(A,Q){let B=C4(A),$=Math.min(B.length,Math.ceil(JZ(Q)*B.length));return B.slice(0,$).join("").padEnd(B.length," ")}function OV0(A,Q,B=0){if(Q<=0)return A;let $=B+C4(A.text??"").length,J=A.children?.map((Y)=>{let Z=OV0(Y,Q,$);return $+=C4(Y.toPlainText()).length,Z});return new C(A.text?D$(A.text,Q,B):A.text,A.style,J,A.hyperlink,A.onClick)}function D$(A,Q,B=0){if(Q<=0)return A;return C4(A).map((J,Y)=>{if(J.trim()==="")return J;return ws4(B+Y)<Q?" ":J}).join("")}function ws4(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(oU(Z,D),new v({color:B.foreground,dim:$}))),J.push(new C(" (free)",new v({color:B.foreground,dim:$})));else if(Z>0)J.push(new C(oU(Z,D),new v({color:B.foreground,dim:$}))),J.push(new C(" (free)",new v({color:B.foreground,dim:$}))),J.push(new C(" + ",new v({color:B.foreground,dim:$}))),J.push(new C(oU(F,D),new v({color:B.foreground,dim:$,bold:!$})));else J.push(new C(oU(F,D),new v({color:B.foreground,dim:$,bold:!$})));return J}class $51 extends L4{}class J51 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 Em5(A,Q){let B=P0.of(Q),{colors:$}=B,J=nI(A,{colors:{foreground:$.foreground}}),Y=[];if(J.length>0)Y.push(new C("Total: ",new v({color:$.mutedForeground}))),Y.push(...J);else if(A.totalCostUSD===null)Y.push(new C("Usage information is currently unavailable."));else Y.push(new C("No usage recorded for this thread yet."));if(A.costBreakdownURL)Y.push(new C(`
|
|
5799
5799
|
|
|
5800
|
-
`)),Y.push(new C("Details: ",new v({color:$.mutedForeground}))),Y.push(new C(A.costBreakdownURL,new v({color:B.app.link})));return new p({text:new C("",void 0,Y)})}function zm5(A,Q,B){let $=Em5(A,Q);if(!A.costBreakdownURL)return new RA({header:"Thread Cost",minWidth:80,maxWidth:100,onDismiss:B,child:$});let J=A.costBreakdownURL,Y=new p1(()=>{return i4.maybeInvoke(Q,new m9(J,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),Z=new p1(()=>{return aA(Q,J),"handled"});return new RA({header:"Thread Cost",minWidth:80,maxWidth:100,autofocus:!1,footer:[{keys:["Esc"],label:"close"},{keys:["o"],label:"open in browser"},{keys:["y"],label:"copy url"}],onDismiss:B,child:new i4({actions:new Map([[$51,Y],[J51,Z]]),child:new Y5({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[C1.key("o"),new J51],[C1.key("y"),new $51]]),child:new p4({autofocus:!0,debugLabel:"ThreadCostBody",child:$})})})})}function Cs4(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(zm5(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 Y51 extends T0{analyzeContextForThread;listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;initialThreadID;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;onThreadArchived;onActiveThreadChange;initialUserInput;getDefaultNewThreadVisibility;openThreadPickerOnStart;neoContext;constructor(A){super();this.analyzeContextForThread=A.analyzeContextForThread,this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.initialThreadID=A.initialThreadID,this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.neoContext=A.neoContext}createState(){return new Os4}}class Os4 extends _0{editorController=new T8;commandPalette=new Kr(this);commandRegistry=new KA1;toastController=new v01;exitHintTimer=new Ur(this,1000);ideStatus=new K2(this,{});threadNavigationHistory=new XA1;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;neoWelcomeVisible=!1;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;pluginIntegration=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};onSwitchThread=(A)=>{this.connectToExistingThread(A,{recordNavigation:!0})};sendFeedbackReport=async(A)=>pG0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await Gc4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Vc4({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 Uc4({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,(Q)=>this.setState(Q)),this.notices.startPolling(),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:Q,error:B})=>{if(j.error("Neo failed to connect to thread",{threadID:Q,error:B}),!Q)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe((Q)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(u30(Q.settings)))}),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput;if(this.widget.initialThreadID){let Q={};if(A)Q.initialUserInput=A;this.connectToExistingThread(this.widget.initialThreadID,Q)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new 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.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=I4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?En4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],$=[{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(J,Y,Z)=>{J.pushWithDismiss((F)=>sA1({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()}},Cs4({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 OA1({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 r61({toolboxes:this.widget.neoContext.toolboxes,onDismiss:Y}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(J,Y,Z)=>{try{await aA(Y,"https://ampcode.com/chronicle")}finally{Z()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{LJ(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 MA1({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 qA1({commands:I7.of(Y).commands,onDismiss:Z}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",keywords:["intro","onboarding","getting started"],status:{type:"enabled"},run:(J,Y,Z)=>{Z(),A.showNeoWelcome()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["about","release","build"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new RA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new p({text:new C(VD0({version:"0.0.1778790531-gba894e",buildTimestamp:"2026-05-14T20:33:00.739Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:C1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{i4.maybeInvoke(Y,new jf)}},...Q,...An4(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 o61({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.widget.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:B,statusItems:this.pluginIntegration?.getStatusItems()??[],notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.neoWelcomeVisible?null:$,onDismissNotice:(G)=>this.notices.dismiss(G)}),Y=a1.of(A),Z=Y.capabilities.animationSupport!=="disabled",X=[new m0({constraints:I1.tight(Y.size.width,Y.size.height),child:J})];if(this.commandPalette.isEnabled())X.push(new a4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new EA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)X.push(sA1({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)X.push(new a4({debugLabel:"NeoWelcomeDialogOverlay",child:new B51({onDismiss:this.dismissNeoWelcome,onQuit:()=>I4.instance.stop(),animationsEnabled:Z,variant:this.widget.neoWelcomeVariant})}));let D=this.executorAlreadyConnectedDialog;if(D)X.push(new a4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new wA1({existingExecutorPid:D.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(X.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)X.push(new IA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:Ms4.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)X.push(new CA1);if($&&this.activeThreadContext&&!this.neoWelcomeVisible)X.push(Qn4($,()=>this.notices.dismiss($.key)));return new f3({neoContext:this.widget.neoContext,child:new I7({commandRegistry:this.commandRegistry,child:new bI({completionBuilder:this.widget.completionBuilder,child:new m5({controller:this.toastController,child:new i4({actions:this.buildActions(),child:new Y5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[C1.ctrl("c"),new RG0],[C1.ctrl("o"),new PG0],[C1.alt("i"),new TG0],[C1.alt("p"),new wI],[C1.ctrl("."),new SG0],[C1.ctrl("t"),new xG0]]),child:new p4({debugLabel:"AppShellFocus",child:new y01({controller:this.toastController,child:new NA1({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new $A({children:X})})})})})})})})})})}buildActions(){let A=new p1(()=>{if(MJ.hasAnyCopyableSelection())return MJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new p1(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new p1(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new p1(()=>{return this.startNewDraftThread(),"handled"}),J=new p1(()=>{return I4.instance.stop(),"handled"}),Y=new p1((V)=>{if(!V.text)return"ignored";return I4.instance.tuiInstance.clipboard.writeText(V.text).then((U)=>{if(U.ok)this.toastController.show(V.successMessage,"success",2000);else this.toastController.show(`${V.failureMessage}: ${U.userFacingErrorMessage}`,"error",4000)}).catch((U)=>{j.error("Failed to copy Neo text to clipboard",{error:U}),this.toastController.show(V.failureMessage,"error",2000)}),"handled"}),Z=new p1(()=>{return I4.instance.toggleFrameStatsOverlay(),"handled"}),F=new p1(()=>this.notices.dismissCurrent()?"handled":"ignored"),X=new p1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),D=Tn4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,neoContext:this.widget.neoContext,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),G=new p1(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[RG0,A],[Fs,$],[jf,J],[m9,Y],[Gs,B],[PG0,Q],[TG0,X],[SG0,F],...D,[wI,Z],[xG0,G]])}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 px(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=AD0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return eX0(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=Ls4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(cZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=Ls4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(fI);if(this.exitHintTimer.isActive())A.add(wf);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),I4.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")I4.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(T30);if(Y)this.widget.history.add(Y.text,Ms4.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};$B((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=SY0(this.ideStatus.getValue());if($===void 0){A.client.sendUserMessage(Q,B,{userState:J});return}A.client.sendUserMessage(Q,B,{reasoningEffort:$,userState:J})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};appendPluginMessagesToThread=async(A,Q)=>{let B=this.activeThreadContext;if(!B)throw Error("appendToThread is not available - no active thread");let $=B.client.getThreadId();if(Q&&$!==Q)throw Error("thread.append is only available for the active executor thread");for(let J of A)this.sendUserMessage(B,[{type:"text",text:J.content}])};async connectToExistingThread(A,Q={}){let B=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let $=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:(J)=>this.promptExecutorAlreadyConnected(J)});if(this.setActiveClient($),Q.recordNavigation&&B!==A)this.threadNavigationHistory.recordNavigation(B);if(Q.initialUserInput)this.sendUserMessage($,[{type:"text",text:Q.initialUserInput}])}catch($){if(j.error("Failed to load thread",{error:$,threadID:A}),this.toastController.show(`Failed to load ${A}: ${$ instanceof Error?$.message:String($)}`,"error",4000),Q.rethrowError)throw $}finally{this.setState(()=>{this.connectingToThreadID=null})}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q}}),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){j.error("Failed to connect to IDE",{error:Q});let B=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${B}`,"error",4000)}};dispose(){this.unregisterCommands?.(),this.unregisterCommands=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.neoWelcomeVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function Ls4(A,Q,B){let $={...A};for(let J of Wm5(Q,B)){if(!cZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function Wm5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}c4();function js4(A,Q,B,$){let J=Qk(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 sY(G,V),K=new b9(42),E=new WI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,E0.default(),K);E.layout(I1.tight(G,V)),E.paint(U,0,0);let z=U.getBuffer().getCells(),W=0;for(let _=0;_<V;_++)if(z[_].some((S)=>S.char!==" ")){W=_;break}let H=V-1;for(let _=V-1;_>=0;_--)if(z[_].some((S)=>S.char!==" ")){H=_;break}function q(_,S){if(!_)return"";if(_.type==="rgb"){let{r:T,g:x,b:h}=_.value;if(B.getColorDepth()>=24)return`\x1B[${S?38:48};2;${T};${x};${h}m`;let u=Sj(T,x,h);return`\x1B[${S?38:48};5;${u}m`}return""}let N=[];if(H>=W)for(let _=W;_<=H;_++){let S="";for(let T=0;T<G;T++){let x=z[_][T],h=x.char,u=q(x.style.fg,!0);S+=u+h+"\x1B[0m"}N.push(S)}let I=N.length,w=Math.max(I,D.length),L=Math.floor((w-I)/2),O=Math.floor((w-D.length)/2);for(let _=0;_<w;_++){let S=" ".repeat(G);if(_>=L&&_<L+I)S=N[_-L];let T=" ",x="";if(_>=O&&_<O+D.length)x=D[_-O];B.write(S+T+x+`
|
|
5800
|
+
`)),Y.push(new C("Details: ",new v({color:$.mutedForeground}))),Y.push(new C(A.costBreakdownURL,new v({color:B.app.link})));return new p({text:new C("",void 0,Y)})}function zm5(A,Q,B){let $=Em5(A,Q);if(!A.costBreakdownURL)return new RA({header:"Thread Cost",minWidth:80,maxWidth:100,onDismiss:B,child:$});let J=A.costBreakdownURL,Y=new p1(()=>{return i4.maybeInvoke(Q,new m9(J,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),Z=new p1(()=>{return aA(Q,J),"handled"});return new RA({header:"Thread Cost",minWidth:80,maxWidth:100,autofocus:!1,footer:[{keys:["Esc"],label:"close"},{keys:["o"],label:"open in browser"},{keys:["y"],label:"copy url"}],onDismiss:B,child:new i4({actions:new Map([[$51,Y],[J51,Z]]),child:new Y5({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[C1.key("o"),new J51],[C1.key("y"),new $51]]),child:new p4({autofocus:!0,debugLabel:"ThreadCostBody",child:$})})})})}function Cs4(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(zm5(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 Y51 extends T0{analyzeContextForThread;listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;initialThreadID;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;onThreadArchived;onActiveThreadChange;initialUserInput;getDefaultNewThreadVisibility;openThreadPickerOnStart;neoContext;constructor(A){super();this.analyzeContextForThread=A.analyzeContextForThread,this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.initialThreadID=A.initialThreadID,this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.neoContext=A.neoContext}createState(){return new Os4}}class Os4 extends _0{editorController=new T8;commandPalette=new Kr(this);commandRegistry=new KA1;toastController=new v01;exitHintTimer=new Ur(this,1000);ideStatus=new K2(this,{});threadNavigationHistory=new XA1;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;neoWelcomeVisible=!1;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;pluginIntegration=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};onSwitchThread=(A)=>{this.connectToExistingThread(A,{recordNavigation:!0})};sendFeedbackReport=async(A)=>pG0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await Gc4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Vc4({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 Uc4({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,(Q)=>this.setState(Q)),this.notices.startPolling(),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:Q,error:B})=>{if(j.error("Neo failed to connect to thread",{threadID:Q,error:B}),!Q)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe((Q)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(u30(Q.settings)))}),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput;if(this.widget.initialThreadID){let Q={};if(A)Q.initialUserInput=A;this.connectToExistingThread(this.widget.initialThreadID,Q)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new 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.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=I4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?En4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],$=[{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(J,Y,Z)=>{J.pushWithDismiss((F)=>sA1({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()}},Cs4({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 OA1({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 r61({toolboxes:this.widget.neoContext.toolboxes,onDismiss:Y}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(J,Y,Z)=>{try{await aA(Y,"https://ampcode.com/chronicle")}finally{Z()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{LJ(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 MA1({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 qA1({commands:I7.of(Y).commands,onDismiss:Z}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",keywords:["intro","onboarding","getting started"],status:{type:"enabled"},run:(J,Y,Z)=>{Z(),A.showNeoWelcome()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["about","release","build"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new RA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new p({text:new C(VD0({version:"0.0.1778790766-g60d194",buildTimestamp:"2026-05-14T20:37:10.095Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:C1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{i4.maybeInvoke(Y,new jf)}},...Q,...An4(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 o61({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.widget.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:B,statusItems:this.pluginIntegration?.getStatusItems()??[],notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.neoWelcomeVisible?null:$,onDismissNotice:(G)=>this.notices.dismiss(G)}),Y=a1.of(A),Z=Y.capabilities.animationSupport!=="disabled",X=[new m0({constraints:I1.tight(Y.size.width,Y.size.height),child:J})];if(this.commandPalette.isEnabled())X.push(new a4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new EA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)X.push(sA1({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)X.push(new a4({debugLabel:"NeoWelcomeDialogOverlay",child:new B51({onDismiss:this.dismissNeoWelcome,onQuit:()=>I4.instance.stop(),animationsEnabled:Z,variant:this.widget.neoWelcomeVariant})}));let D=this.executorAlreadyConnectedDialog;if(D)X.push(new a4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new wA1({existingExecutorPid:D.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(X.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)X.push(new IA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:Ms4.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)X.push(new CA1);if($&&this.activeThreadContext&&!this.neoWelcomeVisible)X.push(Qn4($,()=>this.notices.dismiss($.key)));return new f3({neoContext:this.widget.neoContext,child:new I7({commandRegistry:this.commandRegistry,child:new bI({completionBuilder:this.widget.completionBuilder,child:new m5({controller:this.toastController,child:new i4({actions:this.buildActions(),child:new Y5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[C1.ctrl("c"),new RG0],[C1.ctrl("o"),new PG0],[C1.alt("i"),new TG0],[C1.alt("p"),new wI],[C1.ctrl("."),new SG0],[C1.ctrl("t"),new xG0]]),child:new p4({debugLabel:"AppShellFocus",child:new y01({controller:this.toastController,child:new NA1({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new $A({children:X})})})})})})})})})})}buildActions(){let A=new p1(()=>{if(MJ.hasAnyCopyableSelection())return MJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new p1(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new p1(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new p1(()=>{return this.startNewDraftThread(),"handled"}),J=new p1(()=>{return I4.instance.stop(),"handled"}),Y=new p1((V)=>{if(!V.text)return"ignored";return I4.instance.tuiInstance.clipboard.writeText(V.text).then((U)=>{if(U.ok)this.toastController.show(V.successMessage,"success",2000);else this.toastController.show(`${V.failureMessage}: ${U.userFacingErrorMessage}`,"error",4000)}).catch((U)=>{j.error("Failed to copy Neo text to clipboard",{error:U}),this.toastController.show(V.failureMessage,"error",2000)}),"handled"}),Z=new p1(()=>{return I4.instance.toggleFrameStatsOverlay(),"handled"}),F=new p1(()=>this.notices.dismissCurrent()?"handled":"ignored"),X=new p1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),D=Tn4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,neoContext:this.widget.neoContext,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),G=new p1(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[RG0,A],[Fs,$],[jf,J],[m9,Y],[Gs,B],[PG0,Q],[TG0,X],[SG0,F],...D,[wI,Z],[xG0,G]])}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 px(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=AD0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return eX0(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=Ls4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(cZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=Ls4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(fI);if(this.exitHintTimer.isActive())A.add(wf);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),I4.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")I4.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(T30);if(Y)this.widget.history.add(Y.text,Ms4.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};$B((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=SY0(this.ideStatus.getValue());if($===void 0){A.client.sendUserMessage(Q,B,{userState:J});return}A.client.sendUserMessage(Q,B,{reasoningEffort:$,userState:J})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};appendPluginMessagesToThread=async(A,Q)=>{let B=this.activeThreadContext;if(!B)throw Error("appendToThread is not available - no active thread");let $=B.client.getThreadId();if(Q&&$!==Q)throw Error("thread.append is only available for the active executor thread");for(let J of A)this.sendUserMessage(B,[{type:"text",text:J.content}])};async connectToExistingThread(A,Q={}){let B=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let $=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:(J)=>this.promptExecutorAlreadyConnected(J)});if(this.setActiveClient($),Q.recordNavigation&&B!==A)this.threadNavigationHistory.recordNavigation(B);if(Q.initialUserInput)this.sendUserMessage($,[{type:"text",text:Q.initialUserInput}])}catch($){if(j.error("Failed to load thread",{error:$,threadID:A}),this.toastController.show(`Failed to load ${A}: ${$ instanceof Error?$.message:String($)}`,"error",4000),Q.rethrowError)throw $}finally{this.setState(()=>{this.connectingToThreadID=null})}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q}}),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){j.error("Failed to connect to IDE",{error:Q});let B=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${B}`,"error",4000)}};dispose(){this.unregisterCommands?.(),this.unregisterCommands=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.neoWelcomeVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function Ls4(A,Q,B){let $={...A};for(let J of Wm5(Q,B)){if(!cZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function Wm5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}c4();function js4(A,Q,B,$){let J=Qk(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 sY(G,V),K=new b9(42),E=new WI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,E0.default(),K);E.layout(I1.tight(G,V)),E.paint(U,0,0);let z=U.getBuffer().getCells(),W=0;for(let _=0;_<V;_++)if(z[_].some((S)=>S.char!==" ")){W=_;break}let H=V-1;for(let _=V-1;_>=0;_--)if(z[_].some((S)=>S.char!==" ")){H=_;break}function q(_,S){if(!_)return"";if(_.type==="rgb"){let{r:T,g:x,b:h}=_.value;if(B.getColorDepth()>=24)return`\x1B[${S?38:48};2;${T};${x};${h}m`;let u=Sj(T,x,h);return`\x1B[${S?38:48};5;${u}m`}return""}let N=[];if(H>=W)for(let _=W;_<=H;_++){let S="";for(let T=0;T<G;T++){let x=z[_][T],h=x.char,u=q(x.style.fg,!0);S+=u+h+"\x1B[0m"}N.push(S)}let I=N.length,w=Math.max(I,D.length),L=Math.floor((w-I)/2),O=Math.floor((w-D.length)/2);for(let _=0;_<w;_++){let S=" ".repeat(G);if(_>=L&&_<L+I)S=N[_-L];let T=" ",x="";if(_>=O&&_<O+D.length)x=D[_-O];B.write(S+T+x+`
|
|
5801
5801
|
`)}if($)B.write(`
|
|
5802
5802
|
\x1B[90m${$}\x1B[0m
|
|
5803
5803
|
`)}d0();XD0();var Hm5=2000,qm5="Agent is ready",Nm5="Waiting for approval";function Rs4(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<Hm5)return;if(J=W,hj())return;if(FX0())XX0();else HZ0(z)},Z=(z)=>{if(!Q||!B)return;if(hj()&&!Jr()&&!Sx())return;process.stdout.write(gD(`\x1B]777;notify;Amp;${z}\x1B\\`))},F=()=>{Y("idle"),Z(qm5)},X=()=>{Y("requires-user-input"),Z(Nm5)},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&&oQ(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 Im5({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 wm5(A){await $B((Q)=>dx(Q,A,"interactive"))}async function Ps4(A,Q={}){let{initialThreadID:B,initialUserInput:$,getDefaultNewThreadVisibility:J,openThreadPickerOnStart:Y=!1,observerOnly:Z=!1,initialAgentMode:F,initialReasoningEffort:X,showNeoWelcome:D=!1,hideNeoWelcome:G=!1,neoWelcomeVariant:V="intro"}=Q,U=V==="npm-migration",K=async(S)=>{let T=await A.getThreadFromServer(S);if(!T)return null;return iF0(T)},E=async(S)=>{let T=await A.getThreadFromServer(S);if(!T)throw Error(`Thread ${S} not found`);let x=await v9(S,A.configService,A.apiKey,{usesThreadActors:!0}),k=await jU({endpoint:A.rivetEndpoint,poolName:x.poolName}).threadActor.getOrCreate([S],{params:{wsToken:x.wsToken},createWithInput:{threadId:x.threadId,threadVersion:x.threadVersion,ownerUserId:x.ownerUserId,...x.agentMode?{agentMode:x.agentMode}:{}}}).fetch("/import",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({thread:gx4(T)}),skipReadyWait:!0});if(!k.ok&&k.status!==409)throw Error(`Thread import failed (${k.status}): ${await k.text()}`);try{await Kv4(S,A.configService,A.apiKey,{executorType:"local-client"})}catch(f){j.warn("failed to mark thread as imported on server",{threadID:S,error:f instanceof Error?f.message:String(f)})}},z=new Z01(A.rivetEndpoint,A.apiKey,A.configService,{clientID:AI.parse(`neo-${crypto.randomUUID()}`),toolService:A.toolService,skillService:A.skillService,requestPluginToolCall:(S)=>A.pluginService.event.toolCall(S),requestPluginToolResult:(S)=>A.pluginService.event.toolResult(S),pluginService:A.pluginService,invokeTool:async(S,T)=>{let x=typeof T.args==="object"&&T.args!==null?T.args:{},h=await JI({toolName:T.toolName,configService:A.configService,toolService:A.toolService,mcpService:A.mcpService,skillService:A.skillService,toolUseID:T.toolCallId,threadId:S});return A.toolService.invokeTool(T.toolName,{args:x},h)},persistLastThreadID:wm5,readFileSystemDirectory:A.readFileSystemDirectory},K,E),W=await gz(),H=Im5({initialUserInput:$,showNeoWelcome:D,hideNeoWelcome:G,neoWelcomeVariant:V,neoWelcomeDismissed:W.neoWelcomeDismissed}),q={ampURL:A.ampURL,configService:A.configService,getThreadMarkdown:async(S)=>{let T=await A.getThreadFromServer(S);return T?yV(T):null},isInternalUser:A.isInternalUser,listThreads:A.listThreads,logFilePath:aa,mcpServers:A.mcpService.servers,pluginPlatform:A.pluginPlatform,pluginService:A.pluginService,toolboxes:A.toolboxes,observerOnly:U?!1:Z,sessionAgentMode:F??W.agentMode,explicitReasoningEffort:X,lastReasoningEffortByMode:W.lastReasoningEffortByMode,lastSpeedByMode:W.lastSpeedByMode,settingsFilePath:A.settingsFilePath,splashOrbVisualStyle:Q.splashOrbVisualStyle??"neo",workspaceRoot:A.workspaceRoot},N=(S,T)=>{return Zx({ampURL:A.ampURL,configService:A.configService,threadID:S,signal:T})},I=(S,T)=>{return Gg4({ampURL:A.ampURL,configService:A.configService,threadID:S,signal:T})},w=new j01,L=Rs4({configService:A.configService}),O=await A.configService.getLatest();I4.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:O.settings["terminal.animation"]===!1}});let _=new Set;try{await Yr(new Y51({clientPool:z,analyzeContextForThread:N,listSkillsForThread:I,completionBuilder:A.completionBuilder,history:new Eo,ideManager:w,configService:A.configService,initialThreadID:U?void 0:B,notificationService:L,initialUserInput:U?void 0:$,getDefaultNewThreadVisibility:J,openThreadPickerOnStart:U?!1:Y,neoContext:q,showNeoWelcome:H.show,neoWelcomeVariant:V,onActiveThreadChange:A.setActiveThreadID,onNeoWelcomeDismissed:H.markDismissedOnDismiss?()=>{$B(Eg4).catch((T)=>{j.warn("Failed to mark Neo welcome as dismissed",{error:T})})}:void 0,onThreadArchived:(T)=>{_.add(T)}}));let S=z.lastActiveObservingClient;if(S){let{client:T,observer:x}=S,h=T.getThreadId();if(h){let u={id:h,title:x.title().getValue(),agentMode:x.agentMode,archived:_.has(h)},k=`${A.ampURL.replace(/\/$/,"")}/threads/${h}`;js4(u,k,process.stdout)}}}finally{process.stdout.write(KI("")),L.unsubscribe(),z.dispose(),await A.dispose?.()}process.exit(0)}H3();function pf(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 _s4(A){if(A.visibility!=="private")return!0;if("shareWithAllCreatorGroups"in A&&A.shareWithAllCreatorGroups)return!0;return"sharedGroupIDs"in A&&A.sharedGroupIDs.length>0}function HR(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 jV0(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 df(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=pf({workspace:Q?.team??void 0}).filter((Y)=>!Y.disabledReason).map((Y)=>jV0(Y.meta));if(J.includes(B))return Cm5(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.
|
|
@@ -7556,7 +7556,7 @@ ${J}`,Q);this.line=B,this.column=$,this.codeblock=J}}/*!
|
|
|
7556
7556
|
`),Y=[];for(let Z=0;Z<J.length;Z++){let D=J[Z].replace(/\b(SELECT|FROM|WHERE|GROUP BY|ORDER BY|HAVING|LIMIT|JOIN|LEFT JOIN|RIGHT JOIN|INNER JOIN|ON|AND|OR|AS|IN|NOT|NULL|IS|BETWEEN|LIKE|EXISTS|UNION|DISTINCT|COUNT|SUM|AVG|MIN|MAX|DATE|TIMESTAMP_TRUNC|TIMESTAMP_SUB|CURRENT_TIMESTAMP|INTERVAL|CASE|WHEN|THEN|ELSE|END|WITH|INSERT|UPDATE|DELETE|SET|VALUES|INTO|CREATE|ALTER|DROP|TRUE|FALSE|ASC|DESC)\b/gi,"\x00$1\x01").split(/(\x00[^\x01]+\x01)/);for(let G of D)if(G.startsWith("\x00")&&G.endsWith("\x01"))Y.push(new C(G.slice(1,-1),new v({color:$.app.keybind,bold:!0})));else Y.push(new C(G,new v({color:B.colorScheme.foreground})));if(Z<J.length-1)Y.push(new C(`
|
|
7557
7557
|
`))}return new m0({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 E31 extends U8{chartData;highlightIndex;showAxes;colors;constructor({key:A,chartData:Q,highlightIndex:B=null,showAxes:$=!0,colors:J=mU0}){super(A?{key:A}:{});this.chartData=Q,this.highlightIndex=B,this.showAxes=$,this.colors=J}createRenderObject(){return new U31({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 Q1A(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 fn5(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 bn5(A){let Q=0;for(let B of A)for(let $ of B.points)if($.value>Q)Q=$.value;return Q||1}function un5(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 hn5(A,Q,B,$,J,Y,Z){let F;try{let E=O1.of(A),z=P0.of(A);F={foreground:E.colorScheme.foreground,background:E.colorScheme.background,border:z.app.keybind}}catch{F={foreground:{type:"index",value:15},background:{type:"index",value:0},border:{type:"index",value:7}}}let X=new v({color:F.foreground,bold:!0}),D=new v({color:F.foreground}),G=new v({color:F.foreground,dim:!0}),V=[],U=new v({color:F.foreground,underline:!0}),K=(E,z)=>new C(z,U,void 0,xz(E),()=>{aA(A,E)});if($.length<=1){if(V.push(new C(`${Q.label}: `,X)),Q.link)V.push(K(Q.link,Y(Q.value)));else V.push(new C(Y(Q.value),D));if(Q.meta)V.push(new C(` (${Q.meta})`,G))}else{let E=Z==="stacked-bar"||Z==="stacked-area";V.push(new C(`${Q.label}
|
|
7558
7558
|
`,X));let z=0;for(let W=0;W<$.length;W++){let H=$[W],q=H.points[B];if(!q)continue;z+=q.value;let N=H.color??J[W%J.length]??F.foreground;if(V.push(new C("● ",new v({color:N}))),V.push(new C(`${H.name}: `,G)),q.link)V.push(K(q.link,Y(q.value)));else V.push(new C(Y(q.value),D));if(W<$.length-1||E)V.push(new C(`
|
|
7559
|
-
`))}if(E)V.push(new C(" ",G)),V.push(new C("Total: ",G)),V.push(new C(Y(z),D))}return new m0({decoration:{color:F.background,border:d1.all(new c1(F.border,1,"rounded"))},child:new p({text:new C(void 0,void 0,V)})})}d0();function B1A(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}H3();T3();Y3();l7();u7();A7();A2();TQ();vV();c4();iS();wT();L1();d0();A7();class z31{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.1778790531-gba894e"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await y30(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 T0{props;constructor(A){super();this.props=A}createState(){return new $1A}}class $1A extends _0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(A){let Q=(B)=>{this.setState(()=>{this._state=B(this._state)})};return this.widget.props.builder(A,Q,this._state)}}class J1A extends _0{controller=new T8;focusNode=new V6({debugLabel:"CommandArgumentPrompt",onKey:(A)=>{if(A.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,J=this.widget.props.isRequiredArg??!0,Y=this.controller.text.trim().length>0,Z=!J||Y,F=d1.all(new c1(B.foreground,1,"solid")),X=new J$({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(K)=>{let E=K.trim();if(J&&E.length===0)return;this.widget.props.onSubmit(E)},autofocus:!0,style:{textColor:B.foreground,border:null},maxLines:1}),D=new s0({children:[new m0({decoration:{color:B.background},child:new p({text:new C(">",new v({color:B.foreground}))})}),new _1({child:X})]}),G=new m0({padding:K0.symmetric(1,0),child:new p({text:this.widget.props.title?new C(this.widget.props.title,new v({color:$.command,bold:!0})):new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new C("Enter",new v({color:$.keybind}))),V.push(new C(" to submit, ",new v({color:B.foreground,dim:!0})));V.push(new C("Esc",new v({color:$.keybind}))),V.push(new C(" to cancel",new v({color:B.foreground,dim:!0})));let U=new m0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,V)})});return new m0({decoration:{border:F,color:B.background},padding:K0.all(1),child:new y0({children:[G,new U0({height:1}),D,new Z5,U]})})}}class es extends T0{props;constructor(A){super();this.props=A}createState(){return new J1A}}TQ();class Y1A extends _0{controller=new T8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new V6({debugLabel:"CommandMultilinePrompt",onKey:(A)=>{if(A.key==="Escape"){if(this.isConfirmingClearInput){if(this.controller.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[],this.imagePaths=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.controller.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return this.widget.props.onDismiss(),"handled"}return"ignored"}});initState(){if(this.widget.props.initialText)this.controller.text=this.widget.props.initialText;if(this.widget.props.initialImages)this.imageAttachments=[...this.widget.props.initialImages];this.focusNode.requestFocus()}_handleInsertImage=async(A)=>{if(this.imageAttachments.length>=$7)return!1;let Q=await QX(A);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,A]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,Y=a1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new QG({controller:this.controller,triggers:[new TJ],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:I4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),X=new p4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),D=new m0({constraints:new I1({maxHeight:Z}),padding:K0.symmetric(1,0),child:X}),G=new m0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=new m0({padding:K0.symmetric(1,0),child:new p({text:this.isConfirmingClearInput?new C("",void 0,[new C("Esc",new v({color:$.keybind})),new C(" again to clear input",new v({color:B.foreground,dim:!0}))]):new C("",void 0,[new C("Press ",new v({color:B.foreground,dim:!0})),new C("Enter",new v({color:$.keybind})),new C(" to submit, ",new v({color:B.foreground,dim:!0})),new C("Esc",new v({color:$.keybind})),new C(" to clear",new v({color:B.foreground,dim:!0}))])})}),U=[G,new U0({height:1}),new _1({child:D}),new U0({height:1}),V];return new m0({decoration:{border:d1.all(new c1(B.foreground,1,"solid")),color:B.background},padding:K0.all(1),child:new y0({children:U})})}}class W31 extends T0{props;constructor(A){super();this.props=A}createState(){return new Y1A}}function Z1A(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 H31 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)=>Z1A(J.pubDate).length));return new X5({items:Q,getLabel:(J)=>J.title,onAccept:(J)=>this.props.onSelect?.(J),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(J,Y,Z,F)=>{let X=P0.of(F),{colors:D}=X,G=X.app,V=Y?G.selectionBackground:void 0,U=Y?G.selectionForeground:D.foreground,K=D.mutedForeground,E=(z,W)=>new U0({width:W,child:s0.end([new p({text:new C(z,new v({color:K}))})])});return new m0({decoration:V?{color:V}:void 0,padding:K0.symmetric(2,0),child:new s0({children:[new _1({child:new p({text:new C(J.title,new v({color:U})),overflow:"ellipsis",maxLines:1})}),new U0({width:2}),E(Z1A(J.pubDate),B)]})})}})}}class zB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!zB._instance)zB._instance=new zB;return zB._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 F1A extends _0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let A=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!A.ok){j.error("Failed to load labels",A.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=A.result,this.isLoading=!1,this.setState()}catch(A){j.error("Failed to load labels",A),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(A){let Q=A.trim().toLowerCase();if(Q.length===0)return null;if(Q.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Q))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(A){return this.getValidationError(A)===null&&A.length>0}getAvailableLabels(){let A=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!A.includes(Q.name))}shouldShowCreateMarker(A){if(A.length===0||this.isLoading)return!1;let Q=A.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let B=this.widget.props.currentLabels||[],$=this.labels.some((Y)=>Y.name===Q),J=B.includes(Q);return!$&&!J}build(A){let Q=P0.of(A),{app:B,colors:$}=Q,J=this.currentQuery.trim().toLowerCase(),Y=J.length>0?this.getValidationError(J):null,Z=this.getAvailableLabels(),X=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...Z];return new X5({title:"Add Label",items:X,getLabel:(D)=>{if("__isCreateMarker"in D)return this.currentQuery.trim().toLowerCase();return D.name},onAccept:(D)=>{if("__isCreateMarker"in D)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(D.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:Y||"Type to create a new label",renderItem:(D,G,V,U)=>{let K=G?B.selectionBackground:void 0,E=G?B.selectionForeground:$.foreground;if("__isCreateMarker"in D&&D.__isCreateMarker){let W=this.currentQuery.trim().toLowerCase();return new m0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C("",void 0,[new C("Create new label: ",new v({color:E})),new C(W,new v({color:E,bold:!0}))])})})}return new m0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C(D.name,new v({color:E}))})})},filterItem:(D,G)=>{if(this.currentQuery!==G)this.currentQuery=G,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in D&&D.__isCreateMarker)return this.shouldShowCreateMarker(G);let U=G.trim().toLowerCase();return U.length===0||D.name.includes(U)},sortItems:(D,G,V)=>{let U="__isCreateMarker"in D.item&&D.item.__isCreateMarker,K="__isCreateMarker"in G.item&&G.item.__isCreateMarker;if(U&&!K)return-1;if(!U&&K)return 1;return G.score-D.score}})}}class q31 extends T0{props;constructor(A){super();this.props=A}createState(){return new F1A}}class JG extends T0{props;constructor(A){super();this.props=A}createState(){return new X1A}}class X1A extends _0{_spinner=new H6;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,J=d1.all(new c1(B.foreground,1,"solid")),Y=this._spinner.toBraille(),Z=new p({textAlign:"center",text:new C("",void 0,[new C(Y,new v({color:$.processing})),new C(" ",void 0),new C(this.widget.props.message,new v({color:B.foreground}))])}),X=[new _1({child:new y0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)X.push(new U0({height:2,child:new m0({padding:K0.symmetric(2,0),child:new p({text:new C("",new v({dim:!0}),[new C("Press ",new v({color:B.foreground})),new C("Esc",new v({color:B.info})),new C(" to cancel",new v({color:B.foreground}))])})})}));let D=new m0({decoration:new T4(B.background,J),child:new U0({width:60,height:7,child:new y0({mainAxisAlignment:"start",children:X})})});if(this.widget.props.onAbort)return new a4({debugLabel:"LoadingDialog",child:new p4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:D})});return D}}class tU extends T0{props;constructor(A){super();this.props=A}createState(){return new D1A}}class D1A extends _0{scrollController=new xA;scrollAreaKey=new G2("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof u2}resolveFooterStyle(A){if(this.isWidgetMessage(A))return A.footerStyle;return"default"}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let B=Q.size;if(typeof B.height==="number"&&B.height>0)return this.viewportHeight=B.height,B.height}return this.viewportHeight}build(A){let Q=P0.of(A),B=this.widget.props.message,$=(()=>{if(this.isWidgetMessage(B))return{title:B.title,type:B.type};if(B instanceof Error&&B.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:B.message};if(B instanceof Error&&B.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:B.message};let G=mD0(B);return{title:G.title,type:G.type,description:G.description}})(),J=$.type==="error"?Q.app.toolError:Q.app.command,Y=d1.all(new c1(Q.colors.border,1,"solid")),Z=new m0({padding:K0.symmetric(1,0),child:new p({text:new C($.title,new v({color:J,bold:!0}))})}),F=this.isWidgetMessage(B)?B.widget:new p({text:new C($.description,new v({color:Q.colors.foreground})),selectable:!0}),X=new _1({child:new X3({child:new m0({padding:K0.symmetric(1,0),child:new s0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new _1({child:new fA({controller:this.scrollController,autofocus:!0,child:F})}),new z2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,V=this.scrollController.offset,U=this.getViewportHeight(),K=G+U;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(V,0)}}})]})})})}),D=new m0({padding:K0.symmetric(1,0),child:new p({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new v({color:Q.colors.foreground,dim:!0})),new C("R",new v({color:Q.app.keybind})),new C(" to retry, ",new v({color:Q.colors.foreground,dim:!0})),new C("Esc",new v({color:Q.app.keybind})),new C(" to cancel",new v({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new C("",new v({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new v({color:Q.app.keybind}),U=new v({color:Q.colors.foreground,dim:!0});return new C("",U,[new C("Press ",U),new C("Escape",V),new C(" to close • Use ",U),new C("↑↓",V),new C(" or ",U),new C("j/k",V),new C(" to scroll",U)])}return new C("Press any key to close",new v({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new a4({debugLabel:"MessageDialog",child:new $A({fit:"expand",children:[new k1({onClick:()=>{},child:new U0}),new p4({onKey:(G)=>{if(this.widget.props.onRetry&&G.key==="r")return this.widget.props.onRetry(),"handled";if(G.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new m0({decoration:{border:Y,color:Q.colors.background},padding:K0.all(1),child:new y0({mainAxisAlignment:"center",children:[Z,new U0({height:1}),X,D]})})})]})})}}H3();e1();class G1A extends T0{props;constructor(A){super();this.props=A}createState(){return new V1A}}class V1A extends _0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((A)=>{this.plugins=A,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(A){let Q=r0.file(this.widget.props.cwd),B=Y1.relativePath(Q,TA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return v5(A)}statusIcon(A){let Q=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=P0.of(A),{app:B}=Q;if(this.plugins.length===0)return new p({text:new C("No plugins found.",new v({dim:!0}))});let $=[],J=this.plugins.length,Y=this.plugins.filter((X)=>X.status==="active").length,Z=this.plugins.reduce((X,D)=>X+D.registeredCommands.length,0),F=this.plugins.reduce((X,D)=>X+D.registeredTools.length,0);if($.push(new C(`${Y}/${J} ${D4(J,"plugin")} active`,new v({bold:!0}))),Z>0||F>0)$.push(new C(` (${Z} ${D4(Z,"command")}, ${F} ${D4(F,"tool")})`,new v({dim:!0})));$.push(new C(`
|
|
7559
|
+
`))}if(E)V.push(new C(" ",G)),V.push(new C("Total: ",G)),V.push(new C(Y(z),D))}return new m0({decoration:{color:F.background,border:d1.all(new c1(F.border,1,"rounded"))},child:new p({text:new C(void 0,void 0,V)})})}d0();function B1A(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}H3();T3();Y3();l7();u7();A7();A2();TQ();vV();c4();iS();wT();L1();d0();A7();class z31{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.1778790766-g60d194"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await y30(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 T0{props;constructor(A){super();this.props=A}createState(){return new $1A}}class $1A extends _0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(A){let Q=(B)=>{this.setState(()=>{this._state=B(this._state)})};return this.widget.props.builder(A,Q,this._state)}}class J1A extends _0{controller=new T8;focusNode=new V6({debugLabel:"CommandArgumentPrompt",onKey:(A)=>{if(A.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,J=this.widget.props.isRequiredArg??!0,Y=this.controller.text.trim().length>0,Z=!J||Y,F=d1.all(new c1(B.foreground,1,"solid")),X=new J$({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(K)=>{let E=K.trim();if(J&&E.length===0)return;this.widget.props.onSubmit(E)},autofocus:!0,style:{textColor:B.foreground,border:null},maxLines:1}),D=new s0({children:[new m0({decoration:{color:B.background},child:new p({text:new C(">",new v({color:B.foreground}))})}),new _1({child:X})]}),G=new m0({padding:K0.symmetric(1,0),child:new p({text:this.widget.props.title?new C(this.widget.props.title,new v({color:$.command,bold:!0})):new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new C("Enter",new v({color:$.keybind}))),V.push(new C(" to submit, ",new v({color:B.foreground,dim:!0})));V.push(new C("Esc",new v({color:$.keybind}))),V.push(new C(" to cancel",new v({color:B.foreground,dim:!0})));let U=new m0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,V)})});return new m0({decoration:{border:F,color:B.background},padding:K0.all(1),child:new y0({children:[G,new U0({height:1}),D,new Z5,U]})})}}class es extends T0{props;constructor(A){super();this.props=A}createState(){return new J1A}}TQ();class Y1A extends _0{controller=new T8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new V6({debugLabel:"CommandMultilinePrompt",onKey:(A)=>{if(A.key==="Escape"){if(this.isConfirmingClearInput){if(this.controller.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[],this.imagePaths=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.controller.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return this.widget.props.onDismiss(),"handled"}return"ignored"}});initState(){if(this.widget.props.initialText)this.controller.text=this.widget.props.initialText;if(this.widget.props.initialImages)this.imageAttachments=[...this.widget.props.initialImages];this.focusNode.requestFocus()}_handleInsertImage=async(A)=>{if(this.imageAttachments.length>=$7)return!1;let Q=await QX(A);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,A]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,Y=a1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new QG({controller:this.controller,triggers:[new TJ],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:I4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),X=new p4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),D=new m0({constraints:new I1({maxHeight:Z}),padding:K0.symmetric(1,0),child:X}),G=new m0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=new m0({padding:K0.symmetric(1,0),child:new p({text:this.isConfirmingClearInput?new C("",void 0,[new C("Esc",new v({color:$.keybind})),new C(" again to clear input",new v({color:B.foreground,dim:!0}))]):new C("",void 0,[new C("Press ",new v({color:B.foreground,dim:!0})),new C("Enter",new v({color:$.keybind})),new C(" to submit, ",new v({color:B.foreground,dim:!0})),new C("Esc",new v({color:$.keybind})),new C(" to clear",new v({color:B.foreground,dim:!0}))])})}),U=[G,new U0({height:1}),new _1({child:D}),new U0({height:1}),V];return new m0({decoration:{border:d1.all(new c1(B.foreground,1,"solid")),color:B.background},padding:K0.all(1),child:new y0({children:U})})}}class W31 extends T0{props;constructor(A){super();this.props=A}createState(){return new Y1A}}function Z1A(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 H31 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)=>Z1A(J.pubDate).length));return new X5({items:Q,getLabel:(J)=>J.title,onAccept:(J)=>this.props.onSelect?.(J),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(J,Y,Z,F)=>{let X=P0.of(F),{colors:D}=X,G=X.app,V=Y?G.selectionBackground:void 0,U=Y?G.selectionForeground:D.foreground,K=D.mutedForeground,E=(z,W)=>new U0({width:W,child:s0.end([new p({text:new C(z,new v({color:K}))})])});return new m0({decoration:V?{color:V}:void 0,padding:K0.symmetric(2,0),child:new s0({children:[new _1({child:new p({text:new C(J.title,new v({color:U})),overflow:"ellipsis",maxLines:1})}),new U0({width:2}),E(Z1A(J.pubDate),B)]})})}})}}class zB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!zB._instance)zB._instance=new zB;return zB._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 F1A extends _0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let A=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!A.ok){j.error("Failed to load labels",A.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=A.result,this.isLoading=!1,this.setState()}catch(A){j.error("Failed to load labels",A),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(A){let Q=A.trim().toLowerCase();if(Q.length===0)return null;if(Q.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Q))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(A){return this.getValidationError(A)===null&&A.length>0}getAvailableLabels(){let A=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!A.includes(Q.name))}shouldShowCreateMarker(A){if(A.length===0||this.isLoading)return!1;let Q=A.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let B=this.widget.props.currentLabels||[],$=this.labels.some((Y)=>Y.name===Q),J=B.includes(Q);return!$&&!J}build(A){let Q=P0.of(A),{app:B,colors:$}=Q,J=this.currentQuery.trim().toLowerCase(),Y=J.length>0?this.getValidationError(J):null,Z=this.getAvailableLabels(),X=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...Z];return new X5({title:"Add Label",items:X,getLabel:(D)=>{if("__isCreateMarker"in D)return this.currentQuery.trim().toLowerCase();return D.name},onAccept:(D)=>{if("__isCreateMarker"in D)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(D.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:Y||"Type to create a new label",renderItem:(D,G,V,U)=>{let K=G?B.selectionBackground:void 0,E=G?B.selectionForeground:$.foreground;if("__isCreateMarker"in D&&D.__isCreateMarker){let W=this.currentQuery.trim().toLowerCase();return new m0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C("",void 0,[new C("Create new label: ",new v({color:E})),new C(W,new v({color:E,bold:!0}))])})})}return new m0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C(D.name,new v({color:E}))})})},filterItem:(D,G)=>{if(this.currentQuery!==G)this.currentQuery=G,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in D&&D.__isCreateMarker)return this.shouldShowCreateMarker(G);let U=G.trim().toLowerCase();return U.length===0||D.name.includes(U)},sortItems:(D,G,V)=>{let U="__isCreateMarker"in D.item&&D.item.__isCreateMarker,K="__isCreateMarker"in G.item&&G.item.__isCreateMarker;if(U&&!K)return-1;if(!U&&K)return 1;return G.score-D.score}})}}class q31 extends T0{props;constructor(A){super();this.props=A}createState(){return new F1A}}class JG extends T0{props;constructor(A){super();this.props=A}createState(){return new X1A}}class X1A extends _0{_spinner=new H6;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,J=d1.all(new c1(B.foreground,1,"solid")),Y=this._spinner.toBraille(),Z=new p({textAlign:"center",text:new C("",void 0,[new C(Y,new v({color:$.processing})),new C(" ",void 0),new C(this.widget.props.message,new v({color:B.foreground}))])}),X=[new _1({child:new y0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)X.push(new U0({height:2,child:new m0({padding:K0.symmetric(2,0),child:new p({text:new C("",new v({dim:!0}),[new C("Press ",new v({color:B.foreground})),new C("Esc",new v({color:B.info})),new C(" to cancel",new v({color:B.foreground}))])})})}));let D=new m0({decoration:new T4(B.background,J),child:new U0({width:60,height:7,child:new y0({mainAxisAlignment:"start",children:X})})});if(this.widget.props.onAbort)return new a4({debugLabel:"LoadingDialog",child:new p4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:D})});return D}}class tU extends T0{props;constructor(A){super();this.props=A}createState(){return new D1A}}class D1A extends _0{scrollController=new xA;scrollAreaKey=new G2("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof u2}resolveFooterStyle(A){if(this.isWidgetMessage(A))return A.footerStyle;return"default"}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let B=Q.size;if(typeof B.height==="number"&&B.height>0)return this.viewportHeight=B.height,B.height}return this.viewportHeight}build(A){let Q=P0.of(A),B=this.widget.props.message,$=(()=>{if(this.isWidgetMessage(B))return{title:B.title,type:B.type};if(B instanceof Error&&B.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:B.message};if(B instanceof Error&&B.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:B.message};let G=mD0(B);return{title:G.title,type:G.type,description:G.description}})(),J=$.type==="error"?Q.app.toolError:Q.app.command,Y=d1.all(new c1(Q.colors.border,1,"solid")),Z=new m0({padding:K0.symmetric(1,0),child:new p({text:new C($.title,new v({color:J,bold:!0}))})}),F=this.isWidgetMessage(B)?B.widget:new p({text:new C($.description,new v({color:Q.colors.foreground})),selectable:!0}),X=new _1({child:new X3({child:new m0({padding:K0.symmetric(1,0),child:new s0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new _1({child:new fA({controller:this.scrollController,autofocus:!0,child:F})}),new z2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,V=this.scrollController.offset,U=this.getViewportHeight(),K=G+U;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(V,0)}}})]})})})}),D=new m0({padding:K0.symmetric(1,0),child:new p({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new v({color:Q.colors.foreground,dim:!0})),new C("R",new v({color:Q.app.keybind})),new C(" to retry, ",new v({color:Q.colors.foreground,dim:!0})),new C("Esc",new v({color:Q.app.keybind})),new C(" to cancel",new v({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new C("",new v({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new v({color:Q.app.keybind}),U=new v({color:Q.colors.foreground,dim:!0});return new C("",U,[new C("Press ",U),new C("Escape",V),new C(" to close • Use ",U),new C("↑↓",V),new C(" or ",U),new C("j/k",V),new C(" to scroll",U)])}return new C("Press any key to close",new v({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new a4({debugLabel:"MessageDialog",child:new $A({fit:"expand",children:[new k1({onClick:()=>{},child:new U0}),new p4({onKey:(G)=>{if(this.widget.props.onRetry&&G.key==="r")return this.widget.props.onRetry(),"handled";if(G.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new m0({decoration:{border:Y,color:Q.colors.background},padding:K0.all(1),child:new y0({mainAxisAlignment:"center",children:[Z,new U0({height:1}),X,D]})})})]})})}}H3();e1();class G1A extends T0{props;constructor(A){super();this.props=A}createState(){return new V1A}}class V1A extends _0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((A)=>{this.plugins=A,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(A){let Q=r0.file(this.widget.props.cwd),B=Y1.relativePath(Q,TA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return v5(A)}statusIcon(A){let Q=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=P0.of(A),{app:B}=Q;if(this.plugins.length===0)return new p({text:new C("No plugins found.",new v({dim:!0}))});let $=[],J=this.plugins.length,Y=this.plugins.filter((X)=>X.status==="active").length,Z=this.plugins.reduce((X,D)=>X+D.registeredCommands.length,0),F=this.plugins.reduce((X,D)=>X+D.registeredTools.length,0);if($.push(new C(`${Y}/${J} ${D4(J,"plugin")} active`,new v({bold:!0}))),Z>0||F>0)$.push(new C(` (${Z} ${D4(Z,"command")}, ${F} ${D4(F,"tool")})`,new v({dim:!0})));$.push(new C(`
|
|
7560
7560
|
|
|
7561
7561
|
`));for(let X of this.plugins){let{icon:D,color:G}=this.statusIcon(X.status),V=this.getRelativePath(X.uri);if($.push(new C(`${D} `,new v({color:G}))),$.push(new C(V,new v({bold:!0}))),$.push(new C(` ${X.status}`,new v({dim:!0}))),$.push(new C(`
|
|
7562
7562
|
`)),X.status==="active"&&X.registeredEvents.length>0)$.push(new C(" Events: ",new v({dim:!0}))),$.push(new C(X.registeredEvents.join(", "),new v({color:B.link}))),$.push(new C(`
|
|
@@ -7734,7 +7734,7 @@ ${s.content||""}`:s.content||"",f0=[],g0=s.baseDir.startsWith("file://")?WK0(s.b
|
|
|
7734
7734
|
`)}function nAA(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=w04({settings:{url:Y.ampURL,proxy:Z},secrets:{getToken:(D,G)=>Y.secrets.get(D,G)}}),X=await r4.userDisplayBalanceInfo({},{config:F});if(!X.ok){if(X.error.code==="auth-required")process.stderr.write(a0.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(a0.red("Error: ")+X.error.message+`
|
|
7735
7735
|
`),process.exit(1)}process.stdout.write(await Js5(X.result.displayText)+`
|
|
7736
7736
|
`),process.exit(0)})}var j13=bt.join(h$,"logs","headless.log"),w91=bt.join(_x,"device-id.json"),R13=`cli-tui-${C8A(16).toString("hex")}`;async function P13(){for(let A of gM)try{if((await A.listConfigs()).length>0)return A}catch(Q){j.debug("Failed to detect query-based IDE integration",{ideName:A.ideName,error:Q})}return}try{if(process.platform==="win32")await Promise.resolve().then(() => v4(vb(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){WB.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
|
|
7737
|
-
`)}function _13(A){process.emitWarning=(Q,B,$,J)=>{let Y=typeof Q==="string"?Q:Q.message||String(Q),Z=B||"Warning",F=!1;A.warn(Y,{name:Z,code:$})}}function q2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")XY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")XY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)XY("internal.model",S13(Q.model))}function E8A(A){let Q=A.indexOf(":");if(Q===-1)throw new s1(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let B=A.slice(0,Q).trim(),$=A.slice(Q+1).trim();if(!B||!$)throw new s1(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function T13(A){if(A===void 0)return;let Q=A.trim();if(X04(Q))return Q;throw new s1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function k13(A,Q){if(C8(A,Q))return;let B=i$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new s1(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function S13(A){if(!A.includes("="))return E8A(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new s1(`Invalid mode-specific model entry "${$}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let Y=$.slice(0,J).trim(),Z=$.slice(J+1).trim();if(!Y)throw new s1(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new s1(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);E8A(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new s1("No valid model overrides found in --model flag value.",1);return Q}function v13(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 y13(A){try{return await M8A(A,"utf-8")}catch{return A}}async function C91(A,Q,B){let $=v13(A,Q);if(!$)return;let J=gA(B)?B.features:[],Y=gA(B)?B.user.email:void 0;if(!gt(J,kB.HARNESS_SYSTEM_PROMPT)&&!(Y&&f7(Y)))throw new s1("You are not allowed to do this.",1);XY("systemPrompt",await y13($))}function gt(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function x13(A){return A!=="pending"}function qW(A){if(!gA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function f13(A){let Q=qW(A);if(Q)return Q.id;if(gX(A))throw Error(A.error.message);throw Error("unreachable")}function b13(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 u13(A){let $=b13(A)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new s1(`Couldn't connect to the Amp server at ${A}.`,1,$)}function ut(A,Q){let B=Es0(Error(A.error.message));if(B.message===z7.networkOffline||B.message===z7.networkTimeout)return u13(Q);if(B.message!==z7.internalBug)return new s1(B.message,1,B.suggestion);return new s1(A.error.message.replace(/^Error: /,""),1)}async function h13(){if(process.versions.bun)return!1;try{return await kU()==="npm"}catch(A){return j.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var z8A=[{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??lF,description:`Custom settings file path (overrides the default location ${lF})`},{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 ${aa})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","new-ui"],hidden:!0,deprecated:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:G9(),description:(A)=>A?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration"},{name:"ide",long:"ide",type:"flag",default:!0,description:(A)=>A?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection"},{name:"interactive",long:"interactive",type:"flag",description:(A)=>A?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"mode",long:"mode",short:"m",type:"option",default:uM.SMART.key,description:`Set the agent mode (${c$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(c$().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}],W8A=(A)=>("deprecated"in A)&&A.deprecated===!0,g13=(A)=>("hidden"in A)&&A.hidden===!0,m13=(A)=>("default"in A),p13=(A)=>("default"in A)?A.default:void 0;function YE0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=T13(Q.effort);if(B!==void 0)k13(Q.mode,B);return B}function d13(A,Q){let B=Q.args[0],$=Q.commands.map((Y)=>Y.name());if(B&&!B.includes(" ")&&B.length<30&&!/[./\\]/.test(B)){let Y=$.filter((F)=>B.includes(F)||F.includes(B)),Z="Run amp --help for a list of available commands.";if(Y.length>0)Z=`Did you mean: ${Y.join(", ")}? Or run amp --help for all commands.`;throw new s1(z7.unknownCommand(B),1,Z)}}async function XE0(A){return{...A,getThreadEnvironment:yD,getEnvironmentData:(Q,B)=>ZD({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new ML(A.fileSystem),generateThreadTitle:CF4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>PQ(A.configService),pluginService:A.pluginService}}function L8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:yD,getEnvironmentData:(Q,B)=>ZD({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var ZE0=r0.file(O13.homedir()),M91=process.env.XDG_CONFIG_HOME?r0.file(process.env.XDG_CONFIG_HOME):Y1.joinPath(ZE0,".config");function c13(A){return rR4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(FX0())XX0();else HZ0(Q);let B=hj(),$=Jr();if((!B||$||Sx())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(gD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(gD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(hj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function x8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;ee1("0.0.
|
|
7737
|
+
`)}function _13(A){process.emitWarning=(Q,B,$,J)=>{let Y=typeof Q==="string"?Q:Q.message||String(Q),Z=B||"Warning",F=!1;A.warn(Y,{name:Z,code:$})}}function q2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")XY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")XY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)XY("internal.model",S13(Q.model))}function E8A(A){let Q=A.indexOf(":");if(Q===-1)throw new s1(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let B=A.slice(0,Q).trim(),$=A.slice(Q+1).trim();if(!B||!$)throw new s1(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function T13(A){if(A===void 0)return;let Q=A.trim();if(X04(Q))return Q;throw new s1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function k13(A,Q){if(C8(A,Q))return;let B=i$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new s1(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function S13(A){if(!A.includes("="))return E8A(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new s1(`Invalid mode-specific model entry "${$}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let Y=$.slice(0,J).trim(),Z=$.slice(J+1).trim();if(!Y)throw new s1(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new s1(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);E8A(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new s1("No valid model overrides found in --model flag value.",1);return Q}function v13(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 y13(A){try{return await M8A(A,"utf-8")}catch{return A}}async function C91(A,Q,B){let $=v13(A,Q);if(!$)return;let J=gA(B)?B.features:[],Y=gA(B)?B.user.email:void 0;if(!gt(J,kB.HARNESS_SYSTEM_PROMPT)&&!(Y&&f7(Y)))throw new s1("You are not allowed to do this.",1);XY("systemPrompt",await y13($))}function gt(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function x13(A){return A!=="pending"}function qW(A){if(!gA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function f13(A){let Q=qW(A);if(Q)return Q.id;if(gX(A))throw Error(A.error.message);throw Error("unreachable")}function b13(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 u13(A){let $=b13(A)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new s1(`Couldn't connect to the Amp server at ${A}.`,1,$)}function ut(A,Q){let B=Es0(Error(A.error.message));if(B.message===z7.networkOffline||B.message===z7.networkTimeout)return u13(Q);if(B.message!==z7.internalBug)return new s1(B.message,1,B.suggestion);return new s1(A.error.message.replace(/^Error: /,""),1)}async function h13(){if(process.versions.bun)return!1;try{return await kU()==="npm"}catch(A){return j.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var z8A=[{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??lF,description:`Custom settings file path (overrides the default location ${lF})`},{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 ${aa})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","new-ui"],hidden:!0,deprecated:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:G9(),description:(A)=>A?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration"},{name:"ide",long:"ide",type:"flag",default:!0,description:(A)=>A?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection"},{name:"interactive",long:"interactive",type:"flag",description:(A)=>A?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"mode",long:"mode",short:"m",type:"option",default:uM.SMART.key,description:`Set the agent mode (${c$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(c$().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}],W8A=(A)=>("deprecated"in A)&&A.deprecated===!0,g13=(A)=>("hidden"in A)&&A.hidden===!0,m13=(A)=>("default"in A),p13=(A)=>("default"in A)?A.default:void 0;function YE0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=T13(Q.effort);if(B!==void 0)k13(Q.mode,B);return B}function d13(A,Q){let B=Q.args[0],$=Q.commands.map((Y)=>Y.name());if(B&&!B.includes(" ")&&B.length<30&&!/[./\\]/.test(B)){let Y=$.filter((F)=>B.includes(F)||F.includes(B)),Z="Run amp --help for a list of available commands.";if(Y.length>0)Z=`Did you mean: ${Y.join(", ")}? Or run amp --help for all commands.`;throw new s1(z7.unknownCommand(B),1,Z)}}async function XE0(A){return{...A,getThreadEnvironment:yD,getEnvironmentData:(Q,B)=>ZD({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new ML(A.fileSystem),generateThreadTitle:CF4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>PQ(A.configService),pluginService:A.pluginService}}function L8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:yD,getEnvironmentData:(Q,B)=>ZD({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var ZE0=r0.file(O13.homedir()),M91=process.env.XDG_CONFIG_HOME?r0.file(process.env.XDG_CONFIG_HOME):Y1.joinPath(ZE0,".config");function c13(A){return rR4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(FX0())XX0();else HZ0(Q);let B=hj(),$=Jr();if((!B||$||Sx())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(gD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(gD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(hj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function x8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;ee1("0.0.1778790766-g60d194");let Y=g30({storage:A.settings,secretStorage:A.secrets,workspaceRoot:h0.of(r0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:ZE0,userConfigDir:M91});Jt4(Y);let Z=await Y.getLatest();j.debug("Global configuration initialized",{settingsKeys:Object.keys(Z.settings)});let F=!1;{let o=await A.secrets.get("apiKey",A.ampURL);if(F=Boolean(o),j.info("API key lookup before login",{found:Boolean(o),ampURL:A.ampURL,deferAuth:$}),!o)if($)j.info("No API key found, continuing startup with deferred auth");else{r6.write(`No API key found. Starting login flow...
|
|
7738
7738
|
`);let A0=await l13(A),I0=await A.secrets.get("apiKey",A.ampURL);if(j.info("Login flow completed",{success:A0,storedKeyPresent:Boolean(I0),ampURL:A.ampURL}),!A0)await _z(),process.exit(1);F=!0}}{let o=await Y.getLatest(),A0=o.settings.url,I0=o.secrets.isSet?.[A0];j.info("Config secrets state after login",{configURL:A0,apiKeySet:I0?.apiKey??!1})}let X=T1(PQ(Y).pipe(A5(x13))),D=$?"pending":await X;if(!$)j.info("Server status resolved",{status:"ready",isAuthenticated:gA(D),isError:gX(D),errorMessage:gX(D)?D.error.message:void 0});let G=X.then((o)=>f13(o));G.catch(()=>{return});let V=!Q.takeMeBack&&gA(D)&>(D.features,kB.THREAD_ACTORS_TUI),U=V?"all":process.env.PLUGINS??"permissions",{toolService:K,dispose:E}=lR4({configService:Y}),z=new Map,W=()=>z.clear(),H=new ef0(Y,A.settings.getWorkspaceRootPath()),q=rJ4({configService:Y,filesystem:v3}),N=h74({configService:Y,trustStore:H,skillMCPServers:q.skillMCPServers,uploadImageAttachments:V,createOAuthProvider:async(o,A0,I0)=>{let V0=`${o}:${A0}`,H0=z.get(V0);if(H0)return j.debug("Reusing existing OAuth provider for server",{serverName:o,serverUrl:A0}),H0;j.debug("Creating OAuth provider for server",{serverName:o,serverUrl:A0});let X0=(async()=>{let j0=new iM(A.secrets),Q0=await j0.getClientInfo(o,A0),O0=I0?.scopes??Q0?.scopes,n=sf4();j.info("OAuth headless mode check",{useHeadless:n,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:r6.isTTY});let a;if(n)a=A.executeMode?rf4():of4(o);let s=new Dv0({storage:j0,serverName:o,serverUrl:A0,clientId:I0?.clientId??Q0?.clientId,clientSecret:I0?.clientSecret??Q0?.clientSecret,authUrl:I0?.authUrl??Q0?.authUrl,tokenUrl:I0?.tokenUrl??Q0?.tokenUrl,scopes:O0,headlessAuthHandler:a});return j.debug("OAuth provider created",{serverName:o,serverUrl:A0,hasManualClientId:!!(I0?.clientId??Q0?.clientId),willUseDCR:!(I0?.clientId??Q0?.clientId),scopes:O0,headlessMode:n,executeMode:A.executeMode}),s})();return z.set(V0,X0),X0}}),I=Aa0({configService:Y,filesystem:v3,spawn:bY0}),w=Q.headless?fs4():void 0,L=w??new RV0({configService:Y}),O=L instanceof RV0?L:void 0;if(O)O.pluginExecutorKind="local";let _=new n1(null),S=V?[...hs4(Z.settings)?[{name:"permissions",entryPoint:D51}]:[],{name:"thread-visibility",entryPoint:ps4(Y,()=>X.then(qW)),alwaysLoad:!0}]:[],T=Hb0({configService:Y,fileSystem:v3,platform:L,loadGlobalPlugins:it0(Y),pluginFilter:U,activeThread$:_,internalPlugins:S}),x=hQ4(T),h=[N,I,x],u;if(J)u=new Map;else if(A.executeMode){let o=await wO4({toolService:K,providers:h,initialTimeout:15000});u=o.registrations;for(let[A0,I0]of o.initErrors)j.warn(`${A0} provider initialization slow or failed:`,I0)}else u=Qa0({toolService:K,providers:h});if(Q.jetbrains)vM("JetBrains");else if(Q.ide&&bb4())vM("VS Code");else if(Q.ide&&ub4())vM("Neovim");else if(Q.ide){let o=await P13();if(o){let A0=r30(o.ideName);if(A0)vM(A0)}}if(A.executeMode)A04(!0);let k,f=l3.status.pipe(q1((o)=>Boolean(o.connected&&o.authenticated&&o.ideName&&s04(o.ideName))),R4()).subscribe((o)=>{if(o){if(!k)k=K.registerTool(IO4)}else k?.dispose(),k=void 0}),d;if(!A.executeMode){let o=await A.settings.get("fuzzy.alwaysIncludePaths")??[];d=new JX0(process.cwd(),{alwaysIncludePaths:o},!0)}else d=new class extends JX0{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let c=new Wg0(_l(Y,{usesThreadActors:!1}),{maxThreads:200});j.info("Starting Amp background services");let g=new E51,l={configService:Y,toolService:K,mcpService:N,skillService:q,toolboxService:I,trustStore:H,threadService:c,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:d,fileSystem:v3,terminal:g,pluginService:T,pluginPlatform:O,headlessPluginPlatform:w,activeThread$:_,serverStatus:D,serverStatusPromise:X,viewerUserIDPromise:G,hasAPIKeyAtStartup:F};return{...l,async asyncDispose(){if(l.mcpService.hasAuthenticatingClients())j.info("Waiting for OAuth authentication to complete before exit..."),await l.mcpService.waitForAuthentication();for(let o of u.values())o.dispose();await l.mcpService.dispose(),W(),await l.threadService.asyncDispose(),l.configService.unsubscribe(),E(),l.fuzzyServer.dispose(),l.settingsStorage[Symbol.dispose](),f.unsubscribe(),k?.dispose(),await l.pluginService.dispose()}}}async function l13(A){if(!A.executeMode){if(!await sX0("Would you like to log in to Amp? [(y)es, (n)o]: "))return r6.write(`Login cancelled. Run the command again to retry.
|
|
7739
7739
|
`),!1}return await O8A(A)}async function O8A(A){let Q=C8A(32).toString("hex"),B=await mx(A.ampURL,Q),$=new AbortController;try{await bX(B,$.signal)}catch(Y){j.error("Error opening browser",{error:Y})}let J=await mx(A.ampURL,Q,!1);r6.write(`If your browser does not open automatically, visit:
|
|
7740
7740
|
|
|
@@ -7742,7 +7742,7 @@ ${a0.blue.bold(J)}
|
|
|
7742
7742
|
|
|
7743
7743
|
`);try{return await sh4(A.ampURL,Q,A.secrets,$),r6.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(Y){return j.error("Login failed",{error:Y}),WB.write(`
|
|
7744
7744
|
Login failed: ${Y instanceof Error?Y.message:String(Y)}
|
|
7745
|
-
`),!1}}async function i13(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new s1("No Amp API key found. Run `amp login` first.",1);let J=C13("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 n13(A){let Q=new mN().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)qj(),process.exit(0);let H=W.originalError??W;Sv4(H)}),Ym4(Q,{version:"0.0.
|
|
7745
|
+
`),!1}}async function i13(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new s1("No Amp API key found. Run `amp login` first.",1);let J=C13("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 n13(A){let Q=new mN().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)qj(),process.exit(0);let H=W.originalError??W;Sv4(H)}),Ym4(Q,{version:"0.0.1778790766-g60d194",buildTimestamp:"2026-05-14T20:37:10.095Z",buildType:"release"}),Q.addHelpText("after",yb4()),Q.configureHelp({formatHelp:xb4}),Q.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await d5(q);await B43(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 d5(q);await Q43(N,await Je0(q,N.settings))}),_v4(Q,d5);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 d5(N);await i13(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 d5(N);await mf4(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 d5(q);await pf4(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 ru4({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(`
|
|
7746
7746
|
`)).option("--apply <threadIDOrURL>","Apply the current DTW thread snapshot once and exit").option("--checkout","Automatically check out the thread commit when it differs").option("--skip-checkout","Skip the startup checkout prompt when commits differ").action(async(W,H,q)=>{if(W&&H.apply)throw new s1("Choose either a positional thread ID/URL or --apply <thread-id>, not both.",1);let N=H.apply??W;if(!N||N.trim().length===0)r6.write(`live-sync watches a v2 thread and mirrors its live changes locally. Use --apply <thread-id> to materialize the current snapshot once and exit.
|
|
7747
7747
|
|
|
7748
7748
|
`),q.outputHelp(),process.exit(0);let I=t8(N)??tB(N),w=q.optsWithGlobals(),L=await d5(w);q2(q,w);let O=await x8(L,w),_=!1;try{if(H.checkout&&H.skipCheckout)throw new s1("Choose either --checkout or --skip-checkout, not both.",1);if(gX(O.serverStatus))throw ut(O.serverStatus,L.ampURL);let S=gA(O.serverStatus)?O.serverStatus.features:void 0;if(!gt(S,kB.V2))throw new s1("live-sync is not enabled for your user",1);await gh4({ampURL:L.ampURL,threadId:I,configService:O.configService,threadService:O.threadService,apiKey:process.env.AMP_API_KEY,applyOnce:typeof H.apply==="string",checkoutMode:H.checkout?"always":H.skipCheckout?"never":"prompt",promptForYesNo:sX0}),_=!0}finally{if(await O.asyncDispose(),_)process.exit(0)}});let J=async(W,H,q)=>{g30({storage:H.settings,secretStorage:H.secrets,workspaceRoot:h0.of(r0.file(process.cwd())),defaultAmpURL:H.ampURL,homeDir:ZE0,userConfigDir:M91});let N={...H,executeMode:!1};await FE0(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 d5(q);await w8A(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 d5(q);await E43(q,N,H)}),Y.command("continue [threadIDOrURL]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, interactive mode shows a picker. Use --last to continue the last thread for the current mode directly.").option("--last","Continue the last thread for the current mode directly").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(W,H,q)=>{let N=q.optsWithGlobals(),I=await d5(N);if(H.pick)WB.write(`${a0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
@@ -7775,8 +7775,8 @@ ${L}
|
|
|
7775
7775
|
`))}),H.args.length>0)d13(N,H);await FE0(N,q,H,A)}),Uu4(Q),Q}async function ht(A,Q){await $B((B)=>dx(B,A,Q))}async function H8A(A,Q,B){let $=Date.now(),[J,Y]=await Promise.all([r4.getThreadLinkInfo({thread:A},{config:Q}),B]);if(j.getChild("fetchAndStartThread").info(`Ownership check in ${Date.now()-$}ms`),J.ok){let Z=J.result.creatorUserID;if(Z&&Z!==Y&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new s1(`Cannot resume thread created by another user.
|
|
7776
7776
|
|
|
7777
7777
|
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 j8A(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await kV0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await kV0()).trimEnd(),stdinInput:null}}function R8A(A,Q,B){if(A.streamJson&&!Q)throw new s1("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(A.streamJsonInput&&!Q)throw new s1("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(A.streamJsonInput&&!A.streamJson)throw new s1("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(A.stats&&A.streamJson)throw new s1("The --stats and --stream-json flags are mutually exclusive output formats",1,'Use one or the other: amp --execute "your message" --stats OR amp --execute "your message" --stream-json');if(A.stats&&!Q)throw new s1("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(A.archive&&!Q)throw new s1("The --archive flag requires --execute mode",1,'Use: amp --execute "your message" --archive');if(A.streamJsonInput&&typeof A.execute==="string"&&A.execute.trim()!=="")throw new s1("Do not provide a message argument when using --stream-json-input",1,`Supply messages via stdin JSONL instead: echo '{"type":"user","message":{"role":"user","content":[{"type":"text","text":"your message"},{"type":"image","source":{"type":"base64","media_type":"image/png","data":"..."}}]}}' | amp --execute --stream-json --stream-json-input`);if(Q&&B===""&&!A.streamJsonInput&&!A.headless)throw new s1("User message must be provided through stdin or as argument when using execute mode",1,`Either pass a message as an argument: amp --execute "your message"
|
|
7778
|
-
Or pipe via stdin: echo "your message" | amp --execute`)}function a13(){uA4([o50.parse({tool:"*",action:"allow"})]),EA4({bypass:!0})}async function FE0(A,Q,B,$){if(Q.headless)return o13(A,Q,B);let J=await x8(A,Q),Y=await J.serverStatusPromise,Z=gA(Y)&>(Y.features,kB.THREAD_ACTORS_TUI),F=Z&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await J.asyncDispose(),new s1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!Z)throw await J.asyncDispose(),new s1("--show-welcome is only available with the new Amp CLI feature flag",1);if(F){let X=!A.executeMode&&await h13();return a13(),r13(A,Q,B,J,{showNpmMigrationWelcome:X})}else{if(Q.threadId&&q9(Q.threadId)){let X=await r4.getThreadLinkInfo({thread:Q.threadId},{config:J.configService}).catch(()=>null);if(X?.ok&&X.result.usesThreadActors)throw await J.asyncDispose(),new s1(`Thread ${Q.threadId} was created with the Neo TUI and cannot be continued in the legacy CLI.`,1,"Re-run without --take-me-back to continue this thread.")}return s13(A,Q,B,$,{dependencies:J})}}async function o13(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=Ys0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};q2(B,Q);let J=process.hrtime.bigint(),Y=await x8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(gX(Z))throw ut(Z,A.ampURL);let F=gA(Z)?Z:null,X=F?.user.email;await C91(B,Q,Z);let D=qW(Z),G=df(Q,D);if(G instanceof Error)V5(G.message);if(F&&!bM(Q.mode,X))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!X||!f7(X)))throw new s1("Headless executor mode is only available for Amp employees",1);IF0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new s1("API key required for headless mode. Please run `amp login` first.",1);let K=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(K&&!q9(K))throw new s1(`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 s1("Failed to resolve headless thread ID",1);let W=await Qb4(z);if(W.status==="already-running")await Y.asyncDispose(),await _z(),process.exit(0);try{await if4({ampURL:A.ampURL,apiKey:U,workspaceRoot:process.cwd(),threadId:z,ownerUserId:E?.ownerUserId,threadVersion:E?.threadVersion,agentMode:E?.agentMode,initialToolDiscovery:Promise.all([Y.mcpService.initialized,Y.toolboxService.initialized,Y.pluginService.initialized]).then(()=>{return}),configService:Y.configService,mcpService:Y.mcpService,toolService:Y.toolService,skillService:Y.skillService,fileSystem:Y.fileSystem,pluginService:Y.pluginService,pluginPlatform:Y.headlessPluginPlatform})}finally{await W.release(),await Y.asyncDispose()}await _z(),process.exit(0)}async function r13(A,Q,B,$,J){let{userInput:Y,stdinInput:Z}=await j8A(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;R8A({...Q,streamJson:F},A.executeMode,Y),q2(B,Q),Cv4(),IF0();let X=Q.threadId&&q9(Q.threadId)?Q.threadId:void 0,D=Q.observe?t8(Q.observe)??tB(Q.observe):void 0,G=await $.serverStatusPromise;if(gX(G))throw ut(G,A.ampURL);let V=qW(G),U=df(Q,V);if(U instanceof Error)V5(U.message);let K=null,E=()=>{return K??=(async()=>{let H=await oa(A.settings,process.cwd(),V,U);if(H instanceof Error)V5(H.message);return H})(),K},z=await $.secretStorage.get("apiKey",A.ampURL);if(!z)throw new s1("API key required. Please run `amp login` first.",1);let W=gA(G)&&f7(G.user.email);if(A.executeMode){B01($.mcpService,A.settings);try{let H=YE0(B,Q),q=await gz(),N=X?H:tX0({agentMode:Q.mode,explicitEffort:H,sessionState:q}),I=X?void 0:eX0(await px($.configService),{agentMode:Q.mode,explicitEffort:H,sessionState:q}),w=X?void 0:await E(),L=await Nf4({apiKey:z,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:$,userInput:Y,stdinInput:Z,stats:!!Q.stats,streamJson:F,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:N,labels:Q.label,initialThreadID:X,initialThreadMeta:w,initialSettings:I});if(await ht(L,"execute"),Q.archive)await $.threadService.archive(L,!0)}finally{await $.asyncDispose()}await _z(),process.exit(0)}else{let H=YE0(B,Q),q=J.showNpmMigrationWelcome?"npm-migration":"intro",N=CX0("0.0.1778790531-gba894e",$.settingsStorage,{startDelayMs:3000}),I=_l($.configService),w=new At($.fuzzyServer),L=process.cwd();await Ps4({ampURL:A.ampURL,apiKey:z,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??pF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:O})=>Ix({fileSystem:$.fileSystem,workspaceRoot:L},O),completionBuilder:w,workspaceRoot:L,listThreads:()=>I.listThreads(),getThreadFromServer:(O)=>I.getThread(O),toolboxes:$.toolboxService.toolboxes,isInternalUser:W,settingsFilePath:$.settingsStorage.getSettingsFilePath(),setActiveThreadID:(O)=>$.activeThread$.next(O),dispose:()=>{return N.dispose(),$.asyncDispose()}},{initialThreadID:D??X,initialUserInput:Y||void 0,getDefaultNewThreadVisibility:E,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!D,splashOrbVisualStyle:"neo",hideNeoWelcome:!!Q.hideWelcome,showNeoWelcome:Q.showWelcome,neoWelcomeVariant:q,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:H}),process.exit(0)}}async function s13(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(X0,j0)=>{let Q0=Number(process.hrtime.bigint()-j0)/1e6,O0=Ys0();j.info("Startup phase",{phase:X0,phaseMs:Math.round(Q0),sinceMainMs:O0===null?void 0:Math.round(O0)})},{userInput:F,stdinInput:X}=await j8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;R8A({...Q,streamJson:D},A.executeMode,F),q2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await x8(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&&gX(E))throw ut(E,A.ampURL);let z=gA(E)?E:null,W=z?.user.email,H=!!(W&&f7(W));if(H)IF0();if(!K)await C91(B,Q,E);let q=qW(E),N=q?.features??[],I=q?.team??null,w=df(Q,q);if(w instanceof Error)V5(w.message);if(z&&!bM(Q.mode,W))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let L=Q.threadId&&q9(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await XE0(V);Z("runMainThread:createWorkerDeps",G);let _=A.executeMode?void 0:async(X0)=>ht(X0,"interactive"),S={threadService:V.threadService,workerDeps:O,createThread:async(X0)=>{let j0=K?await V.serverStatusPromise:E,Q0=await oa(A.settings,process.cwd(),qW(j0),w);if(Q0 instanceof Error)V5(Q0.message);return a81(O,{threadMeta:Q0,agentMode:X0??Q.mode,onFirstAssistantMessage:_})},validateThreadOwnership:async(X0,j0)=>{if(j0?.nonBlockingOwnershipCheck){H8A(X0,V.configService,V.viewerUserIDPromise).catch((Q0)=>{if(Q0 instanceof s1){if(j0.onOwnershipError){j0.onOwnershipError(Q0,X0);return}Tz(Q0,X0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})});return}try{await H8A(X0,V.configService,V.viewerUserIDPromise)}catch(Q0){if(Q0 instanceof s1)throw Q0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:_,handleError:Tz},T=async()=>{try{return dAA(S,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(X0){if(X0 instanceof s1)throw X0;throw await Tz(X0,Q.threadId),Error("handleError should have called process.exit()")}},x=(async()=>{if(K){j.info("Skipping initial free tier status fetch until auth is complete");return}try{let X0=await V.configService.getLatest(),j0=bm(X0),Q0=await r4.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(j0)});if(Q0.ok)return j.info("User free tier status:",Q0),Q0.result;return}catch(X0){j.error("Failed to fetch free tier status:",X0);return}})(),u=!A.executeMode?new N51:null,k,f=null;if(u)k=u,f=(async()=>{let X0=K?await V.serverStatusPromise:V.serverStatus;if(gX(X0))throw ut(X0,A.ampURL);await C91(B,Q,X0);let j0=process.hrtime.bigint(),Q0=await T();if(Z("runMainThread:createThreadPool",j0),u.attach(Q0),F){let O0=await T1(Q0.threadHandles$);if(!O0)throw new s1("No active thread is available yet.",1);await O0.sendMessage({content:[{type:"text",text:F}]})}})(),f.catch(async(X0)=>{let j0=X0 instanceof Error?X0:Error(String(X0));u.setInitError(j0),await Tz(X0,Q.threadId)});else G=process.hrtime.bigint(),k=await T(),Z("runMainThread:createThreadPool",G);let d=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let c=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),c13({configService:V.configService,threadService:V.threadService,config:c,useNotificationsForService:d,threadViewStates$:()=>k.threadHandles$.pipe(x4((X0)=>{if(!X0)return h0.of({});return L6(X0.thread$,X0.threadViewState$).pipe(q1(([j0,Q0])=>({[j0.id]:Q0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){B01(V.mcpService,A.settings);let X0=YE0(B,Q),j0=await gz(),Q0=L?X0:tX0({agentMode:Q.mode,explicitEffort:X0,sessionState:j0}),O0={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 ev4({threadPool:k,...O0});if(await ht(n,"execute"),Q.archive)await V.threadService.archive(n,!0);await V.asyncDispose(),process.exit(0)}let g=!1,l=!1;if(Q.jetbrains||Q.ide){await s30();let X0=await pX({jetbrainsOnly:Q.jetbrains});if(X0.length===0){if(Q.jetbrains)g=!await V.configService.get("jetbrains.skipInstall")}else if(X0.length===1){let j0=X0[0];if(j0)l3.selectConfig(j0)}else l=!0}G=process.hrtime.bigint();let o=CX0("0.0.1778790531-gba894e",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let A0=new $01(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let X0=await T1(k.threadHandles$);if(!X0)throw new s1("No active thread is available yet.",1);await X0.sendMessage({content:[{type:"text",text:F}]})}G=process.hrtime.bigint();let I0=await gz();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",I0);let V0=YE0(B,Q),H0={...I0,launchCount:I0.launchCount+1,lastReasoningEffortByMode:V0?{...I0.lastReasoningEffortByMode,[Q.mode]:V0}:I0.lastReasoningEffortByMode};$B((X0)=>({...X0,launchCount:X0.launchCount+1}));try{if(G=process.hrtime.bigint(),await Qe4({history:new Eo,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:r4,threadPool:k,createSystemPromptDeps:async()=>L8A(V),ideClient:l3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:A0,updateService:o,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:L,showJetBrainsInstaller:g,showIdePickerHint:l,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:R13,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-14T20:33:00.739Z"},(X0)=>new j51({...X0,threadPool:X0.threadPool},(j0)=>new i81({...j0,threadState:j0.threadState}))),Z("runMainThread:mountApp-returned",G),f)await f}finally{await k.dispose().catch((X0)=>{j.error("Failed to dispose thread pool during shutdown",X0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function d5(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)WB.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
7779
|
-
`);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 c74({get:async(F)=>{if(F!==pd)return;try{let X=await M8A(w91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==pd)return;await M13(bt.dirname(w91),{recursive:!0}),await L13(w91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:M90()});Q04($);let J=await Wb4({...A,workspaceTrust:{current:!0,changes:um},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 Fg4(A.mcpConfig);J=Xg4(J,F)}let Y=bt.dirname(J.getSettingsFilePath());oR4(_x,Y),J=xs1(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=b7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!fH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:At4(await Je0(A,J))}}function t13(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 e13(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=bt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?j13:aa));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function A43(){Wv4();let A=t13(process.argv),Q=e13(process.argv,A),B=Mv4(Q);cZ0("silent");let $=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)a0.level=0;if(_13(j),j.info("Starting Amp CLI.",{version:"0.0.
|
|
7778
|
+
Or pipe via stdin: echo "your message" | amp --execute`)}function a13(){uA4([o50.parse({tool:"*",action:"allow"})]),EA4({bypass:!0})}async function FE0(A,Q,B,$){if(Q.headless)return o13(A,Q,B);let J=await x8(A,Q),Y=await J.serverStatusPromise,Z=gA(Y)&>(Y.features,kB.THREAD_ACTORS_TUI),F=Z&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await J.asyncDispose(),new s1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!Z)throw await J.asyncDispose(),new s1("--show-welcome is only available with the new Amp CLI feature flag",1);if(F){let X=!A.executeMode&&await h13();return a13(),r13(A,Q,B,J,{showNpmMigrationWelcome:X})}else{if(Q.threadId&&q9(Q.threadId)){let X=await r4.getThreadLinkInfo({thread:Q.threadId},{config:J.configService}).catch(()=>null);if(X?.ok&&X.result.usesThreadActors)throw await J.asyncDispose(),new s1(`Thread ${Q.threadId} was created with the Neo TUI and cannot be continued in the legacy CLI.`,1,"Re-run without --take-me-back to continue this thread.")}return s13(A,Q,B,$,{dependencies:J})}}async function o13(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=Ys0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};q2(B,Q);let J=process.hrtime.bigint(),Y=await x8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(gX(Z))throw ut(Z,A.ampURL);let F=gA(Z)?Z:null,X=F?.user.email;await C91(B,Q,Z);let D=qW(Z),G=df(Q,D);if(G instanceof Error)V5(G.message);if(F&&!bM(Q.mode,X))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!X||!f7(X)))throw new s1("Headless executor mode is only available for Amp employees",1);IF0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new s1("API key required for headless mode. Please run `amp login` first.",1);let K=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(K&&!q9(K))throw new s1(`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 s1("Failed to resolve headless thread ID",1);let W=await Qb4(z);if(W.status==="already-running")await Y.asyncDispose(),await _z(),process.exit(0);try{await if4({ampURL:A.ampURL,apiKey:U,workspaceRoot:process.cwd(),threadId:z,ownerUserId:E?.ownerUserId,threadVersion:E?.threadVersion,agentMode:E?.agentMode,initialToolDiscovery:Promise.all([Y.mcpService.initialized,Y.toolboxService.initialized,Y.pluginService.initialized]).then(()=>{return}),configService:Y.configService,mcpService:Y.mcpService,toolService:Y.toolService,skillService:Y.skillService,fileSystem:Y.fileSystem,pluginService:Y.pluginService,pluginPlatform:Y.headlessPluginPlatform})}finally{await W.release(),await Y.asyncDispose()}await _z(),process.exit(0)}async function r13(A,Q,B,$,J){let{userInput:Y,stdinInput:Z}=await j8A(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;R8A({...Q,streamJson:F},A.executeMode,Y),q2(B,Q),Cv4(),IF0();let X=Q.threadId&&q9(Q.threadId)?Q.threadId:void 0,D=Q.observe?t8(Q.observe)??tB(Q.observe):void 0,G=await $.serverStatusPromise;if(gX(G))throw ut(G,A.ampURL);let V=qW(G),U=df(Q,V);if(U instanceof Error)V5(U.message);let K=null,E=()=>{return K??=(async()=>{let H=await oa(A.settings,process.cwd(),V,U);if(H instanceof Error)V5(H.message);return H})(),K},z=await $.secretStorage.get("apiKey",A.ampURL);if(!z)throw new s1("API key required. Please run `amp login` first.",1);let W=gA(G)&&f7(G.user.email);if(A.executeMode){B01($.mcpService,A.settings);try{let H=YE0(B,Q),q=await gz(),N=X?H:tX0({agentMode:Q.mode,explicitEffort:H,sessionState:q}),I=X?void 0:eX0(await px($.configService),{agentMode:Q.mode,explicitEffort:H,sessionState:q}),w=X?void 0:await E(),L=await Nf4({apiKey:z,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:$,userInput:Y,stdinInput:Z,stats:!!Q.stats,streamJson:F,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:N,labels:Q.label,initialThreadID:X,initialThreadMeta:w,initialSettings:I});if(await ht(L,"execute"),Q.archive)await $.threadService.archive(L,!0)}finally{await $.asyncDispose()}await _z(),process.exit(0)}else{let H=YE0(B,Q),q=J.showNpmMigrationWelcome?"npm-migration":"intro",N=CX0("0.0.1778790766-g60d194",$.settingsStorage,{startDelayMs:3000}),I=_l($.configService),w=new At($.fuzzyServer),L=process.cwd();await Ps4({ampURL:A.ampURL,apiKey:z,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??pF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:O})=>Ix({fileSystem:$.fileSystem,workspaceRoot:L},O),completionBuilder:w,workspaceRoot:L,listThreads:()=>I.listThreads(),getThreadFromServer:(O)=>I.getThread(O),toolboxes:$.toolboxService.toolboxes,isInternalUser:W,settingsFilePath:$.settingsStorage.getSettingsFilePath(),setActiveThreadID:(O)=>$.activeThread$.next(O),dispose:()=>{return N.dispose(),$.asyncDispose()}},{initialThreadID:D??X,initialUserInput:Y||void 0,getDefaultNewThreadVisibility:E,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!D,splashOrbVisualStyle:"neo",hideNeoWelcome:!!Q.hideWelcome,showNeoWelcome:Q.showWelcome,neoWelcomeVariant:q,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:H}),process.exit(0)}}async function s13(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(X0,j0)=>{let Q0=Number(process.hrtime.bigint()-j0)/1e6,O0=Ys0();j.info("Startup phase",{phase:X0,phaseMs:Math.round(Q0),sinceMainMs:O0===null?void 0:Math.round(O0)})},{userInput:F,stdinInput:X}=await j8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;R8A({...Q,streamJson:D},A.executeMode,F),q2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await x8(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&&gX(E))throw ut(E,A.ampURL);let z=gA(E)?E:null,W=z?.user.email,H=!!(W&&f7(W));if(H)IF0();if(!K)await C91(B,Q,E);let q=qW(E),N=q?.features??[],I=q?.team??null,w=df(Q,q);if(w instanceof Error)V5(w.message);if(z&&!bM(Q.mode,W))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let L=Q.threadId&&q9(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await XE0(V);Z("runMainThread:createWorkerDeps",G);let _=A.executeMode?void 0:async(X0)=>ht(X0,"interactive"),S={threadService:V.threadService,workerDeps:O,createThread:async(X0)=>{let j0=K?await V.serverStatusPromise:E,Q0=await oa(A.settings,process.cwd(),qW(j0),w);if(Q0 instanceof Error)V5(Q0.message);return a81(O,{threadMeta:Q0,agentMode:X0??Q.mode,onFirstAssistantMessage:_})},validateThreadOwnership:async(X0,j0)=>{if(j0?.nonBlockingOwnershipCheck){H8A(X0,V.configService,V.viewerUserIDPromise).catch((Q0)=>{if(Q0 instanceof s1){if(j0.onOwnershipError){j0.onOwnershipError(Q0,X0);return}Tz(Q0,X0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})});return}try{await H8A(X0,V.configService,V.viewerUserIDPromise)}catch(Q0){if(Q0 instanceof s1)throw Q0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Q0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:_,handleError:Tz},T=async()=>{try{return dAA(S,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(X0){if(X0 instanceof s1)throw X0;throw await Tz(X0,Q.threadId),Error("handleError should have called process.exit()")}},x=(async()=>{if(K){j.info("Skipping initial free tier status fetch until auth is complete");return}try{let X0=await V.configService.getLatest(),j0=bm(X0),Q0=await r4.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(j0)});if(Q0.ok)return j.info("User free tier status:",Q0),Q0.result;return}catch(X0){j.error("Failed to fetch free tier status:",X0);return}})(),u=!A.executeMode?new N51:null,k,f=null;if(u)k=u,f=(async()=>{let X0=K?await V.serverStatusPromise:V.serverStatus;if(gX(X0))throw ut(X0,A.ampURL);await C91(B,Q,X0);let j0=process.hrtime.bigint(),Q0=await T();if(Z("runMainThread:createThreadPool",j0),u.attach(Q0),F){let O0=await T1(Q0.threadHandles$);if(!O0)throw new s1("No active thread is available yet.",1);await O0.sendMessage({content:[{type:"text",text:F}]})}})(),f.catch(async(X0)=>{let j0=X0 instanceof Error?X0:Error(String(X0));u.setInitError(j0),await Tz(X0,Q.threadId)});else G=process.hrtime.bigint(),k=await T(),Z("runMainThread:createThreadPool",G);let d=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let c=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),c13({configService:V.configService,threadService:V.threadService,config:c,useNotificationsForService:d,threadViewStates$:()=>k.threadHandles$.pipe(x4((X0)=>{if(!X0)return h0.of({});return L6(X0.thread$,X0.threadViewState$).pipe(q1(([j0,Q0])=>({[j0.id]:Q0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){B01(V.mcpService,A.settings);let X0=YE0(B,Q),j0=await gz(),Q0=L?X0:tX0({agentMode:Q.mode,explicitEffort:X0,sessionState:j0}),O0={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 ev4({threadPool:k,...O0});if(await ht(n,"execute"),Q.archive)await V.threadService.archive(n,!0);await V.asyncDispose(),process.exit(0)}let g=!1,l=!1;if(Q.jetbrains||Q.ide){await s30();let X0=await pX({jetbrainsOnly:Q.jetbrains});if(X0.length===0){if(Q.jetbrains)g=!await V.configService.get("jetbrains.skipInstall")}else if(X0.length===1){let j0=X0[0];if(j0)l3.selectConfig(j0)}else l=!0}G=process.hrtime.bigint();let o=CX0("0.0.1778790766-g60d194",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let A0=new $01(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let X0=await T1(k.threadHandles$);if(!X0)throw new s1("No active thread is available yet.",1);await X0.sendMessage({content:[{type:"text",text:F}]})}G=process.hrtime.bigint();let I0=await gz();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",I0);let V0=YE0(B,Q),H0={...I0,launchCount:I0.launchCount+1,lastReasoningEffortByMode:V0?{...I0.lastReasoningEffortByMode,[Q.mode]:V0}:I0.lastReasoningEffortByMode};$B((X0)=>({...X0,launchCount:X0.launchCount+1}));try{if(G=process.hrtime.bigint(),await Qe4({history:new Eo,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:r4,threadPool:k,createSystemPromptDeps:async()=>L8A(V),ideClient:l3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:A0,updateService:o,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:L,showJetBrainsInstaller:g,showIdePickerHint:l,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:R13,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-14T20:37:10.095Z"},(X0)=>new j51({...X0,threadPool:X0.threadPool},(j0)=>new i81({...j0,threadState:j0.threadState}))),Z("runMainThread:mountApp-returned",G),f)await f}finally{await k.dispose().catch((X0)=>{j.error("Failed to dispose thread pool during shutdown",X0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function d5(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)WB.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
7779
|
+
`);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 c74({get:async(F)=>{if(F!==pd)return;try{let X=await M8A(w91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==pd)return;await M13(bt.dirname(w91),{recursive:!0}),await L13(w91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:M90()});Q04($);let J=await Wb4({...A,workspaceTrust:{current:!0,changes:um},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 Fg4(A.mcpConfig);J=Xg4(J,F)}let Y=bt.dirname(J.getSettingsFilePath());oR4(_x,Y),J=xs1(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=b7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!fH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:At4(await Je0(A,J))}}function t13(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 e13(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=bt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?j13:aa));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function A43(){Wv4();let A=t13(process.argv),Q=e13(process.argv,A),B=Mv4(Q);cZ0("silent");let $=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)a0.level=0;if(_13(j),j.info("Starting Amp CLI.",{version:"0.0.1778790766-g60d194",buildTimestamp:"2026-05-14T20:37:10.095Z"}),process.platform==="win32"&&Pj())Zu4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new s1(z7.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await n13(B).parseAsync(process.argv)}nR4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await A43().catch(Tz)});async function Q43(A,Q){let B=A.ampURL.includes("localhost")||A.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!B)await A.settings.set("url",process.env.AMP_URL,"global"),r6.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
7780
7780
|
`);else if(!fH(A.ampURL))r6.write(`Logging in to ${new URL(A.ampURL).hostname}
|
|
7781
7781
|
`);let $=process.env.AMP_API_KEY;if($)r6.write(`API key found in environment variable, storing...
|
|
7782
7782
|
`),await Q.set("apiKey",$,A.ampURL),r6.write(`API key successfully stored.
|
package/package.json
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sourcegraph/amp",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "
|
|
5
|
-
"deprecated": "Renamed to @ampcode/cli - see https://ampcode.com/news/npm-package-changes",
|
|
3
|
+
"version": "0.0.1778790766-g60d194",
|
|
4
|
+
"description": "Renamed to @ampcode/cli - see https://ampcode.com/news/npm-package-changes",
|
|
6
5
|
"homepage": "https://ampcode.com/",
|
|
7
6
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
8
7
|
"bin": {
|
|
9
8
|
"amp": "node_modules/@ampcode/cli/bin/amp.exe"
|
|
10
9
|
},
|
|
11
10
|
"dependencies": {
|
|
12
|
-
"@ampcode/cli": "0.0.
|
|
11
|
+
"@ampcode/cli": "0.0.1778790766-g60d194"
|
|
13
12
|
},
|
|
14
13
|
"files": [
|
|
15
14
|
"dist/main.js",
|