@sourcegraph/amp 0.0.1780118009-g45d3ab → 0.0.1780130685-gfdac38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +9 -9
- package/package.json +2 -2
package/dist/main.js
CHANGED
|
@@ -4217,13 +4217,13 @@ ${z}`))}},error:(V)=>{if(!G)G=!0,Z(Error(`Failed to spawn brew: ${V.message}`))}
|
|
|
4217
4217
|
${z}`;if(J==="pnpm"&&z.includes("Unable to find the global bin directory"))K+=`
|
|
4218
4218
|
|
|
4219
4219
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
4220
|
-
npm install -g ${D}`;Z(Error(K))}},error:(V)=>{if(!I)I=!0,Z(Error(`Failed to spawn ${J}: ${V.message}`))},complete:()=>{if(!I)I=!0,Y()}})})}a0();a0();th();var isQ="@ampcode/cli";async function i30(A,Q,$=isQ){let E=`${Q||"https://registry.npmjs.org"}/${$}/latest`,D=new AbortController,J=setTimeout(()=>D.abort(),5000);try{let U=await fetch(E,{signal:D.signal});if(!U.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let Y=await U.json(),Z=Y.version??Y["dist-tags"]?.latest;if(!Z)return{hasUpdate:!1,currentVersion:A,source:"npm"};let F=lc(A,Z),X=F<0,I,G;if(Y.time){let V=Y.time[A],z=Y.time[Z],K=Date.now();if(V)I=Math.floor((K-new Date(V).getTime())/3600000);if(z)G=Math.floor((K-new Date(z).getTime())/3600000)}return S.info("NPM version comparison",{currentVersion:A,latestVersion:Z,compareResult:F,hasUpdate:X,currentVersionAge:I,latestVersionAge:G}),{hasUpdate:X,latestVersion:Z,currentVersion:A,currentVersionAge:I,latestVersionAge:G,source:"npm"}}catch(U){return S.debug("Error checking npm version",{error:U}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(J)}}var nsQ="https://static.ampcode.com/cli/cli-version.txt";async function n30(A){let Q=new AbortController,$=setTimeout(()=>Q.abort(),5000);try{let B=await fetch(`${nsQ}?t=${Date.now()}`,{signal:Q.signal,cache:"no-store"});if(!B.ok)return{hasUpdate:!1,currentVersion:A,source:"bin"};let E=(await B.text()).trim();if(!E||!/^\d+\.\d+\.\d+/.test(E))return{hasUpdate:!1,currentVersion:A,source:"bin"};let D=lc(A,E),J=D<0;return S.info("Bin version comparison",{currentVersion:A,latestVersion:E,compareResult:D,hasUpdate:J}),{hasUpdate:J,latestVersion:E,currentVersion:A,source:"bin"}}catch(B){return S.debug("Error checking bin version",{error:B}),{hasUpdate:!1,currentVersion:A,source:"bin"}}finally{clearTimeout($)}}function lc(A,Q){let $=(J)=>{let[U,Y]=J.split("-");return{parts:U?.split(".").map(Number)||[],label:Y}},B=$(A),E=$(Q),D=Math.max(B.parts.length,E.parts.length);for(let J=0;J<D;J++){let U=B.parts[J]||0,Y=E.parts[J]||0;if(U<Y)return-1;if(U>Y)return 1}if(B.label===E.label)return 0;if(!B.label&&E.label)return 1;if(B.label&&!E.label)return-1;if(B.label&&E.label)return B.label<E.label?-1:1;return 0}function ic(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-(.+))?/);if(!Q)return null;let $=parseInt(Q[1],10),B=$!==0?$*1000:void 0,D=Q[2]?.match(/^g?([a-f0-9]+)$/)?.[1],J=B!==void 0?OV(B):void 0;return{sha:D,timestamp:B,age:J}}catch{return null}}SA();a0();import{readFile as asQ,realpath as osQ}from"node:fs/promises";import{dirname as bG4,join as rsQ}from"node:path";async function hG4(A){switch(A){case"binary":case"brew":return ssQ(cc());case"npm":case"pnpm":case"yarn":case"bun":return tsQ()}}async function ssQ(A){let Q=await Oz(A,["--version"],5000);if(Q.reason!=="success")return S.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function tsQ(){try{let A=process.argv[1];if(!A)return null;let Q=await osQ(A),$=bG4(bG4(Q));return await esQ(rsQ($,"package.json"))}catch(A){return S.debug("failed to read installed version from package.json",{error:A}),null}}async function esQ(A){let Q=await asQ(A,"utf8"),$=JSON.parse(Q);if(!$.name||!yy0($.name))return S.debug("package.json name mismatch",{pkgJsonPath:A,name:$.name}),null;return $.version||null}a0();import{spawn as AtQ}from"node:child_process";function cy0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return S.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var a30=null,nc=null;function gG4(A){return new Promise((Q)=>{let $=AtQ("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),B="";$.stdout.on("data",(E)=>{B+=E.toString()}),$.on("close",(E,D)=>{if(E!==0||D==="SIGTERM"){Q(null);return}let J=B.trim();Q(J&&J!=="undefined"?J:null)}),$.on("error",()=>{Q(null)})})}async function o30(){if(a30)return a30;if(nc)return nc;nc=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return cy0(A);let Q=await gG4("@sourcegraph:registry");if(Q)return cy0(Q);let $=await gG4("registry");if($)return cy0($);return"https://registry.npmjs.org"})();try{return a30=await nc,a30}finally{nc=null}}var QtQ=3600000,$tQ=5000;function py0(A,Q,$={}){let B=new q4,E=B.pipe(G$({shouldCountRefs:!1})),D=$.startDelayMs??0,J=$.checkIntervalMs??QtQ,U=!1,Y=()=>{U=!0};return setImmediate(async()=>{let Z=S.getChild("update");if(D>0){if(await jV(D),U)return}let F=E.subscribe({next:(I)=>{Z.debug("emit new state",I)}}),X=A;try{while(!U){let I=await BtQ(X,Q,Z,B);if(I.stop)return;if(I.updatedTo)X=I.updatedTo;if(I.emittedVisibleState){if(await jV($tQ),U)return;B.next("hidden")}if(J<=0)return;let G=1000,V=J;while(V>0&&!U){let z=Math.min(G,V);await jV(z),V-=z}}}finally{F.unsubscribe(),B.complete()}}),{state:E,dispose:Y}}async function BtQ(A,Q,$,B){let E={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return $.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),E.stop=!0,E;let D=await Q.get("updates.mode");if(D==="disabled")return $.debug("checking disabled"),E.stop=!0,E;let J=await rY(),U=J==="binary"||J==="brew",Y=U?void 0:await Lz();$.debug("checking",{currentVersion:A,mode:D,packageManager:J,isBinaryDistribution:U,npmPackageName:Y});let Z;if(U)Z=await n30(A);else{let I=await o30();Z=await i30(A,I,Y)}if(!(Z.latestVersion&&Z.hasUpdate))return $.debug("no update available"),E;let F=(I)=>{B.next(I),E.emittedVisibleState=!0};if(J){let I=await hG4(J);if(I&&lc(I,Z.latestVersion)>=0){if($.debug("on-disk version already up to date",{currentVersion:A,installedVersion:I,latestVersion:Z.latestVersion}),E.updatedTo=I,lc(A,I)<0){let G=await LX(I),V={from:A,to:I,externallyUpdated:!0,...G};if(G.status==="same")$.info("on-disk already updated by another instance",V),F("updated");else $.warn("on-disk already updated by another instance, with PATH warning",V),F("updated-with-warning")}return E}}let X=()=>{if(Z.currentVersionAge!==void 0&&Z.latestVersionAge!==void 0){let I=Z.currentVersionAge-Z.latestVersionAge,G=0.5;if(Math.abs(I)<0.5)return $.debug("versions too close together, suppressing update warning",{currentVersionAge:Z.currentVersionAge,latestVersionAge:Z.latestVersionAge,ageDifferenceHours:I}),!0}return!1};if(!D)D=J==="pnpm"?"warn":"auto",$.debug("no configured update mode; selected default based on package manager",{packageManager:J,mode:D});if(J==="brew"){if(!X())F("update-available-brew");return E}if(J==="binary"&&process.execPath!==cc()){if($.debug("non-standard binary path, showing warning"),!X())F("update-available-unrecognized-path");return E}if(D==="warn"){if(!X())F("update-available");return E}if(!J){if($.debug("auto-update not supported, falling back to warn mode"),!X())F("update-available");return E}try{await pc(Z.latestVersion,J),E.updatedTo=Z.latestVersion;let I=await LX(Z.latestVersion),G={from:Z.currentVersion,to:Z.latestVersion,...I};if(I.status==="same")$.info("success",G),F("updated");else $.warn("success with warning",G),F("updated-with-warning")}catch(I){F("update-error")}return E}catch(D){return $.debug("check failed",{error:D}),E}}th();import{stderr as sD}from"node:process";function mG4(A){let Q=new uX().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(B)=>{await ky0(B.force||!1,B.verbose||!1,"0.0.
|
|
4220
|
+
npm install -g ${D}`;Z(Error(K))}},error:(V)=>{if(!I)I=!0,Z(Error(`Failed to spawn ${J}: ${V.message}`))},complete:()=>{if(!I)I=!0,Y()}})})}a0();a0();th();var isQ="@ampcode/cli";async function i30(A,Q,$=isQ){let E=`${Q||"https://registry.npmjs.org"}/${$}/latest`,D=new AbortController,J=setTimeout(()=>D.abort(),5000);try{let U=await fetch(E,{signal:D.signal});if(!U.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let Y=await U.json(),Z=Y.version??Y["dist-tags"]?.latest;if(!Z)return{hasUpdate:!1,currentVersion:A,source:"npm"};let F=lc(A,Z),X=F<0,I,G;if(Y.time){let V=Y.time[A],z=Y.time[Z],K=Date.now();if(V)I=Math.floor((K-new Date(V).getTime())/3600000);if(z)G=Math.floor((K-new Date(z).getTime())/3600000)}return S.info("NPM version comparison",{currentVersion:A,latestVersion:Z,compareResult:F,hasUpdate:X,currentVersionAge:I,latestVersionAge:G}),{hasUpdate:X,latestVersion:Z,currentVersion:A,currentVersionAge:I,latestVersionAge:G,source:"npm"}}catch(U){return S.debug("Error checking npm version",{error:U}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(J)}}var nsQ="https://static.ampcode.com/cli/cli-version.txt";async function n30(A){let Q=new AbortController,$=setTimeout(()=>Q.abort(),5000);try{let B=await fetch(`${nsQ}?t=${Date.now()}`,{signal:Q.signal,cache:"no-store"});if(!B.ok)return{hasUpdate:!1,currentVersion:A,source:"bin"};let E=(await B.text()).trim();if(!E||!/^\d+\.\d+\.\d+/.test(E))return{hasUpdate:!1,currentVersion:A,source:"bin"};let D=lc(A,E),J=D<0;return S.info("Bin version comparison",{currentVersion:A,latestVersion:E,compareResult:D,hasUpdate:J}),{hasUpdate:J,latestVersion:E,currentVersion:A,source:"bin"}}catch(B){return S.debug("Error checking bin version",{error:B}),{hasUpdate:!1,currentVersion:A,source:"bin"}}finally{clearTimeout($)}}function lc(A,Q){let $=(J)=>{let[U,Y]=J.split("-");return{parts:U?.split(".").map(Number)||[],label:Y}},B=$(A),E=$(Q),D=Math.max(B.parts.length,E.parts.length);for(let J=0;J<D;J++){let U=B.parts[J]||0,Y=E.parts[J]||0;if(U<Y)return-1;if(U>Y)return 1}if(B.label===E.label)return 0;if(!B.label&&E.label)return 1;if(B.label&&!E.label)return-1;if(B.label&&E.label)return B.label<E.label?-1:1;return 0}function ic(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-(.+))?/);if(!Q)return null;let $=parseInt(Q[1],10),B=$!==0?$*1000:void 0,D=Q[2]?.match(/^g?([a-f0-9]+)$/)?.[1],J=B!==void 0?OV(B):void 0;return{sha:D,timestamp:B,age:J}}catch{return null}}SA();a0();import{readFile as asQ,realpath as osQ}from"node:fs/promises";import{dirname as bG4,join as rsQ}from"node:path";async function hG4(A){switch(A){case"binary":case"brew":return ssQ(cc());case"npm":case"pnpm":case"yarn":case"bun":return tsQ()}}async function ssQ(A){let Q=await Oz(A,["--version"],5000);if(Q.reason!=="success")return S.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function tsQ(){try{let A=process.argv[1];if(!A)return null;let Q=await osQ(A),$=bG4(bG4(Q));return await esQ(rsQ($,"package.json"))}catch(A){return S.debug("failed to read installed version from package.json",{error:A}),null}}async function esQ(A){let Q=await asQ(A,"utf8"),$=JSON.parse(Q);if(!$.name||!yy0($.name))return S.debug("package.json name mismatch",{pkgJsonPath:A,name:$.name}),null;return $.version||null}a0();import{spawn as AtQ}from"node:child_process";function cy0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return S.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var a30=null,nc=null;function gG4(A){return new Promise((Q)=>{let $=AtQ("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),B="";$.stdout.on("data",(E)=>{B+=E.toString()}),$.on("close",(E,D)=>{if(E!==0||D==="SIGTERM"){Q(null);return}let J=B.trim();Q(J&&J!=="undefined"?J:null)}),$.on("error",()=>{Q(null)})})}async function o30(){if(a30)return a30;if(nc)return nc;nc=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return cy0(A);let Q=await gG4("@sourcegraph:registry");if(Q)return cy0(Q);let $=await gG4("registry");if($)return cy0($);return"https://registry.npmjs.org"})();try{return a30=await nc,a30}finally{nc=null}}var QtQ=3600000,$tQ=5000;function py0(A,Q,$={}){let B=new q4,E=B.pipe(G$({shouldCountRefs:!1})),D=$.startDelayMs??0,J=$.checkIntervalMs??QtQ,U=!1,Y=()=>{U=!0};return setImmediate(async()=>{let Z=S.getChild("update");if(D>0){if(await jV(D),U)return}let F=E.subscribe({next:(I)=>{Z.debug("emit new state",I)}}),X=A;try{while(!U){let I=await BtQ(X,Q,Z,B);if(I.stop)return;if(I.updatedTo)X=I.updatedTo;if(I.emittedVisibleState){if(await jV($tQ),U)return;B.next("hidden")}if(J<=0)return;let G=1000,V=J;while(V>0&&!U){let z=Math.min(G,V);await jV(z),V-=z}}}finally{F.unsubscribe(),B.complete()}}),{state:E,dispose:Y}}async function BtQ(A,Q,$,B){let E={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return $.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),E.stop=!0,E;let D=await Q.get("updates.mode");if(D==="disabled")return $.debug("checking disabled"),E.stop=!0,E;let J=await rY(),U=J==="binary"||J==="brew",Y=U?void 0:await Lz();$.debug("checking",{currentVersion:A,mode:D,packageManager:J,isBinaryDistribution:U,npmPackageName:Y});let Z;if(U)Z=await n30(A);else{let I=await o30();Z=await i30(A,I,Y)}if(!(Z.latestVersion&&Z.hasUpdate))return $.debug("no update available"),E;let F=(I)=>{B.next(I),E.emittedVisibleState=!0};if(J){let I=await hG4(J);if(I&&lc(I,Z.latestVersion)>=0){if($.debug("on-disk version already up to date",{currentVersion:A,installedVersion:I,latestVersion:Z.latestVersion}),E.updatedTo=I,lc(A,I)<0){let G=await LX(I),V={from:A,to:I,externallyUpdated:!0,...G};if(G.status==="same")$.info("on-disk already updated by another instance",V),F("updated");else $.warn("on-disk already updated by another instance, with PATH warning",V),F("updated-with-warning")}return E}}let X=()=>{if(Z.currentVersionAge!==void 0&&Z.latestVersionAge!==void 0){let I=Z.currentVersionAge-Z.latestVersionAge,G=0.5;if(Math.abs(I)<0.5)return $.debug("versions too close together, suppressing update warning",{currentVersionAge:Z.currentVersionAge,latestVersionAge:Z.latestVersionAge,ageDifferenceHours:I}),!0}return!1};if(!D)D=J==="pnpm"?"warn":"auto",$.debug("no configured update mode; selected default based on package manager",{packageManager:J,mode:D});if(J==="brew"){if(!X())F("update-available-brew");return E}if(J==="binary"&&process.execPath!==cc()){if($.debug("non-standard binary path, showing warning"),!X())F("update-available-unrecognized-path");return E}if(D==="warn"){if(!X())F("update-available");return E}if(!J){if($.debug("auto-update not supported, falling back to warn mode"),!X())F("update-available");return E}try{await pc(Z.latestVersion,J),E.updatedTo=Z.latestVersion;let I=await LX(Z.latestVersion),G={from:Z.currentVersion,to:Z.latestVersion,...I};if(I.status==="same")$.info("success",G),F("updated");else $.warn("success with warning",G),F("updated-with-warning")}catch(I){F("update-error")}return E}catch(D){return $.debug("check failed",{error:D}),E}}th();import{stderr as sD}from"node:process";function mG4(A){let Q=new uX().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(B)=>{await ky0(B.force||!1,B.verbose||!1,"0.0.1780130685-gfdac38"),process.exit()});A.addCommand(Q,{hidden:!0});let $=new uX("update").alias("up").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(B)=>{await JtQ(B.targetVersion)});A.addCommand($)}function EtQ(A){let Q=Boolean(A.isTTY),$=0,B=!1;function E(){if(!Q||!B)return;A.write(`
|
|
4221
4221
|
`),B=!1,$=0}function D(J){if(!Q)return;let U=J.padEnd($," ");A.write(`\r${U}`),B=!0,$=U.length}return{flushProgressLine:E,renderProgress:D}}function DtQ(A){if(A.source==="npm"&&A.latestVersionAge!==void 0&&A.latestVersionAge>36)sD.write(f0.yellow(`The latest Amp CLI version reported by npm is older than expected. Be aware that you may be using an npm proxy with a corporate policy to delay package updates.
|
|
4222
4222
|
`))}async function JtQ(A){let $=process.platform==="win32"&&Aq()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:B,renderProgress:E}=EtQ(sD);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")sD.write(f0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
4223
4223
|
|
|
4224
4224
|
`));try{if(!A){sD.write(f0.blue(`Checking for updates...
|
|
4225
|
-
`));let U=!1,Y;if(Aq()){let Z=await n30("0.0.
|
|
4226
|
-
`));let X=await LX("0.0.
|
|
4225
|
+
`));let U=!1,Y;if(Aq()){let Z=await n30("0.0.1780130685-gfdac38");U=Z.hasUpdate,Y=Z.latestVersion}else{let Z=await o30(),F=await Lz(),X=await i30("0.0.1780130685-gfdac38",Z,F);DtQ(X),U=X.hasUpdate,Y=X.latestVersion}if(!U){let Z=ic("0.0.1780130685-gfdac38"),F=Z?.age?`released ${Z.age} ago`:`built ${OV(new Date("2026-05-30T08:49:46.106Z"))} ago`;sD.write(f0.green(`✓ Amp is already up to date on version ${"0.0.1780130685-gfdac38"} (${F})
|
|
4226
|
+
`));let X=await LX("0.0.1780130685-gfdac38",$);if(X.warning)sD.write(`
|
|
4227
4227
|
`+f0.yellow(X.warning)+`
|
|
4228
4228
|
`);process.exit(0)}if(!Y)sD.write(f0.yellow("[WARN] could not find latest version")),process.exit(0);A=Y}sD.write(f0.blue(`Updating to version ${A}...
|
|
4229
4229
|
`)),await pc(A,void 0,(U)=>{B(),sD.write(f0.dim(`Running: ${U}
|
|
@@ -4375,7 +4375,7 @@ ${B}`}async function u66(A,Q){if(!Q?.forceExternal&&Q?.onShowImagePreview&&aC4(A
|
|
|
4375
4375
|
`).length,E=new D0({text:new h(A,new $0({color:$}))});if(B<=Z80)return E;return new x0({width:1/0,height:Z80,child:new OB({autofocus:!1,controller:Q,child:E})})}function b76(){return new Map([[WA.key("PageUp"),new F80],[WA.key("PageDown"),new wg0],[WA.ctrl("u"),new F80],[WA.shift("Home"),new Mg0],[WA.shift("End"),new Og0]])}function h76(A,Q,$){return Math.max(Q,Math.min(A,$))}var Lg0=8,Nu4=1,qu4=Lg0-1;class jg0 extends I4{}class Rg0 extends I4{}class X80 extends I4{}class I80 extends I4{}class Pg0 extends I4{}class vg0 extends I4{}class Tg0 extends d0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new uu4}}class uu4 extends m0{messageScroll=new Y$;initState(){super.initState(),this.messageScroll.followMode=!1,this.messageScroll.jumpTo(0)}dispose(){this.messageScroll.dispose(),super.dispose()}build(A){let Q=this.widget.props,$=g76(Q,this.messageScroll),B=m76(Q.options.message),E=B?new W4({actions:this.buildScrollActions(),child:new tQ({debugLabel:"SelectDialogScrollShortcuts",shortcuts:c76(),child:$})}):$,D=[{keys:["↑/↓","j/k"],label:"move"},{keys:["Enter"],label:"select"}];if(B)D.push({keys:["Ctrl+E","Ctrl+Y"],label:"scroll"});return D.push({keys:["Esc"],label:"cancel"}),new o4({header:Q.options.title,minWidth:64,maxWidth:80,footer:D,autofocus:!1,onDismiss:Q.onCancel,child:E})}buildScrollActions(){let A=(Q)=>{let $=p76(this.messageScroll.offset+Q,0,this.messageScroll.maxScrollExtent);this.messageScroll.jumpTo($)};return new Map([[jg0,new dA(()=>A(-Nu4))],[Rg0,new dA(()=>A(Nu4))],[X80,new dA(()=>A(-qu4))],[I80,new dA(()=>A(qu4))],[Pg0,new dA(()=>this.messageScroll.jumpTo(0))],[vg0,new dA(()=>this.messageScroll.jumpTo(this.messageScroll.maxScrollExtent))]])}}function g76(A,Q){let $=A.options.options.map((E)=>({value:E,label:E})),B=Math.max(0,$.findIndex((E)=>E.value===A.options.initialValue));return new kX({options:$,selectedIndex:B,body:d76(A.options.message,Q),onSelect:(E)=>{if(E===null){A.onCancel();return}A.onSelect(E)},padding:n0.all(0),showBorder:!1,showDismissalMessage:!1,enableMouseInteraction:!0,wrapOptions:!0})}function m76(A){if(A===void 0)return!1;return A.split(`
|
|
4376
4376
|
`).length>Lg0}function d76(A,Q){if(A===void 0)return;let $=A.split(`
|
|
4377
4377
|
`).length,B=Math.min($,Lg0);return new x0({width:1/0,height:B,child:new OB({autofocus:!1,controller:Q,child:new D0({text:new h(A)})})})}function c76(){return new Map([[WA.key("PageUp"),new X80],[WA.key("PageDown"),new I80],[WA.ctrl("u"),new X80],[WA.ctrl("d"),new I80],[WA.ctrl("y"),new jg0],[WA.ctrl("e"),new Rg0],[WA.shift("Home"),new Pg0],[WA.shift("End"),new vg0]])}function p76(A,Q,$){return Math.max(Q,Math.min(A,$))}var l76=3,i76=2097152,n76=new BB("PluginDialogOverlay");function G80(A,Q,$){if($!==void 0)return{type:"response",id:A,error:$};if(Q===void 0)return{type:"response",id:A};return{type:"response",id:A,result:Q}}function a76(A){let Q=new TextEncoder().encode(JSON.stringify(A)).byteLength;if(Q<=i76)return;throw Error(`thread.messages response is too large (${Q} bytes). Request fewer messages.`)}class _g0{options;unregisterPluginCommands=null;pluginCommandSubscriptions=[];pluginErrorToastKeys=new Set;activeDialog=null;queuedDialogs=[];resolvingDialog=null;pendingOwnerUIRequests=new Map;pendingActorUIRequests=new Map;stateBackedRequestIDs=new Set;pluginUIRespondRequestCounter=0;statusItems=new Map;blockingConfirmDialog=!1;disposed=!1;constructor(A){this.options=A}init(){this.disposed=!1,this.configurePluginPlatform(),this.subscribePluginCommands()}dispose(){this.disposed=!0,this.unregisterPluginCommands?.(),this.unregisterPluginCommands=null;for(let A of this.pluginCommandSubscriptions)A.unsubscribe();this.pluginCommandSubscriptions=[],this.cancelOwnerUIRequests(),this.cancelPendingDialogs(),this.statusItems.clear(),this.clearPluginPlatformStatusHandlers()}handlePluginMessage(A,Q){let $=A.message;if($.type==="response"){this.cancelOwnerUIRequest($.id),this.cancelActorUIRequest($.id);return}if($.type==="event"){if(this.handlePluginUIStateEvent($,Q))return;this.handlePluginEvent($);return}if(this.stateBackedRequestIDs.has($.id))return;if(!iB0($.method)){if($.method==="thread.messages")this.handleThreadMessagesRequest($,Q);return}this.handleOwnerUIRequest($,Q)}cancelOwnerUIRequests(){let A=[...this.pendingOwnerUIRequests.values(),...this.pendingActorUIRequests.values()];this.pendingOwnerUIRequests.clear(),this.pendingActorUIRequests.clear(),this.stateBackedRequestIDs.clear();for(let Q of A)Q.abort()}hasBlockingDialog(){return this.activeDialog!==null}hasBlockingConfirmDialog(){return this.activeDialog?.kind==="confirm"}buildDialogLayers(){let A=this.activeDialog;if(!A)return[];return[new U$({key:n76,debugLabel:"PluginDialogOverlay",autofocus:!1,canRequestFocus:!0,child:this.buildActiveDialog(A)})]}buildActiveDialog(A){switch(A.kind){case"input":return new Ll({key:new jz(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 ug0({key:new jz(A),options:A.options,onConfirm:()=>this.resolveConfirmDialog(A,!0),onCancel:()=>this.resolveConfirmDialog(A,!1)});case"select":return new Tg0({key:new jz(A),options:A.options,onSelect:(Q)=>this.resolveSelectDialog(A,Q),onCancel:()=>this.resolveSelectDialog(A,void 0)})}}getStatusItems(){return[...this.statusItems.values()].flatMap((A)=>A.value===void 0?[]:[{pluginURI:A.pluginURI,id:A.id,value:A.value}])}configurePluginPlatform(){let A=this.options.context.pluginPlatform;if(!A)return;if(A.showToast=(Q)=>this.options.toastController.show(Q,"success"),A.showOpenedURLToast=(Q)=>{this.options.toastController.show(`Opened URL: ${Q}`,"success",8000)},A.appendToThreadHandler=this.options.context.observerOnly?async()=>{throw Error("thread.append is only available from an executor-owned plugin runtime")}:this.options.appendToThread,this.options.readThreadMessages)A.readThreadMessagesHandler=this.readThreadMessages;A.runAgentHandler=this.options.context.observerOnly?async()=>{throw Error("agent.run is only available from an executor-owned plugin runtime")}:this.options.runAgent??(async()=>{throw Error("agent.run is not available in this context")}),A.showInputDialog=this.showInputDialog,A.showConfirmDialog=this.showConfirmDialog,A.showSelectDialog=this.showSelectDialog,A.createStatusItemHandler=this.createStatusItem,A.updateStatusItemHandler=this.updateStatusItem,A.removeStatusItemHandler=this.removeStatusItem}handlePluginEvent(A){if(A.event!=="ui.notify")return;let Q=A.data;if(typeof Q.message==="string")this.options.toastController.show(Q.message,"success")}async handleThreadMessagesRequest(A,Q){try{let{options:$,threadID:B}=this.parseThreadMessagesRequestParams(A.params),E=await this.readThreadMessages($,B);a76(E),Q(G80(A.id,E))}catch($){Q(G80(A.id,void 0,$ instanceof Error?$.message:String($)))}}parseThreadMessagesRequestParams(A){if(!A||typeof A!=="object")return{options:void 0,threadID:void 0};let Q=A;return{options:Q.options,threadID:typeof Q.threadID==="string"?Q.threadID:void 0}}async handleOwnerUIRequest(A,Q){let $=new AbortController;this.pendingOwnerUIRequests.set(A.id,$);try{let B=await this.dispatchOwnerUIRequest(A,$.signal);if(this.pendingOwnerUIRequests.get(A.id)!==$)return;this.pendingOwnerUIRequests.delete(A.id),Q(G80(A.id,B))}catch(B){if(this.pendingOwnerUIRequests.get(A.id)!==$)return;this.pendingOwnerUIRequests.delete(A.id),Q(G80(A.id,void 0,B instanceof Error?B.message:String(B)))}}dispatchOwnerUIRequest(A,Q){switch(A.method){case"ui.input":return this.showInputDialog(A.params.options,Q);case"ui.confirm":return this.showConfirmDialog(A.params.options,Q);case"ui.select":return this.showSelectDialog(A.params.options,Q);default:throw Error(`Unknown owner UI request method: ${A.method}`)}}cancelOwnerUIRequest(A){let Q=this.pendingOwnerUIRequests.get(A);if(!Q)return;this.pendingOwnerUIRequests.delete(A),Q.abort()}cancelActorUIRequest(A){let Q=this.pendingActorUIRequests.get(A);if(!Q)return;this.pendingActorUIRequests.delete(A),Q.abort()}buildPluginUIRespondRequest(A,Q,$){this.pluginUIRespondRequestCounter+=1;let B={requestId:A};if($!==void 0)B.error=$;else if(Q!==void 0)B.result=Q;return{type:"request",id:`plugin-ui-respond-${A}-${this.pluginUIRespondRequestCounter}`,method:"plugin.ui.respond",params:B}}async handleActorUIRequest(A,Q){let $=new AbortController;this.pendingActorUIRequests.set(A.requestId,$);let B={type:"request",id:A.requestId,method:A.method,params:A.params};try{let E=await this.dispatchOwnerUIRequest(B,$.signal);if(this.pendingActorUIRequests.get(A.requestId)!==$)return;this.pendingActorUIRequests.delete(A.requestId),Q(this.buildPluginUIRespondRequest(A.requestId,E))}catch(E){if(this.pendingActorUIRequests.get(A.requestId)!==$)return;this.pendingActorUIRequests.delete(A.requestId),Q(this.buildPluginUIRespondRequest(A.requestId,void 0,E instanceof Error?E.message:String(E)))}}upsertActorUIState(A,Q){if(this.stateBackedRequestIDs.add(A.requestId),A.status!=="pending"){this.cancelActorUIRequest(A.requestId);return}if(this.pendingActorUIRequests.has(A.requestId))return;this.handleActorUIRequest(A,Q)}handlePluginUISnapshot(A,Q){let $=new Set(A.requests.map((B)=>B.requestId));for(let B of this.pendingActorUIRequests.keys())if(!$.has(B))this.cancelActorUIRequest(B);for(let B of this.stateBackedRequestIDs)if(!$.has(B))this.stateBackedRequestIDs.delete(B);for(let B of A.requests)this.upsertActorUIState(B,Q)}handlePluginUIRequestAdded(A,Q){this.upsertActorUIState(A.request,Q)}handlePluginUIRequestSettled(A,Q){this.upsertActorUIState(A.request,Q)}handlePluginUIRequestRemoved(A){this.cancelActorUIRequest(A.requestId),this.stateBackedRequestIDs.delete(A.requestId)}handlePluginUIStateEvent(A,Q){if(A.event==="plugin.ui.snapshot"){let $=rY4.safeParse(A.data);if($.success)this.handlePluginUISnapshot($.data,Q);return!0}if(A.event==="plugin.ui.request_added"){let $=sY4.safeParse(A.data);if($.success)this.handlePluginUIRequestAdded($.data,Q);return!0}if(A.event==="plugin.ui.request_settled"){let $=tY4.safeParse(A.data);if($.success)this.handlePluginUIRequestSettled($.data,Q);return!0}if(A.event==="plugin.ui.request_removed"){let $=eY4.safeParse(A.data);if($.success)this.handlePluginUIRequestRemoved($.data);return!0}return!1}clearPluginPlatformStatusHandlers(){let A=this.options.context.pluginPlatform;if(!A)return;if(A.readThreadMessagesHandler===this.readThreadMessages)A.readThreadMessagesHandler=null;if(A.createStatusItemHandler===this.createStatusItem)A.createStatusItemHandler=null;if(A.updateStatusItemHandler===this.updateStatusItem)A.updateStatusItemHandler=null;if(A.removeStatusItemHandler===this.removeStatusItem)A.removeStatusItemHandler=null;if(A.runAgentHandler===this.options.runAgent)A.runAgentHandler=null}subscribePluginCommands(){let A=this.options.context.pluginService;if(!A)return;this.refreshPluginCommands(A.commands.list()),this.pluginCommandSubscriptions=[A.plugins.subscribe((Q)=>{this.removeInactivePluginStatusItems(Q),this.showNewPluginErrorToasts(Q),this.refreshPluginCommands(A.commands.list())}),A.commands.changed.subscribe(()=>{this.refreshPluginCommands(A.commands.list())})]}refreshPluginCommands(A){this.unregisterPluginCommands?.();let $=A.map((B)=>this.createPluginCommand(B)).map((B)=>this.options.commandRegistry.register(B));this.unregisterPluginCommands=()=>{for(let B of $)B()}}showNewPluginErrorToasts(A){let Q=new Set;for(let $ of A){if($.status!=="error")continue;if(Zh($.errorMessage))continue;let B=`${$.uri.toString()}
|
|
4378
|
-
${$.errorMessage??""}`;if(Q.add(B),this.pluginErrorToastKeys.has(B))continue;this.options.toastController.show(this.formatPluginErrorToast($),"error",8000)}this.pluginErrorToastKeys=Q}removeInactivePluginStatusItems(A){let Q=new Set(A.filter((B)=>B.status==="active").map((B)=>B.uri.toString())),$=[];for(let[B,E]of this.statusItems){if(Q.has(E.pluginURI))continue;$.push(B)}if($.length===0)return;this.updateStatusItemState(()=>{for(let B of $)this.statusItems.delete(B)})}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.context.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,status:A.availability,run:async(Q,$,B)=>{B();try{await this.options.context.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(E){S.error("Neo plugin command failed",{error:E,command:A}),this.options.toastController.show(E instanceof Error?E.message:String(E),"error",5000)}}}}showInputDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"input",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showConfirmDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(!1);return}let B={kind:"confirm",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showSelectDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"select",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};createStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let B=this.statusItemKey(A,Q),E={pluginURI:A,id:Q};if($!==void 0)E.value=$;this.statusItems.set(B,E)})};updateStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.set(this.statusItemKey(A,Q),{pluginURI:A,id:Q,value:$})})};removeStatusItem=(A,Q)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.delete(this.statusItemKey(A,Q))})};readThreadMessages=(A,Q)=>{let $=this.options.readThreadMessages;if(!$)return Promise.reject(Error("thread.messages is not available - no active thread"));return $(A,Q)};updateStatusItemState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}statusItemKey(A,Q){return`${A}\x00${Q}`}cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[],this.resolvingDialog=null,this.emitBlockingConfirmDialogChange();for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.abortUnsubscribe(),A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}abortDialog(A){if(this.activeDialog===A){this.advanceDialog(),this.cancelDialog(A);return}let Q=this.queuedDialogs.indexOf(A);if(Q===-1)return;this.updateDialogState(()=>{this.queuedDialogs.splice(Q,1)}),this.cancelDialog(A)}enqueueDialog(A){if(this.activeDialog){if(this.queuedDialogs.push(A),this.resolvingDialog===this.activeDialog)this.advanceResolvingDialog(this.activeDialog);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A}),this.emitBlockingConfirmDialogChange()}resolveInputDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveConfirmDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveSelectDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveDialog(A,Q){if(this.activeDialog!==A||this.resolvingDialog===A)return;this.resolvingDialog=A,A.abortUnsubscribe(),Q(),this.scheduleResolvingDialogAdvance(A,l76)}scheduleResolvingDialogAdvance(A,Q){M6.instance.addPostFrameCallback(()=>{if(this.activeDialog!==A)return;if(this.queuedDialogs.length>0||Q<=1){this.advanceResolvingDialog(A);return}this.scheduleResolvingDialogAdvance(A,Q-1)},"PluginIntegration.advanceDialog")}advanceResolvingDialog(A){if(this.resolvingDialog===A)this.resolvingDialog=null;if(this.activeDialog!==A)return;this.advanceDialog()}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A();this.emitBlockingConfirmDialogChange()}emitBlockingConfirmDialogChange(){let A=this.hasBlockingConfirmDialog();if(A===this.blockingConfirmDialog)return;this.blockingConfirmDialog=A,this.options.onBlockingConfirmDialogChange?.(A)}}a0();import{spawnSync as o76}from"node:child_process";import V9 from"node:process";var wu4={options:new Set(["settings-file","log-level","log-file","mcp-config"]),booleans:new Set(["color","dangerously-allow-all","ide","jetbrains","neo-orb","notifications"])};function jl(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else Z1.instance.stop()}function Mu4(A){return{noun:"amp",verb:"Relaunch (Quit & Reopen)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update"],shortcut:V9.env.NODE_ENV==="development"&&V9.platform==="darwin"?WA.meta("r"):void 0,status:{type:"enabled"},sortBoost:90,run:(Q,$,B)=>{B(),jl(A)}}}function r76(A,Q){let{command:$,args:B}=s76(A),E=V9.execve,D=V9.platform==="win32"||!E,J=D?"spawnSync":"execve";if(S.info("Relaunching Amp; threads will be resumed",{threadIDs:A,relaunchMethod:J}),D){let U=o76($,B,{cwd:Q,env:V9.env,stdio:"inherit"});if(U.error)return S.error("Failed to relaunch Amp",{error:U.error}),1;return U.status??1}try{if(V9.chdir(Q),$.includes("/"))return E($,[$,...B],V9.env);return E("/usr/bin/env",["env",$,...B],V9.env)}catch(U){return S.error("Failed to relaunch Amp",{error:U}),1}}class Sg0{relaunchRequested=!1;requestedThreadIDs=[];request=(A)=>{S.info("Relaunch requested; threads will be resumed",{threadIDs:A}),this.relaunchRequested=!0,this.requestedThreadIDs=A};get shouldShowExitSummary(){return!this.relaunchRequested}relaunchIfRequested(A){if(!this.relaunchRequested)return;return r76(this.requestedThreadIDs,A)}}function s76(A){let Q=A.length>0?["threads","continue",...A]:[],$=t76(V9.argv),B=A86();if(B)return{command:B.command,args:[...B.args,...$,...Q]};let E=V9.argv[1],D=E&&e76(E)?[E]:[];return{command:V9.execPath,args:[...D,...$,...Q]}}function t76(A){let Q=[],$=A.slice(2);for(let B=0;B<$.length;B+=1){let E=$[B];if(!E?.startsWith("--"))continue;let[D,J]=E.split("=",2);if(!D)continue;let U=D.slice(2),Y=U.startsWith("no-")?U.slice(3):U;if(wu4.booleans.has(Y)){Q.push(E);continue}if(!wu4.options.has(U))continue;if(J!==void 0){Q.push(E);continue}let Z=$[B+1];if(Z===void 0||Z.startsWith("--"))continue;Q.push(E,Z),B+=1}return Q}function e76(A){return A!==V9.execPath&&!A.startsWith("/$bunfs/")}function A86(){if(V9.env.NODE_ENV!=="development")return null;let A=V9.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=Q86(A),$=Q[0];if(!$)return null;return{command:$,args:Q.slice(1)}}function Q86(A){if(A.startsWith("["))try{let Q=JSON.parse(A);if(Array.isArray(Q)&&Q.every(($)=>typeof $==="string"))return Q}catch{return[]}return A.split(/\s+/).filter(Boolean)}var $86=48;class kg0{visible=!1;onClick=void 0;listeners=new Set;show(A){this.visible=!0,this.onClick=A,this.notifyListeners()}activate(){this.onClick?.()}get isVisible(){return this.visible}dismiss(){this.visible=!1,this.onClick=void 0,this.notifyListeners()}addListener(A){this.listeners.add(A)}removeListener(A){this.listeners.delete(A)}buildComplexToast(){if(!this.visible||!this.onClick)return null;return new wl({width:$86,title:"Relaunch to Update Amp",message:"Your threads will resume.",variant:"success",mouseBehavior:"click-anywhere",action:{keyboardShortcut:"Ctrl+O",command:"amp: relaunch",confirmShortcut:"Enter",label:"relaunch",onAction:()=>this.activate()}})}notifyListeners(){for(let A of this.listeners)A()}}import{readFile as B86}from"node:fs/promises";import fg0 from"node:os";g$();function E86(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function Ou4(A,Q){try{return{path:Q,contents:xk0(await B86(A,"utf8"))}}catch{return null}}async function V80(A,Q){let $=[],B=E86(),E=await O4.getThread({thread:Q},{config:A.configService}),D=E.ok?E.result.thread.data:null;$.push({path:`${B}/thread.json`,contents:JSON.stringify(iY(D),null,2)});let J=await Ou4(OP(Q),`${B}/logs/${Q}.log`);if(J)$.push(J);let U=await Ou4(A.settingsFilePath,`${B}/settings/global.json`);if(U)$.push(U);let Y=await rY()??"unknown",Z=await O4.sendReport({threadID:Q,files:$,metadata:{clientVersion:"0.0.1780118009-g45d3ab",clientOS:`${fg0.platform()} ${fg0.release()} ${fg0.arch()}`,installMethod:Y}},{config:A.configService});if(!Z.ok)throw Error(`Failed to submit report: ${Z.error.message}`);return Z.result.reportID}class yg0{backStack=[];forwardStack=[];canNavigateBack(){return this.backStack.length>0}canNavigateForward(){return this.forwardStack.length>0}recordNavigation(A){if(!A)return;this.backStack.push(A),this.forwardStack.length=0}startBackNavigation(A){let Q=this.backStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.backStack.pop();this.forwardStack.push(Q)}}}}var D86=86400000;class xg0{options;subscription=null;relaunchNotificationShown=!1;relaunchNotificationPending=!1;relaunchNotificationTimer=null;openedAt=Date.now();constructor(A){this.options=A}init(){if(this.subscription=this.options.updateService?.state.subscribe((A)=>{this.handleUpdateState(A)})??null,process.env.DEV_SHOW_RELAUNCH_NOTIF_ON_STARTUP==="1")this.showUpdateRelaunchNotification(!0)}dispose(){if(this.subscription?.unsubscribe(),this.subscription=null,this.relaunchNotificationTimer)clearTimeout(this.relaunchNotificationTimer),this.relaunchNotificationTimer=null}handleUpdateState(A){if(A!=="updated")return;this.showUpdateRelaunchNotification()}showUpdateRelaunchNotification(A=!1){if(this.relaunchNotificationShown)return;let $=(this.options.minimumOpenDurationMs??D86)-(Date.now()-this.openedAt);if($>0&&!A){if(this.relaunchNotificationPending=!0,!this.relaunchNotificationTimer)this.relaunchNotificationTimer=setTimeout(()=>{if(this.relaunchNotificationTimer=null,!this.relaunchNotificationPending)return;this.relaunchNotificationPending=!1,this.showUpdateRelaunchNotification()},$),this.relaunchNotificationTimer.unref();return}this.relaunchNotificationPending=!1,this.relaunchNotificationShown=!0,this.options.relaunchNotificationController.show(()=>jl(this.options))}}class z80 extends O6{offstage;constructor({key:A,offstage:Q=!0,child:$}){super({key:A,child:$});this.offstage=Q}createRenderObject(){return new bg0(this.offstage)}updateRenderObject(A){if(A instanceof bg0)A.offstage=this.offstage}}class bg0 extends fA{_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;iA(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let $=A.constrain(Q.size.width,Q.size.height);this.setSize($.width,$.height),Q.setOffset(0,0)}else{let $=A.smallest;this.setSize($.width,$.height)}super.performLayout()}paint(A,Q,$){if(this._offstage)return;super.paint(A,Q,$)}hitTest(A,Q,$,B){if(this._offstage)return!1;return super.hitTest(A,Q,$,B)}}class Rl{_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 hg0 extends d0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new Lu4}}class Lu4 extends m0{entries=[];initState(){this.widget.controller._attach(this)}didUpdateWidget(A){if(A.controller!==this.widget.controller)A.controller._detach(),this.widget.controller._attach(this)}dispose(){this.widget.controller._detach(),super.dispose()}push(A){let Q=new gP,$=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:$})})}pushWithDismiss(A){let Q=new gP,$=this.makeScopedDismiss(Q),B=A($);this.setState(()=>{this.entries.push({key:Q,widget:B,dismiss:$})})}pop(){if(this.entries.length===0)return!1;return this.setState(()=>{this.entries.pop()}),!0}get canPop(){return this.entries.length>0}makeScopedDismiss(A){return()=>{if(!this.mounted)return;let Q=this.entries[this.entries.length-1];if(!Q||Q.key!==A)return;this.setState(()=>{this.entries.pop()})}}build(A){let Q=[];Q.push(new z80({offstage:this.entries.length>0,child:this.widget.root}));for(let $=0;$<this.entries.length;$++){let B=this.entries[$],E=$===this.entries.length-1,D=E?new U$({autofocus:!0,debugLabel:`ModalStackEntry[${$}]`,onKey:(J)=>{if(J.key!=="Escape")return"ignored";return B.dismiss(),"handled"},child:B.widget}):B.widget;Q.push(new z80({key:B.key,offstage:!E,child:D}))}return new t1({fit:"expand",children:Q})}}class mg0 extends Q4{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter((E)=>E.status.type!=="hidden"),$=U86(Q),B="";return new o4({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:n0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new w5({items:Q,showBorder:!1,getLabel:(E)=>{let D=gg0(E);return E.keywords&&E.keywords.length>0?`${D} ${E.keywords.join(" ").toLowerCase()}`:D},onQueryChange:(E)=>{B=E},sortItems:(E,D,J)=>{B=J;let U=J.trim().toLowerCase();if(U===""){let V=E.item.status.type==="disabled"?1:0,z=D.item.status.type==="disabled"?1:0;if(V!==z)return V-z;let K=E.item.sortBoost??0,W=D.item.sortBoost??0;if(K!==W)return W-K;let C=E.item.noun?.toLowerCase()??"",H=D.item.noun?.toLowerCase()??"";if(C!==H)return C<H?-1:1;return 0}let Y=ju4(E.item,U),Z=ju4(D.item,U);if(Y!==Z)return Y?-1:1;let F=wq(E.item.verb.toLowerCase(),J),X=wq(D.item.verb.toLowerCase(),J);if(F!==X)return X-F;let I=wq(gg0(E.item),J),G=wq(gg0(D.item),J);if(I!==G)return G-I;return D.score-E.score},isItemDisabled:(E)=>E.status.type==="disabled",buildDisabledReasonWidget:(E,D)=>{if(E.status.type!=="disabled")return;let{colors:J}=EA.of(D);return new D0({text:new h(E.status.reason,new $0({color:J.mutedForeground,dim:!0})),textAlign:"center",maxLines:1,overflow:"ellipsis"})},renderItem:(E,D,J,U)=>new Ru4({command:E,isSelected:D,isDisabled:J,categoryWidth:$,query:B,buildContext:U}),onAccept:(E)=>{this.props.onAccept(E)},onDismiss:this.props.onDismiss})})}}class Ru4 extends Q4{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:$,isDisabled:B,categoryWidth:E,query:D,buildContext:J}=this.props,U=EA.of(J),{colors:Y,app:Z}=U,F=$?Z.selectionBackground:void 0,X=$?Z.selectionForeground:Y.foreground,I=$?X:Y.mutedForeground,G=new D0({text:new h(Q.noun?.toLowerCase()??"",new $0({color:I,dim:B||!$})),textAlign:"right",maxLines:1,overflow:"ellipsis"}),V=Q.verb.toLowerCase();if(B)V+=" (unavailable)";let z=J86(Q,D);if(z)V+=` (alias: ${z})`;let K=new D0({text:new h(V,new $0({color:X,bold:!0,dim:B})),maxLines:1,overflow:"ellipsis"}),W=[{child:G,fixedWidth:E},{child:K,expanded:!0}];if(Q.shortcut)W.push({child:Y86(Q.shortcut,U,B)});return new Pu4({columns:W,padding:n0.horizontal(1),backgroundColor:F})}}function gg0(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function ju4(A,Q){return A.keywords?.some(($)=>$.trim().toLowerCase()===Q)??!1}function J86(A,Q){let $=Q.trim().toLowerCase();if($==="")return;return A.keywords?.find((B)=>B.trim().toLowerCase()===$)}function U86(A){return A.reduce((Q,$)=>{return $.noun?Math.max(Q,mA($.noun)):Q},0)}function Y86(A,Q,$){let{app:B}=Q,E=new $0({color:B.keybind,bold:!0,dim:$}),D=[],J=PX(A.toString()).split("+");for(let U=0;U<J.length;U++){if(U>0)D.push(new h("+",E));D.push(new h(J[U],E))}return D0.spans(D)}class Pu4 extends Q4{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:$=2,padding:B,backgroundColor:E}=this.props,D=[];for(let U=0;U<Q.length;U++){let Y=Q[U];if(U>0&&$>0)D.push(new x0({width:$}));if(Y.fixedWidth!==void 0)D.push(new x0({width:Y.fixedWidth,child:Y.child}));else if(Y.expanded)D.push(new u4({child:Y.child}));else D.push(Y.child)}let J=new wA({crossAxisAlignment:"start",children:D});if(!B&&!E)return J;return new GA({decoration:E?{color:E}:void 0,padding:B,child:J})}}class dg0{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#$(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#$()}}findByID(A){return this.#A.find((Q)=>Q.id===A)}runByID(A,Q){let $=this.findByID(A);if(!$||$.status.type!=="enabled")return!1;return $.run(new Rl,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#$(){for(let A of this.#Q)A()}}class oB extends gQ{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=oB.maybeOf(A);if(!Q)throw Error("No CommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(oB)?.commandRegistry??null}}class cg0 extends d0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new vu4}}class vu4 extends m0{modalStack=new Rl;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=oB.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=oB.of(A).commands,$=new mg0({commands:Q,onAccept:(B)=>{B.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new hg0({root:$,controller:this.modalStack})}}var Tu4=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],_u4=[{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 K80 extends Q4{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let $=V4.of(A).size.width<50,B=[];for(let E of this.items){let[D,J]=this.renderRow(E),U;if($)U=new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:[D,new yA({padding:n0.only({left:4}),child:J})]});else U=new wA({crossAxisAlignment:"start",children:[new u4({flex:1,child:D}),new x0({width:1}),new u4({flex:1,child:J})]});B.push(new yA({padding:n0.horizontal(6),child:U}))}return new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:B})}}function Z86(A){let Q=[...A.keys];if(A.input)Q.push(A.input);return PX(Q.join("+"))}class pg0 extends Q4{commands;onDismiss;constructor(A){super();this.commands=A.commands,this.onDismiss=A.onDismiss}build(A){let Q=EA.of(A),{colors:$,app:B}=Q,E=V4.of(A),D=new $0({color:$.secondary,bold:!0}),J=new $0({color:B.keybind}),U=new $0({color:B.command}),Y=new $0({color:$.foreground}),Z=Math.max(40,Math.min(80,E.size.width-4)),X=[...this.commands.filter((V)=>{let z=V.noun?.toLowerCase();return z!=="dev"&&z!=="debug"&&V.status.type!=="hidden"})].sort((V,z)=>{let K=(V.noun??"").toLowerCase(),W=(z.noun??"").toLowerCase(),C=K.localeCompare(W);if(C!==0)return C;return V.verb.toLowerCase().localeCompare(z.verb.toLowerCase())}),I=(V)=>{let z=V.methods.map((K)=>Z86(K)).join(", ");return[new D0({text:new h(z,J)}),new D0({text:new h(V.description,Y)})]},G=new OB({autofocus:!0,child:new GA({constraints:new U4(Z,Z,0,Number.POSITIVE_INFINITY),child:new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:[new yA({padding:n0.horizontal(2),child:new D0({text:new h(`Editor Shortcuts
|
|
4378
|
+
${$.errorMessage??""}`;if(Q.add(B),this.pluginErrorToastKeys.has(B))continue;this.options.toastController.show(this.formatPluginErrorToast($),"error",8000)}this.pluginErrorToastKeys=Q}removeInactivePluginStatusItems(A){let Q=new Set(A.filter((B)=>B.status==="active").map((B)=>B.uri.toString())),$=[];for(let[B,E]of this.statusItems){if(Q.has(E.pluginURI))continue;$.push(B)}if($.length===0)return;this.updateStatusItemState(()=>{for(let B of $)this.statusItems.delete(B)})}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.context.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,status:A.availability,run:async(Q,$,B)=>{B();try{await this.options.context.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(E){S.error("Neo plugin command failed",{error:E,command:A}),this.options.toastController.show(E instanceof Error?E.message:String(E),"error",5000)}}}}showInputDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"input",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showConfirmDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(!1);return}let B={kind:"confirm",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showSelectDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"select",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};createStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let B=this.statusItemKey(A,Q),E={pluginURI:A,id:Q};if($!==void 0)E.value=$;this.statusItems.set(B,E)})};updateStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.set(this.statusItemKey(A,Q),{pluginURI:A,id:Q,value:$})})};removeStatusItem=(A,Q)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.delete(this.statusItemKey(A,Q))})};readThreadMessages=(A,Q)=>{let $=this.options.readThreadMessages;if(!$)return Promise.reject(Error("thread.messages is not available - no active thread"));return $(A,Q)};updateStatusItemState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}statusItemKey(A,Q){return`${A}\x00${Q}`}cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[],this.resolvingDialog=null,this.emitBlockingConfirmDialogChange();for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.abortUnsubscribe(),A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}abortDialog(A){if(this.activeDialog===A){this.advanceDialog(),this.cancelDialog(A);return}let Q=this.queuedDialogs.indexOf(A);if(Q===-1)return;this.updateDialogState(()=>{this.queuedDialogs.splice(Q,1)}),this.cancelDialog(A)}enqueueDialog(A){if(this.activeDialog){if(this.queuedDialogs.push(A),this.resolvingDialog===this.activeDialog)this.advanceResolvingDialog(this.activeDialog);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A}),this.emitBlockingConfirmDialogChange()}resolveInputDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveConfirmDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveSelectDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveDialog(A,Q){if(this.activeDialog!==A||this.resolvingDialog===A)return;this.resolvingDialog=A,A.abortUnsubscribe(),Q(),this.scheduleResolvingDialogAdvance(A,l76)}scheduleResolvingDialogAdvance(A,Q){M6.instance.addPostFrameCallback(()=>{if(this.activeDialog!==A)return;if(this.queuedDialogs.length>0||Q<=1){this.advanceResolvingDialog(A);return}this.scheduleResolvingDialogAdvance(A,Q-1)},"PluginIntegration.advanceDialog")}advanceResolvingDialog(A){if(this.resolvingDialog===A)this.resolvingDialog=null;if(this.activeDialog!==A)return;this.advanceDialog()}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A();this.emitBlockingConfirmDialogChange()}emitBlockingConfirmDialogChange(){let A=this.hasBlockingConfirmDialog();if(A===this.blockingConfirmDialog)return;this.blockingConfirmDialog=A,this.options.onBlockingConfirmDialogChange?.(A)}}a0();import{spawnSync as o76}from"node:child_process";import V9 from"node:process";var wu4={options:new Set(["settings-file","log-level","log-file","mcp-config"]),booleans:new Set(["color","dangerously-allow-all","ide","jetbrains","neo-orb","notifications"])};function jl(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else Z1.instance.stop()}function Mu4(A){return{noun:"amp",verb:"Relaunch (Quit & Reopen)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update"],shortcut:V9.env.NODE_ENV==="development"&&V9.platform==="darwin"?WA.meta("r"):void 0,status:{type:"enabled"},sortBoost:90,run:(Q,$,B)=>{B(),jl(A)}}}function r76(A,Q){let{command:$,args:B}=s76(A),E=V9.execve,D=V9.platform==="win32"||!E,J=D?"spawnSync":"execve";if(S.info("Relaunching Amp; threads will be resumed",{threadIDs:A,relaunchMethod:J}),D){let U=o76($,B,{cwd:Q,env:V9.env,stdio:"inherit"});if(U.error)return S.error("Failed to relaunch Amp",{error:U.error}),1;return U.status??1}try{if(V9.chdir(Q),$.includes("/"))return E($,[$,...B],V9.env);return E("/usr/bin/env",["env",$,...B],V9.env)}catch(U){return S.error("Failed to relaunch Amp",{error:U}),1}}class Sg0{relaunchRequested=!1;requestedThreadIDs=[];request=(A)=>{S.info("Relaunch requested; threads will be resumed",{threadIDs:A}),this.relaunchRequested=!0,this.requestedThreadIDs=A};get shouldShowExitSummary(){return!this.relaunchRequested}relaunchIfRequested(A){if(!this.relaunchRequested)return;return r76(this.requestedThreadIDs,A)}}function s76(A){let Q=A.length>0?["threads","continue",...A]:[],$=t76(V9.argv),B=A86();if(B)return{command:B.command,args:[...B.args,...$,...Q]};let E=V9.argv[1],D=E&&e76(E)?[E]:[];return{command:V9.execPath,args:[...D,...$,...Q]}}function t76(A){let Q=[],$=A.slice(2);for(let B=0;B<$.length;B+=1){let E=$[B];if(!E?.startsWith("--"))continue;let[D,J]=E.split("=",2);if(!D)continue;let U=D.slice(2),Y=U.startsWith("no-")?U.slice(3):U;if(wu4.booleans.has(Y)){Q.push(E);continue}if(!wu4.options.has(U))continue;if(J!==void 0){Q.push(E);continue}let Z=$[B+1];if(Z===void 0||Z.startsWith("--"))continue;Q.push(E,Z),B+=1}return Q}function e76(A){return A!==V9.execPath&&!A.startsWith("/$bunfs/")}function A86(){if(V9.env.NODE_ENV!=="development")return null;let A=V9.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=Q86(A),$=Q[0];if(!$)return null;return{command:$,args:Q.slice(1)}}function Q86(A){if(A.startsWith("["))try{let Q=JSON.parse(A);if(Array.isArray(Q)&&Q.every(($)=>typeof $==="string"))return Q}catch{return[]}return A.split(/\s+/).filter(Boolean)}var $86=48;class kg0{visible=!1;onClick=void 0;listeners=new Set;show(A){this.visible=!0,this.onClick=A,this.notifyListeners()}activate(){this.onClick?.()}get isVisible(){return this.visible}dismiss(){this.visible=!1,this.onClick=void 0,this.notifyListeners()}addListener(A){this.listeners.add(A)}removeListener(A){this.listeners.delete(A)}buildComplexToast(){if(!this.visible||!this.onClick)return null;return new wl({width:$86,title:"Relaunch to Update Amp",message:"Your threads will resume.",variant:"success",mouseBehavior:"click-anywhere",action:{keyboardShortcut:"Ctrl+O",command:"amp: relaunch",confirmShortcut:"Enter",label:"relaunch",onAction:()=>this.activate()}})}notifyListeners(){for(let A of this.listeners)A()}}import{readFile as B86}from"node:fs/promises";import fg0 from"node:os";g$();function E86(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function Ou4(A,Q){try{return{path:Q,contents:xk0(await B86(A,"utf8"))}}catch{return null}}async function V80(A,Q){let $=[],B=E86(),E=await O4.getThread({thread:Q},{config:A.configService}),D=E.ok?E.result.thread.data:null;$.push({path:`${B}/thread.json`,contents:JSON.stringify(iY(D),null,2)});let J=await Ou4(OP(Q),`${B}/logs/${Q}.log`);if(J)$.push(J);let U=await Ou4(A.settingsFilePath,`${B}/settings/global.json`);if(U)$.push(U);let Y=await rY()??"unknown",Z=await O4.sendReport({threadID:Q,files:$,metadata:{clientVersion:"0.0.1780130685-gfdac38",clientOS:`${fg0.platform()} ${fg0.release()} ${fg0.arch()}`,installMethod:Y}},{config:A.configService});if(!Z.ok)throw Error(`Failed to submit report: ${Z.error.message}`);return Z.result.reportID}class yg0{backStack=[];forwardStack=[];canNavigateBack(){return this.backStack.length>0}canNavigateForward(){return this.forwardStack.length>0}recordNavigation(A){if(!A)return;this.backStack.push(A),this.forwardStack.length=0}startBackNavigation(A){let Q=this.backStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.backStack.pop();this.forwardStack.push(Q)}}}}var D86=86400000;class xg0{options;subscription=null;relaunchNotificationShown=!1;relaunchNotificationPending=!1;relaunchNotificationTimer=null;openedAt=Date.now();constructor(A){this.options=A}init(){if(this.subscription=this.options.updateService?.state.subscribe((A)=>{this.handleUpdateState(A)})??null,process.env.DEV_SHOW_RELAUNCH_NOTIF_ON_STARTUP==="1")this.showUpdateRelaunchNotification(!0)}dispose(){if(this.subscription?.unsubscribe(),this.subscription=null,this.relaunchNotificationTimer)clearTimeout(this.relaunchNotificationTimer),this.relaunchNotificationTimer=null}handleUpdateState(A){if(A!=="updated")return;this.showUpdateRelaunchNotification()}showUpdateRelaunchNotification(A=!1){if(this.relaunchNotificationShown)return;let $=(this.options.minimumOpenDurationMs??D86)-(Date.now()-this.openedAt);if($>0&&!A){if(this.relaunchNotificationPending=!0,!this.relaunchNotificationTimer)this.relaunchNotificationTimer=setTimeout(()=>{if(this.relaunchNotificationTimer=null,!this.relaunchNotificationPending)return;this.relaunchNotificationPending=!1,this.showUpdateRelaunchNotification()},$),this.relaunchNotificationTimer.unref();return}this.relaunchNotificationPending=!1,this.relaunchNotificationShown=!0,this.options.relaunchNotificationController.show(()=>jl(this.options))}}class z80 extends O6{offstage;constructor({key:A,offstage:Q=!0,child:$}){super({key:A,child:$});this.offstage=Q}createRenderObject(){return new bg0(this.offstage)}updateRenderObject(A){if(A instanceof bg0)A.offstage=this.offstage}}class bg0 extends fA{_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;iA(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let $=A.constrain(Q.size.width,Q.size.height);this.setSize($.width,$.height),Q.setOffset(0,0)}else{let $=A.smallest;this.setSize($.width,$.height)}super.performLayout()}paint(A,Q,$){if(this._offstage)return;super.paint(A,Q,$)}hitTest(A,Q,$,B){if(this._offstage)return!1;return super.hitTest(A,Q,$,B)}}class Rl{_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 hg0 extends d0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new Lu4}}class Lu4 extends m0{entries=[];initState(){this.widget.controller._attach(this)}didUpdateWidget(A){if(A.controller!==this.widget.controller)A.controller._detach(),this.widget.controller._attach(this)}dispose(){this.widget.controller._detach(),super.dispose()}push(A){let Q=new gP,$=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:$})})}pushWithDismiss(A){let Q=new gP,$=this.makeScopedDismiss(Q),B=A($);this.setState(()=>{this.entries.push({key:Q,widget:B,dismiss:$})})}pop(){if(this.entries.length===0)return!1;return this.setState(()=>{this.entries.pop()}),!0}get canPop(){return this.entries.length>0}makeScopedDismiss(A){return()=>{if(!this.mounted)return;let Q=this.entries[this.entries.length-1];if(!Q||Q.key!==A)return;this.setState(()=>{this.entries.pop()})}}build(A){let Q=[];Q.push(new z80({offstage:this.entries.length>0,child:this.widget.root}));for(let $=0;$<this.entries.length;$++){let B=this.entries[$],E=$===this.entries.length-1,D=E?new U$({autofocus:!0,debugLabel:`ModalStackEntry[${$}]`,onKey:(J)=>{if(J.key!=="Escape")return"ignored";return B.dismiss(),"handled"},child:B.widget}):B.widget;Q.push(new z80({key:B.key,offstage:!E,child:D}))}return new t1({fit:"expand",children:Q})}}class mg0 extends Q4{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter((E)=>E.status.type!=="hidden"),$=U86(Q),B="";return new o4({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:n0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new w5({items:Q,showBorder:!1,getLabel:(E)=>{let D=gg0(E);return E.keywords&&E.keywords.length>0?`${D} ${E.keywords.join(" ").toLowerCase()}`:D},onQueryChange:(E)=>{B=E},sortItems:(E,D,J)=>{B=J;let U=J.trim().toLowerCase();if(U===""){let V=E.item.status.type==="disabled"?1:0,z=D.item.status.type==="disabled"?1:0;if(V!==z)return V-z;let K=E.item.sortBoost??0,W=D.item.sortBoost??0;if(K!==W)return W-K;let C=E.item.noun?.toLowerCase()??"",H=D.item.noun?.toLowerCase()??"";if(C!==H)return C<H?-1:1;return 0}let Y=ju4(E.item,U),Z=ju4(D.item,U);if(Y!==Z)return Y?-1:1;let F=wq(E.item.verb.toLowerCase(),J),X=wq(D.item.verb.toLowerCase(),J);if(F!==X)return X-F;let I=wq(gg0(E.item),J),G=wq(gg0(D.item),J);if(I!==G)return G-I;return D.score-E.score},isItemDisabled:(E)=>E.status.type==="disabled",buildDisabledReasonWidget:(E,D)=>{if(E.status.type!=="disabled")return;let{colors:J}=EA.of(D);return new D0({text:new h(E.status.reason,new $0({color:J.mutedForeground,dim:!0})),textAlign:"center",maxLines:1,overflow:"ellipsis"})},renderItem:(E,D,J,U)=>new Ru4({command:E,isSelected:D,isDisabled:J,categoryWidth:$,query:B,buildContext:U}),onAccept:(E)=>{this.props.onAccept(E)},onDismiss:this.props.onDismiss})})}}class Ru4 extends Q4{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:$,isDisabled:B,categoryWidth:E,query:D,buildContext:J}=this.props,U=EA.of(J),{colors:Y,app:Z}=U,F=$?Z.selectionBackground:void 0,X=$?Z.selectionForeground:Y.foreground,I=$?X:Y.mutedForeground,G=new D0({text:new h(Q.noun?.toLowerCase()??"",new $0({color:I,dim:B||!$})),textAlign:"right",maxLines:1,overflow:"ellipsis"}),V=Q.verb.toLowerCase();if(B)V+=" (unavailable)";let z=J86(Q,D);if(z)V+=` (alias: ${z})`;let K=new D0({text:new h(V,new $0({color:X,bold:!0,dim:B})),maxLines:1,overflow:"ellipsis"}),W=[{child:G,fixedWidth:E},{child:K,expanded:!0}];if(Q.shortcut)W.push({child:Y86(Q.shortcut,U,B)});return new Pu4({columns:W,padding:n0.horizontal(1),backgroundColor:F})}}function gg0(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function ju4(A,Q){return A.keywords?.some(($)=>$.trim().toLowerCase()===Q)??!1}function J86(A,Q){let $=Q.trim().toLowerCase();if($==="")return;return A.keywords?.find((B)=>B.trim().toLowerCase()===$)}function U86(A){return A.reduce((Q,$)=>{return $.noun?Math.max(Q,mA($.noun)):Q},0)}function Y86(A,Q,$){let{app:B}=Q,E=new $0({color:B.keybind,bold:!0,dim:$}),D=[],J=PX(A.toString()).split("+");for(let U=0;U<J.length;U++){if(U>0)D.push(new h("+",E));D.push(new h(J[U],E))}return D0.spans(D)}class Pu4 extends Q4{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:$=2,padding:B,backgroundColor:E}=this.props,D=[];for(let U=0;U<Q.length;U++){let Y=Q[U];if(U>0&&$>0)D.push(new x0({width:$}));if(Y.fixedWidth!==void 0)D.push(new x0({width:Y.fixedWidth,child:Y.child}));else if(Y.expanded)D.push(new u4({child:Y.child}));else D.push(Y.child)}let J=new wA({crossAxisAlignment:"start",children:D});if(!B&&!E)return J;return new GA({decoration:E?{color:E}:void 0,padding:B,child:J})}}class dg0{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#$(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#$()}}findByID(A){return this.#A.find((Q)=>Q.id===A)}runByID(A,Q){let $=this.findByID(A);if(!$||$.status.type!=="enabled")return!1;return $.run(new Rl,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#$(){for(let A of this.#Q)A()}}class oB extends gQ{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=oB.maybeOf(A);if(!Q)throw Error("No CommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(oB)?.commandRegistry??null}}class cg0 extends d0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new vu4}}class vu4 extends m0{modalStack=new Rl;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=oB.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=oB.of(A).commands,$=new mg0({commands:Q,onAccept:(B)=>{B.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new hg0({root:$,controller:this.modalStack})}}var Tu4=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],_u4=[{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 K80 extends Q4{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let $=V4.of(A).size.width<50,B=[];for(let E of this.items){let[D,J]=this.renderRow(E),U;if($)U=new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:[D,new yA({padding:n0.only({left:4}),child:J})]});else U=new wA({crossAxisAlignment:"start",children:[new u4({flex:1,child:D}),new x0({width:1}),new u4({flex:1,child:J})]});B.push(new yA({padding:n0.horizontal(6),child:U}))}return new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:B})}}function Z86(A){let Q=[...A.keys];if(A.input)Q.push(A.input);return PX(Q.join("+"))}class pg0 extends Q4{commands;onDismiss;constructor(A){super();this.commands=A.commands,this.onDismiss=A.onDismiss}build(A){let Q=EA.of(A),{colors:$,app:B}=Q,E=V4.of(A),D=new $0({color:$.secondary,bold:!0}),J=new $0({color:B.keybind}),U=new $0({color:B.command}),Y=new $0({color:$.foreground}),Z=Math.max(40,Math.min(80,E.size.width-4)),X=[...this.commands.filter((V)=>{let z=V.noun?.toLowerCase();return z!=="dev"&&z!=="debug"&&V.status.type!=="hidden"})].sort((V,z)=>{let K=(V.noun??"").toLowerCase(),W=(z.noun??"").toLowerCase(),C=K.localeCompare(W);if(C!==0)return C;return V.verb.toLowerCase().localeCompare(z.verb.toLowerCase())}),I=(V)=>{let z=V.methods.map((K)=>Z86(K)).join(", ");return[new D0({text:new h(z,J)}),new D0({text:new h(V.description,Y)})]},G=new OB({autofocus:!0,child:new GA({constraints:new U4(Z,Z,0,Number.POSITIVE_INFINITY),child:new IA({crossAxisAlignment:"start",mainAxisSize:"min",children:[new yA({padding:n0.horizontal(2),child:new D0({text:new h(`Editor Shortcuts
|
|
4379
4379
|
`,D)})}),new K80({items:Tu4.filter((V)=>V.submitOnEnterOnly===void 0||V.submitOnEnterOnly===!0),renderRow:I}),new x0({height:1}),new yA({padding:n0.horizontal(2),child:new D0({text:new h(`Scrolling & Navigation
|
|
4380
4380
|
`,D)})}),new K80({items:_u4,renderRow:I}),new x0({height:1}),new yA({padding:n0.horizontal(2),child:new D0({text:new h(`Command Palette Commands
|
|
4381
4381
|
`,D)})}),new K80({items:X,renderRow:(V)=>{let z=V.noun?`${V.noun}: ${V.verb}`:V.verb;return[new D0({text:new h(z,U)}),new D0({text:new h(V.description,Y)})]}}),new x0({height:1})]})})});return new o4({header:"Amp CLI — Help & Keyboard Shortcuts",minWidth:Z,maxWidth:Z,maxHeight:E.size.height,autofocus:!1,footer:[{keys:["Esc"],label:"close"},{keys:["↑↓","j/k"],label:"scroll"}],onDismiss:this.onDismiss,child:G})}}class zv extends gQ{completionBuilder;constructor({completionBuilder:A,child:Q}){super({child:Q});this.completionBuilder=A}updateShouldNotify(A){return!1}static of(A){let Q=A.dependOnInheritedWidgetOfExactType(zv);if(!Q)throw Error("No CompletionBuilderProvider found in widget tree");return Q.completionBuilder}}var F86=250,X86=2000;class lg0 extends d0{configReloadEvents;toastController;child;constructor(A){super();this.configReloadEvents=A.configReloadEvents,this.toastController=A.toastController,this.child=A.child}createState(){return new Su4}}class Su4 extends m0{subscription=null;toastTimer=null;pendingToastType=null;lastToast=null;initState(){this.subscribeToConfigReloadEvents()}didUpdateWidget(A){if(A.configReloadEvents===this.widget.configReloadEvents)return;this.clearPendingToast(),this.subscribeToConfigReloadEvents()}dispose(){this.subscription?.unsubscribe(),this.subscription=null,this.clearPendingToast(),super.dispose()}build(A){return this.widget.child}subscribeToConfigReloadEvents(){this.subscription?.unsubscribe(),this.subscription=this.widget.configReloadEvents.subscribe((A)=>{this.scheduleToast(A)})}scheduleToast(A){if(this.pendingToastType=I86(this.pendingToastType,A),this.toastTimer)clearTimeout(this.toastTimer);this.toastTimer=setTimeout(()=>{if(!this.mounted)return;this.flushToast()},F86),this.toastTimer.unref()}flushToast(){let A=this.pendingToastType;if(this.clearPendingToast(),!A)return;let Q=Date.now();if(G86(this.lastToast,A,Q))return;this.lastToast={type:A,shownAt:Q},V86(this.widget.toastController,A)}clearPendingToast(){if(this.toastTimer)clearTimeout(this.toastTimer),this.toastTimer=null;this.pendingToastType=null}}function I86(A,Q){return A==="failed"||Q.type==="failed"?"failed":"succeeded"}function G86(A,Q,$){return A?.type===Q&&$-A.shownAt<X86}function V86(A,Q){switch(Q){case"succeeded":A.show("Config reloaded","success",1500);break;case"failed":A.show("Config reload failed","error",5000);break}}class WQ extends gQ{context;constructor({context:A,child:Q}){super({child:Q});this.context=A}updateShouldNotify(A){return!1}static of(A){let Q=A.dependOnInheritedWidgetOfExactType(WQ);if(!Q)throw Error("No ContextProvider found in widget tree");return Q.context}}a0();f8();var C80=80,z86=13,K86=1,ku4=-C80,W86=16,C86=ex0(C80,C80);function fu4({ampURL:A,threadID:Q,logPath:$}){return[`Debug thread ${yG(new URL(A),Q).toString()} (cli log: ${$}). Start with the CLI log, actor logs, and Rivet DB/inspector as sources of truth. Read thread-actors/docs/debugging-actors.md and thread-actors/scripts/README.md. For dev, actor logs are in .amp/in/thread-actors.json.log; for staging/prod, logs are in gcloud.`,"","Problem: "].join(`
|
|
@@ -4462,7 +4462,7 @@ Ctrl-X, Y, Z to unlock`;if(this.widget.centerContent)R=this.widget.centerContent
|
|
|
4462
4462
|
`));if(U.tools.length===0)J.push(new h(` └─ No tools available
|
|
4463
4463
|
`,E));else for(let F of U.tools)UZ6(J,F,$);J.push(new h(`
|
|
4464
4464
|
`))}return J}function UZ6(A,Q,$){let{colors:B,app:E}=$,D=YZ6(Q.status,$);if(A.push(new h(` ${D.icon} `,new $0({color:D.color}))),A.push(new h(Q.name,new $0({color:Q.status==="pending"?B.warning:E.command}))),Q.status==="pending")A.push(new h(" discovering...",new $0({color:B.foreground,dim:!0})));else if(Q.description)A.push(new h(` ${xj4(Q.description,50)}`,new $0({color:B.foreground,dim:!0})));if(Q.error)A.push(new h(` ${xj4(Q.error,40)}`,new $0({color:E.toolError})));A.push(new h(`
|
|
4465
|
-
`))}function YZ6(A,Q){let{colors:$,app:B}=Q;switch(A){case"pending":return{icon:"◌",color:$.warning};case"registered":return{icon:"•",color:$.mutedForeground};case"failed":return{icon:"✗",color:B.toolError};case"duplicate":return{icon:"◇",color:$.warning};default:return{icon:"?",color:$.foreground}}}function xj4(A,Q){let $=A.replace(/\s+/g," ").trim();if(mA($)<=Q)return $;let B="...",E=mA(B);if(Q<=E)return o7(B,Q);return`${o7($,Q-E,!0,"")}${B}`}var qc0="https://ampcode.com/news/neo",uc0=[{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:qc0,href:qc0}]}];function ZZ6(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:qc0,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function FZ6(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var Tv=50,lq=40,Hc0=1000,XZ6=420,IZ6=760,GZ6=-250,VZ6=1100,N90=33,mj4=0.999,zZ6=2.1,KZ6=720,WZ6=420,oj4="Meet the new",rj4="Amp",sj4="CLI",wc0=A4(oj4).length,CZ6=A4(rj4).length,HZ6=A4(sj4).length,q90={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},dj4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},cj4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},pj4=[q90,dj4,cj4,q90,dj4,cj4,q90],NZ6=q90;class Mc0 extends d0{onDismiss;onQuit;animationProgress;animationsEnabled;variant;binaryInstallCommand;introStages;dismissible;constructor(A){super();this.onDismiss=A.onDismiss,this.onQuit=A.onQuit,this.animationProgress=A.animationProgress,this.animationsEnabled=A.animationsEnabled??!0,this.variant=A.variant??"intro",this.binaryInstallCommand=A.binaryInstallCommand??FZ6(),this.introStages=this.variant==="npm-migration"?ZZ6(this.binaryInstallCommand):uc0,this.dismissible=this.variant!=="npm-migration"}createState(){return new tj4}}class tj4 extends m0{startedAt=performance.now();animationTimer=null;stageTransitionTimer=null;firstStageTitleTimer=null;firstStageHintTimer=null;firstStageRevealTimer=null;firstStageTitleRevealStartedAt=null;firstStageHintRevealStartedAt=null;stageTransitionStartedAt=performance.now();animationStartProgress=0;animationTargetProgress=1;animationDurationMs=Hc0;onAnimationComplete=null;animationProgress=0;introStage=0;previousIntroStage=null;stageTransitionProgress=1;stageTransitionDirection=1;firstStageTitleVisible=!1;firstStageHintVisible=!1;firstStageTitleRevealProgress=0;firstStageHintRevealProgress=0;dismissTimer=null;dismissStartedAt=performance.now();dismissProgress=0;isDismissing=!1;splashOrbGlow=new O5(42);initState(){super.initState(),this.startAnimationIfNeeded()}didUpdateWidget(A){if(super.didUpdateWidget(A),A.animationProgress!==this.widget.animationProgress||A.animationsEnabled!==this.widget.animationsEnabled)this.startAnimationIfNeeded()}dispose(){this.stopAnimation(),this.stopStageTransitionTimer(),this.stopFirstStageRevealTimers(),this.stopDismissAnimation(),super.dispose()}startAnimationIfNeeded(){if(this.stopAnimation(),this.stopFirstStageRevealTimers(),this.widget.animationProgress!==void 0){this.animationProgress=RE(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=mj4,this.firstStageHintVisible=this.animationProgress>=mj4,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:Hc0,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=RE(A/IZ6);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},N90)}canNavigateIntroStage(){if(this.isDismissing)return!1;if(!this.firstStageHintVisible)return!1;if(this.introStage===0&&this.firstStageHintRevealProgress<1)return!1;return!0}advanceIntroStage(){if(!this.canNavigateIntroStage())return;if(this.isFinalIntroStage()){if(this.widget.dismissible)this.startDismissAnimation();return}this.moveIntroStage(1)}dismissFromFinalIntroStage(){if(!this.widget.dismissible||!this.canNavigateIntroStage()||!this.isFinalIntroStage())return!1;return this.startDismissAnimation(),!0}nextIntroStage(){if(!this.canNavigateIntroStage()||this.isFinalIntroStage())return;this.moveIntroStage(1)}goToPreviousIntroStage(){if(!this.canNavigateIntroStage()||this.introStage<=0)return;this.moveIntroStage(-1)}isFinalIntroStage(){return this.introStage>=this.widget.introStages.length-1}moveIntroStage(A){let Q=this.introStage+A;if(this.stopStageTransitionTimer(),this.stageTransitionStartedAt=performance.now(),this.setState(()=>{this.previousIntroStage=this.introStage,this.introStage=Q,this.stageTransitionDirection=A}),this.widget.animationProgress!==void 0||!this.widget.animationsEnabled){this.setState(()=>{this.previousIntroStage=null,this.stageTransitionProgress=1});return}this.setState(()=>{this.stageTransitionProgress=0}),this.stageTransitionTimer=setInterval(()=>{let $=performance.now()-this.stageTransitionStartedAt,B=RE($/XZ6);if(this.setState(()=>{if(this.stageTransitionProgress=B,B>=1)this.previousIntroStage=null}),B>=1)this.stopStageTransitionTimer()},N90)}startProgressAnimation({from:A,to:Q,durationMs:$,onComplete:B}){this.stopAnimation(),this.startedAt=performance.now(),this.animationStartProgress=A,this.animationTargetProgress=Q,this.animationDurationMs=$,this.onAnimationComplete=B,this.animationProgress=A,this.animationTimer=setInterval(()=>{let E=performance.now()-this.startedAt,D=RE(E/this.animationDurationMs),J=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*_v(D);if(this.setState(()=>{this.animationProgress=J}),D>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},N90)}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,Hc0+GZ6),Q=A+VZ6;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?RE((A-this.firstStageTitleRevealStartedAt)/KZ6):this.firstStageTitleRevealProgress,$=this.firstStageHintRevealStartedAt?RE((A-this.firstStageHintRevealStartedAt)/WZ6):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=$}),Q>=1&&$>=1)this.stopFirstStageRevealTimer()},N90)}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=lj4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:ij4(lj4(this.previousIntroStage),A,_v(this.stageTransitionProgress));return this.dismissProgress>0?ij4(Q,NZ6,_v(this.dismissProgress)):Q}build(A){let Q=S4.of(A).colorScheme,$=EA.of(A),B=this.currentOrbPalette(),E=J7(1,"deep",B),D=V4.of(A).size,U=this.widget.animationProgress??this.animationProgress,Y=Math.max(D.width/Tv,D.height/lq)*zZ6,Z=Y+(1-Y)*U,F=_v(this.dismissProgress),X=Math.max(Tv,Math.round(Tv*Z)),I=Math.max(lq,Math.round(lq*Z)),G=Math.round((D.width-X)/2),V=Math.round((D.height-I)/2),z=Math.max(0,Math.floor((D.width-Tv)/2)),K=-Math.floor(lq/2),W=Math.round(G+(z-G)*U),C=Math.round(V+(K-V)*U),H=W+X/2,N=C+I/2,q=qZ6({dismissProgress:this.dismissProgress,easedDismissProgress:F,introOrbScale:Z,normalOrbCenterX:H,normalOrbCenterY:N,size:D}),w=Math.max(Tv,Math.round(Tv*q.orbScale)),L=Math.max(lq,Math.round(lq*q.orbScale)),R=q.orbCenterX,_=q.orbCenterY,P=Math.round(R-w/2),f=Math.round(_-L/2),m=Math.max(3,Math.min(D.height-5,Math.floor(lq/2)+2)),y=Math.max(m+3,D.height-3),T=q.textDissolveProgress,k=this.isFinalIntroStage()?q.backdropDissolveProgress:0,c=this.firstStageTitleVisible&&T<1,d=c&&this.firstStageHintVisible,b=d&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),p=this.introStage===0?this.firstStageTitleRevealProgress:1,n=this.introStage===0?this.firstStageHintRevealProgress:1,s=Math.max(24,Math.min(74,D.width-4)),I0=Math.min(12,Math.max(8,D.height-m-6)),E0=Math.max(0,Math.floor((D.width-s)/2)),G0=Math.max(0,Math.min(D.height-I0,Math.floor(D.height*0.55-I0/2))),q0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new lz({width:w,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new lz({width:w,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new U$({autofocus:!0,canRequestFocus:!0,debugLabel:"WelcomeTakeover",onKey:(t)=>{if(t.key==="Enter")return this.advanceIntroStage(),"handled";if(!this.widget.dismissible&&t.key==="c"&&t.ctrlKey)return this.widget.onQuit?.(),"handled";if(!this.widget.dismissible&&t.key==="q")return this.widget.onQuit?.(),"handled";if((t.key===" "||t.key==="Space")&&!this.isFinalIntroStage())return this.advanceIntroStage(),"handled";if(t.key==="Escape"||t.key==="Esc"){if(!this.widget.dismissible)return this.widget.onQuit?.(),"handled";return this.dismissFromFinalIntroStage()?"handled":"ignored"}if(t.key==="ArrowRight")return this.nextIntroStage(),"handled";if(t.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new t1({fit:"expand",children:[new ej4({color:Q.background,dissolveProgress:k}),new t1({fit:"expand",children:[new nA({onClick:()=>{},child:x0.expand()}),new a1({left:P,top:f,width:w,height:L,child:q0}),...c?[new a1({left:E0,top:G0,width:s,height:I0,child:wZ6({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:s,height:I0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:E,link:$.app.link,keybind:$.app.keybind,titleRevealProgress:p,dissolveProgress:T,context:A})})]:[],...d?[...b?[new a1({left:E0,top:Math.max(0,y-1),width:s,height:1,child:new D0({text:PZ6({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:T}),textAlign:"center"})})]:[],new a1({left:E0,top:y,width:s,height:1,child:TZ6({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:$.app.keybind,revealProgress:n,dissolveProgress:T,context:A})})]:[]]})]})})}}class ej4 extends EB{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new AR4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class AR4 extends fA{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;iA(!!A,"performLayout called without constraints");let Q=A.constrain(A.biggest.width,A.biggest.height);this.setSize(Q.width,Q.height),super.performLayout()}paint(A,Q=0,$=0){let B=Math.floor(Q+this.offset.x),E=Math.floor($+this.offset.y),D=Math.floor(this.size.width),J=Math.floor(this.size.height),U={bg:this.color},Y=RE(this.dissolveProgress);if(Y<=0){A.fill(B,E,D,J," ",U);return}if(Y>=1)return;for(let Z=0;Z<J;Z++)for(let F=0;F<D;F++)if(!uZ6(F,Z,D,J,Y))A.fill(B+F,E+Z,1,1," ",U)}}function RE(A){return Math.min(1,Math.max(0,A))}function _v(A){return 1-(1-A)**3}function lj4(A){return pj4[A]??pj4[0]}function ij4(A,Q,$){return{primary:Mq(A.primary,Q.primary,$),secondary:Mq(A.secondary,Q.secondary,$)}}function qZ6({dismissProgress:A,easedDismissProgress:Q,introOrbScale:$,normalOrbCenterX:B,normalOrbCenterY:E,size:D}){return{orbScale:$+($*0.86-$)*Q,orbCenterX:B+(D.width*0.54-B)*Q,orbCenterY:E-D.height*0.44*Q,textDissolveProgress:RE(A/0.52),backdropDissolveProgress:_v(RE((A-0.12)/0.88))}}function uZ6(A,Q,$,B,E){let D=B<=1?0:Q/(B-1),J=QR4(A+Q*Math.max(1,$));return(1-D)*0.72+J*0.28<E}function wZ6({introStages:A,stage:Q,previousStage:$,progress:B,direction:E,width:D,height:J,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V}){if($===null||B>=1)return Nc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V});let z=_v(B),K=E*Math.round((1-z)*D),W=-E*Math.round(z*D);return new Zq(new t1({fit:"expand",children:[new a1({left:W,top:0,width:D,height:J,child:Nc0({introStages:A,stage:$,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:$===0?1:I,dissolveProgress:G,context:V})}),new a1({left:K,top:0,width:D,height:J,child:Nc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V})})]}))}function Nc0({introStages:A,stage:Q,foreground:$,mutedForeground:B,accent:E,link:D,keybind:J,titleRevealProgress:U,dissolveProgress:Y,context:Z}){let F=A[Q]??A[0]??uc0[0],X=new $0({color:E,bold:!0}),I=new $0({color:$}),G=A===uc0&&Q===0,V=[...F.title===null?[]:[new D0({text:G?u90(LZ6({progress:U,foreground:E,pulseColor:E}),Y):new h($8(F.title,Y),X),textAlign:"center"})],...F.body.length>0?[MZ6()]:[],...F.body.map((z)=>OZ6(z,I,B,D,J,Y,Z))];return new B6({child:new yA({padding:n0.horizontal(1),child:new IA({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:V})})})}function MZ6(){return x0.height(1)}function OZ6(A,Q,$,B,E,D,J){if(typeof A==="string")return new D0({text:new h($8(A,D),Q),textAlign:"center"});if("codeBlock"in A)return new q5({onCopy:(U,Y)=>{if(Y)AQ.success(J,"Copied to clipboard",2000)},child:new IA({mainAxisSize:"min",children:A.codeBlock.map((U)=>new D0({text:new h($8(U,D),new $0({color:E})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let U=new D0({text:new h("",void 0,[new h($8(A.text,D),new $0({color:$,dim:!0})),new h($8(A.keybind,D,A4(A.text).length),new $0({color:E}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new B6({child:new q5({child:U})});return U}if("highlightText"in A){let U=N$.createSpan(A.href,A.linkText,new $0({color:B,underline:!0})),Y=cX.of(J),Z=new h("",void 0,[new h(A.text,Q),new h(A.highlightText,new $0({color:E})),new h(A.textAfterHighlight,Q),new h(U.text,U.style,U.children,U.hyperlink,()=>{C$(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new h(A.textAfter,Q)]);return new D0({text:u90(Z,D),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new IA({mainAxisSize:"min",children:[new D0({text:new h($8(A.text,D),Q),textAlign:"center"}),new B6({child:new wA({mainAxisSize:"min",children:[N$.createWidget(J,A.href,$8(A.linkText,D),new $0({color:B,underline:!0})),new D0({text:new h($8(A.textAfter,D),Q)})]})})]});let U=N$.createSpan(A.href,A.linkText,new $0({color:B,underline:!0})),Y=cX.of(J),Z=new h("",void 0,[new h(A.text,Q),new h(U.text,U.style,U.children,U.hyperlink,()=>{C$(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new h(A.textAfter,Q)]);return new D0({text:u90(Z,D),textAlign:"center"})}if(D>0)return new D0({text:new h($8(A.text,D),new $0({color:B,underline:!0})),textAlign:"center"});return new B6({child:N$.createWidget(J,A.href,A.text,new $0({color:B,underline:!0}))})}function LZ6({progress:A,foreground:Q,pulseColor:$}){let B=new $0({color:Q,bold:!0}),E=new $0({color:RZ6({progress:A,foreground:Q,pulseColor:$}),bold:!0});return new h("",void 0,[new h(jZ6(A).padEnd(wc0," "),B),new h(" ",B),new h(nj4(rj4,CZ6,A,0.72),B),new h(" ",B),new h(nj4(sj4,HZ6,A,0.88),E)])}function jZ6(A){let Q=A4(oj4),$=Math.min(wc0,Math.ceil(RE(A/0.62)*wc0));return Q.slice(0,$).join("")}function nj4(A,Q,$,B){return $>=B?A:"".padEnd(Q," ")}function RZ6({progress:A,foreground:Q,pulseColor:$}){if(A<0.88||A>=1)return Q;let B=RE((A-0.88)/0.12);return Math.cos(B*Math.PI*4)*(1-B)>0.12?$:Q}function PZ6({stage:A,featureStageCount:Q,foreground:$,dissolveProgress:B}){return new h($8(`${A}/${Q}`,B),new $0({color:$,dim:!0}))}function vZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}){let J=new $0({color:B}),U=new $0({color:$,dim:!0}),Y=Q?A?"Enter":"Space":"Esc",Z=Q?A?" to get started":" to continue":" to quit",F="",X="",I=`${Z}`;if(!Q)return new h("",void 0,[new h(Y,J),new h(Z,U),new h("",J),new h("",U)]);let G=aj4(Y,E),V=aj4(I,RE((E*(A4(Y).length+A4(I).length)-A4(Y).length)/A4(I).length));return new h("",void 0,[new h($8(G,D),J),new h($8(V.slice(0,Z.length),D),U),new h($8(V.slice(Z.length,Z.length+0),D),J),new h($8(V.slice(Z.length+0),D),U)])}function TZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D,context:J}){if(Q)return new D0({text:vZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}),textAlign:"center"});let U=new $0({color:B}),Y=new $0({color:$,dim:!0});return new q5({onCopy:(Z,F)=>{if(F)AQ.success(J,"Copied to clipboard",2000)},child:new D0({text:new h("",void 0,[new h("q",U),new h(" to quit",Y)]),textAlign:"center",selectable:!0})})}function aj4(A,Q){let $=A4(A),B=Math.min($.length,Math.ceil(RE(Q)*$.length));return $.slice(0,B).join("").padEnd($.length," ")}function u90(A,Q,$=0){if(Q<=0)return A;let B=$+A4(A.text??"").length,E=A.children?.map((D)=>{let J=u90(D,Q,B);return B+=A4(D.toPlainText()).length,J});return new h(A.text?$8(A.text,Q,$):A.text,A.style,E,A.hyperlink,A.onClick)}function $8(A,Q,$=0){if(Q<=0)return A;return A4(A).map((E,D)=>{if(E.trim()==="")return E;return QR4($+D)<Q?" ":E}).join("")}function QR4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}function _Z6(A){let $=A.observer.protocolMessages().filter((B)=>B.role==="assistant").at(-1);if(!$)return null;return $.content.filter((B)=>B.type==="text").map((B)=>B.text).join("")}function SZ6(A,Q={}){return new Promise(($,B)=>{let E=!1,D=setTimeout(()=>{J.unsubscribe(),B(Error("Timed out waiting for agent response"))},Q.timeoutMs??600000),J=A.observer.agentState().subscribe((U)=>{if(h3(U)){E=!0;return}if(!E)return;let Y=_Z6(A);if(Y===null)return;clearTimeout(D),J.unsubscribe(),$(Y)})})}class Oc0 extends d0{listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;updateService;initialThreadIDs;showWelcome;welcomeVariant;onWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;onRelaunchRequested;onFirstFrame;initialUserInput;getDefaultNewThreadVisibility;observeThreadSummaries;openThreadPickerOnStart;workspaceSettingsFilePath;context;constructor(A){super();this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.updateService=A.updateService,this.initialThreadIDs=A.initialThreadIDs??[],this.showWelcome=A.showWelcome??!1,this.welcomeVariant=A.welcomeVariant??"intro",this.onWelcomeDismissed=A.onWelcomeDismissed,this.notificationService=A.notificationService,this.mcpTrustHandler=A.mcpTrustHandler,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.onRelaunchRequested=A.onRelaunchRequested,this.onFirstFrame=A.onFirstFrame,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.observeThreadSummaries=A.observeThreadSummaries,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.context=A.context}createState(){return new BR4}}class BR4 extends m0{editorController=new DZ;commandPalette=new Cp(this);commandRegistry=new dg0;toastController=new sx0;relaunchNotificationController=new kg0;exitHintTimer=new Wp(this,1000);ideStatus=new nB(this,{});threadNavigationHistory=new yg0;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;activePluginMessageSubscription=null;activePluginUIRequestsSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;welcomeVisible=!1;endCreditsVisible=!1;invadersHighScore=0;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;emptyThreadTerminalTitleController=new xl;pluginIntegration=null;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;loadThreads=async()=>{return this.widget.context.listThreads()};analyzeContextForThread=async(A,Q)=>{return pz4({ampURL:this.widget.context.ampURL,configService:this.widget.configService,threadID:A,signal:Q})};onSwitchThread=(A)=>{return this.connectToExistingThread(A,{recordNavigation:!0,rethrowError:!0})};threadListSidebar=new Wc0({state:this,isBlocked:()=>this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal(),getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,getWorkspaceRoot:()=>this.widget.context.workspaceRoot,loadThreads:this.loadThreads,observeThreadSummaries:()=>this.widget.observeThreadSummaries(),onSelectThread:this.onSwitchThread});sendFeedbackReport=async(A)=>V80({configService:this.widget.configService,settingsFilePath:this.widget.context.settingsFilePath},A);archiveThread=async(A)=>{let Q=await t50({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let $=await oH4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};removeThreadLabel=async(A,Q)=>{let $=await rH4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};initState(){if(RX.getInstance().interceptConsole(),this.invadersHighScore=this.widget.context.invadersHighScore??0,this.notices=new Wg0(this.widget.configService,($)=>this.setState($)),M6.instance.addPostFrameCallback(()=>{setTimeout(()=>this.widget.onFirstFrame?.(),0),this.noticesPollingTimeout=setTimeout(()=>{this.noticesPollingTimeout=null,this.notices.startPolling()},500)},"Neo notices polling"),this.widget.showWelcome)this.welcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:$,error:B})=>{if(S.error("Neo failed to connect to thread",{threadID:$,error:B}),!$)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe(($)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(re($.settings)))}),this.updateRelaunchIntegration=new xg0({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested,relaunchNotificationController:this.relaunchNotificationController,updateService:this.widget.updateService}),this.updateRelaunchIntegration.init(),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput,Q=this.widget.initialThreadIDs[0];if(Q){let $={};if(A)$.initialUserInput=A;this.connectToInitialThreads(Q,$)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.context.sessionAgentMode);this.pluginIntegration=new _g0({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,context:this.widget.context,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread,readThreadMessages:this.readPluginThreadMessages,runAgent:this.runPluginAgent,onBlockingConfirmDialogChange:this.syncEmptyThreadPluginConfirmationTitle}),this.pluginIntegration.init(),this.mcpTrustIntegration=new Vh0({state:this,mcpTrustHandler:this.widget.mcpTrustHandler,toastController:this.toastController,workspaceSettingsFilePath:this.widget.workspaceSettingsFilePath}),this.mcpTrustIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=Z1.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.context.pluginService?Ku4({pluginService:this.widget.context.pluginService,workspaceRoot:this.widget.context.workspaceRoot,logFilePath:this.widget.context.logFilePath,toastController:this.toastController}):[],B=[Mu4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["resume"],status:{type:"enabled"},sortBoost:100,run:(E,D,J)=>{E.pushWithDismiss((U)=>zd0({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,loadThreadTail:this.widget.context.loadThreadTail,onSelectThread:this.onSwitchThread,onDismiss:U,onThreadSelected:J}))}},...this.threadListSidebar.commands(),{noun:"thread",verb:"switch to previous",description:"Switch to previous thread",keywords:["back"],get status(){return A.threadNavigationHistory.canNavigateBack()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to previous with no previous thread"}},run:(E,D,J)=>{A.navigateBack(),J()}},WM4({configService:this.widget.configService,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??void 0,toastController:this.toastController}),{noun:"thread",verb:"switch to next",description:"Switch to next thread",keywords:["forward"],get status(){return A.threadNavigationHistory.canNavigateForward()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to next with no next thread"}},run:(E,D,J)=>{A.navigateForward(),J()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",status:{type:"enabled"},run:(E,D,J)=>{E.push(new wm0({mcpServers:this.widget.context.mcpServers,onDismiss:J}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",status:{type:"enabled"},run:(E)=>{E.pushWithDismiss((D)=>new Cc0({toolboxes:this.widget.context.toolboxes,onDismiss:D}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","blog","announcements"],status:{type:"enabled"},run:async(E,D,J)=>{try{await C$(D,"https://ampcode.com/chronicle")}finally{J()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config"],status:{type:"enabled"},run:()=>{vz(this.widget.context.settingsFilePath).catch((E)=>{S.error("Failed to open settings file in editor",{error:E})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains"],status:{type:"enabled"},run:(E,D,J)=>{E.pushWithDismiss((U)=>new um0({onCancel:U,onSelect:(Y)=>{this.handleIdeSelection(Y),J()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["manual","?"],status:{type:"enabled"},run:(E,D,J)=>{E.push(new pg0({commands:oB.of(D).commands,onDismiss:J}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",status:{type:"enabled"},run:(E,D,J)=>{J(),A.showWelcome()}},{noun:"amp",verb:"end credits",description:"Roll the full-screen Amp credits",status:{type:"enabled"},run:(E,D,J)=>{J(),A.showEndCredits()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["v"],status:{type:"enabled"},run:(E,D,J)=>{E.push(new o4({header:"Amp Version",maxWidth:72,onDismiss:J,child:new D0({text:new h(O50({version:"0.0.1780118009-g45d3ab",buildTimestamp:"2026-05-30T05:18:37.089Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","bye"],shortcut:WA.ctrl("c"),status:{type:"enabled"},run:(E,D)=>{W4.maybeInvoke(D,new hz)}},...Q,...aH4(this.widget.context.logFilePath)].map((E)=>this.commandRegistry.register(E));return()=>{for(let E of B)E()}}build(A){let Q=this.buildHints(),$=this.ideStatus.getValue(),B=this.notices.current,E=new Ic0({initialAgentMode:this.widget.context.sessionAgentMode,initialPluginAgentModeKey:this.widget.context.initialPluginAgentModeKey,analyzeContextForThread:this.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:$,statusItems:this.pluginIntegration?.getStatusItems()??[],pluginConfirmationBlocked:this.pluginIntegration?.hasBlockingConfirmDialog()??!1,notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.welcomeVisible?null:B,onDismissNotice:(I)=>this.notices.dismiss(I)}),D=V4.of(A),J=D.capabilities.animationSupport!=="disabled",U=this.threadListSidebar.visibleWidth(),Y=Math.max(0,D.size.width-U),F=[new GA({constraints:U4.tight(D.size.width,D.size.height),child:this.threadListSidebar.buildBody(E)})];if(this.commandPalette.isEnabled())F.push(new U$({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new cg0({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.welcomeVisible)F.push(zd0({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,loadThreadTail:this.widget.context.loadThreadTail,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.welcomeVisible)F.push(new U$({debugLabel:"WelcomeDialogOverlay",child:new Mc0({onDismiss:this.dismissWelcome,onQuit:()=>Z1.instance.stop(),animationsEnabled:J,variant:this.widget.welcomeVariant})}));let X=this.executorAlreadyConnectedDialog;if(X)F.push(new U$({debugLabel:"ExecutorAlreadyConnectedDialogOverlay",child:new Nm0({existingExecutorPid:X.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(F.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),F.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.context.isInternalUser)F.push(new ig0({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:w90.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)F.push(new qm0);if(this.endCreditsVisible)F.push(new Vm0({onComplete:this.completeEndCredits,highScore:this.invadersHighScore,onHighScoreChange:this.updateInvadersHighScore}));return new WQ({context:this.widget.context,child:new oB({commandRegistry:this.commandRegistry,child:new zv({completionBuilder:this.widget.completionBuilder,child:new AQ({controller:this.toastController,child:new W4({actions:this.buildActions(),child:new tQ({debugLabel:"AppShortcuts",shortcuts:this.buildShortcuts(),child:new KQ({debugLabel:"AppShellFocus",child:new tx0({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...B&&this.activeThreadContext&&!this.welcomeVisible?[this.notices]:[]],child:new lg0({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new mp({left:U,width:Y,child:new t1({children:F})})})})})})})})})})})}buildShortcuts(){let A=new Map([[WA.ctrl("c"),new z70],[WA.ctrl("o"),new W70],[WA.alt("i"),new H70],[WA.alt("p"),new Ap],[WA.ctrl("."),new u70],[WA.ctrl("t"),new O70],...this.threadListSidebar.shortcutEntries()]);if(w90.env.NODE_ENV==="development"&&w90.platform==="darwin")A.set(WA.meta("r"),new K70);return A}buildActions(){let A=new dA(()=>{if(k2.hasAnyCopyableSelection())return k2.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new dA(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),$=new dA(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),B=new dA(()=>{return this.startNewDraftThread(),"handled"}),E=new dA(()=>{return Z1.instance.stop(),"handled"}),D=new dA(()=>{return jl({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),J=new dA((I)=>{if(!I.text)return"ignored";return Z1.instance.tuiInstance.clipboard.writeText(I.text).then((G)=>{if(G.ok)this.toastController.show(I.successMessage,"success",2000);else this.toastController.show(`${I.failureMessage}: ${G.userFacingErrorMessage}`,"error",4000)}).catch((G)=>{S.error("Failed to copy Neo text to clipboard",{error:G}),this.toastController.show(I.failureMessage,"error",2000)}),"handled"}),U=new dA(()=>{return Z1.instance.toggleFrameStatsOverlay(),"handled"}),Y=new dA(()=>this.notices.dismissCurrent()?"handled":"ignored"),Z=new dA(()=>{if(!this.widget.context.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),F=yu4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,context:this.widget.context,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),X=new dA(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[z70,A],[rp,B],[hz,E],[K70,D],[DB,J],[Al,$],[W70,Q],[H70,Z],...this.threadListSidebar.actionEntries(),[u70,Y],...F,[Ap,U],[O70,X]])}startNewDraftThread(A={}){let Q=this.activeThreadContext?.client.getThreadId();if(this.commandPalette.disable(),this.threadNavigationHistory.recordNavigation(Q),this.setState(()=>{if(this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.cancelOwnerUIRequests(),this.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),this.widget.onActiveThreadChange?.(null),this.syncEmptyThreadPluginConfirmationTitle(),A.prompt!==void 0)this.editorController.text=A.prompt}syncEmptyThreadPluginConfirmationTitle=()=>{this.emptyThreadTerminalTitleController.setPluginConfirmationBlocked(this.activeThreadContext===null&&(this.pluginIntegration?.hasBlockingConfirmDialog()??!1))};closeCommandPaletteOnFocusLoss=(A)=>{if(A||!this.commandPalette.isEnabled())return;this.commandPalette.disable()};ensureDraftThreadSettingsInitialized(){if(this.hasDraftThreadSettingsSeed)return Promise.resolve();if(!this.draftThreadSettingsInitPromise)this.draftThreadSettingsInitPromise=this.initDraftThreadSettings();return this.draftThreadSettingsInitPromise}async initDraftThreadSettings(){try{let A=this.applySessionDefaultsToThreadSettings(await yP(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){S.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.context.sessionAgentMode,$=A,B=Qq(Q),E=t30(this.widget.context,Q);if(B!==void 0&&E!==void 0)$={...$,[B]:E};return r30($,{agentMode:Q,explicitEffort:this.widget.context.explicitReasoningEffort,sessionState:this.widget.context})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=$R4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(nU(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=$R4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(bz);if(this.exitHintTimer.isActive())A.add(Bv);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),Z1.instance.stop();else this.exitHintTimer.activate()};dismissWelcome=()=>{if(!this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!1}),this.widget.onWelcomeDismissed?.()};updateInvadersHighScore=(A)=>{if(A<=this.invadersHighScore)return;this.setState(()=>{this.invadersHighScore=A}),sY((Q)=>({...Q,neoInvadersHighScore:Math.max(Q.neoInvadersHighScore,A)})).catch((Q)=>{S.warn("Failed to save Neo Invaders high score",{error:Q instanceof Error?Q.message:String(Q)})})};showWelcome=()=>{if(this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!0})};showEndCredits=()=>{if(this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!0})};completeEndCredits=()=>{if(!this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!1})};promptExecutorAlreadyConnected(A){return new Promise((Q)=>{this.setState(()=>{this.executorAlreadyConnectedDialog={existingExecutorPid:A.existingExecutorPid,resolve:($)=>{Q($==="watch"?"observe":"disconnect")}}})})}handleExecutorAlreadyConnectedChoice=(A)=>{if(this.resolveExecutorAlreadyConnectedDialog(A),A==="exit")Z1.instance.stop()};resolveExecutorAlreadyConnectedDialog(A){let Q=this.executorAlreadyConnectedDialog;if(!Q)return;this.setState(()=>{this.executorAlreadyConnectedDialog=null}),Q.resolve(A)}closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1})};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,$=null,B,E,D)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),U=A.find(pe);if(U)this.widget.history.add(U.text,w90.cwd()),this.widget.history.reset();let Y=$?void 0:await this.widget.getDefaultNewThreadVisibility?.(),Z=$??Y??null,F=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,Z??void 0,E,D);if(this.sendUserMessage(F,A,E?void 0:Q,E?void 0:B),!E)this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings);this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(F)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.context.sessionAgentMode=A;let $=Q["reasoning.effort"];if($!==void 0)this.widget.context.lastReasoningEffortByMode={...this.widget.context.lastReasoningEffortByMode??{},[A]:$};let B=Qq(A),E=B?Q[B]:void 0;if(E!==void 0)this.widget.context.lastSpeedByMode={...this.widget.context.lastSpeedByMode??{},[A]:E};sY((D)=>{let J={...D,agentMode:A};if($!==void 0)J={...J,lastReasoningEffortByMode:{...J.lastReasoningEffortByMode??{},[A]:$}};if(E!==void 0)J={...J,lastSpeedByMode:{...J.lastSpeedByMode??{},[A]:E}};return J}).catch((D)=>{S.warn("Failed to persist Neo session defaults for new message",{error:D instanceof Error?D.message:String(D)})})}sendUserMessage(A,Q,$,B){let E=M50(this.ideStatus.getValue());if(B===void 0){A.client.sendUserMessage(Q,$,{userState:E});return}A.client.sendUserMessage(Q,$,{reasoningEffort:B,userState:E})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};getRelaunchThreadIDs=()=>{let A=new Set,Q=this.getActiveThreadID();if(Q)A.add(Q);for(let $ of this.widget.clientPool.activeThreadIDs)A.add($);return[...A]};appendPluginMessagesToThread=async(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("appendToThread is not available - no active thread");let B=$.client.getThreadId();if(Q&&B!==Q)throw Error("thread.append is only available for the active executor thread");for(let E of A)this.sendUserMessage($,[{type:"text",text:E.content}])};readPluginThreadMessages=async(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("thread.messages is not available - no active thread");let B=$.client.getThreadId();if(Q&&B!==Q)throw Error("thread.messages is only available for the active thread");return YaA(ZaA($.observer.protocolMessages()),A)};runPluginAgent=async(A,Q)=>{await this.ensureDraftThreadSettingsInitialized();let $=this.widget.clientPool.createNewThread(this.widget.context.sessionAgentMode,this.draftThreadSettings,void 0,A,Q.agentModeDisplay,Q.parentThreadID,{trackAsLastActive:!1});this.sendUserMessage($,[{type:"text",text:Q.message}]);try{let B=await SZ6($,{timeoutMs:Q.timeoutMs}),E=$.client.getThreadId();return E?{threadID:E,text:B}:{text:B}}finally{this.widget.clientPool.disconnect($)}};async connectToExistingThread(A,Q={}){let $=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let B=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.context.observerOnly,onExecutorAlreadyConnected:(E)=>this.promptExecutorAlreadyConnected(E)});if(this.setActiveClient(B),Q.recordNavigation&&$!==A)this.threadNavigationHistory.recordNavigation($);if(Q.initialUserInput)this.sendUserMessage(B,[{type:"text",text:Q.initialUserInput}])}catch(B){if(S.error("Failed to load thread",{error:B,threadID:A}),this.toastController.show(`Failed to load ${A}: ${B instanceof Error?B.message:String(B)}`,"error",4000),Q.rethrowError)throw B}finally{this.setState(()=>{this.connectingToThreadID=null})}}async connectToInitialThreads(A,Q={}){await this.connectToExistingThread(A,Q);let $=this.widget.initialThreadIDs.filter((B)=>B!==A);await Promise.all($.map((B)=>this.resumeBackgroundThread(B)))}async resumeBackgroundThread(A){try{await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.context.observerOnly,onExecutorAlreadyConnected:async()=>"observe"})}catch(Q){S.error("Failed to resume background thread",{error:Q,threadID:A}),this.toastController.show(`Failed to resume ${A}: ${Q instanceof Error?Q.message:String(Q)}`,"error",4000)}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q,agentModeDisplay:$}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q,agentModeDisplay:$}}),this.syncEmptyThreadPluginConfirmationTitle(),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)}),this.activePluginMessageSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription?.unsubscribe(),this.pluginIntegration?.cancelOwnerUIRequests(),this.activePluginMessageSubscription=Q.pluginMessages().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage(B,(E)=>{A.sendPluginMessage(E)})}),this.activePluginUIRequestsSubscription=Q.pluginUIRequests().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage({type:"plugin_message",message:{type:"event",event:"plugin.ui.snapshot",data:{requests:[...B]}}},(E)=>{A.sendPluginMessage(E)})})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){S.error("Failed to connect to IDE",{error:Q});let $=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${$}`,"error",4000)}};dispose(){if(this.unregisterCommands?.(),this.unregisterCommands=null,this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.emptyThreadTerminalTitleController.dispose(),this.mcpTrustIntegration?.dispose(),this.mcpTrustIntegration=null,this.updateRelaunchIntegration?.dispose(),this.updateRelaunchIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.noticesPollingTimeout)clearTimeout(this.noticesPollingTimeout),this.noticesPollingTimeout=null;this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.welcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||this.endCreditsVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function $R4(A,Q,$){let B={...A};for(let E of kZ6(Q,$)){if(!nU(A[E],Q[E]))continue;let D=$[E];if(D===void 0)delete B[E];else B[E]=D}return B}function kZ6(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}fB();function ER4(A,Q,$,B){let E=GxA(A),D="\x1B[0m",J="\x1B[34m",U="\x1B[90m",Y="\x1B[2m",Z=[];if(A.archived)Z.push("\x1B[90m\x1B[2mArchived\x1B[0m");Z.push(`${E}`),Z.push(`\x1B[34m${Q}\x1B[0m`),Z.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let F=14,X=7,I=new _2(F,X),G=new O5(42),V=new Wv(F,X,F,X,F,X,0,A.agentMode??"smart","intensity","ascii",void 0,void 0,g0.default(),G);V.layout(U4.tight(F,X)),V.paint(I,0,0);let z=I.getBuffer().getCells(),K=0;for(let R=0;R<X;R++)if(z[R].some((_)=>_.char!==" ")){K=R;break}let W=X-1;for(let R=X-1;R>=0;R--)if(z[R].some((_)=>_.char!==" ")){W=R;break}function C(R,_){if(!R)return"";if(R.type==="rgb"){let{r:P,g:f,b:m}=R.value;if($.getColorDepth()>=24)return`\x1B[${_?38:48};2;${P};${f};${m}m`;let y=Up(P,f,m);return`\x1B[${_?38:48};5;${y}m`}return""}let H=[];if(W>=K)for(let R=K;R<=W;R++){let _="";for(let P=0;P<F;P++){let f=z[R][P],m=f.char,y=C(f.style.fg,!0);_+=y+m+"\x1B[0m"}H.push(_)}let N=H.length,q=Math.max(N,Z.length),w=Math.floor((q-N)/2),L=Math.floor((q-Z.length)/2);for(let R=0;R<q;R++){let _=" ".repeat(F);if(R>=w&&R<w+N)_=H[R-w];let P=" ",f="";if(R>=L&&R<L+Z.length)f=Z[R-L];$.write(_+P+f+`
|
|
4465
|
+
`))}function YZ6(A,Q){let{colors:$,app:B}=Q;switch(A){case"pending":return{icon:"◌",color:$.warning};case"registered":return{icon:"•",color:$.mutedForeground};case"failed":return{icon:"✗",color:B.toolError};case"duplicate":return{icon:"◇",color:$.warning};default:return{icon:"?",color:$.foreground}}}function xj4(A,Q){let $=A.replace(/\s+/g," ").trim();if(mA($)<=Q)return $;let B="...",E=mA(B);if(Q<=E)return o7(B,Q);return`${o7($,Q-E,!0,"")}${B}`}var qc0="https://ampcode.com/news/neo",uc0=[{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:qc0,href:qc0}]}];function ZZ6(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:qc0,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function FZ6(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var Tv=50,lq=40,Hc0=1000,XZ6=420,IZ6=760,GZ6=-250,VZ6=1100,N90=33,mj4=0.999,zZ6=2.1,KZ6=720,WZ6=420,oj4="Meet the new",rj4="Amp",sj4="CLI",wc0=A4(oj4).length,CZ6=A4(rj4).length,HZ6=A4(sj4).length,q90={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},dj4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},cj4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},pj4=[q90,dj4,cj4,q90,dj4,cj4,q90],NZ6=q90;class Mc0 extends d0{onDismiss;onQuit;animationProgress;animationsEnabled;variant;binaryInstallCommand;introStages;dismissible;constructor(A){super();this.onDismiss=A.onDismiss,this.onQuit=A.onQuit,this.animationProgress=A.animationProgress,this.animationsEnabled=A.animationsEnabled??!0,this.variant=A.variant??"intro",this.binaryInstallCommand=A.binaryInstallCommand??FZ6(),this.introStages=this.variant==="npm-migration"?ZZ6(this.binaryInstallCommand):uc0,this.dismissible=this.variant!=="npm-migration"}createState(){return new tj4}}class tj4 extends m0{startedAt=performance.now();animationTimer=null;stageTransitionTimer=null;firstStageTitleTimer=null;firstStageHintTimer=null;firstStageRevealTimer=null;firstStageTitleRevealStartedAt=null;firstStageHintRevealStartedAt=null;stageTransitionStartedAt=performance.now();animationStartProgress=0;animationTargetProgress=1;animationDurationMs=Hc0;onAnimationComplete=null;animationProgress=0;introStage=0;previousIntroStage=null;stageTransitionProgress=1;stageTransitionDirection=1;firstStageTitleVisible=!1;firstStageHintVisible=!1;firstStageTitleRevealProgress=0;firstStageHintRevealProgress=0;dismissTimer=null;dismissStartedAt=performance.now();dismissProgress=0;isDismissing=!1;splashOrbGlow=new O5(42);initState(){super.initState(),this.startAnimationIfNeeded()}didUpdateWidget(A){if(super.didUpdateWidget(A),A.animationProgress!==this.widget.animationProgress||A.animationsEnabled!==this.widget.animationsEnabled)this.startAnimationIfNeeded()}dispose(){this.stopAnimation(),this.stopStageTransitionTimer(),this.stopFirstStageRevealTimers(),this.stopDismissAnimation(),super.dispose()}startAnimationIfNeeded(){if(this.stopAnimation(),this.stopFirstStageRevealTimers(),this.widget.animationProgress!==void 0){this.animationProgress=RE(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=mj4,this.firstStageHintVisible=this.animationProgress>=mj4,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:Hc0,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=RE(A/IZ6);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},N90)}canNavigateIntroStage(){if(this.isDismissing)return!1;if(!this.firstStageHintVisible)return!1;if(this.introStage===0&&this.firstStageHintRevealProgress<1)return!1;return!0}advanceIntroStage(){if(!this.canNavigateIntroStage())return;if(this.isFinalIntroStage()){if(this.widget.dismissible)this.startDismissAnimation();return}this.moveIntroStage(1)}dismissFromFinalIntroStage(){if(!this.widget.dismissible||!this.canNavigateIntroStage()||!this.isFinalIntroStage())return!1;return this.startDismissAnimation(),!0}nextIntroStage(){if(!this.canNavigateIntroStage()||this.isFinalIntroStage())return;this.moveIntroStage(1)}goToPreviousIntroStage(){if(!this.canNavigateIntroStage()||this.introStage<=0)return;this.moveIntroStage(-1)}isFinalIntroStage(){return this.introStage>=this.widget.introStages.length-1}moveIntroStage(A){let Q=this.introStage+A;if(this.stopStageTransitionTimer(),this.stageTransitionStartedAt=performance.now(),this.setState(()=>{this.previousIntroStage=this.introStage,this.introStage=Q,this.stageTransitionDirection=A}),this.widget.animationProgress!==void 0||!this.widget.animationsEnabled){this.setState(()=>{this.previousIntroStage=null,this.stageTransitionProgress=1});return}this.setState(()=>{this.stageTransitionProgress=0}),this.stageTransitionTimer=setInterval(()=>{let $=performance.now()-this.stageTransitionStartedAt,B=RE($/XZ6);if(this.setState(()=>{if(this.stageTransitionProgress=B,B>=1)this.previousIntroStage=null}),B>=1)this.stopStageTransitionTimer()},N90)}startProgressAnimation({from:A,to:Q,durationMs:$,onComplete:B}){this.stopAnimation(),this.startedAt=performance.now(),this.animationStartProgress=A,this.animationTargetProgress=Q,this.animationDurationMs=$,this.onAnimationComplete=B,this.animationProgress=A,this.animationTimer=setInterval(()=>{let E=performance.now()-this.startedAt,D=RE(E/this.animationDurationMs),J=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*_v(D);if(this.setState(()=>{this.animationProgress=J}),D>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},N90)}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,Hc0+GZ6),Q=A+VZ6;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?RE((A-this.firstStageTitleRevealStartedAt)/KZ6):this.firstStageTitleRevealProgress,$=this.firstStageHintRevealStartedAt?RE((A-this.firstStageHintRevealStartedAt)/WZ6):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=$}),Q>=1&&$>=1)this.stopFirstStageRevealTimer()},N90)}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=lj4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:ij4(lj4(this.previousIntroStage),A,_v(this.stageTransitionProgress));return this.dismissProgress>0?ij4(Q,NZ6,_v(this.dismissProgress)):Q}build(A){let Q=S4.of(A).colorScheme,$=EA.of(A),B=this.currentOrbPalette(),E=J7(1,"deep",B),D=V4.of(A).size,U=this.widget.animationProgress??this.animationProgress,Y=Math.max(D.width/Tv,D.height/lq)*zZ6,Z=Y+(1-Y)*U,F=_v(this.dismissProgress),X=Math.max(Tv,Math.round(Tv*Z)),I=Math.max(lq,Math.round(lq*Z)),G=Math.round((D.width-X)/2),V=Math.round((D.height-I)/2),z=Math.max(0,Math.floor((D.width-Tv)/2)),K=-Math.floor(lq/2),W=Math.round(G+(z-G)*U),C=Math.round(V+(K-V)*U),H=W+X/2,N=C+I/2,q=qZ6({dismissProgress:this.dismissProgress,easedDismissProgress:F,introOrbScale:Z,normalOrbCenterX:H,normalOrbCenterY:N,size:D}),w=Math.max(Tv,Math.round(Tv*q.orbScale)),L=Math.max(lq,Math.round(lq*q.orbScale)),R=q.orbCenterX,_=q.orbCenterY,P=Math.round(R-w/2),f=Math.round(_-L/2),m=Math.max(3,Math.min(D.height-5,Math.floor(lq/2)+2)),y=Math.max(m+3,D.height-3),T=q.textDissolveProgress,k=this.isFinalIntroStage()?q.backdropDissolveProgress:0,c=this.firstStageTitleVisible&&T<1,d=c&&this.firstStageHintVisible,b=d&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),p=this.introStage===0?this.firstStageTitleRevealProgress:1,n=this.introStage===0?this.firstStageHintRevealProgress:1,s=Math.max(24,Math.min(74,D.width-4)),I0=Math.min(12,Math.max(8,D.height-m-6)),E0=Math.max(0,Math.floor((D.width-s)/2)),G0=Math.max(0,Math.min(D.height-I0,Math.floor(D.height*0.55-I0/2))),q0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new lz({width:w,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new lz({width:w,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new U$({autofocus:!0,canRequestFocus:!0,debugLabel:"WelcomeTakeover",onKey:(t)=>{if(t.key==="Enter")return this.advanceIntroStage(),"handled";if(!this.widget.dismissible&&t.key==="c"&&t.ctrlKey)return this.widget.onQuit?.(),"handled";if(!this.widget.dismissible&&t.key==="q")return this.widget.onQuit?.(),"handled";if((t.key===" "||t.key==="Space")&&!this.isFinalIntroStage())return this.advanceIntroStage(),"handled";if(t.key==="Escape"||t.key==="Esc"){if(!this.widget.dismissible)return this.widget.onQuit?.(),"handled";return this.dismissFromFinalIntroStage()?"handled":"ignored"}if(t.key==="ArrowRight")return this.nextIntroStage(),"handled";if(t.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new t1({fit:"expand",children:[new ej4({color:Q.background,dissolveProgress:k}),new t1({fit:"expand",children:[new nA({onClick:()=>{},child:x0.expand()}),new a1({left:P,top:f,width:w,height:L,child:q0}),...c?[new a1({left:E0,top:G0,width:s,height:I0,child:wZ6({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:s,height:I0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:E,link:$.app.link,keybind:$.app.keybind,titleRevealProgress:p,dissolveProgress:T,context:A})})]:[],...d?[...b?[new a1({left:E0,top:Math.max(0,y-1),width:s,height:1,child:new D0({text:PZ6({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:T}),textAlign:"center"})})]:[],new a1({left:E0,top:y,width:s,height:1,child:TZ6({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:$.app.keybind,revealProgress:n,dissolveProgress:T,context:A})})]:[]]})]})})}}class ej4 extends EB{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new AR4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class AR4 extends fA{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;iA(!!A,"performLayout called without constraints");let Q=A.constrain(A.biggest.width,A.biggest.height);this.setSize(Q.width,Q.height),super.performLayout()}paint(A,Q=0,$=0){let B=Math.floor(Q+this.offset.x),E=Math.floor($+this.offset.y),D=Math.floor(this.size.width),J=Math.floor(this.size.height),U={bg:this.color},Y=RE(this.dissolveProgress);if(Y<=0){A.fill(B,E,D,J," ",U);return}if(Y>=1)return;for(let Z=0;Z<J;Z++)for(let F=0;F<D;F++)if(!uZ6(F,Z,D,J,Y))A.fill(B+F,E+Z,1,1," ",U)}}function RE(A){return Math.min(1,Math.max(0,A))}function _v(A){return 1-(1-A)**3}function lj4(A){return pj4[A]??pj4[0]}function ij4(A,Q,$){return{primary:Mq(A.primary,Q.primary,$),secondary:Mq(A.secondary,Q.secondary,$)}}function qZ6({dismissProgress:A,easedDismissProgress:Q,introOrbScale:$,normalOrbCenterX:B,normalOrbCenterY:E,size:D}){return{orbScale:$+($*0.86-$)*Q,orbCenterX:B+(D.width*0.54-B)*Q,orbCenterY:E-D.height*0.44*Q,textDissolveProgress:RE(A/0.52),backdropDissolveProgress:_v(RE((A-0.12)/0.88))}}function uZ6(A,Q,$,B,E){let D=B<=1?0:Q/(B-1),J=QR4(A+Q*Math.max(1,$));return(1-D)*0.72+J*0.28<E}function wZ6({introStages:A,stage:Q,previousStage:$,progress:B,direction:E,width:D,height:J,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V}){if($===null||B>=1)return Nc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V});let z=_v(B),K=E*Math.round((1-z)*D),W=-E*Math.round(z*D);return new Zq(new t1({fit:"expand",children:[new a1({left:W,top:0,width:D,height:J,child:Nc0({introStages:A,stage:$,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:$===0?1:I,dissolveProgress:G,context:V})}),new a1({left:K,top:0,width:D,height:J,child:Nc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V})})]}))}function Nc0({introStages:A,stage:Q,foreground:$,mutedForeground:B,accent:E,link:D,keybind:J,titleRevealProgress:U,dissolveProgress:Y,context:Z}){let F=A[Q]??A[0]??uc0[0],X=new $0({color:E,bold:!0}),I=new $0({color:$}),G=A===uc0&&Q===0,V=[...F.title===null?[]:[new D0({text:G?u90(LZ6({progress:U,foreground:E,pulseColor:E}),Y):new h($8(F.title,Y),X),textAlign:"center"})],...F.body.length>0?[MZ6()]:[],...F.body.map((z)=>OZ6(z,I,B,D,J,Y,Z))];return new B6({child:new yA({padding:n0.horizontal(1),child:new IA({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:V})})})}function MZ6(){return x0.height(1)}function OZ6(A,Q,$,B,E,D,J){if(typeof A==="string")return new D0({text:new h($8(A,D),Q),textAlign:"center"});if("codeBlock"in A)return new q5({onCopy:(U,Y)=>{if(Y)AQ.success(J,"Copied to clipboard",2000)},child:new IA({mainAxisSize:"min",children:A.codeBlock.map((U)=>new D0({text:new h($8(U,D),new $0({color:E})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let U=new D0({text:new h("",void 0,[new h($8(A.text,D),new $0({color:$,dim:!0})),new h($8(A.keybind,D,A4(A.text).length),new $0({color:E}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new B6({child:new q5({child:U})});return U}if("highlightText"in A){let U=N$.createSpan(A.href,A.linkText,new $0({color:B,underline:!0})),Y=cX.of(J),Z=new h("",void 0,[new h(A.text,Q),new h(A.highlightText,new $0({color:E})),new h(A.textAfterHighlight,Q),new h(U.text,U.style,U.children,U.hyperlink,()=>{C$(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new h(A.textAfter,Q)]);return new D0({text:u90(Z,D),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new IA({mainAxisSize:"min",children:[new D0({text:new h($8(A.text,D),Q),textAlign:"center"}),new B6({child:new wA({mainAxisSize:"min",children:[N$.createWidget(J,A.href,$8(A.linkText,D),new $0({color:B,underline:!0})),new D0({text:new h($8(A.textAfter,D),Q)})]})})]});let U=N$.createSpan(A.href,A.linkText,new $0({color:B,underline:!0})),Y=cX.of(J),Z=new h("",void 0,[new h(A.text,Q),new h(U.text,U.style,U.children,U.hyperlink,()=>{C$(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new h(A.textAfter,Q)]);return new D0({text:u90(Z,D),textAlign:"center"})}if(D>0)return new D0({text:new h($8(A.text,D),new $0({color:B,underline:!0})),textAlign:"center"});return new B6({child:N$.createWidget(J,A.href,A.text,new $0({color:B,underline:!0}))})}function LZ6({progress:A,foreground:Q,pulseColor:$}){let B=new $0({color:Q,bold:!0}),E=new $0({color:RZ6({progress:A,foreground:Q,pulseColor:$}),bold:!0});return new h("",void 0,[new h(jZ6(A).padEnd(wc0," "),B),new h(" ",B),new h(nj4(rj4,CZ6,A,0.72),B),new h(" ",B),new h(nj4(sj4,HZ6,A,0.88),E)])}function jZ6(A){let Q=A4(oj4),$=Math.min(wc0,Math.ceil(RE(A/0.62)*wc0));return Q.slice(0,$).join("")}function nj4(A,Q,$,B){return $>=B?A:"".padEnd(Q," ")}function RZ6({progress:A,foreground:Q,pulseColor:$}){if(A<0.88||A>=1)return Q;let B=RE((A-0.88)/0.12);return Math.cos(B*Math.PI*4)*(1-B)>0.12?$:Q}function PZ6({stage:A,featureStageCount:Q,foreground:$,dissolveProgress:B}){return new h($8(`${A}/${Q}`,B),new $0({color:$,dim:!0}))}function vZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}){let J=new $0({color:B}),U=new $0({color:$,dim:!0}),Y=Q?A?"Enter":"Space":"Esc",Z=Q?A?" to get started":" to continue":" to quit",F="",X="",I=`${Z}`;if(!Q)return new h("",void 0,[new h(Y,J),new h(Z,U),new h("",J),new h("",U)]);let G=aj4(Y,E),V=aj4(I,RE((E*(A4(Y).length+A4(I).length)-A4(Y).length)/A4(I).length));return new h("",void 0,[new h($8(G,D),J),new h($8(V.slice(0,Z.length),D),U),new h($8(V.slice(Z.length,Z.length+0),D),J),new h($8(V.slice(Z.length+0),D),U)])}function TZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D,context:J}){if(Q)return new D0({text:vZ6({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}),textAlign:"center"});let U=new $0({color:B}),Y=new $0({color:$,dim:!0});return new q5({onCopy:(Z,F)=>{if(F)AQ.success(J,"Copied to clipboard",2000)},child:new D0({text:new h("",void 0,[new h("q",U),new h(" to quit",Y)]),textAlign:"center",selectable:!0})})}function aj4(A,Q){let $=A4(A),B=Math.min($.length,Math.ceil(RE(Q)*$.length));return $.slice(0,B).join("").padEnd($.length," ")}function u90(A,Q,$=0){if(Q<=0)return A;let B=$+A4(A.text??"").length,E=A.children?.map((D)=>{let J=u90(D,Q,B);return B+=A4(D.toPlainText()).length,J});return new h(A.text?$8(A.text,Q,$):A.text,A.style,E,A.hyperlink,A.onClick)}function $8(A,Q,$=0){if(Q<=0)return A;return A4(A).map((E,D)=>{if(E.trim()==="")return E;return QR4($+D)<Q?" ":E}).join("")}function QR4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}function _Z6(A){let $=A.observer.protocolMessages().filter((B)=>B.role==="assistant").at(-1);if(!$)return null;return $.content.filter((B)=>B.type==="text").map((B)=>B.text).join("")}function SZ6(A,Q={}){return new Promise(($,B)=>{let E=!1,D=setTimeout(()=>{J.unsubscribe(),B(Error("Timed out waiting for agent response"))},Q.timeoutMs??600000),J=A.observer.agentState().subscribe((U)=>{if(h3(U)){E=!0;return}if(!E)return;let Y=_Z6(A);if(Y===null)return;clearTimeout(D),J.unsubscribe(),$(Y)})})}class Oc0 extends d0{listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;updateService;initialThreadIDs;showWelcome;welcomeVariant;onWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;onRelaunchRequested;onFirstFrame;initialUserInput;getDefaultNewThreadVisibility;observeThreadSummaries;openThreadPickerOnStart;workspaceSettingsFilePath;context;constructor(A){super();this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.updateService=A.updateService,this.initialThreadIDs=A.initialThreadIDs??[],this.showWelcome=A.showWelcome??!1,this.welcomeVariant=A.welcomeVariant??"intro",this.onWelcomeDismissed=A.onWelcomeDismissed,this.notificationService=A.notificationService,this.mcpTrustHandler=A.mcpTrustHandler,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.onRelaunchRequested=A.onRelaunchRequested,this.onFirstFrame=A.onFirstFrame,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.observeThreadSummaries=A.observeThreadSummaries,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.context=A.context}createState(){return new BR4}}class BR4 extends m0{editorController=new DZ;commandPalette=new Cp(this);commandRegistry=new dg0;toastController=new sx0;relaunchNotificationController=new kg0;exitHintTimer=new Wp(this,1000);ideStatus=new nB(this,{});threadNavigationHistory=new yg0;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;activePluginMessageSubscription=null;activePluginUIRequestsSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;welcomeVisible=!1;endCreditsVisible=!1;invadersHighScore=0;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;emptyThreadTerminalTitleController=new xl;pluginIntegration=null;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;loadThreads=async()=>{return this.widget.context.listThreads()};analyzeContextForThread=async(A,Q)=>{return pz4({ampURL:this.widget.context.ampURL,configService:this.widget.configService,threadID:A,signal:Q})};onSwitchThread=(A)=>{return this.connectToExistingThread(A,{recordNavigation:!0,rethrowError:!0})};threadListSidebar=new Wc0({state:this,isBlocked:()=>this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal(),getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,getWorkspaceRoot:()=>this.widget.context.workspaceRoot,loadThreads:this.loadThreads,observeThreadSummaries:()=>this.widget.observeThreadSummaries(),onSelectThread:this.onSwitchThread});sendFeedbackReport=async(A)=>V80({configService:this.widget.configService,settingsFilePath:this.widget.context.settingsFilePath},A);archiveThread=async(A)=>{let Q=await t50({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let $=await oH4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};removeThreadLabel=async(A,Q)=>{let $=await rH4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};initState(){if(RX.getInstance().interceptConsole(),this.invadersHighScore=this.widget.context.invadersHighScore??0,this.notices=new Wg0(this.widget.configService,($)=>this.setState($)),M6.instance.addPostFrameCallback(()=>{setTimeout(()=>this.widget.onFirstFrame?.(),0),this.noticesPollingTimeout=setTimeout(()=>{this.noticesPollingTimeout=null,this.notices.startPolling()},500)},"Neo notices polling"),this.widget.showWelcome)this.welcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:$,error:B})=>{if(S.error("Neo failed to connect to thread",{threadID:$,error:B}),!$)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe(($)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(re($.settings)))}),this.updateRelaunchIntegration=new xg0({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested,relaunchNotificationController:this.relaunchNotificationController,updateService:this.widget.updateService}),this.updateRelaunchIntegration.init(),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput,Q=this.widget.initialThreadIDs[0];if(Q){let $={};if(A)$.initialUserInput=A;this.connectToInitialThreads(Q,$)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.context.sessionAgentMode);this.pluginIntegration=new _g0({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,context:this.widget.context,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread,readThreadMessages:this.readPluginThreadMessages,runAgent:this.runPluginAgent,onBlockingConfirmDialogChange:this.syncEmptyThreadPluginConfirmationTitle}),this.pluginIntegration.init(),this.mcpTrustIntegration=new Vh0({state:this,mcpTrustHandler:this.widget.mcpTrustHandler,toastController:this.toastController,workspaceSettingsFilePath:this.widget.workspaceSettingsFilePath}),this.mcpTrustIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=Z1.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.context.pluginService?Ku4({pluginService:this.widget.context.pluginService,workspaceRoot:this.widget.context.workspaceRoot,logFilePath:this.widget.context.logFilePath,toastController:this.toastController}):[],B=[Mu4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["resume"],status:{type:"enabled"},sortBoost:100,run:(E,D,J)=>{E.pushWithDismiss((U)=>zd0({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,loadThreadTail:this.widget.context.loadThreadTail,onSelectThread:this.onSwitchThread,onDismiss:U,onThreadSelected:J}))}},...this.threadListSidebar.commands(),{noun:"thread",verb:"switch to previous",description:"Switch to previous thread",keywords:["back"],get status(){return A.threadNavigationHistory.canNavigateBack()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to previous with no previous thread"}},run:(E,D,J)=>{A.navigateBack(),J()}},WM4({configService:this.widget.configService,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??void 0,toastController:this.toastController}),{noun:"thread",verb:"switch to next",description:"Switch to next thread",keywords:["forward"],get status(){return A.threadNavigationHistory.canNavigateForward()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to next with no next thread"}},run:(E,D,J)=>{A.navigateForward(),J()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",status:{type:"enabled"},run:(E,D,J)=>{E.push(new wm0({mcpServers:this.widget.context.mcpServers,onDismiss:J}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",status:{type:"enabled"},run:(E)=>{E.pushWithDismiss((D)=>new Cc0({toolboxes:this.widget.context.toolboxes,onDismiss:D}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","blog","announcements"],status:{type:"enabled"},run:async(E,D,J)=>{try{await C$(D,"https://ampcode.com/chronicle")}finally{J()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config"],status:{type:"enabled"},run:()=>{vz(this.widget.context.settingsFilePath).catch((E)=>{S.error("Failed to open settings file in editor",{error:E})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains"],status:{type:"enabled"},run:(E,D,J)=>{E.pushWithDismiss((U)=>new um0({onCancel:U,onSelect:(Y)=>{this.handleIdeSelection(Y),J()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["manual","?"],status:{type:"enabled"},run:(E,D,J)=>{E.push(new pg0({commands:oB.of(D).commands,onDismiss:J}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",status:{type:"enabled"},run:(E,D,J)=>{J(),A.showWelcome()}},{noun:"amp",verb:"end credits",description:"Roll the full-screen Amp credits",status:{type:"enabled"},run:(E,D,J)=>{J(),A.showEndCredits()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["v"],status:{type:"enabled"},run:(E,D,J)=>{E.push(new o4({header:"Amp Version",maxWidth:72,onDismiss:J,child:new D0({text:new h(O50({version:"0.0.1780130685-gfdac38",buildTimestamp:"2026-05-30T08:49:46.106Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","bye"],shortcut:WA.ctrl("c"),status:{type:"enabled"},run:(E,D)=>{W4.maybeInvoke(D,new hz)}},...Q,...aH4(this.widget.context.logFilePath)].map((E)=>this.commandRegistry.register(E));return()=>{for(let E of B)E()}}build(A){let Q=this.buildHints(),$=this.ideStatus.getValue(),B=this.notices.current,E=new Ic0({initialAgentMode:this.widget.context.sessionAgentMode,initialPluginAgentModeKey:this.widget.context.initialPluginAgentModeKey,analyzeContextForThread:this.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:$,statusItems:this.pluginIntegration?.getStatusItems()??[],pluginConfirmationBlocked:this.pluginIntegration?.hasBlockingConfirmDialog()??!1,notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.welcomeVisible?null:B,onDismissNotice:(I)=>this.notices.dismiss(I)}),D=V4.of(A),J=D.capabilities.animationSupport!=="disabled",U=this.threadListSidebar.visibleWidth(),Y=Math.max(0,D.size.width-U),F=[new GA({constraints:U4.tight(D.size.width,D.size.height),child:this.threadListSidebar.buildBody(E)})];if(this.commandPalette.isEnabled())F.push(new U$({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new cg0({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.welcomeVisible)F.push(zd0({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,loadThreadTail:this.widget.context.loadThreadTail,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.welcomeVisible)F.push(new U$({debugLabel:"WelcomeDialogOverlay",child:new Mc0({onDismiss:this.dismissWelcome,onQuit:()=>Z1.instance.stop(),animationsEnabled:J,variant:this.widget.welcomeVariant})}));let X=this.executorAlreadyConnectedDialog;if(X)F.push(new U$({debugLabel:"ExecutorAlreadyConnectedDialogOverlay",child:new Nm0({existingExecutorPid:X.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(F.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),F.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.context.isInternalUser)F.push(new ig0({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:w90.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)F.push(new qm0);if(this.endCreditsVisible)F.push(new Vm0({onComplete:this.completeEndCredits,highScore:this.invadersHighScore,onHighScoreChange:this.updateInvadersHighScore}));return new WQ({context:this.widget.context,child:new oB({commandRegistry:this.commandRegistry,child:new zv({completionBuilder:this.widget.completionBuilder,child:new AQ({controller:this.toastController,child:new W4({actions:this.buildActions(),child:new tQ({debugLabel:"AppShortcuts",shortcuts:this.buildShortcuts(),child:new KQ({debugLabel:"AppShellFocus",child:new tx0({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...B&&this.activeThreadContext&&!this.welcomeVisible?[this.notices]:[]],child:new lg0({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new mp({left:U,width:Y,child:new t1({children:F})})})})})})})})})})})}buildShortcuts(){let A=new Map([[WA.ctrl("c"),new z70],[WA.ctrl("o"),new W70],[WA.alt("i"),new H70],[WA.alt("p"),new Ap],[WA.ctrl("."),new u70],[WA.ctrl("t"),new O70],...this.threadListSidebar.shortcutEntries()]);if(w90.env.NODE_ENV==="development"&&w90.platform==="darwin")A.set(WA.meta("r"),new K70);return A}buildActions(){let A=new dA(()=>{if(k2.hasAnyCopyableSelection())return k2.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new dA(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),$=new dA(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),B=new dA(()=>{return this.startNewDraftThread(),"handled"}),E=new dA(()=>{return Z1.instance.stop(),"handled"}),D=new dA(()=>{return jl({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),J=new dA((I)=>{if(!I.text)return"ignored";return Z1.instance.tuiInstance.clipboard.writeText(I.text).then((G)=>{if(G.ok)this.toastController.show(I.successMessage,"success",2000);else this.toastController.show(`${I.failureMessage}: ${G.userFacingErrorMessage}`,"error",4000)}).catch((G)=>{S.error("Failed to copy Neo text to clipboard",{error:G}),this.toastController.show(I.failureMessage,"error",2000)}),"handled"}),U=new dA(()=>{return Z1.instance.toggleFrameStatsOverlay(),"handled"}),Y=new dA(()=>this.notices.dismissCurrent()?"handled":"ignored"),Z=new dA(()=>{if(!this.widget.context.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),F=yu4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,context:this.widget.context,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),X=new dA(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[z70,A],[rp,B],[hz,E],[K70,D],[DB,J],[Al,$],[W70,Q],[H70,Z],...this.threadListSidebar.actionEntries(),[u70,Y],...F,[Ap,U],[O70,X]])}startNewDraftThread(A={}){let Q=this.activeThreadContext?.client.getThreadId();if(this.commandPalette.disable(),this.threadNavigationHistory.recordNavigation(Q),this.setState(()=>{if(this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.cancelOwnerUIRequests(),this.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),this.widget.onActiveThreadChange?.(null),this.syncEmptyThreadPluginConfirmationTitle(),A.prompt!==void 0)this.editorController.text=A.prompt}syncEmptyThreadPluginConfirmationTitle=()=>{this.emptyThreadTerminalTitleController.setPluginConfirmationBlocked(this.activeThreadContext===null&&(this.pluginIntegration?.hasBlockingConfirmDialog()??!1))};closeCommandPaletteOnFocusLoss=(A)=>{if(A||!this.commandPalette.isEnabled())return;this.commandPalette.disable()};ensureDraftThreadSettingsInitialized(){if(this.hasDraftThreadSettingsSeed)return Promise.resolve();if(!this.draftThreadSettingsInitPromise)this.draftThreadSettingsInitPromise=this.initDraftThreadSettings();return this.draftThreadSettingsInitPromise}async initDraftThreadSettings(){try{let A=this.applySessionDefaultsToThreadSettings(await yP(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){S.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.context.sessionAgentMode,$=A,B=Qq(Q),E=t30(this.widget.context,Q);if(B!==void 0&&E!==void 0)$={...$,[B]:E};return r30($,{agentMode:Q,explicitEffort:this.widget.context.explicitReasoningEffort,sessionState:this.widget.context})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=$R4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(nU(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=$R4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(bz);if(this.exitHintTimer.isActive())A.add(Bv);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),Z1.instance.stop();else this.exitHintTimer.activate()};dismissWelcome=()=>{if(!this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!1}),this.widget.onWelcomeDismissed?.()};updateInvadersHighScore=(A)=>{if(A<=this.invadersHighScore)return;this.setState(()=>{this.invadersHighScore=A}),sY((Q)=>({...Q,neoInvadersHighScore:Math.max(Q.neoInvadersHighScore,A)})).catch((Q)=>{S.warn("Failed to save Neo Invaders high score",{error:Q instanceof Error?Q.message:String(Q)})})};showWelcome=()=>{if(this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!0})};showEndCredits=()=>{if(this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!0})};completeEndCredits=()=>{if(!this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!1})};promptExecutorAlreadyConnected(A){return new Promise((Q)=>{this.setState(()=>{this.executorAlreadyConnectedDialog={existingExecutorPid:A.existingExecutorPid,resolve:($)=>{Q($==="watch"?"observe":"disconnect")}}})})}handleExecutorAlreadyConnectedChoice=(A)=>{if(this.resolveExecutorAlreadyConnectedDialog(A),A==="exit")Z1.instance.stop()};resolveExecutorAlreadyConnectedDialog(A){let Q=this.executorAlreadyConnectedDialog;if(!Q)return;this.setState(()=>{this.executorAlreadyConnectedDialog=null}),Q.resolve(A)}closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1})};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,$=null,B,E,D)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),U=A.find(pe);if(U)this.widget.history.add(U.text,w90.cwd()),this.widget.history.reset();let Y=$?void 0:await this.widget.getDefaultNewThreadVisibility?.(),Z=$??Y??null,F=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,Z??void 0,E,D);if(this.sendUserMessage(F,A,E?void 0:Q,E?void 0:B),!E)this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings);this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(F)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.context.sessionAgentMode=A;let $=Q["reasoning.effort"];if($!==void 0)this.widget.context.lastReasoningEffortByMode={...this.widget.context.lastReasoningEffortByMode??{},[A]:$};let B=Qq(A),E=B?Q[B]:void 0;if(E!==void 0)this.widget.context.lastSpeedByMode={...this.widget.context.lastSpeedByMode??{},[A]:E};sY((D)=>{let J={...D,agentMode:A};if($!==void 0)J={...J,lastReasoningEffortByMode:{...J.lastReasoningEffortByMode??{},[A]:$}};if(E!==void 0)J={...J,lastSpeedByMode:{...J.lastSpeedByMode??{},[A]:E}};return J}).catch((D)=>{S.warn("Failed to persist Neo session defaults for new message",{error:D instanceof Error?D.message:String(D)})})}sendUserMessage(A,Q,$,B){let E=M50(this.ideStatus.getValue());if(B===void 0){A.client.sendUserMessage(Q,$,{userState:E});return}A.client.sendUserMessage(Q,$,{reasoningEffort:B,userState:E})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};getRelaunchThreadIDs=()=>{let A=new Set,Q=this.getActiveThreadID();if(Q)A.add(Q);for(let $ of this.widget.clientPool.activeThreadIDs)A.add($);return[...A]};appendPluginMessagesToThread=async(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("appendToThread is not available - no active thread");let B=$.client.getThreadId();if(Q&&B!==Q)throw Error("thread.append is only available for the active executor thread");for(let E of A)this.sendUserMessage($,[{type:"text",text:E.content}])};readPluginThreadMessages=async(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("thread.messages is not available - no active thread");let B=$.client.getThreadId();if(Q&&B!==Q)throw Error("thread.messages is only available for the active thread");return YaA(ZaA($.observer.protocolMessages()),A)};runPluginAgent=async(A,Q)=>{await this.ensureDraftThreadSettingsInitialized();let $=this.widget.clientPool.createNewThread(this.widget.context.sessionAgentMode,this.draftThreadSettings,void 0,A,Q.agentModeDisplay,Q.parentThreadID,{trackAsLastActive:!1});this.sendUserMessage($,[{type:"text",text:Q.message}]);try{let B=await SZ6($,{timeoutMs:Q.timeoutMs}),E=$.client.getThreadId();return E?{threadID:E,text:B}:{text:B}}finally{this.widget.clientPool.disconnect($)}};async connectToExistingThread(A,Q={}){let $=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let B=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.context.observerOnly,onExecutorAlreadyConnected:(E)=>this.promptExecutorAlreadyConnected(E)});if(this.setActiveClient(B),Q.recordNavigation&&$!==A)this.threadNavigationHistory.recordNavigation($);if(Q.initialUserInput)this.sendUserMessage(B,[{type:"text",text:Q.initialUserInput}])}catch(B){if(S.error("Failed to load thread",{error:B,threadID:A}),this.toastController.show(`Failed to load ${A}: ${B instanceof Error?B.message:String(B)}`,"error",4000),Q.rethrowError)throw B}finally{this.setState(()=>{this.connectingToThreadID=null})}}async connectToInitialThreads(A,Q={}){await this.connectToExistingThread(A,Q);let $=this.widget.initialThreadIDs.filter((B)=>B!==A);await Promise.all($.map((B)=>this.resumeBackgroundThread(B)))}async resumeBackgroundThread(A){try{await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.context.observerOnly,onExecutorAlreadyConnected:async()=>"observe"})}catch(Q){S.error("Failed to resume background thread",{error:Q,threadID:A}),this.toastController.show(`Failed to resume ${A}: ${Q instanceof Error?Q.message:String(Q)}`,"error",4000)}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q,agentModeDisplay:$}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q,agentModeDisplay:$}}),this.syncEmptyThreadPluginConfirmationTitle(),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)}),this.activePluginMessageSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription?.unsubscribe(),this.pluginIntegration?.cancelOwnerUIRequests(),this.activePluginMessageSubscription=Q.pluginMessages().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage(B,(E)=>{A.sendPluginMessage(E)})}),this.activePluginUIRequestsSubscription=Q.pluginUIRequests().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage({type:"plugin_message",message:{type:"event",event:"plugin.ui.snapshot",data:{requests:[...B]}}},(E)=>{A.sendPluginMessage(E)})})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){S.error("Failed to connect to IDE",{error:Q});let $=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${$}`,"error",4000)}};dispose(){if(this.unregisterCommands?.(),this.unregisterCommands=null,this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.emptyThreadTerminalTitleController.dispose(),this.mcpTrustIntegration?.dispose(),this.mcpTrustIntegration=null,this.updateRelaunchIntegration?.dispose(),this.updateRelaunchIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.noticesPollingTimeout)clearTimeout(this.noticesPollingTimeout),this.noticesPollingTimeout=null;this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.welcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||this.endCreditsVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function $R4(A,Q,$){let B={...A};for(let E of kZ6(Q,$)){if(!nU(A[E],Q[E]))continue;let D=$[E];if(D===void 0)delete B[E];else B[E]=D}return B}function kZ6(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}fB();function ER4(A,Q,$,B){let E=GxA(A),D="\x1B[0m",J="\x1B[34m",U="\x1B[90m",Y="\x1B[2m",Z=[];if(A.archived)Z.push("\x1B[90m\x1B[2mArchived\x1B[0m");Z.push(`${E}`),Z.push(`\x1B[34m${Q}\x1B[0m`),Z.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let F=14,X=7,I=new _2(F,X),G=new O5(42),V=new Wv(F,X,F,X,F,X,0,A.agentMode??"smart","intensity","ascii",void 0,void 0,g0.default(),G);V.layout(U4.tight(F,X)),V.paint(I,0,0);let z=I.getBuffer().getCells(),K=0;for(let R=0;R<X;R++)if(z[R].some((_)=>_.char!==" ")){K=R;break}let W=X-1;for(let R=X-1;R>=0;R--)if(z[R].some((_)=>_.char!==" ")){W=R;break}function C(R,_){if(!R)return"";if(R.type==="rgb"){let{r:P,g:f,b:m}=R.value;if($.getColorDepth()>=24)return`\x1B[${_?38:48};2;${P};${f};${m}m`;let y=Up(P,f,m);return`\x1B[${_?38:48};5;${y}m`}return""}let H=[];if(W>=K)for(let R=K;R<=W;R++){let _="";for(let P=0;P<F;P++){let f=z[R][P],m=f.char,y=C(f.style.fg,!0);_+=y+m+"\x1B[0m"}H.push(_)}let N=H.length,q=Math.max(N,Z.length),w=Math.floor((q-N)/2),L=Math.floor((q-Z.length)/2);for(let R=0;R<q;R++){let _=" ".repeat(F);if(R>=w&&R<w+N)_=H[R-w];let P=" ",f="";if(R>=L&&R<L+Z.length)f=Z[R-L];$.write(_+P+f+`
|
|
4466
4466
|
`)}if(B)$.write(`
|
|
4467
4467
|
\x1B[90m${B}\x1B[0m
|
|
4468
4468
|
`)}a0();class Lc0{status=T3.status;constructor(){this.autoConnect()}async connect(A){await T3.start(A,!0,"user-initiated"),T3.selectConfig(A)}autoConnect(){let A=T3.getSelectedConfig();if(A){T3.start(A,!0,"auto-startup").catch((Q)=>{S.error("Failed to auto-connect to IDE",{error:Q})});return}this.discoverAndConnect()}async discoverAndConnect(){try{await ybA();let A=await cC({});if(A.length===1&&A[0])T3.selectConfig(A[0]),await T3.start(A[0],!0,"auto-startup")}catch(A){S.error("Failed to auto-discover IDE",{error:A})}}}a0();a0();import{exec as iq}from"node:child_process";function DR4(A="idle"){try{if(A==="idle"){if(process.platform==="darwin")iq("afplay /System/Library/Sounds/Submarine.aiff");else if(process.platform==="win32")iq("powershell [console]::beep(800,200)");else if(process.platform==="linux")iq("paplay /usr/share/sounds/freedesktop/stereo/message.oga || beep")}else if(A==="idle-review"){if(process.platform==="darwin")iq("afplay /System/Library/Sounds/Glass.aiff")}else if(A==="requires-user-input"){if(process.platform==="darwin")iq("afplay /System/Library/Sounds/Ping.aiff");else if(process.platform==="win32")iq("powershell [console]::beep(1000,300)");else if(process.platform==="linux")iq("paplay /usr/share/sounds/freedesktop/stereo/dialog-information.oga || beep -f 1000 -l 100")}}catch(Q){S.error(`Failed to play notification sound (${A}):`,Q)}}Ip();mx0();var fZ6=2000,yZ6="Agent is ready",xZ6="Waiting for approval";function JR4(A){let Q=!0,$=!0,B=A.configService.config.subscribe((W)=>{Q=W.settings["notifications.enabled"]??!0,$=W.settings["notifications.system.enabled"]!==!1}),E=0,D=()=>{let W=G?.prepareTerminalTitleForNotification();if(W!==void 0)process.stdout.write(nV4(W))},J=(W)=>{if(!Q)return;let C=Date.now();if(C-E<fZ6)return;if(E=C,Pz())return;if(yI4())D(),setTimeout(xI4,Lx0);else DR4(W)},U=()=>{J("idle"),V(yZ6)},Y=()=>{J("requires-user-input"),V(xZ6)},Z=(W)=>W?.attempt===void 0||W.attempt===0,F=null,X=null,I=null,G,V=(W)=>{if(!Q||!$)return;if(Pz()&&!gx0()&&!F50())return;D(),setTimeout(()=>{process.stdout.write(iV4(W))},Lx0)},z=()=>{F?.unsubscribe(),X?.unsubscribe(),F=null,X=null,I=null,G=void 0};return{attach:(W,C,H)=>{if(z(),G=H,C)X=C.subscribe({next:(N)=>{if(N===null)return;if(!Z(N))return;U()},error:(N)=>{S.debug("Neo notification active error stream errored",{error:N})}});F=W.subscribe({next:(N)=>{try{let q=I!==null&&h3(I),w=I==="awaiting_approval",L=q||w;if(N==="awaiting_approval"&&!w)Y();else if(N==="idle"&&L)U()}catch(q){S.debug("Neo notification handling failed",{error:q})}finally{I=N}},error:(N)=>{S.debug("Neo notification agent state stream errored",{error:N})}})},detach:z,unsubscribe(){z(),B.unsubscribe()}}}function bZ6({initialUserInput:A,showWelcome:Q,hideWelcome:$,welcomeVariant:B,welcomeDismissed:E}){if($)return{show:!1,markDismissedOnDismiss:!1};if(B==="npm-migration")return{show:!0,markDismissedOnDismiss:!1};if(Q)return{show:!0,markDismissedOnDismiss:!0};let D=!A&&!E;return{show:D,markDismissedOnDismiss:D}}async function hZ6(A){await sY((Q)=>hP(Q,A,"interactive"))}async function UR4(A,Q={}){let{initialThreadIDs:$=[],initialUserInput:B,getDefaultNewThreadVisibility:E,openThreadPickerOnStart:D=!1,observerOnly:J=!1,initialAgentMode:U,initialPluginAgentModeKey:Y,initialReasoningEffort:Z,onFirstFrame:F,showWelcome:X=!1,hideWelcome:I=!1,welcomeVariant:G="intro"}=Q,V=G==="npm-migration";if($.length>1)S.info("Resuming multiple initial threads",{threadIDs:$});let z=async(m)=>{let y=await A.getThreadFromServer(m);if(!y)return null;return q30(y)},K=async(m)=>{let y=await A.getThreadFromServer(m);if(!y)throw Error(`Thread ${m} not found`);let T=await uB(m,A.configService,A.apiKey,{usesThreadActors:!0}),k=D9({endpoint:A.rivetEndpoint,poolName:T.poolName}),c={wsToken:T.wsToken,transport:"json-rpc"},b=await k.threadActor.get([T.threadId],{params:c}).fetch("/import",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({thread:u30(y)}),skipReadyWait:!0});if(!b.ok&&b.status!==409)throw Error(`Thread import failed (${b.status}): ${await b.text()}`);try{await P30(m,A.configService,A.apiKey,{executorType:"local-client"})}catch(p){S.warn("failed to mark thread as imported on server",{threadID:m,error:p instanceof Error?p.message:String(p)})}},W=new Kx0(A.rivetEndpoint,A.apiKey,A.configService,{clientID:Kz.parse(`neo-${crypto.randomUUID()}`),toolService:A.toolService,skillService:A.skillService,requestPluginToolCall:(m)=>A.pluginService.event.toolCall(m),requestPluginToolResult:(m)=>A.pluginService.event.toolResult(m),pluginService:A.pluginService,pluginPlatform:A.pluginPlatform,invokeTool:async(m,y)=>{let T=typeof y.args==="object"&&y.args!==null?y.args:{},k=await wz({toolName:y.toolName,configService:A.configService,toolService:A.toolService,mcpService:A.mcpService,skillService:A.skillService,toolUseID:y.toolCallId,threadId:m});return A.toolService.invokeTool(y.toolName,{args:T},k)},persistLastThreadID:hZ6,readFileSystemDirectory:A.readFileSystemDirectory},z,K),C=await $q(),H=bZ6({initialUserInput:B,showWelcome:X,hideWelcome:I,welcomeVariant:G,welcomeDismissed:C.neoWelcomeDismissed}),N={ampURL:A.ampURL,configService:A.configService,getThreadMarkdown:async(m)=>{let y=await A.getThreadFromServer(m);return y?p10(y):null},isInternalUser:A.isInternalUser,listThreads:A.listThreads,loadThreadTail:A.getThreadTail,logFilePath:jc,mcpServers:A.mcpService.servers,pluginPlatform:A.pluginPlatform,pluginService:A.pluginService,toolboxes:A.toolboxes,observerOnly:V?!1:J,invadersHighScore:C.neoInvadersHighScore,sessionAgentMode:U??C.agentMode,initialPluginAgentModeKey:Y,explicitReasoningEffort:Z,lastReasoningEffortByMode:C.lastReasoningEffortByMode,lastSpeedByMode:C.lastSpeedByMode,settingsFilePath:A.settingsFilePath,workspaceRoot:A.workspaceRoot},q=(m,y)=>{return PV4({ampURL:A.ampURL,configService:A.configService,threadID:m,signal:y})},w=()=>TV4({apiKey:A.apiKey,configService:A.configService,rivetEndpoint:A.rivetEndpoint}),L=new Lc0,R=JR4({configService:A.configService}),_=await A.configService.getLatest();Z1.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:_.settings["terminal.animation"]===!1}});let P=new Set,f=new Sg0;try{await dx0(new Oc0({clientPool:W,listSkillsForThread:q,completionBuilder:A.completionBuilder,history:new ny0,ideManager:L,configService:A.configService,updateService:A.updateService,initialThreadIDs:V?[]:$,notificationService:R,mcpTrustHandler:A.mcpTrustHandler,initialUserInput:V?void 0:B,getDefaultNewThreadVisibility:E,observeThreadSummaries:w,openThreadPickerOnStart:V?!1:D,workspaceSettingsFilePath:A.workspaceSettingsFilePath,context:N,showWelcome:H.show,welcomeVariant:G,onActiveThreadChange:A.setActiveThreadID,onRelaunchRequested:f.request,onWelcomeDismissed:H.markDismissedOnDismiss?()=>{sY(fV4).catch((y)=>{S.warn("Failed to mark Neo welcome as dismissed",{error:y})})}:void 0,onThreadArchived:(y)=>{P.add(y)},onFirstFrame:F}));let m=W.lastActiveObservingClient;if(m&&f.shouldShowExitSummary){let{client:y,observer:T}=m,k=y.getThreadId();if(k){let c={id:k,title:T.title().getValue(),agentMode:T.agentMode,archived:P.has(k)},d=`${A.ampURL.replace(/\/$/,"")}/threads/${k}`;ER4(c,d,process.stdout)}}}finally{process.stdout.write(G50("")),R.unsubscribe(),W.dispose(),await A.dispose?.()}process.exit(f.relaunchIfRequested(A.workspaceRoot)??0)}import{execFile as gZ6}from"node:child_process";import{closeSync as YR4,openSync as mZ6,writeSync as dZ6}from"node:fs";import cZ6 from"node:tty";var pZ6="\x1B[c",lZ6="\x1B[?1004h",iZ6="\x1B[?1004l",nZ6="\x1B[?u",ZR4=200,aZ6="\x1B[>4;2m",oZ6="\x1B[?9001h",rZ6="\x1B[?9001l";function FR4(){let A=null;try{if(process.stdout.isTTY){let Q=process.stdout.getWindowSize();A=[Q[0],Q[1]]}}catch{}return{isTTY:process.stdout.isTTY,columns:process.stdout.columns??null,rows:process.stdout.rows??null,windowSize:A,hasRefreshSize:typeof process.stdout._refreshSize==="function"}}function sZ6(){if(process.stdout.isTTY)return{stream:process.stdout,target:"stdout",dispose:()=>{}};if(process.stderr.isTTY)return{stream:process.stderr,target:"stderr",dispose:()=>{}};if(process.platform!=="win32")try{let A=mZ6("/dev/tty","w");if(cZ6.isatty(A))return{stream:{write(Q){return dZ6(A,Q),!0}},target:"dev-tty",dispose:()=>{YR4(A)}};YR4(A)}catch{}return{stream:process.stdout,target:"stdout",dispose:()=>{}}}function q$(A,Q){if(!process.stdout.writable||process.stdout.destroyed){Q?.();return}let $=`${JSON.stringify(A)}
|
|
@@ -6362,7 +6362,7 @@ Start Amp from a smaller directory.`};function oX(A,Q){if(!MI4())return;S.debug(
|
|
|
6362
6362
|
`)}function $v4(A,Q){A.command("usage").description("Show your current Amp usage and credit balance").action(async($,B)=>{let E=B.optsWithGlobals(),D=await Q(E),J=await _30(D),U=await O4.userDisplayBalanceInfo({},{config:J});if(!U.ok){if(U.error.code==="auth-required")process.stderr.write(f0.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(f0.red("Error: ")+U.error.message+`
|
|
6363
6363
|
`),process.exit(1)}process.stdout.write(await BV6(U.result.displayText)+`
|
|
6364
6364
|
`),process.exit(0)})}var LC6=Pi.join(lU,"logs","headless.log"),Ll0=Pi.join(fx,"device-id.json");RF4();async function jC6(){let A=await Promise.all(dC.map(async(Q)=>{try{return{query:Q,hasConfigs:(await Q.listConfigs()).length>0}}catch($){return S.debug("Failed to detect query-based IDE integration",{ideName:Q.ideName,error:$}),{query:Q,hasConfigs:!1}}}));for(let Q of A)if(Q.hasConfigs)return Q.query;return}function vS4(){jC6().then((A)=>{if(A){let Q=Z00(A.ideName);if(Q)yC(Q)}})}try{if(process.platform==="win32")await Promise.resolve().then(() => w4($T(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){z7.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
|
|
6365
|
-
`)}function RC6(A){process.emitWarning=(Q,$,B,E)=>{let D=typeof Q==="string"?Q:Q.message||String(Q),J=$||"Warning",U=!1;A.warn(D,{name:J,code:B})}}function C3(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")gG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli"&&BT(Q.mode))gG("experimental.agentMode",Q.mode)}function PC6(A,Q){if(!A$(Q))return;if(!L7(Q.user.email)){if(A.model)throw new OA("The --model flag is only available for Amp employees.",1);gG("internal.model",void 0);return}if(A.model)gG("internal.model",_C6(A.model))}function wS4(A){let Q=A.indexOf(":");if(Q===-1)throw new OA(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let $=A.slice(0,Q).trim(),B=A.slice(Q+1).trim();if(!$||!B)throw new OA(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function vC6(A){if(A===void 0)return;let Q=A.trim();if(ne(Q))return Q;throw new OA(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function TC6(A,Q){if(MF(A,Q))return;let $=hC(A)?.levels,B=$?` Allowed for ${A}: ${$.join(", ")}.`:"";throw new OA(`Reasoning effort "${Q}" is not available for ${A} mode.${B}`,1)}function _C6(A){if(!A.includes("="))return wS4(A),A;let Q={};for(let $ of A.split(",")){let B=$.trim();if(!B)continue;let E=B.indexOf("=");if(E===-1)throw new OA(`Invalid mode-specific model entry "${B}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let D=B.slice(0,E).trim(),J=B.slice(E+1).trim();if(!D)throw new OA(`Missing mode name in "${B}". Expected "mode=provider:model".`,1);if(!J)throw new OA(`Missing model value for mode "${D}". Expected "${D}=provider:model".`,1);wS4(J),Q[D]=J}if(Object.keys(Q).length===0)throw new OA("No valid model overrides found in --model flag value.",1);return Q}function jE0(A,Q,$){let B=Number(A);if(!Number.isInteger(B)||B<$.min)throw new U30(`${Q} must be an integer >= ${$.min}`);if($.max!==void 0&&B>$.max)throw new U30(`${Q} must be an integer <= ${$.max}`);return B}function SC6(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 kC6(A){try{return await PS4(A,"utf-8")}catch{return A}}async function fC6(A,Q,$){let B=SC6(A,Q);if(!B)return;let E=A$($)?$.features:[],D=A$($)?$.user.email:void 0;if(!TS4(E,ID.HARNESS_SYSTEM_PROMPT)&&!(D&&L7(D)))throw new OA("You are not allowed to do this.",1);gG("systemPrompt",await kC6(B))}function TS4(A,Q){return A?.some(($)=>$.name===Q&&$.enabled)??!1}function yC6(A){return A!=="pending"}function Ju(A){if(!A$(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function xC6(A){let Q=Ju(A);if(Q)return Q.id;if(xC(A))throw Error(A.error.message);throw Error("unreachable")}function bC6(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 hC6(A){let B=bC6(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 OA(`Couldn't connect to the Amp server at ${A}.`,1,B)}function Pl0(A,Q){let $=$y0(Error(A.error.message));if($.message===G3.networkOffline||$.message===G3.networkTimeout)return hC6(Q);if($.message!==G3.internalBug)return new OA($.message,1,$.suggestion);return new OA(A.error.message.replace(/^Error: /,""),1)}async function gC6(){if(process.versions.bun)return!1;try{return await rY()==="npm"}catch(A){return S.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var MS4=[{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??nJ,description:`Custom settings file path (overrides the default location ${nJ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(S).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${jc})`},{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:uE(),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:i9.SMART.key,description:`Set the agent mode (${hG({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Show migration instructions for the removed legacy runtime",hidden:!0},{name:"orb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"hideWelcome",long:"hide-welcome",type:"switch",description:"Skip the welcome experience on startup",hidden:!0},{name:"showWelcome",long:"show-welcome",type:"switch",description:"Show the welcome experience on startup",hidden:!0},{name:"observe",long:"observe",type:"option",description:"Open the Neo TUI as an observer of an existing thread (thread ID or URL)",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless thread-actor executor (no TUI). Optionally provide a thread ID to connect to existing thread, otherwise create one.",hidden:!0},{name:"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}],OS4=(A)=>("deprecated"in A)&&A.deprecated===!0,mC6=(A)=>("hidden"in A)&&A.hidden===!0,dC6=(A)=>("default"in A),cC6=(A)=>("default"in A)?A.default:void 0;function LS4(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let $=vC6(Q.effort);if($!==void 0){if(BT(Q.mode))TC6(Q.mode,$)}return $}var pC6="Amp Neo is now Amp and available to everyone. If you need to finish work in the old Amp, you can use an older version. For instructions on how to do that and more information: https://ampcode.com/news/drop-the-neo";function BT(A){return Object.values(i9).some((Q)=>Q.key===A)}function lC6(A,Q){if(BT(A))return A;throw new OA(`${Q} does not support plugin-defined agent modes`,1)}function _S4(A,Q){if(BT(Q))return{agentMode:Q};let $=A.agentModes.list().find((E)=>E.key===Q||E.label===Q);if(!$){let E=hG({}).map((U)=>U.mode).join(", "),D=A.agentModes.list().map((U)=>U.label).join(", "),J=D?` Plugin modes: ${D}.`:"";throw new OA(`Unknown agent mode '${Q}'. Built-in modes: ${E}.${J}`,1)}let B={label:$.label};if($.color!==void 0)B.color=$.color;return{agentMode:i9.SMART.key,agent:$.agent,agentModeDisplay:B,pluginAgentModeKey:$.key}}async function iC6(A,Q,$){if(A.getOptionValueSourceWithGlobals("mode")!=="cli")return;return await Q.initialized,_S4(Q,$)}function nC6(A,Q){let $=Q.args[0],B=Q.commands.map((D)=>D.name());if($&&!$.includes(" ")&&$.length<30&&!/[./\\]/.test($)){let D=B.filter((U)=>$.includes(U)||U.includes($)),J="Run amp --help for a list of available commands.";if(D.length>0)J=`Did you mean: ${D.join(", ")}? Or run amp --help for all commands.`;throw new OA(G3.unknownCommand($),1,J)}}var RE0=p0.file(OC6.homedir()),jl0=process.env.XDG_CONFIG_HOME?p0.file(process.env.XDG_CONFIG_HOME):BA.joinPath(RE0,".config");async function LB(A,Q,$){let B=$?.deferAuth??!1,E=$?.skipToolProviders??!1;MxA("0.0.
|
|
6365
|
+
`)}function RC6(A){process.emitWarning=(Q,$,B,E)=>{let D=typeof Q==="string"?Q:Q.message||String(Q),J=$||"Warning",U=!1;A.warn(D,{name:J,code:B})}}function C3(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")gG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli"&&BT(Q.mode))gG("experimental.agentMode",Q.mode)}function PC6(A,Q){if(!A$(Q))return;if(!L7(Q.user.email)){if(A.model)throw new OA("The --model flag is only available for Amp employees.",1);gG("internal.model",void 0);return}if(A.model)gG("internal.model",_C6(A.model))}function wS4(A){let Q=A.indexOf(":");if(Q===-1)throw new OA(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let $=A.slice(0,Q).trim(),B=A.slice(Q+1).trim();if(!$||!B)throw new OA(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function vC6(A){if(A===void 0)return;let Q=A.trim();if(ne(Q))return Q;throw new OA(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function TC6(A,Q){if(MF(A,Q))return;let $=hC(A)?.levels,B=$?` Allowed for ${A}: ${$.join(", ")}.`:"";throw new OA(`Reasoning effort "${Q}" is not available for ${A} mode.${B}`,1)}function _C6(A){if(!A.includes("="))return wS4(A),A;let Q={};for(let $ of A.split(",")){let B=$.trim();if(!B)continue;let E=B.indexOf("=");if(E===-1)throw new OA(`Invalid mode-specific model entry "${B}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let D=B.slice(0,E).trim(),J=B.slice(E+1).trim();if(!D)throw new OA(`Missing mode name in "${B}". Expected "mode=provider:model".`,1);if(!J)throw new OA(`Missing model value for mode "${D}". Expected "${D}=provider:model".`,1);wS4(J),Q[D]=J}if(Object.keys(Q).length===0)throw new OA("No valid model overrides found in --model flag value.",1);return Q}function jE0(A,Q,$){let B=Number(A);if(!Number.isInteger(B)||B<$.min)throw new U30(`${Q} must be an integer >= ${$.min}`);if($.max!==void 0&&B>$.max)throw new U30(`${Q} must be an integer <= ${$.max}`);return B}function SC6(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 kC6(A){try{return await PS4(A,"utf-8")}catch{return A}}async function fC6(A,Q,$){let B=SC6(A,Q);if(!B)return;let E=A$($)?$.features:[],D=A$($)?$.user.email:void 0;if(!TS4(E,ID.HARNESS_SYSTEM_PROMPT)&&!(D&&L7(D)))throw new OA("You are not allowed to do this.",1);gG("systemPrompt",await kC6(B))}function TS4(A,Q){return A?.some(($)=>$.name===Q&&$.enabled)??!1}function yC6(A){return A!=="pending"}function Ju(A){if(!A$(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function xC6(A){let Q=Ju(A);if(Q)return Q.id;if(xC(A))throw Error(A.error.message);throw Error("unreachable")}function bC6(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 hC6(A){let B=bC6(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 OA(`Couldn't connect to the Amp server at ${A}.`,1,B)}function Pl0(A,Q){let $=$y0(Error(A.error.message));if($.message===G3.networkOffline||$.message===G3.networkTimeout)return hC6(Q);if($.message!==G3.internalBug)return new OA($.message,1,$.suggestion);return new OA(A.error.message.replace(/^Error: /,""),1)}async function gC6(){if(process.versions.bun)return!1;try{return await rY()==="npm"}catch(A){return S.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var MS4=[{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??nJ,description:`Custom settings file path (overrides the default location ${nJ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(S).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${jc})`},{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:uE(),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:i9.SMART.key,description:`Set the agent mode (${hG({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Show migration instructions for the removed legacy runtime",hidden:!0},{name:"orb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"hideWelcome",long:"hide-welcome",type:"switch",description:"Skip the welcome experience on startup",hidden:!0},{name:"showWelcome",long:"show-welcome",type:"switch",description:"Show the welcome experience on startup",hidden:!0},{name:"observe",long:"observe",type:"option",description:"Open the Neo TUI as an observer of an existing thread (thread ID or URL)",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless thread-actor executor (no TUI). Optionally provide a thread ID to connect to existing thread, otherwise create one.",hidden:!0},{name:"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}],OS4=(A)=>("deprecated"in A)&&A.deprecated===!0,mC6=(A)=>("hidden"in A)&&A.hidden===!0,dC6=(A)=>("default"in A),cC6=(A)=>("default"in A)?A.default:void 0;function LS4(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let $=vC6(Q.effort);if($!==void 0){if(BT(Q.mode))TC6(Q.mode,$)}return $}var pC6="Amp Neo is now Amp and available to everyone. If you need to finish work in the old Amp, you can use an older version. For instructions on how to do that and more information: https://ampcode.com/news/drop-the-neo";function BT(A){return Object.values(i9).some((Q)=>Q.key===A)}function lC6(A,Q){if(BT(A))return A;throw new OA(`${Q} does not support plugin-defined agent modes`,1)}function _S4(A,Q){if(BT(Q))return{agentMode:Q};let $=A.agentModes.list().find((E)=>E.key===Q||E.label===Q);if(!$){let E=hG({}).map((U)=>U.mode).join(", "),D=A.agentModes.list().map((U)=>U.label).join(", "),J=D?` Plugin modes: ${D}.`:"";throw new OA(`Unknown agent mode '${Q}'. Built-in modes: ${E}.${J}`,1)}let B={label:$.label};if($.color!==void 0)B.color=$.color;return{agentMode:i9.SMART.key,agent:$.agent,agentModeDisplay:B,pluginAgentModeKey:$.key}}async function iC6(A,Q,$){if(A.getOptionValueSourceWithGlobals("mode")!=="cli")return;return await Q.initialized,_S4(Q,$)}function nC6(A,Q){let $=Q.args[0],B=Q.commands.map((D)=>D.name());if($&&!$.includes(" ")&&$.length<30&&!/[./\\]/.test($)){let D=B.filter((U)=>$.includes(U)||U.includes($)),J="Run amp --help for a list of available commands.";if(D.length>0)J=`Did you mean: ${D.join(", ")}? Or run amp --help for all commands.`;throw new OA(G3.unknownCommand($),1,J)}}var RE0=p0.file(OC6.homedir()),jl0=process.env.XDG_CONFIG_HOME?p0.file(process.env.XDG_CONFIG_HOME):BA.joinPath(RE0,".config");async function LB(A,Q,$){let B=$?.deferAuth??!1,E=$?.skipToolProviders??!1;MxA("0.0.1780130685-gfdac38");let D=B00({storage:A.settings,secretStorage:A.secrets,workspaceRoot:process.cwd(),defaultAmpURL:A.ampURL,homeDir:RE0,userConfigDir:jl0}),J=A.secrets.get("apiKey",A.ampURL),U=nO(D),Y=null,Z=()=>{return},F=new Promise((t)=>{Z=t}),X=J.then(async(t)=>{if(!t&&!B)await F;return Y??=U.subscribe(()=>{}),P4(U.pipe(B5(yC6)))});X.catch(()=>{return}),xP4(D);let I=await D.getLatest();S.debug("Global configuration initialized",{settingsKeys:Object.keys(I.settings)});let G=!1;{let t=await J;if(G=Boolean(t),S.info("API key lookup before login",{found:Boolean(t),ampURL:A.ampURL,deferAuth:B}),!t)if(B)S.info("No API key found, continuing startup with deferred auth");else{RQ.write(`No API key found. Starting login flow...
|
|
6366
6366
|
`);let W0=await aC6(A),l=await A.secrets.get("apiKey",A.ampURL);if(S.info("Login flow completed",{success:W0,storedKeyPresent:Boolean(l),ampURL:A.ampURL}),!W0)await aY(),process.exit(1);G=!0,Z()}}{let t=await D.getLatest(),W0=t.settings.url,l=t.secrets.isSet?.[W0];S.info("Config secrets state after login",{configURL:W0,apiKeySet:l?.apiKey??!1})}let V=B?"pending":await X;if(!B)S.info("Server status resolved",{status:"ready",isAuthenticated:A$(V),isError:xC(V),errorMessage:xC(V)?V.error.message:void 0});PC6(Q,V);let z=X.then((t)=>xC6(t));z.catch(()=>{return});let K=A$(V),W=!1;if(process.env.AMP_DISABLE_PLUGINS==="1")S.warn("Ignoring AMP_DISABLE_PLUGINS outside development");let C=W?"off":"all",{toolService:H,dispose:N}=DD4({configService:D}),q=new Map,w=()=>q.clear(),L=new JM0(D,A.settings.getWorkspaceRootPath()),R=rsA({configService:D}),_=TnA({configService:D,trustStore:L,skillMCPServers:R.skillMCPServers,uploadImageAttachments:K,createOAuthProvider:async(t,W0,l)=>{let i=`${t}:${W0}`,A0=q.get(i);if(A0)return S.debug("Reusing existing OAuth provider for server",{serverName:t,serverUrl:W0}),A0;S.debug("Creating OAuth provider for server",{serverName:t,serverUrl:W0});let r=(async()=>{let B0=new oC(A.secrets),Q0=await B0.getClientInfo(t,W0),V0=l?.scopes??Q0?.scopes,z0=dI4();S.info("OAuth headless mode check",{useHeadless:z0,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:RQ.isTTY});let w0;if(z0)w0=A.executeMode?mI4():gI4(t);let X0=new tN0({storage:B0,serverName:t,serverUrl:W0,clientId:l?.clientId??Q0?.clientId,clientSecret:l?.clientSecret??Q0?.clientSecret,authUrl:l?.authUrl??Q0?.authUrl,tokenUrl:l?.tokenUrl??Q0?.tokenUrl,scopes:V0,headlessAuthHandler:w0});return S.debug("OAuth provider created",{serverName:t,serverUrl:W0,hasManualClientId:!!(l?.clientId??Q0?.clientId),willUseDCR:!(l?.clientId??Q0?.clientId),scopes:V0,headlessMode:z0,executeMode:A.executeMode}),X0})();return q.set(i,r),r}}),P=UL0({configService:D,spawn:n10}),f=Q.headless?UP4():void 0,m=f??new f90({configService:D}),y=m instanceof f90?m:void 0;if(y)y.pluginExecutorKind="local";let T=new C4(null),k=null,c=K&&!W?[...FP4(I.settings)?[{name:"permissions",entryPoint:dc0}]:[],{name:"thread-visibility",entryPoint:GP4(D,()=>X.then(Ju),()=>k,(t)=>{k=t}),alwaysLoad:!0}]:[],d=HM0({configService:D,platform:m,loadGlobalPlugins:Cy0(D),pluginFilter:C,activeThread$:T,internalPlugins:c}),b=vaA(d),p=[_,P,b],n;if(E)n=new Map;else if(A.executeMode){let t=await ueA({toolService:H,providers:p,initialTimeout:15000});n=t.registrations;for(let[W0,l]of t.initErrors)S.warn(`${W0} provider initialization slow or failed:`,l)}else n=YL0({toolService:H,providers:p});if(Q.jetbrains)yC("JetBrains");else if(Q.ide&&aI4())yC("VS Code");else if(Q.ide&&oI4())yC("Neovim");else if(Q.ide&&A.executeMode)vS4();if(A.executeMode)OxA(!0);let s,I0=T3.status.pipe(pA((t)=>Boolean(t.connected&&t.authenticated&&t.ideName&&PbA(t.ideName))),BQ()).subscribe((t)=>{if(t){if(!s)s=H.registerTool(qeA)}else s?.dispose(),s=void 0}),E0;if(!A.executeMode){let t=await A.settings.get("fuzzy.alwaysIncludePaths")??[];E0=new T30(process.cwd(),{alwaysIncludePaths:t},!0)}else E0=new class extends T30{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let G0=ph(D);S.info("Starting Amp background services");let F0=new oc0,q0={configService:D,toolService:H,mcpService:_,skillService:R,toolboxService:P,trustStore:L,threadRemote:G0,setThreadMeta:G0.setThreadMeta,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:E0,terminal:F0,pluginService:d,pluginPlatform:y,headlessPluginPlatform:f,activeThread$:T,serverStatus:V,serverStatusPromise:X,viewerUserIDPromise:z,hasAPIKeyAtStartup:G,consumeDraftNewThreadVisibility:()=>{let t=k;return k=null,t}};return{...q0,async asyncDispose(){if(q0.mcpService.hasAuthenticatingClients())S.info("Waiting for OAuth authentication to complete before exit..."),await q0.mcpService.waitForAuthentication();for(let t of n.values())t.dispose();await q0.mcpService.dispose(),w(),q0.configService.unsubscribe(),Y?.unsubscribe(),N(),q0.fuzzyServer.dispose(),q0.settingsStorage[Symbol.dispose](),I0.unsubscribe(),s?.dispose(),await q0.pluginService.dispose()}}}async function aC6(A){if(!A.executeMode){if(!await _90("Would you like to log in to Amp? [(y)es, (n)o]: "))return RQ.write(`Login cancelled. Run the command again to retry.
|
|
6367
6367
|
`),!1}return await SS4(A)}async function SS4(A){let Q=uC6(32).toString("hex"),$=await yc0(A.ampURL,Q),B=new AbortController;try{await OG($,B.signal)}catch(D){S.error("Error opening browser",{error:D})}let E=await yc0(A.ampURL,Q,!1);RQ.write(`If your browser does not open automatically, visit:
|
|
6368
6368
|
|
|
@@ -6370,7 +6370,7 @@ ${f0.blue.bold(E)}
|
|
|
6370
6370
|
|
|
6371
6371
|
`);try{return await cR4(A.ampURL,Q,A.secrets,B),RQ.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(D){return S.error("Login failed",{error:D}),z7.write(`
|
|
6372
6372
|
Login failed: ${D instanceof Error?D.message:String(D)}
|
|
6373
|
-
`),!1}}async function oC6(A,Q,$){let B=await Q.get("apiKey",A);if(!B)throw new OA("No Amp API key found. Run `amp login` first.",1);let E=qC6("curl",["-H",`Authorization: Bearer ${B}`,...$],{stdio:"inherit"});process.exitCode=await new Promise((D,J)=>{E.on("error",J),E.on("close",(U)=>D(U??1))})}function rC6(A){let Q=new uX().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, unlisted, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((C)=>{if(C.code==="commander.help"||C.code==="commander.version"||C.exitCode===0)cN(),process.exit(0);let H=C.originalError??C;oF4(H)}),iz4(Q,{version:"0.0.
|
|
6373
|
+
`),!1}}async function oC6(A,Q,$){let B=await Q.get("apiKey",A);if(!B)throw new OA("No Amp API key found. Run `amp login` first.",1);let E=qC6("curl",["-H",`Authorization: Bearer ${B}`,...$],{stdio:"inherit"});process.exitCode=await new Promise((D,J)=>{E.on("error",J),E.on("close",(U)=>D(U??1))})}function rC6(A){let Q=new uX().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, unlisted, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((C)=>{if(C.code==="commander.help"||C.code==="commander.version"||C.exitCode===0)cN(),process.exit(0);let H=C.originalError??C;oF4(H)}),iz4(Q,{version:"0.0.1780130685-gfdac38",buildTimestamp:"2026-05-30T08:49:46.106Z",buildType:"release"}),Q.addHelpText("after",IG4()),Q.configureHelp({formatHelp:GG4}),Q.command("logout").description("Log out by removing stored API key").action(async(C,H)=>{let N=H.optsWithGlobals(),q=await E6(N);await UH6(q)}),Q.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(C,H)=>{let N=H.optsWithGlobals(),q=await E6(N);await JH6(q,await pc0(N,q.settings))}),iF4(Q,E6);let B=Q.command("internal",{hidden:!0}).description("Internal commands").command("curl [args...]").description("Internal: run curl with the current Amp API key as a bearer token").allowUnknownOption(!0).allowExcessArguments(!0).action(async(...C)=>{let H=C.find((L)=>typeof L==="object"&&L!==null&&typeof L.optsWithGlobals==="function")??B,N=C.filter((L)=>L!==H).flatMap((L)=>Array.isArray(L)?L:typeof L==="string"?[L]:[]),q=H.optsWithGlobals(),w=await E6(q);await oC6(w.ampURL,w.secrets,N),process.exit(process.exitCode??0)});Q.command("git-credential-helper [action]",{hidden:!0}).summary("Git credential helper for GitHub").description("Internal: implements the git credential helper protocol. Used inside sandboxes to authenticate git operations with GitHub.").action(async(C,H,N)=>{let q=N.optsWithGlobals(),w=await E6(q);await jI4(C??"get",w.ampURL,w.secrets),process.exit(process.exitCode??0)}),Q.command("sign-commit [args...]",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements Git signing helper interfaces. Used inside sandboxes for commit signing.").allowUnknownOption(!0).allowExcessArguments(!0).action(async(C,H,N)=>{let q=N.optsWithGlobals(),w=await E6(q);await PI4(w,C),process.exit(process.exitCode??0)}),Q.command("keyboard-tester",{hidden:!0}).summary("Keyboard input tester").description("Internal: stream parsed terminal input events as JSONL.").option("--raw","Log raw incoming terminal bytes before parsing").action(async(C)=>{await GR4({raw:C.raw===!0}),process.exit(process.exitCode??0)}),Q.command("live-sync [threadIDOrURL]",{hidden:!0}).summary("Mirror live DTW thread changes into the current checkout").description("Experimental: watch a v2 thread URL or ID and mirror its live working-tree changes into your local checkout, or apply the current snapshot once and exit.").addHelpText("after",["","Examples:"," amp live-sync T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync --apply T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync https://ampcode.com/threads/T-5928a90d-d53b-488f-a829-4e36442142ee"].join(`
|
|
6374
6374
|
`)).option("--apply <threadIDOrURL>","Apply the current DTW thread snapshot once and exit").option("--checkout","Automatically check out the thread commit when it differs").option("--skip-checkout","Skip the startup checkout prompt when commits differ").action(async(C,H,N)=>{if(C&&H.apply)throw new OA("Choose either a positional thread ID/URL or --apply <thread-id>, not both.",1);let q=H.apply??C;if(!q||q.trim().length===0)RQ.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.
|
|
6375
6375
|
|
|
6376
6376
|
`),N.outputHelp(),process.exit(0);let w=$3(q)??a7(q),L=N.optsWithGlobals(),R=await E6(L);C3(N,L);let _=await LB(R,L),P=!1;try{if(H.checkout&&H.skipCheckout)throw new OA("Choose either --checkout or --skip-checkout, not both.",1);if(xC(_.serverStatus))throw Pl0(_.serverStatus,R.ampURL);let f=A$(_.serverStatus)?_.serverStatus.features:void 0;if(!TS4(f,ID.V2))throw new OA("live-sync is not enabled for your user",1);await TR4({ampURL:R.ampURL,threadId:w,configService:_.configService,threadSnapshotReader:{get:_.threadRemote.getThread},apiKey:process.env.AMP_API_KEY,applyOnce:typeof H.apply==="string",checkoutMode:H.checkout?"always":H.skipCheckout?"never":"prompt",promptForYesNo:_90}),P=!0}finally{if(await _.asyncDispose(),P)process.exit(0)}});let E=async(C,H,N)=>{B00({storage:H.settings,secretStorage:H.secrets,workspaceRoot:process.cwd(),defaultAmpURL:H.ampURL,homeDir:RE0,userConfigDir:jl0});let q={...H,executeMode:!1};await Rl0(q,{...C,openThreadSwitcher:!0},N)},D=Q.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").option("--include-archived","Include archived threads in the list").option("--limit <number>","Maximum number of threads to return",(C)=>jE0(C,"--limit",{min:1,max:500})).option("--offset <number>","Number of threads to skip",(C)=>jE0(C,"--offset",{min:0})).action(async(C,H)=>{let N=H.optsWithGlobals(),q=await E6(N);await RS4(N,q,H)});D.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, unlisted, workspace, group)").action(async(C,H)=>{let N=H.optsWithGlobals(),q=await E6(N);await NH6(N,q,H)}),D.command("continue [threadIDOrURLs...]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, interactive mode shows a picker. Use --last to continue the last thread for the current mode directly. When multiple thread are given, all are resumed and the first is shown in the foreground.").option("--last","Continue the last thread for the current mode directly").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(C,H,N)=>{let q=N.optsWithGlobals(),w=await E6(q),L=Array.isArray(C)?C:[];if(H.pick)z7.write(`${f0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
@@ -6395,8 +6395,8 @@ ${R}
|
|
|
6395
6395
|
|
|
6396
6396
|
`)},async input(){return},async confirm(){return!1},async select(){return},async ask(){return{result:"uncertain",probability:0.5,reason:"AI not available"}}},loadGlobalPlugins:Cy0(q),pluginFilter:process.env.PLUGINS??"all"}),asyncDispose:async()=>{}}}),LP4(Q,async(C)=>{let H=C.optsWithGlobals(),N=await E6(H);C3(C,H);let q=await LB(N,H),w=await q.secretStorage.get("apiKey",N.ampURL);if(!w)throw await q.asyncDispose(),new OA("API key required. Please run `amp login` first.",1);return{configService:q.configService,actorOptions:{apiKey:w,ampURL:N.ampURL,workspaceRoot:process.cwd(),dependencies:q},cleanupTerminal:cN,asyncDispose:q.asyncDispose.bind(q)}}),fP4(Q,async(C)=>{let H=C.optsWithGlobals(),N=await E6(H);C3(C,H);let q=await LB(N,H);return{settings:N.settings,configService:q.configService,skillService:q.skillService,asyncDispose:q.asyncDispose.bind(q)}}),BP4(Q,async(C)=>{let H=C.optsWithGlobals();return await E6(H)}),oR4(Q,async(C)=>{let H=await E6(C);return{settings:H.settings,secretStorage:H.secrets,getThreadDeps:async(N)=>{C3(N,C);let q=await LB(H,C);return{mcpService:q.mcpService,settings:H.settings,asyncDispose:q.asyncDispose.bind(q)}}}}),gF4(Q,E6),$v4(Q,E6);function Z(C,H,N){let w=typeof C.description==="string"?C.description:N===void 0?C.description(!0):C.description(N),L=new v2(H,w),R=cC6(C);if(R)L.default(R);if(L.hidden=mC6(C)||OS4(C),"choices"in C&&Array.isArray(C.choices))if("hiddenChoices"in C){let _=[...C.choices],P=Array.isArray(C.hiddenChoices)?C.hiddenChoices:[],f=new Set([..._,...P]);L.argParser((m)=>{if(!f.has(m))throw new U30(`Allowed choices are ${_.join(", ")}.`);return m})}else L.choices([...C.choices]);return L}for(let C of MS4){switch(C.type){case"flag":{Q.addOption(Z(C,`--${C.long}`)),Q.addOption(Z(C,`--no-${C.long}`,!1));break}case"switch":{Q.addOption(Z(C,`--${C.long}`,!0));break}case"optional-option":{Q.addOption(Z(C,`${"short"in C?`-${C.short}, `:""}--${C.long} [value]`));break}default:{Q.addOption(Z(C,`${"short"in C?`-${C.short}, `:""}--${C.long} <value>`));break}}if("aliases"in C&&Array.isArray(C.aliases))for(let H of C.aliases){let N=new v2(`--${H}`,C.description);N.hidden=!0,N.implies({[C.name]:!0}),Q.addOption(N)}}Q.hook("preAction",(C,H)=>{if(H.optsWithGlobals().takeMeBack)D6(pC6)});let F=new v2("-x, --execute [message]","Use execute mode, optionally with user message. In execute mode, agent will execute provided prompt (either as argument, or via stdin). Only last assistant message is printed. Enabled automatically when redirecting stdout.").default(!1);Q.addOption(F);let X=new v2("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp(!0);Q.addOption(X);let I=new v2("--stream-json","When used with --execute, output in Claude Code-compatible stream JSON format instead of plain text.").default(!1);Q.addOption(I);let G=new v2("--stream-json-thinking","Include thinking blocks in stream JSON output (non-Claude Code extension). Implies --stream-json.").default(!1);Q.addOption(G);let V=new v2("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);Q.addOption(V);let z=new v2("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);Q.addOption(z);let K=new v2("--archive","When used with --execute, archive the thread after the command finishes.").default(!1);Q.addOption(K);let W=new v2("-l, --label <label>","When used with --execute, add a label to the thread. Repeat the flag for multiple labels.").argParser((C,H)=>{if(H===void 0)return[C];return[...H,C]});return Q.addOption(W),Q.action(async(C,H)=>{let N=C,q=await E6(N);if(Object.keys(N).forEach((w)=>{let L=MS4.find((R)=>R.name===w);if(L&&OS4(L)&&!dC6(L))z7.write(f0.yellow(`Warning: '--${w}' flag is deprecated
|
|
6397
6397
|
`))}),H.args.length>0)nC6(q,H);await Rl0(q,N,H)}),mG4(Q),Q}async function kS4(A,Q){await sY(($)=>hP($,A,Q))}async function sC6(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await lc0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await lc0()).trimEnd(),stdinInput:null}}function tC6(A,Q,$){if(A.remote&&!Q)throw new OA("The -r/--remote flag requires --execute mode",1,'Use: amp --remote --execute "your message"');if(A.streamJson&&!Q)throw new OA("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(A.streamJsonInput&&!Q)throw new OA("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(A.streamJsonInput&&!A.streamJson)throw new OA("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(A.stats&&A.streamJson)throw new OA("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 OA("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(A.archive&&!Q)throw new OA("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 OA("Do not provide a message argument when using --stream-json-input",1,`Supply messages via stdin JSONL instead: echo '{"type":"user","message":{"role":"user","content":[{"type":"text","text":"your message"},{"type":"image","source":{"type":"base64","media_type":"image/png","data":"..."}}]}}' | amp --execute --stream-json --stream-json-input`);if(Q&&$===""&&!A.streamJsonInput&&!A.headless)throw new OA("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"
|
|
6398
|
-
Or pipe via stdin: echo "your message" | amp --execute`)}function eC6(){QmA([Q00.parse({tool:"*",action:"allow"})]),RgA({bypass:!0})}function AH6(A){if(A.threadId&&!S7(A.threadId))delete A.threadId}async function Rl0(A,Q,$){if(Q.headless)return QH6(A,Q,$);let B=await LB(A,Q);if(Q.showWelcome&&Q.hideWelcome)throw await B.asyncDispose(),new OA("Cannot use --show-welcome and --hide-welcome together",1);let E=!A.executeMode&&await gC6();return eC6(),AH6(Q),$H6(A,Q,$,B,{showNpmMigrationWelcome:E})}async function QH6(A,Q,$){let B=(W,C)=>{let H=Number(process.hrtime.bigint()-C)/1e6,N=jF4();S.info("Startup phase",{phase:W,phaseMs:Math.round(H),sinceMainMs:N===null?void 0:Math.round(N)})};C3($,Q);let E=process.hrtime.bigint(),D=await LB(A,Q);B("runMainThread:createThreadDependencies",E);let{serverStatus:J}=D;if(xC(J))throw Pl0(J,A.ampURL);let U=A$(J)?J:null,Y=U?.user.email;await fC6($,Q,J);let Z=Ju(J),F=Bi(Q,Z);if(F instanceof Error)D6(F.message);if(U&&BT(Q.mode)&&!ae(Q.mode,Y))throw new OA(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!Y||!L7(Y)))throw new OA("Headless executor mode is only available for Amp employees",1);ef0();let I=await D.secretStorage.get("apiKey",A.ampURL);if(!I)throw new OA("API key required for headless mode. Please run `amp login` first.",1);let G=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(G&&!S7(G))throw new OA(`Invalid thread ID: ${G}`,1);let V=G?void 0:await CH6({dependencies:D,apiKey:I,visibility:F??void 0}),z=G??V?.threadId;if(!z)throw new OA("Failed to resolve headless thread ID",1);let K=await iI4(z);if(K.status==="already-running")await D.asyncDispose(),await aY(),process.exit(0);try{await kI4({ampURL:A.ampURL,apiKey:I,workspaceRoot:process.cwd(),threadId:z,ownerUserId:V?.ownerUserId,threadVersion:V?.threadVersion,agentMode:V?.agentMode,initialToolDiscovery:Promise.all([D.mcpService.initialized,D.toolboxService.initialized,D.pluginService.initialized]).then(()=>{return}),configService:D.configService,mcpService:D.mcpService,toolService:D.toolService,skillService:D.skillService,pluginService:D.pluginService,pluginPlatform:D.headlessPluginPlatform})}finally{await K.release(),await D.asyncDispose()}await aY(),process.exit(0)}async function $H6(A,Q,$,B,E){let{userInput:D,stdinInput:J}=await sC6(Q),U=!!Q.streamJson||!!Q.streamJsonThinking;tC6({...Q,streamJson:U},A.executeMode,D),C3($,Q),kF4(),ef0();let Y=Q.threadId,Z=Q.resumeThreadIDs??(Y?[Y]:[]),F=Q.observe?$3(Q.observe)??a7(Q.observe):void 0,X=await B.serverStatusPromise;if(xC(X))throw Pl0(X,A.ampURL);let I=Ju(X),G=Bi(Q,I);if(G instanceof Error)D6(G.message);if(A.executeMode&&Q.remote){if(!BT(Q.mode))throw new OA("Remote execute mode does not support plugin-defined agent modes",1);if(!A$(X)||!L7(X.user.email))throw new OA("Remote execute mode is only available for Amp employees",1);await HP4(D,J,B.configService,Q.mode),await B.asyncDispose(),await aY(),process.exit(0)}let V=null,z=async()=>{let C=B.consumeDraftNewThreadVisibility();if(C!==null)return C;return V??=(async()=>{let H=await W30(A.settings,process.cwd(),I,G);if(H instanceof Error)D6(H.message);return H})(),V},K=await B.secretStorage.get("apiKey",A.ampURL);if(!K)throw new OA("API key required. Please run `amp login` first.",1);let W=A$(X)&&L7(X.user.email);if(A.executeMode){if(Z.length>1)throw new OA("Execute mode can only resume one thread.",1);eR4(B.mcpService,A.settings);try{await B.pluginService.initialized;let C=_S4(B.pluginService,Q.mode),H=LS4($,Q),N=await $q(),q=Y?H:oy0({agentMode:C.agentMode,explicitEffort:H,sessionState:N}),w=Y?void 0:r30(await yP(B.configService),{agentMode:C.agentMode,explicitEffort:H,sessionState:N}),L=Y?void 0:await z(),{threadID:R}=await v30({apiKey:K,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:B,userInput:D,stdinInput:J,stats:!!Q.stats,streamJson:U,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:C.agentMode,reasoningEffort:C.agent?void 0:q,agent:C.agent,labels:Q.label,initialThreadID:Y,initialThreadMeta:L,initialSettings:w});if(await kS4(R,"execute"),Q.archive)await B.threadRemote.archiveThread(R,!0)}finally{await B.asyncDispose()}await aY(),process.exit(0)}else{let C=LS4($,Q),H=await iC6($,B.pluginService,Q.mode),N=E.showNpmMigrationWelcome?"npm-migration":"intro",q=py0("0.0.
|
|
6399
|
-
`);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,$=process.stdout.isTTY&&process.stderr.isTTY;S.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let B=await ynA({get:async(U)=>{if(U!==Qh)return;try{let Y=await PS4(Ll0,"utf-8");return JSON.parse(Y).installationID}catch{return}},set:async(U,Y)=>{if(U!==Qh)return;await wC6(Pi.dirname(Ll0),{recursive:!0}),await MC6(Ll0,JSON.stringify({installationID:Y},null,2),{mode:384})}},{clientType:"cli",platform:K40()});LxA(B);let E=await SP4({...A,workspaceTrust:{current:!0,changes:ay},getHook:process.env.AMP_URL?(U,Y)=>{if(U==="url")return Promise.resolve(process.env.AMP_URL);return Y()}:void 0});if(A.mcpConfig){let U=await sR4(A.mcpConfig);E=tR4(E,U)}let D=Pi.dirname(E.getSettingsFilePath());ZD4(fx,D),E=RSA(E);let J=await E.get("url","admin")??await E.get("url","global");if(!J)J=S8;if(S.info("Resolved Amp URL",{ampURL:J,settingsFile:E.getSettingsFilePath(),workspaceRoot:E.getWorkspaceRootPath()}),!mO(J))S.info("Targeting custom Amp server",{ampURL:J});return{executeMode:Q,isTTY:$,ampURL:J,settings:E,secrets:jP4(await pc0(A,E))}}function BH6(A){let Q={};for(let $=0;$<A.length;$++){let B=A[$];if(B?.startsWith("--")){let D=B.slice(2).replace(/-([a-z])/g,(U,Y)=>Y.toUpperCase()),J=A[$+1];if(J&&!J.startsWith("--"))Q[D]=J,$++}}return Q}function EH6(A,Q){let $=A.includes("--headless")||A.some((E)=>E.startsWith("--headless=")),B=Pi.resolve(Q.logFile??process.env.AMP_LOG_FILE??($?LC6:jc));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:B}}async function DH6(){LF4();let A=BH6(process.argv),Q=EH6(process.argv,A),$=fF4(Q);KB0("silent");let B=process.argv.includes("--no-color"),E=process.argv.includes("--color"),D=process.stdout.isTTY&&process.stderr.isTTY;if(B||!E&&!D)f0.level=0;if(RC6(S),S.info("Starting Amp CLI.",{version:"0.0.
|
|
6398
|
+
Or pipe via stdin: echo "your message" | amp --execute`)}function eC6(){QmA([Q00.parse({tool:"*",action:"allow"})]),RgA({bypass:!0})}function AH6(A){if(A.threadId&&!S7(A.threadId))delete A.threadId}async function Rl0(A,Q,$){if(Q.headless)return QH6(A,Q,$);let B=await LB(A,Q);if(Q.showWelcome&&Q.hideWelcome)throw await B.asyncDispose(),new OA("Cannot use --show-welcome and --hide-welcome together",1);let E=!A.executeMode&&await gC6();return eC6(),AH6(Q),$H6(A,Q,$,B,{showNpmMigrationWelcome:E})}async function QH6(A,Q,$){let B=(W,C)=>{let H=Number(process.hrtime.bigint()-C)/1e6,N=jF4();S.info("Startup phase",{phase:W,phaseMs:Math.round(H),sinceMainMs:N===null?void 0:Math.round(N)})};C3($,Q);let E=process.hrtime.bigint(),D=await LB(A,Q);B("runMainThread:createThreadDependencies",E);let{serverStatus:J}=D;if(xC(J))throw Pl0(J,A.ampURL);let U=A$(J)?J:null,Y=U?.user.email;await fC6($,Q,J);let Z=Ju(J),F=Bi(Q,Z);if(F instanceof Error)D6(F.message);if(U&&BT(Q.mode)&&!ae(Q.mode,Y))throw new OA(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!Y||!L7(Y)))throw new OA("Headless executor mode is only available for Amp employees",1);ef0();let I=await D.secretStorage.get("apiKey",A.ampURL);if(!I)throw new OA("API key required for headless mode. Please run `amp login` first.",1);let G=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(G&&!S7(G))throw new OA(`Invalid thread ID: ${G}`,1);let V=G?void 0:await CH6({dependencies:D,apiKey:I,visibility:F??void 0}),z=G??V?.threadId;if(!z)throw new OA("Failed to resolve headless thread ID",1);let K=await iI4(z);if(K.status==="already-running")await D.asyncDispose(),await aY(),process.exit(0);try{await kI4({ampURL:A.ampURL,apiKey:I,workspaceRoot:process.cwd(),threadId:z,ownerUserId:V?.ownerUserId,threadVersion:V?.threadVersion,agentMode:V?.agentMode,initialToolDiscovery:Promise.all([D.mcpService.initialized,D.toolboxService.initialized,D.pluginService.initialized]).then(()=>{return}),configService:D.configService,mcpService:D.mcpService,toolService:D.toolService,skillService:D.skillService,pluginService:D.pluginService,pluginPlatform:D.headlessPluginPlatform})}finally{await K.release(),await D.asyncDispose()}await aY(),process.exit(0)}async function $H6(A,Q,$,B,E){let{userInput:D,stdinInput:J}=await sC6(Q),U=!!Q.streamJson||!!Q.streamJsonThinking;tC6({...Q,streamJson:U},A.executeMode,D),C3($,Q),kF4(),ef0();let Y=Q.threadId,Z=Q.resumeThreadIDs??(Y?[Y]:[]),F=Q.observe?$3(Q.observe)??a7(Q.observe):void 0,X=await B.serverStatusPromise;if(xC(X))throw Pl0(X,A.ampURL);let I=Ju(X),G=Bi(Q,I);if(G instanceof Error)D6(G.message);if(A.executeMode&&Q.remote){if(!BT(Q.mode))throw new OA("Remote execute mode does not support plugin-defined agent modes",1);if(!A$(X)||!L7(X.user.email))throw new OA("Remote execute mode is only available for Amp employees",1);await HP4(D,J,B.configService,Q.mode),await B.asyncDispose(),await aY(),process.exit(0)}let V=null,z=async()=>{let C=B.consumeDraftNewThreadVisibility();if(C!==null)return C;return V??=(async()=>{let H=await W30(A.settings,process.cwd(),I,G);if(H instanceof Error)D6(H.message);return H})(),V},K=await B.secretStorage.get("apiKey",A.ampURL);if(!K)throw new OA("API key required. Please run `amp login` first.",1);let W=A$(X)&&L7(X.user.email);if(A.executeMode){if(Z.length>1)throw new OA("Execute mode can only resume one thread.",1);eR4(B.mcpService,A.settings);try{await B.pluginService.initialized;let C=_S4(B.pluginService,Q.mode),H=LS4($,Q),N=await $q(),q=Y?H:oy0({agentMode:C.agentMode,explicitEffort:H,sessionState:N}),w=Y?void 0:r30(await yP(B.configService),{agentMode:C.agentMode,explicitEffort:H,sessionState:N}),L=Y?void 0:await z(),{threadID:R}=await v30({apiKey:K,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:B,userInput:D,stdinInput:J,stats:!!Q.stats,streamJson:U,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:C.agentMode,reasoningEffort:C.agent?void 0:q,agent:C.agent,labels:Q.label,initialThreadID:Y,initialThreadMeta:L,initialSettings:w});if(await kS4(R,"execute"),Q.archive)await B.threadRemote.archiveThread(R,!0)}finally{await B.asyncDispose()}await aY(),process.exit(0)}else{let C=LS4($,Q),H=await iC6($,B.pluginService,Q.mode),N=E.showNpmMigrationWelcome?"npm-migration":"intro",q=py0("0.0.1780130685-gfdac38",B.settingsStorage,{startDelayMs:3000}),w=new xc0(B.mcpService,A.settings.getWorkspaceRootPath()),L=ph(B.configService),R=new ec0(B.fuzzyServer),_=process.cwd();await UR4({ampURL:A.ampURL,apiKey:K,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??J9(A.ampURL),configService:B.configService,toolService:B.toolService,pluginPlatform:B.pluginPlatform,pluginService:B.pluginService,skillService:B.skillService,mcpService:B.mcpService,readFileSystemDirectory:({uri:P})=>RP({workspaceRoot:_},P),completionBuilder:R,updateService:q,workspaceRoot:_,listThreads:()=>L.listThreads(),getThreadFromServer:(P)=>L.getThread(P),getThreadTail:async(P,f)=>{let m=await O4.getThreadTail({thread:P,limit:f},{config:B.configService});if(!m.ok){if(m.error.code==="thread-not-found")return null;throw Error(m.error.message??m.error.code)}return{...m.result.thread.data,messages:m.result.messages}},toolboxes:B.toolboxService.toolboxes,isInternalUser:W,settingsFilePath:B.settingsStorage.getSettingsFilePath(),workspaceSettingsFilePath:B.settingsStorage.getWorkspaceSettingsPath(),mcpTrustHandler:w,setActiveThreadID:(P)=>B.activeThread$.next(P),dispose:()=>{return w.dispose(),q.dispose(),B.asyncDispose()}},{initialThreadIDs:F?[F]:Z,initialUserInput:D||void 0,getDefaultNewThreadVisibility:z,onFirstFrame:Q.ide?vS4:void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!F,hideWelcome:!!Q.hideWelcome,showWelcome:Q.showWelcome,welcomeVariant:N,initialAgentMode:H?.agentMode,initialPluginAgentModeKey:H?.pluginAgentModeKey,initialReasoningEffort:C}),process.exit(0)}}async function E6(A){if(S.info("Initializing CLI context",{argv:process.argv,nodeEnv:"production",hasAmpURL:Boolean(process.env.AMP_URL),hasAmpAPIKey:Boolean(process.env.AMP_API_KEY),hasSettingsFile:Boolean(process.env.AMP_SETTINGS_FILE)}),A.interactive)z7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
6399
|
+
`);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,$=process.stdout.isTTY&&process.stderr.isTTY;S.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let B=await ynA({get:async(U)=>{if(U!==Qh)return;try{let Y=await PS4(Ll0,"utf-8");return JSON.parse(Y).installationID}catch{return}},set:async(U,Y)=>{if(U!==Qh)return;await wC6(Pi.dirname(Ll0),{recursive:!0}),await MC6(Ll0,JSON.stringify({installationID:Y},null,2),{mode:384})}},{clientType:"cli",platform:K40()});LxA(B);let E=await SP4({...A,workspaceTrust:{current:!0,changes:ay},getHook:process.env.AMP_URL?(U,Y)=>{if(U==="url")return Promise.resolve(process.env.AMP_URL);return Y()}:void 0});if(A.mcpConfig){let U=await sR4(A.mcpConfig);E=tR4(E,U)}let D=Pi.dirname(E.getSettingsFilePath());ZD4(fx,D),E=RSA(E);let J=await E.get("url","admin")??await E.get("url","global");if(!J)J=S8;if(S.info("Resolved Amp URL",{ampURL:J,settingsFile:E.getSettingsFilePath(),workspaceRoot:E.getWorkspaceRootPath()}),!mO(J))S.info("Targeting custom Amp server",{ampURL:J});return{executeMode:Q,isTTY:$,ampURL:J,settings:E,secrets:jP4(await pc0(A,E))}}function BH6(A){let Q={};for(let $=0;$<A.length;$++){let B=A[$];if(B?.startsWith("--")){let D=B.slice(2).replace(/-([a-z])/g,(U,Y)=>Y.toUpperCase()),J=A[$+1];if(J&&!J.startsWith("--"))Q[D]=J,$++}}return Q}function EH6(A,Q){let $=A.includes("--headless")||A.some((E)=>E.startsWith("--headless=")),B=Pi.resolve(Q.logFile??process.env.AMP_LOG_FILE??($?LC6:jc));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:B}}async function DH6(){LF4();let A=BH6(process.argv),Q=EH6(process.argv,A),$=fF4(Q);KB0("silent");let B=process.argv.includes("--no-color"),E=process.argv.includes("--color"),D=process.stdout.isTTY&&process.stderr.isTTY;if(B||!E&&!D)f0.level=0;if(RC6(S),S.info("Starting Amp CLI.",{version:"0.0.1780130685-gfdac38",buildTimestamp:"2026-05-30T08:49:46.106Z"}),process.platform==="win32"&&Aq())yG4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new OA(G3.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await rC6($).parseAsync(process.argv)}UD4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await DH6().catch(C30)});async function JH6(A,Q){let $=A.ampURL.includes("localhost")||A.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!$)await A.settings.set("url",process.env.AMP_URL,"global"),RQ.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
6400
6400
|
`);else if(!mO(A.ampURL))RQ.write(`Logging in to ${new URL(A.ampURL).hostname}
|
|
6401
6401
|
`);let B=process.env.AMP_API_KEY;if(B)RQ.write(`API key found in environment variable, storing...
|
|
6402
6402
|
`),await Q.set("apiKey",B,A.ampURL),RQ.write(`API key successfully stored.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sourcegraph/amp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1780130685-gfdac38",
|
|
4
4
|
"description": "Renamed to @ampcode/cli - see https://ampcode.com/news/npm-package-changes",
|
|
5
5
|
"homepage": "https://ampcode.com/",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"amp": "node_modules/@ampcode/cli/bin/amp.exe"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@ampcode/cli": "0.0.
|
|
11
|
+
"@ampcode/cli": "0.0.1780130685-gfdac38"
|
|
12
12
|
},
|
|
13
13
|
"files": [
|
|
14
14
|
"dist/main.js",
|